一条sql统计出各阶段的数量

本文介绍了一个使用SQL查询来统计不同年龄段人数的案例。通过CASE WHEN语句将年龄分为三组,分别为18岁及以下、19至22岁、23岁以上,然后对每组进行计数。

需求案例:统计出各年龄段人数

表结构:

sql:

SELECT
	count( a1 ) AS A1,
	count( a2 ) AS A2,
	count( a3 ) AS A3 
FROM
	(
SELECT
	( CASE WHEN age <= 18 THEN age END ) AS a1,
	( CASE WHEN age > 18 AND age <= 22 THEN age END ) AS a2,
	( CASE WHEN age > 22 THEN age END ) AS a3 
FROM
	sys_user 
	) t

结果:

### SQL 查询执行顺序解析 在 MySQL 中,虽然 SQL 语句通常按照 `SELECT`、`FROM`、`WHERE`、`GROUP BY`、`HAVING`、`ORDER BY` 和 `LIMIT` 的顺序书写,但在内部执行时却遵循着另一种逻辑顺序。以下是具体的执行流程: #### 1. **FROM** 查询的起点是从 `FROM` 子句开始,在这里指定数据源表或视图[^3]。如果存在多个表,则会先构建笛卡尔积并应用连接条件。 #### 2. **ON** 对于涉及多表联结的情况,`ON` 条件用于过滤哪些行可以参与联接操作。此阶段的结果是一个中间虚拟表 VT1。 #### 3. **JOIN** 完成联接处理后生成新的虚拟表 VT2。需要注意的是,外键约束不会影响这一阶段的行为。 #### 4. **WHERE** 接着是对上述结果集进一步筛选符合条件的数据记录形成 VT3。值得注意的是,这里的条件不适用于聚合函数计算后的字段值。 #### 5. **GROUP BY** 随后进入分组环节,依据指定列将 VT3 划分为若干个小组得到 VT4。此时每组可能只保留一条代表性的汇总信息。 #### 6. **WITH ROLLUP (可选)** 如果有定义 rollup 功能的话,则在此处增加额外的小计和总计行至 VT5。 #### 7. **HAVING** 再通过 HAVING 过滤掉不符合特定统计标准的那些组别从而得 VT6。 #### 8. **SELECT** 之后挑选所需的列或者表达式来创建最终输结构即 VT7。这一步还涉及到去重 DISTINCT 操作以及各种内置函数的应用。 #### 9. **DISTINCT** 去除重复项以确保结果集中每一行都是独一无二的存在于 VT8 当中。 #### 10. **ORDER BY** 最后一步是根据设定好的排序规则重新排列所有条目成为游标 VC10 而非传统意义上的表格形式[^4]。由于该动作较为耗费性能资源所以在设计初期就应该考虑优化策略减少不必要的开销。 #### 11. **LIMIT / OFFSET** 限定返回的最大数量或者是跳过前面一定量级后再取固定数目构成最终呈现给用户的成果集合。 ```sql -- 示例代码展示完整的SQL查询语法及其组成部分 SELECT column_name(s) FROM table_name WHERE condition GROUP BY column_name(s) HAVING group_condition ORDER BY column_name(s) ASC|DESC LIMIT number_rows; ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值