mysql的select语句

来源:互联网 发布:找正规网络兼职 编辑:程序博客网 时间:2024/04/27 18:35

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 支持.
 

原创粉丝点击