数据库 SELECT 语句记录

定义

直接上完整定义, 然后再慢慢解释.

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:

  1. ALL

    保留所有结果, 不去除重复的结果.

  2. DISTINCT

    去除重复的结果.

  3. AS

    最后在结果中显示的列名.

tableref:

  1. AS

    起别名. SELECT * FROM tablename AS table1, tablename AS table2 WHERE table1.colname1 = table2.colname2

  2. LEFT OUTER JOIN

    table1 LEFT OUTER JOIN table2 的结果就是, table1 和 table2 先做 JOIN 运算, 然后将 table1 (因为它在运算符的左边) 中不在结果中的行添加到结果中去, 没有的属性值为 null. RIGHT, FULL 与之类似.

  3. ON

    这是 Theta JOIN, 普通的 JOIN 运算是, 相同列名的属性值如果相等则合并, 而 Theta JOIN 是, 相同列名的属性值如果满足 search_condition 则合并.

  4. USING

    被指定的列的属性值如果相同就合并.

Select statement:

  1. ASC

    升序排列

  2. DESC

    降序排列

如何理解 SELECT 语句

看到 SELECT 语句的时候, 它书写的顺序基本就是你理解的顺序. 总结下来就是下面这个顺序.

  1. FROM

    FROM 中的 table 进行笛卡尔乘积运算.

  2. WHERE

    将 1 中结果里的行逐个拿出来, 如果满足 WHERE 的条件就保留.

  3. GROUP BY

    GROUP BY 中指定的列的值相同的行归为一组.

  4. HAVING

    分组之后的每张表如果满足 HAVING 的 search_condition 就保留. 这里的 search_condition 主要是 SQL 自带的函数, 比如, SUM(), AVG(), MAX(), MIN(), COUNT().

  5. SELECT

    将 4 中最后剩下来的表进行合并, 并提取出指定的列组成最后的表.

  6. ORDER BY

    对最后的结果排序.