Featured image of post SQL Select 捞取顺序

SQL Select 捞取顺序

要提升 SQL 捞取资料库的效率,就要先理解 SQL 捞取的架构原理,再从原理去优化捞取的 SQL

Photo by Caspar Camille Rubin on Unsplash

基本 SQL 语法

SELECT DISTINCT column, AGG_FUNC(column_or_expression), 
FROM mytable
    JOIN another_table
      ON mytable.column = another_table.column
    WHERE constraint_expression
    GROUP BY column
    HAVING constraint_expression
    ORDER BY column ASC/DESC
    LIMIT count OFFSET COUNT;

SQL 执行顺序

1 . FROM and JOINs

FROM 跟 JOIN 会有先执行,决定所有的资料集有哪些必须要查询,包含所有的 Sub Query 及其产生的 暂存表(temporary tables)

2. WHERE

决定完所有资料范围后,首先过滤 WHERE 限制的条件,判断哪些栏位的资料符合限制条件,在请求执行 FROM 条件时,会直接透过 WHERE 条件限制去过滤请求的资料

有 Alias 的查询子条件的 WHERE 限制条件无法马上执行,因为子条件的资料必须要先捞出来才能够在做外部的 WHERE 条件过滤

3. GROUP BY

在透过 WHERE 限制条件过滤完资料后,会将这些资料做 GROUP BY 群组运算,仅会留下唯一的栏位数值,当你需要整合这些资讯时,可以使用 GROUP BY 用在你的查询 Query 中

4. HAVING

假如 Query 有 GROUP BY 的条件,可以使用 HAVING 条件去对 GROUP BY 后的资料去做查询,使用 HAVING 条件过滤后将不符合条件的栏位资料丢弃,就像 WHERE 条件一样

5. SELECT

任何的 SELECT 栏位会在这个步骤去执行

6. DISTINCT

剩馀的栏位资料,如果资料列的资料值有重複时,会被使用 DISTINCT 进行过滤,相同的资料将会被丢弃

7. ORDER BY

若有使用 ORDER BY 条件,资料列会透过指定栏位去进行排序,可以顺向或逆向排序,因为要捞出的栏位已经被 SELECT 捞出来了,所以可以透过这些栏位去进行排序

8. LIMIT / OFFSET

最后,资料列会透过 LIMIT 及 OFFSET 条件捞出指定的资料范围,然后将最后的资料列回传输出

参考资料

Donate KJ 贊助作者喝咖啡

如果這篇文章對你有幫助的話,可以透過下面支付方式贊助作者喝咖啡,如果有什麼建議或想說的話可以贊助並留言給我
If this article has been helpful to you, you can support the author by treating them to a coffee through the payment options below. If you have any suggestions or comments, feel free to sponsor and leave a message for me!
方式 Method 贊助 Donate
PayPal https://paypal.me/kejyun
綠界 ECPay https://p.ecpay.com.tw/AC218F1
歐付寶 OPay https://payment.opay.tw/Broadcaster/Donate/BD2BD896029F2155041C8C8FAED3A6F8
All rights reserved,未經允許不得隨意轉載
Built with Hugo
主题 StackJimmy 设计