SQL中SELECT語(yǔ)句的執(zhí)行順序

字號(hào):

好像自已在書(shū)寫(xiě) SQL 語(yǔ)句時(shí)由于不清楚各個(gè)關(guān)鍵字的執(zhí)行順序, 往往組織的 SQL 語(yǔ)句缺少很好的邏輯, 憑感覺(jué) "拼湊" ( 不好意思, 如果您的 SQL 語(yǔ)句也經(jīng)常 "拼湊", 那您是不是得好好反省一下呢?, 呵呵). 確實(shí)是爽了自己, 可苦了機(jī)器, 服務(wù)器還需要在我們的雜亂無(wú)章的 SQL 語(yǔ)句中尋找它下一句需要執(zhí)行的關(guān)鍵字在哪里. 效率嘛, 由于我們的感覺(jué)神經(jīng)對(duì)秒以下的變化實(shí)在不敏感, 暫且就認(rèn)為自已寫(xiě)的 SQL 順序無(wú)關(guān)緊要, "反正沒(méi)什么變化!", 呵呵.其實(shí)服務(wù)器對(duì)每句 SQL 解析時(shí)間都會(huì)有詳細(xì)記錄的, 大家可以看一下自已按習(xí)慣寫(xiě)的 SQL 和按標(biāo)準(zhǔn)順序?qū)懙腟QL解析時(shí)間差別有多大.
    因此, 考試#大建議大家在平時(shí)工作中 SQL 語(yǔ)句按標(biāo)準(zhǔn)順序?qū)? 一是專業(yè), 二是實(shí)用, 呵呵, 不過(guò)覺(jué)得主要的是心里感覺(jué)舒服.
    標(biāo)準(zhǔn)的 SQL 的解析順序?yàn)?
    (1).FROM 子句, 組裝來(lái)自不同數(shù)據(jù)源的數(shù)據(jù)
    (2).WHERE 子句, 基于指定的條件對(duì)記錄進(jìn)行篩選
    (3).GROUP BY 子句, 將數(shù)據(jù)劃分為多個(gè)分組
    (4).使用聚合函數(shù)進(jìn)行計(jì)算
    (5).使用 HAVING 子句篩選分組
    (6).計(jì)算所有的表達(dá)式
    (7).使用 ORDER BY 對(duì)結(jié)果集進(jìn)行排序
    舉例說(shuō)明: 在學(xué)生成績(jī)表中 (暫記為 tb_Grade), 把 "考生姓名"內(nèi)容不為空的記錄按照 "考生姓名" 分組, 并且篩選分組結(jié)果, 選出 "總成績(jī)" 大于 600 分的.
    標(biāo)準(zhǔn)順序的 SQL 語(yǔ)句為:
    select 考生姓名, max(總成績(jī)) as max總成績(jī)
    from tb_Grade
    where 考生姓名 is not null
    group by 考生姓名
    having max(總成績(jī)) > 600
    order by max總成績(jī)
    在上面的示例中 SQL 語(yǔ)句的執(zhí)行順序如下:
    (1). 首先執(zhí)行 FROM 子句, 從 tb_Grade 表組裝數(shù)據(jù)源的數(shù)據(jù)
    (2). 執(zhí)行 WHERE 子句, 篩選 tb_Grade 表中所有數(shù)據(jù)不為 NULL 的數(shù)據(jù)
    (3). 執(zhí)行 GROUP BY 子句, 把 tb_Grade 表按 "學(xué)生姓名" 列進(jìn)行分組
    (4). 計(jì)算 max() 聚集函數(shù), 按 "總成績(jī)" 求出總成績(jī)中大的一些數(shù)值
    (5). 執(zhí)行 HAVING 子句, 篩選課程的總成績(jī)大于 600 分的.
    (7). 執(zhí)行 ORDER BY 子句, 把后的結(jié)果按 "Max 成績(jī)" 進(jìn)行排序.