开发者

MySQL查询SQL语句的执行顺序的方法

开发者 https://www.devze.com 2025-10-21 09:06 出处:网络 作者: 学亮编程手记
目录标准执行顺序1. FROM阶段2. WHERE阶段3. GROUP BY阶段4. HAVING阶段5. SELECT阶段6. DISTINCT阶段7. ORDER BY阶段8. LIMIT阶段常见场景示例场景1:基础查询场景2:聚合查询场景3:多表JOIN场景4:子查询场景5:D
目录
  • 标准执行顺序
    • 1. FROM阶段
    • 2. WHERE阶段
    • 3. GROUP BY阶段
    • 4. HAVING阶段
    • 5. SELECT阶段
    • 6. DISTINCT阶段
    • 7. ORDER BY阶段
    • 8. LIMIT阶段
  • 常见场景示例
    • 场景1:基础查询
    • 场景2:聚合查询
    • 场景3:多表JOIN
    • 场景4:子查询
    • 场景5:DISTINCT去重
    • 场景6:复杂的多表关联与分组
  • 重要注意事项

    标准执行顺序

    mysql在执行一条SELECT查询时,逻辑上的执行顺序如下:

    FROM → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT

    让我详细解释每个阶段:

    1. FROM阶段

    首先确定数据来源,包括表连接操作。如果有JOIN,会先执行笛卡尔积或根据JOIN条件进行表连接。多个表的JOIN按从左到右的顺序执行。

    2. WHERE阶段

    对FROM阶段产生的结果集进行条件过滤,筛选出符合条件的行。此时还不能使用SELECT中定义的别名,因为SELECT还没执行。

    3. GROUP BY阶段

    按照指定的列对数据进行分组,为聚合函数的计算做准备。

    4. HAVING阶段

    对分组后的结果进行过滤,通常与聚合函数配合使用。HAVING可以使用SELECT中的别名(某些MySQL版本支持)。

    5. SELECT阶段

    选择要返回的列,执行计算、函数调用等操作,生成最终的列。

    6. DISTINCT阶段

    如果有DISTINCT关键字,对结果集去重。

    7. ORDER BY阶段

    对结果集进行排序。可以使用SELECT中定义的别名。

    8. LIMIT阶段

    限制返回的行数,通常用于分页。

    常见场android景示例

    场景1:基础查询

    SELECT name, age
    FROM users
    WHERE age > 18
    ORDER BY age DESC
    LIMIT 10;
    

    执行顺序:FROM users → WHERE age > 18 → SELECT name, age → ORDER BY age DESC → LIMIT 10

    场景2:聚合查询

    SELECT department, COUNT(*) as emp_count, AVG(salary) as avg_salary
    FROM employees
    WHERE status = 'active'
    GROUP BY department
    HAVING COUNT(*) > 5
    ORDER BY avg_salary DESC;
    

    执行顺序:FROM employees → WHERE status = ‘active’ → GROUP BY department → HAVING COUNT() > 5 → SELECT department, COUNT(), AVG(salary) → ORDER BY avg_salary DESC

    场景3:多表JOIN

    SELECT u.name, o.order_date, o.amount
    FROM users u
    INNER JOIN orders o ON u.id = o.user_id
    WHERE o.order_date > '2025-01-01'
    ORDER BY o.order_date DESC;
    

    执行顺序:FROM users u → INNER JOIN orders o → WHERE o.order_date > ‘2025-01-01’ → SELECT u.name, o.order_date, o.amount → ORDER BY o.order_date DESC

    场景4:子NwHEpgMOTjavascript查询

    SELECT name, salary
    FROM employees
    WHERE salary > (SELECT AVG(salary) FROM employees)
    ORDER BY salary DESC;
    javascript

    执行顺序:先执行子查询得到平均工资 → FROM employees → WHERE salary > 子查询结果 → SELECT name, salary → ORDER BY salary DESC

    场景5:DISTINCT去重

    SELECT DISTINCT city
    FROM customers
    WHERE country = 'China'
    ORDER BY city;
    

    执行顺序:FROM customers → WHERE country = ‘China’ → SELECT city → DISTINCT → ORDER BY city

    场景6:复杂的多表关联与分组

    SELECT d.name as dept_name, COUNT(e.id) as employee_count
    FROM departments d
    LEFT JOIN employees e ON d.id = e.department_id AND e.status = 'active'
    WHERE d.region = 'East'
    GROUP BY d.id, d.name
    HAVING employee_count > 0
    ORDER BY employee_count DESC
    LIMIT 5;
    

    执行顺序:FROM departments d → LEFT JOIN employees e (包含ON条件) → WHERE d.region = ‘East’ → GROUP BY d.id, d.name → HAVING employee_count > 0 → SELECT d.nawww.devze.comme, COUNT(e.id) → ORDER BY employee_count DESC → LIMIT 5

    重要注意事项

    WHERE vs HAVING的区别:WHERE在分组前过滤,不能使用聚合函数;HAVING在分组后过滤,可以使用聚合函数。

    别名的使用限制:WHERE子句中不能使用SELECT中定义的别名,因为WHERE先于SELECT执行。但ORDER BY和HAVING可以使用别名。

    JOIN的ON条件:在FROM阶段执行,早于WHERE条件,因此在LEFT JOIN中,ON条件和WHERE条件的效果可能不同。

    子查询的执行:相关子查询可能会对外层查询的每一行都执行一次,非相关子查询通常只执行一次。

    理解这个执行顺序对编写高效SQL、理解查询结果以及优化查询性能都非常重要。

    以上就是MySQL查询SQL语句的执行顺序的方法的详细内容,更多关于MySQL查询SQL语句执行顺序的资料请关注编程客栈(www.devze.com)其它相关文章!

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号