一.聚合查询
聚合函数 | 含义 |
count() | 计算表中的记录数(行数) |
sum() | 计算表中数值列中数值的合计值 |
avg() | 计算表中数值列中数据的平均值 |
max() | 求出表中任意列中数据的最大值 |
min() | 求出表中任意列中数据的最小值 |
1.count()函数
--count()函数例
select count(*)
from product;
/* *号表示全部列
count(*)计算时包括了键值为null 的行 */
select count(sale_price)
from product;
--上述例程中count(sale_price)计算时不计算键值为null的行
2.SUM()函数
--例
select SUM(sale_price)
from product;
/*
SUM函数在计算含null值的列时会把null值直接排除
*/
3.AVG()函数
--例
select AVG(sale_Price)
from product;
/*
计算时将null值排除,不参与计算
*/
4.MAX()与MIN()函数
--例
select MAX(sale_price),MIN(sale_price)
from product;
注:MAX()与MIN()函数原则上可以适用任意数据类型的列
注2:SUM()与AVG()韩式只适用于数据类型的列
5.聚合函数中使用distinct
select count(distinct product_type)
from product;
--计算出有几种不同的product_type
二. 对表进行分组
1.group by 子句
select <列名1>,<列名2>,<列名3>....
from <表名>
group by <列名1>,<列名2>,<列名3>...;
例
--例1
select product_type, count(*) as '合计'
from product
group by product_type;
--例2
select product_type, product_name, count(*) as '合计'
from product
group by product_type, product_name;
注:子句的书写顺序
select子句 -> from子句 -> where子句 -> group by子句 -> having子句 -> order by子句
注2:包含为null的键值时,也将null作为单独的一组数据
注3:不能把聚合键之外二点列名书写在select子句中
注4:group by 子句中不能使用别名
注5:group by 子句得到的结果顺序是随机的,需要其他子句使其排序。
注6:where子句中不得使用聚合函数,事实上,只有select子句和having子句与order by子句中才可用聚合函数
三.为聚合结果指定条件
1.having子句(指定组的条件)
select <列名1>,<列名2>,<列名3>,...
from <表名>
group by <列名1>,<列名2>,<列名3>...
having <分组对应条件>;
注:having子句必须在group by子句之后
--例
select product_type, count(*)
from product
group by product_type
having count(*)=2;
注:having子句的构成要素:常属,聚合函数,group by 中指定的列名(聚合键)
四.对结果进行排序 order by 子句
select <列名1>,<列名2>,<列名3>...
from<表名>
order by <排序基准1>,<排序基准2>,...;
1.升序与降序
select product_id, product_name,sale_price, purchase_price
from product
order by sale_peice asc;
--asc 升序
select product_id, product_name,sale_price, purchase_price
from product
order by sale_peice desc;
--desc 降序
1.1指定多个排序键
select product_id,product_name,sale_price, product_type
from product
order by sale_price asc, product_id desc;
注:null所在的列作为排序键时,null不会参与排序,所以他总是在结果的开头或者结尾出现
注2:不得在排序键order by 子句中使用别名
注3:程序执行子句的顺序
from子句 -> where子句 -> group by子句 -> having子句 -> select子句 -> order by子句
1.2 order by子句中可以使用存在于表中的,但不包含在select子句中的列
select product_name, sale_price, product_type
from product
order by product_id;
1.3也可以使用列编号(列编号是指select子句中的列按照从左到右的顺序进行排列时所对应的编号,不是创建表时的列编号)
--列名指定
select product_id, product_name, sale_price, product_type
from product
order by sale_price desc, product_id asc;
--列编号指定
select product_id, product_name, sale_price, product_type
from product
order by 3 desc, 1 asc;
--select子句中列顺序变化导致结果发生变化
select product_id, product_name, regist_date, product_type,sale_price
from product
order by 3 desc, 1 asc;