news 2026/5/10 19:10:53

MySQL数据库—MySQL内外连接

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL数据库—MySQL内外连接

表的连接分为内连和外连

第一章:内连接

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

语法:

select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件;

备注:前面学习的都是内连接

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

-- 用前面的写法 select ename, dname from EMP, DEPT where EMP.deptno=DEPT.deptno and ename='SMITH'; -- 用标准的内连接写法 select ename, dname from EMP inner join DEPT on EMP.deptno=DEPT.deptno and ename='SMITH';

示例2

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

第二章:外连接

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

左外连接

如果联合查询,左侧的表完全显示我们就说是左外连接。

语法:

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);

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

-- 当左边表和右边表没有匹配时,也会显示左边表的数据 select * from stu left join exam on stu.id=exam.id;

示例2

mysql> create table stu (id int, name varchar(30)); Query OK, 0 rows affected (0.01 sec) mysql> desc stu; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(30) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.01 sec) mysql> insert into stu values(1,'jack'),(2,'tom'),(3,'kity'),(4,'nono'); Query OK, 4 rows affected (0.01 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> select * from stu; +------+------+ | id | name | +------+------+ | 1 | jack | | 2 | tom | | 3 | kity | | 4 | nono | +------+------+ 4 rows in set (0.00 sec) mysql> create table exam (id int, grade int); Query OK, 0 rows affected (0.01 sec) mysql> insert into exam values(1, 56),(2,76),(11, 8); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from exam; +------+-------+ | id | grade | +------+-------+ | 1 | 56 | | 2 | 76 | | 11 | 8 | +------+-------+ 3 rows in set (0.00 sec) 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) mysql> select * from stu inner join exam on stu.id=exam.id; +------+------+------+-------+ | id | name | id | grade | +------+------+------+-------+ | 1 | jack | 1 | 56 | | 2 | tom | 2 | 76 | +------+------+------+-------+ 2 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;

示例2

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) mysql> select * from exam left join stu on stu.id=exam.id; +------+-------+------+------+ | id | grade | id | name | +------+-------+------+------+ | 1 | 56 | 1 | jack | | 2 | 76 | 2 | tom | | 11 | 8 | NULL | NULL | +------+-------+------+------+ 3 rows in set (0.00 sec)

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

方法一: select d.dname, e.* from dept d left join emp e on d.deptno=e.deptno; 方法二: select d.dname, e.* from emp e right join dept d on d.deptno=e.deptno;
mysql> select * from emp; +--------+--------+-----------+------+---------------------+---------+---------+--------+ | empno | ename | job | mgr | hiredate | sal | comm | deptno | +--------+--------+-----------+------+---------------------+---------+---------+--------+ | 007369 | SMITH | CLERK | 7902 | 1980-12-17 00:00:00 | 800.00 | NULL | 20 | | 007499 | ALLEN | SALESMAN | 7698 | 1981-02-20 00:00:00 | 1600.00 | 300.00 | 30 | | 007521 | WARD | SALESMAN | 7698 | 1981-02-22 00:00:00 | 1250.00 | 500.00 | 30 | | 007566 | JONES | MANAGER | 7839 | 1981-04-02 00:00:00 | 2975.00 | NULL | 20 | | 007654 | MARTIN | SALESMAN | 7698 | 1981-09-28 00:00:00 | 1250.00 | 1400.00 | 30 | | 007698 | BLAKE | MANAGER | 7839 | 1981-05-01 00:00:00 | 2850.00 | NULL | 30 | | 007782 | CLARK | MANAGER | 7839 | 1981-06-09 00:00:00 | 2450.00 | NULL | 10 | | 007788 | SCOTT | ANALYST | 7566 | 1987-04-19 00:00:00 | 3000.00 | NULL | 20 | | 007839 | KING | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 | NULL | 10 | | 007844 | TURNER | SALESMAN | 7698 | 1981-09-08 00:00:00 | 1500.00 | 0.00 | 30 | | 007876 | ADAMS | CLERK | 7788 | 1987-05-23 00:00:00 | 1100.00 | NULL | 20 | | 007900 | JAMES | CLERK | 7698 | 1981-12-03 00:00:00 | 950.00 | NULL | 30 | | 007902 | FORD | ANALYST | 7566 | 1981-12-03 00:00:00 | 3000.00 | NULL | 20 | | 007934 | MILLER | CLERK | 7782 | 1982-01-23 00:00:00 | 1300.00 | NULL | 10 | +--------+--------+-----------+------+---------------------+---------+---------+--------+ 14 rows in set (0.00 sec) mysql> select distinct deptno from emp; +--------+ | deptno | +--------+ | 20 | | 30 | | 10 | +--------+ 3 rows in set (0.00 sec) mysql> select * from dept; +--------+------------+----------+ | deptno | dname | loc | +--------+------------+----------+ | 10 | ACCOUNTING | NEW YORK | | 20 | RESEARCH | DALLAS | | 30 | SALES | CHICAGO | | 40 | OPERATIONS | BOSTON | +--------+------------+----------+ 4 rows in set (0.00 sec) mysql> select * from dept left join emp on dept.deptno=emp.deptno; +--------+------------+----------+--------+--------+-----------+------+---------------------+---------+---------+--------+ | deptno | dname | loc | empno | ename | job | mgr | hiredate | sal | comm | deptno | +--------+------------+----------+--------+--------+-----------+------+---------------------+---------+---------+--------+ | 20 | RESEARCH | DALLAS | 007369 | SMITH | CLERK | 7902 | 1980-12-17 00:00:00 | 800.00 | NULL | 20 | | 30 | SALES | CHICAGO | 007499 | ALLEN | SALESMAN | 7698 | 1981-02-20 00:00:00 | 1600.00 | 300.00 | 30 | | 30 | SALES | CHICAGO | 007521 | WARD | SALESMAN | 7698 | 1981-02-22 00:00:00 | 1250.00 | 500.00 | 30 | | 20 | RESEARCH | DALLAS | 007566 | JONES | MANAGER | 7839 | 1981-04-02 00:00:00 | 2975.00 | NULL | 20 | | 30 | SALES | CHICAGO | 007654 | MARTIN | SALESMAN | 7698 | 1981-09-28 00:00:00 | 1250.00 | 1400.00 | 30 | | 30 | SALES | CHICAGO | 007698 | BLAKE | MANAGER | 7839 | 1981-05-01 00:00:00 | 2850.00 | NULL | 30 | | 10 | ACCOUNTING | NEW YORK | 007782 | CLARK | MANAGER | 7839 | 1981-06-09 00:00:00 | 2450.00 | NULL | 10 | | 20 | RESEARCH | DALLAS | 007788 | SCOTT | ANALYST | 7566 | 1987-04-19 00:00:00 | 3000.00 | NULL | 20 | | 10 | ACCOUNTING | NEW YORK | 007839 | KING | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 | NULL | 10 | | 30 | SALES | CHICAGO | 007844 | TURNER | SALESMAN | 7698 | 1981-09-08 00:00:00 | 1500.00 | 0.00 | 30 | | 20 | RESEARCH | DALLAS | 007876 | ADAMS | CLERK | 7788 | 1987-05-23 00:00:00 | 1100.00 | NULL | 20 | | 30 | SALES | CHICAGO | 007900 | JAMES | CLERK | 7698 | 1981-12-03 00:00:00 | 950.00 | NULL | 30 | | 20 | RESEARCH | DALLAS | 007902 | FORD | ANALYST | 7566 | 1981-12-03 00:00:00 | 3000.00 | NULL | 20 | | 10 | ACCOUNTING | NEW YORK | 007934 | MILLER | CLERK | 7782 | 1982-01-23 00:00:00 | 1300.00 | NULL | 10 | | 40 | OPERATIONS | BOSTON | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | +--------+------------+----------+--------+--------+-----------+------+---------------------+---------+---------+--------+ 15 rows in set (0.00 sec) mysql> select * from dept left join emp on dept.deptno=emp.deptno order by dept.deptno asc; +--------+------------+----------+--------+--------+-----------+------+---------------------+---------+---------+--------+ | deptno | dname | loc | empno | ename | job | mgr | hiredate | sal | comm | deptno | +--------+------------+----------+--------+--------+-----------+------+---------------------+---------+---------+--------+ | 10 | ACCOUNTING | NEW YORK | 007782 | CLARK | MANAGER | 7839 | 1981-06-09 00:00:00 | 2450.00 | NULL | 10 | | 10 | ACCOUNTING | NEW YORK | 007839 | KING | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 | NULL | 10 | | 10 | ACCOUNTING | NEW YORK | 007934 | MILLER | CLERK | 7782 | 1982-01-23 00:00:00 | 1300.00 | NULL | 10 | | 20 | RESEARCH | DALLAS | 007902 | FORD | ANALYST | 7566 | 1981-12-03 00:00:00 | 3000.00 | NULL | 20 | | 20 | RESEARCH | DALLAS | 007788 | SCOTT | ANALYST | 7566 | 1987-04-19 00:00:00 | 3000.00 | NULL | 20 | | 20 | RESEARCH | DALLAS | 007876 | ADAMS | CLERK | 7788 | 1987-05-23 00:00:00 | 1100.00 | NULL | 20 | | 20 | RESEARCH | DALLAS | 007369 | SMITH | CLERK | 7902 | 1980-12-17 00:00:00 | 800.00 | NULL | 20 | | 20 | RESEARCH | DALLAS | 007566 | JONES | MANAGER | 7839 | 1981-04-02 00:00:00 | 2975.00 | NULL | 20 | | 30 | SALES | CHICAGO | 007844 | TURNER | SALESMAN | 7698 | 1981-09-08 00:00:00 | 1500.00 | 0.00 | 30 | | 30 | SALES | CHICAGO | 007521 | WARD | SALESMAN | 7698 | 1981-02-22 00:00:00 | 1250.00 | 500.00 | 30 | | 30 | SALES | CHICAGO | 007698 | BLAKE | MANAGER | 7839 | 1981-05-01 00:00:00 | 2850.00 | NULL | 30 | | 30 | SALES | CHICAGO | 007900 | JAMES | CLERK | 7698 | 1981-12-03 00:00:00 | 950.00 | NULL | 30 | | 30 | SALES | CHICAGO | 007499 | ALLEN | SALESMAN | 7698 | 1981-02-20 00:00:00 | 1600.00 | 300.00 | 30 | | 30 | SALES | CHICAGO | 007654 | MARTIN | SALESMAN | 7698 | 1981-09-28 00:00:00 | 1250.00 | 1400.00 | 30 | | 40 | OPERATIONS | BOSTON | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | +--------+------------+----------+--------+--------+-----------+------+---------------------+---------+---------+--------+ 15 rows in set (0.00 sec) mysql> select dname, ename, dept.deptno from dept left join emp on dept.deptno=emp.deptno order by dept.deptno asc; +------------+--------+--------+ | dname | ename | deptno | +------------+--------+--------+ | ACCOUNTING | KING | 10 | | ACCOUNTING | CLARK | 10 | | ACCOUNTING | MILLER | 10 | | RESEARCH | ADAMS | 20 | | RESEARCH | SCOTT | 20 | | RESEARCH | FORD | 20 | | RESEARCH | JONES | 20 | | RESEARCH | SMITH | 20 | | SALES | MARTIN | 30 | | SALES | ALLEN | 30 | | SALES | JAMES | 30 | | SALES | BLAKE | 30 | | SALES | WARD | 30 | | SALES | TURNER | 30 | | OPERATIONS | NULL | 40 | +------------+--------+--------+ 15 rows in set (0.00 sec)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/9 17:40:11

通义千问3-Embedding-4B实战:金融风控文本分析

通义千问3-Embedding-4B实战:金融风控文本分析 1. 引言 在金融风控领域,海量非结构化文本数据(如贷款申请材料、交易日志、客户投诉、合同条款等)的语义理解与相似性匹配是构建智能审核系统的核心挑战。传统关键词匹配或TF-IDF方…

作者头像 李华
网站建设 2026/5/9 22:54:13

CV-UNet应用案例:电商主图批量处理实战

CV-UNet应用案例:电商主图批量处理实战 1. 引言 在电商平台运营中,高质量的商品主图是提升转化率的关键因素之一。传统的人工抠图方式效率低、成本高,难以满足大规模商品上新的需求。随着深度学习技术的发展,基于CV-UNet的通用抠…

作者头像 李华
网站建设 2026/5/9 11:25:16

YOLOv8入门:模型评估指标详解

YOLOv8入门:模型评估指标详解 1. 引言:目标检测的工业级实践需求 在智能制造、安防监控、零售分析等实际场景中,目标检测技术正从实验室走向大规模落地。YOLO(You Only Look Once)系列作为实时目标检测的标杆&#x…

作者头像 李华
网站建设 2026/5/9 4:27:30

PyTorch 2.8深度学习省钱攻略:按需GPU比买显卡省90%

PyTorch 2.8深度学习省钱攻略:按需GPU比买显卡省90% 你是不是也遇到过这种情况:接了个AI模型开发的外包项目,客户要求用PyTorch 2.8做训练和推理,预算3万元,结果一看RTX 4090显卡要1.5万起步——还没开始干活&#xf…

作者头像 李华
网站建设 2026/5/7 8:14:12

BJT工作原理深度剖析:三极管放大与开关模式全面讲解

BJT工作原理解密:从载流子运动到放大与开关的工程实战你有没有想过,一个比指甲盖还小的三极管,是如何驱动一颗LED、控制继电器,甚至在老式收音机里放大微弱信号的?答案就藏在双极结型晶体管(BJT&#xff09…

作者头像 李华
网站建设 2026/5/10 16:07:39

如何高效做中文情感分析?试试这款轻量级CPU友好型大模型镜像

如何高效做中文情感分析?试试这款轻量级CPU友好型大模型镜像 1. 背景与挑战:中文情感分析的现实需求 在当前数字化服务快速发展的背景下,用户评论、社交媒体反馈、客服对话等文本数据呈爆炸式增长。企业亟需一种高效、准确的方式理解公众对…

作者头像 李华