数据库查询之嵌套(一)
/*
可能用到的表结构
Departments(Dno, Dname,Dheadno)
院系(院系号,院系名,院主任)
Teachers (Tno,Tname,Sex,Birthday,Title,Dno)
老师(教工号,教师名,性别,生日,职称,所在院系号)
Students(Sno,Sname,Sex,Birthday,Speciality,Dno)
学生(学号,名字,性别,生日,专业名,院系号)
Course(Cno, Cname,Credit)
课表(课程号,课程名,学分)
Teaches(Tno,Cno,TCscore)
实体教(教工号,课程号,评估得分)
SC(Sno,Cno,Greade)
选课(学生学号,课程号,学生成绩)
*/
/*
1.最常见的嵌套是将子查询嵌套在where子句或having短语的条件中
2.我们称将一个查询嵌套在另一个查询中的查询称为嵌套查询,并称前者为子查询(内层查询),后者为父查询(外层查询)
3.子查询中不能使用group by子句(一定要注意的一个地方)
嵌套查询可以分两类
不相关子查询的子查询的条件不依赖于父查询
相关子查询的子查询的查询条件依赖于父查询
使用子查询可以对集合的成员资格(in)、集合比较(some ,all )和集合基数进行检查(exists)
可以引进子查询的表达式: IN表达式、存在表达式、null表达式和唯一表达式等
*/
/*
1. IN引出的子查询:(作用是判断某一个元素是否是某一个集合的成员)这种一般使用主码的属性来进行整合为集合
IN表达式的第一种形式,用于判定一个给定的值是否在给定的集合中
IN表达式的第二种形式可以更一般地判定集合成员资格,其形式如下:
<元组> [NOT] IN <子查询>
其中<元组>形如(<值表达式>,…,<值表达式>),并且当元组只有一个分量时,可以省略圆括号
当<元组>出现在<子查询>的结果中,<元组> IN <子查询>为真,而<元组> NOT IN <子查询>为假
*/
-- 查询和张华在同一个专业学习的男同学的学号和姓名。
--这种检查某一个元素是否在另一个集合的成员中,我们可以先将集合找到,在将每一个元素去查询,集合中是否有(或者是没有)这个元素;
-- 第1步.查询张华的专业(他是一个集合)(将它作为子查询)
select Speciality from Students where Sname = '张华';
-- 第2步.再到学生表中查找和张华同一专业的男同学的学号和姓名(将表中每一个元素都去做判断)
select Sno,Sname
from Students
where Sex = '男' and Sname <> '张华' and Speciality in
(select Speciality from Students where Sname = '张华');
--注意:
-- 子查询的FROM子句中的表(包括它的属性,下同)仅在子查询中存在并起作用
-- 父查询from子句中的表在父查询和子查询都存在,但是当子查询的from子句包含相同的表时,其作用域不包含子查询
-- 列出林艳和张华同学所有的信息(这是最简单的集合判断,因为它的集合已经给出来了,这个时候可以直接使用这个集合)
select *
from Students
where Sname in ('张华','林艳');
-- 上面这个语句相当于是
select *
from Students
where Sname = '张华' or Sname = '林艳';
-- 列出了选修了CS101号