【MYSQL高级】Mysql 表的七种连接方式【附带练习sql】

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 【MYSQL高级】Mysql 表的七种连接方式【附带练习sql】


连接

七种JOIN介绍

图形 连接方式 说明 SQL
内连接 共有部分 SELECT <select_list> FROM TableA A INNER JOIN TableB B ON A.Key = B.Key;
左连接 A表独有+共有部分 SELECT <select_list> FROM TableA A LEFT JOIN TableB B ON A.Key = B.Key;
右连接 B表独有+共有部分 SELECT <select_list> FROM TableA A RIGHT JOIN TableB B ON A.Key = B.Key;
A的独有 SELECT <select_list> FROM TableA A LEFT JOIN TableB B ON A.Key = B.Key WHERE B.Key IS NULL;
B的独有 SELECT <select_list> FROM TableA A RIGHT JOIN TableB B ON A.Key = B.Key WHERE A.Key IS NULL;
全连接 A的独有+共有部分+B的独有 SELECT <select_list> FROM TableA A FULL OUTER JOIN TableB B ON A.Key = B.Key; MySQL不支持FULL OUTER JOIN这种语法
A独有+B独有 SELECT <select_list> FROM T

 TableA A FULL OUTER JOIN TableB B ON A.Key = B.Key WHERE A.Key IS NULL OR B.Key IS NULL; MySQL不支持FULL OUTER JOIN这种语法

练习

建表+存储数据

CREATE TABLE `tbl_emp` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`deptId` int(11) DEFAULT NULL,
PRIMARY KEY (`id`) ,
KEY `fk_dept_id`(`deptId`)
)ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8;
CREATE TABLE `tbl_dept` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`deptName` varchar(30) DEFAULT NULL,
`locAdd` varchar(40) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8;
insert into tbl_dept(deptName,locAdd) values('RD',11);
insert into tbl_dept(deptName,locAdd) values('HR',12);
insert into tbl_dept(deptName,locAdd) values('MK',13);
insert into tbl_dept(deptName,locAdd) values('MIS',14);
insert into tbl_dept(deptName,locAdd) values('FD',15);
insert into tbl_emp(NAME,deptId) values('z3',1);
insert into tbl_emp(NAME,deptId) values('z4',1);
insert into tbl_emp(NAME,deptId) values('z5',1);
insert into tbl_emp(NAME,deptId) values('w5',2);
insert into tbl_emp(NAME,deptId) values('w6',2);
insert into tbl_emp(NAME,deptId) values('s7',3);
insert into tbl_emp(NAME,deptId) values('s8',4);
insert into tbl_emp(NAME,deptId) values('s9',51);

笛卡尔积

select * from tbl_emp,tbl_dept;

5条数据8条数据两两组合,一共40条,结果如下

"id"       "name"     "deptId"    "id"      "deptName"   "locAdd"
"1"        "z3"        "1"        "5"        "FD"        "15"
"1"        "z3"        "1"        "4"        "MIS"        "14"
"1"        "z3"        "1"        "3"        "MK"        "13"
"1"        "z3"        "1"        "2"        "HR"        "12"
"1"        "z3"        "1"        "1"        "RD"        "11"
"2"        "z4"        "1"        "5"        "FD"        "15"
"2"        "z4"        "1"        "4"        "MIS"        "14"
"2"        "z4"        "1"        "3"        "MK"        "13"
"2"        "z4"        "1"        "2"        "HR"        "12"
"2"        "z4"        "1"        "1"        "RD"        "11"
"3"        "z5"        "1"        "5"        "FD"        "15"
"3"        "z5"        "1"        "4"        "MIS"        "14"
"3"        "z5"        "1"        "3"        "MK"        "13"
"3"        "z5"        "1"        "2"        "HR"        "12"
"3"        "z5"        "1"        "1"        "RD"        "11"
"4"        "w5"        "2"        "5"        "FD"        "15"
"4"        "w5"        "2"        "4"        "MIS"        "14"
"4"        "w5"        "2"        "3"        "MK"        "13"
"4"        "w5"        "2"        "2"        "HR"        "12"
"4"        "w5"        "2"        "1"        "RD"        "11"
"5"        "w6"        "2"        "5"        "FD"        "15"
"5"        "w6"        "2"        "4"        "MIS"        "14"
"5"        "w6"        "2"        "3"        "MK"        "13"
"5"        "w6"        "2"        "2"        "HR"        "12"
"5"        "w6"        "2"        "1"        "RD"        "11"
"6"        "s7"        "3"        "5"        "FD"        "15"
"6"        "s7"        "3"        "4"        "MIS"        "14"
"6"        "s7"        "3"        "3"        "MK"        "13"
"6"        "s7"        "3"        "2"        "HR"        "12"
"6"        "s7"        "3"        "1"        "RD"        "11"
"7"        "s8"        "4"        "5"        "FD"        "15"
"7"        "s8"        "4"        "4"        "MIS"        "14"
"7"        "s8"        "4"        "3"        "MK"        "13"
"7"        "s8"        "4"        "2"        "HR"        "12"
"7"        "s8"        "4"        "1"        "RD"        "11"
"8"        "s9"        "51"        "5"        "FD"        "15"
"8"        "s9"        "51"        "4"        "MIS"        "14"
"8"        "s9"        "51"        "3"        "MK"        "13"
"8"        "s9"        "51"        "2"        "HR"        "12"
"8"        "s9"        "51"        "1"        "RD"        "11"

内连接

SELECT * FROM tbl_emp a INNER JOIN tbl_dept b ON a.deptId = b.id;

左连接

SELECT * FROM tbl_emp a LEFT JOIN tbl_dept b ON a.deptId = b.id;

右连接

SELECT * FROM tbl_emp a RIGHT JOIN tbl_dept b ON a.deptId = b.id;

A表独有

SELECT * FROM tbl_emp a LEFT JOIN tbl_dept b ON a.deptId = b.id WHERE b.id is null;

B表独有

SELECT * FROM tbl_emp a RIGHT JOIN tbl_dept b ON a.deptId = b.id WHERE a.deptId is null;

全连接

尝试换一种方式实现:A的独有+共有+B的独有

实现方式一:左连接+右连接+公共部分去重
SELECT * FROM tbl_emp a LEFT JOIN tbl_dept b ON a.deptId = b.id 
UNION 
SELECT * FROM tbl_emp a RIGHT JOIN tbl_dept b ON a.deptId = b.id;

实现方式二:左连接+B独有
SELECT * FROM tbl_emp a LEFT JOIN tbl_dept b ON a.deptId = b.id 
UNION 
SELECT * FROM tbl_emp a RIGHT JOIN tbl_dept b ON a.deptId = b.id WHERE a.deptId is null;

A独有+B独有

SELECT * FROM tbl_emp a LEFT JOIN tbl_dept b ON a.deptId = b.id WHERE b.id is null 
UNION 
SELECT * FROM tbl_emp a RIGHT JOIN tbl_dept b ON a.deptId = b.id WHERE a.deptId is null;

文章说明

本文章为本人学习尚硅谷的学习笔记,文章中大部分内容来源于尚硅谷视频(点击学习尚硅谷相关课程),也有部分内容来自于自己的思考,发布文章是想帮助其他学习的人更方便地整理自己的笔记或者直接通过文章学习相关知识,如有侵权请联系删除,最后对尚硅谷的优质课程表示感谢。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
2月前
|
SQL Oracle 关系型数据库
MySQL的sql_mode模式说明及设置
MySQL的sql_mode模式说明及设置
470 112
|
1月前
|
SQL 存储 关系型数据库
MySQL体系结构详解:一条SQL查询的旅程
本文深入解析MySQL内部架构,从SQL查询的执行流程到性能优化技巧,涵盖连接建立、查询处理、执行阶段及存储引擎工作机制,帮助开发者理解MySQL运行原理并提升数据库性能。
|
14天前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
|
14天前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
1月前
|
SQL 监控 关系型数据库
SQL优化技巧:让MySQL查询快人一步
本文深入解析了MySQL查询优化的核心技巧,涵盖索引设计、查询重写、分页优化、批量操作、数据类型优化及性能监控等方面,帮助开发者显著提升数据库性能,解决慢查询问题,适用于高并发与大数据场景。
|
28天前
|
SQL Java 关系型数据库
Java连接MySQL数据库环境设置指南
请注意,在实际部署时应该避免将敏感信息(如用户名和密码)硬编码在源码文件里面;应该使用配置文件或者环境变量等更为安全可靠地方式管理这些信息。此外,在处理大量数据时考虑使用PreparedStatement而不是Statement可以提高性能并防止SQL注入攻击;同时也要注意正确处理异常情况,并且确保所有打开过得资源都被正确关闭释放掉以防止内存泄漏等问题发生。
72 13
|
1月前
|
SQL 关系型数据库 MySQL
MySQL数据库连接过多(Too many connections)错误处理策略
综上所述,“Too many connections”错误处理策略涉及从具体参数配置到代码层面再到系统与架构设计全方位考量与改进。每项措施都需根据具体环境进行定制化调整,并且在执行任何变更前建议先行测试评估可能带来影响。
429 11
|
19天前
|
SQL 关系型数据库 MySQL
排除通过IP访问MySQL时出现的连接错误问题
以上步骤涵盖了大多数遇到远程连接 MySQL 数据库时出现故障情形下所需采取措施,在执行每个步骤后都应该重新尝试建立链接以验证是否已经解决问题,在多数情形下按照以上顺序执行将能够有效地排除并修复大多数基本链接相关故障。
128 3
|
1月前
|
SQL 监控 关系型数据库
查寻MySQL或SQL Server的连接数,并配置超时时间和最大连接量
以上步骤提供了直观、实用且易于理解且执行的指导方针来监管和优化数据库服务器配置。务必记得,在做任何重要变更前备份相关配置文件,并确保理解每个参数对系统性能可能产生影响后再做出调节。
190 11

推荐镜像

更多