准备
以下面两张表为例开始讲
文章表 t_article:
文章内容表 t_article_info:
一、内连接 JOIN,INNER JOIN,WHERE,STRAIGHT_JOIN
图示:
获取两个表中字段匹配关系的记录,也就是求交集。
① join
select * from `t_article` as `a` join `t_article_info` as `b` on `a`.`id`=`b`.`article_id`
② inner join
select * from `t_article` as `a` inner join `t_article_info` as `b` on `a`.`id`=`b`.`article_id`
③ where
select * from `t_article` as `a`,`t_article_info` as `b` where`a`.`id`=`b`.`article_id`
④ straight_join
select * from `t_article` as `a` straight_join `t_article_info` as `b` on `a`.`id`=`b`.`article_id`
结果:
我们发现四个结果都是一样的,有人会问,那有什么区别呢?
所有我决定用大数据测试它们的执行速度,用百万数据插入大法,方法如下:
DROP PROCEDURE IF EXISTS my_insert;
CREATE PROCEDURE my_insert()
BEGIN
DECLARE n int DEFAULT 1;
loopname:LOOP
INSERT INTO `t_article`(`id`,`title`,`author`,`create_time`) VALUES ('', n, '鲲鲲', '1584562591');
SET n = n + 1;
IF n = 1000000 THEN
LEAVE loopname;
END IF;
END LOOP loopname;
END;
-- 执行函数
CALL my_insert();
由于速度过慢所以只插入了100000条数据,看看结果吧:
1.inner join和join实际上是一样的,就只测一个。
2.where
3.straight_join
结果就是这样 。
二、左连接 LEFT JOIN
图示:
获取左表所有记录,即使右表没有对应匹配的记录。
select * from `t_article` as `a` left join `t_article_info` as `b` on `a`.`id`=`b`.`article_id`
结果:
三、右连接 RIGHT JOIN
图示:
与 left join 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
select * from `t_article` as `a` right join `t_article_info` as `b` on `a`.`id`=`b`.`article_id`
结果:
四、外连接 OUTER JOIN
图示:
外连接就是求两个集合的并集。
1.其实左连接和右连接都是省略了outer,原写法:left outer join;right outer join。
2.MySQL是不支持OUTER JOIN,但是可以用UNION操作来实现。
select * from `t_article` as `a` left join `t_article_info` as `b` on `a`.`id`=`b`.`article_id`
union
select * from `t_article` as `a` right join `t_article_info` as `b` on `a`.`id`=`b`.`article_id`
结果:
五、自然连接 NATURE JOIN
-- 自然连接
select * from `t_article` natural join `t_article_info`;
-- 笛卡尔积
select * from `t_article` natura join `t_article_info`;
-- 笛卡尔积
select * from `t_article` nature join `t_article_info`;
结果:
六、USING
using等价于join操作中的on,但是要保证两个表关联字段相同,我上面的两个表是不满足条件的,所有我把t_article_info表article_id改成了id
① inner join
select * from `t_article` join `t_article_info` using(id)
结果:
② left join
select * from `t_article` left join `t_article_info` using(id)
结果:
其他的就省略