【MySQL联合查询】子查询详解

本文详细解读了SQL子查询的五种常见类型,包括带比较运算符的查询、IN和NOT IN操作、EXISTS和ANY关键字的应用,以及ALL关键字的使用场景。通过实例演示,揭示了子查询在查询优化中的关键作用。

目录

    🍀什么是子查询

      🍀1.带比较运算符的子查询

      🍀2.带关键字IN的子查询

      🍀3.关键字EXISTS的子查询

      🍀4.带关键字ANY的子查询

      🍀5.带关键字ALL的子查询


什么是子查询

     所谓子查询,是指在一个查询中嵌套了其他的若干查询,即在一个SELECT查询语句的WHERE或FROM子句中包含另一个SELECT查询语句。在查询语句中,外层SELECT查询语句称为主查询,WHERE子句中的SELECT查询语句被称为子查询,也被称为嵌套查询。

     通过子查询可以实现多表查询,该查询语句中可能包含IN、ANY、ALL和EXISTS等关键字,除此之外还可能包含比较运算符。理论上,子查询可以出现在查询语句的任意位置,但是在实际开发中子查询经常出现在WHERE和FROM子句中。


1.带比较运算符的子查询

     子查询可以使用比较运算符。这些比较运算符包括=、!=、>、>=、<、<=和<>等。其中,<>与!=是等价的。比较运算符在子查询中使用得非常广泛,如查询分数、年龄、价格和收入等。

     例如查询学生表中与小孙同班级的学生:

    SQL语句示例 和 查询结果:

select * from student 
    where class_id=(select class_id from student where name='小孙');

注意:使用比较运算符时,select 子句获得的记录数不能大于1条(子查询结果只能是1条或0条)!!!

如果子查询结果多于一条时,例如子条件改为class_id>0:


2.带关键字IN的子查询

    一个查询语句的条件可能落在另一个SELECT语句的查询结果中,这时可以使用IN关键字,SQL示例如下:

    NOT IN的用法与IN相同。

例如查询与小红和小孙同一班级的学生信息

select * from student 
where class_id in (select class_id from student where name='小红' or name='小宋');

    查询结果


3.关键字EXISTS的子查询

    关键字EXISTS表示存在,后面的参数是一个任意的子查询,系统对子查询进行运算以判断它是否返回行;如果至少返回一行,那么EXISTS的结果为true,此时外层语句将进行查询;如果子查询没有返回任何行,那么EXISTS返回的结果是false,此时外层语句将不进行查询。

    例如子查询查找class_id为1005和1001的学生信息:

select * from student 
    where exists(select * from student where class_id=1005);
select * from student 
    where exists(select * from student where class_id=1001);

    查询结果


4.带关键字ANY的子查询

    关键字ANY表示满足其中任一条件。使用关键ANY时,只要满足内层查询语句返回的结果中的任何一个就可以通过该条件来执行外层查询语句。例如,需要查询哪些学生可以获取奖学金,那么首先要有一张奖学金表,从表中查询出各种奖学金要求的最低分,只要一个同学的成绩大于等于不同奖学金最低分的任何一个,这个同学就可以获得奖学金。关键字ANY通常和比较运算符一起使用。例如,“>ANY”表示大于任何一个值,“=ANY”表示等于任何一个值。 

    例如查询学生成绩表中能拿奖学金的学生:

    SQL语句示例和查询结果:

select name 姓名,math+chinese+english 总分 from score 
    where (math+chinese+english)>=any(select score from scholarship);


5.带关键字ALL的子查询

    关键字ALL表示满足所有条件。使用关键字ALL时,只有满足内层查询语句返回的所有结果才可以执行外层查询语句。例如,需要查询哪些同学能够获得一等奖学金,首先要从奖学金表中查询出各种奖学金要求的最低分。因为一等奖学金要求的分数最高,只有当成绩高于所有奖学金最低分时,这个同学才可能获得一等奖学金。关键字ALL也经常与比较运算符一起使用。例如,“>ALL”表示大于所有值,“<ALL”表示小于所有值。 

     例如,查询score表中可以拿一等奖学金的学生:

select name 姓名 ,math+chinese+english 总分 from score 
    where (math+chinese+english)>=all(select score from scholarship)

    查询没有拿到奖学金的学生

select name 姓名 ,math+chinese+english 总分 from score 
    where (math+chinese+english)<all(select score from scholarship);

🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值