当前位置:文档之家› sql中select语句详解及用途

sql中select语句详解及用途

sql中select语句详解及用途1234567891 01 1 SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ] * | expression [ AS output_name ] [, ...][ FROM from_item [, ...] ][ WHERE condition ][ GROUP BY expression [, ...] ][ HAVING condition [, ...] ][ { UNION | INTERSECT | EXCEPT } [ ALL ] select ][ ORDER BY expression [ ASC | DESC | USING operator ] [, ...] ] [ FOR UPDATE [ OF tablename [, ...] ] ][ LIMIT { count | ALL } ][ OFFSET start ]这里 from_item 可以是:1 2 3 4 5 6 7 8 [ ONLY ] table_name [ * ][ [ AS ] alias [ ( column_alias_list ) ] ]|( select )[ AS ] alias [ ( column_alias_list ) ]|from_item [ NATURAL ] join_type from_item[ ON join_condition | USING ( join_column_list ) ]输入?expression表的列/字段名或一个表达式.output_name使用 AS 子句为一个列/字段或一个表达式声明另一个名称.这个名称主要用于标记输出列用于显示。

它可以在 ORDER BY 和 GROUP BY 子句里代表列/字段的值.但是 output_name 不能用于 WHERE 或 HAVING 子句;用表达式代替.from_item一个表引用,子查询,或者 JOIN 子句.详见下文.condition一个布尔表达式,给出真或假的结果.参见下面描述的 WHERE 和 HAVING 子句.select一个选择语句,可以有除 ORDER BY,FOR UPDATE,和 LIMIT 子句以外的所有特性(甚至在加了括弧的情况下那些语句也可以用).FROM 项可以包括:?table_name一个现存的表或视图的名字.如果声明了 ONLY,则只扫描该表.如果没有声明ONLY,该表和所有其派生表(如果有的话)都被扫描.可以在表名后面跟一个 * 来表示扫所有其后代表,但在目前的版本里,这是缺省特性.(在PostgreSQL 以前的版本里, ONLY 是缺省特性.)alias用于于前面的 table_name. 的替换名字,用于缩写或消除一个表自连接时的含混.(此时同一个表要扫描好几次.)如果写了别名,那么你也可以写一个字段别名列表,为表的一个或者几个字段提供替换名字.select一个在 FORM 子句里出现的子查询.它的输出作用好象是为这条 SELECT 命令在其生存期里创建一个临时表.请注意这个子查询必须用园括弧包围.并且必须给它加别名.join_type[ INNER ] JOIN, LEFT [ OUTER ] JOIN, RIGHT [ OUTER ] JOIN, FULL [ OUTER ] JOIN,或 CROSS JOIN. 之一.就 INNER 和 OUTER 连接类型,必须出现 NATURAL ON join_condition,或 USING ( join_column_list ) 之一.对于 CROSS JOIN,上面的项都不能出现.join_condition一个条件限制.类似 WHERE 条件,只不过它只应用于在这条 JOIN 子句里连接的两个 from_item.join_column_list一个 USING 字段列表 (a, b, ... ) 是 ON 条件 = AND = ... 的缩写.输出?Rows你声明的查询返回的所有结果集的行.count查询返回的行的计数.描述SELECT 将从一个或更多表中返回记录行。

选择的侯选行是满足 WHERE 条件的所有行。

或者如果省略了WHERE 语句则选择表中的所有行.(参阅 WHERE 子句).实际上,返回的行并不是由 FROM/WHERE/GROUP BY/HAVING 子句直接生成的行;其实,输出行是通过给每个选出的行计算 SELECT 输出表达式形成的.你可以在输出列表上写一个 * 表示选出的行的所有列.同样我们可以拿 table_name.* 表示来自该表的所以行.DISTINCT 将从选择出来的结果集中删除所有的重复的行。

ALL (缺省)将返回所有侯选行,包括重复的行。

DISTINCT ON 删除匹配所有你声明的表达式的行,只保留每个重复集的第一行。

DISTINCT ON 表达式是用和ORDER BY 项一样的规则来解释的,见下文.注意这里每个重复集的"第一行"是不可预料的,除非我们用 ORDER BY 来保证我们希望的行最先出现。

例如,SELECT DISTINCT ON (location) location, time, reportFROM weatherReportsORDER BY location, time DESC;检索出每个地区的最近的天气预报。

但是如果我们没有使用 ORDER BY 来强制每个地区按时间值降续排列,我们得到的将是每个地区的不可预料的时间的报告。

GROUP BY 子句允许用户把表分成匹配一个或多个数值的不同行的组.(参考 GROUP BY 子句.)HAVING 允许只选择那些满足声明条件的行组(参阅 HAVING 子句.)ORDER BY 导致返回的行按照声明的顺序排列.如果没有给出 ORDER BY,输出的行的顺序将以系统认为开销最小的顺序产生.(参阅 ORDER BY 子句.)多个 SELECT 查询可以用 UNION,INTERSECT,和 EXCEPT 操作符组合起来.必要时请使用圆括弧确定这些操作符的顺序.UNION 操作符计算是那些参与的查询所返回的行的集合。

如果没有声明 ALL,那么重复行被删除.(参阅UNION 子句.)INTERSECT 给出两个查询公共的行。

如果没有声明 ALL,那么重复行被删除.(参阅 INTERSECT 子句.)EXCEPT 给出存在于第一个查询而不存在于第二个查询的行。

如果没有声明 ALL,那么重复行被删除.(参阅 EXCEPT 子句.)FOR UPDATE 子句允许 SELECT 语句对选出的行执行排他锁。

LIMIT 子句允许给用户返回一个查询生成的结果的子集。

(参阅 LIMIT 子句.)你必须有 SELECT 权限用来从表中读取数值(参阅 GRANT/REVOKE语句.)FROM 子句FROM 子句为 SELECT 声明一个或多个源表.如果声明了多个源表,则概念上结果是所有源表所有行的迪卡尔积 --- 不过通常会增加限制条件以把返回的行限制为迪卡尔积的一个小子集.如果 FROM 项是一个简单表名字,它隐含包括来自该表子表(继承子表)的行. ONLY 将消除从该表的子表来的行.在 PostgreSQL 以前,这是缺省结果,而获取子表的行是通过在表名后面附加 * 实现的.这种老式性质可以通过命令 SET SQL_Inheritance TO OFF; 获取.FROM 项也可以是一个加了圆括弧的子查询(请注意子查询需要一个别名子句!).这个特性非常实用,因为这是在一条查询中获得多层分组,聚集,或者排序的唯一方法.最后,FROM 项可以是一条 JOIN 子句,它把两个简单的 FROM 项组合在一起.(必要时使用圆括弧来描述嵌套顺序.)CROSS JOIN 或 INNER JOIN 是简单的迪卡尔积,和你在顶层 FROM 里列出这两个项得到的一样. CROSS JOIN 等效于 INNER JOIN ON (TRUE),也就是说,不会有任何行被条件删除.这些连接类型只是符号上的便利,因为它们做得一点不比你只利用 FROM 和 WHERE 来的多.LEFT OUTER JOIN 返回所有符合条件的迪卡尔积(也就是说,所有符合它的 ON 条件的组合了的行),另外加上所有没有右手边行符合 ON 条件的左手边表中的行.这样的左手边行通过向右手边行插入 NULL 扩展为全长.请注意,当判断哪些行合格的时候,只考虑 JOIN 自己的 ON 或 USING.然后才考虑外层的 ON 或 WHERE 条件.相反, RIGHT OUTER JOIN 返回所有连接的行,另外加上所有未匹配右手边行(左手边插入 NULL 扩展为全长).这个字句只是符号方便,因为你可以调换左右输入而改用 LEFT OUTER JOIN.FULL OUTER JOIN 返回所有连接行,加上所有未匹配的左手边行(右边插入 NULL 扩展为全长),再加上所有未匹配的右手边行(左手边插入 NULL 扩展为全长).除了CROSS JOIN 以外的所有 JOIN 类型,你必须写 ON join_condition, USING ( join_column_list ),和NATURAL 中的一个.大多数情况下会是 ON:你可以写涉及两个连接表的任何条件表达式. USING 字段列表 (a, b, ...)是 ON 条件 = AND = ... 的缩写.另外,USING 假设两对等式中只有一个包含在 JOIN 输出中,而不是两个. NATURAL 是提及表中所有相似名字字段的 USING 列表的缩写.WHERE 子句可选的 WHERE 条件有如下常见的形式:WHERE boolean_exprboolean_expr 可以包含任意个得出布尔值的表达式。

通常表达式会是expr cond_op expr或log_op expr这里 cond_op 可以是: =,<,<=, >,>= 或 <>,或条件操作符象 ALL,ANY,IN,LIKE 等,或者用户定义的操作符,而 log_op 可以为: AND,OR,NOT. SELECT 将忽略所有 WHERE 条件不为 TRUE 的行.GROUP BY 子句GROUP BY 声明一个分了组的表,该表源于应用使用下面的子句:GROUP BY expression [, ...]GROUP BY 将把所有在组合了的列上共享同样的值的行压缩成一行。

相关主题