MySQL 《必知必會》 原始碼 二
阿新 • • 發佈:2019-02-03
0## 5. 計算欄位, 函式, 分組
---------------------計算欄位-------------------------
## 拼接欄位: Concat() + 別名
## Concat可以把多個指定的串拼接成一個較長的串
SELECT Concat( vend_name, '(', vend_country, ')')
AS vend_title
FROM vendors
ORDER BY vend_name;
----------------------處理函式-------------------------
## https://blog.csdn.net/sinat_38899493/article/details/78710482
----------------------彙總資料-------------------------
## 聚集函式: 執行在行組上, 計算和返回單個值的函式
## 1. AVG(): 返回平均值
SELECT AVG(prod_price) AS '平均值'
FROM products;
## 2. COUNT(): 確定符合條件的行的數目
## 用法1: COUNT(*): 對錶中行的數目進行統計, 包含NULL值行
SELECT COUNT(*)
FROM products; ## 統計表中記錄總數
## 用法2: COUNT(column): 對特定表進行統計行數
SELECT COUNT(prod_price)
FROM products; ## 統計prod_price的記錄數
## 3. MAX(): 求最大值; MIN(): 求最小值; SUM(): 求總和
---------------------分組資料---------------------------
## 使用GROUP BY 和 HAVING進行資料分組
## 1. 根據vend_id分組, 查詢出每個製造商的商品數, with rollup表示最後再加個總記錄數
SELECT vend_id, COUNT(*) AS num_prod
FROM products
GROUP BY vend_id
WITH ROLLUP;
## 2. 查詢出訂單數>=2的客戶, HAVING過濾條件
SELECT cust_id, COUNT(*) AS orders FROM orders GROUP BY cust_id HAVING COUNT(*)>1;
## 3. 檢索出商品數 >= 2, 價格>= 10 De 商品資訊, HAVING + WHERE的組合過濾
SELECT vend_id, prod_price, COUNT(*) AS num_prods
FROM products
WHERE prod_price>=10
GROUP BY vend_id
HAVING COUNT(*) >= 2;
6. 子查詢和聯合查詢
------------------------子查詢----------------------------------
## 1. 最後一個字句返回產品id = TNT2的訂單
## 倒數第二個 返回這兩個訂單的客戶id
## 第一個 返回這個客戶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'));
## 2. 計算欄位作為子查詢
SELECT cust_name,
cust_state,
( SELECT COUNT(*)
FROM orders
WHERE orders.cust_id = customers.cust_id ) AS orders
FROM customers
ORDER BY cust_name;
## 3. 使用聯結進行查詢
## 外來鍵: 是某個表中包含另一個表主鍵值的一列, 定義了兩個表的關係
## 建議使用 INNER JOIN來聯結左右兩個表, 因為ON確保不會遺忘連線條件
SELECT vend_name, prod_name, prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id = products.vend_id;
## 內部聯結: INNER JOIN ... ON
## 外部聯結: OUTER JOIN ... ON, 外部聯結需要 LEFT 或 RIGHT 來制定左聯結還是右聯結
## LEFT表示選取左邊表的所有行, RIGHT表示選取右邊表的所有行
## 使用AND聯結多個表:
SELECT cust_name, cust_contact
FROM customers, orders, orderitems
WHERE customers.cust_id = orders.cust_id
AND orderitems.order_num = orders.order_num
AND prod_id = 'TNT2';
-----------------------------高階聯結----------------------------
## 使用表別名縮短SQL語句
SELECT cust_name, cust_contact
FROM customers AS c, orders AS o, orderitems AS oi
WHERE c.cust_id = o.cust_id
AND oi.order_num = o.order_num
AND prod_id = 'TNT2';
## 不同的連線:
## COUNT()函式的聯結: 檢索所有客戶以及每個客戶的訂單數
SELECT c.cust_name, c.cust_id, COUNT(o.order_num) AS num_ord
FROM customers AS c INNER JOIN orders AS o
ON c.cust_id = o.cust_id
GROUP BY c.cust_id;
7. 組合查詢
## 使用UNION來將多條SELECT組合成一個結果
## 語句1 : 檢索出價格小於等於5的記錄
SELECT *
FROM products
WHERE prod_price <=5;
## 語句2 : 檢索出1001和1002生產的商品
SELECT *
FROM products
WHERE vend_id IN(1001,1002);
## 使用UNION整合:
SELECT *
FROM products
WHERE prod_price <=5
UNION
SELECT *
FROM products
WHERE vend_id IN(1001,1002);
## UNION規則: UNION會自動取消重複記錄, 如果需要, 使用UNION ALL來包含所有