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 相关文章推荐
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
Apr 05 MySQL
如何搭建 MySQL 高可用高性能集群
Jun 21 MySQL
Mysql中调试存储过程最简单的方法
Jun 30 MySQL
python中的mysql数据库LIKE操作符详解
Jul 01 MySQL
MySQL系列之十一 日志记录
Jul 02 MySQL
Mysql多层子查询示例代码(收藏夹案例)
Mar 31 MySQL
一文了解MYSQL三大范式和表约束
Apr 03 MySQL
详解Mysql数据库平滑扩容解决高并发和大数据量问题
May 25 MySQL
MySQL范围查询优化的场景实例详解
Jun 10 MySQL
MySQL的意向共享锁、意向排它锁和死锁
Jul 15 MySQL
MySQL 原理与优化之原数据锁的应用
Aug 14 MySQL
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
Dec 24 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
古巴咖啡 Cubita琥爵咖啡 独特的加勒比海风味咖啡
2021/03/06 新手入门
Codeigniter实现处理用户登录验证后的URL跳转
2014/06/12 PHP
PHP实现的简单网络硬盘
2015/07/29 PHP
YII使用url组件美化管理的方法
2015/12/28 PHP
YII Framework框架教程之安全方案详解
2016/03/14 PHP
PHP入门教程之表单与验证实例详解
2016/09/11 PHP
PHP递归遍历指定文件夹内的文件实现方法
2016/11/15 PHP
javascript 函数使用说明
2010/04/07 Javascript
javascript ajax的5种状态介绍
2014/08/18 Javascript
DWR中各种java方法的调用
2016/05/04 Javascript
Easyui Tree获取当前选择节点的所有顶级父节点
2017/02/14 Javascript
使用JS 插件qrcode.js生成二维码功能
2017/02/20 Javascript
Vue.js划分组件的方法
2017/10/29 Javascript
JavaScript框架Angular和React深度对比
2017/11/20 Javascript
laydate日历控件使用方法详解
2017/11/20 Javascript
浅谈Vue内置component组件的应用场景
2018/03/27 Javascript
vue-cli项目代理proxyTable配置exclude的方法
2018/09/20 Javascript
详解vue-cli 脚手架 安装
2019/04/16 Javascript
Vue循环遍历选项赋值到对应控件的实现方法
2020/06/22 Javascript
解决vant的Toast组件时提示not defined的问题
2020/11/11 Javascript
Python二维码生成库qrcode安装和使用示例
2014/12/16 Python
Python创建二维数组实例(关于list的一个小坑)
2017/11/07 Python
Python使用jsonpath-rw模块处理Json对象操作示例
2018/07/31 Python
如何用C代码给Python写扩展库(Cython)
2019/05/17 Python
Python寻找路径和查找文件路径的示例
2019/07/10 Python
python之yield和Generator深入解析
2019/09/18 Python
Python运行DLL文件的方法
2020/01/17 Python
如何使用PyCharm将代码上传到GitHub上(图文详解)
2020/04/27 Python
Python3 + Appium + 安卓模拟器实现APP自动化测试并生成测试报告
2021/01/27 Python
基于HTML5 Canvas 实现商场监控实例详解
2017/11/20 HTML / CSS
英国手机零售商:Metrofone
2019/03/18 全球购物
新郎婚宴答谢词
2014/01/19 职场文书
好习惯伴我成长演讲稿
2014/05/21 职场文书
国家机关领导干部民主生活会对照检查材料思想汇报
2014/09/17 职场文书
关于幸福的感言
2015/08/03 职场文书
Go语言编译原理之变量捕获
2022/08/05 Golang