MySQL 的 JOIN 查询

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 本文主要是讲述 SQL 的语法结构,以及 SQL 的解析过程。还有就是 7 种查询语法介绍。

SQL 语句


SQL 语法格式


语法格式如下:


image.png


SQL 解析过程


SQL 执行过程


image.png


SQL 解析过程


image.png


JSON 语句


JSON 图解


SQL 图解如下


image.png


建表SQL


create database `oemp`;
use `oemp`;
#部门表
create table `tb_dept` (
`id` int(11) not null auto_increment,
`name` varchar(30) default null,
`storey` varchar(40) default null,
primary key(`id`)
)  engine = innodb auto_increment=1 default charset=utf8;
#员工表
create table `tb_emp` (
`id` int(11) not null auto_increment,
`name` varchar(30) default null,
`dept_id` int(11) default null,
primary key(`id`),
key `idx_dept_id`(`dept_id`)
#, constraint `fk_dept_id` foregign key(`dept_id`) references `tb_dept` (`id`)
)  engine = innodb auto_increment=1 default charset=utf8;
#部门数据
insert into `tb_dept`(`id`, `name`, `storey`) values('1', 'RD', '11');
insert into `tb_dept`(`id`, `name`, `storey`) values('2', 'HR', '12');
insert into `tb_dept`(`id`, `name`, `storey`) values('3', 'MK', '13');
insert into `tb_dept`(`id`, `name`, `storey`) values('4', 'MIS', '14');
insert into `tb_dept`(`id`, `name`, `storey`) values('5', 'FD', '15');
#员工数据
insert into `tb_emp`(`name`, `dept_id`) values('z3', 1);
insert into `tb_emp`(`name`, `dept_id`) values('z4', 1);
insert into `tb_emp`(`name`, `dept_id`) values('z5', 1);
insert into `tb_emp`(`name`, `dept_id`) values('w5', 2);
insert into `tb_emp`(`name`, `dept_id`) values('w6', 2);
insert into `tb_emp`(`name`, `dept_id`) values('s7', 3);
insert into `tb_emp`(`name`, `dept_id`) values('s8', 4);
insert into `tb_emp`(`name`, `dept_id`) values('s9', 51);


7 种 JOIN 查询


#关联查询
select * from `tb_dept`;
select * from `tb_emp`;
#内连接查询
select * from `tb_emp` a inner join `tb_dept` b on a.dept_id = b.id;
#左连接查询
select * from `tb_emp` a left join `tb_dept` b on a.dept_id = b.id;
#右连接查询
select * from `tb_emp` a right join `tb_dept` b on a.dept_id = b.id;
#左差集查询
select * from `tb_emp` a left join `tb_dept` b on a.dept_id = b.id where b.id is null;
#右差集查询
select * from `tb_emp` a right join `tb_dept` b on a.dept_id = b.id where a.id is null;
#全连接查询 (全集)(MySQL不支持 full outer join 语法)
# oracle: select * from `tb_emp` a full outer join `tb_dept` b on a.dept_id = b.id;
# union 拼接且去重
select * from `tb_emp` a left join `tb_dept` b on a.dept_id = b.id
union
select * from `tb_emp` a right join `tb_dept` b on a.dept_id = b.id;
#A/B独有的数据(差集)
select * from `tb_emp` a left join `tb_dept` b on a.dept_id = b.id where b.id is null
union
select * from `tb_emp` a right join `tb_dept` b on a.dept_id = b.id where a.id is null;


1. left join


#左连接查询 
 select * from `tb_emp` a left join `tb_dept` b on a.dept_id = b.id; 


2. right join


#右连接查询
select * from `tb_emp` a right join `tb_dept` b on a.dept_id = b.id;


3. 交集 (inner join)


#关联查询
select * from `tb_dept`;
select * from `tb_emp`;
#内连接查询
select * from `tb_emp` a inner join `tb_dept` b on a.dept_id = b.id;


4. 左差集


#左差集查询
select * from `tb_emp` a left join `tb_dept` b on a.dept_id = b.id where b.id is null;


5. 右差集


#右差集查询
select * from `tb_emp` a right join `tb_dept` b on a.dept_id = b.id where a.id is null;


6. 全集


#全连接查询 (全集)(MySQL不支持 full outer join 语法)
# oracle: select * from `tb_emp` a full outer join `tb_dept` b on a.dept_id = b.id;
# union 拼接且去重
select * from `tb_emp` a left join `tb_dept` b on a.dept_id = b.id
union
select * from `tb_emp` a right join `tb_dept` b on a.dept_id = b.id;


7. 差集


#A/B独有的数据(差集)
select * from `tb_emp` a left join `tb_dept` b on a.dept_id = b.id where b.id is null
union
select * from `tb_emp` a right join `tb_dept` b on a.dept_id = b.id where a.id is null;


参考文档



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3天前
|
存储 关系型数据库 MySQL
mysql数据库查询时用到的分页方法有哪些
【8月更文挑战第16天】在MySQL中,实现分页的主要方法包括:1)使用`LIMIT`子句,简单直接但随页数增加性能下降;2)通过子查询优化`LIMIT`分页,提高大页码时的查询效率;3)利用存储过程封装分页逻辑,便于复用但需额外维护;4)借助MySQL变量实现,可能提供更好的性能但实现较复杂。这些方法各有优缺点,可根据实际需求选择适用方案。
|
1天前
|
存储 关系型数据库 MySQL
MySQL bit类型增加索引后查询结果不正确案例浅析
【8月更文挑战第17天】在MySQL中,`BIT`类型字段在添加索引后可能出现查询结果异常。表现为查询结果与预期不符,如返回错误记录或遗漏部分数据。原因包括索引使用不当、数据存储及比较问题,以及索引创建时未充分考虑`BIT`特性。解决方法涉及正确运用索引、理解`BIT`的存储和比较机制,以及合理创建索引以覆盖各种查询条件。通过`EXPLAIN`分析执行计划可帮助诊断和优化查询。
|
3天前
|
存储 关系型数据库 MySQL
mysql中的left join、right join 、inner join的详细用法
【8月更文挑战第16天】在MySQL中,`INNER JOIN`、`LEFT JOIN`与`RIGHT JOIN`用于连接多表。`INNER JOIN`仅返回两表中匹配的行;`LEFT JOIN`保证左表所有行出现于结果中,右表无匹配时以NULL填充;`RIGHT JOIN`则相反,保证右表所有行出现于结果中。例如,查询学生及其成绩时,`INNER JOIN`仅显示有成绩的学生;`LEFT JOIN`显示所有学生及他们对应的成绩,无成绩者成绩列为空;`RIGHT JOIN`显示所有成绩及对应学生信息,无学生信息的成绩条目则为空。
|
5天前
|
关系型数据库 MySQL 索引
mysql8.0中fulltext不能查询到中文的解决方法
确保MySQL服务器字符集为`utf8mb4`,并设置`ngram_token_size=1`以支持单字搜索。如已更改此参数且存在全文索引,需删除原有索引并重建,使用`WITH PARSER ngram`指定解析器。例如: ``` ALTER TABLE your_table DROP INDEX idx_fulltext, ADD FULLTEXT INDEX idx_fulltext (your_column) WITH PARSER ngram; ```
|
7天前
|
存储 算法 关系型数据库
探索MySQL递归查询,优雅的给树结构分页!
总结起来,对于MySQL中的树结构数据,递归查询结合预排序遍历树算法可以实现优雅的分页,但需要注意性能优化和数据更新的问题。这项技术提供了一种高效处理层级数据的工具,使得开发者可以在复杂的数据结构下实现直观和可靠的数据查询。
17 1
|
13天前
|
存储 SQL 缓存
MySQL查询语句的执行过程
MySQL查询语句的执行过程
|
24天前
|
SQL 缓存 关系型数据库
MySQL 查询索引失效及如何进行索引优化
MySQL 查询索引失效及如何进行索引优化
61 1
|
26天前
|
算法 搜索推荐 NoSQL
面试题MySQL问题之分库分表后的富查询问题处理如何解决
面试题MySQL问题之分库分表后的富查询问题处理如何解决
31 3
|
3天前
|
存储 SQL 关系型数据库
探索MySQL的执行奥秘:从查询执行到数据存储与优化的深入解析
探索MySQL的执行奥秘:从查询执行到数据存储与优化的深入解析
|
26天前
|
JSON NoSQL MongoDB
面试题MySQL问题之想使用Neo4j查询可变数量的关系节点如何解决
面试题MySQL问题之想使用Neo4j查询可变数量的关系节点如何解决
28 1