MySQL内外连接实战详解

 更新时间:2025年08月07日 09:22:42   作者:茉莉玫瑰花茶  
文章详解MySQL内连接与外连接,内连接通过WHERE筛选匹配记录,外连接包括左、右连接,保留一侧全数据,包含案例与练习及LeetCode实战题目,对mysql内外连接实战案例相关知识感兴趣的朋友一起看看吧

表的连接分类

表的连接主要分为内连接和外连接两种类型。

内连接

内连接实际上就是利用WHERE子句对两种表形成的笛卡尔积进行筛选,这是我们前面学习的主要查询方式,也是开发过程中使用最多的连接查询。

我们除了可以使用“ , ”来隔离表,我们还可以使用下面的语法:和我们之前笛卡尔积,后面使用where条件筛选是一样的效果的!只不过下面的写法是比较标准的!

SELECT 字段 FROM 表1 INNER JOIN 表2 ON 连接条件 AND 其他条件;

前面学习的大部分查询都属于内连接。

案例:显示SMITH的名字和部门名称

传统写法:

SELECT ename, dname FROM EMP, DEPT WHERE EMP.deptno=DEPT.deptno AND ename='SMITH';
mysql> select emp.ename, dept.dname from emp, dept where emp.deptno=dept.deptno and emp.ename='SMITH';
+-------+----------+
| ename | dname    |
+-------+----------+
| SMITH | RESEARCH |
+-------+----------+
1 row in set (0.00 sec)

标准内连接写法:

SELECT ename, dname FROM EMP INNER JOIN DEPT ON EMP.deptno=DEPT.deptno AND ename='SMITH';
mysql> select emp.ename, dept.dname from emp inner join dept on emp.deptno=dept.deptno and emp.ename='SMITH';
+-------+----------+
| ename | dname    |
+-------+----------+
| SMITH | RESEARCH |
+-------+----------+
1 row in set (0.00 sec)

外连接

外连接分为左外连接和右外连接。

为主的在哪一边,基本就是使用那一边的连接方式!--- 后面的练习部分体现!!!

左外连接

如果联合查询时,左侧的表完全显示(左侧的信息不要做任何的过滤和筛选,完全保留)(即使右侧没有匹配记录),我们就称为左外连接

仅仅将 inner join 改成了 left join

SELECT 字段名 FROM 表名1 LEFT JOIN 表名2 ON 连接条件

创建测试表:

CREATE TABLE stu (id INT, name VARCHAR(30)); -- 学生表
INSERT INTO stu VALUES(1,'jack'),(2,'tom'),(3,'kity'),(4,'nono');
CREATE TABLE exam (id INT, grade INT); -- 成绩表
INSERT INTO exam VALUES(1, 56),(2,76),(11, 8);
mysql> select * from stu;
+------+------+
| id   | name |
+------+------+
|    1 | jack |
|    2 | tom  |
|    3 | kity |
|    4 | nono |
+------+------+
4 rows in set (0.00 sec)
mysql> select * from exam;
+------+-------+
| id   | grade |
+------+-------+
|    1 |    56 |
|    2 |    76 |
|   11 |     8 |
+------+-------+
3 rows in set (0.00 sec)

查询所有学生的成绩,如果学生没有成绩也要显示个人信息:

SELECT * FROM stu LEFT JOIN exam ON stu.id=exam.id;
mysql> select * from stu left join exam on stu.id=exam.id;
+------+------+------+-------+
| id   | name | id   | grade |
+------+------+------+-------+
|    1 | jack |    1 |    56 |
|    2 | tom  |    2 |    76 |
|    3 | kity | NULL |  NULL |
|    4 | nono | NULL |  NULL |
+------+------+------+-------+
4 rows in set (0.00 sec)

这个查询会显示左边表的所有记录,即使右边表没有匹配的记录。

右外连接

如果联合查询时,右侧的表完全显示(即使左侧没有匹配记录),我们就称为右外连接。

SELECT 字段 FROM 表名1 RIGHT JOIN 表名2 ON 连接条件;

对stu表和exam表联合查询,显示所有成绩,即使没有对应学生:

SELECT * FROM stu RIGHT JOIN exam ON stu.id=exam.id;
mysql> select * from stu right join exam on stu.id=exam.id;
+------+------+------+-------+
| id   | name | id   | grade |
+------+------+------+-------+
|    1 | jack |    1 |    56 |
|    2 | tom  |    2 |    76 |
| NULL | NULL |   11 |     8 |
+------+------+------+-------+
3 rows in set (0.00 sec)

练习:

列出部门名称和这些部门的员工信息,同时列出没有员工的部门

方法一(使用左连接):

SELECT d.dname, e.* FROM dept d LEFT JOIN emp e ON d.deptno=e.deptno;
mysql> select d.dname, e.* from dept d left join emp e on d.deptno=e.deptno;
+------------+--------+--------+-----------+------+---------------------+---------+---------+--------+
| dname      | empno  | ename  | job       | mgr  | hiredate            | sal     | comm    | deptno |
+------------+--------+--------+-----------+------+---------------------+---------+---------+--------+
| ACCOUNTING | 007934 | MILLER | CLERK     | 7782 | 1982-01-23 00:00:00 | 1300.00 |    NULL |     10 |
| ACCOUNTING | 007839 | KING   | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 |    NULL |     10 |
| ACCOUNTING | 007782 | CLARK  | MANAGER   | 7839 | 1981-06-09 00:00:00 | 2450.00 |    NULL |     10 |
| RESEARCH   | 007902 | FORD   | ANALYST   | 7566 | 1981-12-03 00:00:00 | 3000.00 |    NULL |     20 |
| RESEARCH   | 007876 | ADAMS  | CLERK     | 7788 | 1987-05-23 00:00:00 | 1100.00 |    NULL |     20 |
| RESEARCH   | 007788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 00:00:00 | 3000.00 |    NULL |     20 |
| RESEARCH   | 007566 | JONES  | MANAGER   | 7839 | 1981-04-02 00:00:00 | 2975.00 |    NULL |     20 |
| RESEARCH   | 007369 | SMITH  | CLERK     | 7902 | 1980-12-17 00:00:00 |  800.00 |    NULL |     20 |
| SALES      | 007900 | JAMES  | CLERK     | 7698 | 1981-12-03 00:00:00 |  950.00 |    NULL |     30 |
| SALES      | 007844 | TURNER | SALESMAN  | 7698 | 1981-09-08 00:00:00 | 1500.00 |    0.00 |     30 |
| SALES      | 007698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 00:00:00 | 2850.00 |    NULL |     30 |
| SALES      | 007654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 00:00:00 | 1250.00 | 1400.00 |     30 |
| SALES      | 007521 | WARD   | SALESMAN  | 7698 | 1981-02-22 00:00:00 | 1250.00 |  500.00 |     30 |
| SALES      | 007499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 00:00:00 | 1600.00 |  300.00 |     30 |
| OPERATIONS |   NULL | NULL   | NULL      | NULL | NULL                |    NULL |    NULL |   NULL |
+------------+--------+--------+-----------+------+---------------------+---------+---------+--------+
15 rows in set (0.00 sec)

方法二(使用右连接):

SELECT d.dname, e.* FROM emp e RIGHT JOIN dept d ON d.deptno=e.deptno;
mysql> select d.dname, e.* from emp e right join dept d on d.deptno=e.deptno;
+------------+--------+--------+-----------+------+---------------------+---------+---------+--------+
| dname      | empno  | ename  | job       | mgr  | hiredate            | sal     | comm    | deptno |
+------------+--------+--------+-----------+------+---------------------+---------+---------+--------+
| ACCOUNTING | 007934 | MILLER | CLERK     | 7782 | 1982-01-23 00:00:00 | 1300.00 |    NULL |     10 |
| ACCOUNTING | 007839 | KING   | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 |    NULL |     10 |
| ACCOUNTING | 007782 | CLARK  | MANAGER   | 7839 | 1981-06-09 00:00:00 | 2450.00 |    NULL |     10 |
| RESEARCH   | 007902 | FORD   | ANALYST   | 7566 | 1981-12-03 00:00:00 | 3000.00 |    NULL |     20 |
| RESEARCH   | 007876 | ADAMS  | CLERK     | 7788 | 1987-05-23 00:00:00 | 1100.00 |    NULL |     20 |
| RESEARCH   | 007788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 00:00:00 | 3000.00 |    NULL |     20 |
| RESEARCH   | 007566 | JONES  | MANAGER   | 7839 | 1981-04-02 00:00:00 | 2975.00 |    NULL |     20 |
| RESEARCH   | 007369 | SMITH  | CLERK     | 7902 | 1980-12-17 00:00:00 |  800.00 |    NULL |     20 |
| SALES      | 007900 | JAMES  | CLERK     | 7698 | 1981-12-03 00:00:00 |  950.00 |    NULL |     30 |
| SALES      | 007844 | TURNER | SALESMAN  | 7698 | 1981-09-08 00:00:00 | 1500.00 |    0.00 |     30 |
| SALES      | 007698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 00:00:00 | 2850.00 |    NULL |     30 |
| SALES      | 007654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 00:00:00 | 1250.00 | 1400.00 |     30 |
| SALES      | 007521 | WARD   | SALESMAN  | 7698 | 1981-02-22 00:00:00 | 1250.00 |  500.00 |     30 |
| SALES      | 007499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 00:00:00 | 1600.00 |  300.00 |     30 |
| OPERATIONS |   NULL | NULL   | NULL      | NULL | NULL                |    NULL |    NULL |   NULL |
+------------+--------+--------+-----------+------+---------------------+---------+---------+--------+
15 rows in set (0.00 sec)

实战OJ题目

到此这篇关于MySQL内外连接详解的文章就介绍到这了,更多相关mysql内外连接内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL 5.7.27下载安装配置的详细教程

    MySQL 5.7.27下载安装配置的详细教程

    这篇文章主要介绍了MySQL 5.7.27详细下载安装配置教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • MySQL-MMM安装指南(Multi-Master Replication Manager for MySQL)

    MySQL-MMM安装指南(Multi-Master Replication Manager for MySQL)

    这篇文章主要介绍了mysql Multi-Master Replication Manager for MySQL的安装方法,需要的朋友可以参考下
    2014-02-02
  • Mac上安装MySQL过程分享

    Mac上安装MySQL过程分享

    这篇文章主要介绍了Mac上安装MySQL过程分享,本文共分4步完成,简单易懂,需要的朋友可以参考下
    2014-11-11
  • mysql如何创建和删除唯一索引(unique key)

    mysql如何创建和删除唯一索引(unique key)

    这篇文章主要介绍了mysql如何创建和删除唯一索引(unique key)问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 实例讲解MySQL 慢查询

    实例讲解MySQL 慢查询

    这篇文章主要介绍了MySQL 慢查询的相关资料,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下
    2020-12-12
  • MySQL导入数据权限问题的解决

    MySQL导入数据权限问题的解决

    本文主要介绍了MySQL导入数据权限问题的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • mysql 字段定义不要用null的原因分析

    mysql 字段定义不要用null的原因分析

    这篇文章主要介绍了mysql 字段定义不要用null的原因分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • 在Centos 5.5 上编译安装mysql 5.5.9

    在Centos 5.5 上编译安装mysql 5.5.9

    由于开发需要,现在需要安装安装MySQL 5.5.9,使用了rpm安装总是出错,而且还有好多依事关系麻烦,此外也没有找到二进制的包,只好找源码包进行编译;
    2014-07-07
  • 修改MySQL所有表的编码或修改某个字段的编码步骤详解

    修改MySQL所有表的编码或修改某个字段的编码步骤详解

    这篇文章主要给大家介绍了关于修改MySQL所有表的编码或修改某个字段编码的相关资料,在进行数据库编码更改之前,需要先确定目标编码格式,常见的编码格式有UTF-8、GBK等,需要的朋友可以参考下
    2023-12-12
  • MySQL基于group_concat()函数合并多行数据

    MySQL基于group_concat()函数合并多行数据

    这篇文章主要介绍了MySQL基于group_concat()函数合并多行数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10

最新评论