在SQL数据库的日常操作中,我们常常不需要获取整张表的所有数据,而是需要从中筛选出符合特定条件的记录,这时候就需要用到SELECT语句配合WHERE条件子句来实现精准查询。WHERE子句可以指定筛选规则,只有满足规则的记录才会被返回到查询结果中。
SELECT WHERE基础语法
SELECT WHERE语句的基础结构如下,其中WHERE子句是可选部分,当不需要筛选时可以不写:
-- 基础语法结构 SELECT 列名1, 列名2, ... FROM 表名 WHERE 筛选条件;
如果要查询表中的所有列,可以用星号*代替列名列表,不过实际开发中建议明确指定需要的列,减少不必要的数据传输:
-- 查询所有列 SELECT * FROM 用户表 WHERE 用户年龄 > 18;
常用筛选条件类型
数值比较条件
数值类型的字段可以直接使用比较运算符进行筛选,常用的比较运算符包括等于=、不等于<>或!=、大于>、小于<、大于等于>=、小于等于<=。
-- 查询年龄大于等于20的用户 SELECT 用户ID, 用户名, 用户年龄 FROM 用户表 WHERE 用户年龄 >= 20; -- 查询订单金额不等于100的订单 SELECT 订单ID, 订单金额 FROM 订单表 WHERE 订单金额 <> 100;
字符串匹配条件
字符串类型的字段筛选可以使用等于运算符精确匹配,也可以使用LIKE关键字进行模糊匹配,模糊匹配中%代表任意长度的任意字符,_代表单个任意字符。
-- 精确匹配用户名为张三的记录 SELECT * FROM 用户表 WHERE 用户名 = '张三'; -- 查询用户名以张开头的用户 SELECT 用户ID, 用户名 FROM 用户表 WHERE 用户名 LIKE '张%'; -- 查询用户名第二个字为三的用户 SELECT 用户ID, 用户名 FROM 用户表 WHERE 用户名 LIKE '_三%';
范围查询条件
如果需要筛选字段值在某个范围内的记录,可以使用BETWEEN AND关键字,包含边界值,也可以使用IN关键字筛选字段值属于指定集合的记录。
-- 查询年龄在18到30之间的用户,包含18和30
SELECT 用户ID, 用户名, 用户年龄
FROM 用户表
WHERE 用户年龄 BETWEEN 18 AND 30;
-- 查询城市为北京、上海、广州的用户
SELECT 用户ID, 用户名, 所在城市
FROM 用户表
WHERE 所在城市 IN ('北京', '上海', '广州');
空值判断条件
SQL中判断字段是否为空不能使用等于号,需要使用IS NULL判断为空,IS NOT NULL判断不为空。
-- 查询邮箱为空的用户的用户信息 SELECT 用户ID, 用户名 FROM 用户表 WHERE 用户邮箱 IS NULL; -- 查询手机号不为空的用户 SELECT 用户ID, 用户名, 手机号 FROM 用户表 WHERE 手机号 IS NOT NULL;
多条件组合查询
当需要同时满足多个筛选条件时,可以使用AND关键字连接条件,所有条件都满足才会返回记录;如果满足任意一个条件即可返回记录,可以使用OR关键字连接条件。
-- 查询年龄大于20且所在城市为北京的用户 SELECT 用户ID, 用户名, 用户年龄, 所在城市 FROM 用户表 WHERE 用户年龄 > 20 AND 所在城市 = '北京'; -- 查询年龄小于18或者大于60的用户 SELECT 用户ID, 用户名, 用户年龄 FROM 用户表 WHERE 用户年龄 < 18 OR 用户年龄 > 60;
如果同时使用了AND和OR,需要注意优先级,AND的优先级高于OR,建议用括号明确条件组合逻辑,避免筛选结果不符合预期:
-- 查询所在城市为北京,且年龄大于20或者用户等级为VIP的用户 SELECT 用户ID, 用户名, 所在城市, 用户年龄, 用户等级 FROM 用户表 WHERE 所在城市 = '北京' AND (用户年龄 > 20 OR 用户等级 = 'VIP');
查询性能优化建议
为了提升SELECT WHERE查询的效率,可以参考以下优化建议:
- 对WHERE子句中频繁使用的筛选字段建立合适的索引,避免全表扫描
- 尽量避免在WHERE子句中对字段进行函数操作或者表达式计算,会导致索引失效
- 模糊查询时如果非必要,尽量不要在开头使用%,否则无法使用索引
- 明确指定需要查询的列,不要随意使用SELECT *查询所有列
注意:不同数据库对SQL语法的支持略有差异,比如字符串的引号在部分数据库中支持双引号,但标准SQL中字符串使用单引号,建议统一使用单引号避免兼容性问题。
SQLSELECT_WHERE数据库查询条件筛选修改时间:2026-07-21 19:15:34