SQL执行顺序与SQL中的where与having区别

本文详细解析了SQL语句的执行顺序,并对比了WHERE子句与HAVING子句的功能与使用场景的不同之处。从语法结构到实际应用,帮助读者理解如何正确使用这两个子句来提高查询效率。

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

SQL执行顺序:

一、sql执行顺序 

  1. from 
  2. join 
  3. on 
  4. where 
  5. group by(开始使用select中的别名,后面的语句中都可以使用)
  6.  avg,sum.... 
  7. select 
  8. having 
  9. distinct 
  10. order by
  11. 在使用 row_number() over()函数时候,over()里头的分组以及排序的执行晚于 where group by order by 的执行
  12. limit 

from -> where -> group by > select ->having--> order by -> limit

sql中where和having的区别

用的地方不一样

   where可以用于select、update、delete和insert into values(select * from table where ..)语句中。

   having只能用于select语句中

执行的顺序不一样

   where的搜索条件是在执行语句进行分组之前应用

   having的搜索条件是在分组条件后执行的

   即如果where和having一起用时,where会先执行,having后执行

子句有区别

   where子句中的条件表达式having都可以跟,而having子句中的有些表达式where不可以跟;having子句可以用集合函数(sum、count、avg、max和min),而where子句不可以。

总结

 1.WHERE 子句用来筛选 FROM 子句中指定的操作所产生的行。
2.GROUP BY 子句用来分组 WHERE 子句的输出。
3.HAVING 子句用来从分组的结果中筛选行

### SQL WHERE 子句的执行顺序解析 在 SQL 查询中,`WHERE` 子句的作用是筛选满足特定条件的数据行。虽然从语法上看,`SELECT` 语句中的 `WHERE` 子句紧跟在 `FROM` 子句之后,但实际上 SQL 引擎的执行顺序并非完全按照语句书写的顺序进行[^3]。 #### 执行顺序概述 SQL 查询的实际执行顺序如下: 1. **FROM 子句**:首先确定数据源表或视图,并组装数据。 2. **WHERE 子句**:接下来对数据源中的行进行过滤,仅保留满足条件的行。 3. **GROUP BY 子句**:如果存在分组操作,则将数据按指定字段分组。 4. **HAVING 子句**:用于过滤聚合后的结果。 5. **SELECT 子句**:选择需要返回的列。 6. **ORDER BY 子句**:对结果集进行排序。 7. **LIMIT 子句**(或 TOP/ROWNUM 等):限制返回的结果行数。 因此,`WHERE` 子句在 SQL 查询的实际执行过程中处于第二步的位置,其主要任务是对数据源中的行进行初步筛选。 #### WHERE 子句的逻辑执行顺序 在 `WHERE` 子句内部,多个条件通过逻辑运算符(如 `AND` `OR`)连接。这些条件的逻辑执行顺序遵循以下规则: - 条件之间的逻辑运算符优先级为:`NOT > AND > OR`。 - 如果条件之间存在嵌套括号,则优先计算括号内的表达式。 - 数据库引擎可能会根据查询优化器的策略调整条件的执行顺序,以提高性能。例如,数据库可能优先执行过滤性更强的条件,从而减少后续操作的数据量。 以下是一个示例 SQL 查询及其逻辑执行顺序的解析: ```sql SELECT employee_id, department_id FROM employees WHERE salary > 50000 AND (department_id = 10 OR department_id = 20) AND hire_date < '2022-01-01'; ``` - 首先,`salary > 50000` 是一个简单的条件,用于过滤工资高于 50000 的员工。 - 接下来,`(department_id = 10 OR department_id = 20)` 是一个复合条件,表示部门 ID 为 10 或 20 的员工。 - 最后,`hire_date < '2022-01-01'` 过滤入职日期早于 2022 年 1 月 1 日的员工。 根据逻辑运算符的优先级,上述查询的执行顺序可以分解为: 1. 计算 `(department_id = 10 OR department_id = 20)`。 2. 将结果 `salary > 50000` 使用 `AND` 运算符结合。 3. 再将结果 `hire_date < '2022-01-01'` 使用 `AND` 运算符结合。 #### 示例代码解析 以下是一个 Python 脚本,用于解析 SQL 查询中的 `WHERE` 子句条件[^4]: ```python import re def parse_where_clause(sql_query): # 提取 WHERE 子句部分 where_clause = re.search(r'WHERE\s+(.*?)(?:\s+GROUP BY|\s+ORDER BY|\s+LIMIT|$)', sql_query, re.IGNORECASE | re.DOTALL) if where_clause: return where_clause.group(1).strip() return None # 示例 SQL 查询 sql = """ SELECT count(*) FROM users WHERE employee_type = 'Employee' AND (employment_status = 'Active' OR employment_status = 'On Leave') AND (time_type='Full time' OR country_code <> 'US') AND hire_date < NOW() AND email_work IS NOT NULL AND LENGTH(email_work) > 0 AND NOT (job_profile_id IN ('8802 - Comm Ops - 1', '8801 - CityOps - 2', '10034', '10455', '21014', '21015', '21016', '21018', '21017', '21019') AND country_code = 'IE') AND job_profile_id NOT IN ('20992', '20993', '20994', '20995', '20996', '20997') AND country_code NOT IN ('CN', 'MO', 'SG', 'MY', 'TH', 'VN', 'MM', 'KH', 'PH', 'ID'); """ # 解析 WHERE 子句 where_conditions = parse_where_clause(sql) print("WHERE 子句条件:", where_conditions) ``` #### 注意事项 - 数据库引擎可能会对 `WHERE` 子句中的条件进行重排,以优化查询性能。 - 在复杂查询中,使用括号明确指定条件的逻辑关系,避免因优先级问题导致错误结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值