子查询,也称为嵌套查询或子选择,是SELECT嵌入在另一个SQL查询的WHERE或HAVING子句中的查询。子查询返回的数据由外部语句使用,与使用文字值的方式相同。
子查询提供了一种简单而有效的方法来处理依赖于另一个查询结果的查询。它们几乎与普通的SELECT语句相同,但几乎没有限制。最重要的几点如下:
子查询必须始终出现在括号内。
子查询必须只返回一列。这意味着不能在子查询中使用SELECT*,除非所引用的表只有一列。如果目的是行比较,可以使用返回多列的子查询。
您只能使用返回多个值运算符(例如IN或NOTIN运算符)的多行的子查询。
子查询不能是UNION。只允许一个SELECT语句。
子查询最常与SELECT语句一起使用,但是也可以在INSERT,UPDATE或DELETE语句中或在另一个子查询中使用它们。
可用三种语法来创建子查询:
comparison[ANY|ALL|SOME](sqlstatement)
expression[NOT]IN(sqlstatement)
[NOT]EXISTS(sqlstatement)
子查询可分为以下几个部分:
comparison一个表达式及一个比较运算符,将表达式与子查询的结果作比较。
expression用以搜寻子查询结果集的表达式。
sqlstatementSELECT语句,遵从与其他SELECT语句相同的格式及规则。它必须括在括号之中。
可以拿子查询代替表达式用于SELECT语句字段表或WHERE或HAVING子句。在子查询之中,在WHERE或HAVING子句的表达式中,用于计算的特定值是由SELECT语句提供的。
ANY或SOME谓词,它们是同义字,来检索主查询中的记录,这些记录要满足在子查询中检索的任何记录的比较条件。下列示例将返回全部单价比任何以25%或更高的折扣卖出的产品高的产品:
SELECT*FROMProducts
WHEREUnitPrice>ANY
(SELECTUnitPriceFROMOrderDetails
WHEREDiscount>=.25);
使用ALL谓词只检索主查询中的这些记录,它们满足在子查询中检索的所有记录的比较条件。如果将前一个示例中的ANY改为ALL,查询只会返回单价比全部以25%或更高的折扣卖出的产品高的产品。这是更多的限制。
用IN谓词,只能在主查询检索那些记录,在子查询中的某些记录也包含和它们相同的值。下列示例返回有25%或更高的折扣的所有产品:
SELECT*FROMProducts
WHEREProductIDIN
(SELECTProductIDFROMOrderDetails
WHEREDiscount>=.25);
相反,可用NOTIN在主查询中检索那样的记录,在子查询中没有包含与它们的值相同的记录。
在true/false比较中使用EXISTS谓词(与可选的NOT保留字一道)来决定子查询是否会返回任何记录。
还可用子查询中的表名别名来查询子查询外的FROM子句的列表。下列示例返回工资等于或高于所有职位相同员工的平均工资的员工姓名。这张员工表的别名为"T1":
SELECTLastName,
FirstName,Title,Salary
FROMEmployeesAST1
WHERESalary>=
(SELECTAvg(Salary)
FROMEmployees
WHERET1.Title=Employees.Title)OrderbyTitle;
上例中AS保留词可选。
某些子查询在交叉表查询中是允许的,特别是谓词(那些在WHERE子句中的)。将子查询作为输出(那些列在SELECT中的)在交叉表查询中是不允许的。
1、本网站为开放性注册平台,以上所有展示信息均由会员自行提供,内容的真实性、准确性和合法性均由发布会员负责,本网站对此不承担任何法律责任。
2、网站信息如涉嫌违反相关法律规定或侵权,请发邮件至599385753@qq.com删除。