SQL语言是一门非常简单的语言,编写SQL只要理解其执行逻辑就能写出正确的SQL语句!
SQL语句和其他的编程语言最明显的区别是处理代码的执行顺序,大多数的编程语言,代码是按照编码顺序被处理,但是SQL语句的执行顺序是不同的。
例子:
1 •SELECT[DISTINCT] 2 •FROM 3 •WHERE 4 •GROUP BY 5 •HAVING 6 •UNION 7 •ORDER BY
上面的例子没有把所有的SQL语法结构都列出来,但是足够说明SQl的语法顺序和执行顺序完全不一样,上述语句的执行顺序为:
1 •FROM 2 •WHERE 3 •GROUP BY 4 •HAVING 5 •SELECT 6 •DISTINCT 7 •UNION 8 •ORDER BY
SQL语句的执行顺序值得注意的地方:
1.from是SQL语句执行的第一步,数据库执行SQL语句的第一步是将数据从硬盘加载到数据缓冲区,便于对这些数据进行操作。
2.select是在大部分语句执行后才执行的,严格说是在from和group by之后执行,这也是在where中不能使用在select中设定别名的字段作为判断条件的原因。
1 SELECT A.x + A.y AS z 2 FROM A 3 WHERE z = 10 -- z 在此处不可用,因为SELECT是最后执行的语句!
如果想使用别名Z,有两个选择。要么重新写一遍Z代表的表达式:
1 SELECT A.x + A.y AS z 2 FROM A 3 WHERE (A.x + A.y) = 10
或者求助衍生表,通用数据表达式或者视图,避免别名重用。
3.无论在语法上还是执行顺序上,union总是排在order by之前。很多人认为每个 UNION 段都能使用 ORDER BY 排序,但是根据 SQL 语言标准和各个数据库 SQL 的执行差异来看,这并不是真的。尽管某些数据库允许 SQL 语句对子查询(subqueries)或者派生表(derived tables)进行排序,但是这并不说明这个排序在 UNION 操作过后仍保持排序后的顺序。
注意:并非所有的数据库对 SQL 语句使用相同的解析方式。如 MySQL、PostgreSQL和 SQLite 中就不会按照上面第二点中所说的方式执行。
用一段话总结一下:
SQL Select语句完整的执行顺序:
1、from子句组装来自不同数据源的数据;
2、where子句基于指定的条件对记录行进行筛选;
3、group by子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用having子句筛选分组;
6、计算所有的表达式;
7、使用order by对结果集进行排序。
8、select 集合输出。