编辑“︁
查询 (SQL)
”︁(章节)
跳转到导航
跳转到搜索
File:AnonEditWarning.svg
您当前没有登录。
如果您保存任何编辑,您的
IP地址
将
公开记录
在
本页的修订历史
中。您如果
登录
或
注册一个帐号
,可以隐藏自己的IP地址并
使用更多功能
。您可以在
您的对话页
查看给您的留言。
任何侵权内容
将会删除 | 百科内容须附有来源,以
供查证
| 维基百科内容均容许他人编辑、使用和重制 | 参阅
繁简
和
地区词处理
指引。
反垃圾检查。
不要
加入这个!
==语义== SELECT语句内部各组成部分的理论计算顺序,依次为:<ref>Itzik Ben-Gan:《Microsoft Sql Server 2012 high-performance T-sql using windows functions》</ref> #FROM的表连接; ## 笛卡尔积 ## ON连接条件筛选(完成了内部连接) ## 添加外部连接的行 #WHERE子句篩選出满足條件的行集; #GROUP BY子句对行集中的行做分组合并,使得多个行对应于结果集中的一行; #应用HAVING子句从中间结果筛选出满足条件的行的集合; #SELECT的结果列中的表达式,然后是DISTINCT关键字处理(如果有的话)。因此,在SELECT中给结果集中的列指定别名,是无法被WHERE子句或者GROUP BY子句或者HAVING可见并使用的。 #应用ORDER BY子句对结果集中的行排序。 #如果存在TOP或OFFSET/FETCH,对结果行的挑选。 如果使用了GROUP BY子句做分组合并,之后要引用的列必须是或者出现在GROUP BY子句中,或者被包含在聚合函数(如SUM、COUNT等)中。否则编译会报错。这是因为,上述两种情形的列对于每一个分组都有确定的单一值;而上述两种情形以外的列,对于每一个分组,有可能对应于原始行集的多个行从而具有多个不同的值,那么选择哪个值作为该分组的该列的值?无从选择。聚合函数计算时忽略掉列值为NULL的行。 HAVING子句是在分组后再做筛选,所以HAVING子句中可以包含聚合函数;而WHERE子句就不能包含聚合函数,因为WHERE子句是在分组之前计算的,那时根本无从计算聚合函数。例如,对销售表依据客户名称做分组合并,然后筛选出每个客户的订单合计金额大于100万元的情形,从而得到规模以上大客户的清单。 使用ORDER BY子句,可以按照单个列排序,也可以依次按照多个列排序,也可以按照结果集中列的别名排序,还可以使用结果集之外的列排序。但是,如果已经指定了SELECT DISTINCT或者该语句包含了GROUP BY子句,或是包含了UNION运算符,则排序列必须包含在结果集的列中。这是因为,在上述情形,原数据或者中间表的多个行对应于结果集中的一行;排序列如果不出现在结果集的列中,那么就可能使结果集中的一行对应于多行从而有了多个排序列的值,这行的排序情况就不唯一导致无从确定其排序后的顺位。可以使用ASC或者DESC关键字制定升序或降序,缺省为升序。 对于排序来说,更复杂的是不同字符编码所带来的比较规则的不同。例如,ASCII字符串的字典序比较与Unicode字符串的字典序比较,就完全不同。可以使用COLLATE子句指定显式排序规则。比较运算符以及MAX、MIN、BETWEEN、LIKE、IN等运算符都涉及到排序规则。 筛选条件表达式,可以使用=(相等)、>、<、>=、<=、<>等比较运算符,NOT逻辑非、AND、OR等逻辑运算符,BETWEEN或者NOT BETWEEN表示开区间或者其补集的所有值,IN关键字列出所有可行值(特别是在子查询中),LIKE关键字用于模式匹配查询。模式包括%代表任意字符串,_代表单个任意字符,[]表示指定范围内的单个字符,[^]表示不在指定范围内的单个字符。可以用ESCAPE关键字定义[[转义字符]],或者用[]包含按照字面使用的字符。 NULL值计算使用[[三值逻辑]]。谓词计算结果为TRUE、FALSE或者UNKNOWN。对于筛选条件表达式,SQL只接受TRUE。对于CHECK约束则是拒绝FALSE。两个NULL值是否相等,这取决于是否遵从ANSI标准。可以使用谓词IS NULL或者IS NOT NULL使得结果确定且唯一。 在GROUP BY或者ORDER BY子句,分组或排序时两个NULL视为相等。 对结果集中的列,可以使用关键字TOP选项,限制结果集中返回行数或者行数所占百分比。还可以紧随其后使用关键字WITH TIES,返回原结果集中最后一行的排序字段相等的所有行。例如,返回原始数据表中某列最大的那一行,如果使用关键字WITH TIES就会把并列最大的多行全部返回。 在SELECT之后紧随关键字DISTINCT,使得结果集中不含重复的行。关键字DISTINCT也可用于函数参数。 '''子查询'''是嵌套于SELECT、INSERT、UPDATE、DELETE等语句中的查询。按照子查询返回结果的数量,分为标量子查询和多值子查询;按照对外部查询的依赖性,分为独立子查询和相关子查询。子查询出现在SELECT语句的结果列表中,那么子查询应该是返回单一值;这种子查询往往可以用表的Join操作代替。子查询用在WHERE子句的表达式中,可以返回单一值用于比较运算符(>、<、>=等等)之后;也可以返回多值且有ANY、SOME、ALL等关键字前缀用于比较运算符之后;还可以返回多值与关键字IN、EXISTS、NOT IN、NOT EXISTS连用。子查询可以嵌套子查询。
编辑摘要
(请简要描述您所作出的修改
,或选择:
新条目
修饰语句
修正笔误
内容扩充
排版
来源
内部链接
分类
消歧义
维基化
维护清理
)
请注意,所有对Local Chinese Wikipedia的贡献均可能会被其他贡献者编辑、修改或删除。如果您不希望您的文字作品被随意编辑,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源(详情请见
Project:著作权
)。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
导航菜单
个人工具
未登录
讨论
贡献
创建账号
登录
命名空间
条目
讨论
大陆简体
不转换
简体
繁體
大陆简体
香港繁體
澳門繁體
大马简体
新加坡简体
臺灣正體
查看
阅读
编辑
查看历史
更多
搜索
导航
首页
分类索引
特色内容
新闻动态
随机条目
联络我们
关于维基百科
资助维基百科
贡献
帮助
维基社群
编辑入门
互助客栈
IRC即时聊天
最近更改
特殊页面
工具
链入页面
相关更改
特殊页面
页面信息