MySql基础(子查询)

概念
子查询就是在原有的查询语句中,
嵌入新的查询,来得到我们想要的结果集。
也叫嵌套查询。
格式:

SELECT	select_list FROM	table WHERE	 expr operator (SELECT	select_list   FROM	 table);

子查询 (内查询) 在主查询之前一次执行完成。 子查询的结果被主查询(外查询)使用 。
子查询分为:比较子查询,IN/NOT
IN子查询,EXISTS/NOT EXISTS子查询

比较查询类型
单行子查询:返回一行数据
在这里插入图片描述

SELECT * from student WHERE birthday>(SELECT birthday FROM student WHERE name = 'Tom');

多行子查询:返回多行数据
在这里插入图片描述

输出选修3-105课程,其成绩高于109号同学在此课程所得成绩的所有同学的学号,姓名
SELECT student.no,name FROM student INNER JOIN score ON student.no=score.no 
WHERE score.cno='3-105' AND  degree > ALL
(SELECT degree FROM student,score WHERE score.no='109' ) ;

带有IN运算符的子查询

SELECT * FROM student WHERE stuid IN (
	SELECT stuid FROM score);
 例:SELECT * FROM student  WHERE stuid NOT IN (
	SELECT stuid FROM score  WHERE student.stuid = score.stuid );

IN/NOT IN区别:
IN/NOT IN先执行子查询,子查询返回的是一个
集合,然后再将子查询的结果作为外层查询的条
件进行过滤。

EXISTS型子查询

exists即:外层sql查询所查到的行代入内层sql查询,要使内层查询能够成立 查询可以与in型子查询互换,但效率要高
select * from 表名 where exists
(select * from 表名 where …);

查询参加了考试的所有学生的信息
SELECT * FROM student WHERE EXISTS(
	SELECT stuid FROM score
	WHERE student.stuid = score.stuid
);
    查询未参加了考试的所有学生的信息
SELECT * FROM student  WHERE NOT EXISTS(
	SELECT stuid FROM score
	WHERE student.stuid = score.stuid
);

EXISTS/NOT EXISTS区别 :
EXISTS/NOT EXISTS先执行外层查询,再将外层
查询的每一条记录作为条件进行子查询,子查询 返回的只是返回一个TRUE或FALSE,因此一般情况 下子查询中直接使用SELECT
1提高效率。

猜你喜欢

转载自blog.csdn.net/qq_43529877/article/details/84072847
今日推荐