子查询

简单的子查询:
问题:查询年龄比“李斯文”小的学生,要求显示这些学生的信息?


实现方法一、
采用 变量实现。

declare @age datetime


select @age =BornDate from student where studentName='李斯文' -- 查询出“李斯文的出生日期”
select studentNo,studentName,sex,BornDate,Address from student where BornDate>@age
go


实现方法二、
采用子查询实现。

select studentNo,studentName,sex,BornDate,Address from student where 


BornDate>(select BornDate from student where studentName='李斯文')

go


子查询的语法:
select * from 表名 where 列名 > (子查询)


其中子查询语句必须放置在一对圆括号内:在列名后面除了“>”运算符外,还可以使用其他运算符。

先执行子查询部分,求出子查询部分的值,再执行整个父查询,返回最后的结果。


还可以和update , insert , delete 一起使用,语法类似于 select 语句。


*** 注意:将子查询和比较运算符联合使用,必须保证子查询返回的值不能多于一个

经验:
select 语句中使用 select * from student 语句的执行效率会低于 select studentNo,studentName,sex,BornDate,Address
from student ,因为前一个查询获得表中所有列值所占用的资源将大于后一个查询获得的指定列值所占资源,另外,后一个
查询语句的可维护性高于前一个查询。
因此,在编写查询语句时,建议大家采用以下格式:
select 列表 from 表名 where 条件表达式

子查询可以在多表间查询符合条件的数据,从而替代表连接(join)查询。

in 和 not in 子查询


in 子查询:
使用 = ,> 等比较运算符时,要求子查询只能返回一条或空的记录,
在Sql Server 中,当子查询跟随在 =,!=,<,<=,>,>=之后时,不允许子查询返回多条记录。

ont in 子查询:就是在in的前面加上not

exists 和not exists 子查询


exists 子查询:
语法:
if exists(子查询)
语句


如果子查询的结果非空,则exists(子查询)将返回真(true),否则返回假(false)

not exists 子查询:
exists 和in 一样,同样允许添加 not 关键定实现取反操作,not exists 表示不存在。

*** 子查询注意事项:


1.子查询语句可以嵌套在Sql语句中任何表达式出现的位置,
在select 语句中,子查询可以被嵌套在select语句的 列、表 和 查询条件中,
即 select 子句、from子句、where子句、group by 子句和having子句。


嵌套在 select 语句的select 子句中的子查询语句如下:
语法:
select (子查询) from 表名

嵌套在 select 语句的 from 子句中的子查询语句如下:
语法:
select * from (子查询) as 表的别名         --*** 注意:必须为表指定别名

2.在子查询的 select 子句中不能出现 text、ntext或image数据类型列,目前大部分数据库管理系统的编译器不支持在子查询语句中查询二进制类型的数据。

3.只出现子查询中而没有出现在父查询中的表不能包含在输出列中,


总结:
合并多个表中的数据有以下3种方法:


1.联合:合并多个数据集中的行(unoin)
select 表名1中的列 from 表名1
union
select 表名2中的列 from 表名2 ——>不显示重复的数据


如果想要重复的数据也显示的话使用 union all
select 表名1中的列 from 表名1
union all
select 表名2中的列 from 表名2 ——>重复的数据也会显示

2.子查询:将一个查询嵌套在另一个查询中

3.连接:合并多个数据表中的列(join)
select * from Student inner join Result on Student.StudentNO= Result.StudentNO


比较运算符后面的子查询只能返回单个数值


in 子查询后面可跟随返回多条记录的子查询,用于检测某列的值是否存在于某个范围中


通过在子查询中使用exists子句,可以对子查询中的行是否存在进行检查,子查询可以出现在表达式出现的任何位置



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值