表order1中的数据:
汇总数据
1.聚集函数
聚集函数:运行在行组上,计算和返回单个值的函数。
SQL聚集函数
函数 | 说明 |
---|---|
AVG() | 返回某列的平均数 |
COUNT() | 返回某列的行数 |
MAX() | 返回某列的最大值 |
MIN() | 返回某列的最小值 |
SUM() | 返回某列之和 |
SELECT AVG(order_price) AS avg_price
FROM order1;
返回表order1 中order_price一列的平均值
2.聚集不同值
像最开始的表里一样,价格有许多重复的,如果只想把不同的值加起来求平均值该怎么办?这就用到了之前博客中提到的DISTINCT
SELECT AVG(DISTINCT order_price) AS avg_price
FROM order1;
3.组合聚集函数
SELECT语句可以根据需要包含多个聚集函数
SELECT COUNT(*)AS num,
MAX(order_price) AS max_price
AVG(order_price) AS avg_price
FROM order1;
————————————————————————————————————————————————————————
————————————————————————————————————————————————————————
分组数据
为了讲解分组数据,先把表order1做一些变动:
加入一列name
1.创建分组
-
GROUP BY
假设要根据name统计供应商提供的产品
SELECT order_name,
COUNT(*)AS num
FROM order1
GROUP BY order_name;
group by按照order_name分组,即a为一组,b为一组,count的统计也不是对整张表进行操作,而是在每个分组内进行统计
使用GROUP BY的规定
【1】GROUP BY子句可以包含任意数目的列。
【2】如果在GROUP BY子句中嵌套了分组,数据将在最后规定的分组上进行汇总。
【3】GROUP BY子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)。如果select中使用表达式,则GROUP BY子句中必须指定相同的表达式,不能使用别名。
【4】除聚集函数之外,select语句中的每个列都必须在GROUP BY子句中给出。
【5】如果分组中具有NULL值,则NULL将作为一个分组返回。如果列中有多行NULL值,分为一个组。
【6】GROUP BY子句必须出现在where子句之后,order by子句之前。
2.过滤分组
group by可以分组数据,如果要过滤分组,即排除哪些分组,留下哪些分组,这个时候就不能使用where,因为where过滤的是行而不是分组。
- HAVING
HAVING支持所有WHERE操作符,即它们句法相同,只是关键字有差别。
SELECT order_name,
COUNT(*)AS num
FROM order1
GROUP BY order_name;
HAVING COUNT(*)> 2;
HAVING对分组进行过滤,上面这个语句,过滤了分组之后num大于2的值
3.分组排序
使用order by 进行排序
————————————————————————————————————————————————————————-
子查询
子查询:嵌套在其他查询中的查询
将一条select语句返回的结果,用于另一条select语句的where子句
SELECT cust_id
FROM orders
WHERE order_num IN (SELECT order_num
FROM orderitems
WHERE prod_id = 'tnt2');
第二个SELECT 返回,从表orderitems中prod_id为tnt2的order_num,
将这个结果又传递给外部查询的where子句
——————————————————————————————————————————————————————————
SELECT字句顺序
把之前学的查询语句顺序进行整理,也是使用时必须遵循的次序
子句 | 说明 | 是否必须使用 |
---|---|---|
SELECT | 要返回的列或表达式 | 是 |
FROM | 从中检索数据的表 | 仅在从表选择数据时使用 |
WHERE | 行级过滤 | 否 |
GROUP BY | 分组说明 | 仅在按组金酸聚集时使用 |
HAVING | 组级过滤 | 否 |
ORDER BY | 输出排序顺序 | 否 |
LIMIT | 要检索的行数 | 否 |