首页
/
每日頭條
/
科技
/
sql數據庫的小技巧
sql數據庫的小技巧
更新时间:2025-06-12 16:41:24
前言
上篇中學習了 SQL 的基本語法,掌握了這些基本語法後,我們可以對單表進行查詢及計算分析。但是一個大的系統,往往會有數十上百張表,而業務關系又錯綜複雜。我們要查的數據往往在好幾張表中,而要從多張表中來獲取信息就需要用到表聯結了。

本篇中,先說說什麼是聯結,聯結就是用一條 SELECT 語句從多個表中查詢數據。通過聯結,讓多張表中的數據互相關聯起來。聯結又分為内聯結、左外聯結、右外聯結、全外聯結。别怕,我知道有些初學者看到這幾個概念就頭大,不過請繼續往後看,看完後你肯定能看明白。在實際中,内聯結和左聯結應該是使用最多的,我幾乎沒用到過右連接與全外聯結。

對初學者來說,在這裡迷惑的原因是去記這些概念,這是沒必要的,我們隻要在實際中抱着問題去用一次就可以完全掌握了。

關聯查詢

下面我們就開始:

我們有下面三張表,一張訂單表存放訂單頭信息,包括訂單号、訂單類型、訂單數量、訂單狀态信息。

sql數據庫的小技巧(數據庫1小時)1

一張訂單明細表,存儲訂單的詳細信息。包含訂單号、訂單類型、工序号、工序名稱、工序狀态、物料号、工位号

sql數據庫的小技巧(數據庫1小時)2

一張物料表,存儲訂單工序用到的物料。包含物料号、物料名稱。

sql數據庫的小技巧(數據庫1小時)3

内聯結

我們先觀察一下,訂單頭信息中隻包含訂單的數量、狀态信息。訂單明細表中包含着訂單的詳細信息,如工序信息,每道工序用到的物料,每道工序的名稱,在哪個工位操作等信息。假如我們現在要查詢訂單号、訂單數量、工序号、工序名稱、工位等信息,隻有一張表我們是查不到的,那麼我們就要把這兩張表結合起來。

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 表示内連接,在 INNER JOIN 後寫上我們需要關聯的表,oh 和 od 表示别名,方便後面書寫,不然後面我們就要用到表的全稱來寫了。這裡我們要關聯到訂單明細表 order_detail,去取出訂單詳細信息。後面跟上 ON 關鍵字,表示條件,這裡 ON 後面有兩個條件。表示我們通過訂單号和訂單類型來把兩個表中的數據關聯起來,通過訂單表中的訂單号和訂單類型作為條件來查找訂單明細表中同樣訂單号和訂單類型的訂單的詳細信息。

我們看下結果:

sql數據庫的小技巧(數據庫1小時)4

可以看到,我們查出了訂單 1001 ,1002, 1003, 1004, 1005五個訂單的總數量,各個工序的名稱,在哪個工位生産等信息。

細心的讀者可能會注意到,在訂單表中還有一個 1008 的訂單,為什麼沒有查出來?那就接着往下看

左聯結

相比于内聯結,左聯結使用 LEFT JOIN 來表示。我們先不看概念,我們直接把剛才的 SQL 語句改成左聯結來看一下結果。

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;

結果如下圖:

sql數據庫的小技巧(數據庫1小時)5

對比内聯結的結果,我們發現了什麼,我們發現最下面多了一行,1008 訂單,而1008 後面的幾個字段為空。我們看一下訂單明細表會發現沒有 1008 這個訂單。

這樣子我們就明白了,内聯結是兩張表中都存在才能關聯出來。而左聯結的意思就是我們的主表中的所有行都會展示出來,如果在聯結的表中找不到對應的,會默認為 null.

右聯結

知道了左聯結,右聯結也就清楚了,右連接呢會把我們關聯的表中的所有行都展示出來,不管主表中有沒有匹配的行。右聯結關鍵字為 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;

sql數據庫的小技巧(數據庫1小時)6

可以看到,RIGHT JOIN 把關聯的訂單明細表中的所有行都顯示了出來,但是訂單主表中并沒有 1006 和 1007 兩個訂單,所以這兩行顯示為 null

多表聯結

多表聯結就是超過兩張表的聯結,上面我們關聯了訂單表和訂單明細表,現在我們想知道每道工序用到的物料,就需要關聯到物料表。我們看到訂單明細表中有 productid 字段,我們用這個關聯到 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

sql數據庫的小技巧(數據庫1小時)7

注意

在使用聯結時一定要注意聯結條件,如果 聯結條件不正确,就會得到不正确的結果。而且要注意,聯結條件是必須的。

UNION 與 UNION ALL

UNION 與 UNION ALL 表示并集,可以把兩個 SELECT 查詢的結果合并成一個,前提是兩個 SELECT 所查詢的列數量和字段類型一緻。不同的是 UNION 會去除重複行,而 UNION ALL 不會去除重複行。

如果我們有兩張表,都存有相似的信息。比如我們在一個其他表中也存儲的有訂單信息。舉個栗子,order_header_bak 表中存有如下兩條數據。

sql數據庫的小技巧(數據庫1小時)8

我們用 UNION ALL 試一下

SELECT orderno, order_type, order_status FROM order_header UNION ALL SELECT orderno, order_type, order_status FROM order_header_bak;

sql數據庫的小技巧(數據庫1小時)9

看到查出了 8 條信息,1001 訂單有兩條一樣的信息。

我們用 UNION 試一下

SELECT orderno, order_type, order_status FROM order_header UNION SELECT orderno, order_type, order_status FROM order_header_bak

sql數據庫的小技巧(數據庫1小時)10

看到隻有 7 條數據了, 1001 訂單隻有一行數據。


,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
路由器天線不豎起來會有影響嗎
路由器天線不豎起來會有影響嗎
有影響。以常用的tp-link路由器為例。路由器的外置天線,垂直90度向上布置才是無線覆蓋最廣的布置方式,建議發現路由器傾倒之後,需要及時調整角度。目前更多的路由器已變為内置全向天線,如此設計更為方便,不用再擔心路由器天線傾倒。路由器是連接兩個或多個網絡的硬件設備,在網絡間起網關的作用,是讀取每一個...
2025-06-12
12v45ah電瓶充電用多大電流
12v45ah電瓶充電用多大電流
12v45ah電瓶充電需要使用的充電電流為2.5AH,最高不能超過3.5AH,放電電流300A-400A,極限(一般)為450A(啟動瞬間)。12v45ah電瓶多為啟動型電池,适用于各種小型車輛。另外,一些電池上面标有低溫啟動電流,在電瓶外殼标注信息上我們除了看到上面兩個數據外,還有一個标識是“CC...
2025-06-12
堿性和碳性電池的區别
堿性和碳性電池的區别
環保程度不同、電量不同、用途不同。1、環保程度不同:堿性電池還有一個名稱是堿性幹電池或堿性鋅錳幹電池。堿性電池内阻比碳性電池要環保,堿性電池含汞量隻有0.025%,不需要回收,因此堿性電池比碳性電池要環保。2、電量不同:從最基本的電量上來看,堿性電池比碳性電池性價比要高一些。堿性電池的容量,會因出電...
2025-06-12
淘寶為什麼會降權
淘寶為什麼會降權
同一産品重複鋪貨式開店降權、錯放淘寶類目屬性降權、标題濫用關鍵詞降權。同一産品重複鋪貨式開店降權:有些賣家為了能在淘寶上得到更多的商品展現機會,往往發布發布很多完全相同的商品,不但直接降低了搜索的精準度,而且還會降低了消費者的購物體驗,帳号就會被平台降權。錯放淘寶類目屬性降權:原商品和上架的商品所選...
2025-06-12
知道ip地址怎麼查位置
知道ip地址怎麼查位置
1、點擊電腦右下角的電腦圖标,将網絡共享中心選擇打開并進入。2、進入到網絡共享中心之後,玩家選擇本地...
2025-06-12
Copyright 2023-2025 - www.tftnews.com All Rights Reserved