时间:2021-07-01 10:21:17 帮助过:28人阅读
SELECT 名称 SELECT 从表或视图中取出若干行. SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ] expression [ AS name ] [, ...] [ INTO [ TEMPORARY | TEMP ] [ TABLE ] new_table ] [ FROM table [ alias ] [, ...] ] [ WHERE condition ] [ GRO
SELECT
名称
SELECT — 从表或视图中取出若干行.
SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
expression [ AS name ] [, ...]
[ INTO [ TEMPORARY | TEMP ] [ TABLE ] new_table ]
[ FROM table [ alias ] [, ...] ]
[ WHERE condition ]
[ GROUP BY column [, ...] ]
[ HAVING condition [, ...] ]
[ { UNION [ ALL ] | INTERSECT | EXCEPT } select ]
[ ORDER BY column [ ASC | DESC | USING operator ] [, ...] ]
[ FOR UPDATE [ OF class_name [, ...] ] ]
LIMIT { count | ALL } [ { OFFSET | , } start ]
输入
expression
表的列/字段名或一个表达式.
name
使用 AS 子句为一个列/字段或一个表达式声明另一个名称.这个名称主要用于标记输出列。name 不能在 WHERE,GROUP BY或 HAVING 子句中使用。但是它可以在与 ORDER BY 子句里引用。
TEMPORARY, TEMP
该表是在这次会话中唯一的,并且将在会话结束后自动删除。
new_table
如果声明了 INTO TABLE 子句,查询的结果将存储在指出名称的另一个表中.目标表(new_table)将被自动创建并且在此命令执行之前不应该存在。请参考 SELECT INTO 获取更多信息.
注意: CREATE TABLE AS 语句也将从选择查询中创建新表.
table
FORM 子句引用的一个现存的表的名称.
alias
正在处理的表 table 的别名,用于缩写或消除一个表内部联合时的含混.
condition
一个结果为真或假布尔表达式.参阅 WHERE 子句获取更多信息.
column
表的列/字段的名称.
select
一个可以有除 ORDER BY 子句外的所有特性的选择语句.
输出
Rows
查询返回的所有结果集的行.
count
查询返回的行的记数.
描述
SELECT 将从一个或更多表中返回记录行。选择的侯选行是满足 WHERE 条件的所有行。或者如果省略了 WHERE 语句则选择表中的所有行.(参阅 WHERE 子句)
DISTINCT 将从选择出来的结果集中删除所有的重复的行。ALL (缺省)将返回所有侯选行,包括重复的行。
DISTINCT ON 删除匹配所有表达式的行,只保留每个重复集的第一行。注意这里每个重复集的"第一行"是不可预料的,除非我们用 ORDER BY 来保证我们希望的行最先出现。例如,
SELECT DISTINCT ON (location) location, time, report
FROM weatherReports
ORDER BY location, time DESC;
检索出每个地区的最近的天气预报。但是如果我们没有使用 ORDER BY 来强制每个地区按时间值降续排列,我们得到的将是每个地区的不可预料的时间的报告。
GROUP BY 子句允许用户将一个表分成概念上的组. (参阅 GROUP BY 子句。)
HAVING 子句声明一个分组了的表,该表是从前面声明的子句的结果集中去除了一些组后生成的.(参阅 HAVING 子句。)
ORDER BY 子句允许用户根据模式操作符(ASCending 或 DESCending)来表明他/她所希望的行的排序模式(参阅 ORDER BY 子句 )。
UNION 操作符允许结果集是那些涉及到的查询所返回的行的集合。(参阅 UNION 子句。)
INTERSECT 给出两个查询公共的行。(参阅 INTERSECT 子句。)
EXCEPT 给出存在于第一个查询而不存在于第二个查询的行。(参阅 EXCEPT 子句。)
FOR UPDATE 子句允许 SELECT 语句对选出的行执行排他锁。
LIMIT 子句允许给用户返回一个查询生成的结果的子集。(参阅 LIMIT 子句。)
你必须有 SELECT 权限用来从表中读取数值(参阅 GRANT/REVOKE 语句).
WHERE 子句
可选的 WHERE 条件有如下常见的形式:
WHERE boolean_expr
boolean_expr 可以包含任意个得出布尔值的表达式。通常表达式会是
expr cond_op expr
或
log_op expr
这里 cond_op 可以是下面之一:=,<,<=,>,>=,<> 或条件操作符象 ALL,ANY,IN,LIKE等,或者用户定义的操作符,而 log_op 可以为: AND,OR,NOT.比较返回的结果要么是TRUE 要么是 FALSET 并且如果表达式的值是 FALSE,所有记录都将被丢弃.
GROUP BY 子句
GROUP BY 声明一个分了组的表,该表源于应用使用下面的子句:
GROUP BY column [, ...]
GROUP BY 将把所有在组合了的列上共享同样的值的行压缩成一行。如果存在聚集函数,这些聚集函数将计算每个组的所有行,并且为每个组计算一个独立的值(如果没有 GROUP BY,聚集函数对选出的所有行计算出一个数值)。存在 GROUP BY 时,除了在聚集函数里面,对任何非组合列的引用都是非法的,因为对一个非组合列会有多于一个可能的返回值。
HAVING 子句
可选的 HAVING 条件有如下形式:
HAVING cond_expr
这里 cond_expr 与为 WHERE 子句里声明的相同.
HAVING 子句声明一个从前面的子句的结果集中去除了一些不符合 cond_expr 组后分组的表.
在 cond_expr 里引用的每个列/字段应该清晰地指明一个组的列/字段,除非引用在一个聚集函数里。
ORDER BY 子句
ORDER BY column [ ASC | DESC ] [, ...]
column 既可以是一个列/字段名也可以是一个序数。
序数指的是列/字段按顺序(从左到右)的位置.这个特性可以使得对没有一个合适名称的列/字段的排序成为可能.这一点可能永远没有用,因为总是可以通过AS 子句给一个要计算的列/字段赋予一个名称,例如:
SELECT title, date_prod + 1 AS newlen FROM films ORDER BY newlen;
从 PostgreSQL 版本 6.4 开始,还可以 ORDER BY 任意表达式,包括那些没有出现在 SELECT 结果列表里面的域。因此下面的语句现在是合法的:
SELECT name FROM distributors ORDER BY code;
我们可以给ORDER BY 子句里每个列/字段加一个关键字 DESC (降序)或 ASC(升序).如果不声明,ASC 是缺省.我们还可以声明一个排序操作符来实现排序。ASC 等效于使用 '<' 而 DESC 等效于使用 '>'。
UNION 子句
table_query UNION [ ALL ] table_query
[ ORDER BY column [ ASC | DESC ] [, ...] ]
这里 table_query 表明任何没有 ORDER BY 子句的选择表达式.
UNION 操作符允许结果集是那些涉及到的查询所返回的结果的集合。两个做为 UNION 直接操作数的 SELECT 必须生成相同数目的字段,并且对应的字段必须有兼容的数据类型。
缺省地,UNION 的结果不包含任何重复的行,除非声明了 ALL 子句.
同一 SELECT 语句中的多个 UNION 操作符是从左向右计算的.注意 ALL 关键字不一定是全局的,只是应用在当前一对表的结果上.
INTERSECT 子句
table_query INTERSECT table_query
[ ORDER BY column [ ASC | DESC ] [, ...] ]
这里 table_query 声明任何没有 ORDER BY 子句的选择表达式。
INTERSECT 给出两个查询公共的行。 两个做为 INTERSECT 直接操作数的 SELECT 的结果必须有相同数目的字段,并且对应的字段必须有兼容的数据类型。
除非用圆括号指明顺序,同一 SELECT 语句中的多个 INTERSECT 操作符是从左向右计算的。
EXCEPT 子句
table_query EXCEPT table_query
[ ORDER BY column [ ASC | DESC ] [, ...] ]
这里 table_query 声明任何没有 ORDER BY 子句的选择表达式。
EXCEPT 给出存在于第一个查询而不存在于第二个查询的行。(参阅 EXCEPT 子句)。两个做为 EXCEPT 直接操作数的 SELECT 的结果必须有相同数目的字段,并且对应的字段必须有兼容的数据类型。
除非用圆括号指明顺序,同一 SELECT 语句中的多个 EXCEPT 操作符是从左向右计算的。
LIMIT 子句
LIMIT { count | ALL } [ { OFFSET | , } start ]
OFFSET start
这里 count 声明返回的最大行数,而 start 声明开始返回行之前忽略的行数。
LIMIT 允许你检索有查询其他部分生成的行的某一部分。如果给出了限制计数,那么返回的行数不会超过哪个限制。如果给出了一个偏移量,那么开始返回行之前会忽略那个数量的行。
在使用 LIMIT 时,一个好习惯是使用一个 ORDER BY 子句把结果行限制成一个唯一的顺序。否则你会得到无法预料的查询返回的子集 --- 你可能想要第十行到第二十行,但以什么顺序?除非你声明 ORDER BY,否则你不知道什么顺序。
在 Postgres 7.0,查询优化器在生成查询规划时把 LIMIT 考虑进去了,所以你很有可能因给出的 LIMIT 和 OFFSET 值不同而得到不同的规划(生成不同的行序)。因此用不同的 LIMIT/OFFSET 值选择不同的查询结果的子集将不会产生一致的结果,除非你用 ORDER BY 强制生成一个可预计的结果顺序。这可不是毛病;这是 SQL 生来的特点,因为除非用了 ORDER BYE 约束顺序,SQL 不保证查询生成的结果有任何特定的顺序。
用法
将表 films 和表 distributors 联合在一起:
SELECT f.title, f.did, d.name, f.date_prod, f.kind
FROM distributors d, films f
WHERE f.did = d.did
title |did|name | date_prod|kind
-------------------------+---+----------------+----------+----------
The Third Man |101|British Lion |1949-12-23|Drama
The African Queen |101|British Lion |1951-08-11|Romantic
Une Femme est une Femme |102|Jean Luc Godard |1961-03-12|Romantic
Vertigo |103|Paramount |1958-11-14|Action
Becket |103|Paramount |1964-02-03|Drama
48 Hrs |103|Paramount |1982-10-22|Action
War and Peace |104|Mosfilm |1967-02-12|Drama
West Side Story |105|United Artists |1961-01-03|Musical
Bananas |105|United Artists |1971-07-13|Comedy
Yojimbo |106|Toho |1961-06-16|Drama
There's a Girl in my Soup|107|Columbia |1970-06-11|Comedy
Taxi Driver |107|Columbia |1975-05-15|Action
Absence of Malice |107|Columbia |1981-11-15|Action
Storia di una donna |108|Westward |1970-08-15|Romantic
The King and I |109|20th Century Fox|1956-08-11|Musical
Das Boot |110|Bavaria Atelier |1981-11-11|Drama
Bed Knobs and Broomsticks|111|Walt Disney | |Musical
统计用 kind 分组的所有电影和组的列/字段的 len (长度)的和:
SELECT kind, SUM(len) AS total FROM films GROUP BY kind;
kind |total
----------+------
Action | 07:34
Comedy | 02:58
Drama | 14:28
Musical | 06:42
Romantic | 04:38
统计所有电影(films),组的列/字段 len (长度)的和,用 kind 分组并且显示小于5小时的组总和:
SELECT kind, SUM(len) AS total
FROM films
GROUP BY kind
HAVING SUM(len) < INTERVAL '5 hour';
kind |total
----------+------
Comedy | 02:58
Romantic | 04:38
下面两个例子是根据第二列 (name)的内容对单独的结果排序的经典的方法.
SELECT * FROM distributors ORDER BY name;
SELECT * FROM distributors ORDER BY 2;
did|name
---+----------------
109|20th Century Fox
110|Bavaria Atelier
101|British Lion
107|Columbia
102|Jean Luc Godard
113|Luso films
104|Mosfilm
103|Paramount
106|Toho
105|United Artists
111|Walt Disney
112|Warner Bros.
108|Westward
这个例子演示如何获得表 distributors 和 actors 的联合,只将每个表中以字母 W 开头的取出来.因为只取了不相关的行,所以关键字 ALL 被省略了:
-- distributors: actors:
-- did|name id|name
-- ---+------------ --+--------------
-- 108|Westward 1|Woody Allen
-- 111|Walt Disney 2|Warren Beatty
-- 112|Warner Bros. 3|Walter Matthau
-- ... ...
SELECT distributors.name
FROM distributors
WHERE distributors.name LIKE 'W%'
UNION
SELECT actors.name
FROM actors
WHERE actors.name LIKE 'W%'
name
--------------
Walt Disney
Walter Matthau
Warner Bros.
Warren Beatty
Westward
Woody Allen
兼容性
扩展
Postgres 允许我们在一个查询里省略 FROM 子句。这个特性是从最初的 PostQuel 查询语言里保留下来的:
SELECT distributors.* WHERE name = 'Westwood';
did|name
---+----------------
108|Westward
SQL92
SELECT 子句
在SQL92 规范里,可选的关键字 "AS" 是多余的,可以忽略掉而不对语句产生任何影响.Postgres 分析器在重命名列/字段时需要这个关键字,因为类型扩展的特性会导致上下文语意不清.
DISTINCT ON 语法不是 SQL92 的标准。LIMIT 和 OFFSET 也不是。
UNION 子句
SQL92 的 UNION 语法允许一个附加的 CORRESPONDING BY 子句:
table_query UNION [ALL]
[CORRESPONDING [BY (column [,...])]]
table_query
CORRESPONDING BY 目前还不被 Postgres 支持.