浅谈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表的数据】
当然数据量大的话,要看看这两种的性能了:
查看耗费和基数,耗费和基数越小,代表查询效率越高。所以这个时候选用not exists性能更佳。
另外数据量大的话可以通过建立索引也可以提高效率
小数据量distinct 稍稍快点
稍大的数据量group by 稍稍快点