这里举两个例子,这两个例子适合考试的时候学霸和其他人拉开差距的题目,在这里和大家分享一下。(表的内容见附录,这里是操作语句和解释)
查询这样的学生,没有一门课是他不选的。
select sname
from student
where not exists -----不存在
(select *
from course----有这样一条记录(有这样一门课)
---这个学生没有选这门课(不存在这样一门课,这个学生选了的)
where not exists----不存在
(select *
from sc
where sno= student.sno---这个学生
and cno= course.cno---这门课
)
);
这里的关键词(where,select,exists)大小写无所谓。这个语句很多同学都不是很理解。再从我的角度给大家分析一下
第一步 从student 表中选择出一个学生,依次对这个学生选择的课程进行遍历,如何课程都选择了,就输出学生姓名。语句是
where not exists----不存在
(select *
from sc
where sno= student.sno---这个学生
and cno= course.cno---这门课
)
);
第二步 对学生进行遍历,重复步骤一的操作,输出学生姓名
效果图如下
例题二:查询至少选修了学生95002选修的全部课程的学生号码。
select distinct sno 从scx中选择学生号码
from sc scx scx这里其实就是sc这张表,相当于一张子表,内容和sc一样,下面的scy也是这样
where not exists 不存在
(select*
from sc scy
where scy.sno='95002' and
not exists
(select *
from sc scz
where scz.sno=scx.sno
and scz,cno=scy.cno) 满足学号是95002并且和他选择的课程一样
);
结果可以见上图
附
CREATE TABLE Student (Sno varCHAR(5) NOT NULL UNIQUE, Sname varCHAR(20) UNIQUE, Ssex varCHAR(1) , Sage INT, Sdept varCHAR(15));
create Table Course(Cno varCHAR(3) not null UNIQUE,Cname varCHAR(60) not null UNIQUE,Cpno varCHAR(3), Ccredit integer not null,Primary key(Cno)); create table SC( Sno varCHAR(5), Cno varCHAR(3), Grade int, Primary key(Sno,Cno));
1)向其中插入数据(保证里面有数据)
insert into student values ('95001', '张三', 20, 'CS','男'), ('95002', '李四', 21, 'IS', '男'), ('95003','王五', 18, 'MA ','男'), ('95004', '马六', 19, 'CS', '女'), ('95005', '苏三', 19, 'IS', '女'), ('95006', '刘七', 18, 'CM', '女'), ('95007', '刘三姐', 22, 'PS', '女'), ('95008', '欧阳锋', 23, 'CS', '男'), ('95009', '欧阳大侠', 22, 'IS', '男'); insert into course values ('1', 'MATH', null, 6), ('2','DB_DESIGN', '3', 2), ('3', 'P_DESIGN', '3', 3), ('4', 'OS', null, 2); insert into sc values ('95001', '1', 92), ('95001', '2', 94), ('95001', '3', 90), ('95001', '4', 97), ('95002', '2', 90), ('95002', '3', 80), ('95003', '2', null), ('95004', '3', null), ('95005', '1', 90), ('95005', '2', 98), ('95005', '3', 90), ('95005', '4', 89);