十.子查询的使用(重点)
1.子查询:指的是查询语句,嵌套查询语句---->一般是放在where子句中,表示条件。
2.子查询的应用使用场景:
2.1查询过程中,虽然给了条件,但是条件的结果并不明确,这个时候就需要借助于查询语句,把条件的结果查出来,参与操作。
例:从sc表中查看计算机系学生的选课记录.
解析:select 选课记录* from sc where 计算机系学生(需要查询);
2.2如果聚合函数当条件,是不能直接放在where子句中,那么就可以借助于查询语句,把聚合函数的结果查询出来,参与操作。
例:从sc表中查看所修课程的成绩大于平均成绩的学生信息
解析:select * from sc where grade>(select avg(grade) from sc);
3.子查询语法格式:
格式一: in 来匹配子查询的结果值 嵌套子查询
select 列名 from 表名 where 列名 in(select 列名 from 表名 where 条件...);
注意1:条件要什么,子查询就查什么
格式二:= 来匹配子查询的结果值 相关子查询(单值子查询)
select 列名 from 表名 where 列名 =(select 列名 from 表名 where 条件...);
注意2:如果是用=匹配子查询,那么就要求子查询的结果只能有一个值;如果不确定子查询结果的个数,推荐使用in;子查询都是用小括号来包裹的。
select 列名 from 表名 where 列名 in(select 列名 from 表名 where 列名 in (select 列名 from 表名 where 条件...));
延伸一种写法:
select 列名 from 表名 where 列名 比较运算符(select 列名 from 表名 where 条件....);
-- 例:从sc表中查看计算机系学生的选课记录.
select *
from sc
where sno in(select sno from student where sdept='计算机系'); -- 要求:学生--->计算机系
-- 查询出计算机系的学生
select sno from student where sdept='计算机系'
-- 例:从sc表中查看修了VB课程的学生选课情况
select *
from sc
where cno =(select cno from course where cname='VB'); -- 学生修了VB课程
-- 查看VB课程的课程号
select cno from course where cname='VB';
-- 例.查询修了‘c02’课程且成绩高于此课程的平均成绩的学生的学号和成绩。
select sno,grade
from sc
where cno='c02' and grade>(select avg(grade) from sc where cno='c02');
-- 此课程c02的平均成绩 79.6667
select avg(grade) from sc where cno='c02';
-- 查询修了c02这门课的学生的姓名,性别,专业
select sname,ssex,sdept
from student
where sno in(select sno from sc where cno='c02');
-- 可以从sc表中根据课程号查询出对应选修学生学号
select sno from sc where cno='c02';
-- 案例:查询和'ff'在同一个班的学生的信息(学号,姓名,性别,籍贯,班级名称,年级)。
select 学号,姓名,性别,籍贯,班级名称,年级
from 学生信息 s,班级信息 c
where s.班级编号=c.班级编号 and s.班级编号=(select 班级编号 from 学生信息 where 姓名='ff');
-- 查看ff这个学生所在的班级编号
select 班级编号 from 学生信息 where 姓名='ff';
-- 查看修了数据库基础课程的学生的姓名,所在的系别
-- 分析:数据库基础cname---->cno--->sc表中查询学生sno--->在student表查询姓名,系别
select sname,sdept from student where sno in(
select sno from sc where cno in(select cno from course where cname='数据库基础'));
十一.除了select语句中可以使用子查询,在insert,update,delete语句中也可以嵌套子查询语句
1.insert语句和select语句做结合
思想:把select查询出来的数据,结合insert插入到指定的表中
格式:insert into 表名 select查询语句;
-- 创建一个表stu(学号,姓名,年龄,专业)
create table stu(
学号 varchar(10),
姓名 varchar(10),
年龄 int,
专业 varchar(10)
);
-- 向stu表中插入数据(只保存计算机系和信息系的学生记录)
insert into stu select sno,sname,sage,sdept from student where sdept in('计算机系','信息系');
select * from stu;
-- 创建一个学生表(学号,姓名,性别,课程号,成绩)
create table 学生表(
学号 varchar(10),
姓名 varchar(10),
性别 varchar(10),
课程号 varchar(10),
成绩 int
);
-- 向学生表中插入数据(修了c02,c04,且成绩大于等于60)
insert into 学生表 select student.sno,sname,ssex,cno,grade from student,sc where student.sno=sc.sno and cno in('c02','c04') and grade>=60;
select * from 学生表;
2.update语句和select语句结合
格式:update 表名 set 列名=值 where 条件;
select查询语句还是放在where子句中表示条件
-- 将计算机系学生的选课成绩添加10分
update sc
set grade=grade+10
where sno in(select sno from student where sdept='计算机系');
3.delete语句和select语句结合
格式:delete from 表名 where 条件;
select查询语句还是放在where子句中表示条件
-- 从sc表中删除计算机系学生的选课记录
delete from sc where sno in(select sno from student where sdept='计算机系');
-- 把修了VB课程学生的成绩减去10分
update sc set grade=grade-10 where cno in(select cno from course where cname='VB');
-- 删除信息系男生的选课记录
delete from sc where sno in(select sno from student where sdept='信息系' and ssex='男');
=========================================================