SQL课堂笔记--嵌套查询

2017.11.15
六:嵌套查询
 嵌套查询概述:
  一个select-from-where 语句称为一个查询块
  将一个查询块嵌套在另一个查询块的where子句或having短语的条件中的查询称为嵌套查询
 
 
 例1:查询选修了2号课程得学生姓名:
  内连接:select sname from student,sc where student.sno=sc.sno and cno=2
        或:select sname from student where sno in   --外层查询/父查询
     (select sno from sc where cno=2)   --内层查询/子查询
  
 引出子查询得谓词:
   带有in谓词的子查询  
   带有比较运算符的子查询
   带有any或all谓词的子查询
   带有exists谓词的子查询
 1.带有in谓词的子查询

例2:查询与‘刘晨‘在同一个专业学习的学生:(涉及2张表)
   select sno,sname,sdept from student where sdept in (select sdept from student where sname=‘刘晨‘)

查询与‘刘晨‘在同一个专业学习的学生但是不包括‘刘晨‘:
   select sno,sname,sdept from student where sdept in (select sdept from student where sname=‘刘晨‘) and sname<>‘刘晨‘
 
  例3:查询选修了课程名为‘信息系统‘的学生学号和姓名:(涉及3张表)
   select sno,sname from student where sno in  --3.最后在student关系中取出sno和sname
    ( select sno from sc where cno in  --2.然后在sc中找出选修了课程的学号和姓名
     (select cno from course where cname=‘信息系统‘));  --1.首先在course关系中找出‘信息系统‘的课程号
   select sno,sname from student,sc,course where student.sno=sc.sno....

2.带有比较运算符的子查询

例4:查询与‘刘晨‘在同一个专业学习的学生: 
   select sno,sname,sdept from student where sdept = (select sdept from student where sname=‘刘晨‘)

3.带有any或all谓词的子查询:
  
  >any  >min
  >all
  <any          <max
  <all
  >=any  >=min
  >=all
  <=any         <=max
  <=all
  =any
  =all
  !=(<>)any      不存在
  !=(<>)all not in
  
  例5:查询其他专业中比计算机任意一个(其中某一个)学生年龄小的学生姓名和年龄
   select sname,sage from student where sage<any(select sage from student where sdept=‘计算机‘) and sdept<>‘计算机‘;

例6:查询其他专业中比计算机任意一个(其中某一个)学生年龄小的学生姓名和年龄(用聚合函数):
   select sname,sage from student where sage<(select (max)sage from student where sdept=‘计算机‘) and sdept<>‘计算机‘;

例7:查询...

4.带有exists谓词的子查询:
  1.exists谓词:
   不返回任何数据,只产生逻辑真值‘true‘或逻辑假值‘false‘
    若内层查询结果非空,则返回真值
    若内层查询结果为空,则返回假值 
   由exists引出的子查询,其目标列表达式通常都用*,因为带exists的子查询只返回真或假值,给出列名五实际意义

2.not exists谓词:
   不返回结果集为真

例8:查询所有选修了1号课程的学生姓名:
   select sname from studnet where sno in (select sno from sc where cno=1)
   select sname from studnet where exists(select * from sc where sc.sno=student.sno and cno=‘1‘ )

例9:查询没有选修1号课程的学生姓名:
   select sname from studnet where not exists(select * from sc where sc.sno=student.sno and cno=‘1‘)

查询与‘刘晨‘在同一个专业学习的学生:
   select sno,sname,sdept from studnet s1 where exists (select * from student s2 where s2.sdept=s1.sdept and sname=‘刘晨‘)

查询选修了全部课程的学生姓名:
    法1:select sname from student where not exists
     (select * from course where not exists
       (select * from sc where sc.sno=studnet.sno and sc.sno=course.cno))
   
    法2:select sname from student where sno in
     (select sno from sc group by sno having count(*)=(select count(*) from course))

练习:

use students
go
--1、用嵌套查询所有比“王敏”大的学生的姓名和年龄。
select sname,sage from student where sage >all (select sage from student where sname=‘王敏‘)
 
--2、用嵌套查询选修了3号课程的学生姓名。
select sname from student where sno in (select sno from sc where cno=3)

--3、用嵌套查询选修了课程名为“数学”的学生学号和姓名。
select sno,sname from student where sno in (select sno from sc where sdept=‘数学‘)

--4、查询其他系中比电子系任意一个学生年龄小的学生姓名和年龄。
select  sname,sage from student where sage<any (select sage from student where sdept=‘电子‘) and sdept<>‘电子‘

--5、查询其他系中比电子系所有学生年龄都小的学生姓名及年龄。
-select sname,sage from student where sage <all(select sage from student where sdept=‘电子‘) and sdept<>‘电子‘;
select sname,sage from student where sage <(select MIN(sage) from student where sdept=‘电子‘) and sdept<>‘电子‘;

--6、用EXISTS嵌套查询所有选修了1号课程的学生姓名。
select sname from student where exists(select * from sc where sc.sno=student.sno and cno=1)
 
--7、查询至少选修了一门课程的学生姓名。
--select sname from student where not exists(select * from sc where sc.sno=student.sno and sdept=null)
select sname from student where sno in (select sno from sc)

--8、查询选修了两门及以上课程的学生姓名。
select sname from student where sno in (select sno from sc group by sc.sno having count(*)>=2 )
--Select sname from student a join sc b on a.sno=b.sno where having count(b.sno)>=2

--9、查询没有选修任何课程的学生姓名。
select sname from student where not exists(select * from sc where student.sno=sc.sno)
--或select sname from student where not in (select sno from sc )

--10、查询至少被选修了二次的课程号及课程名称。
select cno,cname from course where cno in (select cno from sc group by cno having count(*)>=2 )

--11、查询选修了全部课程的学生姓名。
select sname from student where not exists
     (select * from course where not exists
       (select * from sc where sc.sno=student.sno and sc.sno=course.cno))

--12、查询所有学生都选修了的课程信息。
select cno,cname from course where not exists
     (select * from student where not exists
      (select * from sc where sc.sno=student.sno and sc.cno=course.cno))

时间: 2024-10-13 22:25:25

SQL课堂笔记--嵌套查询的相关文章

SQL课堂笔记

--注释 公司里一般而是用绝不重复的guid()做主键(web项目不常用) 如null参与运算,结果都是null 在数据库中创建索引能提高查询效率,)只在经常要检索的字段创建索引) sql查询null的数据 selsct * from table where name is null 查询年龄介于20到30的数据 selsct * from table where age between 20 and 30 查询年龄是20,22,32,46的数据 selsct * from table wher

超实用的SQL语句之嵌套查询

嵌套查询 什么是嵌套查询 . 嵌套查询的意思是,一个查询语句(select-from-where)查询语句块可以嵌套在另外一个查询块的where子句中,称为嵌套查询.其中外层查询也称为父查询,主查询.内层查询也称子查询,从查询. 嵌套查询的工作方式 先处理内查询,由内向外处理,外层查询利用内层查询的结果嵌套查询不仅仅可以用于父查询select语句使用.还可以用于insert.update.delete语句或其他子查询中. 子查询的组成 1.包含标准选择列表组件的标准select查询. 2.包含一

mysql SQL优化之嵌套查询-遁地龙卷风

(-1) 写在前面 这篇随笔的数据使用的是http://blog.csdn.net/friendan/article/details/8072668#comments里的,里面有一些常见的select查询练习题. 我使用的是mysql自带的命令行 (1)数据准配 student 表 +---------+-----------+------+------+--------------+ | sno     | Sname     | Ssex | Sage | Sdept        | +-

SQL课堂笔记--存储过程和触发器

---恢复内容开始--- 2017.11.21                  存储过程和触发器   1.存储过程的作用 当SQL server 创建应用程序时,可以用两种方法存储和执行程序: 1).将程序存储在本地,然后创建SQL server 发送命令并处理结果的应用程序  2).将程序以存储过程的形式存储在SQL Server服务器中,然后创建执行存储过程并处理结果的应用程序.SQL server推荐使用这种  2.存储过程(Store Procedure)是一组为了完成特定功能的T-S

SQL课堂笔记--多表查询

2017.11.14 二:最基础的连接查询----多表查询 1.使用内部连接  内部连接也叫自然连接,最常见的连接形式   语法:     select 选择列表 from 表名1 ,表名2 where 表名1.列名1=表名2.列名2         或select 选择列表 from 表名1 join 表名2 on 表名1.列名1=表名2.列名2 例1:查询每个学生及其选修课程情况:  select student.*,sc.* from student,sc where student.sn

SQL课堂笔记--查询表1

2017/11.10 SQL的主要功能: 1.数据定义 2.数据查询 3.数据操作 4.数据控制功能(了解)  SQL语言的动词: 数据定义:create,drop, alter 数据查询:select 数据操作:insert,update,deledte 数据控制:crant,revoke 数据查询语句的基本格式:  select[distinct] 目标列      //distinct去掉记录中的重复值  from 基本表(或视图)  [where 条件表达式]  [group by 列名

SQL课堂笔记--聚合函数

2017.11.13 聚合函数: COUNT(*)统计表中元组个数 COUNT(属性名)统计一列中列值的个数 //不统计空值 SUM计算一列值的总和(此列必须是数值行) AVG计算一列的平均值(此列必须是数值行) MAX求一列值中的最大值 MIN求一列值中的最小值    元组:每一条数据  例1.求计算机专业学生的平均年龄:  select avg(sage) as 平均年龄 from student where sdept='计算机'  例2.统计学校共开设课多少们课程:  select co

SQL课堂笔记--管理表

2017.11.09 1.使用T-SQL语句显示表的信息,调用系统的存储过程 sp_help (student)表名2.修改表的结构 增加列:  alter table 表名  add 列名 列的描述 删除列:  alter table 列名  drop column 列名 重命名表名:  use 数据库名  go  sp_rename 'old_table name','new_table name',('object')可写可不写 注释:  单行注释 --  多行注释/*     */ 3.

SQL语句 - 嵌套查询

嵌套查询的意思是,一个查询语句(select-from-where)查询语句块可以嵌套在另外一个查询块的where子句中,称为嵌套查询.其中外层查询也称为父查询,主查询.内层查询也称子查询,从查询. 嵌套查询的工作方式是:先处理内查询,由内向外处理,外层查询利用内层查询的结果嵌套查询不仅仅可以用于父查询select语句使用.还可以用于insert.update.delete语句或其他子查询中. 一.子查询的组成 1.包含标准选择列表组件的标准select查询. 2.包含一个或多个表或者视图名称的