SQL语句执行问题

发布于:2025-05-18 ⋅ 阅读:(21) ⋅ 点赞:(0)

执行顺序

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;

原语句存在的问题

  1. where** 子句中使用聚合函数**:WHERE 子句在分组操作(GROUP BY)之前执行,而 sum 是通过 GROUP BY 分组后使用 COUNT(*) 计算出来的聚合结果,所以不能在 WHERE 子句中引用聚合别名 sum
  2. limit** 语法错误**:LIMIT 子句的正确语法是 LIMIT offset, row_count 或者 LIMIT row_count,在 MySQL 中不需要括号,正确写法是 LIMIT 5, 2

别名用法详解

列别名

在 SQL 中,列别名用于为查询结果中的列指定一个新的名称。可以使用关键字 AS 来指定别名,也可以省略 AS。在你的语句里,count(*) as sum 就是给 COUNT(*) 函数的结果指定了一个别名 sum,之后在 HAVINGORDER 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;

代码解释

  1. SELECT** 子句**:从 emp 表中选择 empnoename 列,同时使用 COUNT(*) 函数统计每个分组中的记录数,并将结果命名为 sum
  2. FROM** 子句**:指定数据来源为 emp 表。
  3. GROUP BY** 子句**:按照 empnoename 进行分组,这样 COUNT(*) 函数会分别统计每个 empnoename 组合的记录数。
  4. HAVING** 子句**:在分组之后进行筛选,只保留 sum 大于 7 的分组。
  5. ORDER BY** 子句**:按照 sum 列进行升序排序。
  6. LIMIT** 子句**:跳过前 5 条记录,取接下来的 2 条记录。