查詢處理順序

Oracle SQL 入門

Hadrien Lacroix

Content Developer

為何處理順序很重要?

  • 最佳化查詢
    • 不產生多餘結果
    • 執行更快
Oracle SQL 入門

範例

    SELECT BillingCountry, AVG(Total) > 100) AS Average
    FROM Invoice
    WHERE BillingCity <> 'Paris' 
    GROUP BY BillingCountry
    HAVING AVG(Total) > 100
    ORDER BY Average DESC
Oracle SQL 入門

範例

    SELECT BillingCountry, AVG(Total) > 100) AS Average
->  FROM Invoice
    WHERE BillingCity <> 'Paris' 
    GROUP BY BillingCountry
    HAVING AVG(Total) > 100
    ORDER BY Average DESC
Oracle SQL 入門

範例

    SELECT BillingCountry, AVG(Total) > 100) AS Average
    FROM Invoice
->  WHERE BillingCity <> 'Paris' 
    GROUP BY BillingCountry
    HAVING AVG(Total) > 100
    ORDER BY Average DESC
Oracle SQL 入門

範例

    SELECT BillingCountry, AVG(Total) > 100) AS Average
    FROM Invoice
    WHERE BillingCity <> 'Paris' 
->  GROUP BY BillingCountry
    HAVING AVG(Total) > 100
    ORDER BY Average DESC
Oracle SQL 入門

範例

    SELECT BillingCountry, AVG(Total) > 100) AS Average
    FROM Invoice
    WHERE BillingCity <> 'Paris' 
    GROUP BY BillingCountry
->  HAVING AVG(Total) > 100
    ORDER BY Average DESC
Oracle SQL 入門

範例

->  SELECT BillingCountry, AVG(Total) > 100) AS Average
    FROM Invoice
    WHERE BillingCity <> 'Paris' 
    GROUP BY BillingCountry
    HAVING AVG(Total) > 100
    ORDER BY Average DESC
Oracle SQL 入門

範例

    SELECT BillingCountry, AVG(Total) > 100) AS Average
    FROM Invoice
    WHERE BillingCity <> 'Paris' 
    GROUP BY BillingCountry
    HAVING AVG(Total) > 100
->  ORDER BY Average DESC
Oracle SQL 入門

可能出什麼錯?

SELECT BillingCountry, 
       AVG(Total) > 100) AS Average
FROM Invoice
WHERE BillingCity <> 'Paris' 
GROUP BY BillingCountry
HAVING AVG(Total) > 100
ORDER BY Average DESC
  • 別名在 WHEREGROUP BYHAVING 中「不能」使用。
  • 別名在 ORDER BY 中「可以」使用。
Oracle SQL 入門

可能出什麼錯?

SELECT BillingCountry, 
       AVG(Total) > 100) AS Average
FROM Invoice
WHERE BillingCity <> 'Paris' 
GROUP BY BillingCountry
HAVING AVG(Total) > 100
ORDER BY Average DESC
  • 聚合值「不能」在 WHERE 子句中過濾。
  • 聚合值「可以」在 HAVING 子句中過濾。
Oracle SQL 入門

可能出什麼錯?

SELECT BillingCountry, 
       AVG(Total) > 100) AS Average
FROM Invoice
WHERE BillingCity <> 'Paris' 
GROUP BY BillingCountry
HAVING AVG(Total) > 100)
ORDER BY Average DESC
  • 單筆列「不能」在 HAVING 子句中過濾。
  • 單筆列「可以」在 WHERE 子句中過濾。
Oracle SQL 入門

查詢執行順序

  1. FROMJOIN:決定要查哪些資料

  2. WHERE:過濾單筆列

  3. GROUP BY:分組列

  4. HAVING:過濾群組

  5. SELECT:選取欄位並套用欄位函式

  6. DISTINCT:移除重複

  7. UNIONUNION ALLINTERSECTMINUS:套用集合運算子

  8. ORDER BY:排序列

Oracle SQL 入門

一起來練習吧!

Oracle SQL 入門

Preparing Video For Download...