数据库 SELECT 语句记录
01 Jul 2013定义
直接上完整定义, 然后再慢慢解释.
subquery ::=
SELECT [ALL | DISTINCT] { * | expr [[AS] c_alias] {, expr [[AS c_alias]...}}
FROM tableref {, tableref...}
[WHERE search_condition]
[GROUP BY colname {, colname...}]
[HAVING search_condition]
| subquery UNION [ALL] subquery
tableref ::= tablename [[AS] corr_name [(colname {, colname...})]] -- simple form
| (subquery) [AS] corr_name [(colname {, colname...})] -- subquery as table
| tableref1 [INNER | {LEFT | RIGHT | FULL} [OUTER]] JOIN tableref2 -- join forms
ON search_condition | USING (colname {, colname...})
Select statement ::=
subquery [ORDER BY result_column [ASC | DESC] {, result_column [ASC | DESC]...}]
大写的照打, 小写的根据情况填, 中括号和大括号里的可选. 小括号照打, 注意, 不是小括号里的照打, 而是小括号本身照打.
解释
subquery:
-
ALL
保留所有结果, 不去除重复的结果.
-
DISTINCT
去除重复的结果.
-
AS
最后在结果中显示的列名.
tableref:
-
AS
起别名. SELECT * FROM tablename AS table1, tablename AS table2 WHERE table1.colname1 = table2.colname2
-
LEFT OUTER JOIN
table1 LEFT OUTER JOIN table2 的结果就是, table1 和 table2 先做 JOIN 运算, 然后将 table1 (因为它在运算符的左边) 中不在结果中的行添加到结果中去, 没有的属性值为 null. RIGHT, FULL 与之类似.
-
ON
这是 Theta JOIN, 普通的 JOIN 运算是, 相同列名的属性值如果相等则合并, 而 Theta JOIN 是, 相同列名的属性值如果满足 search_condition 则合并.
-
USING
被指定的列的属性值如果相同就合并.
Select statement:
-
ASC
升序排列
-
DESC
降序排列
如何理解 SELECT 语句
看到 SELECT 语句的时候, 它书写的顺序基本就是你理解的顺序. 总结下来就是下面这个顺序.
-
FROM
FROM 中的 table 进行笛卡尔乘积运算.
-
WHERE
将 1 中结果里的行逐个拿出来, 如果满足 WHERE 的条件就保留.
-
GROUP BY
GROUP BY 中指定的列的值相同的行归为一组.
-
HAVING
分组之后的每张表如果满足 HAVING 的 search_condition 就保留. 这里的 search_condition 主要是 SQL 自带的函数, 比如, SUM(), AVG(), MAX(), MIN(), COUNT().
-
SELECT
将 4 中最后剩下来的表进行合并, 并提取出指定的列组成最后的表.
-
ORDER BY
对最后的结果排序.