实验D003 多表查询实验.docx
9页《数据库系统原理》实验报告班级:计科N121学号:201245209132 姓名:吴方杰实验项目:多表查询实验实验时间:2014年4月3号实验地点:电教楼三楼2机房实验评价:实验例题典型,理解有点困难实验D003:多表查询实验 一、实验目的1. 掌握多表连接查询方法2. 掌握IN子查询的嵌套查询3. 了解EXISTS嵌套查询方法二、验证性实验结果1.多表的连接查询(相当于做笛卡儿乘积)SELECT * FROMC, SCc01数据库原理c034200512c0270c01数据库原理c034200512c03NULLc01数据库原理c034200512c04NULLc01数据库原理c034200515c0180c01数据库原理c034200518c0395c01数据库原理c034200018c0180共56条记录2.表的等值连接查询(1)查询各学生的选课信息(包括学号、课程名、成绩) 因为学号和成绩在SC表中,而课程名在C表中,因此需要多表查询SELECT SNO, CNAME, GRADEFROM C, SCWHERE C.CNO=SC.CNO200512信息系统70200512数据结构NULL200512DB_设计NULL200515数据库原理80200518数据结构95200018数据库原理80200518信息系统45200511信息系统78200511数据库原理45200511数据结构89200514信息系统78200514数据库原理45200514数据结构89200514DB_设计78共14条记录(2) 查询学生的选课记录,显示学生的学号、姓名、课程号、成绩。
SELECT S.SNO, SNAME, CNO, GRADEFROM S,SCWHERE S.SNO=SC.SNO200512李勇c02 70200512李勇c03NULL200512李勇c04NULL200515刘依依c0180200518刘晨c0395200018王敏c0180200518刘晨c0245200511杨扬c0278200511杨扬c0145200511杨扬c0389200514王占占—1—八、、八、、c0278200514王占占—1—八、、八、、c0145200514王占占—1—八、、八、、c0389200514王占占—1—八、、八、、c0478共14条记录(3) 查询学生的选课记录,显示学生的学号、姓名、课程号、课程名、成绩SELECT S.SNO,SNAME,SC.CNO,CNAME,GRADEFROM S,SC,CWHERE S.SNO=SC.SNO AND SC.CNO=C.CNO200512李勇c02信息系统70200512李勇c03数据结构NULL200512李勇c04 DB_设计NULL200515刘依依c01数据库原理80200518刘晨c03数据结构95200018王敏c01数据库原理80200518刘晨c02信息系统45200511杨扬c02信息系统78200511杨扬c01数据库原理45200511杨扬c03数据结构89200514王占占—1—八、、八、、c02信息系统78200514王占占—1—八、、八、、c01数据库原理45200514王占占—1—八、、八、、c03数据结构89200514王占占—1—八、、八、、c04DB_设计78共14条记录3. 左外连接查询:当希望左表(第一张表)中所有记录全部显示出来时,需要用左外 连接操作。
INSERT INTO S (SNO,SNAME) VALUES ('20000','ZXX')SELECT S.SNO,SNAME,CNO,GRADEFROM SLEFT OUTER JOIN SC ON S.SNO=SC.SNO200512李勇c02 70.0200512李勇c03NULL200512李勇c04NULL200518刘晨c0395.0200518刘晨c0245.0200018王敏c0180.0200511杨扬c0278.0200511杨扬c0145.0200511杨扬c0389.0200510张立NULLNULL200513张立NULLNULL200514王占占—1—八、、八、、c0278.0200514王占占—1—八、、八、、c0145.0200514王占占—1—八、、八、、c0389.0200514王占占—1—八、、八、、c0478.0200012欧阳雨NULLNULL200515刘依依c0180.020000ZXXNULLNULL共18条记录观察与下面等值连接的执行结果有何不同?SELECT S.SNO,SNAME,CNO,GRADEFROM S, SC WHERES.SNO=SC.SNO200512李勇c0270.0200512李勇c03NULL200512李勇c04NULL200515刘依依c0180.0200518刘晨c0395.0200018王敏c0180.0200518刘晨c0245.0200511杨扬c0278.0200511杨扬c0145.0200511杨扬c0389.0200514王占占—1—八、、八、、c0278.0200514王占占—1—八、、八、、c0145.0200514王占占—1—八、、八、、c0389.0200514王占占—1—八、、八、、c0478.0共14条记录4•表自身的连接(1) 查询与'李勇'同系的学生学号将学生表S与S本身进行等值连接(系部相等),因为S与S做连接操作时不能区分, 所以,对表取一个别名。
然后将第二张表S中名字为'李勇'的记录选择出就可SELECT S1.SN0FROM S AS S1, S AS S2WHERE S1.DEPA=S2.DEPA AND S2.SNAME='李勇’200512200518共2条记录(2) 显示每个学生的非最高分成绩(学生自己的选课成绩中,不是最高分的选课记录 显示出来)SELECT SNO, CNO, GRADE FROM SC AS SC1WHERE GRADE v(SELECT MAX(GRADE) FROM SC AS SC2WHERE SC2.SNO=SC1.SNO)c01数据库原理c034200512c02 70.0c01数据库原理c034200512c03NULLc01数据库原理c034200512c04NULLc01数据库原理c034200515c0180.0c01数据库原理c034200518c0395.0c01数据库原理c034200018c0180.0c01数据库原理c034200518c0245.0c01数据库原理c034200511c0278.0c01数据库原理c034200511c0145.0共56条记录5. IN嵌套子查询(1) 不相关的IN子查询:子查询可以单独执行,与被嵌套的查询无关。
如,查询与'李勇'同系的学生学号可以先查询出'李勇'所在的系,然后再到S表中查询与上述结果相同的记录SELECT SNOFROM SWHERE DEPA IN(SELECT DEPA FROM S WHERE SNAME='李勇'200512200518共2条记录查询'数据库原理'课程的选课人数SELECT COUNT (*) FROM SCWHERE CNO IN(SELECT CNO FROM C WHERE CNAME='数据库原理')4共1条记录2) 相关的子查询:子查询中要用到父查询表的信息,子查询不能独立执行如,查询选修课程号为“C01”课程且成绩至少高于选修课程号为“C02”的同学的Cno、 Sno 和 GRADE在子查询中,因为要查找该同学'C02'课程的成绩,所以,需要父查询表中该学生的 学号信息SELECT CNO, SNO, GRADEFROM SC AS SC1WHERE CNO=' C01' AND GRADE >(SELECT GRADE FROM SC AS SC 2WHERE SC2.SNO=SC1.SNO AND SC2.CNO='C02') 共0条记录.6. EXISTS嵌套子查询(1)执行以下语句,观察显示的两个查询结果SELECT SNO, SNAMEFROM SWHERE EXISTS(SELECT * FROM SC WHERE CNO= ‘C03')200512 李勇200518刘晨200018 王敏200511 杨扬200510 张立200513 张立200514王点点200012欧阳雨200515刘依依共9条记录。
GOSELECT SNO, SNAME FROM S200512 李勇200518刘晨200018王敏200511杨扬200510张立200513张立200514王占占—八、、八、、200012欧阳雨200515刘依依共9条记录2) 执行以下语句,观察显示的两个查询结果INSERT INTO C VALUES ('C06','数据库安全',NULL, 3)SELECT SNO, SNAMEFROM SWHERE EXISTS(SELECT * FROM SC WHERE CNO= ‘C06') 共0条记录3) 查询'数据库原理'课程的选课人数SELECT COUNT (*)FROM SCWHERE EXISTS(SELECT * FROM CWHERE C.CNO=SC.CNO AND CNAME='。





