(转) mysql中left join,right join,inner join的区别
转自:https://blog.csdn.net/qq_35975416/article/details/78842958
sql查询中有一个非常重要的环节就是表的关联查询,一般使用left join,right join,inner join,他们之间的区别是什么呢?
下面我们通过具体的sql语句来演示,演示用的表名为test1/test2:
mysql> select * from test1;
+----+--------+------+------+
| id | name | age | sex |
+----+--------+------+------+
| 0 | 小董 | 20 | 男 |
| 1 | 小王 | 15 | 男 |
| 2 | 小李 | 18 | 男 |
| 3 | 小红 | 16 | 女 |
+----+--------+------+------+
4 rows in set (0.00 sec)
mysql> select * from test2;
+----+--------+-----------------------+-------+
| id | name | interest | score |
+----+--------+-----------------------+-------+
| 1 | 小王 | 打篮球 | 81 |
| 2 | 小李 | 踢足球 | 84 |
| 3 | 小红 | 看动漫 | 99 |
| 4 | 小军 | 打游戏,打篮球 | 100 |
+----+--------+-----------------------+-------+
4 rows in set (0.00 sec)
mysql> select * from test1 t1 left join test2 t2 on t1.id=t2.id and t1.name=t2.name;
+----+--------+------+------+------+--------+-----------+-------+
| id | name | age | sex | id | name | interest | score |
+----+--------+------+------+------+--------+-----------+-------+
| 1 | 小王 | 15 | 男 | 1 | 小王 | 打篮球 | 81 |
| 2 | 小李 | 18 | 男 | 2 | 小李 | 踢足球 | 84 |
| 3 | 小红 | 16 | 女 | 3 | 小红 | 看动漫 | 99 |
| 0 | 小董 | 20 | 男 | NULL | NULL | NULL | NULL |
+----+--------+------+------+------+--------+-----------+-------+
4 rows in set (0.12 sec)
mysql> select * from test2 t1 left join test1 t2 on t1.id=t2.id and t1.name=t2.name;
+----+--------+-----------------------+-------+------+--------+------+------+
| id | name | interest | score | id | name | age | sex |
+----+--------+-----------------------+-------+------+--------+------+------+
| 1 | 小王 | 打篮球 | 81 | 1 | 小王 | 15 | 男 |
| 2 | 小李 | 踢足球 | 84 | 2 | 小李 | 18 | 男 |
| 3 | 小红 | 看动漫 | 99 | 3 | 小红 | 16 | 女 |
| 4 | 小军 | 打游戏,打篮球 | 100 | NULL | NULL | NULL | NULL |
+----+--------+-----------------------+-------+------+--------+------+------+
4 rows in set (0.00 sec)
mysql> select t1.id,t1.name,t1.interest,t1.score,t2.age,t2.sex from test2 t1 left join test1 t2 on t1.id=t2.id and t1.name=t2.name;
+----+--------+-----------------------+-------+------+------+
| id | name | interest | score | age | sex |
+----+--------+-----------------------+-------+------+------+
| 1 | 小王 | 打篮球 | 81 | 15 | 男 |
| 2 | 小李 | 踢足球 | 84 | 18 | 男 |
| 3 | 小红 | 看动漫 | 99 | 16 | 女 |
| 4 | 小军 | 打游戏,打篮球 | 100 | NULL | NULL |
+----+--------+-----------------------+-------+------+------+
4 rows in set (0.02 sec)
mysql> select t1.id,t1.name,t1.interest,t1.score,t2.age,t2.sex from test2 t1 inner join test1 t2 on t1.id=t2.id and t1.name=t2.name;
+----+--------+-----------+-------+------+------+
| id | name | interest | score | age | sex |
+----+--------+-----------+-------+------+------+
| 1 | 小王 | 打篮球 | 81 | 15 | 男 |
| 2 | 小李 | 踢足球 | 84 | 18 | 男 |
| 3 | 小红 | 看动漫 | 99 | 16 | 女 |
+----+--------+-----------+-------+------+------+
3 rows in set (0.00 sec)
mysql> select * from test1 t1 left join test2 t2 on t1.id=t2.id and t1.name=t2.name;
+----+--------+------+------+------+--------+-----------+-------+
| id | name | age | sex | id | name | interest | score |
+----+--------+------+------+------+--------+-----------+-------+
| 1 | 小王 | 15 | 男 | 1 | 小王 | 打篮球 | 81 |
| 2 | 小李 | 18 | 男 | 2 | 小李 | 踢足球 | 84 |
| 3 | 小红 | 16 | 女 | 3 | 小红 | 看动漫 | 99 |
| 0 | 小董 | 20 | 男 | NULL | NULL | NULL | NULL |
+----+--------+------+------+------+--------+-----------+-------+
4 rows in set (0.00 sec)
mysql> select * from test1 t1 right join test2 t2 on t1.id=t2.id and t1.name=t2.name;
+------+--------+------+------+----+--------+-----------------------+-------+
| id | name | age | sex | id | name | interest | score |
+------+--------+------+------+----+--------+-----------------------+-------+
| 1 | 小王 | 15 | 男 | 1 | 小王 | 打篮球 | 81 |
| 2 | 小李 | 18 | 男 | 2 | 小李 | 踢足球 | 84 |
| 3 | 小红 | 16 | 女 | 3 | 小红 | 看动漫 | 99 |
| NULL | NULL | NULL | NULL | 4 | 小军 | 打游戏,打篮球 | 100 |
+------+--------+------+------+----+--------+-----------------------+-------+
4 rows in set (0.00 sec)
mysql> select * from test1 t1 inner join test2 t2 on t1.id=t2.id and t1.name=t2.name;
+----+--------+------+------+----+--------+-----------+-------+
| id | name | age | sex | id | name | interest | score |
+----+--------+------+------+----+--------+-----------+-------+
| 1 | 小王 | 15 | 男 | 1 | 小王 | 打篮球 | 81 |
| 2 | 小李 | 18 | 男 | 2 | 小李 | 踢足球 | 84 |
| 3 | 小红 | 16 | 女 | 3 | 小红 | 看动漫 | 99 |
+----+--------+------+------+----+--------+-----------+-------+
3 rows in set (0.00 sec)
从上面的截图可以很容易看出来三者之间的区别,left join 查出来的数据条数是以查询的表为主,right join查出来的数据条数是以关联表为主,inner join查出来的数据是在查询条件在两者的交集
(转) mysql中left join,right join,inner join的区别的更多相关文章
- MySQL 中 key, primary key ,unique key,index的区别
一.key与primary key区别 CREATE TABLE wh_logrecord ( logrecord_id int(11) NOT NULL auto_increment, user_n ...
- 【转】Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别总结
Mysql中utf8_general_ci与utf8_unicode_ci有什么区别呢?在编程语言中,通常用unicode对中文字符做处理,防止出现乱码,那么在MySQL里,为什么大家都使用utf8_ ...
- mysql中时间类型datetime,timestamp与int的区别
在mysql中存储时间,我们可以用datetime 格式,timestamp格式,也可以用int格式.那么我们设计的时候该如何考虑呢? 首先,我觉得应该明白这几个格式究竟是如何的,然后看看他们的区别, ...
- Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别总结
Mysql中utf8_general_ci与utf8_unicode_ci有什么区别呢?在编程语言中,通常用unicode对中文字符做处理,防止出现乱码,那么在MySQL里,为什么大家都使用utf8_ ...
- MYSQL中的普通索引,主健,唯一,全文索引区别
MYSQL索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录.表里面的记 ...
- MySql中的count、NULL和空串的区别
**1.count (1).count (*) 与 count (列名) 的区别** 表 count(1) count(*) count (列名) 作用 统计表中的所有的记录数 会统计表中的所有的记录 ...
- 浅谈SQL Server、MySQL中char,varchar,nchar,nvarchar区别
最近一次的面试中,被面试官问到varchar和nvarchar的区别,脑海里记得是定长和可变长度的区别,但却没能说出来.后来,在网上找了下网友总结的区别.在这里做个备忘录: 一,SQL Server中 ...
- MySQL中where和on,where和having 的区别
where和on的区别 用到连接查询时on会常用到,我们以左连接为例,来了解on的作用. on是在生成临时表使用的条件,不管on子句的条件是否为真,其都会返回左表的数据,如果条件为真则右表对应的数据也 ...
- mysql中char,varchar与text类型的区别和选用
关于char,varchar与text平时没有太在意,一般来说,可能现在大家都是用varchar.但是当要存储的内容比较大时,究竟是选择varchar还是text呢?不知道...... 于是去查阅了一 ...
- mysql中几个日期时间类型之间的区别和使用
MySQL中有如下几个时间类型:date.time.datetime.timestamp.year MySQL数据类型 含义 date 只存 ...
随机推荐
- drupal笔记
$app_root :网站根目录 安装 汉化:1将汉化包放置drupal8\sites\default\files\translations下安装:2极简版的话需要在extend(扩展)中安装Inte ...
- shell find
find -name april* 在当前目录下查找以april开始的文件 find / -amin -10 # 查找在系统中最后1 ...
- 自己总结的C#编码规范--前言&目录
最近在为公司编写c#编码规范,以前对这方面研究不多,只是觉得代码能够出自己的意思就可以了. 我参考了以下资料 C# Coding Conventions NET设计规范约定惯用法与模式(第2版) 编写 ...
- BZOJ3019 : [Balkan2012]handsome
首先预处理出$f[i][j][k]$表示长度为$i$的序列,第一个位置是$j$,最后一个位置是$k$时合法的方案数. 从后往前枚举LCP以及那个位置应该改成什么. 用线段树维护区间内最左最右的已经确定 ...
- 107. 二叉树的层次遍历 II
107. 二叉树的层次遍历 II 题意 给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历). 解题思路 递归:利用前序遍历的思想,在递归过程中 ...
- 在eclipse总是会运行之前的错误项目
我改了context root没有用,删了work下面的项目文件也没有用,最后必须要改server的配置,就是在windows下有个server runtimeEnvironment http://b ...
- 静态代理、JDK动态代理和CGLib动态代理之前的区别
昨天看了一天的代理方面的知识,刚开始看的时候没看出什么花头来,感觉不实用.一大堆的东西,还不如直接new出来,然后调用方法.后来仔细研究了一下AOP(面向切面)的思想,才发现代理的用处实在太大了.现在 ...
- android stuido 的几个点
- weblogic清除缓存
背景:在开发调试或测试时,很多时候重新更新部署服务后会发现某些更新并没有体现到,还是之前的情况,也或者会出现其他错误问题,这个时候就要考虑到可能是weblogic缓存未清理引起. 可以先尝试下面这种做 ...
- shell脚本中:1>&2 2>&1 &>filename重定向的含义和区别
当初在shell中, 看到">&1"和">&2"始终不明白什么意思.经过在网上的搜索得以解惑.其实这是两种输出. 在 shell 程 ...