sql select语句(五)
分组数据
1. 数据分组 GROUP BY子句
当我们想获得在年龄为23的人的人数是我们可以用
SELECT COUNT(*) FROM ms WHERE age==23;
但当我们想要获得所有年龄段的人的分别人数时,用这条语句就显得有点麻烦了,这时我们就可以用分组,使用GROUP BY子句了。
SELECT age,COUNT(*) AS age_count
FROM ms
GROUP BY age;
注: GROUP BY 子句要放在 WHERE 子句之后
2. 过滤分组 HAVING
MySQL除了可以使用GROUP BY 分组数据外,还允许对分组进行过滤,规定包括哪些分组,排除哪些分组,这时我们就要用到HAVING子句,HAVING 子句的语法与WHERE子句的语法一样,只是操作对象,以及关键词的区别,理论上WHERE子句能做到的事,HAVING子句都可以做到
SELECT age,COUNT(*) AS age_count
FROM ms
GROUP BY age
HAVING COUNT(*)>10;
子句 | 说明 |
---|---|
SELECT | 要返回的列或表达式 |
FROM | 从中检索数据的表 |
WHERE | 行级过滤 |
GROUP BY | 分组说明 |
HAVING | 组级过滤 |
ORDER BY | 输出排序顺序 |
LIMIT | 要检索的行数 |
使用子句查询
1. 利用子查询进行过滤
如:订单表,通常有两张表,对于包含订单号,客户ID,订单日期的每个订单储存与orders表,各订单的物品储存在相关的orderitems表中。orders表不储存客户信息,实际信息储存在customers表中
例:现我们要列出订购物品TNT的所有客户
第一步:检索出包含物品TNT的所有订单编号,。
SELECT order_num
FROM orderitems
WHERE prod_id = 'TNT';
第二步:检索出这些订单的客户ID
SELECT cust_id
FROM orders
WHERE order_num IN (1001,1002);
这是我们可以通过子查询对上述两条语句进行合并完成相同的功能
SELECT cust_id
FROM orders
WHERE order_num IN(SELECT order_num
FROM orderitems
WHERE prod_id = 'TNT' );
2. 作为计算字段使用子查询
例: 假如需要显示customers表中每个客户的订单总数,订单与相应的客户ID储存在orders表中。
1. 从customers表中检索客户表
2. 对检索出的每个客户,统计其在orders表中的订单数目
例:
SELECT COUNT(*) AS orders
FROM orders
WHERE cust_id = 1;
这是我们通过子查询
例:
SELECT cust_name,(SELECT COUNT(*)
FROM orders
WHERE orders.cust_id== customers.cust_id) AS orders
FROM customers
ORDER BY cust_name;