文章目的初衷是希望学习笔记分享给更多的伙伴,并无盈利目的,尊重版权,如有侵犯,请官方工作人员联系博主谢谢。
目录
第1关:内连接查询
任务描述
相关知识
内连接查询
编程要求
测试说明
第2关:外连接查询
任务描述
相关知识
外连接查询
外连接查询的使用
编程要求
第3关:复合条件连接查询
任务描述
相关知识
复合条件连接查询
编程要求
第1关:内连接查询
任务描述
本关任务:使用内连接查询数据表中学生姓名和对应的班级。
相关知识
为了完成本关任务,你需要掌握: 1.什么是内连接查询; 2.如何使用内连接查询。
内连接查询
-
仅将两个表中满足连接条件的行组合起来作为结果集,称为内连接;
-
关键字:
[inner] join ... on
。
语法:
表1 [inner] join 表2 on 表1.字段=表2.字段
语法解释:
从表1中取出每一条记录,去表2中与所有的记录进行匹配,匹配必须是某个条件在表1中与表2中相同,最终才会保留结果,否则不保留。inner 关键字可省略不写;on 表示连接条件:条件字段就是代表相同的业务含义(如下面两张表中的 employee.dept_id 和 department.id),大多数情况下为两张表中的主外键关系。
内连接查询的使用
现在我们有两张表,数据如下: employee
表数据:
id | name | dept_id |
---|---|---|
1 | Nancy | 4 |
2 | Tod | 2 |
3 | Carly | 1 |
4 | Allen | 2 |
5 | Mary | (null) |
department
表数据:
id | name |
---|---|
1 | 开发部 |
2 | 测试部 |
3 | 运维部 |
4 | 销售部 |
现在想要查询出员工姓名以及其对应的部门名称,我们就使用内连接来进行查询。
- 我们可以将关联查询思路分为三步:
1.确定所连接的表,
2.确定所要查询的字段,
3.确定连接条件与连接方式。
其中,没有部门的员工和部门没有员工的部门都没有被查出来,这就是内连接的特点,只查询在连接表中有对应的记录,其中dept.id=emp.dept_id
是连接条件。
编程要求
在右侧编辑器补充代码,查询数据表中学生姓名以及对应的班级名称,将其对应的列名分别另命名为studentName
和className
。
我们为你提供了两张表,内容如下:
tb_student
表数据:
id | name | class_id |
---|---|---|
1 | Emma | 2 |
2 | Mary | 4 |
3 | Allen | (null) |
4 | Kevin | 1 |
5 | Rose | 2 |
6 | James | 1 |
tb_class
表数据:
id | name |
---|---|
1 | 软件1631 |
2 | 软件1632 |
3 | 测试1631 |
4 | 测试1632 |
测试说明
平台会对你编写的代码进行测试:
预期输出:
USE School;
########## 查询数据表中学生姓名和对应的班级 ##########
#请在此处添加实现代码
########## Begin ##########
select tb_student.name as studentName,tb_class.name as className #从学生表中选择学生名字、课程表中选择课程名字
from tb_student join tb_class on tb_class.id = tb_student.class_id;#根据class-id和id相等作为依据,将他们内连接在一起
########## End ##########
第2关:外连接查询
任务描述
本关任务:使用外连接查询数据表中所有班级和对应班级里学生的姓名。
相关知识
为了完成本关任务,你需要掌握: 1.什么是外连接查询; 2.如何使用外连接查询。
外连接查询
-
以某张表为主,取出里面的所有记录,然后每条与另外一张表进行连接,不管能不能匹配上条件,最终都会保留。能匹配,正确保留;不能匹配,其它表的字段都置空(
null
),称为外连接。 -
外连接查询分为左外连接查询和右外连接查询
-
left/right [outer] join ... on
语法:
表1 left/right [outer] join 表2 on 表1.字段=表2.字段
语法解释:
左外连接:在内连接的基础上,还包含表1中所有不符合条件的数据行,并在其中的表2列填写 NULL;
右外连接:在内连接的基础上,还包含表2中所有不符合条件的数据行,并在其中的表1列填写 NULL。
外连接查询的使用
我们仍使用如下两张数据表:
employee
表数据:
id | name | dept_id |
---|---|---|
1 | Nancy | 4 |
2 | Tod | 2 |
3 | Carly | 1 |
4 | Allen | 2 |
5 | Mary | (null) |
department
表数据:
id | name |
---|---|
1 | 开发部 |
2 | 测试部 |
3 | 运维部 |
4 | 销售部 |
例如查询所有员工姓名以及他所在部门,在内连接中Mary
没有被查出,因为他没有对应的部门,现在想把Mary
也查出来,就要使用左外连接。
此查询语句以employee
为主表查询,因此最终记录至少不少于主表已有的记录数。
- 右外连接是同理的,只是基准表的位置变化了而已。
-
我们在这里只是将
left
修改成了right
,但是基准表变化了,是以department
表的数据去匹配employee
表,所以左外连接能做到的查询,右外连接也能做到,仅展现的效果有所不同。虽然左外连接和右外连接有主表差异,但左外连接和右外连接可以互转,如上面的右外连接也等效于如下查询语句,只需将基准表换一下:
编程要求
在右侧编辑器补充代码,分别使用左外连接
和右外连接
查询数据表中所有学生姓名和对应的班级名称,查询结果列分别另命名为studentName
和className
。
我们为你提供了两张表,内容如下:
tb_student
表数据:
id | name | class_id |
---|---|---|
1 | Emma | 2 |
2 | Mary | 4 |
3 | Allen | (null) |
4 | Kevin | 1 |
5 | Rose | 2 |
6 | James | 1 |
tb_class
表数据:
id | name |
---|---|
1 | 软件1631 |
2 | 软件1632 |
3 | 测试1631 |
4 | 测试1632 |
注意:请使用 tb_student 作为左表,tb_class 作为右表。
测试说明
平台会对你编写的代码进行测试:
预期输出:
USE School;
########## 使用左外连接查询所有学生姓名和对应的班级 ##########
#请在此处添加实现代码
########## Begin ##########
#studentName列在左,className列在右
select tb_student.name as studentName,tb_class.name as className
from tb_class right join tb_student #class表右插入student表,student表在左边,以在左边的为name(emma-mary-allen-kevin-rose-james)为优先顺序先排(先放),
#然后将class表根据id号相等后连接
on tb_class.id=tb_student.class_id;
########## End ##########
########## 使用右外连接查询所有学生姓名和对应的班级 ##########
#请在此处添加实现代码
########## Begin ##########
#studentName列在左,className列在右
select tb_student.name as studentName,tb_class.name as className
from tb_class left join tb_student#class表左插入student表,class表在左边,以在左边表的name(1631-1632-1631-1632)为顺序,根据class与student表的id号相等,连接
on tb_class.id=tb_student.class_id;
########## End ##########
第3关:复合条件连接查询
任务描述
本关任务:使用连接查询,查询所有班级里分数在90
分以上的学生的姓名和学生的成绩以及学生所在的班级。
相关知识
为了完成本关任务,你需要掌握:如何编写复合条件连接查询语句。
复合条件连接查询
- 复合条件连接查询,就是在连接查询的过程中,通过添加过滤条件来限制查询结果,使查询结果更加精确。
如下两张数据表:
employee
表数据:
id | name | dept_id | age |
---|---|---|---|
1 | Nancy | 3 | 18 |
2 | Tod | 2 | 22 |
3 | Carly | 1 | 19 |
4 | Allen | 2 | 24 |
department
表数据:
id | name |
---|---|
1 | 开发部 |
2 | 测试部 |
3 | 运维部 |
要求查询员工姓名和所在部门名称,使用内连接查询,将查询结果按照年龄升序排序:
编程要求
在右侧编辑器补充代码,查询所有班级里分数在90
分以上的学生的姓名和学生的成绩以及学生所在的班级,其中学生的姓名和学生所在班级分别另命名为studentName
和className
。
我们为你提供了两张表,内容如下:
tb_student
表数据:
id | name | class_id | score |
---|---|---|---|
1 | Emma | 2 | 89 |
2 | Mary | 4 | 92 |
4 | Kevin | 1 | 76 |
5 | Rose | 3 | 68 |
6 | James | 1 | 99 |
tb_class
表数据:
id | name |
---|---|
1 | 软件1631 |
2 | 软件1632 |
3 | 测试1631 |
4 | 测试1632 |
测试说明
平台会对你编写的代码进行测试:
预期输出:
USE School;
########## 查询所有班级里分数在90分以上的学生的姓名和学生的成绩以及学生所在的班级 ##########
#请在此处添加实现代码
########## Begin ##########
select s1.name as studentName,score,s2.name as className
from tb_student as s1,tb_class as s2
where s1.class_id=s2.id and s1.score>90
order by score desc ;;#order by 默认从小到大,order by + asc 默认从小到大,order by+ desc 默认从大到小
########## End ##########