- ansi92 v.s. ansi89
- JOIN
- SQL 執行
- 與自己JOIN
- ORDER BY
- TOP
- OFFSET ...FETCH
JOIN
- INNER JOIN:會排除沒有對應的資料
- LEFT JOIN:左邊至少出現ㄧ次
- RIGHT JOIN:右邊至少出現ㄧ次
- FULL JOIN:左右邊至少出現ㄧ次,若無對應則以NULL呈現
- CROSS JOIN:交叉相乘。不需要ON條件,常用在測試資料時使用。
SQL語法選擇
ANSI 92 | ANSI 89 |
SELECT * FROM tb1 JOIN tb2 ON < ON Predicate > |
SELECT * FROM tb1 , tb2 WHERE < Where Predicate> |
執行效能相同 | |
優點:較清楚 | 缺點:若有其他條件時,比較混亂 |
SQL 執行
- SQL Parser:
- 檢查SQL物件名稱
- 檢查SQL語法中的欄位、資料表(或其他物件)是否存在
- Optimizer優化器:根據統計資料產生執行計劃Execution plan
- SQL OS:
- 編譯SQL OS 可解讀的執行檔
- 存取資料
自己與自己Join
情境:樹狀組織,每位員工被後有對應的主管
SELECT e.empid,e.lastname,e.title,
m.lastname,m.title
FROM HR.Employees e
JOIN HR.Employees m
ON e.mgrid = m.empid
--此處使用JOIN 會漏掉CEO
SELECT e.empid,e.lastname,e.title,
m.lastname,m.title
FROM HR.Employees e
LEFT JOIN HR.Employees m
ON e.mgrid = m.empid
ORDER BY
**只有ORDER BY中可以放別名
TOP
取前n筆資料
**只有SQL Server有,伴隨ORDER BY 一起出現
SELECT TOP(10) *
FROM Production.Products
SELECT TOP(10) PERCENT *
FROM Production.Products
SELECT TOP(10) WITH TIES *
FROM Production.Products
ORDER BY unitprice DESC
--WITH TIES 需與ORDER BY 一起使用
OFFSET...FETCH NEXT
跳過n筆資料,擷取以下幾筆,ㄧ定要有ORDER BY
SELECT * FROM
Production.Products
ORDER BY productid
OFFSET 20 ROWS
FETCH NEXT 30 ROWS ONLY;
--NEXT 可以用FIRST取代
--ROWS可以用ROW