一、SQL Server多表查询,包括连接操作和嵌套子查询

背景知识:
一、连接:分成内连接和外连接,内连接相当于取交集,外连接相当于取并集
二、嵌套子查询:连接操作浪费资源,使用嵌套子查询可以避免连接同时加快执行速度,分成相关子查询和非相关子查询

名称解释(不区分大小写)

  • student学生表:

    • 包含属性列:sno学号、sname学生姓名、age年龄、sex性别、dno学院编号、birthday生日
  • sc选课信息表:
    • 包含属性列:sno学号、cno课程号、grade成绩
  • dept学院信息表:
    • 包含属性列:dno学院编号、dname学院名称、dean学院负责人
  • course课程信息表:
    • 包含属性列:cno课程号、cname课程名称、tname老师名称、credit学分、room教室

下面语句可以直接复制到SQL Server运行

  • 运行方法,选中执行语句

方法不唯一,有问题欢迎留言讨论!代码块见文章末尾

二、代码

select * from student
select * from sc
select * from course

– 求学号为‘20022037’的同学的每门课的成绩,输出格式为:学号,课程名,课程成绩
select sno,cname,grade from sc,course
where sc.cno = course.cno and sno = ‘20022037’

select sno,cname,grade from sc inner join course on sc.cno = course.cno
where sno = ‘20022037’

– 查询每个学生的每门课程的成绩,要求输出学号,课程名,成绩
select sno,cname,grade from sc,course
where sc.cno = course.cno

select sno,cname,grade from sc inner join course on sc.cno = course.cno

– 查询每个学生的每门课程的成绩,要求输出学号,姓名,课程号,成绩
select student.sno,sname,cno,grade from sc,student
where sc.sno = student.sno

select student.sno,sname,cno,grade from sc inner join student on sc.sno = student.sno

– 查询选修了’线性代数’课程的学生学号、姓名
select cname,sno,sname from student,course
where cname = ‘线性代数’

–从选修’218801’课程的同学中,选出成绩高于’季莹’的学生的学号和成绩
select sno,grade from sc
where cno = ‘218801’ and grade > (
select grade from sc
where cno = ‘218801’ and sno = (
select sno from student where sname = ‘季莹’))

–查询成绩比该课程平均成绩低的学生成绩表
select sno,cno,grade from sc as a
where grade < (
select avg(grade) from sc as b
where a.cno = b.cno)

–H 查询所有学生都选修的课程名
select cname from course
where not exists(
select sno from student
where not exists(
select sno from sc
where sc.sno = student.sno and sc.cno = course.cno
)
)
select cname from course
where cno in(
select distinct cno from sc
group by cno
having count(distinct sno) in (select sno from sc)
)

–查询选修了’线性代数’课程或’英语口语’课程的学生学号、姓名
select sno,sname from student
where sno in (
select sno from sc
where sno in (
select sno from course
where cname = ‘线性代数’ or cname = ‘英语口语’)
)

–用集合操作符 UNION 查询选修了’线性代数’课程或’英语口语’课程的学生学号、姓名
select sno,sname from student
where sno in (
select sno from sc
where sno in (
select sno from course
where cname = ‘英语口语’)
)
union
select sno,sname from student
where sno in (
select sno from sc
where sno in (
select sno from course
where cname = ‘线性代数’)
)

–查询选修了’218801’课程但没有选修’216301’课程的学生学号。
select sno from sc
where cno = ‘218801’
except
select sno from sc
where cno = ‘216301’
– 方法二
select sno from sc
where cno = '218801’and sno not in(
select sno from sc
where cno = ‘216301’)

–求同时选修’218801’课程和’216301’课程的学生学号、姓名。,也可以使用多表查询
select sc.sno,sname from sc,student
where sc.sno = ‘218801’
intersect
select sc.sno,sname from sc,student
where sc.sno = ‘216301’

–查询所有学生及其选课信息
select student.sno,sname,cno,grade
from student left outer JOIN sc
on student.SNO=sc.SNO

–创建课程平均分视图

–以列的方式统计每门课程的分数段人数。分数段为:不及格、60-70、70-80、80-90、90-100
(select cname,‘不及格’ AS fsd ,COUNT() AS rs
FROM sc,course
WHERE sc.CNO=course.CNO AND GRADE <60
GROUP BY cname)
UNION
(SELECT CNAME ,‘60-70’ AS fsd , COUNT (
)
FROM sc,course
WHERE sc.CNO=course.CNO AND GRADE BETWEEN 60 AND 70
GROUP BY CNAME)
UNION
(SELECT CNAME ,‘70-80’ AS fsd , COUNT ()
FROM sc,course
WHERE sc.CNO=course.CNO AND GRADE BETWEEN 70 AND 80
GROUP BY CNAME)
UNION
(SELECT CNAME ,‘80-90’ AS fsd , COUNT (
)
FROM sc,course
WHERE sc.CNO=course.CNO AND GRADE BETWEEN 80 AND 90
GROUP BY CNAME)
UNION
(SELECT CNAME ,‘90-100’ AS fsd , COUNT (*)
FROM sc,course
WHERE sc.CNO=course.CNO AND GRADE BETWEEN 90 AND 100
GROUP BY CNAME)

–1.查询所有选课学生的姓名
select sname,sno from student
where exists(select * from sc where sc.sno = student.sno)
order by sname

–2.查询所有未选课的学生的姓名
select sname from student
where not exists(select * from sc where student.sno = sc.sno)

–3.按学生分类查询其选修课程的平均分,输出学号、姓名和平均成绩
select student.sno,student.sname,avg(grade) as 平均成绩 from student,sc
where student.sno = sc.sno
group by student.sno,student.sname

–4.查询所有课程的平均分,输出课程名和平均成绩,并按平均成绩递增
select cname,avg(grade) as 平均成绩 from sc,course
group by cname
order by 平均成绩

–5.查询少于 10 名同学选修的课程名称,授课班号,教师名,选课人数
select cname,sc.cno,tname,count(sno) as 选课人数 from course,sc
group by cname,sc.cno,tname
having count(*) < 10
order by sc.cno

–6.按学号显示信息学院,‘通信专业’或‘电子科学专业’的每个学生的每门课程的成绩明细,并统计每个学生的总成绩,平均成绩
select DNAME,student.SNO,sum(GRADE)‘总成绩’,AVG(GRADE)‘平均成绩’
from sc,student,dept
where student.DNO=dept.DNO and student.SNO=sc.SNO
and DNAME=‘信息学院’
GROUP BY DNAME,student.SNO

–7.统计每门课的不及格人数,列出课程名和不及格人数
select cname,count(*) from sc,course
where grade < 60
group by cname

SELECT CNAME ,‘不及格分数段’ AS fsd ,COUNT(*) AS rs
FROM sc, course
WHERE sc.CNO= course.CNO AND GRADE<60
GROUP BY CNAME

–(1) 使用嵌套方法查询存在有 95 分以上成绩的课程 CNO
select cno from sc
where grade > 95

–(2) 查询成绩比该课程平均成绩低的学生成绩表
select sno,grade from sc as a
where grade < (select avg(grade) from sc as b where a.sno = b.sno)

–(3) 按课程名称统计每一门课程的平均分,输出课程名称和平均分
select cname,avg(grade) as 平均分 from sc,course
group by cname

–(4) 按学生姓名统计其选修课程的总学分,输出学生姓名和总学分
select sname,student.sno,总成绩 from student
right join
(select sno,sum(grade) as 总成绩 from sc group by sno) as d
on student.sno = d.sno

–(5) 查询同时选修了‘203402’和‘244501’课程的同学名称
select sname from student
where student.sno in (select sno from sc
where cno = ‘203402’ or cno = ‘244501’)

–(6) 求最高分学生的学号
select sno,grade from sc
where grade >= all(select grade from sc)

–(7) 查询“线性代数”的所有授课班级的平均成绩,列出课程名和平均成绩
select avg(grade) as 平均成绩,cname from sc,course
where cname = ‘线性代数’
group by cname

–(8) 查询“线性代数”成绩最高的前 5 名学生的姓名及成绩,结果按成绩降序
select top 5 sname,grade from sc,student
order by grade desc

–(9) 查询学生“20002059”选修课程的总学分数
select sum(grade) as 总分数 from sc
where cno = ‘20002059’

–(10) 对每个同学,查找其获得最高成绩的课程号
select sno,cno from sc as a
where grade >= all(select grade from sc as b
where a.sno = b.sno)

三、代码块

select * from student
select * from sc
select * from course
-- 求学号为‘20022037’的同学的每门课的成绩,输出格式为:学号,课程名,课程成绩
select sno,cname,grade from sc,course
where sc.cno = course.cno and sno = '20022037'
--方法二
select sno,cname,grade from sc inner join course on sc.cno = course.cno
where sno = '20022037'-- 查询每个学生的每门课程的成绩,要求输出学号,课程名,成绩
select sno,cname,grade from sc,course
where sc.cno = course.cnoselect sno,cname,grade from sc inner join course on sc.cno = course.cno-- 查询每个学生的每门课程的成绩,要求输出学号,姓名,课程号,成绩
select student.sno,sname,cno,grade from sc,student
where sc.sno = student.snoselect student.sno,sname,cno,grade from sc inner join student on sc.sno = student.sno-- 查询选修了'线性代数'课程的学生学号、姓名
select cname,sno,sname from student,course
where cname = '线性代数'--从选修’218801’课程的同学中,选出成绩高于’季莹’的学生的学号和成绩
select sno,grade from sc
where cno = '218801' and grade > (select grade from scwhere cno = '218801' and sno = (select sno from student where sname = '季莹'))--查询成绩比该课程平均成绩低的学生成绩表
select sno,cno,grade from sc as a
where grade < (select avg(grade) from sc as bwhere a.cno = b.cno)--H 查询所有学生都选修的课程名
select cname from course
where not exists(select sno from studentwhere not exists(select sno from scwhere sc.sno = student.sno and sc.cno = course.cno)
)
--方法二
select cname from course
where cno in(select distinct cno from scgroup by cnohaving count(distinct sno) in (select sno from sc)
)--查询选修了'线性代数'课程或'英语口语'课程的学生学号、姓名
select sno,sname from student
where sno in (select sno from scwhere sno in (select sno from coursewhere cname = '线性代数' or cname = '英语口语')
)--用集合操作符 UNION 查询选修了'线性代数'课程或'英语口语'课程的学生学号、姓名
select sno,sname from student
where sno in (select sno from scwhere sno in (select sno from coursewhere cname = '英语口语')
)
union
select sno,sname from student
where sno in (select sno from scwhere sno in (select sno from coursewhere cname = '线性代数')
)--查询选修了'218801'课程但没有选修'216301'课程的学生学号。
select sno from sc
where cno = '218801'
except
select sno from sc
where cno = '216301'
-- 方法二
select sno from sc
where cno = '218801'and sno not in(select sno from scwhere cno = '216301')--求同时选修'218801'课程和'216301'课程的学生学号、姓名。,也可以使用多表查询
select sc.sno,sname from sc,student
where sc.sno = '218801'
intersect
select sc.sno,sname from sc,student
where sc.sno = '216301'--查询所有学生及其选课信息
select student.sno,sname,cno,grade
from student left outer JOIN sc
on student.SNO=sc.SNO--以列的方式统计每门课程的分数段人数。分数段为:不及格、60-70、70-80、80-90、90-100
(select cname,'不及格' AS fsd ,COUNT(*) AS rs
FROM sc,course
WHERE sc.CNO=course.CNO AND GRADE <60
GROUP BY cname)
UNION
(SELECT CNAME ,'60-70' AS fsd , COUNT (*)
FROM sc,course
WHERE sc.CNO=course.CNO AND GRADE BETWEEN 60 AND 70
GROUP BY CNAME)
UNION
(SELECT CNAME ,'70-80' AS fsd , COUNT (*)
FROM sc,course
WHERE sc.CNO=course.CNO AND GRADE BETWEEN 70 AND 80
GROUP BY CNAME)
UNION
(SELECT CNAME ,'80-90' AS fsd , COUNT (*)
FROM sc,course
WHERE sc.CNO=course.CNO AND GRADE BETWEEN 80 AND 90
GROUP BY CNAME)
UNION
(SELECT CNAME ,'90-100' AS fsd , COUNT (*)
FROM sc,course
WHERE sc.CNO=course.CNO AND GRADE BETWEEN 90 AND 100
GROUP BY CNAME)--1.查询所有选课学生的姓名
select sname,sno from student
where exists(select * from sc where sc.sno = student.sno)
order by sname--2.查询所有未选课的学生的姓名
select sname from student
where not exists(select * from sc where student.sno = sc.sno)--3.按学生分类查询其选修课程的平均分,输出学号、姓名和平均成绩
select student.sno,student.sname,avg(grade) as 平均成绩 from student,sc
where student.sno = sc.sno
group by student.sno,student.sname--4.查询所有课程的平均分,输出课程名和平均成绩,并按平均成绩递增
select cname,avg(grade) as 平均成绩 from sc,course
group by cname
order by 平均成绩--5.查询少于 10 名同学选修的课程名称,授课班号,教师名,选课人数
select cname,sc.cno,tname,count(sno) as 选课人数 from course,sc
group by cname,sc.cno,tname
having count(*) < 10
order by sc.cno--6.按学号显示信息学院,‘通信专业’或‘电子科学专业’的每个学生的每门课程的成绩明细,并统计每个学生的总成绩,平均成绩
select DNAME,student.SNO,sum(GRADE)'总成绩',AVG(GRADE)'平均成绩'
from sc,student,dept
where   student.DNO=dept.DNO and student.SNO=sc.SNO
and DNAME='信息学院'
GROUP BY  DNAME,student.SNO--7.统计每门课的不及格人数,列出课程名和不及格人数
select cname,count(*) from sc,course
where grade < 60
group by cnameSELECT CNAME ,'不及格分数段' AS fsd ,COUNT(*) AS rs
FROM sc, course
WHERE sc.CNO= course.CNO AND GRADE<60
GROUP BY CNAME--(1) 使用嵌套方法查询存在有 95 分以上成绩的课程 CNO
select cno from sc
where grade > 95--(2) 查询成绩比该课程平均成绩低的学生成绩表
select sno,grade from sc as a
where grade < (select avg(grade) from sc as b where a.sno = b.sno)--(3) 按课程名称统计每一门课程的平均分,输出课程名称和平均分
select cname,avg(grade) as 平均分 from sc,course
group by cname--(4) 按学生姓名统计其选修课程的总学分,输出学生姓名和总学分
select sname,student.sno,总成绩 from student
right join
(select sno,sum(grade) as 总成绩 from sc group by sno) as d
on student.sno = d.sno--(5) 查询同时选修了‘203402’和‘244501’课程的同学名称
select sname from student
where student.sno in (select sno from scwhere cno = '203402' or cno = '244501')--(6) 求最高分学生的学号
select sno,grade from sc
where grade >= all(select grade from sc)--(7) 查询“线性代数”的所有授课班级的平均成绩,列出课程名和平均成绩
select avg(grade) as 平均成绩,cname from sc,course
where cname = '线性代数'
group by cname--(8) 查询“线性代数”成绩最高的前 5 名学生的姓名及成绩,结果按成绩降序
select top 5 sname,grade from sc,student
order by grade desc--(9) 查询学生“20002059”选修课程的总学分数
select sum(grade) as 总分数 from sc
where cno = '20002059'--(10) 对每个同学,查找其获得最高成绩的课程号
select sno,cno from sc as a
where grade >= all(select grade from sc as bwhere a.sno = b.sno)

SQL:多表查询语句(嵌套子查询,多表连接)操作实例相关推荐

  1. SQL中关于EXISTS的嵌套子查询问题

    SQL中关于EXISTS的嵌套子查询问题 SQL语句中,没有蕴含式和全程量词,所以这个时候,我们可以用离散数学的理论,将命题变化,然后使用EXISTS语句来查询,确实有点难以理解,下面我举一个例子来解 ...

  2. MYSQL查询语句2——子查询

    子查询 一.为什么会使用子查询 二.什么是子查询 三.子查询的具体使用+实例 1.WHERE子句后使用子查询 2.FROM子句后使用子查询 一.为什么会使用子查询 虽然可以通过连接查询来实现多表查询数 ...

  3. ylb:子查询(嵌套子查询)和子查询(相关子查询)

    ylbtech-SQL Server:SQL Server-子查询(嵌套子查询)和子查询(相关子查询) SQL Server 子查询(嵌套子查询)和子查询(相关子查询). 1,ylb:1,子查询(嵌套 ...

  4. linq 查询中嵌套子查询

    开发工具与关键技术:VS NVC 作者:听民谣的老猫 撰写时间:2019/7/22 18:15 讲一个比较实用的功能____linq 查询中嵌套子查询. 通常我们遇到上面这种情况,我们肯定是想吧后面班 ...

  5. linq查询中嵌套子查询

    为了实现某个模块的功能时,需要查询数据时而这些数据又没有在同一张表里面,为了方便调用数据,就会创建实体类来封装这些数据,由于数据是关联多张表的那么实体类里面就会有多个列表对象,就比如在项目权限管理的权 ...

  6. 相关子查询和嵌套子查询两者之间的区别

    相关子查询和嵌套子查询两者之间的区别 表的结构如下: mysql> select * from product; +----+------+-------+-----+ | id | name ...

  7. mysql+sql+子查询语句_SQL子查询

    子查询或内部查询或嵌套查询在另一个SQL查询的查询和嵌入式WHERE子句中. 子查询用于返回将被用于在主查询作为条件的数据,以进一步限制要检索的数据. 子查询可以在SELECT,INSERT,UPDA ...

  8. oracle sql 转换成 hive sql -子查询转关联查询(三).子查询中嵌套子查询

    其他sql格式也在更新中,可直接查看俺的这个系列,要是没有你需要的格式,可在评论或私信我,俺现在一天一看 Oracle转换hive 其他sql格式也在更新中,可直接查看俺的这个系列,要是没有你需要的格 ...

  9. MySQL查询语句in子查询的优化

    一.原始in子查询 SELECT * FROM basic_zdjbxx WHERE suiji IN ( SELECT zdcode FROM basic_h WHERE zdcode != &qu ...

最新文章

  1. android之AlertDialog 点击其它区域自己主动消失
  2. HU 3496 Watch The Movie---二维费用
  3. ICCV 2017 《Illuminating Pedestriant via Simultaneous Detection Segmentation》论文笔记
  4. OpenCV3学习笔记二:图像的掩膜操作
  5. redis cli 删除key 模糊_不同操作系统下,Redis的使用命令
  6. 解决SSH登录无响应timed out问题
  7. 在Python中升级灰度图像
  8. 反编译Android APK详细操作指南
  9. flyme7 android彩蛋,魅族 15 系列开启预约,Flyme7 或是发布会彩蛋
  10. R语言 par()函数
  11. 精确的力量:完美SNES仿真器的一个3GHz追求
  12. linux重定向到某目录文件,linux shell中12 21 1file_path重定向语法详解
  13. 一台显示器分成双屏_华硕显示器贴心相伴:云办公、云学习宅家无忧
  14. win10 Abaqus2018 血泪备注
  15. [Transformer]A Survey of Transformers-邱锡鹏
  16. 产业园 电气火灾监控系统的应用
  17. python电影名称词云_Python爬取最近上映的电影评论并生成词云——误杀
  18. 最简单可靠的机房温度电话报警
  19. 互联网行业职位介绍 —— OD、PM、RD、FE、UE、QA、OP、DBA...
  20. 解析eBay BASE模式、去哪儿及蘑菇街分布式架构

热门文章

  1. 任务1:公司员工薪酬
  2. 快手传250亿美元融资利好,有用户有技术,未来可期
  3. 计算机毕业设计Java游戏资讯网站(源码+系统+mysql数据库+Lw文档)
  4. c语言爱心加我爱你,急求一个输入“沈”就能显示“我爱你”然后有一个心型图案的c语言程序代码...
  5. Ubuntu下一个LTS版本20.04代号Focal Fossa,明年4月正式发布
  6. HTTP缓存最详细的两种方法
  7. 这样教育鸡娃,才能考上北大清华
  8. A First Look At Java
  9. Controller注解
  10. 感知机介绍及MATLAB实现