MySQL数据库 - 连接查询和子查询

目录

第1关:内连接查询

任务描述

相关知识

内连接查询

内连接查询的使用

编程要求

答案:

第2关:外连接查询

任务描述

相关知识

外连接查询

外连接查询的使用

编程要求

答案: 

第3关:关键字子查询 

任务描述

相关知识

ALL关键字

ANY和SOME关键字

IN关键字

编程要求

答案: 


第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
答案:
USE School;

########## 查询数据表中学生姓名和对应的班级 ##########
#请在此处添加实现代码
########## Begin ##########

SELECT s.name AS studentName, c.name AS className
FROM tb_student AS s
JOIN tb_class AS c ON s.class_id = c.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
答案: 
USE School;

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

#请在此处添加实现代码
########## Begin ##########

SELECT s.name AS studentName, c.name AS className
FROM tb_student AS s
LEFT JOIN tb_class AS c ON s.class_id = c.id;

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

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

#请在此处添加实现代码
########## Begin ##########

SELECT s.name AS studentName, c.name AS className
FROM tb_student AS s
RIGHT JOIN tb_class AS c ON s.class_id = c.id;

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

第3关:关键字子查询 

任务描述

本关任务:根据要求使用关键字进行查询。

相关知识

由于列子查询返回的结果集是 N 行一列,因此不能直接使用 =><>=<=<>这些比较标量结果的操作符。在列子查询中可以使用 ALLANYSOMEIN关键字操作符。

为了完成本关任务,你需要掌握:如何在子查询中使用关键字进行查询。

ALL关键字

ALL必须接在一个比较运算符的后面,表示与子查询返回的所有值比较都为 TRUE则返回TRUE

table1表数据:

col1
2
10

table2表数据:

col2
5
12
20

举个例子:

SELECT col1 FROM table1 WHERE col1 > ALL (SELECT col2 FROM table2)

该查询语句不会返回任何结果,因为col1中没有比col2所有值都大的值。

ANYSOME关键字

ANY与比较操作符联合使用,表示与子查询返回的任何值比较为TRUE ,则返回TRUESOMEANY的别名,一般用的比较少。

仍使用上面二张表的数据:

在子查询中,返回的是table2的所有col2列的结果(5,12,20),然后将table1col1的值与之进行比较,只要大于col2的任何值则为TRUE,因此查询结果为10

IN关键字

IN的意思就是指定的一个值是否在这个集合中,如果在就返回TRUE;否则就返回FALSE了,同IN(项1,项2,...);

IN= ANY 的别名,二者相同,但 NOT IN 的别名却不是 <> ANY 而是 <> SOME

编程要求

我们为你提供了如下数据表: tb_salary表数据:

idpositionsalary
1Java8000
2Java8400
3Java9000
4Python6500
5Python10000

根据提供的数据,在右侧编辑器中补充代码:

查询薪资表中比Java最高工资高的所有员工职位名称和薪资;

查询薪资表中比Java最低工资高的所有员工职位名称和薪资;

查询薪资表中职位为Java的所有员工职位名称和薪资。

答案: 
USE Company;
#请在此处添加实现代码
########## Begin ##########
########## 查询薪资表中比Java最高工资高的所有员工职位名称和薪资 ##########
#1.使用 ALL 关键字进行查询

SELECT position, salary
FROM tb_salary
WHERE salary > (SELECT MAX(salary) FROM tb_salary WHERE position = 'Java')
ORDER BY position;

#2.使用 ANY 关键字进行查询

SELECT position, salary
FROM tb_salary
WHERE salary > (SELECT MIN(salary) FROM tb_salary WHERE position = 'Java')
ORDER BY position;

#3.使用 IN 关键字进行查询

SELECT position, salary
FROM tb_salary
WHERE position = 'Java';

########## End ##########
  • 32
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星与星熙.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值