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 重写查询语句的三种策略
May 10 MySQL
MySQL COUNT函数的使用与优化
May 10 MySQL
MySQL时间盲注的五种延时方法实现
May 18 MySQL
MySQL 十大常用字符串函数详解
Jun 30 MySQL
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
Jul 01 MySQL
MySQL系列之八 MySQL服务器变量
Jul 02 MySQL
Mysql中一千万条数据怎么快速查询
Dec 06 MySQL
Arthas排查Kubernetes中应用频繁挂掉重启异常
Feb 28 MySQL
简单聊一聊SQL注入及防止SQL注入
Mar 23 MySQL
CentOS 7安装mysql5.7使用XtraBackUp备份工具命令详解
Apr 12 MySQL
MySQ InnoDB和MyISAM存储引擎介绍
Apr 26 MySQL
mysql实现将字符串字段转为数字排序或比大小
Jun 14 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
深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)
2013/02/06 PHP
教你如何快捷的使用cmd访问mysql小技巧
2014/05/26 PHP
php+ajax实现无刷新分页的方法
2014/11/04 PHP
PHP使用数组依次替换字符串中匹配项
2016/01/08 PHP
tp5框架无刷新分页实现方法分析
2019/09/26 PHP
PHP接入支付宝接口失效流程详解
2020/11/10 PHP
jquery 操作表格实现代码(多种操作打包)
2011/03/20 Javascript
range 标准化之获取
2011/08/28 Javascript
jquery 动态创建元素的方式介绍及应用
2013/04/21 Javascript
jQuery实现可用于博客的动态滑动菜单
2015/03/09 Javascript
关于Function中的bind()示例详解
2016/12/02 Javascript
js实现开启密码大写提示
2016/12/21 Javascript
详解微信小程序中的页面代码中的模板的封装
2017/10/12 Javascript
详解vue 实例方法和数据
2017/10/23 Javascript
关于Mac下安装nodejs、npm和cnpm的教程
2018/04/11 NodeJs
vuex + axios 做登录验证 并且保存登录状态的实例
2018/09/16 Javascript
深入探讨JavaScript的最基本部分之执行上下文
2019/02/12 Javascript
使用node-media-server搭建一个简易的流媒体服务器
2021/01/20 Javascript
用Python实现一个简单的多线程TCP服务器的教程
2015/05/05 Python
在Python中使用正则表达式的方法
2015/08/13 Python
python日志记录模块实例及改进
2017/02/12 Python
Python实现句子翻译功能
2017/11/14 Python
Python3解决棋盘覆盖问题的方法示例
2017/12/07 Python
浅谈python数据类型及类型转换
2017/12/18 Python
python随机在一张图像上截取任意大小图片的方法
2019/01/24 Python
python数据预处理方式 :数据降维
2020/02/24 Python
Python中实现输入一个整数的案例
2020/05/03 Python
C++和python实现阿姆斯特朗数字查找实例代码
2020/12/07 Python
HTML5安全介绍之内容安全策略(CSP)简介
2012/07/10 HTML / CSS
波兰品牌内衣及泳装网上商店:Astratex.pl
2017/02/03 全球购物
Expedia韩国官网:亚洲发展最快的在线旅游门户网站
2018/02/26 全球购物
写出SQL四条最基本的数据操作语句(DML)
2012/12/12 面试题
讲文明树新风演讲稿
2014/05/12 职场文书
幼儿园大班个人总结
2015/02/28 职场文书
医院病假条范文
2015/08/17 职场文书
Nginx+Tomcat负载均衡集群的实现示例
2021/10/24 Servers