zoukankan      html  css  js  c++  java
  • 浅谈Sql各种join的用法

    1、left join、right join、inner join三者区别

    left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
    right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
    inner join(等值连接) 只返回两个表中联结字段相等的行

    新建两张表进行测试:

    表a

    CREATE TABLE a (
      user_id VARCHAR(30) DEFAULT NULL,
      user_name VARCHAR(30) DEFAULT NULL,
      user_age VARCHAR(30) DEFAULT NULL,
      user_num VARCHAR(30) DEFAULT NULL,
      user_sex VARCHAR(30) DEFAULT NULL
    )

    表b

    CREATE TABLE b (
      user_id VARCHAR(30) DEFAULT NULL,
      user_phone VARCHAR(30) DEFAULT NULL
    )

    插入数据:

    insert into a (user_id, user_name, user_age, user_num, user_sex) values('001','test001','20','110','male');
    insert into a (user_id, user_name, user_age, user_num, user_sex) values('002','test002','20','119','female');
    insert into b (user_id, user_phone) values ('001','110112119')

    2、相关测试

    测试left join

    SELECT * FROM a LEFT JOIN b  ON a.user_id= b.user_id;

    测试right join

    SELECT * FROM a RIGHT JOIN b  ON a.user_id= b.user_id;

    测试inner join

    SELECT * FROM a INNER JOIN b  ON a.user_id= b.user_id;

    3、其他提示

    有时候也可以换种思路进行sql写法:

    比如:想取a表数据,user_id不在b表的信息

    left join会有两条数据

    本来预期的结果是002这条记录。变成了两条,所以这种用法不可取。

    right join

    看似可以,再往b加条数据

    变成这样了,001怎么又冒出来了,所以这种不可取。

    inner join

    这样更不行了,也不可取。

    换种思路比如

    1、not in

    比如可以写:

    select *from a where a.user_id not in(select b.user_id from b)【选取a表id不在b表的数据】

    2、not exists 

    select *from a where a.user_id not exists(select b.user_id from b)【选取a表id不在b表的数据】

     当然数据量大的话,要看看这两种的性能了:

     选中SQL,右键 点击 解释计划 【F5快捷键】

    查看耗费和基数,耗费和基数越小,代表查询效率越高。所以这个时候选用not exists性能更佳。

    另外数据量大的话可以通过建立索引也可以提高效率

    小数据量distinct 稍稍快点
    稍大的数据量group by 稍稍快点

     
  • 相关阅读:
    Java硬件同步机制Swap指令模拟+记录型信号量模拟
    算法(第四版)练习 1.1.26 ~ 1.1.31
    C++ 电路布线/最短路径问题
    线性代数笔记
    算法导论(第三版)练习 2.2-1 ~ 2.2-4
    条款45: 弄清C++在幕后为你所写、所调用的函数
    条款42: 明智地使用私有继承
    条款41: 区分继承和模板
    【python】字符遍历
    【python】range的用法
  • 原文地址:https://www.cnblogs.com/shawWey/p/6638209.html
Copyright © 2011-2022 走看看