当前位置:首页 > 问答 > 正文

树叶云教你玩转MSSQL里SQL的AND和OR运算符怎么用才灵活点

树叶云教你玩转MSSQL里SQL的AND和OR运算符怎么用才灵活点 整理自“树叶云”平台的数据库入门教程系列)

你是不是刚开始学MSSQL,一看到查询条件里同时有AND和OR就开始头大?明明想查的是A或者B,但还得满足C这个条件,写出来的SQL语句结果却总是不对,别担心,这几乎是每个新手都会遇到的坎儿,我们就跟着“树叶云”的教程思路,抛开那些让人犯困的专业术语,用大白话来聊聊怎么把AND和OR用得更灵活、更准确。

先搞懂最基础的:AND和OR的“脾气”

想象一下,AND就像是一个严格的面试官,它要求你提交的所有条件都必须过关,少一个都不行,你想找“年龄大于30岁并且工资高于10000元”的员工,SQL语句就是 WHERE 年龄 > 30 AND 工资 > 10000,这个人必须同时满足两个条件,AND才会放行。

而OR则像是个好说话的介绍人,它觉得你提交的条件里只要有一个符合,就算合格,你想找“来自北京或者来自上海”的员工,SQL语句就是 WHERE 城市 = ‘北京’ OR 城市 = ‘上海’,这个人只要是北京或上海其中之一,OR就认可。

“树叶云”的教程打了个很形象的比方:AND是“,是“都”;OR是“或者”,是“或”,先把这两个核心意思刻在脑子里。

麻烦来了:当AND和OR混在一起

问题往往出在它们俩一起用的时候,看这个例子:领导让你查一下“所有销售部的人,或者人事部里工资大于8000的人”。

很多新手可能会下意识地写成: SELECT * FROM 员工表 WHERE 部门 = ‘销售部’ OR 部门 = ‘人事部’ AND 工资 > 8000

你以为的计算顺序是:先找销售部的所有人,再找人事部里工资大于8000的人,然后把两部分合起来。

但数据库可不这么想!它有个严格的优先级规则:AND的优先级比OR高,这意味着,它会先计算AND两边的部分。

上面那句SQL的实际意思被数据库理解成了: ... WHERE 部门 = ‘销售部’ OR (部门 = ‘人事部’ AND 工资 > 8000)

这会导致什么结果呢?你会查到:

  1. 所有销售部的员工(不管工资多少,哪怕是2000块也会被查出来)。
  2. 人事部里并且工资大于8000的员工。

这显然和我们的本意有出入,我们的本意是“销售部的所有人”是一个整体,“人事部里工资高的”是另一个整体,然后用OR连接,但数据库却把“人事部”和“高工资”先紧紧地绑在了一起。

解决问题的金钥匙:括号()

想让数据库按照你的思路来思考,就必须请出“括号”这个法宝,括号的作用就是强制改变计算的先后顺序,括号里的内容会被视为一个不可分割的整体。

上面那个查询的正确写法应该是: SELECT * FROM 员工表 WHERE (部门 = ‘销售部’) OR (部门 = ‘人事部’ AND 工资 > 8000)

虽然加了括号后,看起来和没加好像结果一样?不对,这里的关键在于明确了逻辑,但更常见且容易出错的例子是下面这种:

更典型的例子: 想查“来自北京或者上海,并且年龄大于25岁”的员工。 如果你的本意是这两个城市的人都需要满足年龄要求,写成 WHERE 城市=‘北京’ OR 城市=‘上海’ AND 年龄>25 就又错了(因为会先算AND,导致所有北京人都被查出,不管年龄)。

正确写法是用括号把“或”关系包起来: WHERE (城市 = ‘北京’ OR 城市 = ‘上海’) AND 年龄 > 25 这样意思就非常明确了:先确定是北京或上海的人(这是一个整体),然后在这个整体里,再筛选年龄大于25的。

“树叶云”教程强调:当你无法确定优先级,或者AND和OR混合使用时,果断使用括号,多用括号不是一个坏习惯,它能让你和数据库之间的“沟通”零误会。

灵活运用的组合拳:IN 和 NOT

当你对同一个字段有多个“或”的条件时,用IN运算符会让语句更简洁。

WHERE 部门 = ‘销售部’ OR 部门 = ‘人事部’ OR 部门 = ‘市场部’,可以简写成: WHERE 部门 IN (‘销售部’, ‘人事部’, ‘市场部’)

反过来,如果你想找除了这三个部门以外的所有人,就可以用NOT IN: WHERE 部门 NOT IN (‘销售部’, ‘人事部’, ‘市场部’)

同样,结合AND也能实现复杂查询,查这三个部门里,工资高于5000但低于10000的员工: WHERE 部门 IN (‘销售部’, ‘人事部’, ‘市场部’) AND 工资 > 5000 AND 工资 < 10000 这条语句清晰易懂:先圈定部门范围,再叠加两个工资条件(必须同时满足)。

最后的小贴士

  1. 养成加括号的习惯:即使是简单的混合条件,加上括号也能让代码更易读,避免未来的维护者(甚至几天后的你自己)看懵。
  2. 先写逻辑,再写SQL:动手前,先用大白话把查询需求写清楚,标出哪些条件是“,哪些是“或者”,然后再转化成SQL语句。
  3. 勤加测试:写完后,不要怕麻烦,用一些有代表性的测试数据跑一下,看看结果是不是你真正想要的,这是检验逻辑是否正确的唯一标准。

“树叶云”教程的核心观点是:AND和OR本身不难,难的是理清现实业务中的逻辑关系,只要你用括号这个工具把逻辑分组表达清楚,就能轻松玩转它们,让你的SQL查询既准确又灵活。

树叶云教你玩转MSSQL里SQL的AND和OR运算符怎么用才灵活点