1.group by用法
只有在分组统计中才会使用group by ,这个分组统计有两个涵义:第一必须是分组,不以组归类就无所谓group by,group by的意思就是以组为单位。第二,必须是计算,而且必须是按组计算。
如
计算每个班级多少人:
select class,count(*) from students group by class;按班级计算,每个班级有多少人。(正确)
select class,grade from students group by class;(错)没有统计计算
举例:
有这样一个表
id 科目 姓名 分数
1 英语 王生 98
2 语文 张生 83
3 数学 王生 91
4 英语 张生 95
5 化学 李生 85
...
1. 只能用一句sql语句,查询到科目成绩总和最高的那位学生
2. 只能用一句sql语句,查询到各科成绩都大于90的那个学生
答案:
1. select top 1 姓名,sum(分数) as 分数总和 from 表名 group by 姓名
order by 分数总和 desc
2. select 姓名 from 表名 group by 姓名 having min(分数)>90
2.having用法
having 条件表达式 :筛选成组后的各种数据,(区别:where子句在聚合前先筛选记录,)也就是说作用在group by和having字句前。而 having子句在聚合后对组记录进行筛选。(是先group by后的视图,然后从该视图中对having条件进行筛选);
例子:先用where pv>1筛选,然后用group by frp分组查询得到pvtotal,最后根据分组后得到的sql视图用having pvtotal>1筛选结果。
SELECT sum(pv) as pvtotal,frp FROM `tj_pt_src_day` where pv>1 group by frp having pvtotal>1
HAVING不能用于应被用于WHERE子句的条目。 例如,不能编写如下语句:
mysql> SELECT col_name FROM tbl_name HAVING col_name > 0;
而应这么编写:
mysql> SELECT col_name FROM tbl_name WHERE col_name > 0;
3.复合主键:primary key(key1,key2,...)
create table timestamp (id int(11) auto_increment,name varchar(20),intime int(10),primary key(id,intime)) default character set utf8 collate utf8_general_ci;
注意:这不是一个表里有多个主键,而是复合主键,由多个字段组合在一起作为主键,设置复合主键的原因是当一个列不足以用来表示一条记录的唯一性的时候,就需要设置多个列为复合主键,来标识一条记录的唯一性。