MySQL内连接、外连接及SQL JOINS的实现方法是什么

1. 内连接

内连接:合并具有同一列的两个以上的表的行,结果集中包含一个表与另一个表匹配的行。

说人话就是,查询结果只包含它们匹配的行,不匹配的就不要了。

MySQL内连接、外连接及SQL JOINS的实现方法是什么

【例子】查询员工编号 employee_id 和其对应的部门名称 department_name 。其中部门名称 department_name 只在部门表 departments 中,部门表 departments 如下图所示:

MySQL内连接、外连接及SQL JOINS的实现方法是什么

员工表 employees 和部门表 departments 通过部门编号 department_id 匹配连接起来。查询代码如下所示:

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`FROM employees emp, departments deptWHERE emp.`department_id` = dept.`department_id`;

查询结果:

MySQL内连接、外连接及SQL JOINS的实现方法是什么

这里返回了 106 条记录,但员工表 employees 总共是有107条记录的,还少了 1 个人。原因是在员工表 employees 中,有一个员工的部门编号 department_id 为 (NULL) ,如下图所示:

MySQL内连接、外连接及SQL JOINS的实现方法是什么

而部门表 departments 中却没有值为 (NULL) 的部门编号 department_id ,因此这一行不匹配的数据就被丢弃不显示了。如下图所示,内连接只包含两个表匹配的行,即下图中两圆相交的部分:

MySQL内连接、外连接及SQL JOINS的实现方法是什么

这种连接方式称作内连接。

2.外连接

外连接:合并具有同一列的两个以上的表的行,结果集中除了包含一个表与另一个表匹配的行之外,还查询到了左表或右表中不匹配的行。

外连接又分为以下三类:

左外连接:

两个表在连接过程中除了返回满足连接条件的行以外,还返回表中不满足条件的行。如下图中,左外连接就是左边一整个圆。

MySQL内连接、外连接及SQL JOINS的实现方法是什么

右外连接:

两个表在连接过程中除了返回满足连接条件的行以外,还返回表中不满足条件的行。如下图中,右外连接就是右边一整个圆。

MySQL内连接、外连接及SQL JOINS的实现方法是什么

满外连接:

在表连接过程中,除了返回符合连接条件的行之外,还会返回左表和右表中不符合条件的行。如下图中,满外连接就是两个圆所有部分。

MySQL内连接、外连接及SQL JOINS的实现方法是什么

【例子】根据部门编号 department_id ,查询员工表 employees 中的所有员工编号 employee_id 和部门表 departments 中其对应的部门名称 department_name

【分析】凡是题目中出现要求查询 所有 的字眼时,都要打起十二分精神,这说明需要我们使用外连接查询。实现外连接可使用SQL92和SQL99两种语法,详见[5.9 常用的SQL标准](# 5.9 常用的SQL标准) 。由于左表员工表 employees 共有 107 条数据,而右表和左表匹配的数据仅有106条,需要使用左外连接。

【SQL92语法实现外连接】使用 (+)

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`FROM employees emp, departments deptWHERE emp.`department_id` = dept.`department_id`(+);

查询结果:报错

MySQL内连接、外连接及SQL JOINS的实现方法是什么

这是因为MySQL不支持SQL92语法的外连接操作。但是Oracle是支持的。所以没有白学。MySQL只支持SQL99语法来实现多表查询。
 

3. SQL99语法实现多表查询

SQL99是指SQL在1999年颁布的SQL语法标准规范。尽管在之后发布了一系列新的SQL标准,但在学习MySQL的过程中,主要掌握SQL99和SQL92就已经足够。从这节开始,MySQL的学习就算翻了半篇了,因为这一节之前都是SQL92语法,从这节开始,就专为SQL99语法。

SQL99语法使用 JOIN...ON 的方式实现多表查询,且可以同时实现内连接和三种外连接。MySQL是支持这种方式的。

3.1 SQL99实现内连接

【例子:三表查询】查询员工的员工编号 employee_id 、 姓名 last_name 、部门名称 department_name 和所在城市 city

【分析】这个需求需要 3 张表共同查询。

MySQL内连接、外连接及SQL JOINS的实现方法是什么

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`, loc.`city`FROM employees emp JOIN departments deptON emp.`department_id` = dept.`department_id`JOIN locations locON dept.`location_id` = loc.`location_id`;

SQL99语法就是加一张表,就 JOIN 一张表,并在 ON 后加连接条件。注意,这里的 JOIN 前面还省略了表示内连接的关键字 INNER ,在使用内连接时可以忽略。即代码还可以写成完整形式:

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`, loc.`city`FROM employees emp INNER JOIN departments deptON emp.`department_id` = dept.`department_id`JOIN locations locON dept.`location_id` = loc.`location_id`;

查询结果:

MySQL内连接、外连接及SQL JOINS的实现方法是什么

3.2 SQL99语法实现外连接

3.2.1 左外连接

【例子】根据部门编号 department_id ,查询员工表 employees 中的所有员工编号 employee_id 和部门表 departments 中其对应的部门名称 department_name

【分析】由于左表是员工表 employees ,有107条数据;而右表是部门表 departments ,有27条数据。题目要求是返回所有员工的107条查询结果,因此这里使用左外连接。SQL99实现左连接接很简单,只需要在 JOIN 前加上两个关键字 LEFT OUTER 即可表示左外连接。如下代码所示:

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`FROM employees emp LEFT OUTER JOIN departments deptON emp.`department_id` = dept.`department_id`;

其中,OUTER 可以省略,即写成:

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`FROM employees emp LEFT JOIN departments deptON emp.`department_id` = dept.`department_id`;

查询结果:

MySQL内连接、外连接及SQL JOINS的实现方法是什么

3.2.2 右外连接

举一反三地,右外连接就是在 OUTER JOIN 前加一个关键字 RIGHT

SELECT emp.`employeed/master/img/d`;

查询结果:

MySQL内连接、外连接及SQL JOINS的实现方法是什么

查询结果有122条记录,这怎么解释呢?再回想一下右外连接的定义:

两个表在连接过程中除了返回满足连接条件的行以外,还返回表中不满足条件的行。如下图中,右外连接就是右边一整个圆。

MySQL内连接、外连接及SQL JOINS的实现方法是什么

就不难理解,因为右表部是没有人的。而左、右表匹配的数据有106条 (两圆相交部分) ,因此一共就有 106 + 16 = 122 106+16=122 106+16=122 条记录。如下图所示:

MySQL内连接、外连接及SQL JOINS的实现方法是什么

这个例子能更好地帮助我们理解右外连接。

3.2.3 满外连接

举一反三地,满外连接就是在 OUTER JOIN 前加一个关键字 FULL 。但很不幸,MySQL不支持SQL99的满外连接语法,Oracle是支持的。

我们需要使用别的方法实现MySQL中的满外连接,详见4.6 满外连接 。

4.总结:七种SQL JOINS的实现

在开始本节之前,需要您了解SQL的 UNIONUNION ALL 的定义和实现。如果需要了解,可以阅读这篇博文:《MySQL中 UNION 并的使用》。

4.1 内连接

根据部门编号 department_id ,查询员工表 employees 中的员工编号 employee_id 和部门表 departments 中其对应的部门名称 department_name

MySQL内连接、外连接及SQL JOINS的实现方法是什么

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`FROM employees emp JOIN departments deptON emp.`department_id` = dept.`department_id`;

查询结果:

MySQL内连接、外连接及SQL JOINS的实现方法是什么

4.2 左外连接

MySQL内连接、外连接及SQL JOINS的实现方法是什么

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`FROM employees emp LEFT OUTER JOIN departments deptON emp.`department_id` = dept.`department_id`;

查询结果:

MySQL内连接、外连接及SQL JOINS的实现方法是什么

4.3 右外连接

MySQL内连接、外连接及SQL JOINS的实现方法是什么

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`FROM employees emp RIGHT OUTER JOIN departments deptON emp.`department_id` = dept.`department_id`;

MySQL内连接、外连接及SQL JOINS的实现方法是什么

4.4 第四种JOIN

MySQL内连接、外连接及SQL JOINS的实现方法是什么

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`FROM employees emp LEFT OUTER JOIN departments deptON emp.`department_id` = dept.`department_id`WHERE dept.`department_id` IS NULL;

查询结果:

MySQL内连接、外连接及SQL JOINS的实现方法是什么

作用是把员工表 employees 中,部门编号 department_id 为 (NULL) 的那一个员工查询出来了,如下图所示:

MySQL内连接、外连接及SQL JOINS的实现方法是什么

4.5 第五种JOIN

MySQL内连接、外连接及SQL JOINS的实现方法是什么

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`, emp.`department_id`FROM employees emp RIGHT OUTER JOIN departments deptON emp.`department_id` = dept.`department_id`WHERE emp.`department_id` IS NULL;

查询结果:

MySQL内连接、外连接及SQL JOINS的实现方法是什么

4.6 满外连接

由于MySQL不支持SQL99语法的满外连接。因此,我们的实现方式就是求

4.2 左外连接 和 4.5 第五种JOIN 的并 UNION ALL 即可;或者求4.3 右外连接 和 4.4 第四种JOIN 的并 UNION ALL 也行,都是一样的效果。

方法一

MySQL内连接、外连接及SQL JOINS的实现方法是什么

MySQL内连接、外连接及SQL JOINS的实现方法是什么

方法二

MySQL内连接、外连接及SQL JOINS的实现方法是什么

MySQL内连接、外连接及SQL JOINS的实现方法是什么

MySQL内连接、外连接及SQL JOINS的实现方法是什么

# 方法一SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`FROM employees emp LEFT OUTER JOIN departments deptON emp.`department_id` = dept.`department_id`UNION ALLSELECT emp.`employee_id`, emp.`last_name`, dept.`department_id`FROM employees emp RIGHT OUTER JOIN departments deptON emp.`department_id` = dept.`department_id`WHERE emp.`department_id` IS NULL;# 方法二SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`FROM employees emp RIGHT OUTER JOIN departments deptON emp.`employee_id` = dept.`department_id`UNION ALLSELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`FROM employees emp LEFT OUTER JOIN departments deptON emp.`employee_id` = dept.`department_id`WHERE dept.`department_id` IS NULL;

查询结果:

MySQL内连接、外连接及SQL JOINS的实现方法是什么

4.7 第七种JOIN

实现下面这个操作只需要把 4.4 第四种JOIN 和 4.5 第五种JOIN 求 UNION ALL 即可。

MySQL内连接、外连接及SQL JOINS的实现方法是什么

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`FROM employees emp LEFT OUTER JOIN departments deptON emp.`department_id` = dept.`department_id`WHERE dept.`department_id` IS NULLUNION ALLSELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`FROM employees emp RIGHT OUTER JOIN departments deptON emp.`department_id` = dept.`department_id`WHERE emp.`department_id` IS NULL;

查询结果:

MySQL内连接、外连接及SQL JOINS的实现方法是什么

以上就是MySQL内连接、外连接及SQL JOINS的实现方法是什么的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/155013.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Win10 Edge浏览器调整InPrivate 隐私浏览界面
上一篇 2025年12月4日 07:52:01
电脑硬盘数据如何恢复 3种方法自己也可解决
下一篇 2025年12月4日 07:59:43

相关推荐

  • hive和mysql的区别是什么

    区别:1、Mysql采用了SQL语言,Hive采用了类SQL的查询语言HQL。2、Hive不支持数据的改写和添加,Mysql支持。3、Hive无索引,MySQL有索引。4、Hive底层是MarReduce,MySQL底层是执行引擎。 本教程操作环境:windows7系统、mysql8版本、Dell …

    2026年9月6日
    000
  • linux下如何部署php项目?

    linux下如何部署php项目?linux下如何部署php项目?linux下如何部署php项目?linux下如何部署php项目?

    linux下部署php项目环境可以分为两种,一种使用apache,php,mysql的压缩包安装,一种用yum命令进行安装。 使用三种软件的压缩包进行安装,需要手动配置三者之间的关系。apache和php之间的配置没有什么难度,但是和mysql进行配置的时候就需要对php的了解了。 以下是用yum在…

    2026年9月6日 用户投稿
    400
  • MySQL如何处理长文本字段_性能和存储空间的权衡?

    MySQL如何处理长文本字段_性能和存储空间的权衡?MySQL如何处理长文本字段_性能和存储空间的权衡?MySQL如何处理长文本字段_性能和存储空间的权衡?MySQL如何处理长文本字段_性能和存储空间的权衡?

    varchar适合较短文本,text系列适合大文本;长文本字段影响查询性能和内存资源;解决办法包括拆分到扩展表、避免text索引、使用搜索引擎;存储引擎建议用innodb并设置dynamic行格式;全文检索可用外部工具优化性能。mysql处理长文本时需根据字段长度选择varchar或text类型,v…

    2026年9月6日 用户投稿
    200
  • mysql环境变量如何配置

    mysql环境变量如何配置mysql环境变量如何配置mysql环境变量如何配置mysql环境变量如何配置

    mysql环境变量的配置方法:1、找到C盘中的MySQL安装路径;2、在“我的电脑”中,依次点击“系统属性”-“高级系统设置”选项;3、在“环境变量”弹窗中,依次点击“高级”-“系统变量”;4、找到path路径,点击“编辑”选项,将MySQL安装路径填入即可。 本教程操作环境:windo…

    2026年9月6日 用户投稿
    000
  • mysql练习之2:运算符的使用

    案例:创建数据表tmp15,其中包含varchar类型的字段note和int类型的字段price。 使用运算符对表tmp15中不同的字段进行运算。使用逻辑操作符对数据进行逻辑操作。 使用位操作符对数据进行位操作。 (免费学习推荐:mysql视频教程) 首先创建tmp15表,插入一条记录,note值为…

    2026年9月6日
    100
  • MySQL数据查询之连接查询

    连接关系是关系数据库模型的主要特点。也是最主要的查询,主要包括内连接、外连接等。通过连接运算符可以实现多个表查询。在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当查询数据时,通过连接操作查询出存放在多个表中不同实体的信息。当两个或多个表中存在相同意义…

    2026年9月5日
    100
  • MySQL字段默认值设置与约束控制_Sublime一键生成标准规范建表语句

    MySQL字段默认值设置与约束控制_Sublime一键生成标准规范建表语句MySQL字段默认值设置与约束控制_Sublime一键生成标准规范建表语句MySQL字段默认值设置与约束控制_Sublime一键生成标准规范建表语句MySQL字段默认值设置与约束控制_Sublime一键生成标准规范建表语句

    如何在mysql中设置字段的默认值?使用default关键字指定常量值或current_timestamp。例如:age int default 0或created_at timestamp default current_timestamp,但default值必须为常量表达式,不能是函数或变量;若…

    2026年9月5日 用户投稿
    100
  • MySQL数据查询之子查询

    子查询是指一个查询语句嵌套在另一个查询语句内部的查询。在select子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或者多个表。 子查询中常用的操作符有any(some)、all、in、exists。子查询可以添加到select、update和delete语句中,而且可…

    2026年9月5日
    100
  • MySQL查询数据之合并查询结果

    . 利用union关键字,可以给出多条select语句,并将它们的结果组合成单个结果集。合并时,两个表对应的列数和数据类型必须相同。各个select语句之间使用union或union all 关键字分隔。union不使用关键字all,执行的时候删除重复的记录,所有返回的行都是唯一的;使用关键字all…

    2026年9月5日
    100
  • MySQL查询函数之 为表和字段取别名

    目录: (1)为表取别名 (2)为字段取别名 (免费学习推荐:mysql视频教程) (1)、为表取别名 当表名字很长或者执行一些特殊查询时,为了方便操作或者需要多次使用相同的表时,可以为表指定别名,用这个别名代替原来的名称。为表取别名的基本语法格式为: 表名 [as] 表别名 “表名&#…

    2026年9月5日
    200
  • 数据库怎么删除表

    在数据库中,可以使用“DROP TABLE”语句来删除一个或多个数据表,具体语法“DROP TABLE [IF EXISTS] 表名1 [ ,表名2, 表名3 …]”,其中“IF EXISTS”是用于在删除数据表之前判断该表是否存在。 本教程操作环境:windows7系统、mysql8版…

    2026年9月5日
    100
  • 数据库字段包含多个日期值,如何用SQL查询特定日期范围内的记录?

    SQL查询:多日期字段的范围筛选 数据库表中,当某个字段包含多个日期值时,如何用SQL语句高效筛选特定日期范围内的记录?本文提供解决方案。 场景示例: 假设字段realstarttime可能包含多个日期值,例如:”2022-09-14 11:38:21,2022-09-14 18:00:…

    2026年9月5日
    200
  • 数据库怎么增加表中字段

    增加表中字段的方法:1、使用“ALTER TABLE 表名 ADD 新字段名 数据类型;”语句在末尾添加字段;2、使用“ALTER TABLE 表名 ADD 新字段名 数据类型 FIRST;”语句在开头添加字段;3、使用“ALTER TABLE 表名 ADD 新字段名 数据类型 [约束条件] AFT…

    2026年9月5日
    100
  • 怎么删除数据表中数据

    方法:1、使用DELETE语句,可删除表的一行或多行数据,语法“DELETE FROM 表名 [WHERE子句]”;如果省略“WHERE子句”,则可删除表中全部数据。2、使用“TRUNCATE TABLE 表名;”语句,可删除表中全部数据。 本教程操作环境:windows7系统、mysql8版本、D…

    2026年9月5日
    100
  • decimal是什么类型

    decimal是MySQL中存在的精准数据类型,语法格式“DECIMAL(M,D)”。其中,M是数字的最大数(精度),其范围为“1~65”,默认值是10;D是小数点右侧数字的数目(标度),其范围是“0~30”,但不得超过M。 本教程操作环境:windows7系统、mysql8版本、Dell G3电脑…

    2026年9月5日
    100
  • 如何对MySQL数据库中表的数据进行更新

    本文主要是带您了解并使用mysql update 语句用于数据库的表中已存在的记录,进行更新。 Update语句的基本语法: UPDATE SET 字段 1=值 1 [,字段 2=值 2… ] [WHERE 子句 ][ORDER BY 子句] [LIMIT 子句] :用于指定要更新的表名称。 SET…

    用户投稿 2026年9月5日
    100
  • 如何在MySQL数据库中创建新表

    create table语法: CREATE TABLE [IF NOT EXISTS] table_name( column_list) engine=table_type; [IF NOT EXISTS]主要是用于判定新建的表是否存在 engine需要指定存储引擎。可以使用任何存储引擎,如:In…

    用户投稿 2026年9月5日
    200
  • MySQL如何实现分布式数据库架构_解决方案有哪些?

    MySQL如何实现分布式数据库架构_解决方案有哪些?MySQL如何实现分布式数据库架构_解决方案有哪些?MySQL如何实现分布式数据库架构_解决方案有哪些?MySQL如何实现分布式数据库架构_解决方案有哪些?

    mysql实现分布式架构的核心在于解决单机数据库的性能瓶颈、存储限制及高可用性问题,主要通过以下策略:1. 分库分表(sharding)突破存储与并发限制,但需面对分片键选择、跨分片查询、分布式事务等挑战;2. 读写分离与高可用复制提升读并发能力并提供数据备份,但存在主从同步延迟与故障切换问题;3.…

    2026年9月5日 用户投稿
    300
  • 熟悉MySQL索引

    一、索引简介(1)索引的含义和特定 (2)索引的分类 (3)索引的设计原则 二、创建索引(1)创建表的时候创建索引 (2)在已经存在的表上创建索引 (3)删除索引 (免费学习推荐:mysql视频教程) 一、索引简介 索引用于快速找出在某列中有一特定值的行。不使用索引,MySQL必须从第1条记录开始读…

    2026年9月5日
    100
  • 三分钟带你了解mysql数据类型

    我们想要学好数据库,首先要了解其支持的数据类型。mysql支持所有标准的sql数据类型,包括三类:数值型,日期型,字符串型。下面跟着小编一起去学习吧。 一、数值型 数值型包括整数类型、定点类型、浮点类型、位值类型,我们先来看看整数型。 整数类型 其中我们最为常用的就是INT 定点类型 DECIMAL…

    2026年9月5日
    100

发表回复

登录后才能评论
关注微信