sql select语句(五)

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;
发布了28 篇原创文章 · 获赞 1 · 访问量 584

猜你喜欢

转载自blog.csdn.net/qq_41911729/article/details/104451727