MySQL子查询及量词、谓词

理解子查询

子查询也称为嵌套查询 ,是嵌套在外层查询WHERE子句中的查询。子查询为主查询返回其所需数据,或者对外查询的查询结果作进一步的限制。

使用关系运算符和IN的子查询
内层查询返回列的值,外层查询意义相同的列和子查询的返回值做比较。使用关系运算符时,返回值至多一个,使用IN时,返回值可以有多个。

实例一:
查询和潘多拉老师在同一个学院的教师信息

1.首先先查询潘多拉老师的学院号

SELECT department_id FROM teacher WHERE teacher_name=‘潘多拉’

在这里插入图片描述
2.知道潘多拉老师的学院号之后再去查询和潘多拉老师在同一个学院的教师信息

SELECT * FROM teacher
WHERE department_id=
(SELECT department_id FROM teacher WHERE teacher_name=‘潘多拉’);

在这里插入图片描述
实例2:使用关系运算符和in的子查询,
查询所有课程成绩都在85分以上的学生

所有成绩都在85分以上就是没有一科成绩在85分以下
1.先找出有成绩在85分以下的同学的学号

在这里插入图片描述
2.使用NOT IN,即可输出没有成绩在85分以下的同学

SELECT DISTINCT student_id,student_name
FROM student WHERE student_id not in(
SELECT DISTINCT student_id from choose WHERE score<85);

在这里插入图片描述
子查询重点:一是内查询和外查询必须使用意义相同的列来构造条件。二是如果子查询只有一个返回值,外查询可以使用关系运算符或IN来构造条件;如果返回值有多个,则只能使用IN来构造条件。

使用量词、谓词的子查询

带ANY、SOME、ALL的子查询
ANY和SOME同义,在进行比较运算时只要子查询的查询结果有一行能使结果为True,则结果就为True;而ALL则要求子查询中的所有行都使结果为True时,结果才为True。
使用量词SOME、ANY和ALL来构造查询条件时, 前面必须加上关系运算符.如大于、小于等,这是特别需要注意的地方!

实例1:查询有成绩大于龚娜同学的所有成绩的同学信息
(1).查询龚娜的所有成绩
在这里插入图片描述

(2).查询复合条件的学生成绩

SELECT DISTINCT student.student_id, student_name
FROM student INNER join choose on student.student_id=choose.student_id
WHERE choose.score>=ALL
(SELECT score
FROM choose WHERE student_id=‘201710201102’);

上段代码用到了ALL,因为龚娜的成绩不是一个,而复合条件的学生需要有成绩大于龚娜的所有成绩,所有使用ALL.
这段代码等同于

SELECT DISTINCT student.student_id, student_name
FROM student INNER join choose on student.student_id=choose.student_id
WHERE choose.score>=
(SELECT max(score)
FROM choose WHERE student_id=‘201710201102’);

先使用max()来找到她的最大成绩,在进行筛选。
在这里插入图片描述

带EXISTS关键字的子查询

EXISTS用来检查子查询是否有查询结果返回,只要返回一行,EXISTS的结果即为True,外查询语句将进行查询;反之结果为False,此时外层语句将不进行查询。
EXISTS只检查子查询有没有查询结果返回,但并不与返回值做比较,所以前面不需要添加关系运算符!与之相反的条件为NOTEXISTS!
实例1:查询那个学院还没有老师
(1):先找到教师表中存在的学院编号

在这里插入图片描述
(2):找到学院编号在教师学院编号不存在的学院信息

SELECT department_id,department_name
FROM department
WHERE department_id not in
(SELECT DISTINCT department_id FROM teacher);

使用 NOT IN 找到符合条件的信息
也可以使用EXISTS,代码如下

SELECT department_id,department_name
FROM department
WHERE not EXISTS
(SELECT DISTINCT department_id FROM teacher WHERE teacher.department_id=department.department_id);

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值