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 如何分析查询性能
May 12 MySQL
分析MySQL抛出异常的几种常见解决方式
May 18 MySQL
Mysql 设置boolean类型的操作
Jun 04 MySQL
MySQL 数据类型详情
Nov 11 MySQL
MySQL数据库如何给表设置约束详解
Mar 13 MySQL
MySQL日期时间函数知识汇总
Mar 17 MySQL
MySQL 分区表中分区键为什么必须是主键的一部分
Mar 17 MySQL
浅谈redis的过期时间设置和过期删除机制
Mar 18 MySQL
MySQL时区造成时差问题
Apr 13 MySQL
MySQL 原理与优化之Limit 查询优化
Aug 14 MySQL
SQL Server数据库的三种创建方法汇总
May 08 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 empty,isset,is_null判断比较(差异与异同)
2010/10/19 PHP
php定义数组和使用示例(php数组的定义方法)
2014/03/29 PHP
20个2014年最优秀的PHP框架回顾
2014/10/22 PHP
php识别翻转iphone拍摄的颠倒图片
2018/05/17 PHP
让你的博文自动带上缩址的实现代码,方便发到微博客上
2010/12/28 Javascript
javascript函数重载解决方案分享
2014/02/19 Javascript
jQuery+ajax实现无刷新级联菜单示例
2015/05/21 Javascript
JavaScript的jQuery库中function的存在和参数问题
2015/08/13 Javascript
JS简单实现城市二级联动选择插件的方法
2015/08/19 Javascript
JavaScript性能优化之小知识总结
2015/11/20 Javascript
基于javascript实现精确到毫秒的倒计时限时抢购
2016/04/17 Javascript
Javascript类型系统之undefined和null浅析
2016/07/13 Javascript
使用JS实现图片展示瀑布流效果(简单实例)
2016/09/06 Javascript
JS检测window.open打开的窗口是否关闭
2017/06/25 Javascript
Vue 页面切换效果之 BubbleTransition(推荐)
2018/04/08 Javascript
Jquery实现获取子元素的方法分析
2019/08/24 jQuery
Element InfiniteScroll无限滚动的具体使用方法
2020/07/27 Javascript
[55:56]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.22
2019/09/05 DOTA
Python中的装饰器用法详解
2015/01/14 Python
使用Python的Django框架实现事务交易管理的教程
2015/04/20 Python
Python中单例模式总结
2018/02/20 Python
python 解决selenium 中的 .clear()方法失效问题
2020/09/01 Python
html5文本内容_动力节点Java学院整理
2017/07/11 HTML / CSS
如何用H5实现一个触屏版的轮播器的实例
2017/01/09 HTML / CSS
加拿大知名的国际儿童品牌:Hatley
2016/11/09 全球购物
美国主要的特色咖啡和茶公司:Peet’s Coffee
2020/02/14 全球购物
Linux内核产生并发的原因
2016/11/08 面试题
实习生的自我鉴定范文欣赏
2013/11/20 职场文书
给交警的表扬信
2014/01/12 职场文书
销售职业生涯规划范文
2014/03/14 职场文书
2014年部门工作总结
2014/11/12 职场文书
校长师德表现自我评价
2015/03/05 职场文书
大学生违纪检讨书范文
2015/05/07 职场文书
Python字符串对齐方法使用(ljust()、rjust()和center())
2021/04/26 Python
python实战之用emoji表情生成文字
2021/05/08 Python
安装配置mysql及Navicat prenium的详细流程
2021/06/10 MySQL