望向孤單的晚燈 是那傷感的記憶 再次泛起心里無(wú)數(shù)的思念……
1.
魯迅先生說(shuō)過(guò),學(xué)習(xí)一門(mén)語(yǔ)言,英語(yǔ)也好,計(jì)算機(jī)編程也罷,重要的是掌握它的結(jié)構(gòu)。對(duì)于編程而言,所謂結(jié)構(gòu),當(dāng)然不只是指語(yǔ)法結(jié)構(gòu),也包含了數(shù)據(jù)結(jié)構(gòu)等等……不過(guò),對(duì)于初學(xué)者而言,緊要的是先掌握語(yǔ)法結(jié)構(gòu)。
第3章的時(shí)候(Excel VBA ADO SQL入門(mén)教程003:字段查詢)我們說(shuō)過(guò),SELECT語(yǔ)句超簡(jiǎn)版的語(yǔ)法如下:
SELECT 字段名 FROM 表名
經(jīng)過(guò)這一段時(shí)間的分享,我們又陸續(xù)學(xué)習(xí)了WHERE/GROUP BY/HAVING/ORDER BY等子句……
因此,我們今就來(lái)說(shuō)下SELECT語(yǔ)句較為完整的語(yǔ)法結(jié)構(gòu)。
如下:
SELECT [DISTINCT] [TOP] 字段名
FROM 表名
[WHERE] 條件篩選
[GROUP BY] 分組
[HAVING] 分組篩選
[ORDER BY] 排序
被中括號(hào)包括的部分,都是可選的。
2.
了解了SELECT較為完整的語(yǔ)法結(jié)構(gòu),下一個(gè)問(wèn)題是:它的運(yùn)算順序是怎么樣的?
我們接觸到的語(yǔ)言,有些是按語(yǔ)句的先后順序運(yùn)算的,比如VBA;有些不是,比如Excel函數(shù),多層Excel函數(shù)是由里到外的運(yùn)算順序。
那么SQL呢?
一個(gè)完整的SELECT語(yǔ)句運(yùn)算順序如下:
(1),首先運(yùn)算的是FROM子句,根據(jù)FROM子句中指定的一個(gè)或多個(gè)表創(chuàng)建工作表。
(2),如果存在WHERE子句,則WHERE子句對(duì)步驟1獲得的工作表進(jìn)行條件篩選,刪除不符合條件的記錄。
(3),如果存在GROUP BY子句,則對(duì)步驟2生成的結(jié)果表按指定字段進(jìn)行分組,生成一份新的結(jié)果表。
(4),如果存在HAVING子句,則對(duì)步驟3的結(jié)果表按指定條件進(jìn)行篩選,刪除掉不滿足篩選條件的記錄。
(5),執(zhí)行SELECT子句,刪除不包含在SELECT 字段名 ,所指定的字段。如果SELECT子句中包含關(guān)鍵字DISTINCT,則執(zhí)行去重復(fù)運(yùn)算……
(6),如果有ORDER BY子句,則按指定的排序規(guī)則對(duì)結(jié)果表進(jìn)行排序操作。
(7),如果有TOP謂詞,則再進(jìn)行TOP運(yùn)算……
……
你看,SQL的運(yùn)算順序,既不是語(yǔ)句的先后順序,也不是由內(nèi)到外的順序;比如,最先出現(xiàn)的SELECT 字段名 并非首先運(yùn)算的,它的運(yùn)算順序處在HAVING子句之后和ORDER BY子句之前。DISTINCT處在TOP之前,但TOP的運(yùn)算又在DISTINCT之后。
3.
舉一個(gè)小栗子。
有一條SQL語(yǔ)句,如下:
SELECT 商品購(gòu)買(mǎi)日期 AS 日期 ,姓名 FROM [數(shù)據(jù)表$] WHERE 日期>#2018/1/10#
語(yǔ)句的意思是查詢數(shù)據(jù)表中“商品購(gòu)買(mǎi)日期”的值大于2018/1/10的日期和姓名兩個(gè)字段的數(shù)據(jù)。它使用了別名,將原字段名“商品購(gòu)買(mǎi)日期”重命名為“日期”(商品購(gòu)買(mǎi)日期 AS 日期)。
該語(yǔ)句運(yùn)算后,系統(tǒng)會(huì)發(fā)出以下錯(cuò)誤提示:
問(wèn)題出在哪兒哩?——WHERE 日期>#2018/1/10#
WHERE子句里的“日期”是什么呢?數(shù)據(jù)表內(nèi)并沒(méi)有日期這個(gè)字段名呀?
有朋友會(huì)想,笨蛋,日期是我做的別名呀,商品購(gòu)買(mǎi)日期 AS 日期……
別名是沒(méi)錯(cuò)的,但問(wèn)題在于,SELECT語(yǔ)句的運(yùn)算順序,WHERE子句是先于SELECT 字段名 部分的。也就是說(shuō)當(dāng)WHERE子句運(yùn)算時(shí),別名還沒(méi)起呢……
4,
最后說(shuō)句話,非常重要,嗯,晚安。
聯(lián)系客服