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

单表里边怎么写好多条件的查询语句,感觉有点复杂但其实也不难吧

整理自网络技术社区讨论和开发者经验分享,非官方教材,仅供参考)

直接说重点:单表多条件查询,你感觉复杂是因为条件一多,脑子容易乱,但核心就一句话——用WHERE接上AND或者OR,像搭积木一样把条件组合起来,我慢慢给你拆开讲。

你得忘掉“复杂”这个词,你就把它当成你在电商网站筛选商品:你要找一件“价格低于200元”、“颜色是黑色或者蓝色”、“并且是纯棉的”的T恤,你的每一个要求,就是SQL语句里的一个“条件”,数据库的工作就是帮你从一堆衣服里,把同时满足这几个条件的找出来。

第一步:最基础的,用AND连接“必须同时满足”的条件

比如你有一个员工表,想找出“销售部”里“工资大于8000”的人,这就是两个必须同时满足的条件。

SELECT * FROM 员工表 WHERE 部门 = '销售部' AND 工资 > 8000;

你看,WHERE后面跟了第一个条件部门 = '销售部',然后用AND连接第二个条件工资 > 8000,这很简单,对吧?再来三个、四个条件也一样,一直用AND连下去就行了。

SELECT * FROM 员工表
WHERE 部门 = '销售部'
AND 工资 > 8000
AND 入职日期 > '2020-01-01'
AND 状态 = '在职';

这就找出了2020年以后入职的、还在职的、销售部的高工资员工,逻辑非常直接。

第二步:用OR连接“满足一个就行”的条件

现在需求变了,想找出“销售部”或者“市场部”的所有员工,这两个条件满足一个就行。

SELECT * FROM 员工表 WHERE 部门 = '销售部' OR 部门 = '市场部';

第三步:当AND和OR混在一起时,问题就来了——优先级和括号

这是最容易让人头晕的地方,你想找出:“(属于销售部)工资大于8000或者有年终奖)”的员工,注意我的断句。

如果你写成这样就错了:

-- 这是错误写法!
SELECT * FROM 员工表 WHERE 部门 = '销售部' AND 工资 > 8000 OR 年终奖 IS NOT NULL;

数据库会先算AND(因为它优先级比OR高),这句就变成了:“(销售部且工资高)或者(有年终奖)的人”,这意味着,其他部门但有年终奖的人也会被找出来,这不符合你的本意。

正确的做法是用括号把“或者”的部分包起来,明确告诉数据库先算括号里的。

-- 正确写法
SELECT * FROM 员工表
WHERE 部门 = '销售部'
AND (工资 > 8000 OR 年终奖 IS NOT NULL);

括号就像数学里的(),强制改变计算顺序,这句的意思就很明确了:必须是销售部的人;在这个基础上,要么工资高,要么有年终奖,满足一条即可。

第四步:处理模糊条件和空值

  1. 模糊查询用LIKE:比如找名字里带“张”的员工。

    SELECT * FROM 员工表 WHERE 姓名 LIKE '%张%';

    代表任意多个字符。

  2. 判断空值用IS NULL或IS NOT NULL:比如找“邮箱地址没填”的员工。

    SELECT * FROM 员工表 WHERE 邮箱 IS NULL;

    切记不能写= NULL,这是错的。

第五步:终极技巧,用1=1来“耍个小聪明”

这个技巧在动态拼接SQL时特别有用,比如根据用户在前端选择的不同条件来生成查询,想象一下,你可能有姓名、部门、状态等多个筛选框,用户可能只填其中几个。

如果不用技巧,拼接SQL会很痛苦:

-- 如果用户只填了姓名,SQL是:WHERE 姓名 = '张三'
-- 如果用户又填了部门,SQL得变成:WHERE 姓名 = '张三' AND 部门 = '销售部'
-- 每次都要判断哪个条件是第一个,要不要加AND,代码写起来很啰嗦。

聪明的方法是,在WHERE后面先写一个永真条件1=1,然后后面所有的条件都统一用AND开头。

SELECT * FROM 员工表
WHERE 1=1
/*[如果用户输入了姓名]*/ AND 姓名 = '张三'
/*[如果用户选择了部门]*/ AND 部门 = '销售部'
/*[如果用户选择了状态]*/ AND 状态 = '在职';

这样做,无论用户使用哪几个条件,你程序里生成SQL语句的代码都可以很简单地、无脑地在后面追加AND 条件,因为1=1永远成立,它不影响结果,但让代码拼接变得极其简单,这是个非常实用的“野路子”。

别怕多条件查询,它就是个逻辑游戏。

  • 的关系用AND
  • 的关系用OR
  • 当AND和OR混用,一定要用括号来理清逻辑,这是避免出错的关键。
  • 模糊、空值有专门的用法。
  • 动态查询时,1=1技巧能帮你大忙。

遇到复杂的查询,别急着写代码,先拿张纸,像我们最开始举买衣服的例子一样,用中文把需求清晰地描述出来,分清哪些条件要同时满足,哪些满足一个就行,然后再动手翻译成SQL,你会发现,真的不难。

单表里边怎么写好多条件的查询语句,感觉有点复杂但其实也不难吧