数据操作语句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子句
- 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。
说明:
- 在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%';