数据库系统概论王珊第五版第十讲_第1页
数据库系统概论王珊第五版第十讲_第2页
数据库系统概论王珊第五版第十讲_第3页
数据库系统概论王珊第五版第十讲_第4页
数据库系统概论王珊第五版第十讲_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、数据库原理数据库原理 第三章:关系数据库标准语言第三章:关系数据库标准语言sqlsql授课教师:姜姗1.自身连接自身连接v自身连接:连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,称为表的自身连接。v由于所有属性名都是同名属性,因此必须使用别名前缀。需要给表起别名以示区别。v例1:查询每一门课的间接先修课(即先修课的先修课) first表(course表) second表(course表) cnocnamecpnoccredit1数据库542数学23信息系统144操作系统635数据结构746数据处理27pascal语言64cnocnamecpnoccredit1数据库542数

2、学23信息系统144操作系统635数据结构746数据处理27pascal语言64v完成上述查询的sql语句为: select o, second.cpnofrom course first,course secondwhere first.cpno = ov例例2:查询和:查询和“李勇李勇”一个院系的一个院系的其他学生其他学生的基本情况的基本情况 a表(student表) b表(student表) 学号sno姓名sname性别ssex年龄sage所在系sdept200215121李勇男20cs200215122刘晨女19cs200215123王敏女18ma200215125张立男19is学号s

3、no姓名sname性别ssex年龄sage所在系sdept200215121李勇男20cs200215122刘晨女19cs200215123王敏女18ma200215125张立男19isv例例2:查询和:查询和“李勇李勇”一个院系的学生的基本情况一个院系的学生的基本情况 select b.*from student a,student bwhere a.sname=李勇 and a.sdept= b.sdept and b.sname李勇使用使用join关键字实现表的连接关键字实现表的连接v在select语句的from子句中,通过指定不同类型的join关键字可以实现不同的表的连接方式,而在on

4、关键字后指定连接条件。v基本连接语法如下:select column_list from join_table join_type join_tableon ( join_condition )说明如下。join_table:指出参与连接操作的表名。join_type为连接类型,可分为3种:内部连接、外部连接和交叉连接。1.内部连接内部连接v内部连接inner join内部连接是使用比较运算符比较要连接列中的值的连接,下面通过实例说明其使用。例:从student和sc表中查询每个学生的各门选修课成绩信息,要求返回的结果中包含学生的学号、姓名、性别、选修课程序号及成绩。select a.sno,

5、sname,ssex,cno,gradefrom student a inner join sc bon a.sno=b.snov练习:查询所有考试成绩及格的学生的成绩信息,结果中包含学生的学号、姓名、性别、选修课程编号、成绩,并按照成绩进行降序排列。select a.sno,sname,ssex,o,gradefrom student a inner join sc bon a.sno=b.sno and grade=60order by b.grade2.外连接外连接v在通常的连接操作中,只有满足连接条件的行才能作为结果输出,但有些情况下,也需要输出其他相关选项,这就用到了外连接。 v例3

6、:查询每个学生及其选修课程的情况。 snosnamessexsagesdeptcnograde200215121李勇男20cs192200215121李勇男20cs285200215121李勇男20cs388200215122刘晨女19cs290200215122刘晨女19cs380200215123王敏女18ma200215125张立男19isv例3:查询每个学生及其选修课程的情况。 select student.sno,sname,ssex,sage,sdept,cno,grade from student,sc where student.sno = sc.sno 参见p82,查询结果中

7、没有200215123和200215125这两个学生的信息。vsql扩展了以join关键字关键字指定连接的表达式,使表的连接运算能力有了增强(关键字outer 可省略)。v外连接可分为左连接(left)、右连接(right)和全连接(full)三种:abcbda1b12b15a1b24b26a2b36b47a2b48b58rsabcda1b125a1b246a2b36nulla2b487nullb5null8外连接外连接abcda1b125a1b246a2b36nulla2b487左外连接左外连接abcda1b125a1b246a2b487nullb5null8右外连接右外连接左外连接格式:左

8、外连接格式:select , from left outer join on 右外连接格式:右外连接格式:select , from right outer join on 外连接格式:外连接格式:select , from full outer join on 例1:查询所有学生基本情况及他们选修课程的成绩(包括没选修任何课的学生)。select student.*,gradefrom student left outer join sc on (student.sno = sc.sno)select student.*,gradefrom student left join sc on (

9、student.sno = sc.sno)例2:查询所有选修课程的学生的学号、姓名、课程号及成绩。select student.sno,sname,cno,gradefrom student right outer join sc on (student.sno = sc.sno)select student.sno,sname,cno,gradefrom student right join sc on (student.sno = sc.sno)4. 多表连接多表连接v 多表连接:两个以上的表进行连接例3.54查询每个学生的学号、姓名、选修的课程名及成绩 select student.sn

10、o, sname, cname, grade from student, sc, course /*多表连接*/ where student.sno = sc.sno and sc.cno = course.cno; 3.4.3 嵌套查询嵌套查询vsql允许select多层嵌套使用,即一个子查询中还可以嵌套子查询,用来表示复杂的查询,从而增强sql的查询能力。v以这种层层嵌套的方式来构造查询语句正是sql中“结构化结构化”的含义所在。v 在where子句或having子句所表示的条件中,可以使用另一个查询的结果(即一个查询块:一个select- from- where 语句称为一个查询块)作为

11、条件的一部分,这种将一个查询块嵌套在另一个查询块的where子句或having子句的条件中的查询称为嵌套查询。v 例如: select snamefrom student 上层模块:父查询,外层查询 where sno in ( select sno from sc 下层模块:子查询,内层查询 where cno=2 ); vsql语言允许有多层嵌套查询。即一个子查询中还允许嵌套其他子查询。需要特别指出的是子查询的子查询的select 语句中不能使用语句中不能使用order by 子句子句,order by子句只能对最终查询结果排序。v子查询通常与in 、比较运算符及、比较运算符及exists

12、谓词结合使谓词结合使用。用。1、带有、带有in谓词的子查询谓词的子查询 v在嵌套查询中,子查询的结果往往是一个集合,所以谓词in是嵌套查询中最常用的谓词。vin子查询用于进行一个给定值是否在子查询结果集中的判断。例例1 1:查询与查询与“刘晨刘晨”在一个系学习的学生。在一个系学习的学生。select b.*from student a,student bwhere a.sname=刘晨 and a.sdept= b.sdept and b.sname刘晨 select *from studentwhere sdept in (select sdept from student where sn

13、ame= 刘晨) and sname刘晨 步骤:先找出刘晨对应的院系,再通过院系找其余学生。步骤:先找出刘晨对应的院系,再通过院系找其余学生。v例2:查询选修了课程名为“信息系统”的学生学号和姓名。 select sno,sname from student where sno in (select sno from sc where cno in ( select cno from course where cname=信息系统) ) )v上述查询可以用连接查询实现: select student.sno,sname from student, sc, course where studen

14、t .sno=sc.sno and o=o and ame=信息系统 练习:1、查询选修课程号为2的学生姓名;2、查询没有选修课程的学生的基本情况;3、查询至少有一个成绩在80分以上的学生的基本情况;4、查询没有选修“数据库”课程的学生的基本情况。1 1、查询选修课程号为、查询选修课程号为2 2的学生姓名;的学生姓名;select snamefrom student,scwhere student.sno = sc.sno and o=2select snamefrom studentwhere sno in (select sno from sc where cno= 2)步骤:先找出步骤:

15、先找出2号课程对应的学号,再通过学号找学生姓名。号课程对应的学号,再通过学号找学生姓名。2 2、查询没有选修课程的学生的基本情况;查询没有选修课程的学生的基本情况;select *from studentwhere sno not in (select sno from sc)3 3、查询至少有一个成绩在查询至少有一个成绩在80分以上的学生的基本情况;分以上的学生的基本情况;select *from studentwhere sno in (select sno from sc where grade=80) 4 4、查询没有选修查询没有选修“数据库数据库”课程的学生的基本情况课程的学生的基本

16、情况。select *from studentwhere sno not in (select sno from sc where cno in(select cno from course where cname=数据库)2、带有比较运算符的子查询、带有比较运算符的子查询v 带有比较运算符的子查询是指父查询与子查询之间用比较运算符连接。当用户确切知道内层查询返回的是单值时,可以用 , =, !=或 等比较运算符。v 例如39:查询与“刘晨”在一个系学习的学生。由于一个学生只可能在一个系学习,也就是说内查询的结果是一个值,因此可以用=代替in select * from student whe

17、re sdept in(或者用 =) (select sdept from student where sname= 刘晨) and sname刘晨 例1:找出一个学生超过他选修课程平均成绩的课程号。 x表 (sc表) y表(sc表) 学号sno课程号cno成绩grade200215121192200215121285200215121388200215122290200215122380学号sno课程号cno成绩grade200215121192200215121285200215121388200215122290200215122380例1:找出一个学生超过他选修课程平均成绩的课程号。

18、select sno,cno from sc x where grade= (select avg(grade) from sc y where y.sno=x.sno)练习练习1、查询和、查询和“李勇李勇”不在一个院系的学生的基本情况;不在一个院系的学生的基本情况;2、查询年龄高于平均年龄的学生的基本信息。、查询年龄高于平均年龄的学生的基本信息。1、查询和、查询和“李勇李勇”不在一个院系的学生的基本情况;不在一个院系的学生的基本情况;select *from studentwhere sage (select avg(sage) from student)2、查询年龄高于平均年龄的学生的基本

19、信息;、查询年龄高于平均年龄的学生的基本信息;select *from studentwhere sdept (select sdept from student where sname= 李勇)3、带有、带有any或或all谓词的子查询谓词的子查询v子查询返回单值时可以用比较运算符,但返回多值时要用any或all谓词修饰。v而使用any或all谓词时必须同时使用比较运算符。v需要配合使用比较运算符 any大于子查询结果中的某个值大于子查询结果中的某个值 all大于子查询结果中的所有值 any小于子查询结果中的某个值小于子查询结果中的某个值 = any 大于等于子查询结果中的某个值大于等于子查

20、询结果中的某个值 = all大于等于子查询结果中的所有值= any 小于等于子查询结果中的某个值小于等于子查询结果中的某个值 = all小于等于子查询结果中的所有值= any等于子查询结果中的某个值等于子查询结果中的某个值 =all等于子查询结果中的所有值(通常没实际意义)!=(或)any 不等于子查询结果中的某个值不等于子查询结果中的某个值!=(或)all不等于子查询结果中的任何一个值例:查询其他系中比计算机科学系(例:查询其他系中比计算机科学系(cs)某一学生某一学生年龄年龄小的学生姓名和年龄;小的学生姓名和年龄; 学号sno姓名sname性别ssex年龄sage所在系sdept20021

21、5121李勇男20cs200215122刘晨女19cs200215123王敏女18ma200215125张立男19is例例1:查询其他系中比计算机科学系(:查询其他系中比计算机科学系(cs)某一学生某一学生年龄小的学生姓名和年龄;年龄小的学生姓名和年龄; select sname,sage from student where sage any (select sage from student where sdept= cs) and sdept csselect sname,sagefrom studentwhere sage (select max(sage) from student

22、where sdept= cs) and sdept cs例例2:查询其他系中比计算机科学系(:查询其他系中比计算机科学系(cs)所有学生所有学生年龄都小的学生姓名和年龄;年龄都小的学生姓名和年龄; select sname,sage from student where sage all (select sage from student where sdept= cs) and sdept csselect sname,sagefrom studentwhere sage (select min(sage) from student where sdept= cs) and sdept c

23、s4、带有、带有exists谓词的子查询谓词的子查询vexists代表存在量词。带有exists谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。 若内层查询结果非空,则外层的where子句返回真值 若内层查询结果为空,则外层的where子句返回假值v由exists引出的子查询,其目标列表达式通常都用* ,因为带exists的子查询只返回真值或假值,给出列名无实际意义。v例例1:查询参加选修的学生信息。:查询参加选修的学生信息。 select * from student where exists (select * from sc where sc.sno =s

24、tudent.sno)select *from studentwhere sno in (select sno from sc )v例例2:查询未参加选修的学生信息。:查询未参加选修的学生信息。 select * from student where not exists (select * from sc where sc.sno =student.sno)select *from studentwhere sno not in (select sno from sc )例例3:查询没有选修:查询没有选修1号课程的学生姓名。号课程的学生姓名。select snamefrom studentw

25、here not exists (select * from sc where sno = student.sno and cno=1 )select snamefrom studentwhere sno not in (select sno from sc where cno= 1)三、集合查询三、集合查询vselect语句的查询结果是元组的集合,所以多个select语句的结果可进行集合操作。v集合操作主要包括: 并操作并操作 union 交操作交操作 intersect 差操作差操作 exceptv注意:参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同。例1:查询计算机科学系(cs)的学生及年龄不大于19岁的学生。 select distinct * from student where sdept= cs or sage=19select *from studentwhere sdept= csunion select *from studentwhere sage=19union:将多个查询结果合并起来时,系统自动去掉重复元

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论