实验四 子查询
一 实验目的
(1) 掌握带IN的子查询
(2) 掌握带有比较运算符的子查询
(3) 掌握带有ANY/ALL的子查询
(4) 掌握带有EXISTS的子查询
二 实验要求
利用SQL SERVER 书写select语句,利用子查询实现相关任务。
三 实验内容
1、查询与”莫小贝”同个专业的学生信息。
SELECT*FROM 学生表WHERE 专业编号 IN(SELECT 专业编号FROM 学生表WHERE 姓名='莫小贝')
2、查找最高分的学生,显示字段为学号,姓名,课程名,成绩。
SELECT 学生表.学号,姓名,课程名,成绩FROM 学生表, 课程表 ,成绩表 WHERE 成绩 IN (SELECT MAX(成绩)FROM 成绩表WHERE 课程名 IN(SELECT 课程名FROM 课程表) )AND 学生表.学号=成绩表.学号 AND 成绩表.课程号=课程表.课程号
3、查找选修了3门课程的同学学号,姓名,课程数目。(in)
SELECT 学生表.学号,姓名,COUNT(课程号)AS 选课数目FROM 学生表,成绩表WHERE 学生表.学号 IN(SELECT 学号FROM 成绩表GROUP BY 学号HAVING COUNT (课程号)=3)AND 学生表.学号=成绩表.学号GROUP BY 学生表.学号,姓名
4、查找选修了于朵老师的课程的学生姓名。(使用子查询和多表连接查询两种方法)
子查询:SELECT 姓名FROM 学生表WHERE 学号 IN(SELECT 学号FROM 成绩表WHERE 课程号 IN(SELECT 课程号FROM 授课表WHERE 教师号 IN(SELECT 教师号FROM 教师表WHERE 教师表.姓名='于朵')))
多表连接查询:SELECT DISTINCT 学生表.姓名/*DISTINCT用于去重*/FROM 学生表,成绩表,授课表,教师表WHERE 学生表.学号=成绩表.学号 AND 成绩表.课程号=授课表.课程号 AND 授课表.教师号=教师表.教师号 AND 教师表.姓名 = '于朵'
5、查询有一门及以上的成绩低于吕秀才的最低成绩的学生名字(用min和all两种方法)。
/*过几天有空了更新需要在学习学习*/
6、查找成绩大于80的学生的学号和姓名。(使用exists和连接两种方法)
SELECT 学号,姓名 From 学生表 where exists (SELECT 成绩From 成绩表 Where 成绩>80 AND 学生表.学号 =成绩表.学号)
连接:SELECT DISTINCT 学生表.学号,姓名 From 学生表,成绩表where 成绩>80 AND 学生表.学号 =成绩表.学号
7、查找没有选课的学生,显示字段为学号和姓名(not exsits和not in两种方法)
SELECT 学号,姓名 From 学生表 where not exists (SELECT 成绩From 成绩表 Where 学生表.学号 =成绩表.学号)
SELECT 学号,姓名FROM 学生表 WHERE 学号 not in(SELECT 学号 FROM 成绩表 )
8、以学生表、成绩表、课程表做生成表查询,结果保存在新表“学生成绩”中,新表字段包括:学号、姓名、课程名和成绩。
SELECT 学号,姓名,课程名,成绩into 学生成绩FROM (SELECT 学生表.学号,姓名,课程名,成绩FROM 学生表,课程表,成绩表 WHERE 学生表.学号=成绩表.学号 AND 成绩表.课程号=课程表.课程号) a
9、在“学生成绩”中查找每位同学课程的最高分结果按照成绩降序排序,显示字段:学号,姓名,课程名,成绩。(exists)
SELECT * FROM 学生成绩 aWHERE NOT EXISTS /*此处用的是not exists 用exists的就自己探索啦*/(SELECT *FROM 学生成绩 WHERE 姓名=a.姓名 AND 成绩>a.成绩)ORDER BY 成绩 DESC
/*再给你们提供一种方法虽然不是要求的方法*/SELECT * FROM 学生成绩WHERE 成绩 =(SELECT MAX(成绩) FROM 学生成绩 t1 WHERE t1.姓名 = 学生成绩.姓名)ORDER BY 成绩 DESC
数据是实验三多表查询的数据,相信做这些题的同学们都有数据,没有的话可以私信或留言,我会发给你们的
之前的有些漏了字段,有些写错了,现在已经更新,很多方法的大家多探索,欢迎私聊探讨