SQL子查询

子查询

出现在其他语句中的select语句,称为子查询或内查询
外部的查询语句,称为主查询或外查询

子查询的类型
查询语句中的任何条件,值,范围,都可以使用子查询表示。

  1. 子查询结果为多行多列(当作虚拟表来使用)
	-- 查询成绩比该课程平均成绩低的同学的成绩表
    select s.sno,s.degree,aa.cno,aa.a from scores s 
    inner join (select cno,avg(degree) a from scores group by cno) aa on s.cno = aa.cno
    where s.degree < aa.a;
  1. 子查询结果为多行一列(可以当作多个值来用(1,2,3,4))
	-- 查询存在有85分以上成绩的课程名字
	SELECT cs.cno,cs.cname from courses cs 
	where cs.cno in (SELECT DISTINCT cno from scores where degree > 85);

子查询结果为一个值。(可以作为字段使用)

	-- 查询成绩表中分数最高的同学的记录
	SELECT * from scores where degree = (SELECT max(degree) from scores);

比较运算符中使用子查询

如果子查询的返回值不止一个,而是一个集合时,则不能直接使用比较运算符,可以在比较运算符和子查询之间插入any、some或all。其中等值关系可以用IN操作符。
all子查询
all可以与=、>、>=、<、<=、<>结合是来使⽤,分别表示等于、⼤于、⼤于等于、 ⼩于、⼩于等于、不等于其中的所有数据。当所有数据都满足才是true,会返回满足所有条件的数据。

	-- 查询选修编号为3-105且成绩高于所有选修编号为3-245的课程同学的cno,sno,degree
	SELECT * from scores WHERE cno='3-105' and degree > all(
			SELECT degree from scores where cno='3-245'
	);

any/some子查询

any 可以与=、>、>=、<、<=、<>结合起来使⽤,分别表示等于、⼤于、⼤于等于、⼩于、⼩于等于、不等于其中的任何⼀个数据。也就是说只要有任意一个满足就是true。并且显示满足条件的数据。

	-- 查询选修编号为“3-105”且成绩至少高于任意一位选修编号为“3-245”的同学的信息
	select * from scores where cno='3-245' and degree > any(
		select degree from scores where cno='3-245'
	);

exists子查询

where exist (⼦查询)如果该⼦查询有结果数据(⽆论什么数据,只要⼤于等于1⾏),则就为true,否则就为false

	-- 如果存在年龄大于40的学生,那么就展示全部的学生
	SELECT * from student WHERE EXISTS (SELECT * from class where classid=4);

not 关键字

表示“非”、不等于

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值