如何分组数据,以便能汇总表内容的子集。这涉及两个新SELECT语句子句,分别是GROUP BY子句和HAVING子句。
分组允许把数据分为多个逻辑组,以便能对每个组进行聚集计算。
分组是在SELECT语句的GROUP BY 子句中建立的。
来看例子理解:
mysql>select vend_id,COUNT(*) AS num_prods from products group by vend_id
也就是不同的Id的商品总数都能分别查出来。
除了能用GROUP BY分组数据外,Mysql还允许过滤分组,规定包括哪些分组,排除哪些分组。
也就是HAVING子句。
mysql>select cust_id,COUNT( /) AS orders from orders <u>GROUP BY</u>cust_id <u>HAVING</u>COUNT( /) >=2
注意:这里HAVING换成WHERE是不管用的。HAVING针对于分组。
WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。
那么咱么看看怎么混合WHERE和HAVING。
mysql>select vend_id, COUNT( / ) AS num_prods from products <u>where prod_price>=10 group by</u>vend_id HAVING COUNT( /) >=2
mysql>select order_num,SUM(quantity*item_price) AS ordertotal
from orderitems
GROUP BY order_num
HAVING SUM(quantity*item_price) >=50
order by ordertotal
▲ count(*)
统计查询结果集返回的行数.
▲ count(ve)
统计值表达式返回的非空值的个数.
▲ count(distinct ve)
统计值表达式返回的非空不同值的个数.
▲ sum(ve)
统计值表达式返回的非空值的和.
▲ sum(distinct ve)
统计值表达式返回的非空不同值的和.
▲ avg(ve)
统计值表达式返回的非空值的平均值.
▲ avg(distinct ve)
统计值表达式返回的非空不同值的平均值.
▲ max(ve)
统计值表达式返回的非空值的最大值.
▲ min(ve)
统计值表达式返回的非空值的最小值.
由group by子句来实现的.
语法:
(1)分组的引入
(2)分组定义
指定某列或某些列作为划分的依据,比较这些列值是否相同,具有相同列值的行放在同一组,这样就可以将最初的结果集划分为若干个子集,每个子集称为一个分组.
一般来说有多少个不同的列值就可以分为多少组.
语法:
指定某列或计算列作为统计的对象,将统计函数作用在该对象上,统计函数按照分组自动对每一分组的列值进行统计,每一分组返回一个统计后的结果.
(1)MYSQL对GROUP BY的非ANSI标准扩展
是由having子句来实现的.
语法:
(1)having子句中的子查询
第二节为大家介绍了数据的查询,这一小节为大家深入讲解查询过程中的数据分组和排序,分组关键字为:group by,排序关键字为:order by,过滤分组的关键字为:having;
group by:对查询的数据按照某一类型进行分组, group by 一般用在order by子句之前,where子句之后
order by:对查询的数据进行某一类进行排序 或 对分组后的数据进行排序
having:对分组后的数据进行条件过滤
继续以上一章创建的客户表为例,表名: customer ,表有列: cus_id,cus_no,cus_name,cus_age,cus_adds。
eg:查询客户的基本信息,以id进行分组: select cus_id,count(*) as num from customer group by cus_id num表示对应的cus_id有多少客户数据, 查询结果如下
如果分组的列中有null值,那么null将作为一个分组返回,如果有多个行都为null值,它们将会被分为一组返回。 group by 必须用在where子句之后,order by子句之前。
除group by可以进行分组过滤数据外,having也可以进行过滤分组;having过滤和where类似,唯一区别在于where是过滤行,而having是过滤分组,可看以下列子:
eg: 查询以id分组后数据总量两条以上的数据: select cus_id,count(*) as num from customer group by cus_id having count(*) >= '2'满足条件的就只有一条数据
order by主要用于数据排序的情况,当查询数据量较大时,有序的数据会让人更好地直观观察数据,order by 关键字用于对结果集按照一个列或者多个列进行排序。此外order by 关键字默认按照升序对记录进行排序。如果需要按照降序对记录进行排序,您可以使用 DESC 关键字。使用方法如下
eg:查询客户的基本信息,以年龄进行排序,默认升序:select * from customer order by cus_age
eg:查询客户的基本信息,以年龄进行排序,降序方式排序:select * from customer order by cus_age DESC
升序使用ASC,降序使用DESC,系统默认为升序。注意两者之间的差异
当对多个列进行排序时,order by使用方法如下:
order by A,B --过滤数据都是默认按升序排列
order by A desc,B --过滤数据时 A 降序,B 升序排列
order by A ,B desc --过滤数据时 A 升序,B 降序排列
desc 或者 asc 只对它紧跟着的第一个列名有效,其他不受影响,仍然是默认的升序。
本小节介绍排序分组就到这里了,通过多分组排序的介绍,知道了group by,order by,having三者之间的差异和区别,大家可以在自己电脑多编写几个脚本,深入了解三个关键字的使用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)