MSSQL里WHERE怎么用才对,条件筛选那些事儿全讲清楚了
- 问答
- 2026-01-10 05:17:27
- 5
综合自微软官方SQL Server文档、常见的数据库教程以及技术社区如Stack Overflow上的讨论精华)
MSSQL里的WHERE子句,说白了就是你对数据库说:“嘿,给我找点数据,但我只要符合这些条件的。”它就像是你在电商网站买东西时用的筛选器,价格从高到低、只看某品牌、必须是现货,这些就是你的“条件”,WHERE子句在SELECT(查数据)、UPDATE(改数据)、DELETE(删数据)这些语句里都能用,核心目的就是精确锁定目标,避免“误伤”或看到一堆没用的信息。
WHERE的基本样子
它通常紧跟在FROM子句后面,举个例子,你有个员工表Employees,里面有姓名(Name)、部门(Department)、工资(Salary)等字段。
SELECT * FROM Employees WHERE Department = '销售部';
这句的意思就是:从员工表里,把部门是“销售部”的所有员工信息都给我找出来,这里的等号就是最基础的条件判断。
都有哪些“筛子”可以用的?
光用等号肯定不够,SQL给你准备了一整套“筛子”:
-
比较运算符:这是最常用的。
- :等于。
WHERE Salary = 5000 >大于。WHERE Salary > 5000(工资高于5000的)<小于。>=大于等于。<=小于等于。<>或 :不等于。WHERE Department <> '人事部'(部门不是人事部的)
- :等于。
-
范围筛选:BETWEEN ... AND ... 当你想要一个范围内的值时,这个就非常方便,比如找工资在5000到8000之间的员工(包含5000和8000):
SELECT * FROM Employees WHERE Salary BETWEEN 5000 AND 8000;这比写成WHERE Salary >= 5000 AND Salary <= 8000更简洁。
-
模糊匹配:LIKE 当你记不清全名,或者想找有共同特征的数据时,就得用它,它要配合通配符使用:
- :代表任意长度的任意字符(包括0个字符)。
WHERE Name LIKE '张%':找所有姓“张”的员工。WHERE Name LIKE '%经理':找职位名称以“经理”结尾的员工。WHERE Name LIKE '%技术%':找名字里包含“技术”二字的员工(技术部”、“高级技术顾问”)。
_(下划线):代表单个任意字符。WHERE Name LIKE '张_':找姓“张”且名字是两个字的人(如“张三”)。
- :代表任意长度的任意字符(包括0个字符)。
-
是否在某个列表里:IN 如果你想找多个具体的、离散的值,用IN最省事,比如找部门是“销售部”、“市场部”或“研发部”的员工:
SELECT * FROM Employees WHERE Department IN ('销售部', '市场部', '研发部');这比写成WHERE Department = '销售部' OR Department = '市场部' OR Department = '研发部'清爽多了。 -
处理空值:IS NULL 和 IS NOT NULL 数据库里的空值(NULL)是个特殊存在,它表示“未知”或“缺失”。重要:你不能用
= NULL来判断,必须用专门的运算符。WHERE ManagerID IS NULL:找没有上级经理的员工(比如公司老板)。WHERE Email IS NOT NULL:找已经填写了邮箱的员工。
如何组合多个条件?
现实需求往往很复杂,我要找销售部工资超过6000的员工”,这就需要把条件组合起来。
-
AND(与) 两边条件都必须满足,上面的例子就是:
SELECT * FROM Employees WHERE Department = '销售部' AND Salary > 6000;
-
OR(或) 两边条件满足一个就行,比如找工资高于8000或低于3000的员工:
SELECT * FROM Employees WHERE Salary > 8000 OR Salary < 3000; -
NOT(非) 否定一个条件,比如找除了销售部以外的所有员工:
SELECT * FROM Employees WHERE NOT Department = '销售部';或者用WHERE Department != '销售部'也一样。
当条件变复杂时,别忘了括号!
如果你的查询条件里既有AND又有OR,优先级是AND高于OR,但这非常容易导致逻辑混乱,比如你想找:“所有销售部的员工,以及所有工资大于10000的员工(不管什么部门)”。
如果你写成:
SELECT * FROM Employees WHERE Department = '销售部' OR Salary > 10000 AND HireDate > '2020-01-01';
数据库会理解为:销售部的所有员工 或者 (工资大于10000 并且 入职日期在2020年以后的员工),这很可能不是你的本意。
正确的做法是用括号来明确分组,就像数学算式一样:
SELECT * FROM Employees WHERE (Department = '销售部' OR Salary > 10000) AND HireDate > '2020-01-01';
现在意思就清楚了:找那些(要么是销售部,要么工资大于10000)并且入职日期在2020年以后的员工。
一些常见的坑和注意事项
- 文本值要用单引号:
WHERE Name = '张三',数字值不用,WHERE Salary = 5000。 - 小心NULL:反复强调,判断空值一定用
IS NULL,用= NULL是永远查不到结果的。 - LIKE的效率:通配符如果用在字符串开头,如
LIKE '%技术',数据库往往无法使用索引,会导致全表扫描,在数据量大时速度很慢,尽量避免这种写法。 - 运算符两边数据类型要一致:不要用
WHERE EmployeeID = '1001'(EmployeeID是数字类型),虽然MSSQL可能会做隐式转换,但最好写成WHERE EmployeeID = 1001,这样更规范且利于性能。
WHERE子句就是你指挥数据库的“搜索指令”,从简单的等于判断,到复杂的多条件组合,核心就是想清楚你的筛选逻辑,然后用合适的运算符和括号清晰地表达出来,多练习几种场景,你就会发现它其实非常直观和强大。
本文由黎家于2026-01-10发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/77871.html
