Mysql编写过程和解析过程顺序刨析

我们在平时的编写sql语句当中,编写顺序都是知道,先select …… from …… join……where 等等 ,那么它的解析过程顺序是什么样的呢?先说一下mysql解析顺序大致为:

  1. FROM 子句的解析:
    • 解析 FROM 子句时,识别要查询的表及其别名,并建立表之间的关联关系。
    • 检查表和别名的有效性,确保它们存在于数据库中。
    • 确定表之间的连接方式,例如使用 INNER JOIN、LEFT JOIN、RIGHT JOIN 等。
  2. JOIN 子句的解析:
    • 如果存在 JOIN 子句,解析 JOIN 子句中的表及其连接条件。
    • 确定连接条件的列,即 ON 子句中的列名。
    • 确定连接的方式,例如 INNER JOIN、LEFT JOIN、RIGHT JOIN 等。
    • 确定连接的顺序,即表之间的连接顺序。
  3. WHERE 子句的解析:
    • 解析 WHERE 子句中的逻辑条件,确定查询的过滤条件。
    • 识别 WHERE 子句中的列和运算符,以确定比较的对象和条件类型。
    • 确定 WHERE 子句中的逻辑关系,例如 AND、OR、NOT 等。
  4. GROUP BY 子句的解析:
    • 解析 GROUP BY 子句,确定按照哪些列进行分组。
    • 检查 GROUP BY 列的有效性,确保它们存在于查询的结果集中。
    • 确定分组的顺序,即按照哪些列进行先后排序。
  5. HAVING 子句的解析:
    • 解析 HAVING 子句中的逻辑条件,确定分组的过滤条件。
    • 识别 HAVING 子句中的列和运算符,以确定比较的对象和条件类型。
    • 确定 HAVING 子句中的逻辑关系,例如 AND、OR、NOT 等。
  6. SELECT 子句的解析:
    • 解析 SELECT 子句,确定要返回的列及其处理方式(如别名、聚合函数等)。
    • 识别 SELECT 列中的表达式和函数,确定它们的有效性和计算顺序。
  7. ORDER BY 子句的解析:
    • 解析 ORDER BY 子句,确定查询结果的排序方式。
    • 检查 ORDER BY 列的有效性,确保它们存在于查询的结果集中。
    • 确定排序的顺序,即升序还是降序。
  8. LIMIT 子句的解析:
    • 解析 LIMIT 子句,确定返回结果的行数限制。
    • 确定起始位置和返回的行数。

大致就是这样的一个过程:举个例子

假设我们有以下两个表:

表1: customers

customer_id  customer_name
-----------  -------------
1            John
2            Lisa
3            Michael

表2: orders

order_id  customer_id  total_amount
--------  -----------  ------------
1         1            100
2         1            150
3         2            200
4         3            50

我们来看一个稍复杂一点的查询,查询每个顾客的订单总数,并按照订单总数降序排列,只返回前两个结果。

SELECT c.customer_id, c.customer_name, COUNT(o.order_id) AS order_count
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
GROUP BY c.customer_id, c.customer_name
HAVING order_count > 0
ORDER BY order_count DESC
LIMIT 2;

该查询的编写和解析过程如下:

  1. FROM 子句的解析:
    • 解析 FROM 子句,识别要查询的表 customers 和 orders,并建立它们之间的关联关系。
  2. JOIN 子句的解析:
    • 在 JOIN 子句中,通过 ON c.customer_id = o.customer_id 指定了表 customers 和 orders 的连接条件。
  3. WHERE 子句的解析:
    • 该查询没有 WHERE 子句,跳过解析 WHERE 子句的过程。
  4. GROUP BY 子句的解析:
    • 在 GROUP BY 子句中,指定了按照 c.customer_id, c.customer_name 列进行分组。
  5. HAVING 子句的解析:
    • 在 HAVING 子句中,指定了过滤条件 order_count > 0,只返回订单总数大于 0 的结果。
  6. SELECT 子句的解析:
    • 在 SELECT 子句中,指定要返回的列 c.customer_id, c.customer_name,以及使用聚合函数 COUNT(o.order_id) 计算订单总数,并给结果列起别名为 order_count
  7. ORDER BY 子句的解析:
    • 在 ORDER BY 子句中,指定按照 order_count 列进行降序排序。
  8. LIMIT 子句的解析:
    • 在 LIMIT 子句中,指定返回结果的行数限制为 2。

解析过程是按照以上顺序进行的,先从 FROM 子句开始,逐步解析其他子句,最后生成执行计划并返回结果。

你可能感兴趣的:(数据库)