持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情
前面说完了基础概念了,现在我们看看join具体用法吧(都以上讲表来查询)
inner join
我们看下内连接(表示两张表的共同数据)它等同于join,但还是建议加上join;
select * from a inner join b on a.rx_no = b.rx_no
left join
接着我们看下左外连接,这个的意思是保留a,b表的交集的数据同时保留左连接表的a表数据,对于右表部分置空处理,看下用例
select * from a left join b on a.rx_no = b.rx_no
right join
right join与left join正好相反,它会将左表的数据置空,右表未匹配的数据显示出来,这里我们需要往B表再插点数据
INSERT INTO `b`(`rx_no`, `memo`) VALUES ('e', '额');
接着查询下,看下结果
select * from a right join b on a.rx_no = b.rx_no
我们大部分场景用的都是这三种模式,这么看好像有点简单了是不是,总感觉哪里不对劲,绝对是表少了,条件少了,我们加个表,加点条件,难度应该sou的一下就上来了;这里再建个C表,看下大概数据
INSERT INTO `c`(`rx_no`, `cnt`, `groupno`, `id`) VALUES ('a', 2, 'A', NULL),('b', 3, 'B', NULL),('a', 3, 'A', NULL),('a', 7, 'B', NULL),('c', 15, 'C', NULL);
综合实现
大概目的是查询a表ID对应的rx_no号对应的C表同组号下的数量并对应b表的memo,带入对象可以理解成班里同学每人每个月花了多少钱,sql在三表查询,加上条件的时候立马难了起来;
select a.id,a.rx_no,b1.memo,c1.cnt from a
left join (select rx_no,memo from b ) b1 on a.rx_no = b1.rx_no
left join (select rx_no as cno,sum(cnt) as cnt from c GROUP BY groupno) c1 on a.rx_no = c1.cno
但是如果我们将其拆开一个一个分析,就简单了许多,先获取rx_no对应的memo,接着再将C表的cnt根据组号进行分组累加,最后我们通过left join,通过rx_no进行连接,如此就可以实现我们的要求啦;我们看下结果
之所以使用left join 且a表放最前面,是因为通常情况下,用户表的数据是最少的,且我们需要输出所有用户对应的连表信息,即使查询为空也要返回,好了,这就算完成一个多表联查了,真正的业务可能更加复杂,需要加上比如cnt在分组后大于某个值的才显示用户信息,其他全部舍弃,我们就可以inner join就可以达到效果了,看下demo
select a.id,a.rx_no,b1.memo,c1.cnt from a
left join (select rx_no,memo from b ) b1 on a.rx_no = b1.rx_no
inner join (select rx_no as cno,sum(cnt) as cnt from c GROUP BY groupno HAVING cnt > 5) c1
on a.rx_no = c1.cno
这是查询结果
以上就是我们的join用法,随着表的增加,难度会乘倍数的增加,需要我们格外注意好啦🥗🥗🥗;
结束结束,那就🛴🛴🛴