网站首页 > 知识剖析 正文
【题目】
现在有两个表,“学生表”记录了学生的基本信息,有“学号”、“姓名”。
“成绩”表记录了学生选修的课程,以及对应课程的成绩。
这两个表通过“学号”进行关联。
现在要查找出所有学生的学号,姓名,课程和成绩。
【解题思路】
1.确定查询结果
题目要求查询所有学生的姓名,学号,课程和成绩信息
select 学号,姓名,课程,成绩
查询结果的列名“学号”、“姓名”,在“学生”表里,列名“课程”、“成绩”在“成绩”表里,所以需要进行多表查询。
2.哪种联结呢?
涉及到多表查询,在之前的课程《从零学会sql:多表查询》里讲过需要用到联结。
多表的联结又分为以下几种类型:
1)左联结(left join),联结结果保留左表的全部数据
2)右联结(right join),联结结果保留右表的全部数据
3)内联结(inner join),取两表的公共数据
这个题目里要求“所有学生”,而“所有学生”在“学生”表里。为什么不在“成绩”表里呢?
如果有的学生没有选修课程,那么他就不会出现在“成绩”表里,所以“成绩”表没有包含“所有学生”。
所以要以“学生”表进行左联结,保留左边表(学生表)里的全部数据。
from 学生信息表 as a left join 成绩表 as b
3.两个表联结条件是什么?
两个表都有“学号”,所以联结条件为学号。
on a.学号=b.学号
4.最终sql
select a.学号,a.姓名,b.课程,b.成绩from 学生 as aleft join 成绩 as bon a.学号=b.学号;
运行结果:我们看到学号4都课程为空值,表示这名学生没有选修课程。
【本题考点】
考察多表联结,以及如何选择联结的类型。记住课程里讲过的下面这张图,遇到多表联结的时候从这张图选择对于的sql。
【举一反三】
有下面两个表
编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:
FirstName, LastName, City, State
【思路】
从表的结构可以看出,表1(Person)是人的姓名信息,表2(Address)是人的地址信息。
1)查询结果是两个表里的列名,所以需要多表查询
2)考虑到有的人可能没有地址信息,要是查询结构要查所有人,需要保留表1(Person)里的全部数据,所以用左联结(left join)
3)两个表联结条件:两个表通过personId产生联结。
【参考答案】
select FirstName, LastName, City, Statefrom Person left join Addresson Person.PersonId = Address.PersonId
推荐:如何提升你的分析技能,实现升职加薪?
猜你喜欢
- 2025-05-11 产品切换数据库问题处理总结(切换数据库的命令是什么)
- 2025-05-11 真正让你明白Hive参数调优系列1:控制map个数与性能调优参数
- 2025-05-11 拉链表(拉链表取数)
- 2025-05-11 常见的数据库类型有哪些 & SQL介绍
- 2025-05-11 每日SQL自学知识点(第八天)—多表查询详解
- 2025-05-11 大厂必问:MySQL 三表 JOIN 操作的解析与性能优化,效率又如何?
- 2025-05-11 数据库(数据库有哪些)
- 2025-05-11 干货!SQL性能优化,书写高质量SQL语句
- 2025-05-11 Linq 下的扩展方法太少了,MoreLinq 来啦
- 2025-05-11 mysql学习3:select基础---单表查询
- 最近发表
- 标签列表
-
- xml (46)
- css animation (57)
- array_slice (60)
- htmlspecialchars (54)
- position: absolute (54)
- datediff函数 (47)
- array_pop (49)
- jsmap (52)
- toggleclass (43)
- console.time (63)
- .sql (41)
- ahref (40)
- js json.parse (59)
- html复选框 (60)
- css 透明 (44)
- css 颜色 (47)
- php replace (41)
- css nth-child (48)
- min-height (40)
- xml schema (44)
- css 最后一个元素 (46)
- location.origin (44)
- table border (49)
- html tr (40)
- video controls (49)