数据库原理-数据查询 嵌套查询【一】

104 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第31天,点击查看活动详情

数据库原理-数据查询 嵌套查询【一】

嵌套查询概述

  • 一个SELECT-FROM-WHERE语句称为一个查询块
  • 将一个查询块嵌套这另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询
	SELECT Sname
	FROM Student
	WHERE Sno IN (SELECT Sno
				  FROM SC
				  WHERE Cno='2');
  • 上层的查询块称为外层查询或父查询
  • 下层的查询块称为内层查询或子查询
  • SQL语言允许多层嵌套查询
  • 子查询的限制
    • 不能使用ORDER BY 子句

不相关子查询

子查询的查询条件不依赖于父查询

  • 由里向外逐层处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件

相关子查询:子查询的查询条件依赖于父查询

  • 首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表
  • 然后再取外层表的下一个元组
  • 重复这一过程,直至外层表全部检查完为止

带有IN谓词的子查询

查询与“刘晨”在同一个系学习的学生

此查询要求可以分步骤来完成

1 确定“刘晨”所在系名

	SELECT Sdept
	FROM Student
	WHERE Sname="刘晨"

结果为:CS

2 查找所有在CS系学习的学生

	SELECT Sno,Sname,Sdept
	FROM Student
	WHERE Sdept='CS';

image-20220501193449579

合并

	SELECT Sno,Sname,Sdept
	FROM Student
	WHERE Sdept IN
		  (SELECT Sdept
		  FROM Student
		  WHERE Sname='刘晨')

用自身连接完成查询要求

	SELECT S1.Sno,S1.Sname,S1.Sdept
	FROM Student S1,Student S2
	WHERE S1.Sdept = S2.Sdept AND
		  S2.Sname = '刘晨';

查询选修了课程名为“信息系统”的学生学号和姓名

	SELECT Sno,Sname
	FROM Student
	WHERE Sno IN
		  (SELECT Sno
		   FROM SC
		   WHERE Con IN
		   	 (SELECT Cno
		   	  FROM Course
		   	  WHERE Cname='信息系统'
		  	 )
		  );

1 首先在Course关系中找出“信息系统”的课程号,为3号

2 然后这SC关系中找出选修了3号课程的学生学号

3 最后在Student关系中取出Sno和Sname

用连接查询实现

	SELECT Sno,Sname
	FROM Student,SC,Course
	WHERE Student.Sno = SC.Sno AND
		  SC.Cno = Course.Cno AND
		  Course.Cname='信息系统';

带有比较运算符的子查询

当前确切知道内层查询返回单值时,可用比较运算符(>,<,=,>=,<=,!=或<>)

	SELECT Sdept
	FROM Student
	WHERE Sname="刘晨";

找出每个学生超过他选修课程平均成绩的课程号

	SELECT Sno,Cno
	FROM SC X
	WHERE Grade >= (SELECT AVG (Grade))
					FROM SC y
					WHERE y.Sno = x.Sno);

可能的执行过程

  • 从外层查询中取出SC的一个元组x,将元组x的Sno值(201215121)传送给内层查询

    	SELECT AVG(Grade)
    	FROM SC y
    	WHERE y.Sno = '201215121';
    
  • 执行内层查询,得到值88(近似值),用该值代替内层查询,得到外层查询:

    	SELECT Sno,Cno
    	FROM SC x
    	WHERE Grade >= 88;
    
  • 执行该查询,得到结果:

  • 然后外层查询取下一个元组重复上述步骤,直到外层的SC元组全部处理完毕

    image-20220501200531856