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 稍稍快点

     
  • 相关阅读:
    POJ 1681 Painter's Problem(高斯消元法)
    HDU 3530 Subsequence(单调队列)
    HDU 4302 Holedox Eating(优先队列或者线段树)
    POJ 2947 Widget Factory(高斯消元法,解模线性方程组)
    HDU 3635 Dragon Balls(并查集)
    HDU 4301 Divide Chocolate(找规律,DP)
    POJ 1753 Flip Game(高斯消元)
    POJ 3185 The Water Bowls(高斯消元)
    克琳:http://liyu.eu5.org
    WinDbg使用
  • 原文地址:https://www.cnblogs.com/shawWey/p/6638209.html
Copyright © 2011-2022 走看看