你好,我是富士大顆 Aiko
今天來補充一點進階的 SQL
本篇會談到:
在 SQL 中,透過表與表之間的相關列, JOIN
將來自兩個或多個表的行結合在一起。
INNER JOIN: 交集,只回傳兩個表都符合的一個記錄。
-- 在 A 表中找到的 id 並且在 B 表中有的 id 情況下,回傳 A 表的 id 與 B 表的 name
SELECT A.id, B.name FROM tableA A INNER JOIN tableB B ON A.id = B.id;
LEFT OUTER JOIN/ LEFT JOIN: 回傳左表的所有紀錄,即使右表中沒有符合。
-- 回傳 A 表的 id 與 B 表的 name,即使 B 表中沒有符合的 id,會回傳左表(A 表)的所有紀錄
SELECT A.id, B.name FROM tableA A LEFT OUTER JOIN tableB B ON A.id = B.id;
RIGHT OUTER JOIN/ RIGHT JOIN: 回傳右表的所有紀錄,即使左表中沒有符合。
-- 回傳 A 表的 id 與 B 表的 name,即使 A 表中沒有符合的 id,會回傳右表(B 表)的所有紀錄
SELECT A.id, B.name FROM tableA A RIGHT OUTER JOIN tableB B ON A.id = B.id;
FULL OUTER JOIN: 聯集,回傳所有左表和右表中的紀錄。
-- 回傳 A 表和 B 表中所有的 id 和 name 組合
SELECT A.id, B.name FROM tableA A FULL OUTER JOIN tableB B ON A.id = B.id;
CROSS JOIN:產生笛卡兒積,將左表的每一行與右表的每一行組合。
-- 回傳 A 表和 B 表的所有可能組合
SELECT A.id, B.name FROM tableA A CROSS JOIN tableB B;
-- 找出有相同部門的員工
SELECT A.name, B.name, A.department FROM employees A, employees B WHERE A.department = B.department AND A.id != B.id;
聚合函式用於對一組值執行計算,並回傳單個數值。
COUNT(): 計算列中的值的總數量。
-- tableA中有幾個id
SELECT COUNT(id) FROM tableA;
SUM(): 計算列中的值的總和。
SELECT SUM(salary) FROM tableA;
AVG(): 計算列中的平均值。
SELECT AVG(salary) FROM tableA;
MIN() 和 MAX(): 回傳列中的最小和最大值。
SELECT MIN(salary), MAX(salary) FROM tableA;
GROUP BY
將一組紀錄分組。-- 找出每個部門的平均工資
SELECT department, AVG(salary) FROM employees GROUP BY department;
HAVING
子句來過濾 GROUP BY
子句後的結果。
-- 找出每個部門的平均工資,但要大於五萬
SELECT department, AVG(salary) FROM employees GROUP BY department HAVING AVG(salary) > 50000;
以上!
不知道明天要寫什麼...