1.我所理解的group by 语句
比如说有一个表结构如下:
client server speed
如果想看一下相同的client作为一组计算出来总的speed的话可以
select sum(speed) from speed group by client;
就是说是一个组。我们可以针对某个组进行一些聚合计算比如说求和SUM
计算平均值、计算个数等相关的操作!
有的时候比如说 我想分组但是呢 有些我又不想要查询出来怎么办呢?
可以通过使用having 操作。表示过滤性的分组操作的!只能是某些条件成立的才能查询出来的!
当然也可以加入进来一些相关的判断哦!HAVING AVG(SALARY) > 2 * MIN(SALARY)
还可以加入and or等联结字符串进来的!
示例:
下列查询寻找雇员数超过 4 的部门的最高和最低薪水:
SELECT WORKDEPT, MAX(SALARY) AS MAXIMUM, MIN(SALARY) AS MINIMUM
FROM EMPLOYEE
GROUP BY WORKDEPT
HAVING COUNT(*) > 4 --过滤
ORDER BY WORKDEPT
使用 GROUP BY 子句时,一定要记住下面的规则:
1. 不能 GROUP BY text、image 或 bit 数据类型的列
2. SELECT 列表中指定的每一列也必须出现在 GROUP BY 子句中,除非这列是用于聚合函数。
SELECT 字段信息(必须得应用于GROUP BY中)
3. 不能 GROUP BY 列的别名。 这是说 GROUP BY 字段列表中的所有字段必须是实际存在于 FROM 子句中指定的表中的列。
4. 进行分组前可以使用 WHERE 子句消除不满足条件的行。
5. 使用 GROUP BY 子句返回的组没有特定的顺序。可以使用 ORDER BY 子句指定想要的排序次序。
通过使用distinct关键字能够实现的是将重复的记录踢除掉的!
问题需求:
1.表结构:speed
id client server speed
我现在想要看一下同一个client的值可是server却不一样!表示同一个IP被解析到了两个不同的服务器上面了!
如何解决?
第一种方案:通过表的联合查询。即表自身的查询操作
SQL语句:select count(*) from speed a,speed b where a.client=b.client and a.server<>b.server
一开始测试数据量非常得少。速度很快
但是当数据量非常地大了之后就会出现问题了。麻烦的事也跟着来了
我建立好索引:create index test on speed(client,server)
发现一样不起作用!
于是我好好分析一下联合查询的原理:
比如说:select * from t1,t2
表示是t1的记录得去遍历全部的记录的。这样的效率会比较慢的!
相当执行的次数年是t1*t2的条数!
可想而知其速度是非常地缓慢的!
第二种方案:这里我们其实是只要操作一个单表的。所以没有必要去考虑自身的查询了。
思路:先分组。表示哪些个client是一组的。然后分析一下这些个组中哪些个server差异个数超过了1
就是说我们的分组是有条件性的。不是全部的都分组过来的。所以可以这样来写SQL语句
select count(*) from speed group by client having count(distinct(server)) > 1
分组的时候我们添加了条件过滤 必须我们的server的不同的 个数超过1
解决: 处理同一个表中两个字段或多个字段的差异性查询时非常有用!
阅读(1367) | 评论(1) | 转发(0) |