select join where执行顺序

本文探讨了SQL语句的执行顺序,并指出当使用别名时可能遇到的问题。特别是当别名出现在SELECT子句中时,由于执行顺序的原因可能会导致错误。文章通过一个具体的例子解释了这一现象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

 

select  xxxxx   from t1  join  t2  on t1.sss = t2.dddd where t1.mmm > 3;

 

先执行 t1 join t2  在执行 where 条件  最后在执行 select xxxx

 

如果此时select xxx的字段是你重新命名的别名 , 那么按照上面顺序,回报错,报错说这个别名在

t1  t2里面都没找到。

 

 

### SQL 查询执行顺序解析 在SQL查询中,`SELECT`、`FROM` `LEFT JOIN` 的逻辑处理顺序并不是按照它们在语句中的书写顺序执行的。实际上,数据库引擎内部遵循特定的执行流程。 #### 1. FROM 子句 这是整个查询的第一步,在此阶段,所有的表都会被读取并准备用于后续操作。对于涉及多个表的情况,如使用 `JOIN` 操作符时,也会在此步骤完成联接工作。当涉及到左连接 (`LEFT JOIN`) 时,即使右侧表没有匹配记录,左侧表的所有行仍然会被保留下来,并且右侧表对应的列将填充为 NULL 值[^1]。 ```sql FROM departments d LEFT JOIN employees e ON d.department_id = e.department_id ``` 这段代码表示从 `departments` 表开始,尝试与 `employees` 表基于部门ID进行关联;如果有不匹配的部分,则只显示来自 `departments` 表的数据,而缺失部分则用NULL代替。 #### 2. WHERE 条件过滤 一旦完成了数据源的选择初步组合之后,就会应用任何指定于 `WHERE` 子句内的筛选条件。需要注意的是,虽然在这个例子中有 `WHERE` 关键字出现在最后面的位置上,但在实际运行过程中它是在 `JOIN` 完成后再做进一步限定作用的对象集合上的过滤[^4]。 ```sql WHERE d.department_name IN ('IT', 'Sales', 'Retail Sales') ``` 这里是对已经通过 `LEFT JOIN` 连接起来的结果集施加额外约束——仅限于某些特定名称下的部门条目参与最终计算。 #### 3. GROUP BY 分组聚合 接着会对满足上述两个阶段产生的中间结果实施分组汇总运算。这一步骤通常伴随着聚集函数的应用,比如求平均数(`AVG()`)等统计指标。 ```sql GROUP BY department_name, e.job_id ``` 该命令指示系统按部门名以及职位编号这两项属性来进行分类整理,并据此得出每一群体各自的薪资均值。 #### 4. SELECT 投影字段选取 到了这个环节才真正决定了返回给用户的列有哪些具体内容。此时可以自由挑选所需展示的信息项目,并允许对其进行重命名或其他形式变换。 ```sql SELECT d.department_name, e.job_id, AVG(e.salary) AS average_salary ``` 这条指令明确了要提取哪些信息作为输出的一部分,同时还定义了一个新的别名为 "average_salary" 的表达式代表员工工资平均水平。 #### 5. ORDER BY 排序安排 最后一环则是依据设定好的标准对所得列表重新排列次序以便更直观地呈现出来。 ```sql ORDER BY d.department_name, e.job_id; ``` 综上所述,尽管表面上看起来像是选择了什么再去找哪里的数据,但实际上真正的执行路径是从底层向上逐步构建直至形成完整的答案视图[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值