1. count的使用
SELECT
count(*) countnall, #不忽略null,统计所有数据
count(STATUS) countstatus, #指定列名,忽略列值为null的记录
count(DISTINCT prizelevel) leveldiff #DISTINCT 参数:只包含不同的列值
FROM
bsy_prizeinfo;
2. group by的使用
group by 子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)。
·如果在 SELECT 中使用表达式,则必须在GROUP BY 子句中指定相同的表达式。不能使用别名。
·除聚集计算语句外, SELECT 语句中的每个列都必须在 GROUP BY 子句中给出。
如果分组列中具有 NULL 值,则 NULL 将作为一个分组返回。如果列中有多行 NULL 值,它们将分为一组。
SELECT
id, #每组组中id最小数据行
min(id), #每组中最小id
prizecode, #未在group by的列,mysql可以查询不是分组的列
prizelevel, #列值中有null,最为一个分组返回
count(*) AS levelcount, #统计所有的数据
GROUP_CONCAT(prizecode,‘ , ‘) groupconcat #每一组中某个字段的集合
FROM
bsy_prizeinfo
WHERE
STATUS = ‘未领取‘ #where子句执行先于group by,从左到右执行过滤条件
GROUP BY
prizelevel #默认按照分组列递增排序
having count(*)>1 ; #过滤分组后的结果,只能和select中表达式相同,不能使用别名
注意:where在数据分组前进行过滤, having在数据分组后进行过滤。
1、where过滤条件;
2、group by分组,每组按主键自增排序,取出未分组列为每组id最小的数据行;
3、having过滤排序结果; WHERE 子句的条件(包括通配符条件和带多个操作符的子句)。所学过的有关 WHERE 的所有这些技术和选项都适用于HAVING 。它们的句法是相同的,只是关键字有差别。
3.子查询
原文:http://wlan2014.blog.51cto.com/5553663/1900452