7、where 子句 条件过滤查询结果集
1、where 子句
在 SELECT 语句中使用 WHERE 子句,根据一个或多个条件从表中选择特定的行,对结果集进行过滤查询。
命令:
select 字段名 from 表名 where 条件; -- 条件也称为谓词。您可以使用运算符来构成灵活的条件以筛选行。 select 字段名 from 表名 where 条件 order by 字段名;
注:在同时使用 order by 子句和 where 子句时,order by 子句应该位于 where 子句之后(先过滤出需要的数据,才能对数据进行排序)。
2、条件操作符
| 比较运算符 | 功能 |
|---|---|
| > | 大于 |
| >= | 大于等于 |
| < | 小于 |
| <= | 小于等于 |
| = | 等于 |
| <> 或 != | 不等于 |
| BETWEEN … AND … | 在某个范围内(含最小、最大值) |
| IN(…) | 在in之后的列表中的值,多选一 |
| LIKE 占位符 | 模糊匹配(_匹配单个字符,%匹配任意个字符) |
| IS NULL | 是NULL |
| 逻辑运算符 | 功能 |
|---|---|
| AND 或 && | 并且(多个条件同时成立) |
| OR 或 || | 或者(多个条件任意一个成立) |
| NOT 或 ! | 非,不是 |
在条件中使用的字面值可以是数字、字符串、日期和时间。以下是典型格式
- 数字:可以是没有任何格式的整数或小数,例如 100、123.45
- 字符串:用单引号括起来,例如 '100'、'John Doe'。
- 日期:取决于数据库系统,但通用格式是 'yyyy-mm-dd'。
- 时间:使用 'HH:MM:SS' 来表示时间值。
除了 SELECT 语句外,您还可以在 UPDATE 或 DELETE 语句中使用 WHERE 子句来指定要更新或删除的行。
例子:
-- 小于等于 select * from employee where age <= 30; -- 没有身份证 select * from employee where idcard is null or idcard = ''; -- 有身份证 select * from employee where idcard; select * from employee where idcard is not null; -- 不等于 select * from employee where age != 30; -- 年龄在20到30之间 select * from employee where age between 20 and 30; select * from employee where age >= 20 and age <= 30; -- 下面语句不报错,但查不到任何信息 select * from employee where age between 30 and 20; -- 性别为女且年龄小于30 select * from employee where age < 30 and gender = '女'; -- 年龄等于25或30或35 select * from employee where age = 25 or age = 30 or age = 35; select * from employee where age in (25, 30, 35); -- 姓名为两个字 select * from employee where name like '__'; -- 身份证最后为X select * from employee where idcard like '%X';
3、WHERE 子句中最常用的逻辑操作符
(1) like 操作符
用于字符串的模式匹配(模糊查询)。通常和通配符配合使用。
| 通配符 | 含义 | 示例 |
|---|---|---|
% |
匹配任意长度(包括0个)字符 |
|
_ |
匹配单个任意字符 | '张_' → 张三、张A,但不匹配 张 或 张三丰 |
注:like 子句后面的字符串需要使用单引号( ' ' )括起来。
-- 以特定字符串开头 SELECT * FROM employees WHERE name LIKE 'John%'; -- John, Johnny, Johnson -- 以特定字符串结尾 SELECT * FROM products WHERE product_name LIKE '%Pro'; -- iPhone Pro, MacBook Pro -- 包含特定字符串 SELECT * FROM articles WHERE content LIKE '%database%'; -- 任何包含"database"的内容 -- 单个字符匹配 SELECT * FROM users WHERE username LIKE 'user_'; -- user1, userA, userX -- 复杂模式匹配 SELECT * FROM files WHERE filename LIKE 'report_2024-__-__.pdf'; -- 结合NOT LIKE SELECT * FROM logs WHERE message NOT LIKE '%ERROR%' AND message NOT LIKE '%WARNING%';
(2) and 与运算
用于组合多个条件,所有条件都必须为真才返回结果。
SELECT 列名 FROM 表名 WHERE 条件1 AND 条件2 ; -- 两个表达式的计算结果都为 true,则 AND 运算符返回 true。 -- 如果两个表达式中有一个计算结果为 false ,则返回 false。 -- 若其中有一个结果为 null,则返回 NULL 。
(3)or 或运算
用于组合多个条件,任意一个条件为真就返回结果。
SELECT 列名 FROM 表名 WHERE 条件1 OR 条件2 OR 条件3 ...;
例子
-- 查询年龄大于18 且 城市是北京的用户 SELECT * FROM users WHERE age > 18 AND city = '北京'; -- 查询年龄小于18 或 年龄大于60 的用户 SELECT * FROM users WHERE age < 18 OR age > 60;
当and和or同时使用时,考虑优先级问题(and > or),所以如果需要先计算or 运算时,要用圆括号()括起来 。
(4) in 操作符
指定搜索范围,查询范围内的值,值用圆括号()括起来。
判断某字段的值是否在给定的值列表中,等价于多个 OR 条件。
命令:
select 字段 from 表 where 字段 in (值1,值2...);
例如:
-- 查询来自北京、上海、广州的用户 SELECT * FROM users WHERE city IN ('北京', '上海', '广州'); -- 可用于数字 SELECT * FROM orders WHERE status IN (1, 2, 5);
(5)is null
检查该列是否有 null 值
select 字段 from 表 where 字段 is null;
在 SQL 中,NULL 表示“未知”或“缺失”,任何与 NULL 的比较(=, !=, < 等)结果都是 UNKNOWN(不是 TRUE 或 FALSE)。
(6) not 操作符
逻辑取反,对一个条件的结果进行取反(否定),即:
- 原条件为
TRUE→ 变为FALSE - 原条件为
FALSE→ 变为TRUE - 原条件为
UNKNOWN(如涉及NULL)→ 仍为UNKNOWN
SELECT 列名 FROM 表名 WHERE NOT 条件; -- 否定条件,将真变为假,假变为真。
否定它之后所跟的任何条件(否定后跟条件的关键字)。
-- 查询年龄不大于 18 的用户(即 age <= 18) SELECT * FROM users WHERE NOT (age > 18); -- 查询非 VIP 用户(假设 VIP 状态为 1,2) SELECT * FROM users WHERE NOT status IN (1, 2); -- 等价于 SELECT * FROM users WHERE status NOT IN (1, 2); -- 查询名字不以“张”开头的用户 SELECT * FROM users WHERE name NOT LIKE '张%'; -- 查询有邮箱的用户 SELECT * FROM users WHERE NOT (email IS NULL); -- 更常见写法: SELECT * FROM users WHERE email IS NOT NULL; -- 查询:不是(北京且年龄>30)的用户 SELECT * FROM users WHERE NOT (city = '北京' AND age > 30); -- 等价于:非北京用户 或 年龄≤30 的用户(德·摩根定律)
(7)BETWEEN 操作符:范围查询(含边界)
用于选取介于两个值之间的数据范围(包含边界值),等价于 >= AND <=。
SELECT 列名 FROM 表名 WHERE 列名 BETWEEN 值1 AND 值2;
例子
-- 查询年龄在 18 到 60 岁之间的用户 SELECT * FROM users WHERE age BETWEEN 18 AND 60; -- 等价于 WHERE age >= 18 AND age <= 60 -- 查询 2024 年注册的用户 SELECT * FROM users WHERE created_at BETWEEN '2024-01-01' AND '2024-12-31 23:59:59'; -- 更安全的写法(避免时间精度问题): SELECT * FROM users WHERE created_at >= '2024-01-01' AND created_at < '2025-01-01'; -- 查询姓名首字母在 A 到 M 之间的用户 SELECT * FROM users WHERE name BETWEEN 'A' AND 'M'; -- 查询年龄不在 18~60 岁之间的用户(未成年人或老年人) SELECT * FROM users WHERE age NOT BETWEEN 18 AND 60;
在 SQL 逻辑运算中,优先级从高到低为:
- ()
- NOT
- BETWEEN, IN, LIKE, 比较操作符(=, >, <>)
- AND
- OR
本文来自博客园,作者:chao_xiong,转载请注明原文链接:https://www.cnblogs.com/chao-xiong/p/14579529.html

浙公网安备 33010602011771号