转自: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的区别的更多相关文章

  1. MySQL 中 key, primary key ,unique key,index的区别

    一.key与primary key区别 CREATE TABLE wh_logrecord ( logrecord_id int(11) NOT NULL auto_increment, user_n ...

  2. 【转】Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别总结

    Mysql中utf8_general_ci与utf8_unicode_ci有什么区别呢?在编程语言中,通常用unicode对中文字符做处理,防止出现乱码,那么在MySQL里,为什么大家都使用utf8_ ...

  3. mysql中时间类型datetime,timestamp与int的区别

    在mysql中存储时间,我们可以用datetime 格式,timestamp格式,也可以用int格式.那么我们设计的时候该如何考虑呢? 首先,我觉得应该明白这几个格式究竟是如何的,然后看看他们的区别, ...

  4. Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别总结

    Mysql中utf8_general_ci与utf8_unicode_ci有什么区别呢?在编程语言中,通常用unicode对中文字符做处理,防止出现乱码,那么在MySQL里,为什么大家都使用utf8_ ...

  5. MYSQL中的普通索引,主健,唯一,全文索引区别

    MYSQL索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录.表里面的记 ...

  6. MySql中的count、NULL和空串的区别

    **1.count (1).count (*) 与 count (列名) 的区别** 表 count(1) count(*) count (列名) 作用 统计表中的所有的记录数 会统计表中的所有的记录 ...

  7. 浅谈SQL Server、MySQL中char,varchar,nchar,nvarchar区别

    最近一次的面试中,被面试官问到varchar和nvarchar的区别,脑海里记得是定长和可变长度的区别,但却没能说出来.后来,在网上找了下网友总结的区别.在这里做个备忘录: 一,SQL Server中 ...

  8. MySQL中where和on,where和having 的区别

    where和on的区别 用到连接查询时on会常用到,我们以左连接为例,来了解on的作用. on是在生成临时表使用的条件,不管on子句的条件是否为真,其都会返回左表的数据,如果条件为真则右表对应的数据也 ...

  9. mysql中char,varchar与text类型的区别和选用

    关于char,varchar与text平时没有太在意,一般来说,可能现在大家都是用varchar.但是当要存储的内容比较大时,究竟是选择varchar还是text呢?不知道...... 于是去查阅了一 ...

  10. mysql中几个日期时间类型之间的区别和使用

    MySQL中有如下几个时间类型:date.time.datetime.timestamp.year MySQL数据类型           含义 date                     只存 ...

随机推荐

  1. Spring日记_01 之 Eclipse下的Tomcat服务器配置 以及 Springmvc和Servlet的使用

    安装Tomcat – window – preferences – Server                                                  右键Tomcat v ...

  2. 什么是AOP?

    AOP(Aspect-Oriented Programming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入封装.继承和 ...

  3. php字符串截取

    保留字符串前面的 substr($str,start[,$length]); start  为负数 则从后面开始截取 leng为负数则返回的字符串将从 $str 结尾处向前数第 start 个字符开始 ...

  4. Shell学习之Shell特性(一)

    Shell学习之Shell特性 目录 命令和文件自动补齐功能 命令历史记忆功能 history.上下键.!number.!string.!$.!! 别名功能 alias.unalias cp.~use ...

  5. Python中的MySQLConnector使用介绍

    MySQL Connector/Python 是 MySQL 官方提供的 Python 连接 MySQL 数据库的驱动程序了,很多初学者对于 在python中连接mysql数据库还是有点为难了,下文我 ...

  6. 20172302 《Java软件结构与数据结构》实验一:线性结构实验报告

    课程:<Java软件结构与数据结构> 班级: 1723 姓名: 侯泽洋 学号:20172302 实验教师:王志强老师 实验日期:2018年9月26日 必修/选修: 必修 实验内容 (1)链 ...

  7. Java 多线程 interrupt方法

    interrupt 下面是interrupt方法的文档的一部分: * <p> If this thread is blocked in an invocation of the {@lin ...

  8. zookeepercli - Command Line Interface for ZooKeeper

    简介 ZooKeeper命令行界面(CLI)用于与ZooKeeper进行交互以用于开发目的.它对于调试很有用. 要执行ZooKeeper CLI操作,首先打开你的ZooKeeper服务器(“bin / ...

  9. Matplotlib新手上路(上)

    matplotlib是python里用于绘图的专用包,功能十分强大.下面介绍一些最基本的用法: 一.最基本的划线 先来一个简单的示例,代码如下,已经加了注释: import matplotlib.py ...

  10. Android-ContentProvider使用

    Android-ContentProvider使用 一 建立ContentProviderserver端 1 建立一个继承自ContentProvider的类并重写接口方法(这里仅打一些log做代表) ...