引言


这不是一个什么多深的技术问题。多么牛叉的编程能力。这跟一个人的开发能力也没有很必定的直接关系,可是知道这些会对你的SQL编写,排忧及优化上会有很大的帮助。它不是一个复杂的知识点。可是一个很基础的SQL根基。不了解这些。你一直用普通水泥盖房子;掌握这些,你是在用高等水泥盖房子。

然而。就是这么一个小小的知识点,大家能够去调查一下周围的同事朋友。没准你会得到一个“惊喜”。


因为这篇文章是突然有感而写。以下随手编写的SQL语句没有经过測试。


看以下的几段SQL语句:
SELECT ID,COUNT(ID) AS TOTAL
FROM STUDENT
GROUP BY ID
HAVING TOTAL>2

SELECT ID,COUNT(ID) AS TOTAL
FROM STUDENT
GROUP BY ID
ORDER BY TOTAL

SELECT FIRSTNAME+' '+LASTNAME AS NAME, COUNT(*) AS COUNT 
FROM STUDENT
GROUP BY NAME

你认为哪一个可以成功运行?

言归正传

以下是SELECT语句的逻辑运行顺序:
  1. FROM
  2. ON
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. WITH CUBE or WITH ROLLUP
  7. HAVING
  8. SELECT
  9. DISTINCT
  10. ORDER BY
  11. TOP
MICROSOFT指出。SELECT语句的实际物理运行顺序可能会因为查询处理器的不同而与这个顺序有所出入。


几个演示样例


演示样例一

SELECT ID,COUNT(ID) AS TOTAL
FROM STUDENT
GROUP BY ID
HAVING TOTAL>2

认为这个SQL语句眼熟吗?对,很基础的分组查询。但它不能运行成功,由于HAVING的运行顺序在SELECT之上。
实际运行顺序例如以下:
  1. FROM STUDENT
  2. GROUP BY ID
  3. HAVING TOTAL>2
  4. SELECT ID,COUNT(ID) AS TOTAL
非常明显。TOTAL是在最后一句SELECT ID,COUNT(ID) AS TOTAL运行过后生成的新别名。因此。在HAVING TOTAL>2运行时是不能识别TOTAL的。


演示样例二

SELECT ID,COUNT(ID) AS TOTAL
FROM STUDENT
GROUP BY ID
ORDER BY TOTAL

这个的实际运行顺序是:
  1. FROM STUDENT
  2. GROUP BY ID
  3. SELECT ID,COUNT(ID) AS TOTAL
  4. ORDER BY TOTAL
这一次没有不论什么问题,可以成功运行。假设把ORDER BY TOTAL换成ORDER BY COUNT(ID)呢?

SELECT ID,COUNT(ID) AS TOTAL
FROM STUDENT
GROUP BY ID
ORDER BY COUNT(ID)
实际运行顺序:
  1. FROM STUDENT
  2. GROUP BY ID
  3. SELECT ID,COUNT(ID) AS TOTAL
  4. ORDER BY COUNT(ID)

没错。它是可以成功运行的。看SQL运行计划,它与上面ORDER BY TOTAL是一样的。

ORDER BY 是在SELECT后运行,因此可以用别名TOTAL。


演示样例三

SELECT FIRSTNAME+' '+LASTNAME AS NAME, COUNT(*) AS COUNT 
FROM STUDENT
GROUP BY NAME

实际运行顺序:
FROM STUDENT
GROUP BY NAME
SELECT FIRSTNAME+' '+LASTNAME AS NAME,COUNT(*) AS COUNT

非常明显,运行GROUP BY NAME时别名NAME还没有创建,因此它是不能运行成功的。



总结


回顾起以前任意问过一些人这个问题,无论谁说不知道时我们都会有益嘲笑一翻,当然此嘲笑非彼嘲笑。但事实证明还是有一些人不会注意到这个知识点。在此贴出来仅仅是做为一个友好的提醒。






SELECT语句逻辑运行顺序,你知道吗?的更多相关文章

  1. 微软官方:SELECT语句逻辑处理顺序

    以下步骤显示SELECT 语句的逻辑处理顺序或绑定顺序.此顺序确定在一个步骤中定义的对象何时可用于后续步骤中的子句. 例如,如果查询处理器可以绑定到(访问)在FROM 子句中定义的表或视图,则这些对象 ...

  2. Select的逻辑处理顺序(Transact-SQL)

    1. Select 语句基本写法 2. Select的逻辑处理顺序 SQL与其他编程语言不同的明显特征就是代码的处理顺序.在其他编程语言中,常见是按编写代码的先后顺序(从上之下)来处理.但在SQL中, ...

  3. MySQL-SQL语句中SELECT语句的执行顺序

    SELECT语句的执行顺序大家比较少关注,下面将为您详细介绍SQL语句中SELECT语句的执行顺序,供您参考,希望对您能够有所帮助. SELECT语句的执行的逻辑查询处理步骤: (8)SELECT ( ...

  4. day57-mysql-五种约束和sql语句逻辑执行顺序

    二.sql语句逻辑执行顺序 () SELECT () DISTINCT <select_list> 去重复 () FROM <left_table> () <join_t ...

  5. 容易被忽略的事----sql语句中select语句的执行顺序

    关于Sql中Select语句的执行顺序,一直很少注意这个问题,对于关键字的使用也很随意,至于效率问题,因为表中的数据量都不是很大,所以也不是很在意. 今天在一次面试的时候自己见到了,感觉没一点的印象, ...

  6. select 语句的执行顺序

    select 语句的执行顺序 借用ItZik Ben-Gan.Lubor Kollar.Dejan Sarka所著的<Sql Server 2005 技术内幕:T-SQL查询>的一段话足以 ...

  7. SQL 中 SELECT 语句的执行顺序

    好像自已在书写 SQL 语句时由于不清楚各个关键字的执行顺序, 往往组织的 SQL 语句缺少很好的逻辑, 凭感觉 "拼凑" ( 不好意思, 如果您的 SQL 语句也经常 " ...

  8. MySQL Select语句的执行顺序

    源文章:How is a query executed in MySQL? 当执行SQL的Select查询语句时,SQL指令的执行顺序如下: FROM 子句 WHERE 子句 GROUP BY 子句 ...

  9. mysql之sql语句逻辑执行顺序

    1. (1)from先执行,from执行后就会将所有表(多个表时和单表所有的表)数据加载到内存中了 (2)ON执行,得到连接表用的连接条件. (3)JOIN执行,根据ON的连接条件,将from加载的所 ...

随机推荐

  1. 洗牌问题 FZU - 1062 (传说中的思路题,hhh)

    设2n张牌分别标记为1, 2, -, n, n+1, -, 2n,初始时这2n张牌按其标号从小到大排列.经一次洗牌后,原来的排列顺序变成n+1, 1, n+2, 2, -, 2n, n.即前n张牌被放 ...

  2. 【BZOJ 1221】 1221: [HNOI2001] 软件开发 (最小费用流)

    1221: [HNOI2001] 软件开发 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1581  Solved: 891 Description ...

  3. luogu P1809 过河问题_NOI导刊2011提高(01)

    题目描述 有一个大晴天,Oliver与同学们一共N人出游,他们走到一条河的东岸边,想要过河到西岸.而东岸边有一条小船. 船太小了,一次只能乘坐两人.每个人都有一个渡河时间T,船划到对岸的时间等于船上渡 ...

  4. 范浩强treap 普通平衡树

    增加Split(分裂),Merge(合并)操作,非常好写,时间也不比普通treap慢什么. #include<bits/stdc++.h> using namespace std; str ...

  5. 【最小表示法】BZOJ2882-工艺

    [题目大意] 求一个循环数列的最小表示法. [思路] 最小表示法模板题.之前用SAM做的,MLE了hhhhh戳☆ #include<iostream> #include<cstdio ...

  6. 实用在线小工具 -- JS代码压缩工具

        实用在线小工具 -- JS代码压缩工具 将JS代码进行压缩可以减少内存占用,下面链接是一个在线JS代码压缩工具,它将多余的空格和换行符压缩了. JS代码压缩工具链接:http://jspack ...

  7. CDOJ 1314 Hash Perfectly FFT

    Hash Perfectly 题目连接: http://acm.uestc.edu.cn/#/problem/show/1314 Description In computing, a hash ta ...

  8. VK Cup 2016 - Qualification Round 1 (Russian-Speaking Only, for VK Cup teams) C. Promocodes with Mistakes 水题

    C. Promocodes with Mistakes 题目连接: http://www.codeforces.com/contest/637/problem/C Description During ...

  9. hdu 4027 Can you answer these queries? 线段树区间开根号,区间求和

    Can you answer these queries? Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/sho ...

  10. Windows UWP开发系列 – 控件默认样式

    今天用一个Pivot控件的时候,想修改一下它的Header样式,却发现用Blend和VS无法导出它的默认样式了,导致无法下手,不知道是不是Blend的bug. 在网上搜了一下,在MSDN上还是找到了它 ...