sqlserver 20761上課筆記03

  • 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