转自: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. 通过pyqt5实现俄罗斯方块游戏例子

    # *_* coding:utf-8 *_* # 开发团队:中国软件开发团队# 开发人员:Administrator# 开发时间:2019/3/17 2:13# 文件名称:RussiaBoard# 开 ...

  2. 在VS代码中编辑Python

    在VS代码中编辑Python Python扩展提供了许多用于在Visual Studio代码中编辑Python源代码的功能: 自动完成和智能感知 在终端中运行选择/行(REPL) 格式化 重构 也见L ...

  3. Java设计模式从精通到入门二 装饰器模式

    介绍 ​ 我尽量用最少的语言解释总结: ​ Java23种设计模式之一,属于结构型模式,允许向一个现有的对象添加新的功能,不改变其结构. 应用实例: ​ 给英雄联盟种的射手,添加不同的装备.先装备攻速 ...

  4. spring整合ssmXML版

    以下是一个简单的ssm项目:如果中途报错,肯定是tomcat配置或者数据库配置有问题,在程序中注意将包名等配置换成自己的.数据库表需要提前建好,并加入数据,注意表结构要和实体对象对应. 1.开发条件: ...

  5. Nutch源码阅读进程4

    前面依次看了nutch的准备工作inject和generate部分,抓取的fetch部分的代码,趁热打铁,我们下面来一睹parse即页面解析部分的代码,这块代码主要是集中在ParseSegment类里 ...

  6. flask-include标签使用标签

      [footer.html] <footer> 这是底部 </footer> [header.html] <style> .nav ul{ overflow: h ...

  7. json数据格式 net.sf.json.JSONException: A JSONObject text must begin with '{' at character 1 of Error:(findColumns1)Read timed out

    substring(3)的用法http://www.w3school.com.cn/jsref/jsref_substring.asp 可能一:sb是要转化的数据,以sb是String为例       ...

  8. C#的?和??

    1.?? 为了实现Nullable数据类型转换成non-Nullable类型数据,才有的一个操作符: 意义:一变量取值,取符号左边的值,若左边为null,那么取赋值??右边的: 栗子:int  a=3 ...

  9. 跟着ZooKeeper学Java——CountDownLatch和Join的使用

    在阅读ZooKeeper的源码时,看到这么一个片段,在单机模式启动的时候,会调用下面的方法,根据zoo.cfg的配置启动单机版本的服务器: public void runFromConfig(Serv ...

  10. fatal error C1083: 无法打开编译器生成的文件:“../../build/vs71/release/lib_json\json_value.asm”: No such file or directory

    修改生成静态库文件的工程的属性:路径为:菜单---项目--属性---配置属性---c/c++---输出文件---汇编程序输出:无列表