当前位置:  数据库>mysql

数据库中的SELECT语句逻辑执行顺序分析

    来源: 互联网  发布时间:2014-10-16

    本文导语:  引言   这不是一个什么多深的技术问题,多么牛叉的编程能力。这跟一个人的开发能力也没有非常必然的直接关系,但是知道这些会对你的SQL编写,排忧及优化上会有很大的帮助。它不是一个复杂的知识点,但是一个非常基...

引言

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

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

  由于这篇文章是突然有感而写,下面随手编写的SQL语句没有经过测试。

  看下面的几段SQL语句:

代码如下:
#1
SELECT ID,COUNT(ID) AS TOTAL
 
FROM STUDENT
 
GROUP BY ID
 
HAVING TOTAL>2
#2
SELECT ID,COUNT(ID) AS TOTAL
 
FROM STUDENT
 
GROUP BY ID
 
ORDER BY TOTAL
#3
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还没有创建,因此它是不能执行成功的。

总结

  回忆起曾经随意问过一些人这个问题,不管谁说不知道时我们都会故意嘲笑一翻,当然此嘲笑非彼嘲笑。但事实证明还是有一些人不会注意到这个知识点,在此贴出来只是做为一个友好的提醒。


    
 
 

您可能感兴趣的文章:

  • oracle数据库删除数据Delete语句和Truncate语句的使用比较
  • 使用php语句将数据库*.sql文件导入数据库
  • sql语句获取数据库服务器上所有数据库的名字
  • sql 语句 取数据库服务器上所有数据库的名字
  • 同一个sql语句 连接两个数据库服务器
  • SQL Server数据库的修复SQL语句
  • MYSQL速度慢的问题 记录数据库语句
  • 修改数据库文件及日志文件增量的sql语句
  • 如何实现连接一次数据库,提交多个sql语句。(sql的批处理)
  • oracle数据库添加或删除一列的sql语句
  • jsp中插入有主关键字的数据库的sql语句如何写???
  • 请问在 Linux 下如何用代码实现连接oracle数据库 并 执行 SQL 语句?
  • 求一SHELL,有关执行数据库语句!
  • SQLSERVER查询所有数据库名,表名,和字段名的语句
  • SQL语句查询数据库中重复记录的个数
  • 备份数据库的T-SQL语句
  • 查看数据库中所有触发器的sql语句
  • 在jsp中通过JDBC和odbc链接数据库的语句各是怎样写的?
  • mysql查询字符串替换语句小结(数据库字符串替换)
  • 查询数据库中所有用户表或表个数的sql语句
  • RESIN做服务器,从数据库里提取字段值,页面输出顺序必须与字段顺序一致吗?
  • Oracle数据库访问参数文件的顺序
  • 请问,在unix下,关闭oracle数据库和重起unix,的正确顺序和命令应该是怎样的!请教!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • T-sql语句修改数据库逻辑名与数据库名等
  • Oracle数据库逻辑备份的SH文件
  • 基于Key-Value的NOSQL数据库Redis的数据结构及常用相关命令介绍
  • 如何监控数据库的数据,如果数据库数据更改,就通知Server
  • SQL Server 2008如何进行数据库分离和附加详细介绍
  • 散分:Jbuilder6开发数据库应用请问你们都用什么数据库? 免费的数据库有那些?
  • 文档数据库mongodb与列式数据库hbase详细比较
  • 如何从数据库中或文本文件中提取数据到另一个数据库中?
  • nosql数据库levedb介绍及levedb最新版1.18下载安装
  • 用JDBC连接Oracle数据库时,如何向数据库中写日期型数据(格式)?谢了!
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 开发java下的数据库程序,用什么数据库引擎?
  • php中内置的mysql数据库连接驱动mysqlnd简介及mysqlnd的配置安装方式
  • 我从JSP页将数据插入到oracle数据库中,为何汉字插入后数据库中显示为乱码呢?
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • 请问Linux数据库编程是否也可以支持通用的SQL语言进行数据库编写.
  • 删除数据库中重复记录方法介绍及代码参考
  • 数据在页面写不进数据库,也不可以从数据库中读出是什么原因?
  • Mongodb数据库服务的开启与关闭详细介绍
  • 请问谁有Applet连接远程Access数据库并且显示数据库内容的例子!
  • CSS属性参考手册 iis7站长之家
  • mssql无数据库日志文件恢复数据库的方法第1/2页
  • 如何实现 coreos 下Docker 与分布式数据库结合
  • mysql 本地数据库如何从远程数据库导数据


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3