MySQL必知必會—概念篇mysql
MySQL必知必會—檢索數據篇github
假設要列出訂購物品 TNT2 的全部客戶。咱們能夠拆分出下面三步。sql
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 表中每一個客戶的訂單總數,咱們能夠查分出下面兩步。數據庫
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';
複製代碼
### 使用表別名,返回訂購產品 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詳解。segmentfault
### 列出每一個客戶下的訂單,包括那些至今未下訂單的客戶
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)。函數
有兩種基本狀況,其中須要使用組合查詢:post
### 查詢價格小於等於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;
複製代碼
一個持續更新的github筆記,連接地址:Front-End-Basics,能夠watch,也能夠star。測試
此篇文章的地址:MySql必知必會ui