mysql的join用法(二)

163 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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用法,随着表的增加,难度会乘倍数的增加,需要我们格外注意好啦🥗🥗🥗;

结束结束,那就🛴🛴🛴