WHERE 子句的条件筛选及常用操作符
在 Oracle 11g 中,WHERE 子句用于从查询结果中筛选满足条件的数据,是 SQL 语句中必不可少的部分。本文将详细讲解 WHERE 子句的基础用法及常用操作符。
一、WHERE 子句的基本语法
sql
SELECT 列名1, 列名2, ...
FROM 表名
WHERE 条件;
说明:
条件
:定义筛选规则,只有满足条件的记录才会被返回。WHERE
支持多种操作符,用于实现数字、字符串、日期等数据的灵活筛选。
二、常用操作符分类
- 比较操作符
| 操作符 | 含义 | 示例 |
|--------|-----------------------|----------------------------------|
| = | 等于 |WHERE salary = 5000
|
| != 或 <> | 不等于 |WHERE department_id != 10
|
| > | 大于 |WHERE salary > 3000
|
| < | 小于 |WHERE hire_date < '2023-01-01'
|
| >= | 大于等于 |WHERE salary >= 5000
|
| <= | 小于等于 |WHERE salary <= 2000
|
- 逻辑操作符
| 操作符 | 含义 | 示例 |
|--------|------------------------|----------------------------------|
| AND | 同时满足多个条件 |WHERE department_id = 10 AND salary > 5000
|
| OR | 满足任一条件即可 |WHERE department_id = 10 OR salary > 5000
|
| NOT | 条件的逻辑否定 |WHERE NOT (department_id = 10)
|
- 范围和集合操作符
| 操作符 | 含义 | 示例 |
|---------|----------------------|------------------------------------|
| BETWEEN | 在指定范围内 |WHERE salary BETWEEN 3000 AND 5000
|
| IN | 属于指定的集合 |WHERE department_id IN (10, 20, 30)
|
| NOT IN | 不属于指定的集合 |WHERE department_id NOT IN (10, 20, 30)
|
- 模糊匹配操作符
| 操作符 | 含义 | 示例 |
|--------|-----------------------|--------------------------------------|
| LIKE | 模糊匹配(支持通配符)|WHERE first_name LIKE 'A%'
|
| NOT LIKE | 模糊匹配的否定 |WHERE first_name NOT LIKE 'A%'
|
| % | 匹配任意长度的字符 |WHERE first_name LIKE '%son'
|
| _ | 匹配单个字符 |WHERE first_name LIKE 'J_n'
|
- NULL 值操作符
| 操作符 | 含义 | 示例 |
|------------|--------------------|-----------------------------------|
| IS NULL | 判断是否为 NULL |WHERE commission_pct IS NULL
|
| IS NOT NULL | 判断是否非 NULL |WHERE commission_pct IS NOT NULL
|
三、WHERE 子句使用示例
- 查询工资等于 5000 的员工
sql
SELECT employee_id, first_name, salary
FROM employees
WHERE salary = 5000;
- 查询部门编号为 10,且工资大于 5000 的员工
sql
SELECT employee_id, first_name, department_id, salary
FROM employees
WHERE department_id = 10 AND salary > 5000;
- 查询部门编号为 10 或工资大于 5000 的员工
sql
SELECT employee_id, first_name, department_id, salary
FROM employees
WHERE department_id = 10 OR salary > 5000;
- 查询工资在 3000 到 6000 之间的员工
sql
SELECT employee_id, first_name, salary
FROM employees
WHERE salary BETWEEN 3000 AND 6000;
- 查询姓氏以 'S' 开头的员工
sql
SELECT employee_id, first_name, last_name
FROM employees
WHERE last_name LIKE 'S%';
- 查询没有提成(NULL 值)的员工
sql
SELECT employee_id, first_name, commission_pct
FROM employees
WHERE commission_pct IS NULL;
四、WHERE 子句的执行顺序
WHERE 子句的条件按从左到右的顺序执行,且优先级如下:
NOT
(最高优先级)AND
OR
(最低优先级)
示例:
sql
SELECT employee_id, first_name, department_id, salary
FROM employees
WHERE department_id = 10 OR salary > 5000 AND commission_pct IS NOT NULL;
等价于:
sql
SELECT employee_id, first_name, department_id, salary
FROM employees
WHERE department_id = 10 OR (salary > 5000 AND commission_pct IS NOT NULL);
五、优化建议
-
优先使用索引列
WHERE 子句中的条件应尽量使用表的索引列,以提高查询效率。
-
避免在条件中使用函数
如
WHERE TO_CHAR(hire_date, 'YYYY') = '2023'
会导致索引失效,建议改为:
sql
WHERE hire_date BETWEEN TO_DATE('2023-01-01', 'YYYY-MM-DD') AND TO_DATE('2023-12-31', 'YYYY-MM-DD');
六、小结
WHERE 子句是 SQL 查询的核心,通过合理使用操作符和优化条件,可以实现对数据的精确筛选和高效查询。在实际应用中,需结合具体业务场景选择合适的操作符,提升查询效率和可读性。