2008-5-27 13:14
风中劲草
SELECT语句基本
[size=2] SELECT语句
【类别】
DML
【语法】
SELECT statement ::=
[ORDER BY {order_by_expression|column_position [ASC|DESC]}
[,…n]]
[COMPUTE
{{ AVG|COUNT|MAX|MIN|SUM }(expression)}[,…n]
[BY expression [,…n]]
]
[FOR { BROWSE|COUNT|XML|MIN|SUM }(expression)][,…n]
[, XMLDATA]
[, ELEMENTS]
[, BINARY base64]
}
]
[OPTION ([,…n])]
::=
{|()}
[UNION [ALL])[…n]]
::=
SELECT [ALL|DISTINCT]
[{TOP integer|TOP integer PERCENT}[WITH TIES]]
[INTO new_table]
[FROM {}[,…n]]
[WHERE ]
[GROUP BY [ALL] group_by_expression [,…n]
[WITH {CUBE|ROLLUP}]
]
[HAVING ]
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]]
【参数】
下面分别列出各个子句的语法。
SELECT子句
使用SELECT子句来选择列,其语法如下:
SELECT [ALL|DISTINCT]
[TOP n [PERCENT] [WITH TIES] ]
::=
{ *
|{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到4 294 967 295之间的整数。如果指定了PERCENT,那么只从结果集中输出前百分之n行,这时,n的取值范围是0到100之间的整数。如果查询包含ORDER BY子句,将输出ORDER BY子句排序的前n行(或前百分之n行)。如果查询没有包含ORDER BY子句,行的顺序将任意排列。
★ WITH TIES 指定从基本结果集中返回附加的行,这些行包含与出现TOP n(PERCENT)行最后的ORDER BY列中的值相同的值。如果指定了ORDER BY子句,则只能指定TOP...WITH TIES。
★ 为结果集选择的列,每列用逗号隔开。
★ * 指定在FROM子句内返回所有表和视图内的所有列。列按FROM子句所指定的表或视图返回,并按它们在表或视图中的顺序排列。
★ {table_name|view_name|table_alias}.* 将*的作用域限定为指定的表或视图。
★ column_name 返回的列名。限定column_name以避免二义性引用,当FROM子句中的两个表内有包含重复名的列时会出现这种情况。例如,Northwind数据库中的Customers和Orders表内都有名为ColumnID的列,如果在查询中联接这两个表,可以在选择列表中将客户ID指定为Customers.CustomerID。
★ expression 列名、常量、函数以及由运算符连接的列名、常量和函数的任意组合,或者子查询。
★ IDENTITYCOL 返回标识列。
★ ROWGUIDCOL 返回行全局惟一标识列。
★ column_alias 指定查询结果集内替换列名的名称。
INTO子句
INTO子句用于创建新表并将结果行从查询插入新表中。若要执行带INTO子句的SELECT语句,必须在目的数据库内具有CREATE TABLE权限。SELECT...INTO不能与COMPUTE子句一起使用。其语法如下:
[INTO new_table]
根据选择列表中的列和WHERE子句选择的行,new_table指定要创建的新表名。new_table的格式通过对选择列表中的表达式进行取值来确定。new_table中的列按选择列表指定的顺序创建。new_table中的每列有与选择列表中的相应表达式相同的名称、数据类型和值。
当选择列表中包含计算列时,新表中的相应列不是计算列。新列中的值是在执行SELECT...INTO时计算出的。
FROM子句
FROM子句用于指定查询的表或视图,其语法如下:
[FROM {} [,…n] ]
::=
table_name [[AS] table_alias] [WITH([,…n] ) ]
|view_name [[AS] table_alias]
|rowset_function [ [AS] table_alias]
|OPENXML
|derived_table [AS] table_alias [(column_alias [,…n] ) ]
|
::=
ON
| CROSS JOIN
|
::=
[INNER|{{LEFT|RIGHT|FULL}[OUTRE]}]
[]
JOIN
其中,各关键字和参数说明如下:
★ 指定用于SELECT语句的表、视图、派生表和联接表。可在语句中使用多达256个表。
★ table_name [[AS] table_alias] 指定表名以及可选的别名。
★ 表提示。表提示指定一个表扫描、查询优化器要使用的一个或多个索引或查询优化器要在该表中为该SELECT语句使用的锁定方法。虽然这是一个选项,但查询优化器通常无须指定提示就能够选择最佳优化方法。的详细语法请参见SQL Server联机分析。
★ view_name [[AS] table_alias] 指定视图名以及可选的别名。
★ rowset_function [ [AS] table_alias] 指定行集函数以及可选的别名。
★ OPENXML 在XML文档上提供行集视图。
★ WITH([,…n] ) 给表提供提示。
★ derived_table [AS] table_alias 嵌套SELECT语句。
★ column_alias 列的别名。
★ 指定两个或多个表的积的结果集。
★ ON 指定联接所基于的条件。
★ CROSS JOIN 指定两个表的矢量积。
★ 指定联接操作的类型。
★ INNER 返回所有相匹配的行对。
★ {LEFT|RIGHT|FULL}[OUTRE] 指定内联接返回行的情况。如果是LEFT[OUTRE],表示查询结果集中不仅包括所有由内联接返回的行,还包括来自左表的不符合条件的行。如果是RIGHT[OUTRE],表示查询结果集中不仅包括所有由内联接返回的行,还包括来自右表的不符合条件的行。如果是FULL[OUTRE],表示结果集中包含通常由内联接返回的所有行。
★ 指定联接提示。
★ JOIN 联接所指定的表或视图。
WHERE子句
WHERE子句用于设置查询条件,即限制返回的行。其语法如下:
[WHERE |]
::=
column_name {* = | = * } column_name
其中,各关键字和参数说明如下:
★ 通过使用谓词限制结果集内返回的行。
★ 使用不标准的产品专用语法和WHERE子句指定外联接。*= 运算符用于指定左向外联接,=* 运算符用于指定右向外联接。
GROUP BY子句
使用Group BY子句可以对数据按照某个字段进行分组。如果SELECT子句中包含聚合函数,则会将聚合函数应用到所选行的子组中。Group BY子句的语法如下:
[GROUP BY [ALL] group_by_expression [,…n]
[WITH { CUBE|ROLLUP}]
]
其中,各关键字和参数说明如下:
★ ALL 包含所有组和结果集,甚至包含任何不满足WHERE子句指定的搜索条件的组和结果集。如果指定了ALL,将对组中不满足搜索条件的汇总列返回空值。不能用CUBE或ROLLUP运算符指定ALL。如果访问远程表的查询中有WHERE子句,则不支持GROUP BY ALL操作。
★ group_by_expression 是对其执行分组的表达式,可以是列或引用列的非聚合表达式。在选择列表内定义的列的别名不能用于指定分组列。
★ CUBE 指定在结果集内不仅包含由GROUP BY提供的正常行,还包含汇总行。在结果集内返回每个可能的组和字组组合的GROUP BY汇总行。GROUP BY汇总行在结果中显示为NULL,但可用来表示所有值。使用GROUPING函数确定结果集内的空值是否是GROUP BY汇总值。
★ ROLLUP 指定在结果集内不仅包含由GROUP BY提供的正常行,还包含汇总行。按层次结构顺序,从组内的最低级别到最高级别汇总组。组的层次结构取决于指定分组列时所使用的顺序。更改分组列的顺序会影响在结果集内生成的行数。
HAVING子句
HAVING子句指定组或聚合的搜索条件,它通常与GROUP BY子句一起使用。如果不使用GROUP BY子句,HAVING的行为与WHERE子句一样。其语法如下:
[HAVING ]
其中,指定搜索条件,其格式与WHERE子句的搜索条件类似。在HAVING子句中不能使用text,image和ntext数据类型。
ORDER BY子句
使用ORDER BY子句可以对搜索的结果进行排序。除非SELECT语句同时指定TOP,否则ORDER BY子句在视图、内嵌函数、派生表和子查询中无效。ORDER BY子句的语法如下:
[ORDER BY { order_by_expression [ASC|DESC] } [,…n] ]
其中,各关键字和参数说明如下:
★ order_by_expression 指定要排序的列,可以将排序的列指定为列名、列的别名(可由表名或视图名限定)和表达式,或者指定为代表选择列表内的名称、别名或表达式的位置的负整数。可指定多个排序列。
★ ASC 指定按递增顺序,从最低值到最高值对指定列中的值进行排序。
★ DESC 指定按递减顺序,从最高值到最低值对指定列中的值进行排序[/size]