查询处理顺序

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 入门

Vamos praticar!

Oracle SQL 入门

Preparing Video For Download...