MySQL数据库---子查询insert,update,delete语句中嵌套子查询

十.子查询的使用(重点)

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='男');

=========================================================

 

你可能感兴趣的:(数据库,mysql,sql)