SQL 语句的语法顺序和其执行顺序完全不一样,其执行顺序大致为:
FROM
WHEREGROUP BYHAVINGSELECTDISTINCTUNIONORDER BY
FROM 才是 SQL 语句执行的第一步,并非 SELECT 。数据库在执行 SQL 语句的第一步是将数据
从硬盘加载到数据缓冲区中,以便对这些数据进行操作.
SELECT 是在大部分语句执行了之后才执行的,严格的说是在 FROM 和 GROUP BY 之后执行的。理解这一点是非常重要的,这就是你不能在 WHERE 中使用在 SELECT 中设定别名的字段作为判断条件的原因。 无论在语法上还是在执行顺序上, UNION 总是排在在 ORDER BY 之前。很多人认为每个 UNION段都能使用 ORDER BY 排序,但是根据 SQL 语言标准和各个数据库 SQL 的执行差异来看,这并不是真的。尽管某些数据库允许 SQL 语句对子查询(subqueries)或者派生表(derived tables)进行
排序,但是这并不说明这个排序在 UNION 操作过后仍保持排序后的顺序。
SQL 语言的核心是对表的引用
尽量不要使用逗号来代替 JOIN 进行表的连接,这样会提高你的 SQL 语句的可读性,并且可以避免一
些错误。
尽管没有严格的规定说明你何时应该使用 IN ,何时应该使用 EXISTS ,但是这些事情你还是应该知
道的:
IN比 EXISTS 的可读性更好EXISTS 比IN 的表达性更好(更适合复杂的语句)二者之间性能没有差异(但对于某些数据库来说性能差异会非常大SQL 语句中不能包含变量。但是你能写出类似于变量的语句,这些就叫做派生表 (as 别名.类似变量
)
SQL 语句中 GROUP BY 是对表的引用进行的操作当你应用 GROUP BY 的时候, SELECT 后没有使用聚合函数的列,都要出现在 GROUP BY 后面。
SELECT 语句有很多特殊的规则,至少你应该熟悉以下几条:
你仅能够使用那些能通过表引用而得来的字段;如果你有 GROUP BY 语句,你只能够使用 GROUP BY 语句后面的字段或者聚合函数;当你的语句中没有 GROUP BY 的时候,可以使用开窗函数代替聚合函数;当你的语句中没有 GROUP BY 的时候,你不能同时使用聚合函数和其它函数;有一些方法可以将普通函数封装在聚合函数中;
集合运算( set operation):
集合运算主要操作在于集合上,事实上指的就是对表的一种操作。从概念上来说,他们很好理解:DISTINCT 在映射之后对数据进行去重UNION 将两个子查询拼接起来并去重UNION ALL 将两个子查询拼接起来但不去重EXCEPT 将第二个字查询中的结果从第一个子查询中去掉INTERSECT 保留两个子查询中都有的结果并去重