1. 聚合函数
AVG()、SUM():适用于数值字段
MAX()、MIN()、COUNT():适用于所有类型字段,其中COUNT(字段)不会统计字段为NULL的行
关于COUNT的题目:
题目一:用count(*)、count(1)、count(列名)谁好
对于MyISAM引擎的表是没有区别。因为其内部有一计数器在维护着行数
对于Innodb引擎的表用count(*)、count(1)直接读行数,复杂度是O(n),因为innodb真的要去数一遍。但好于具体的count(列名)
题目二:能不能使用count(列名)替换count(*)
不要使用count(列名)来替代count(*),count(*)是SQL92定义的标准统计行数的语法,跟数据库无关,跟NULL和非NULL无关
2. group by
可以在GROUP BY中使用WITH ROLLUP,在所有查询出的分组记录之后增加一条记录,该记录计算查询出的所有记录的总和。当使用WITH ROLLUP时,不能使用ORDER BY子句进行结果排序
例如:
mysql> select product, sum(order_amount) from order group by product with rollup;
+---------+-------------------+
| product | sum(order_amount) |
+---------+-------------------+
| 1 | 20 |
| 2 | 30 |
| NULL | 50 |
+---------+-------------------+
3 rows in set (0.00 sec)
mysql>
3. having
having可以对分组后的数据进行过滤操作
where和having的区别:如果需要通过连接从关联表中获取需要的数据,WHERE是先筛选后连接,而 HAVING是先连接后筛选