SQL数据库嵌套查询
嵌套查询
保存查询结果
从查询结果创建⼀个永久表:
select 字段列表 into 新表名
from 原表名
where 查询条件
嵌套查询
⼀个 select……from……where语句称为⼀个查询块。
将⼀个查询块嵌套在另⼀个查询块的where⼦句或having短语的条件中的查询称为嵌套查询。
其中外层查询叫⽗查询或主查询,内层的查询叫⼦查询或从查询。
insert,delete,update,select命令中允许表达式的地⽅都可以包含⼦查询。⼦查询甚⾄可以包含在另⼀个⼦查询中
嵌套查询语法规则
⼦查询的SELECT总是⽤圆括号括起来
不能包含compute或for browse⼦句
任何可以使⽤表达式的地⽅都可以使⽤⼦查询,只要它返回的是单个值
如同时指定top⼦句,则可能只包括order by⼦句
⼦查询最多可嵌套32层,个别查询可能不会⽀持32层
如果某个表只出现在⼦查询⽽没有出现在外部查询中,那么该表的列就⽆法包含在输出中
⼏种语法格式⽰例
Where 查询表达式⽐较运算符 [any|all|some](⼦查询)
where 查询表达式 [not] in (⼦查询)
Where [not]exists(⼦查询)
使⽤简单⽐较符的嵌套查询
exists子查询使⽤简单⽐较嵌套查询的⽐较符有:=、!=(<>)、>、>=、<、<=。把⼀个表达式的值与⼦查询的值进⾏⽐较,返回⽐较结果为TRUE的记录select <⽬标列>
from  表
Where  表达式(列名)⽐较符 (select 列 from 表 [where…])
带[any|all|some]的⽐较嵌套查询
1、T—SQL⽀持3种定量谓词:some,any,all。它们都是判断是否任何或全部返回值都满⾜搜索要求的。其中some,any只注重是否有返回值满⾜搜索要求,它们含义相同可替换使⽤。
select <⽬标列>
from  表
Where  表达式(列名)⽐较符 all | some | any (select 列 from 表 [where…])
使⽤⽐较符的嵌套查询
Some和any:表⽰表达式只要与⼦查询结果集中的某个值满⾜⽐较的关系时,就返回true,否则返回false.
All:指定表达式要与⼦查询结果集中的每个值都进⾏⽐较,当表达式与每个值都满⾜⽐较的关系时,才返回true,否则返回false;
【例】查⽐所有计算机系的学⽣年龄都⼤的学⽣。
select * from student
where  出⽣时间 <all (select 出⽣时间 from  student
where 专业名 = '计算机')
使⽤IN操作符的嵌套查询
⼦查询只能返回⼀个或⼀列值,当返回⼀列值时适合⽤in操作符,表⽰表达式的值是⼦查询产⽣的⼀系值中的⼀个就返回TRUE
select <⽬标列>
from  表
where  列名 in (select 列 from 表 [where…])
使⽤EXISTS操作符的嵌套查询
EXISTS谓词只注重⼦查询是否返回⾏,如果⼦查询返回,谓词返回为真,否则为假。 EXISTS并不真正使⽤⼦查询的结果,它仅仅测试⼦查询是否产⽣任何结果。
EXISTS谓词⼦查询的SELECT⼦句中可包含任何列名,甚⾄多列,因为它只在乎是否有返回⾏。
select <⽬标列>
from  表
where exists (select 列 from 表 [where…])