实操环境:SQL Server Management Studio 15.0.18369.0

查询所用数据库可在上一篇《数据库笔记(七)SQL的查询操作》中查看

一、 数据的修改——update

上一篇建立的数据库有点问题,学号有好多重复的,刚好在这里练习修改操作。

update Student set S# = '98040201' where Sname = '王三'
update Student set S# = '98040202' where Sname = '王四'

修改后的表格如下:
修改后表格

二、some与all

相当于量词”存在”与”任意”的作用

1) 例:找出所有学科都不及格的学生姓名:

思路:根据学号(S#)在SC中寻找Score再进行比较。

select Sname from Student
where 60 > all(select Score from SC where S# = Student.S#)

如果all为空集,即该同学姓名未在表中出现,该同学姓名仍然会被输出

2) 例找出工资最低的教师姓名

select Tname from Teacher
where Salary <= all(select Salary from Teacher)

3)例:找出001号课成绩在所有学生中不是最高的学生的学号

select S# from SC
where C# = '001' and Score < some(select Score from SC where C# = '001')

4)找出98030101号同学成绩最低的课程号

select C# from SC
where S# = '98030101' and Score <= all (select Score from SC where S# = '98030101')

in与 =some 的等价性替换

in与=some是可以等价替换的
但是not in 和<>some不可以等价替换
与not in 等价的是<>all

三、EXISTS 子查询

基本语法:

[not] Exists
(子查询)

语义:子查询结果中有无元组存在

示例:检索选修了赵三老师主讲课程的所有同学的姓名

Select DISTINCT Sname From Student
Where exists ( Select * From SC, Course, Teacher 
Where SC.C# = Course.C# and SC. S# = Student.S# and Course.T# = Teacher.T# and Tname = ‘赵三’ ) ;

不加not的Exists没有什么卵用
前面的代码可以用下面的代码等效替代

Select DISTINCT Sname From Student, SC, Course, Teacher
Where SC.C# = Course.C# and SC.S# = Student.S# 
and Course.T# = Teacher.T# and Tname = ‘赵三’ ) ;

但是not exists就很有用了。

示例:检索学过001号教师主讲的所有课程的所有同学的姓名

上述语句的意思:不存在有一门001号教师主讲的课程该同学没学过

Select Sname From Student
Where not exists //不存在
( Select * From Course //有一门001教师主讲课程
    Where Course.T# = ‘001’ and not exists //该同学没学过
            ( Select * From SC
                            Where S# = Student.S# and C# = Course.C# ) );

示例:列出没学过赵四老师讲授任何一门课程的所有同学的姓名

select Sname from Student
where not exists (select * from Teacher,Course,SC
where Teacher.Tname='赵四' and Teacher.T#=Course.T# and Course.C# = SC.C# and Student.S# = SC.S#
)