SQL查询语句执行的先后顺序

查询语句执行顺序

查询中⽤到的关键词主要包含六个,并且他们的顺序依次为select--from--where--group by-- having--order by。
其中selectfrom是必须的,其他关键词是可选的,这六个关键词的执⾏顺序与sql语句的书写顺序并不是⼀样的,而是按照下⾯的顺序来执⾏:

  1. from:需要从哪个数据表检索数据。
  2. where:过滤表中数据的条件。
  3. group by:如何将上⾯过滤出的数据分组 。
  4. having:对上⾯已经分组的数据进⾏过滤的条件。
  5. select:查看结果集中的哪个列,或列的计算结果。
  6. order by :按照什么样的顺序来查看返回的数据。

如果SQL中的from有左连接,那left...on...and条件和where条件执行先后顺序是怎样的?

顺序是:先执行on...and条件,后执行where条件。
首先根据on...and条件过滤出满足条件的右侧表记录,然后根据关联字段,左侧表再与过滤出的右侧表记录进行连接。
若满足关联字段相等,则返回左侧表和右侧表字段信息;
若不满足,则返回左侧表字段信息,右侧表字段则显示NULL

连接出的结果则存入临时表中。最后where条件是对临时表中的数据进行过滤。
左连接Left join,以左侧表为主,不管on条件是否满足条件,左侧表的所有记录都会返回。
换句说:on...and后面的条件对左侧表没有过滤作用,即使加上对左侧表的过滤,也不起作用。on后面的条件对右侧表的过滤起作用。where条件则对左连接后的临时表数据进行筛选。

以例子说明:

select * from A left join B
on A.ID = B.ID and B.NAME = '连接' and A.NAME = '左连接'
where A.NAME = '左连接'

on and后面的条件:B.NAMEB表有过滤作用,A.NAMEA表不起过滤作用where后面的条件:则是对左连接出的临时表数据进行过滤。

### SQL 查询关键字执行顺序 SQL 查询的关键字执行顺序与书写顺序并不相同。了解实际的执行顺序有助于编写高效且正确的查询语句,并优化查询性能。以下是 SQL 查询关键字的实际执行顺序: #### 1. FROM 和 JOIN `FROM` 子句用于指定查询的数据源表或视图,同时 `JOIN` 操作也会在此阶段完成[^4]。此阶段的主要任务是确定查询的基础数据集。 ```sql FROM mytable JOIN another_table ON mytable.column = another_table.column ``` #### 2. WHERE `WHERE` 子句用于过滤行,仅保留满足条件的数据。此阶段是在分组之前进行筛选,因此无法直接作用于聚合函数的结果[^5]。 ```sql WHERE constraint_expression ``` #### 3. GROUP BY `GROUP BY` 子句用于将数据按指定列进行分组。分组操作会在 `WHERE` 筛选之后进行[^5]。 ```sql GROUP BY column ``` #### 4. HAVING `HAVING` 子句用于在分组后对聚合结果进行过滤。由于它作用于聚合后的数据,因此可以包含聚合函数。 ```sql HAVING constraint_expression ``` #### 5. SELECT `SELECT` 子句用于指定要返回的列或表达式。此阶段会解析别名和计算表达式,但需要注意的是,`WHERE` 子句中不能引用 `SELECT` 列表中的别名[^3]。 ```sql SELECT DISTINCT column, AGG_FUNC(column_or_expression), ... ``` #### 6. ORDER BY `ORDER BY` 子句用于对最终结果集进行排序。此阶段发生在所有其他操作之后,确保结果按照指定顺序输出[^5]。 ```sql ORDER BY column ASC/DESC ``` #### 7. LIMIT 和 OFFSET `LIMIT` 和 `OFFSET` 子句用于限制返回的行数,并指定起始位置。此阶段是对最终结果集的进一步裁剪[^4]。 ```sql LIMIT count OFFSET COUNT ``` --- ### 示例:结合执行顺序的复杂查询 假设有一个名为 `sales` 的表,包含以下字段: - `product_id`: 产品ID - `quantity`: 销售数量 - `price`: 单价 **查询目标**:找出销售总额大于 1000 的产品及其平均单价。 **SQL 查询**: ```sql SELECT product_id, AVG(price) AS avg_price FROM sales WHERE quantity > 10 GROUP BY product_id HAVING SUM(quantity * price) > 1000 ORDER BY avg_price DESC LIMIT 10; ``` **执行顺序分析**: 1. `FROM sales`: 确定查询的数据源为 `sales` 表。 2. `WHERE quantity > 10`: 过滤掉销售数量小于等于 10 的记录。 3. `GROUP BY product_id`: 按照 `product_id` 对剩余数据进行分组。 4. `HAVING SUM(quantity * price) > 1000`: 对分组后的数据进行过滤,保留销售总额大于 1000 的产品。 5. `SELECT product_id, AVG(price) AS avg_price`: 计算每个产品的平均单价。 6. `ORDER BY avg_price DESC`: 按照平均单价降序排列结果。 7. `LIMIT 10`: 返回前 10 条记录。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值