MySQL 案例分析讲解外连接语法

 更新时间:2022年04月08日 19:21:42   作者:浪里个浪的1024  
数据库的一个难题是无法将SQL语句的执行结果转换为想要的格式。本节,我们将通过学习格式转换中具有代表性的行列转换和嵌套式侧栏的生成方法,深入理解一下其中有重要作用的外连接

前言

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

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

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

左连接

左外连接又称为左连接,使用 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表

在这里插入图片描述

orders表

在这里插入图片描述

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

在这里插入图片描述

--查询每个用户的订单数,列出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 案例分析讲解外连接语法的文章就介绍到这了,更多相关MySQL 外连接内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL中数据视图操作详解

    MySQL中数据视图操作详解

    视图是从一个或多个表(或视图)导出的表。视图一经定义,就可以像表一样被查询、修改、删除和更新。本文就来和大家讲讲MySQL数据视图的一些基本操作,需要的可以参考一下
    2022-08-08
  • MySQL执行时间的查询

    MySQL执行时间的查询

    这篇文章主要介绍了MySQL执行时间的查询,查询频繁的数据库和查询执行时间长的sql,文章中有详细的代码实例,感兴趣的同学可以参考阅读
    2023-04-04
  • MySQL 日期格式化的使用示例

    MySQL 日期格式化的使用示例

    在MySQL中,可以使用DATE_FORMAT函数对日期进行格式化,本文就来介绍一下MySQL 日期格式化的使用示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • 利用JuiceFS使MySQL 备份验证性能提升 10 倍

    利用JuiceFS使MySQL 备份验证性能提升 10 倍

    这篇文章主要介绍了如何让 MySQL 备份验证性能提升 10 倍,JuiceFS 非常适合用来做 MySQL 物理备份,通过不断调整 XtraBackup 的参数和 JuiceFS 的挂载参数,在一个小时内将时间缩短到原先的 1/10,下文一起来看相关内容的详细介绍吧
    2022-03-03
  • MySQL Memory 存储引擎浅析

    MySQL Memory 存储引擎浅析

    需求源自项目中的MemCache需求,开始想用MemCached(官方站点:http://memcached.org/ ),但这个在Linux下面应用广泛的开源软件无官方支持的Windows版本
    2011-12-12
  • MySQL UPDATE多表关联更新的实现示例

    MySQL UPDATE多表关联更新的实现示例

    MySQL可以基于多表查询更新数据,本文主要介绍了MySQL UPDATE多表关联更新的实现示例,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • MySQL最左匹配原则详细分析

    MySQL最左匹配原则详细分析

    首先回顾一下什么是最左匹配(也有称之为最左前缀)?顾名思义:最左优先,以最左边的为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like)就会停止匹配
    2022-12-12
  • MySQL数据库使用mysqldump导出数据详解

    MySQL数据库使用mysqldump导出数据详解

    mysqldump是mysql用于转存储数据库的实用程序。它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令CREATE TABLE INSERT等。接下来通过本文给大家介绍MySQL数据库使用mysqldump导出数据详解,需要的朋友一起学习吧
    2016-04-04
  • MYSQL数据库Innodb 引擎mvcc锁实现原理

    MYSQL数据库Innodb 引擎mvcc锁实现原理

    这篇文章主要介绍了MYSQL数据库Innodb 引擎mvcc锁实现原理,但是mvcc 的实现原理是什么呢?下文我们就来实例说明来mvcc 的实现原理,感兴趣的小伙伴可以参考一下
    2022-05-05
  • 深入理解Mysql中的MVCC

    深入理解Mysql中的MVCC

    这篇文章主要介绍了深入理解Mysql中的MVCC,同样的sql查询语句在一个事务 里多次执行查询结果相同,就算其它事务对数据有修改也不会影响当前事务sql语句的查询结果, 这个隔离性就是靠MVCC机制来保证的,需要的朋友可以参考下
    2023-09-09

最新评论