当前位置: 首页 > news >正文

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)
http://www.jsqmd.com/news/270578/

相关文章:

  • 嵌入式工控主板中串口通信协议初始化流程:操作指南
  • 从0开始学Qwen3-1.7B,5分钟搞定模型调用
  • Paraformer-large值得用吗?工业级ASR模型实战评测教程
  • Hunyuan-OCR-WEBUI参数详解:CTC解码与Attention机制的选择影响
  • GTE中文语义相似度服务实战案例:智能写作辅助工具
  • 万物识别-中文-通用领域部署优化:减少冷启动时间的实用技巧
  • 虚拟主播实战:用Sambert多情感语音打造个性化AI助手
  • Windows驱动开发调试利器:WinDbg Preview下载详解
  • Wan2.2-T2V-A5B部署教程:Windows与Linux双平台适配指南
  • Llama3-8B如何对接微信机器人?API中转服务搭建
  • Z-Image-Turbo本地运行教程,适合初学者的完整指南
  • Qwen3-0.6B LangChain调用教程:流式输出配置实战指南
  • 新手教程:如何识别有源蜂鸣器和无源蜂鸣器
  • BJT工作原理深度剖析:三极管放大与开关模式全面讲解
  • MySQL玩转数据可视化
  • 看完就想试!Qwen3-4B打造的AI写作效果分享
  • 信号发生器产生FM/AM信号用于通信教学的实例讲解
  • 教育场景实战:用GLM-4.6V-Flash-WEB解析课件截图
  • 快速理解电路仿真中的电压与电流测量方法
  • Altium Designer中原理图更新至PCB的正确方式
  • 从零实现用户输入解析:Scanner类的常用方法实战
  • 科哥OCR镜像支持BMP格式上传,兼容性很强
  • 一键生成标准证件照!AI工坊自动化流程技术拆解
  • WinDbg使用教程:x86平台调试环境搭建手把手指南
  • 高效语音处理方案:SenseVoice Small镜像部署与应用实践
  • GPEN模型优化技巧:减少内存占用提升推理速度实战
  • BAAI/bge-m3多模态扩展可能?文本-图像检索前瞻分析
  • Qwen-Image-Edit-2511与LightX2V结合使用体验
  • Qwen3-VL镜像更新日志:新增32语言OCR支持部署说明
  • UI-TARS-desktop性能测试:vllm推理服务优化指南