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