更新时间:2023-11-04 GMT+08:00
分享

数据操作语句SELECT

语法

SELECT [TOP expression] [| ALL | DISTINCT ]

expression [ AS alias] [, ...]

[ FROM from_item [, ...] ] [join_clause]

[ WHERE condition ]

[ GROUP BY expression [, ...] ]

[ HAVING condition [, ...] ]

[ { UNION | INTERSECT | EXCEPT } [ ALL ] select ]

[ ORDER BY expression [ ASC | DESC] [LIMIT expression [OFFSET] expression]

From_item:

table-name [AS alias] view-name[as alias] [sub-query as alias]

Join_clause:

,from_item [ INNER | [ {LEFT | RIGHT} [OUTER] ] JOIN [from_item] ON [join-condition]

描述

SELECT将从一个或更多表中返回记录行。SELECT通常的处理如下:

  • 计算列出在FROM中的所有元素(FROM列表中的每个元素都是一个实际的或虚拟的表)。如果在FROM列表里声明了多个元素,它们就交叉连接在一起。请参考FROM子句。
  • 如果声明了WHERE子句,则在输出中消除所有不满足条件的行。请参考WHERE子句。
  • 如果声明了GROUP BY子句,输出就分成匹配一个或多个数值的不同组里。如果出现了HAVING子句,它消除那些不满足给出条件的组。请参GROUP BY子句和HAVING子句。
  • 输出行使用SELECT输出表达式针对每一个选中的行进行计算。请参考SELECT列表。
  • 使用UNION、INTERSECT、EXCEPT可以把多个SELECT语句的输出合并成一个结果集。UNION操作符返回两个结果集的并集。INTERSECT操作符返回两个结果集的交集。EXCEPT操作符返回在第一个结果集对第二个结果集的差集。不管哪种情况,重复的行都被删除,除非声明了ALL 。请参考UNION子句、INTERSECT子句、EXCEPT子句。
  • 如果声明了ORDER BY子句,返回的行将按照指定的顺序排序。如果没有给出ORDER BY,数据行是按照系统认为可以最快生成的顺序给出的。请参ORDER BY子句。
  • DISTINCT从结果中删除那些重复的行。请参考DISTINCT子句。

参数

  • FROM子句
    为SELECT声明一个或者多个源表,它包括下列元素:
    • table_name:一个现在的表或视图的名字(可以有模式修饰)。
    • alias:为那些包含别名的FROM项目取的别名。别名用于缩写或者在自连接中消除歧义(自连接中同一个表将扫描多次)。如果提供了别名,它就会完全隐藏表或者函数的实际名字。
    • sub-select:可以在FROM子句中出现SELECT。它的输出作用是为这条SELECT命令,在其生存期里创建一个临时表。这个SELECT必须用圆括弧包围。给这个SELECT语句一个别名。
  • WHERE子句

    可选子句,这里condition可以是任意生成类型为boolean的表达式。任何不满足该条件的行都会从输出中删除。

  • GROUP BY子句

    把所有在组合表达式上拥有相同值的行压缩成一行。expression可以是一个输入字段名字,或者是一个输出字段(SELECT列表项)的名字或序号,或者也可以是任意输入字段组成的表达式。在有歧义的情况下,一个GROUP BY的名字将被解释成输入字段的名字,而不是输出字段的名字。

    如果使用了聚集函数,就会对每组中的所有行进行计算并生成一个单独的值。如果出了GROUP BY子句域,SELECT列表表达式中再引用那些没有分组的字段是非法的,除非放在聚集函数里,因为对于未分组的字段,可以会返回多个数值。

  • HAVING子句

    HAVING去除了一些不满足条件的分组行,它与WHERE不同:WHERE在使用GROUP BY之前过滤出单独的行,而HAVING过滤由GROUP BY创建的行。在condition里引用的每个字段都必须无歧义地引用一个分组的行,除非引用出在一个聚集函数里。

    HAVING的出现把查询变成一个分组的查询,即使没有GROUP BY子句也是这样。所有选取的行都被认为会形成一个单一的组,而SELECT列表和HAVING子句只能从聚集函数里引用表的字段。这样的查询在HAVING条件为真的时候将发出一个行,如果为非真,则返回0行。

  • SELECT列表

    声明组成SELECT语句的输出行的表达式,可以引用在FROM子句里面计算出来的字段。通过使用子句AS output_name可以为输出字段取个别名。这个别名通常用于输出字段的显示。它也可以用于ORDER BY和GROUP BY子句中引用字段值,但是不能在WHERE或HAVING子句中使用。在WHERE或HAVING子句中必须使用表达式本身。

  • UNION子句

    一般表式为select_statement UNION [ALL] select_statement,这里的select_statement是任意没有ORDER BY、FOR UPDATE子句的SELECT语句。如果用圆括弧包围,ORDER BY可以附着在子表达式里。如果没有圆括弧,这些子句将交给UNION的结果使用,而不是给它们右边的输入表达式。缺省UNION结果不包含任何复的行,除非声明了ALL子句。同一个SELECT语句中的多个UNION操作符是从左向右计算的,除非用圆括弧进行了标识。

  • INTERSECT子句

    一般形式为select_statment INTERSECT select_statment,select_statement是任何不带ORDER BY,。INTERSECT计算涉及的SELECT语句返回的行集合的交集,不含重复的记录。多个INTERSECT计算的优先级同UNION。

  • EXCEPT子句

    一般形式为Select_statement EXCEPT,select_statement是任何没有ORDER BY、FOR UPDATE子句的SELECT表达式。EXCEPT操作符计算存在于左边SELECT语句的输出而不存在于右边SELECT语句输出的行,结果不包含任何重复的记录。多个EXCEPT计算的优先级同UNION。

  • ORDER BY子句

    根据指定的表达式对输出进行升序或降序的排序。如果根据最左边的表达式,两行结果相同,就根据下一个表达式进行比较。依此类推。如果对于所有声明的表达式都相同,则随机顺序返回。

  • DISTINCT子句

    删除输出中所有其他重复的行,仅保留一行。

说明:

  • 在SELECT语句中,如果查询条件中使用到变量(非数据表字段),需进行类型的强制转换,以明确变量的类型,否则DB进行编译处理时可能会出现数据类型错误;

    如:取字段A的值到变量v_A,查询条件为字段B(字符串)等于变量v_B,则应当写成:

    SELECT A INTO v_A FROM TABLE1 WHERE B=CAST(v_B AS VARCHAR);

    查询条件为字段B(字符串)等于变量v_B的前三个字符,则应当写成:

    SELECT A INTO v_A FROM TABLE1 WHERE B=SUBSTR(CAST(v_B AS VARCHAR),1,3);

    查询条件为满足运算表达式C/D等于10的字段,则应该写成:

    SELECT A INTO v_A FROM TABLE1 WHERE CAST(C AS INTEGER) / CAST(D AS INTEGER) = 10;
  • SELECT语句必需带INTO子句。

    【示例】:

    带HAVING子句的查询:

    CREATE TABLE employee( 
        id                VARCHAR NOT NULL, 
        first_name        VARCHAR, 
        last_name         VARCHAR, 
        salary            BIGINT, 
        city              VARCHAR, 
        description       VARCHAR 
    );
    ……
    SELECT city, AVG(salary)
    FROM employee
    GROUP BY city
    HAVING AVG(salary) > 50000;

    将表distributors和表actors的以W开头的名字合并:

    SELECT distributors.name
        FROM distributors
        WHERE distributors.name LIKE 'W%'
    UNION
    SELECT actors.name
        FROM actors
        WHERE actors.name LIKE 'W%';
分享:

    相关文档

    相关产品