一、列子查询:
1、子查询返回结果为一列多行;
2、常用的操作符:IN、NOT IN、ALL、ANY、SOME
3、操作符使用说明:
1)IN:IN后面的子查询可以返回多条记录,用于父查询匹配子查询返回的多个单列值;
2)NOT IN :将父查询条件中的表达式与子查询返回的结果进行比较,把不匹配的信息显示出来;
3)ALL:父查询相对于子查询中返回列表的所有值都必须满足。例:父查询的值为1、2、3、4,子查询里的值为2、3,现要求是 父查询的值 ALL>(子查询),则返回结果为4,即必须大于子查询里的所有值;
4)ANY:父查询相对于子查询中返回列表的所有值只满足一个即可。例:父查询的值为1、2、3、4,子查询里的值为2、3,现要求是 父查询的值 ANY>(子查询),则返回结果为3、4,即父查询的值只能大于子查询中其中一个值即可;
5)SOME:与ANY等同,只要用ANY的地方,就可以用SOME
4、例:
1)查询部门名称为销售1部、仓储部的人员姓名、年龄、部门id
USE MyServer
GO
SELECT E_Name,E_Age,D_Id FROM Employee WHERE D_Id
IN(SELECT D_Id FROM Department WHERE D_Name='销售1部' OR D_Name='仓储部')
GO
2)查询部门名称不为销售1部、仓储部的人员姓名、年龄、部门id
USE MyServer
GO
SELECT E_Name,E_Age,D_Id FROM Employee WHERE D_Id
NOT IN(SELECT D_Id FROM Department WHERE D_Name='销售1部' OR D_Name='仓储部')
GO
3)查询比销售2部所有人员年龄都大的员工姓名、年龄
USE MyServer
GO
SELECT E_Name,E_Age,D_Id FROM Employee WHERE E_Age >ALL
(
SELECT E_Age FROM Employee WHERE D_Id=
(SELECT D_Id FROM Department WHERE D_Name='销售2部')
)
GO
4)查询比销售2部其中一个员工的年龄大的员工姓名、年龄、部门Id
USE MyServer
GO
SELECT E_Name,E_Age,D_Id FROM Employee WHERE E_Age >ANY
(
SELECT E_Age FROM Employee WHERE D_Id=
(SELECT D_Id FROM Department WHERE D_Name='销售2部')
)
GO
5、ANY、IN、NOT IN 的使用异同点:
1)=ANY 与 IN 等效,即父查询中列的值必须在子查询返回值列表中存在;
2)<>ANY:父查询结果中,列的值与子查询返回值列表中只要有一个不相同就返回;
3、NOT IN:父查询的结果中,列的值必须不能存在子查询中。