本系列教程第3章的时候我们说过,SELECT语句超简版的语法如下:
SELECT 字段名 FROM 表名
经过这一段时间的分享,我们又陆续学习了:
WHERE/GROUP BY
HAVING/ORDER BY等子句……
因此,今就来说下SELECT语句较为完整的语法结构。
如下▼
SELECT [DISTINCT] [TOP] 字段名
FROM 表名
[WHERE] 条件筛选
[GROUP BY] 分组
[HAVING] 分组筛选
[ORDER BY] 排序
被中括号包括的部分,都是可选的。
……
了解了SELECT语句较为完整的语法结构,下一个问题是:它的运算顺序是怎么样的?
我们接触到的编程语言,有些是按语句的先后顺序运算的,比如VBA,这种运算顺序比较符合人的思维习惯,就很友好;有些不是,比如Excel函数,多层嵌套Excel函数的运算顺序是由里到外的,就很不符合人的思维方式,这也是为什么明明嵌套函数没有VBA代码辣么长,但却难以理解的原因。
那么SQL呢?
一个完整的SELECT语句运算顺序如下:
1)首先运算的是FROM子句,根据FROM子句创建表。
2)如果此时存在WHERE子句,则对步骤1获得的表进行条件筛选,剔除不符合条件的记录。
3)如果此时存在GROUP BY子句,则对步骤2生成的表按指定字段进行分组,生成一份新表。
4)如果此时存在HAVING子句,则对步骤3的虚拟表按指定条件进行筛选,剔除不满足筛选条件的记录。
5)执行SELECT子句,删除不包含在SELECT子句所指定的字段。如果SELECT子句中包含关键字DISTINCT,则执行去重复运算……
6)如果此时有ORDER BY子句,则按指定的排序规则对虚拟表进行排序。
7)如果此时有TOP谓词,则再进行TOP运算……
……
你看,SQL的运算顺序,既不是语句的先后顺序,也不是由内到外的顺序;比如,最先出现的SELECT 子句,并非首先运算的,它的运算顺序处在HAVING之后和ORDER BY之前。DISTINCT的位置处在TOP之前,但TOP的运算顺序又在DISTINCT之后。
打个响指,我举一个小栗子。
有一条SQL代码,如下:
SELECT 商品购买日期 AS 日期,姓名
FROM [数据表$]
WHERE 日期>#2018/1/10#
代码的意思是查询数据表中“商品购买日期”大于2018/1/10的日期和姓名两个字段的数据。它使用了别名,将原字段名“商品购买日期”重命名为“日期”(商品购买日期 AS 日期)。
该语句运算后,系统会发出以下错误提示:
问题出在哪儿呢?——WHERE 日期>#2018/1/10#
WHERE里的“日期”是什么呢?数据表内并没有日期这个字段名呀?
有朋友会想,笨蛋,日期是我做的别名呀,商品购买日期 AS 日期……
别名是没错的,但问题在于,SELECT语句的运算顺序,WHERE是先于SELECT 字段名 部分的。也就是说当WHERE运算时,别名还没起呢……
你想想,是不是这个道理?
……
今天给大家分享的内容就这样,虽然很简单,却很重要。当你的SQL语句运算结果不符合预设目标时,不妨从运算顺序着手揣摩一下。
挥挥手,咱们下期再见。
⏩需要系统学习Excel却找不到优质教程?学习Excel的过程中遇到疑难问题,却找不到人及时作出解答?
加入我的付费社群,学习+训练+答疑,与6000+在线会员一起,同微软最有价值专家MVP同行,全面精进Excel之道
🚂>>~
加入我的付费会员,全面学习Excel
透视表 函数 图表 VBA PQ想学啥学啥
👀