1. 程式人生 > >MySQL 《必知必會》 原始碼 二

MySQL 《必知必會》 原始碼 二

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 : 檢索出10011002生產的商品
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來包含所有