MYSQL 多表联合查询实例 left join ,group by语法
2012-08-14 14:28
786 查看
最近一个多月的时间都在做跟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这个连接,在结果中有效的现实了所有列及其计数结果。
就从我遇到的一个个困难说起。。。。
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这个连接,在结果中有效的现实了所有列及其计数结果。
相关文章推荐
- MYSQl left join 联合查询效率分析
- MySQL联合查询语法内联、左联、右联、全联
- MYSQl left join 联合查询效率分析
- MySQL联合查询语法内联、左联、右联、全联
- MySQL联合查询语法内联、左联、右联、全联
- MySQL多表联合查询语法示例
- 实例讲解MySQL联合查询
- MySQL联合查询语法内联、左联、右联、全联
- MySQL联合查询语法内联、左联、右联、全联
- MySQL联合查询语法内联、左联、右联、全联
- mysql中高效查询(left join 和 group by),前提是加了索引
- MySQL联合查询语法内联、左联、右联、全联
- MySQL 子查询(subquery)语法与用法实例
- MySQL联合查询语法内联、左联、右联、全联
- MySQL 实例讲解联合查询
- 【mysql】【查询的五种语法where、group by、having、order by、limit】
- MySQL联合查询语法内联、左联、右联、全联
- MySQL联合查询语法内联、左联、右联、全联
- 【mysql】 mysql 子查询、联合查询、模糊查询、排序、聚合函数、分组----------语法
- MySQL联合查询语法内联、左联、右联、全联