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个)字符

%的位置不同,表示的含义不同:

  •   %e     以e 结尾的所有字符串                            _e
  •   e%    以e 开头的所有字符串                  e_
  •  %e%   含有e的所有字符串        _e_
  • s%e     以s开头以e结尾           s_e  
_ 匹配单个任意字符 '张_' → 张三、张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 字段 fromwhere 字段 in (值1,值2...);

例如:

-- 查询来自北京、上海、广州的用户
SELECT * FROM users 
WHERE city IN ('北京', '上海', '广州');

-- 可用于数字
SELECT * FROM orders 
WHERE status IN (1, 2, 5);

(5)is null

检查该列是否有 null 值

select 字段 fromwhere 字段  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

 

posted @ 2021-03-25 22:26  chao_xiong  阅读(458)  评论(0)    收藏  举报