MySQL必知必會—聯結表和高級查詢篇

MySQL必知必會—概念篇mysql

MySQL必知必會—安裝應用篇git

MySQL必知必會—檢索數據篇github

下面用到的數據庫文件可在

mysql_scripts 找到。sql


使用子查詢

假設要列出訂購物品 TNT2 的全部客戶。咱們能夠拆分出下面三步。數據庫

  1. 檢索包含物品 TNT2 的全部訂單的編號。
  2. 檢索具備前一步驟列出的訂單編號的全部客戶的 ID。
  3. 檢索前一步驟返回的全部客戶 ID 的客戶信息。
SELECT cust_name, cust_contact FROM customers
WHERE cust_id IN (SELECT cust_id FROM orders
WHERE order_num IN (SELECT order_num FROM orderitems WHERE prod_id = 'TNT2'));
+----------------+--------------+
| cust_name      | cust_contact |
+----------------+--------------+
| Coyote Inc.    | Y Lee        |
| Yosemite Place | Y Sam        |
+----------------+--------------+

假設須要顯示 customers 表中每一個客戶的訂單總數,咱們能夠查分出下面兩步。segmentfault

  1. 從 customers 表中檢索客戶列表。
  2. 對於檢索出的每一個客戶,統計其在 orders 表中的訂單數目。
SELECT cust_name, cust_contact,
(SELECT COUNT(*) FROM orders WHERE orders.cust_id = customers.cust_id) AS orders
FROM customers ORDER BY cust_name;
+----------------+--------------+--------+
| cust_name      | cust_contact | orders |
+----------------+--------------+--------+
| Coyote Inc.    | Y Lee        |      2 |
| E Fudd         | E Fudd       |      1 |
| Mouse House    | Jerry Mouse  |      0 |
| Wascals        | Jim Jones    |      1 |
| Yosemite Place | Y Sam        |      1 |
+----------------+--------------+--------+


聯結表

### 等值聯結(equijoin),它基於兩個表之間的相等測試。這種聯結也稱爲 內部聯結。
SELECT vend_name, prod_name, prod_price FROM vendors, products WHERE vendors.vend_id = products.vend_id ORDER BY vend_name, prod_name;


### 內部聯結的語法
SELECT vend_name, prod_name, prod_price FROM vendors INNER JOIN products ON vendors.vend_id = products.vend_id ORDER BY vend_name, prod_name;


### 上面提到用子查詢,返回訂購產品 TNT 的客戶列表,如今改爲聯結表的方式,能夠跟子查詢的方式對比一下。
SELECT cust_name, cust_contact FROM customers, orders, orderitems WHERE customers.cust_id = orders.cust_id AND orders.order_num = orderitems.order_num AND prod_id = 'TNT2';

注意

  • 應該保證全部的聯結都有 WHERE 子句,不然 MySQL 將返回比想要的數據多得多的數據。


建立高級聯結

表別名和自聯結

### 使用表別名,返回訂購產品 TNT 的客戶列表
SELECT cust_name, cust_contact FROM customers AS c, orders AS o, orderitems AS oi WHERE c.cust_id = o.cust_id AND o.order_num = oi.order_num AND prod_id = 'TNT2';

### 使用自聯結,查找商品 ID 爲 DTNTR 的供應商供應的全部產品
SELECT p1.prod_id, p1.prod_name FROM products AS p1, products AS p2 WHERE p1.vend_id = p2.vend_id AND p2.prod_id = 'DTNTR';

外部聯結

聯結包含了那些在相關表中沒有關聯行的行,外部聯結的兩種基本形式:左外部聯結(LEFT OUTER JOIN 即 LEFT JOIN)和右外部聯結。它們之間惟一差異是所關聯的表的順序不一樣。更具體能夠看一下 JOIN詳解函數

### 列出每一個客戶下的訂單,包括那些至今未下訂單的客戶
SELECT customers.cust_id, orders.order_num FROM customers LEFT JOIN orders ON customers.cust_id = orders.cust_id;
+---------+-----------+
| cust_id | order_num |
+---------+-----------+
|   10001 |     20005 |
|   10001 |     20009 |
|   10002 |      NULL |
|   10003 |     20006 |
|   10004 |     20007 |
|   10005 |     20008 |
+---------+-----------+

#### 對每一個用戶下的訂單計數,包括那些至今沒下訂單的客戶
SELECT c.cust_name, c.cust_id, COUNT(o.order_num) AS order_count FROM customers AS c LEFT JOIN orders AS o ON c.cust_id = o.cust_id GROUP BY c.cust_id;
+----------------+---------+-------------+
| cust_name      | cust_id | order_count |
+----------------+---------+-------------+
| Coyote Inc.    |   10001 |           2 |
| Mouse House    |   10002 |           0 |
| Wascals        |   10003 |           1 |
| Yosemite Place |   10004 |           1 |
| E Fudd         |   10005 |           1 |
+----------------+---------+-------------+


組合查詢

MySQL 容許執行多個查詢(多條 SELECT 語句),並將結果做爲單個查詢結果集返回。這些組合查詢稱爲並(union) 或 複合查詢(compound query)。測試

有兩種基本狀況,其中須要使用組合查詢:ui

  • 在單個查詢中從不一樣的表返回相似結構的數據;
  • 對單個表執行多個查詢,按單個查詢返回數據。
### 查詢價格小於等於5的全部物品而且查出供應商 1001 和 1002 生產的全部物品(不考慮價格)

### 先用 WHERE 多個子句來實現。
SELECT vend_id, prod_id, prod_price FROM products WHERE prod_price <= 5 OR vend_id IN (1001,1002);

### 使用組合查詢實現,會自動去除重複的行
SELECT vend_id, prod_id, prod_price FROM products WHERE prod_price <= 5 UNION SELECT vend_id, prod_id, prod_price FROM products WHERE vend_id IN (1001, 1002);

### 使用組合查詢查全部符合條件的列
SELECT vend_id, prod_id, prod_price FROM products WHERE prod_price <= 5 UNION ALL SELECT vend_id, prod_id, prod_price FROM products WHERE vend_id IN (1001, 1002);

### 組合查詢排序
SELECT vend_id, prod_id, prod_price FROM products WHERE prod_price <= 5 UNION SELECT vend_id, prod_id, prod_price FROM products WHERE vend_id IN (1001, 1002) ORDER BY vend_id, prod_id;

注意

  • UNION 必須由兩條或兩條以上的 SELECT 語句組成,語句之間用關鍵字 UNION 分隔。
  • UNION 中的每一個查詢必須包含相同的列,表達式或彙集函數(不過各個列不須要以相同的次序列出)。
  • 對組合查詢結果排序時,只能使用一條 ORDER BY 子句,它必須出如今最後一條 SELECT 語句以後。

一個持續更新的github筆記,連接地址:Front-End-Basics,能夠watch,也能夠star。code

此篇文章的地址:MySql必知必會

相關文章
相關標籤/搜索