SQL 語法
INNER JOIN
INNER JOIN (內部連接) 為等值連接,必需指定等值連接的條件,而查詢結果只會返回符合連接條件的資料。
INNER JOIN 語法
SELECT table_column1, table_column2...
FROM table_name1
INNER JOIN table_name2
ON table_name1.column_name=table_name2.column_name;
或這樣寫:
SELECT table_column1, table_column2...
FROM table_name1
INNER JOIN table_name2
USING (column_name);
INNER JOIN 查詢範例
這是客戶資料表 customers:
| C_Id | Name | City | Address | Phone |
|---|---|---|---|---|
| 1 | 張一 | 台北市 | XX 路 100 號 | 02-12345678 |
| 2 | 王二 | 新竹縣 | YY 路 200 號 | 03-12345678 |
| 3 | 李三 | 高雄縣 | ZZ 路 300 號 | 07-12345678 |
這是產品訂單資料表 orders:
| O_Id | Order_No | C_Id |
|---|---|---|
| 1 | 2572 | 3 |
| 2 | 7375 | 3 |
| 3 | 7520 | 1 |
| 4 | 1054 | 1 |
| 5 | 1257 | 5 |
現在我們想列出所有客戶的訂單編號資料,可以使用 INNER JOIN 查詢:
SELECT customers.Name, orders.Order_No
FROM customers
INNER JOIN orders
ON customers.C_Id=orders.C_Id;
其中用點號連接之 XXX.YYY 表示 XXX 資料表中的 YYY 欄位。
查詢結果如下:
| Name | Order_No |
|---|---|
| 李三 | 2572 |
| 李三 | 7375 |
| 張一 | 7520 |
| 張一 | 1054 |
查詢結果只會返回符合連接條件的資料。
GROUP BY
GROUP BY子句用於將查詢結果按照一個或多個欄位進行分組,通常與聚合函數(如COUNT,SUM,AVG,MAX,MIN)一起使用。
GROUP BY 語法
SELECT column_name1, aggregate_function(column_name2)
FROM table_name
WHERE condition
GROUP BY column_name1;
GROUP BY 查詢範例
範例 1:計算每個客戶的訂單數量
使用前面的 customers 和 orders 資料表,計算每個客戶有多少筆訂單:
SELECT customers.Name, COUNT(orders.Order_No) AS Order_Count
FROM customers
INNER JOIN orders
ON customers.C_Id = orders.C_Id
GROUP BY customers.Name;
查詢結果如下:
| Name | Order_Count |
|---|---|
| 李三 | 2 |
| 張一 | 2 |
範例 2:使用多個欄位分組
按照客戶和城市分組統計:
SELECT customers.City, customers.Name, COUNT(orders.Order_No) AS Order_Count
FROM customers
INNER JOIN orders
ON customers.C_Id = orders.C_Id
GROUP BY customers.City, customers.Name;
範例 3:搭配 HAVING 子句過濾分組結果
HAVING 子句用於對分組後的結果進行過濾,類似於 WHERE,但 WHERE 是在分組前過濾,HAVING 是在分組後過濾:
SELECT customers.Name, COUNT(orders.Order_No) AS Order_Count
FROM customers
INNER JOIN orders
ON customers.C_Id = orders.C_Id
GROUP BY customers.Name
HAVING COUNT(orders.Order_No) > 1;
這個查詢只會返回訂單數量大於 1 的客戶。
常見的聚合函數
COUNT(): 計算記錄數量SUM(): 計算數值總和AVG(): 計算平均值MAX(): 取得最大值MIN(): 取得最小值
注意事項
SELECT子句中的非聚合欄位必須出現在GROUP BY子句中WHERE子句在GROUP BY之前執行,用於過濾原始資料HAVING子句在GROUP BY之後執行,用於過濾分組後的結果ORDER BY可以放在GROUP BY之後,用於排序結果