SELECT 语句与其子句的详解

SELECT 语句与其子句的详解

 

闲来没事做,整理了一下SELECT语句的一点用法,不过这是SQL SERVER 2000 下的,整体的语法和informix 的SQL语法差不多,仅供参考,对于初学SQL语句的新手来说还是有帮助的,嘿嘿~~~ 其实我就是新手,以后还请各位大侠多多执教!!!

 

SELECT
从数据库中检索行,并允许从一个或多个表中选择一个或多个行或列。虽然 SELECT 语句的完整语法较复杂,但是其主要的子句可归纳如下:

SELECT select_list
[ INTO new_table ]
FROM table_source
[ WHERE search_condition ]
[ GROUP BY group_by_expression ]
[ HAVING search_condition ]
[ ORDER BY order_expression [ ASC | DESC ] ]

可以在查询之间使用 UNION 运算符,以将查询的结果组合成单个结果集。
语法
SELECT statement ::=
   < query_expression >
   [ ORDER BY { order_by_expression | column_position [ ASC | DESC ] }
       [ ,...n ]    ]
   [ COMPUTE
       { { AVG | COUNT | MAX | MIN | SUM } ( expression ) } [ ,...n ]
       [ BY expression [ ,...n ] ]
   ]
   [ FOR { BROWSE | XML { RAW | AUTO | EXPLICIT }
           [ , XMLDATA ]
           [ , ELEMENTS ]
           [ , BINARY base64 ]
       }
]
   [ OPTION ( < query_hint > [ ,...n ]) ]

< query expression > ::=
   { < query specification > | ( < query expression > ) }
   [ UNION [ ALL ] < query specification | ( < query expression > ) [...n ] ]

< query specification > ::=
   SELECT [ ALL | DISTINCT ]
       [ { TOP integer | TOP integer PERCENT } [ WITH TIES ] ]
       < select_list >
   [ INTO new_table ]
   [ FROM { < table_source > } [ ,...n ] ]
   [ WHERE < search_condition > ]
   [ GROUP BY [ ALL ] group_by_expression [ ,...n ]
       [ WITH { CUBE | ROLLUP } ]
   ]
   [HAVING ]
由于 SELECT 语句的复杂性,下面按子句说明详细的语法元素和参数:

SELECT 子句
指定由查询返回的列。
语法
SELECT [ ALL | DISTINCT ]
   [ TOP n [ PERCENT ] [ WITH TIES ] ]
   < select_list >

< select_list > ::=

   {    *
       | { table_name | view_name | table_alias }.*
       |     { column_name | expression | IDENTITYCOL | ROWGUIDCOL }
           [ [ AS ] column_alias ]
       | column_alias = expression
   }    [ ,...n ]

参数
ALL
指定在结果集中可以显示重复行。ALL 是默认设置。
DISTINCT
指定在结果集中只能显示唯一行。为了 DISTINCT 关键字的用途,空值被认为相等。
TOP n [PERCENT]
指定只从查询结果集中输出前 n 行。n 是介于 0 和 4294967295 之间的整数。如果还指定了 PERCENT,则只从结果集中输出前百分之 n 行。当指定时带 PERCENT 时,n 必须是介于 0 和 100 之间的整数。
如果查询包含 ORDER BY 子句,将输出由 ORDER BY 子句排序的前 n 行(或前百分之 n 行)。如果查询没有 ORDER BY 子句,行的顺序将任意。
WITH TIES
指定从基本结果集中返回附加的行,这些行包含与出现在 TOP n (PERCENT) 行最后的 ORDER BY 列中的值相同的值。如果指定了 ORDER BY 子句,则只能指定 TOP ...WITH TIES。
< select_list >
为结果集选择的列。选择列表是以逗号分隔的一系列表达式。
*
指定在 FROM 子句内返回所有表和视图内的所有列。列按 FROM 子句所指定的由表或视图返回,并按它们在表或视图中的顺序返回。
table_name | view_name | table_alias.*
将 * 的作用域限制为指定的表或视图。
column_name
是要返回的列名。限定 column_name 以避免二义性引用,当 FROM 子句中的两个表内有包含重复名的列时会出现这种情况。例如,Northwind 数据库中的 Customers 和 Orders 表内都有名为 ColumnID 的列。如果在查询中联接这两个表,可以在选择列表中将客户 ID 指定为 Customers.CustomerID。
expression
是列名、常量、函数以及由运算符连接的列名、常量和函数的任意组合,或者是子查询。
IDENTITYCOL
返回标识列。有关更多信息,请参见 IDENTITY(属性)、ALTER TABLE 和 CREATE TABLE。
如果 FROM 子句中的多个表内有包含 IDENTITY 属性的列,则必须用特定的表名(如 T1.IDENTITYCOL)限定 IDENTITYCOL。
ROWGUIDCOL
返回行全局唯一标识列。
如果在 FROM 子句中有多个表具有 ROWGUIDCOL 属性,则必须用特定的表名(如 T1.ROWGUIDCOL)限定 ROWGUIDCOL。
column_alias
是查询结果集内替换列名的可选名。例如,可以为名为 quantity 的列指定别名,如"Quantity"或"Quantity to Date"或"Qty"。
别名还可用于为表达式结果指定名称,例如:
USE Northwind
SELECT AVG(UnitPrice) AS 'Average Price'
FROM [Order Details]
column_alias 可用于 ORDER BY 子句。然而,不能用于 WHERE、GROUP BY 或 HAVING 子句。如果查询表达式是 DECLARE CURSOR 语句的一部分,则 column_alias 不能用在 FOR UPDATE 子句中。

INTO 子句
创建新表并将结果行从查询插入新表中。
用户若要执行带 INTO 子句的 SELECT 语句,必须在目的数据库内具有 CREATE TABLE 权限。SELECT...INTO 不能与 COMPUTE 子句一起使用。有关更多信息,请参见事务和显式事务。
通过在 WHERE 子句中包含 FALSE 条件,可以使用 SELECT...INTO 创建没有数据的相同表定义(不同表名)。
语法
[ INTO new_table ]
参数
new_table
根据选择列表中的列和 WHERE 子句选择的行,指定要创建的新表名。new_table 的格式通过对选择列表中的表达式进行取值来确定。new_table 中的列按选择列表指定的顺序创建。new_table 中的每列有与选择列表中的相应表达式相同的名称、数据类型和值。
当选择列表中包含计算列时,新表中的相应列不是计算列。新列中的值是在执行 SELECT...INTO 时计算出的。
在此次发布的 SQL Server 版本中,select into/bulkcopy 数据库选项对是否可以使用 SELECT INTO 创建永久表没有影响。对包括 SELECT INTO 在内的某些大容量操作的记录量,取决于对数据库有效的恢复模式。有关更多信息,请参见使用恢复模型。
在以前发布的版本中,如果设置了 select into/bulk copy,则可用 SELECT INTO 创建永久表。
select into/bulk copy 用于向后兼容,但在以后的版本中可能不支持该选项。有关更多信息,请参考"恢复模式"和"向后兼容性"主题以及 ALTER DATABASE 主题。

FROM 子句
指定从其中检索行的表。需要 FROM 子句,除非选择列表只包含常量、变量和算术表达式(没有列名)。有关更多信息,请参见 FROM。
语法
[ FROM { < table_source > } [ ,...n ] ]

< table_source > ::=
   table_name [ [ AS ] table_alias ] [ WITH ( < table_hint > [ ,...n ] ) ]
   | view_name [ [ AS ] table_alias ]
   | rowset_function [ [ AS ] table_alias ]
   | OPENXML
   | derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ]
   | < joined_table >

< joined_table > ::=
    < table_source > < join_type > < table_source > ON < search_condition >
   | < table_source > CROSS JOIN < table_source >
   | < joined_table >

< join_type > ::=
   [ INNER | { { LEFT | RIGHT | FULL } [OUTER] } ]
   [ < join_hint > ]
   JOIN
参数
< table_source >
指定用于 SELECT 语句的表、视图、派生表和联接表。
table_name [[AS] table_alias ]
指定表名和可选别名。
view_name [ [ AS ] table_alias ]
指定名称、视图和可选别名。
rowset_function [ [AS] table_alias ]
是行集函数名和可选别名。有关行集函数列表的更多信息,请参见行集函数。
OPENXML
在 XML 文档上提供行集视图。有关更多信息,请参见 OPENXML。
WITH ( < table_hint > [ ,...n ] )
指定一个或更多表提示。有关表提示的更多信息,请参见 FROM。
derived_table [ [ AS ] table_alias ]
是嵌套 SELECT 语句,可从指定的数据库和表中检索行。
column_alias
替换结果集内列名的可选别名。

是两个或更多表的积的结果集。例如:
SELECT *
FROM tab1 LEFT OUTER JOIN tab2 ON tab1.c3 = tab2.c3
   RIGHT OUTER JOIN tab3 LEFT OUTER JOIN tab4
       ON tab3.c1 = tab4.c1
       ON tab2.c3 = tab4.c3
对于多个 CROSS 联接,请使用圆括号来更改联接的自然顺序。

指定联接操作的类型。
INNER
指定返回所有相匹配的行对。废弃两个表中不匹配的行。如果未指定联接类型,则这是默认设置。
LEFT [OUTER]
指定除所有由内联接返回的行外,所有来自左表的不符合指定条件的行也包含在结果集内。来自左表的输出列设置为 NULL。
RIGHT [OUTER]
指定除所有由内联接返回的行外,所有来自右表的不符合指定条件的行也包含在结果集内。来自右表的输出列设置为 NULL。

FULL [OUTER]
如果来自左表或右表的某行与选择准则不匹配,则指定在结果集内包含该行,并且将与另一个表对应的输出列设置为 NULL。除此之外,结果集中还包含通常由内联接返回的所有行。

指定联接提示或执行算法。如果指定了 ,也必须明确指定 INNER、LEFT、RIGHT 或 FULL。有关联接提示的更多信息,请参见 FROM。
JOIN
表示联接所指定的表或视图。
ON
指定联接所基于的条件。此条件可指定任何谓词,但通常使用列和比较运算符。例如:
SELECT ProductID, Suppliers.SupplierID
   FROM Suppliers JOIN Products
   ON (Suppliers.SupplierID = Products.SupplierID)
当条件指定列时,列不必有相同的名称或相同的数据类型。但是如果数据类型不同,则它们必须是兼容或可由 Microsoft? SQL Server? 进行隐性转换的类型。如果数据类型不能隐式转换,则条件必须使用 CAST 函数显式转换数据类型。
有关搜索条件和谓词的更多信息,请参见搜索条件。
CROSS JOIN
指定两个表的矢量积。返回同样的行,就像要联接的表只列于 FROM 子句中,并且未指定 WHERE 子句。例如,这两个查询返回的结果集都由 T1 和 T2 中所有行的完全联接组成:
SELECT * FROM T1, T2
SELECT * FROM T1 CROSS JOIN T2

WHERE 子句
指定用于限制返回的行的搜索条件。
语法
[ WHERE < search_condition > | < old_outer_join > ]

< old_outer_join > ::=
   column_name { * = | = * } column_name

参数

通过使用谓词限制结果集内返回的行。对搜索条件中可以包含的谓词数量没有限制。有关搜索条件和谓词的更多信息,请参见搜索条件。
< old_outer_join >
使用不标准的产品专用语法和 WHERE 子句指定外联接。*= 运算符用于指定左向外联接,=* 运算符用于指定右向外联接。
下例指定一个左向外联接,并在结果集内包含 Tab1 中不满足指定条件的行:
SELECT Tab1.name, Tab2.id
FROM Tab1, Tab2
WHERE Tab1.id *=Tab2.id
说明  这种语法具有潜在的二义性解释并且不标准,因此不提倡使用这种语法进行外联接。而应在 FROM 子句中指定联接。
可以通过在 FROM 子句中使用联接运算符,或通过在 WHERE 子句中使用不标准的 *= 和 =* 运算符来指定外联接。不能在同一语句中同时使用这两种方法。

GROUP BY 子句
指定用来放置输出行的组,并且如果 SELECT 子句 中包含聚合函数,则计算每组的汇总值。指定 GROUP BY 时,选择列表中任一非聚合表达式内的所有列都应包含在 GROUP BY 列表中,或者 GROUP BY 表达式必须与选择列表表达式完全匹配。
说明  如果未指定 ORDER BY 子句,则使用 GROUP BY 子句不按任何特定的顺序返回组。建议始终使用 ORDER BY 子句指定具体的数据顺序。
语法
[ GROUP BY [ ALL ] group_by_expression [ ,...n ]
       [ WITH { CUBE | ROLLUP } ]
]
参数
ALL
包含所有组和结果集,甚至包含那些任何行都不满足 WHERE 子句指定的搜索条件的组和结果集。如果指定了 ALL,将对组中不满足搜索条件的汇总列返回空值。不能用 CUBE 或 ROLLUP 运算符指定 ALL。
如果访问远程表的查询中有 WHERE 子句,则不支持 GROUP BY ALL 操作。
group_by_expression
是对其执行分组的表达式。group_by_expression 也称为分组列。group_by expression 可以是列或引用列的非聚合表达式。在选择列表内定义的列的别名不能用于指定分组列。
说明  text、ntext 和 image 类型的列不能用于 group_by_expression。
对于不包含 CUBE 或 ROLLUP 的 GROUP BY 子句,group_by_expression 的项数受查询所涉及的 GROUP BY 列的大小、聚合列和聚合值的限制。该限制从 8,060 字节的限制开始,对保存中间查询结果所需的中间级工作表有 8,060 字节的限制。如果指定了 CUBE 或 ROLLUP,则最多只能有 10 个分组表达式。
CUBE
指定在结果集内不仅包含由 GROUP BY 提供的正常行,还包含汇总行。在结果集内返回每个可能的组和子组组合的 GROUP BY 汇总行。GROUP BY 汇总行在结果中显示为 NULL,但可用来表示所有值。使用 GROUPING 函数确定结果集内的空值是否是 GROUP BY 汇总值。
结果集内的汇总行数取决于 GROUP BY 子句内包含的列数。GROUP BY 子句中的每个操作数(列)绑定在分组 NULL 下,并且分组适用于所有其它操作数(列)。由于 CUBE 返回每个可能的组和子组组合,因此不论指定分组列时所使用的是什么顺序,行数都相同。
ROLLUP
指定在结果集内不仅包含由 GROUP BY 提供的正常行,还包含汇总行。按层次结构顺序,从组内的最低级别到最高级别汇总组。组的层次结构取决于指定分组列时所使用的顺序。更改分组列的顺序会影响在结果集内生成的行数。
重要  使用 CUBE 或 ROLLUP 时,不支持区分聚合,如 AVG(DISTINCT column_name)、COUNT(DISTINCT column_name) 和 SUM(DISTINCT column_name)。如果使用这类聚合,SQL Server 将返回错误信息并取消查询。

HAVING 子句
指定组或聚合的搜索条件。HAVING 通常与 GROUP BY 子句一起使用。如果不使用 GROUP BY 子句,HAVING 的行为与 WHERE 子句一样。
语法
[HAVING ]
参数

指定组或聚合应满足的搜索条件。当 HAVING 与 GROUP BY ALL 一起使用时,HAVING 子句替代 ALL。有关更多信息,请参见搜索条件。
在 HAVING 子句中不能使用 text、image 和 ntext 数据类型。
说明  在 SELECT 语句中使用 HAVING 子句不影响 CUBE 运算符分组结果集和返回汇总聚合行的方式。

UNION 运算符
将两个或更多查询的结果组合为单个结果集,该结果集包含联合查询中的所有查询的全部行。这与使用联接组合两个表中的列不同。
使用 UNION 组合两个查询的结果集的两个基本规则是:
所有查询中的列数和列的顺序必须相同。
数据类型必须兼容。
语法
   { < query specification > | ( < query expression > ) }
       UNION [ ALL ]
       < query specification | ( < query expression > )
           [ UNION [ ALL ] < query specification | ( < query expression > )
               [ ...n ] ]
参数
< query_specification > | ( < query_expression > )
是查询规范或查询表达式,用以返回与另一个查询规范或查询表达式所返回的数据组合的数据。作为 UNION 运算一部分的列定义可以不相同,但它们必须通过隐性转换实现兼容。
下表说明数据类型与相应 (ith) 列的选项的比较规则。
ith 列的数据类型 结果表中 ith 列的数据类型
非数据兼容类型(数据转换不由 Microsoft? SQL Server? 隐性处理)。 SQL Server 返回的错误。
长度为 L1 和 L2 的固定长度 char。 长度与 L1 和 L2 中较长的那个相等的固定长度 char。
长度为 L1 和 L2 的固定长度 binary。 长度与 L1 和 L2 中较长的那个相等的固定长度 binary。
任一列或两列都是可变长度 char。 长度与为 ith 列指定的最大长度相等的可变长度 char。
任一列或两列都是可变长度 binary。 长度与为 ith 列指定的最大长度相等的可变长度 binary。
两列都是数字数据类型(如 smallint、int、float、money)。 与两列的最大精度相等的数据类型。例如,如果表 A 的 ith 列是 int 类型,表 B 的 ith 列是 float 类型,则 ith 列在结果表中的数据类型是 float,因为 float 比 int 更精确。
两列的描述都指定 NOT NULL。 指定 NOT NULL。
UNION
指定组合多个结果集并将其作为单个结果集返回。
ALL
在结果中包含所有的行,包括重复行。如果没有指定,则删除重复行。

ORDER BY 子句
指定结果集的排序。除非同时指定了 TOP,否则 ORDER BY 子句在视图、内嵌函数、派生表和子查询中无效。
语法
[ ORDER BY { order_by_expression [ ASC | DESC ] }    [ ,...n ] ]
参数
order_by_expression
指定要排序的列。可以将排序列指定为列名或列的别名(可由表名或视图名限定)和表达式,或者指定为代表选择列表内的名称、别名或表达式的位置的负整数。
可指定多个排序列。ORDER BY 子句中的排序列序列定义排序结果集的结构。
ORDER BY 子句可包括未出现在此选择列表中的项目。然而,如果指定 SELECT DISTINCT,或者如果 SELECT 语句包含 UNION 运算符,则排序列必定出现在选择列表中。
此外,当 SELECT 语句包含 UNION 运算符时,列名或列的别名必须是在第一选择列表内指定的列名或列的别名。
说明  在 ORDER BY 子句中不能使用 ntext、text 和 image 列。
ASC
指定按递增顺序,从最低值到最高值对指定列中的值进行排序。
DESC
指定按递减顺序,从最高值到最低值对指定列中的值进行排序。
空值被视为最低的可能值。
对 ORDER BY 子句中的项目数没有限制。然而,对于排序操作所需的中间级工作表的大小有 8,060 字节的限制。这限制了在 ORDER BY 子句中指定的列的合计大小。
COMPUTE 子句
生成合计作为附加的汇总列出现在结果集的最后。当与 BY 一起使用时,COMPUTE 子句在结果集内生成控制中断和分类汇总。可在同一查询内指定 COMPUTE BY 和 COMPUTE。
语法
[ COMPUTE
   { { AVG | COUNT | MAX | MIN | STDEV | STDEVP
       | VAR | VARP | SUM }
           ( expression ) } [ ,...n ]
   [ BY expression [ ,...n ] ]

参数
AVG | COUNT | MAX | MIN | STDEV | STDEVP | VAR | VARP

你可能感兴趣的:(数据库)