MYSQL 多表联合查询实例 left join ,group by语法

本文介绍了在MYSQL中进行多表联合查询时如何使用LEFT JOIN和GROUP BY语法。通过实际例子,展示了LEFT JOIN如何保留所有左表数据,即使在右表中没有匹配项,以及GROUP BY如何对查询结果进行分组统计。同时讨论了在统计工作中去除重复数据的重要性,并提到了INNER JOIN和RIGHT JOIN的区别。

最近一个多月的时间都在做跟mysql有关的事情,一个比较简单的数据查询工作对于我这种超级小菜鸟来说,也算是经历了千难万险。感觉自己学到不少东东,so拿出来晒一晒,求拍砖。。。嘻嘻

就从我遇到的一个个困难说起。。。。


1.几张表联合查询时候代码的简约。

记得某天跟几个boss一起吃饭的时候,他所:乃们现在的小同学,都不大知道什么leftjoin啊,having啊什么的,范式更是了解甚少啊。当场我表示一片空白,因为数据库是在大二的课程,当时只是做简单的查询而已,学过的一些复杂一点的查询,后来用不到也就忘记了。

好的,第一次遇到的问题是,几张表的联合查询,逻辑并不复杂,我大概写了这样一堆代码:



可见上面一段代码执行了四张表的联合查询(具体含义不解释),我大致画张图,找找表关系,很快就写好。

用到了一个聚集函数:count(),计算了一下记录的数量,返回select的非null值的数目。当找不到符合条件的记录,返回0。可以看到在函数里面有一个distinct关键字,这个关键字的作用是返回唯一的不重复的记录,这个关键字的添加源于我发现我处理的数据库中有多条数据是重复的,除了自增的id外,其他属性均完全相同,这样大大影响了统计工作的准确性。

正当我很开心的得出结果的时候,我被彻底的鄙视了。。。于是一段对我来说神一样的代码出现了:


有几个比较关键的知识点:

某属性 IN(select ...)这个形式还在很多地方都可以碰到的,用于给某属性定义条件范围的,代表某属性的值应该在括号中语句执行的结果当中。

left join 来临了!在多表查询过程中有好几个join,与他对应的还有right join,inner join。不妨举一个例子来解释一下~

表a                     表b

id  name            id   name

1   a               1    b

2   aa              2    bb

3   aaa             3    bbb

4   aaaa

select * from a left join b on a.id=b.id 得出的结果是这样的,对于表a的数据都要列出,对于b表中没有相对应的数据用null来表示,如下

1 a     b 

2 aa    bb 

3 aaa   bbb 

4 aaaa  null

若把left join变为inner join,取出二者相匹配的部分,则得出这样的结果 

1 a   b 

2 aa  bb 

3 aaa bbb 

同样,要是right join其实就是跟left join的情况相反,聪明的你肯定会得出结果的~

恩,group by()函数的问题,group by() ,根据数据列的每个成员对查询结果进行分组统计,通常与count(),having神马的一起出现。如同上面代码出现的group by,有一个最基本的要求就是,select函数中必须有分组列或者列函数。可以从上面的例子看出来,e.name为分组列,而count()为列函数的计数操作。结果按照分组标准对每一组返回一个结果。

值得一提的是left join的有点,正是利用它可以把左表全部展示的特点,我们可以列出所需要的所有列,通常在计数的时候,数目为0的列直接不显示,而这对于报表的完整性和可阅读性造成很大的缺陷,利用left join这个连接,在结果中有效的现实了所有列及其计数结果。

 








评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值