我是靠谱客的博主 怕孤独香菇,最近开发中收集的这篇文章主要介绍【数据库和SQL学习笔记】6.SELECT查询4:嵌套查询、对查询结果进行操作,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

数据库系统软件:SQL Server 2019 Express
操作系统:Windows 10

文章目录

    • 嵌套查询
      • IN 与 NOT IN
      • EXISTS 与 NOT EXISTS
      • 比较运算符
      • SOME
      • ALL
      • 多层嵌套
    • 对查询结果进行操作
      • 使用INTO语句将查询结果存入新表
      • 查询结果的并、交、差

本节接着学select查询。
用到的数据库备份: teaching.bak

表结构回顾:

t_student (S#, Sname, Sex, Age, Major)
t_teacher (T#, Tname, Age, Title)
t_course (C#, Cname, T#)
t_student_course (S#, C#, Score)

嵌套查询

在一个select语句的from、where、having子句中,均可以嵌套另一组select语句,称为嵌套查询。

select查询的结果本质上也是一张表,所以要使用select查询结果,需要使用关键词。
常用关键词:

  • IN(NOT IN)
  • EXISTS(NOT EXISTS)
  • 比较运算符
  • 比较运算符+SOME(ALL)

下面直接用例子讲解。

IN 与 NOT IN

例1:查询选修了c001课程的学生的学号与姓名。
①多表查询解决方案:

select t_student.S#, Sname
from t_student, t_student_course
where t_student.S# = t_student_course.S# and C#='c001'

嵌套查询解决方案:
思路:学生的学号和姓名在表 t_student,课程号信息在表 t_student_course,两者用外键 S# 联系。
我们分两步,先把选修了c001课程学生的学号找出来(得到集合);
再在这个学号范围内select出学生的学号和姓名(使用 IN + 集合)。
于是:

select S#, Sname
from t_student
where S# in (select S# 
			 from t_student_course
			 where C# = 'c001')

在这里插入图片描述
在本方法中,嵌套的查询(即子查询)与外层的查询是相互独立的,称为不相关子查询
不相关子查询只需要执行一次。
``
嵌套查询解决方案2:

select S#, Sname
from t_student
where 'c001' in (select C#
				 from t_student_course
				 where S# = t_student.S#)

在这里,查询的过程中,每查询出一个条目,都会就“c001”是否在另一个集合中进行判断。
而这另一个集合,每次都要在另一张表(t_student_course)中就S#为等值条件进行查询得出。
所以,在该方法中,外层查询的每一条记录都需要代入内层的查询中作为查询条件。外层有多少条记录,内层就要查询多少次,内外层的查询是有相关性的,称为相关子查询

例2:查询未选修c001课程的学生的学号与姓名。
加NOT
①不相关子查询:

select S#, Sname
from t_student
where S# not in (select S# 
			 from t_student_course
			 where C# = 'c001')

②相关子查询:

select S#, Sname
from t_student
where 'c001' not in (select C#
				 from t_student_course
				 where S# = t_student.S#)

EXISTS 与 NOT EXISTS

EXISTS 与 NOT EXISTS 意为是否存在这样的查询结果。
我们可以推断,在判断是否存在时,外层查询的每一条记录都需要代入内层的查询中作为查询条件,存在就输出到结果,因此也是一种相关子查询
还是用同样的例子讲解:

例:查询选修了c001课程的学生的学号与姓名。

select S#, Sname
from t_student
where exists (select *
			  from t_student_course
			  where t_student_course.S# = t_student.S# and C# = 'c001')

在这里插入图片描述

比较运算符

使用比较运算符时,子查询的返回值一定要单个,不能是一个集合。

例:查询年龄比李华大的学生的信息。

select *
from t_student
where Age>(select Age
		   from t_student
		   where Sname='李华')

SOME

使用“some+集合”代表一个集合对象,用等号“=”连接。
和之前的 IN+集合 等效。
还是用之前的例子讲解:

例:查询选修了c001课程的学生的学号与姓名。

select *
from t_student
where S# = some(select S#
				from t_student_course
				where C#='c001')

ALL

用“all+集合”代表一个集合整体,用不等号“!=”连接。
和之前的 NOT IN+集合 等效。

例:查询未选修c001课程的学生的学号与姓名。

select *
from t_student
where S# != all(select S#
				from t_student_course
				where C#='c001')

多层嵌套

一个三层查询的例子:

例:查询考试平均分低于总平均分的学生的学号和姓名。
思路:最外层查询要查 t_student 这张表,我们需要取到符合条件的学生的学号S#集合。
符合条件的学号S#在 t_student_course 这张表中找。我们通过group by求平均,再用having限制上条件就能得到子查询。

select *
from t_student
where S# in (select S#
			 from t_student_course
			 group by S#
		   	 having avg(score) < (select avg(score)
								  from t_student_course))

在这里插入图片描述

对查询结果进行操作

对查询结果进行操作包括:

  • 储存查询结果
  • 查询结果的并、交、差

使用INTO语句将查询结果存入新表

在select语句后接上into语句,可将查询结果存储在一张新表上。
语法:

SELECT ...
INTO 新表名
FROM ...
WHERE ...

例:查询学生选课信息,包括学号、姓名、课程名和成绩,将查询结果存放于表SCORE_LIST中。

select t_student.S#, Sname, t_course.Cname, Score
into SCORE_LIST
from t_student, t_student_course, t_course
where t_student.S# = t_student_course.S# and t_student_course.C# = t_course.C#

在这里插入图片描述
完成后刷新一下数据库就能看到这张新表了。

查询结果的并、交、差

当多个查询结果集的列数、列顺序以及数据类型相同时,可以对它们进行并、交、差操作。

并、交、差语法:

SELECT语句1
UNION / INTERSECT / EXCEPT
SELECT语句2

其本质是集合的基本运算。

例:查询c001和c002两门课程均未考到90分的学生的学号。

select S#
from t_student_course
where C#='c001' and Score<90
intersect
select S#
from t_student_course
where C#='c002' and Score<90

在这里插入图片描述

最后

以上就是怕孤独香菇为你收集整理的【数据库和SQL学习笔记】6.SELECT查询4:嵌套查询、对查询结果进行操作的全部内容,希望文章能够帮你解决【数据库和SQL学习笔记】6.SELECT查询4:嵌套查询、对查询结果进行操作所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部