1.滤重
查询排重:select distinct 列名 from 表名 [where 条件];
distinct: 去重复。显示distinct后面列的内容,并且虑重。
2.列运算
3.order by
语法:select * from 表名 order by 列名 asc|desc ;
asc是升序排列,desc是降序排列
注意 : 可以有多个排序条件, 首先按照第一列进行排序,如果第一列相同,按照第二列在进行排序。
关于null的问题
如果使用null来进行表达式运算,那么计算的结果也会是null.
mysql中,提供了一个函数 :ifnull(列名,默认值)
判断该列是否为null,如果为null,返回默认值,如果不为null,返回实际的值
4.聚合函数
聚集函数:多个数据进行运算,运算出一个结果。例如,求和,平均值,最大值,最小值。
4.1 count函数
注意: count在根据指定的列统计的时候,如果这一列中有null 不会被统计在其中。
select count(*) from exam; --返回7
select count(math) from exam; --返回6
4.2 sum求和函数
sum 也可排除null
select sum(math) from exam; --返回422
注意点:
例2
需求 : 这个结果好像不太完美,因为小数点后保留了多位小数,因此需要截取小数?语法:round(数值, 小数的位数);
实现四舍五入的结果
4.3 avg函数
avg(列名) ----求该列的平均值----avg里面的null不作为统计
select avg(math) from exam;
结果:
以上由于刘阿斗的math是null,因此,在平均的时候平均的是6个人的成绩,刘阿斗不算在内,而这样的平均方式显然是错误的,因此在算平均分的时候,要先进行ifnull的判断,在进行avg的运算。sql语句修改如下:
select avg(IFNULL(math,0)) from exam;
结果:
例:求一个班级总分的平均分
select avg(sum(chinese) + sum(math) + sum(english)) from exam; --错误
注意:不能和sum一起使用,并且要对每一列先进行ifnull的判断,如果不进行ifnull的判断的话会缺少刘阿斗的那一行的成绩,结果会变成总共7个人,结果只把除刘阿斗以外的所有人的成绩进行相加然后除以6。而准确结果应该是所有人的成绩相加除以7才对。
select avg(IFNULL(chinese,0) + IFNULL(math,0) + IFNULL(english,0)) as 平均分 from exam;
4.4 max/min 最大值/最小值
统计该列的最大值或者最小值,null 排除在外。
同样不能跟sum一起用
统计总分的最高分和最低分
5.group by
分组: 按照某一列或者某几列。把相同的数据,进行合并输出。
说明:其实就是按列进行分类,然后可以对分类完的数据使用聚集函数进行运算。
注意事项:
1、聚合函数:分组之后进行计算;
2、通常 select的内容:a 被分组的列,b 聚合函数。
3、如果遇到这种情况 按照每种,每个。 类似的这些语句的时候,通常会使用分组。
4、如果使用group by对数据进行分组之后还要过滤。这时一般不能使用where,因为where关键字的后面不能跟上面讲解的这些函数。如果需要在过滤的条件中加上述的函数,只能使用having关键字。
5、where 后不能跟 聚合函数,having中可以跟 聚合函数。
select product,sum(price) from orders group by product;
例2:查询每一种商品的总价大于30的商品,并显示总价
如果分组之后,需要一些条件。则使用having 条件.,表示分组之后的条件。可以书写聚集函数。
select product,sum(price) as 总价 from orders group by product having sum(price) > 30;
where 和 having 的区别。
1、having 通常与group by 分组结合使用。 where 和分组无关。
2、where 后面的条件可以写在having 中,但是 having中的条件不一定能写在where中。having 可以书写聚合函数 (聚集函数出现的位置: select 之后,group by … having 之后) 例如having中的 聚集函数(count,sum,avg,max,min),是不可以出现where条件中。
3、where 是在分组之前进行过滤的。having 是在分组之后进行过滤的。
说明 : select … from … where 条件1 … gropu by … having 条件2 order by
条件1 会先执行过滤
而后进行分组
条件2进行过滤