子查詢_聯結查詢_組合查詢

前言

1️⃣ :mysql環境準備

2️⃣ :簡單的表查詢

3️⃣ :通配符+正則表達式

4️⃣ :mysql函數與分組

第一部分:我們準備環境:安裝數據庫+創建數據庫+創建用戶+授權。

第二部分:環境準備好後,進行簡單的單表查詢:導入表+表查詢。

第三部分:通配符和正則表達式,增強where的篩選功能。

第四部分:對列進行計算處理稱爲字段。複雜的字段用函數處理。按照不同組彙總,進行分組操作。

現在是第五部分:參考《sql必知必會》chapter14~17章。子查詢+聯結查詢+組合查詢

之前是對單表進行查詢,現在要對多表進行查詢。是之前簡單表查詢的進階版。


摘要與總結

之前,我們在單表上進行查詢。

在多表上,我們可以採用子查詢、聯結查詢。

子查詢很靈活,但是效率沒有聯結查詢高。我們推薦使用聯結查詢。

子查詢,嵌套,一層一層寫。

聯結查詢,根據應用場景分爲內聯結、外聯結。

最後,介紹了一個組合查詢,可以將多個SELECT語句結果組合成單個結果集。



子查詢

SQL還允許創建子查詢( subquery) ,即嵌套在其他查詢中的查詢。

使用in的子查詢:一層一層嵌套,從內向外執行;我們寫的時候,也是從內向外,一層一層驗證着寫。

# 列出訂購物品TNT2的所有客戶
SELECT * FROM customers
WHERE cust_id IN (SELECT cust_id FROM orders
				WHERE order_num IN (SELECT order_num FROM orderitems 
                                    WHERE prod_id='TNT2'));

同樣,我們可以用 (等值)聯結查詢 ,來實現上面的功能。(聯結查詢在下一節)

SELECT customers.cust_name, customers.cust_address  
FROM customers,orders,orderitems  
WHERE customers.cust_id=orders.cust_id AND orders.order_num=orderitems.order_num AND orderitems.prod_id='TNT2';

或許,我們可以簡單看下,子查詢與聯結查詢的速度比較。

參考:查看mysql語句運行時間

上面查詢的時候,內層只用了內層的表。

還有個概念:相關子查詢。內層查詢的時候,會涉及到外部的表。

SELECT cust_name,
       (SELECT COUNT(*) FROM orders
        WHERE customers.cust_id=orders.cust_id)
FROM customers
ORDER BY cust_name;


聯結查詢

在介紹聯結查詢,之前,我們不得不提,兩個概念:關係表+主鍵/外鍵。

相同數據出現多次決不是一件好事,此因素是關係數據庫設計的基礎。**關係表的設計就是要保證把信息分解成多個表,一類數據一個表。**各表通過某些常用的值(即關係設計中的關係( relational) )互相關聯。

信息被拆分在多個表中,要維持信息的一致性,我們需要主鍵和外鍵。

參考:主鍵&&外鍵

下面介紹的是聯結,即把不同(相同)的表合併到一起。

書上是在關係表上,進行聯結查詢。挺好。

但是,書上沒有說:兩個沒有關係的表,能否進行聯結查詢。爲什麼聯結查詢表子查詢快。

沒有關係的表,可以進行聯結查詢。但是我們最好在關係表上進行聯結查詢。

我們可以參考網上的一些文章:圖解 SQL 中各種連接 JOINMySQL中的多表連接查詢 、MySQL 連接的使用

(圖片來自知乎水印)
在這裏插入圖片描述

用集合的方式,來理解聯結是很好的。

更多內容見上面三個鏈接。下面僅僅介紹:內聯結(等值聯結)、左外連接、右外連接


內聯結

等值聯結,是內聯結的一種。內聯結:雙方都滿足條件的行才能聯結到一起

**下面的內連接,並沒有去除相等的列。**只是我們沒有用select * ,所以看不出來。

如果想去除相同的列,用using或者自然聯結。

SELECT prod_name, vend_name, prod_price
FROM venders INNER JOIN products
ON vendors.vned_id = products.vned_id

外鏈接

外鏈接某些時候會用到。比如:一個表是用戶表,一個表是訂單表。我們想將連個表合併在一起。但是,有的用戶可能還沒有訂單。所以合併後,表中對應的位置爲null.

# 查看所有用戶的訂單情況,不管有沒有訂單

# 左外聯結
SELECT customers.cust_id,orders.order_num
FROM customers LEFT OUTER JOIN orders
ON orders.cust_id = customers.cust_id

# 右外聯結
SELECT customers.cust_id,orders.order_num
FROM orders RIGHT OUTER JOIN customers
ON orders.cust_id = customers.cust_id


組合查詢

可用UNION操作符來組合數條SQL查詢。利用UNION,可給出多條SELECT語句,將它們的結果組合成單個結果集。

join爲聯結,是行的列數增加。
union爲組合,是行的行數增加。可以用來不一些不相關的數據組合在一起。

SELECT prod_name,prod_id FROM products
WHERE vend_id IN ('1001','1002')
UNION
SELECT prod_name,prod_desc
FROM products
WHERE prod_price<=5;

實驗了下,選擇的列數目必須相同。但不對應(相同)是沒關係的,以第一個爲準但是這樣的結果似乎沒啥意義。



參考文章

查看mysql語句運行時間

主鍵&&外鍵

圖解 SQL 中各種連接 JOIN

MySQL中的多表連接查詢

MySQL 連接的使用

語文信箱:“連接”與“聯結”的不同

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章