先贴蓝色神秘串:http://blog.jobbole.com/55086/#article-comment
非常好的一篇文章啊,读后收获颇多。虽然在校刚刚学完数据库系统,但课程重在讲述数据库系统原理,SQL只是讲了基本语法。自己虽然平时也用MySQL和Oracle,但也只是会用而已,对于语句背后的执行和意义并没有过多了了解。可能也是自己学习不精,没有去把SQL和数据库原理中的关系运算等知识联系在一起。下面是一些收获点:
SQL是一种声明式语言,所以在使用SQL时一定要转变传统编程观念--定义执行逻辑和顺序去指示数据库操作。我们在使用SQL的时候只是声明我们想要的结果集即可,数据库会自己处理好逻辑并返回结果。
SQL语法执行顺序应该是:
FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT -> UNION -> ORDER BY
FROM是第一个执行的这不难理解,因为要先将数据读入内存再进行WHERE和GROUP BY的筛选。SELECT是在之后执行的,这也是为什么一些数据库不支持在FROM中使用SELECT中定义的别名。
UNION是在ORDER BY之前执行的,也就是说我们的ORDER BY是可以将拼接后的结果进行排序的,也就是能保证拼接后有序。
SQL的核心是对表的引用而不是SELECT。一个完整SQL执行过程就是一张张中间表的生成和传递的过程。
FROM语句输出一张“联合“表,来自所有引用的表在某一维度的集合。然后通过WHERE语句筛选和GROUP BY处理生成新的输出表。
注意这里GROUP BY也是对表的引用进行操作,它将WHERE过后的表的引用转换为一种新的引用方式。(注意GROUP BY语句的限制:用GROUP BY的时候,SELECT后没有使用聚合函数的列都要出现在GROUP BY后面)
这里如果结合数据库系统原理课上学的关系代数(集合论)来看,一张数据库的表就是一组数据元的关系,而每个 SQL 语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表)。
引用表主要通过JOIN关键字来实现。JOIN并不是SELECT语句的一部分,它是构建连接表的关键字。
尽量不要使用逗号来代替JOIN进行表连接。因为JOIN有两个优势在这里:安全和更多的连接方式。
JOIN有很多变体,提供内连接、外连接、半连接、全连接等等功能。
派生表其实就是括号之间的子查询。使用派生表可以有效避免由于SQL逻辑产生的问题,同时一些情况下也可以提高SQL查询效率。
同样,因为SQL的核心是对表的引用,而不是对字段的引用,所以派生表是可以重用的。重用派生表可以通过WITH关键字实现。
这个不用过多解释,但SELECT语句有很多特殊规则,一些重要的如下: