MySQL 左连接left join、右连接right join、内连接inner join、全连接union使用实例讲解
MySQL数据库表有4种连接方式:
左连接(左外连接)
右连接(右外连接)
等值连接(内连接)
全连接(全外连接)
以下,小编将依次简要介绍,希望能对初学的小伙伴们有所裨益。
首先先介绍下将要使用的两张数据库表
表a
表b
表b中的uid字段,与表a中id字段相对应。
表a中id为6的记录,在表b中没有体现,表b中id为9,uid为7的记录在表a中没有体现。
建表语句如下:
1 SET NAMES utf8mb4; 2 SET FOREIGN_KEY_CHECKS = 0; 3 4 -- ---------------------------- 5 -- Table structure for a 6 -- ---------------------------- 7 DROP TABLE IF EXISTS `a`; 8 CREATE TABLE `a` ( 9 `id` int(11) NOT NULL AUTO_INCREMENT, 10 `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 11 `age` int(11) NOT NULL, 12 `gender` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 13 `psw` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 14 PRIMARY KEY (`id`) USING BTREE 15 ) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; 16 17 -- ---------------------------- 18 -- Records of a 19 -- ---------------------------- 20 INSERT INTO `a` VALUES (1, 'zhangsan', 30, 'f', '123456'); 21 INSERT INTO `a` VALUES (2, 'lisi', 31, 'f', '123456'); 22 INSERT INTO `a` VALUES (3, 'wangwu', 32, 'm', '123456'); 23 INSERT INTO `a` VALUES (4, 'zhaoliu', 33, 'm', '123456'); 24 INSERT INTO `a` VALUES (5, 'baiqi', 34, 'm', '123456'); 25 INSERT INTO `a` VALUES (6, 'hongba', 35, 'f', '123456'); 26 27 SET FOREIGN_KEY_CHECKS = 1;
1 SET NAMES utf8mb4; 2 SET FOREIGN_KEY_CHECKS = 0; 3 4 -- ---------------------------- 5 -- Table structure for b 6 -- ---------------------------- 7 DROP TABLE IF EXISTS `b`; 8 CREATE TABLE `b` ( 9 `id` int(11) NOT NULL AUTO_INCREMENT, 10 `uid` int(11) NOT NULL, 11 `pet` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 12 PRIMARY KEY (`id`) USING BTREE 13 ) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; 14 15 -- ---------------------------- 16 -- Records of b 17 -- ---------------------------- 18 INSERT INTO `b` VALUES (1, 1, 'cat'); 19 INSERT INTO `b` VALUES (2, 2, 'dog'); 20 INSERT INTO `b` VALUES (3, 1, 'sheep'); 21 INSERT INTO `b` VALUES (4, 3, 'goat'); 22 INSERT INTO `b` VALUES (5, 4, 'dog'); 23 INSERT INTO `b` VALUES (6, 5, 'duck'); 24 INSERT INTO `b` VALUES (7, 5, 'cat'); 25 INSERT INTO `b` VALUES (8, 5, 'rabbit'); 26 INSERT INTO `b` VALUES (9, 7, 'shark'); 27 28 SET FOREIGN_KEY_CHECKS = 1;
一、左连接
返回左表中的所有记录 + 右表中与左表连接字段相等的记录
例如:
SELECT * FROM `a` left join `b` on a.id = b.uid
其查询结果为:
由记录可以发现,
1.返回的结果集的顺序是按照被JOIN的后表(表b)的顺序显示
2.表a中所有数据均出现,当表b中出现无法与表a按照既定方式匹配的数据时,表b的字段显示为null。例如,表a中id为6的记录,在表b中不存在uid为6的记录,因此表b的相应字段显示为null。
3.表b中的数据不是全部出现,若b中的uid无法与a中匹配是,该条数据不显示。例如,表b中id为9,uid为7的记录,因为表a中不存在id为7的记录,因此在查询结果中不显示该条记录。
4.第2、3条中可以发现,所有的null值只能出现在后表(表b)的字段中。
二、右连接
返回右表中的所有记录 + 左表中与左表连接字段相等的记录
例如:
SELECT * FROM `a` right join `b` on a.id = b.uid
查询结果如下:
由记录可以发现,
1.返回的结果集的顺序是按照被JOIN的表(表b)的顺序显示
2.表b中所有数据均出现,当表a中出现无法与表b按照既定方式匹配的数据时,表a的字段显示为null,例如表b中id为9,uid为7的记录。
3.表a中的数据不是全部出现,若b中的uid无法与a中匹配是,该条数据不显示。例如表a中id为6的记录,在表b中并没有uid为6的记录,因此不显示。
4.第2、3条中可以发现,所有的null值只能出现在前表的字段中
三、等值连接
返回两个表中,连接字段相等的值。
例如:
SELECT * FROM `a` inner join b on a.id = b.uid
查询结果为:
由记录可以发现,
1.返回的结果集的顺序是按照被JOIN的后表(表b)的顺序显示
2.表a、表b均不是出现所有记录,而是仅返回满足a.id=b.uid的记录。a表中id为6的记录未显示,b表中id为9,uid为7的记录未显示
3.返回的结果集中不存在null值
四、全连接
mysql中不支持全连接,因此需采用union来连接左连接和右连接的结果集
SELECT * FROM `a` left join b on a.id = b.uid UNION SELECT * FROM `a` right join b on a.id = b.uid
查询结果如下:
1.返回的结果集的顺序是按照被JOIN的后表(表b)的顺序显示
2.表a、表b均出现所有记录,无法按a.id=b.uid匹配的记录,本表正常显示,连接表用null值填充,如结果集中最后两条记录
具体项目中使用哪种连接,还需要小伙伴们根据需求自己选择了。
- Mybatis传多个参数(三种解决方案)
- 语义化HTML:i、b、em和strong标签
- JSON入门指南--服务端处理JSON
- 纸上谈兵: 图 (graph)
- 纸上谈兵: 拓扑排序
- MyBatis Generator自动创建代码
- Maven(六)之依赖管理
- 细说log4j
- SEVERE: Error configuring application listener of class org.springframework.web.context.ContextLoade
- TCP/IP(一)之开启计算机网络之路
- JSON入门指南--客户端处理JSON
- mysql5.7 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
- TCP/IP中你不得不知的十大秘密
- Java Web开发学习之路2012版
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- 树莓派2配置LAMP环境
- 实习第八周
- Office OpenXml SDK 使用 Fallback 图片显示 Ole 元素
- 直播平台在线人数功能
- ZanProxy —— 本地代码调试线上页面,环境再也不是问题
- 实习第九周
- GET 和 POST 区别
- 实习第十周
- Linux下文件系统技巧 | 统计个数 | 只见文件或目录
- 有赞线上拨测系统实践(一)
- Node Schedule文档翻译
- 基于 Generator 和 Iterator 的惰性列表
- 【Centos8】安装docker的坎坷历程
- 你不知道的Virtual DOM(一):Virtual Dom介绍
- Under the Hood: NaN of JS