SQL与js的实验室 2017-01-22 21:17程序员
今天你们共同窗习下SQL的语法顺序与执行顺序。(入门级的。大神们能够直接点退出了哈。)数据库
SQL 是一种声明式语言编程
首先要把这个概念记在脑中:“声明”。 SQL 语言是为计算机声明了一个你想从原始数据中得到什么样的结果的一个范例,而不是告诉计算机如何可以获得结果。函数
SQL 语言声明的是结果集的属性,计算机会根据 SQL 所声明的内容来从数据库中挑选出符合声明的数据,而不是像传统编程思惟去指示计算机如何操做。这是否是很爽?学习
(小编:简单粗暴地说:喂,电脑你把上个月存进去的全部销售记录给我调出来。电脑:上个月的记录有:spa
上边的例子很明确了吧。咱们不关心这些数据怎么得来的,咱们只想瞅瞅结果而已。命令行
为啥不少程序员都很抵触SQL呢,主要缘由是:咱们潜意识中的是按照命令式编程的思惟方式思考问题的。就好像这样:“电脑,先执行这一步,再执行那一步,可是在那以前先检查一下是否知足条件 A 和条件 B ”。例如,用变量传参、使用循环语句、迭代、调用函数等等,都是这种命令式编程的思惟惯式。而SQL偏偏没有按照这种命令式编程的思惟方式来处理问题。对象
另外,最最关键的一点:SQL 的语法并不按照语法顺序执行blog
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 语句的执行顺序,有三个值得咱们注意的地方:
一、 FROM 才是 SQL 语句执行的第一步,并不是 SELECT 。数据库在执行 SQL 语句的第一步是将数据从硬盘加载到数据缓冲区中,以便对这些数据进行操做。
二、 SELECT 是在大部分语句执行了以后才执行的,严格的说是在 FROM 和 GROUP BY 以后执行的。理解这一点是很是重要的,这就是你不能在 WHERE 中使用在 SELECT 中设定别名的字段做为判断条件的缘由。
若是你想重用别名new_rq,你有两个选择。要么就从新写一遍 new_rq 所表明的原字段:
…或者求助于衍生表、通用数据表达式或者视图,以免别名重用。
三、 不管在语法上仍是在执行顺序上, UNION 老是排在在 ORDER BY 以前。不少人认为每一个 UNION 段都能使用 ORDER BY 排序,可是根据 SQL 语言标准和各个数据库 SQL 的执行差别来看,这并非真的。尽管某些数据库容许 SQL 语句对子查询(subqueries)或者派生表(derived tables)进行排序,可是这并不说明这个排序在 UNION 操做事后仍保持排序后的顺序。
(舒适提示:并不是全部的数据库对 SQL 语句使用相同的解析方式。如 MySQL、PostgreSQL和 SQLite 中就不会按照上面第二点中所说的方式执行。)
亲们。你们学会了吗?
既然并非全部的数据库都按照上述方式执行 SQL 预计,那我噼里啪啦打字半天为了啥啥?
为了使你们要永远记得: SQL 语句的语法顺序和其执行顺序并不一致,这样咱们就能避开一些通常性的错误。若是你能记住 SQL 语句语法顺序和执行顺序的差别,那么恭喜你,你已经能够轻松解决SQL的一些通常性问题了。