摘要:小時極速入門二公眾號智能制造社區(qū)有對制造業(yè)感興趣的可以關(guān)注我,了解更多。在實際中,內(nèi)聯(lián)結(jié)和左聯(lián)結(jié)應(yīng)該是使用最多的,我?guī)缀鯖]用到過右連接與全外聯(lián)結(jié)。包含訂單號訂單類型工序號工序名稱工序狀態(tài)物料號工位號一張物料表,存儲訂單工序用到的物料。
1 小時 SQL 極速入門(二)
公眾號:【智能制造社區(qū)】有對制造業(yè)感興趣的可以關(guān)注我,了解更多。
上篇我們說了 SQL 的基本語法,掌握了這些基本語法后,我們可以對單表進行查詢及計算分析。但是一個大的系統(tǒng),往往會有數(shù)十上百張表,而業(yè)務(wù)關(guān)系又錯綜復雜。我們要查的數(shù)據(jù)往往在好幾張表中,而要從多張表中來獲取信息就需要用到表聯(lián)結(jié)了。
先說說什么是聯(lián)結(jié),聯(lián)結(jié)就是用一條 SELECT 語句從多個表中查詢數(shù)據(jù)。通過聯(lián)結(jié),讓多張表中的數(shù)據(jù)互相關(guān)聯(lián)起來。聯(lián)結(jié)又分為內(nèi)聯(lián)結(jié)、左外聯(lián)結(jié)、右外聯(lián)結(jié)、全外聯(lián)結(jié)。別怕,我知道有些初學者看到這幾個概念就頭大,不過請繼續(xù)往后看,看完后你肯定能看明白。在實際中,內(nèi)聯(lián)結(jié)和左聯(lián)結(jié)應(yīng)該是使用最多的,我?guī)缀鯖]用到過右連接與全外聯(lián)結(jié)。
對初學者來說,在這里迷惑的原因是去記這些概念,這是沒必要的,我們只要在實際中抱著問題去用一次就可以完全掌握了。
下面我們就開始:
我們有下面三張表,一張訂單表存放訂單頭信息,包括訂單號、訂單類型、訂單數(shù)量、訂單狀態(tài)信息。
一張訂單明細表,存儲訂單的詳細信息。包含訂單號、訂單類型、工序號、工序名稱、工序狀態(tài)、物料號、工位號
一張物料表,存儲訂單工序用到的物料。包含物料號、物料名稱。
內(nèi)聯(lián)結(jié)我們先觀察一下,訂單頭信息中只包含訂單的數(shù)量、狀態(tài)信息。訂單明細表中包含著訂單的詳細信息,如工序信息,每道工序用到的物料,每道工序的名稱,在哪個工位操作等信息。假如我們現(xiàn)在要查詢訂單號、訂單數(shù)量、工序號、工序名稱、工位等信息,只有一張表我們是查不到的,那么我們就要把這兩張表結(jié)合起來。
SELECT oh.orderno, oh.order_type, oh.quantity, od.order_line_no, od.order_line_name, od.workcenter FROM order_header oh INNER JOIN order_detail od ON oh.orderno =od.orderno AND oh.order_type=od.order_type
解釋下:我們用INNER JOIN 表示內(nèi)連接,在 INNER JOIN 后寫上我們需要關(guān)聯(lián)的表,oh 和 od 表示別名,方便后面書寫,不然后面我們就要用到表的全稱來寫了。這里我們要關(guān)聯(lián)到訂單明細表 order_detail,去取出訂單詳細信息。后面跟上 ON 關(guān)鍵字,表示條件,這里 ON 后面有兩個條件。表示我們通過訂單號和訂單類型來把兩個表中的數(shù)據(jù)關(guān)聯(lián)起來,通過訂單表中的訂單號和訂單類型作為條件來查找訂單明細表中同樣訂單號和訂單類型的訂單的詳細信息。
我們看下結(jié)果:
可以看到,我們查出了訂單 1001 ,1002, 1003, 1004, 1005五個訂單的總數(shù)量,各個工序的名稱,在哪個工位生產(chǎn)等信息。
細心的讀者可能會注意到,在訂單表中還有一個 1008 的訂單,為什么沒有查出來?那就接著往下看
左聯(lián)結(jié)相比于內(nèi)聯(lián)結(jié),左聯(lián)結(jié)使用 LEFT JOIN 來表示。我們先不看概念,我們直接把剛才的 SQL 語句改成左聯(lián)結(jié)來看一下結(jié)果。
SELECT oh.orderno, oh.order_type, oh.quantity, od.order_line_no, od.order_line_name, od.workcenter FROM order_header oh LEFT JOIN order_detail od ON oh.orderno =od.orderno AND oh.order_type=od.order_type;
結(jié)果如下圖:
對比內(nèi)聯(lián)結(jié)的結(jié)果,我們發(fā)現(xiàn)了什么,我們發(fā)現(xiàn)最下面多了一行,1008 訂單,而1008 后面的幾個字段為空。我們看一下訂單明細表會發(fā)現(xiàn)沒有 1008 這個訂單。
這樣子我們就明白了,內(nèi)聯(lián)結(jié)是兩張表中都存在才能關(guān)聯(lián)出來。而左聯(lián)結(jié)的意思就是我們的主表中的所有行都會展示出來,如果在聯(lián)結(jié)的表中找不到對應(yīng)的,會默認為 null.
右聯(lián)結(jié)知道了左聯(lián)結(jié),右聯(lián)結(jié)也就清楚了,右連接呢會把我們關(guān)聯(lián)的表中的所有行都展示出來,不管主表中有沒有匹配的行。右聯(lián)結(jié)關(guān)鍵字為 RIGHT JOIN
SELECT oh.orderno, oh.order_type, oh.quantity, od.order_line_no, od.workcenter FROM order_header oh RIGHT JOIN order_detail od ON oh.orderno =od.orderno AND oh.order_type=od.order_type;
可以看到,RIGHT JOIN 把關(guān)聯(lián)的訂單明細表中的所有行都顯示了出來,但是訂單主表中并沒有 1006 和 1007 兩個訂單,所以這兩行顯示為 null
多表聯(lián)結(jié)多表聯(lián)結(jié)就是超過兩張表的聯(lián)結(jié),上面我們關(guān)聯(lián)了訂單表和訂單明細表,現(xiàn)在我們想知道每道工序用到的物料,就需要關(guān)聯(lián)到物料表。我們看到訂單明細表中有 productid 字段,我們用這個關(guān)聯(lián)到 product 表中。同時,后面我們也用了 ORDER BY 進行排序。
SELECT oh.orderno, oh.order_type, oh.quantity, od.order_line_no, od.workcenter, p.productno, p.product_name FROM order_header oh INNER JOIN order_detail od ON oh.orderno =od.orderno INNER JOIN product1 p ON od.productid =p.ID AND oh.order_type=od.order_type ORDER BY orderno, order_line_no注意
在使用聯(lián)結(jié)時一定要注意聯(lián)結(jié)條件,如果 聯(lián)結(jié)條件不正確,就會得到不正確的結(jié)果。而且要注意,聯(lián)結(jié)條件是必須的。
UNION 與 UNION ALLUNION 與 UNION ALL 表示并集,可以把兩個 SELECT 查詢的結(jié)果合并成一個,前提是兩個 SELECT 所查詢的列數(shù)量和字段類型一致。不同的是 UNION 會去除重復行,而 UNION ALL 不會去除重復行。
如果我們有兩張表,都存有相似的信息。比如我們在一個其他表中也存儲的有訂單信息。舉個栗子,order_header_bak 表中存有如下兩條數(shù)據(jù)。
我們用 UNION ALL 試一下
SELECT orderno, order_type, order_status FROM order_header UNION ALL SELECT orderno, order_type, order_status FROM order_header_bak;
看到查出了 8 條信息,1001 訂單有兩條一樣的信息。
我們用 UNION 試一下
SELECT orderno, order_type, order_status FROM order_header UNION SELECT orderno, order_type, order_status FROM order_header_bak
看到只有 7 條數(shù)據(jù)了, 1001 訂單只有一行數(shù)據(jù)。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/17836.html
摘要:小時極速入門前面兩篇我們從的最基礎(chǔ)語法講起,到表聯(lián)結(jié)多表查詢。大家可以點擊鏈接查看小時極速入門一小時極速入門二今天我們講一些在做報表和復雜計算時非常實用的分析函數(shù)。就會得到每個分組內(nèi)的按照訂單數(shù)量排序的行號。 1 小時 SQL 極速入門 前面兩篇我們從 SQL 的最基礎(chǔ)語法講起,到表聯(lián)結(jié)多表查詢。大家可以點擊鏈接查看1 小時 SQL 極速入門(一)1 小時 SQL 極速入門(二)今天我...
閱讀 2882·2021-11-22 09:34
閱讀 1211·2021-11-19 09:40
閱讀 3335·2021-10-14 09:43
閱讀 3566·2021-09-23 11:22
閱讀 1601·2021-08-31 09:39
閱讀 880·2019-08-30 15:55
閱讀 1413·2019-08-30 15:54
閱讀 854·2019-08-30 15:53