SQL语句执行问题
执行顺序
select [all|distinct]
<目标列的表达式1> AS [别名],
<目标列的表达式2> AS [别名]...
from <表名1或视图名1> [别名],<表名2或视图名2> [别名]...
[where <条件表达式>]
[group by <列名>]
[having <条件表达式>]
[order by <列名> [asc(从小到大排序)|desc(从大到小排序)]]
[limit <数字或列表>];
通过FROM子句中找到需要查询的表,
通过WHERE子句进行非聚合函数筛选判断:
通过GROUP BY子句完成分组操作;
通过聚合函数完成计算操作
通过HAVING子句完成组函数筛选判断,
通过SELECT子句选择显示的列或表达式及组函数,
通过ORDER BY子句进行排序操作。
通过LIMIT子句进行分页操作
别名的用法详解
select empno,ename,count(*) as sum
from emp
where sum>7
group by sum
having sum>7
order by sum
limit(5,2)修正后
select empno,ename,count(*) as sum
from emp
group by empno,ename
having sum>7
order by sum
limit 5,2;
原语句存在的问题
where
** 子句中使用聚合函数**:WHERE
子句在分组操作(GROUP BY
)之前执行,而sum
是通过GROUP BY
分组后使用COUNT(*)
计算出来的聚合结果,所以不能在WHERE
子句中引用聚合别名sum
。limit
** 语法错误**:LIMIT
子句的正确语法是LIMIT offset, row_count
或者LIMIT row_count
,在 MySQL 中不需要括号,正确写法是LIMIT 5, 2
。
别名用法详解
列别名
在 SQL 中,列别名用于为查询结果中的列指定一个新的名称。可以使用关键字 AS
来指定别名,也可以省略 AS
。在你的语句里,count(*) as sum
就是给 COUNT(*)
函数的结果指定了一个别名 sum
,之后在 HAVING
和 ORDER BY
子句中就可以使用这个别名来引用聚合结果。
表别名
表别名用于为表指定一个简短的名称,在多表查询时可以简化表名的引用,提升 SQL 语句的可读性。不过在你给出的语句里没有使用表别名。
修正后的 SQL 语句及解释
-- 从 emp 表中查询数据
SELECT empno,ename,COUNT(*) AS sum
FROM emp
-- 按 empno 和 ename 进行分组
GROUP BY empno, ename
-- 筛选出分组后记录数大于 7 的组
HAVING sum > 7
-- 按照记录数(即 sum 列)进行升序排序
ORDER BY sum
-- 跳过前 5 条记录,取接下来的 2 条记录
LIMIT 5, 2;
代码解释
SELECT
** 子句**:从emp
表中选择empno
、ename
列,同时使用COUNT(*)
函数统计每个分组中的记录数,并将结果命名为sum
。FROM
** 子句**:指定数据来源为emp
表。GROUP BY
** 子句**:按照empno
和ename
进行分组,这样COUNT(*)
函数会分别统计每个empno
和ename
组合的记录数。HAVING
** 子句**:在分组之后进行筛选,只保留sum
大于 7 的分组。ORDER BY
** 子句**:按照sum
列进行升序排序。LIMIT
** 子句**:跳过前 5 条记录,取接下来的 2 条记录。