• 首页
  • 脚本语言
    • php
    • python
    • javascript
  • 编程语言
    • c
    • c++
    • c#
    • sql
    • java
  • 前端
    • html
    • css
  • 服务器
    • apache
    • nginx
  • 数据库
    • mysql
    • oracle
  • 操作系统
    • linux
  • 杂七杂八
  • 关于我

时间:

当前位置:

  • 编程语言
  • sql
  • SQL语句的执行顺序和其语句语法顺序不一致

欢 迎 光 临 My Blog!

SQL语句的执行顺序和其语句语法顺序不一致

2017-03-09 21:18:36

By: My

类别:sql

1092


SQL 语句有一个特性,就是:SQL 语句的执行顺序跟其语句的语法顺序并不一致.

SQL 语句的语法顺序是:

SELECT[DISTINCT]
FROM
WHERE
GROUP BY
HAVING
UNION
ORDER BY

为了方便理解,上面并没有把所有的 SQL 语法结构都列出来,但已经足以说明 SQL 语句的语法顺序和其执行顺序不一样,就以上述语句为例,其执行顺序为:

FROM
WHERE
GROUP BY
HAVING
SELECT
DISTINCT
UNION
ORDER BY

关于 SQL 语句的执行顺序,有三个值得我们注意的地方:

1、 FROM 才是 SQL 语句执行的第一步,并非 SELECT 。数据库在执行 SQL 语句的第一步是将数据从硬盘加载到数据缓冲区中,以便对这些数据进行操作。(注:原文为"The first thing that happens is loading data from the disk into memory, in order to operate on such data.")

2、 SELECT 是在大部分语句执行了之后才执行的,严格的说是在 FROM 和 GROUP BY 之后执行的。理解这一点是非常重要的,这就是你不能在 WHERE 中使用在 SELECT 中设定别名的字段作为判断条件的原因。

SELECT s.name AS n FROM student AS s WHERE n='张三';
//n在此处不可用,因为SELECT是在WHERE后才执行的语句

3、 无论在语法上还是在执行顺序上, UNION 总是排在在 ORDER BY 之前。很多人认为每个 UNION 段都能使用 ORDER BY 排序,但是根据 SQL 语言标准和各个数据库 SQL 的执行差异来看,这并不是真的。尽管某些数据库允许 SQL 语句对子查询(subqueries)或者派生表(derived tables)进行排序,但是这并不说明这个排序在 UNION 操作过后仍保持排序后的顺序。

注:并非所有的数据库对 SQL 语句使用相同的解析方式。如MySQL、PostgreSQL和 SQLite 中就不会按照上面第二点中所说的方式执行。

我们学到了什么?

既然并不是所有的数据库都按照上述方式执行 SQL 预计,那我们的收获是什么?我们的收获是永远要记得: SQL 语句的语法顺序和其执行顺序并不一致,这样我们就能避免一般性的错误。如果你能记住 SQL 语句语法顺序和执行顺序的差异,你就能很容易的理解一些很常见的 SQL 问题。

当然,如果一种语言被设计成语法顺序直接反应其语句的执行顺序,那么这种语言对程序员是十分友好的,这种编程语言层面的设计理念已经被微软应用到了 LINQ 语言中。


标签: sql

同 类 型 的 文 章:

sql语句表的引用推荐使用表连接

2017-03-27

1048

sql语句表的引用

2017-03-09

963

SQL语句的执行顺序和其语句语法顺序不一致

2017-03-09

1092

sql语句是一种声明语言

2017-03-09

1073

直 接 搜 索

热 门 标 签

  • php 6
  • linux 2
  • phpstorm 0
  • mysql 0
  • laravel 1
  • 配置 0
  • javascript 0
  • apache 1
  • 快捷键 0
  • redis 0
  • nginx 1
  • centos 1
  • 命令 1
  • nosql 0
  • html 0
  • windows 1
  • composer 3
  • c++ 0
  • thinkphp 0
  • css 2
  • 编译 0
  • sql 4

最 热 博 文

关 于 本 博 客

2017-03-13 20:21:08

  • 2396

用nginx做反向代理和负载均衡

2017-03-25 18:41:07

  • 1560

ab压测的使用

2017-03-25 21:32:37

  • 1220

日 历

友 情 链 接

书生程序员

码农志

cyf的个人博客

瑾儿博客

懵圈网

疾风博客

风轻云淡

凉凉浅浅

志友的博客

醉红尘

北平不是京城

返 回 顶 部
  • 脚本语言
  • 编程语言
  • 前端
  • 服务器
  • 数据库
  • 操作系统
  • 杂七杂八

©2024 版权所有 鄂ICP备2024074657号-1