阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

多表连接查询

378次阅读
没有评论

共计 4815 个字符,预计需要花费 13 分钟才能阅读完成。

连接查询是关系数据库中最主要的查询,主要包括内连接、外连接和交叉连接等。通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,然后通过连接进行查询。

一、多表连接查询概述

1.1、什么是多表查询

连接是在多个表之间通过一定的连接条件,使表之间发生关联,进而能从多个表之间获取数据。

比如:

有一个部门表,有一个员工表,我想查询某部门中的所有员工的信息。这时我们要先找出部门 ID,通过部门 ID 查询出对应的员工信息。

这样我们在查询我们需要的信息的时候就应用了多表。所以这就是我们的多表查询。

1.2、多表查询的作用

比如:

我们想查询员工 A 的名字和他所在的部门的名字,则需要使用多表查询。

那么我们使用一条 SQL 语句查询多张表,因为查询结果在多张不同的表中。而我们的结果要从每张表取 1 列或多列。这就是多表查询的作用。

1.3、多表查询分类

多表查询可以分为二类查询:

** 内连接:** 隐匿内连接、显示内连接

** 外连接:** 左外连接、右外连接

1.4、笛卡尔积现象

1.4.1、数据准备

创建表和数据

# 部门表
create table dept(
id int primary key auto_increment,
name varchar(20)
);
insert into dept (name) values ('研发部'),('渠道部'),('教务部');

# 创建员工表
create table emp (
id int primary key auto_increment,
name varchar(10),
gender char(1), -- 性别
salary double, -- 工资
join_date date, -- 入职日期
dept_id int,
foreign key (dept_id) references dept(id) -- 外键,关联部门表 (部门表的主键) 
);
insert into emp(name,gender,salary,join_date,dept_id) values('张三','男',7200,'2013-02-24',1);
insert into emp(name,gender,salary,join_date,dept_id) values('李四','男',3600,'2010-12-02',2);
insert into emp(name,gender,salary,join_date,dept_id) values('王五','男',9000,'2008-08-08',2);
insert into emp(name,gender,salary,join_date,dept_id) values('赵六','女',5000,'2015-10-07',3);
insert into emp(name,gender,salary,join_date,dept_id) values('吴七','女',4500,'2011-03-14',1);

显示表中数据

mysql> select * from dept;
+----+-----------+
| id | name      |
+----+-----------+
| 1  | 研发部 |
| 2  | 渠道部 |
| 3  | 教务部 |
+----+-----------+
3 行于数据集 (0.01 秒)

mysql> select * from emp;
+----+--------+--------+--------+------------+---------+
| id | name   | gender | salary | join_date  | dept_id |
+----+--------+--------+--------+------------+---------+
| 1  | 张三 | 男    | 7200   | 2013-02-24 | 1       |
| 2  | 李四 | 男    | 3600   | 2010-12-02 | 2       |
| 3  | 王五 | 男    | 9000   | 2008-08-08 | 2       |
| 4  | 赵六 | 女    | 5000   | 2015-10-07 | 3       |
| 5  | 吴七 | 女    | 4500   | 2011-03-14 | 1       |
+----+--------+--------+--------+------------+---------+
5 行于数据集 (0.01 秒)

1.4.2、什么是笛卡尔积

案例:

查询所有员工和所有部门

mysql> select * from emp,dept;

多表连接查询

左表的每条数据和右表的每条数据组合,这种效果就是笛卡尔积

1.4.3、清除笛卡尔积

我们发现笛卡尔积所产生的数据并不是都是有用的,只有员工.dept_id= 部门.id 的值才是我们想要的。

所以我们需要过滤掉没有用的数据。那么如何设置过滤条件呢?

mysql> select * from emp,dept where emp.dept_id=dept.id;
+----+--------+--------+--------+------------+---------+-------+-----------+
| id | name   | gender | salary | join_date  | dept_id | id(2) | name(2)   |
+----+--------+--------+--------+------------+---------+-------+-----------+
| 1  | 张三 | 男    | 7200   | 2013-02-24 | 1       | 1     | 研发部 |
| 5  | 吴七 | 女    | 4500   | 2011-03-14 | 1       | 1     | 研发部 |
| 2  | 李四 | 男    | 3600   | 2010-12-02 | 2       | 2     | 渠道部 |
| 3  | 王五 | 男    | 9000   | 2008-08-08 | 2       | 2     | 渠道部 |
| 4  | 赵六 | 女    | 5000   | 2015-10-07 | 3       | 3     | 教务部 |
+----+--------+--------+--------+------------+---------+-------+-----------+
mysql> select emp.name,dept.name from emp,dept where emp.dept_id=dept.id;
+--------+-----------+
| name   | name(2)   |
+--------+-----------+
| 张三 | 研发部 |
| 吴七 | 研发部 |
| 李四 | 渠道部 |
| 王五 | 渠道部 |
| 赵六 | 教务部 |
+--------+-----------+
5 行于数据集 (0.01 秒)

二、内连接

用左边表的记录去匹配右边表的记录,如果符合条件的则显示。如:从表. 外键 = 主表. 主键

2.1、隐式内连接

看不到 join 关键字,条件使用 where 指定

 格式:select */ 字段列表 from 左表,右表 where 条件表达式;

案例:

查询员工表中所有员工及所在部门

mysql> select * from emp,dept where emp.dept_id=dept.id;
+----+--------+--------+--------+------------+---------+-------+-----------+
| id | name   | gender | salary | join_date  | dept_id | id(2) | name(2)   |
+----+--------+--------+--------+------------+---------+-------+-----------+
| 1  | 张三 | 男    | 7200   | 2013-02-24 | 1       | 1     | 研发部 |
| 5  | 吴七 | 女    | 4500   | 2011-03-14 | 1       | 1     | 研发部 |
| 2  | 李四 | 男    | 3600   | 2010-12-02 | 2       | 2     | 渠道部 |
| 3  | 王五 | 男    | 9000   | 2008-08-08 | 2       | 2     | 渠道部 |
| 4  | 赵六 | 女    | 5000   | 2015-10-07 | 3       | 3     | 教务部 |
+----+--------+--------+--------+------------+---------+-------+-----------+

2.2、显式内连接

使用 inner join…on 语句,可以省略 inner

 格式:select */ 字段列表 from 左表 [inner] join 右表 on 条件表达式;

案例:

查询王五的信息,显示员工 id,姓名,性别,工资和所在的部门名称。

mysql> select emp.id,emp.name,emp.gender,emp.salary,dept.name from emp join dept on emp.dept_id=dept.id where emp.name='王五';
+----+--------+--------+--------+-----------+
| id | name   | gender | salary | name(2)   |
+----+--------+--------+--------+-----------+
| 3  | 王五 | 男    | 9000   | 渠道部 |
+----+--------+--------+--------+-----------+
1 行于数据集 (0.02 秒)

SQL 优化

select emp.id,emp.name,emp.gender,emp.salary,dept.name from emp join dept on emp.dept_id=dept.id where emp.name='王五';
或
select e.id,e.name,e.gender,e.salary,d.name from emp e join dept d on e.dept_id=d.id where e.name='王五';
或
select e.id,e.name,gender,salary,d.name from emp e join dept d on dept_id=d.id where e.name='王五';

2.3、内连接使用步骤

  • 确认查询的数据库表

  • 确认数据库表连接条件

  • 确认数据库表查询条件

  • 确认数据库表显示字段

三、左 / 右连接

3.1、左连接

使用 left outer join…on,outer 可以省略

 格式:select */ 字段列表 from 左表 left [outer] join 右表 on 条件表达式;

用左边表的记录去匹配右边表的记录,如果符合条件的则显示;否则,显示 NULL

案例:

在部门表中增加一个部门

mysql> insert into dept(name) values('执行部');
Query OK, 1 rows affected (0.08 秒)

用内连接查询信息

mysql> select * from dept d inner join emp e on d.id=e.dept_id;

多表连接查询

用左连接查询信息

mysql> select * from dept d left join emp e on d.id=e.dept_id;

多表连接查询

注意:

左连接表示的是在内连接的基础上保证左表的信息全部显示

3.2、右连接

使用 right outer join…on,outer 可以省略

 格式:select */ 字段列表 from 左表 right [outer] join 右表 on 条件表达式;

用右边表的记录去匹配左边表的记录,如果符合条件的则显示;否则,显示 NULL

案例:

在员工表中加入一个新员工

mysql> insert into emp values (null, '王一','男',6666,'2013-12-05',null);
Query OK, 1 rows affected (0.02 秒)

用内连接查询信息

mysql> select * from dept d inner join emp e on d.id=e.dept_id;

多表连接查询

用右连接查询信息

mysql> select * from dept d right join emp e on d.id=e.dept_id;

多表连接查询

注意:

右连接表示的是在内连接的基础上保证右表的信息全部显示

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-06-09发表,共计4815字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19350
评论数
4
阅读量
7964835
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
300元就能买到的”小钢炮”?惠普7L四盘位小主机解析

300元就能买到的”小钢炮”?惠普7L四盘位小主机解析

  300 元就能买到的 ” 小钢炮 ”?惠普 7L 四盘位小主机解析 最近...
支付宝、淘宝、闲鱼又双叕崩了,Cloudflare也瘫了连监控都挂,根因藏在哪?

支付宝、淘宝、闲鱼又双叕崩了,Cloudflare也瘫了连监控都挂,根因藏在哪?

支付宝、淘宝、闲鱼又双叕崩了,Cloudflare 也瘫了连监控都挂,根因藏在哪? 最近两天的互联网堪称“故障...
多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞...
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸 前言 作为天天跟架构图、拓扑图死磕的...
星哥带你玩飞牛NAS-16:不再错过公众号更新,飞牛NAS搭建RSS

星哥带你玩飞牛NAS-16:不再错过公众号更新,飞牛NAS搭建RSS

  星哥带你玩飞牛 NAS-16:不再错过公众号更新,飞牛 NAS 搭建 RSS 对于经常关注多个微...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸 前言 作为天天跟架构图、拓扑图死磕的...
开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

  开源 MoneyPrinterTurbo 利用 AI 大模型,一键生成高清短视频! 在短视频内容...
零成本上线!用 Hugging Face免费服务器+Docker 快速部署HertzBeat 监控平台

零成本上线!用 Hugging Face免费服务器+Docker 快速部署HertzBeat 监控平台

零成本上线!用 Hugging Face 免费服务器 +Docker 快速部署 HertzBeat 监控平台 ...
自己手撸一个AI智能体—跟创业大佬对话

自己手撸一个AI智能体—跟创业大佬对话

自己手撸一个 AI 智能体 — 跟创业大佬对话 前言 智能体(Agent)已经成为创业者和技术人绕...
多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞...