MySQL数据库 - 连接查询

第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表数据:

idnamedept_id
1Nancy4
2Tod2
3Carly1
4Allen2
5Mary(null)

department表数据:

idname
1开发部
2测试部
3运维部
4销售部

现在想要查询出员工姓名以及其对应的部门名称,我们就使用内连接来进行查询。

  • 我们可以将关联查询思路分为三步:

1.确定所连接的表, 2.确定所要查询的字段, 3.确定连接条件与连接方式。

在这里插入图片描述

其中,没有部门的员工和部门没有员工的部门都没有被查出来,这就是内连接的特点,只查询在连接表中有对应的记录,其中dept.id=emp.dept_id是连接条件。

编程要求

在右侧编辑器补充代码,查询数据表中学生姓名以及对应的班级名称,将其对应的列名分别另命名为studentNameclassName

我们为你提供了两张表,内容如下:

tb_student表数据:

idnameclass_id
1Emma2
2Mary4
3Allen(null)
4Kevin1
5Rose2
6James1

tb_class表数据:

idname
1软件1631
2软件1632
3测试1631
4测试1632
测试说明

平台会对你编写的代码进行测试:

预期输出:

 studentName    className    
 Kevin       软件1631    
 James       软件1631    
 Emma        软件1632    
 Rose        软件1632    
 Mary        测试1632

开始你的任务吧,祝你成功!

USE School;

########## 查询数据表中学生姓名和对应的班级 ##########
#请在此处添加实现代码
########## Begin ##########
select stu.name as studentName,cla.name as className 
from tb_student as stu join tb_class as cla
on stu.class_id=cla.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表数据:

idnamedept_id
1Nancy4
2Tod2
3Carly1
4Allen2
5Mary(null)

department表数据:

idname
1开发部
2测试部
3运维部
4销售部

例如查询所有员工姓名以及他所在部门,在内连接Mary没有被查出,因为他没有对应的部门,现在想把Mary也查出来,就要使用左外连接

在这里插入图片描述

此查询语句以employee为主表查询,因此最终记录至少不少于主表已有的记录数。

  • 右外连接是同理的,只是基准表的位置变化了而已。

在这里插入图片描述

我们在这里只是将left修改成了right,但是基准表变化了,是以department表的数据去匹配employee表,所以左外连接能做到的查询,右外连接也能做到,仅展现的效果有所不同。

虽然左外连接和右外连接有主表差异,但左外连接和右外连接可以互转,如上面的右外连接也等效于如下查询语句,只需将基准表换一下:

在这里插入图片描述

编程要求

在右侧编辑器补充代码,分别使用左外连接右外连接查询数据表中所有学生姓名和对应的班级名称,查询结果列分别另命名为studentNameclassName

我们为你提供了两张表,内容如下:

tb_student表数据:

idnameclass_id
1Emma2
2Mary4
3Allen(null)
4Kevin1
5Rose2
6James1

tb_class表数据:

idname
1软件1631
2软件1632
3测试1631
4测试1632

注意:请使用 tb_student 作为左表,tb_class 作为右表。

测试说明

平台会对你编写的代码进行测试:

预期输出:

studentName    className
Emma    软件1632
Mary    测试1632
Allen    NULL
Kevin    软件1631
Rose    软件1632
James    软件1631
studentName    className
Kevin    软件1631
James    软件1631
Emma    软件1632
Rose    软件1632
NULL    测试1631
Mary    测试1632

开始你的任务吧,祝你成功!

USE School;

########## 使用左外连接查询所有学生姓名和对应的班级 ##########

#请在此处添加实现代码
########## Begin ##########
select stu.name as studentName,cla.name as className 
from tb_student as stu left join tb_class as cla
on stu.class_id=cla.id;



########## End ##########

########## 使用右外连接查询所有学生姓名和对应的班级 ##########

#请在此处添加实现代码
########## Begin ##########
select stu.name as studentName,cla.name as className 
from tb_student as stu right join tb_class as cla
on stu.class_id=cla.id;



########## End ##########

第3关:复合条件连接查询

任务描述

本关任务:使用连接查询,查询所有班级里分数在90分以上的学生的姓名和学生的成绩以及学生所在的班级。

相关知识

为了完成本关任务,你需要掌握:如何编写复合条件连接查询语句。

复合条件连接查询
  • 复合条件连接查询,就是在连接查询的过程中,通过添加过滤条件来限制查询结果,使查询结果更加精确。

如下两张数据表:

employee表数据:

idnamedept_idage
1Nancy318
2Tod222
3Carly119
4Allen224

department表数据:

idname
1开发部
2测试部
3运维部

要求查询员工姓名和所在部门名称,使用内连接查询,将查询结果按照年龄升序排序:

在这里插入图片描述

编程要求

在右侧编辑器补充代码,查询所有班级里分数在90分以上的学生的姓名和学生的成绩以及学生所在的班级,其中学生的姓名和学生所在班级分别另命名为studentNameclassName

我们为你提供了两张表,内容如下:

tb_student表数据:

idnameclass_idscore
1Emma289
2Mary492
4Kevin176
5Rose368
6James199

tb_class表数据:

idname
1软件1631
2软件1632
3测试1631
4测试1632
测试说明

平台会对你编写的代码进行测试:

预期输出:

studentName    score    className   
James        99       软件1631   
Mary         92       测试1632

开始你的任务吧,祝你成功!

USE School;

########## 查询所有班级里分数在90分以上的学生的姓名和学生的成绩以及学生所在的班级 ##########
#请在此处添加实现代码
########## Begin ##########
select stu.name as studentName,stu.score,cla.name as className 
from tb_student as stu
join tb_class as cla
on stu.class_id=cla.id
having score>=90
order by score desc;



########## End ##########


本文仅供学习

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值