MySQL 外连接语法之 OUTER JOIN

MySQL 外连接语法--案例 --学习笔记

Posted in MySQL onApril 09, 2022

前言

外连接可以分为左外连接和右外连接

左外连接: 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行

右外连接: 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行

左连接

左外连接又称为左连接,使用 LEFT OUTER JOIN 关键字连接两个表,并使用 ON 子句来设置连接条件。

左连接的语法格式如下:

SELECT <字段名> FROM <表1> LEFT OUTER JOIN <表2>

语法说明如下:

字段名:需要查询的字段名称。

<表1><表2>:需要左连接的表名。

LEFT OUTER JOIN:左连接中可以省略 OUTER 关键字,只使用关键字 LEFT JOIN。

ON 子句:用来设置左连接的连接条件,不能省略。

上述语法中,“表1”为基表,“表2”为参考表。左连接查询时,可以查询出“表1”中的所有记录和“表2”中匹配连接条件的记录。如果“表1”的某行在“表2”中没有匹配行,那么在返回结果中,“表2”的字段值均为空值(NULL)。

例 1

在进行左连接查询之前,我们先查看 tb_course 和 tb_students_info 两张表中的数据。SQL 语句和运行结果如下。

mysql> SELECT * FROM tb_course;

+----+-------------+
| id | course_name |
+----+-------------+
|  1 | Java        |
|  2 | MySQL       |
|  3 | Python      |
|  4 | Go          |
|  5 | C++         |
|  6 | HTML        |
+----+-------------+
6 rows in set (0.00 sec)
mysql> SELECT * FROM tb_students_info;
+----+--------+------+------+--------+-----------+
| id | name   | age  | sex  | height | course_id |
+----+--------+------+------+--------+-----------+
|  1 | Dany   |   25 | 男   |    160 |         1 |
|  2 | Green  |   23 | 男   |    158 |         2 |
|  3 | Henry  |   23 | 女   |    185 |         1 |
|  4 | Jane   |   22 | 男   |    162 |         3 |
|  5 | Jim    |   24 | 女   |    175 |         2 |
|  6 | John   |   21 | 女   |    172 |         4 |
|  7 | Lily   |   22 | 男   |    165 |         4 |
|  8 | Susan  |   23 | 男   |    170 |         5 |
|  9 | Thomas |   22 | 女   |    178 |         5 |
| 10 | Tom    |   23 | 女   |    165 |         5 |
| 11 | LiMing |   22 | 男   |    180 |         7 |
+----+--------+------+------+--------+-----------+
11 rows in set (0.00 sec)

在 tb_students_info 表和 tb_course 表中查询所有学生姓名和相对应的课程名称,包括没有课程的学生,SQL 语句和运行结果如下。

mysql> SELECT s.name,c.course_name FROM tb_students_info s LEFT OUTER JOIN tb_course c
    -> ON s.`course_id`=c.`id`;
+--------+-------------+
| name   | course_name |
+--------+-------------+
| Dany   | Java        |
| Henry  | Java        |
| NULL   | Java        |
| Green  | MySQL       |
| Jim    | MySQL       |
| Jane   | Python      |
| John   | Go          |
| Lily   | Go          |
| Susan  | C++         |
| Thomas | C++         |
| Tom    | C++         |
| LiMing | NULL        |
+--------+-------------+
12 rows in set (0.00 sec)

可以看到,运行结果显示了 12 条记录,name 为 LiMing 的学生目前没有课程,因为对应的 tb_course 表中没有该学生的课程信息,所以该条记录只取出了 tb_students_info 表中相应的值,而从 tb_course 表中取出的值为 NULL。

右连接

右外连接又称为右连接,右连接是左连接的反向连接。使用 RIGHT OUTER JOIN 关键字连接两个表,并使用 ON 子句来设置连接条件。

语法说明如下:

字段名:需要查询的字段名称。

<表1><表2>:需要右连接的表名。

RIGHT OUTER JOIN:右连接中可以省略 OUTER 关键字,只使用关键字 RIGHT JOIN。

ON 子句:用来设置右连接的连接条件,不能省略。

与左连接相反,右连接以“表2”为基表,“表1”为参考表。右连接查询时,可以查询出“表2”中的所有记录和“表1”中匹配连接条件的记录。如果“表2”的某行在“表1”中没有匹配行,那么在返回结果中,“表1”的字段值均为空值(NULL)。

例2

在 tb_students_info 表和 tb_course 表中查询所有课程,包括没有学生的课程,SQL 语句和运行结果如下。

mysql> SELECT s.name,c.course_name FROM tb_students_info s RIGHT OUTER JOIN tb_course c
    -> ON s.`course_id`=c.`id`;
+--------+-------------+
| name   | course_name |
+--------+-------------+
| Dany   | Java        |
| Green  | MySQL       |
| Henry  | Java        |
| Jane   | Python      |
| Jim    | MySQL       |
| John   | Go          |
| Lily   | Go          |
| Susan  | C++         |
| Thomas | C++         |
| Tom    | C++         |
| NULL   | HTML        |
+--------+-------------+
11 rows in set (0.00 sec)

可以看到,结果显示了 11 条记录,名称为 HTML 的课程目前没有学生,因为对应的 tb_students_info 表中并没有该学生的信息,所以该条记录只取出了 tb_course 表中相应的值,而从 tb_students_info 表中取出的值为 NULL。

多个表左/右连接时,在 ON 子句后连续使用 LEFT/RIGHT OUTER JOIN 或 LEFT/RIGHT JOIN 即可。

使用外连接查询时,一定要分清需要查询的结果,是需要显示左表的全部记录还是右表的全部记录,然后选择相应的左连接和右连接。

作业记录

先建立 users表

MySQL 外连接语法之 OUTER JOIN

orders表

MySQL 外连接语法之 OUTER JOIN

-- 查询每个用户的订单购买数量,列出uID,uName,buyNum
SELECT s.uid,s.uName,buyNum
FROM users s LEFT JOIN orders t
        ON s.uID=t.uID;

MySQL 外连接语法之 OUTER JOIN

--查询每个用户的订单数,列出uID,uName,ordernum(订单数)
SELECT s.uid,s.uName,count(t.uid) as ordernum
FROM orders t RIGHT JOIN users s
				ON s.uid=t.uid
GROUP BY s.uid;
-- 王麻子有两次订单数 其余都是一次

MySQL 外连接语法之 OUTER JOIN

到此这篇关于MySQL 案例分析讲解外连接语法的文章就介绍到这了,更多相关MySQL 外连接内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL之DML语言
Apr 05 MySQL
mysql死锁和分库分表问题详解
Apr 16 MySQL
Mysql MVCC机制原理详解
Apr 20 MySQL
解决mysql:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO/YES)
Jun 26 MySQL
SQL实现LeetCode(178.分数排行)
Aug 04 MySQL
Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高
Aug 23 MySQL
MySQL数据库⾼可⽤HA实现小结
Jan 22 MySQL
mysql数据插入覆盖和时间戳的问题及解决
Mar 25 MySQL
MySql数据库 查询时间序列间隔
May 11 MySQL
MYSQL事务的隔离级别与MVCC
May 25 MySQL
手把手带你彻底卸载MySQL数据库
Jun 14 MySQL
MySQL添加索引特点及优化问题
Jul 23 MySQL
MySQL中优化SQL语句的方法(show status、explain分析服务器状态信息)
Apr 09 #MySQL
进阶篇之linux环境下安装MySQL数据库
MySQL的存储函数与存储过程的区别解析
Apr 08 #MySQL
MySQL数据库查询进阶之多表查询详解
MySQL中一条SQL查询语句是如何执行的
解决MySQL Varchar 类型尾部空格的问题
Apr 06 #MySQL
mysql的单列多值存储实例详解
Apr 05 #MySQL
You might like
PHP中的串行化变量和序列化对象
2006/09/05 PHP
PHP error_log()将错误信息写入一个文件(定义和用法)
2013/10/25 PHP
PHP+Oracle本地开发环境搭建方法详解
2019/04/01 PHP
laravel按天、按小时,查询数据的实例
2019/10/09 PHP
js类 from qq
2006/11/13 Javascript
JavaScript使用IEEE 标准进行二进制浮点运算产生莫名错误的解决方法
2011/05/28 Javascript
基于jquery的文本框与autocomplete结合使用(asp.net+json)
2012/05/30 Javascript
JQuery 给元素绑定click事件多次执行的解决方法
2014/09/09 Javascript
JavaScript中的无阻塞加载性能优化方案
2014/10/10 Javascript
深入理解JavaScript系列(19):求值策略(Evaluation strategy)详解
2015/03/05 Javascript
初步认识JavaScript函数库jQuery
2015/06/18 Javascript
基于Css3和JQuery实现打字机效果
2015/08/11 Javascript
AngularJS表格详解及示例代码
2016/08/17 Javascript
详解AngularJS中$filter过滤器使用(自定义过滤器)
2017/02/04 Javascript
JS实现简易的图片拖拽排序实例代码
2017/06/09 Javascript
实现单层json按照key字母顺序排序的示例
2017/12/06 Javascript
利用jquery和BootStrap实现动态滚动条效果
2018/12/03 jQuery
js中的reduce()函数讲解
2019/01/18 Javascript
Element-ui DatePicker显示周数的方法示例
2019/07/19 Javascript
JS中FormData类实现文件上传
2020/03/27 Javascript
微信小程序 接入腾讯地图的两种写法
2021/01/12 Javascript
web.py在模板中输出美元符号的方法
2014/08/26 Python
Python实现模拟时钟代码推荐
2015/11/08 Python
Python中property函数用法实例分析
2018/06/04 Python
Python中使用pypdf2合并、分割、加密pdf文件的代码详解
2019/05/21 Python
python基于property()函数定义属性
2020/01/22 Python
通过自学python能找到工作吗
2020/06/21 Python
美国尼曼百货官网:Neiman Marcus
2019/09/05 全球购物
计算机毕业生自荐信
2014/06/12 职场文书
三严三实对照检查材料
2014/09/22 职场文书
学校食品安全责任书
2015/01/29 职场文书
幼儿园新学期开学寄语
2015/05/27 职场文书
请客吃饭开场白
2015/06/01 职场文书
spring boot项目application.properties文件存放及使用介绍
2021/06/30 Java/Android
浅谈Java父子类加载顺序
2021/08/04 Java/Android
SQL实战演练之网上商城数据库商品类别数据操作
2021/10/24 MySQL