SQL AND & OR 运算符(长文讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

在数据库查询的世界中,SQL AND & OR 运算符如同逻辑的“导航仪”,帮助开发者精准筛选数据。无论是初学者还是中级开发者,掌握这两个运算符的使用逻辑与技巧,都能显著提升数据检索的效率与准确性。本文将从基础概念出发,结合实际案例和代码示例,深入解析这两个运算符的核心功能、应用场景及潜在注意事项,助你构建扎实的SQL逻辑思维。


一、基础概念:理解布尔逻辑与WHERE子句

在讲解SQL AND & OR 运算符之前,我们需要先了解两个关键概念:布尔逻辑WHERE子句

1.1 布尔逻辑:数据筛选的“交通灯”

布尔逻辑是SQL条件判断的基础,其核心是TRUE(真)和FALSE(假)两种状态。例如:

  • WHERE age > 18:若某行记录的年龄为20,则返回TRUE;若年龄为15,则返回FALSE
  • WHERE gender = 'female':若记录性别为“female”,则返回TRUE

AND & OR运算符的作用,就是将多个布尔表达式组合起来,形成更复杂的条件逻辑。

1.2 WHERE子句:SQL的“过滤器”

WHERE子句是SQL中用于筛选记录的核心子句。例如:

SELECT * FROM users WHERE age > 18;  

这条语句会返回所有年龄大于18岁的用户记录。而通过结合AND & OR运算符,我们可以进一步细化筛选条件。


二、语法详解:AND与OR的核心用法

2.1 AND运算符:同时满足多个条件

AND运算符要求所有条件必须同时为TRUE,才能筛选出对应的记录。其语法结构如下:

SELECT * FROM table_name  
WHERE condition1 AND condition2 AND ...;  

案例1:筛选年龄在20-30岁之间的男性用户

SELECT * FROM users  
WHERE age >= 20 AND age <= 30 AND gender = 'male';  

此处的三个条件必须全部满足,才能被选中。

形象比喻
AND运算符如同一道“双重门禁”。只有当第一个门禁(如年龄达标)和第二个门禁(如性别符合)同时放行时,数据才能通过。


2.2 OR运算符:满足任一条件即可

与AND不同,OR运算符只需满足至少一个条件即可返回记录。其语法结构为:

SELECT * FROM table_name  
WHERE condition1 OR condition2 OR ...;  

案例2:筛选年龄小于18岁或性别为女性的用户

SELECT * FROM users  
WHERE age < 18 OR gender = 'female';  

只要年龄小于18岁,或性别为女性,或两者同时满足,记录都会被选中。

形象比喻
OR运算符如同一个“自助餐厅”。只要至少选择一道菜(条件),就能进入餐厅用餐。


2.3 AND与OR的优先级问题

在组合使用AND与OR时,需注意运算符的优先级:

  • AND的优先级高于OR
  • 若需改变默认顺序,必须使用括号()明确逻辑层级。

案例3:优先级影响结果的对比

-- 案例A(无括号)  
SELECT * FROM orders  
WHERE amount > 1000 OR customer_country = 'US' AND status = 'completed';  

-- 案例B(有括号)  
SELECT * FROM orders  
WHERE (amount > 1000 OR customer_country = 'US') AND status = 'completed';  

在案例A中,customer_country = 'US' AND status = 'completed'会被优先计算,因此筛选结果可能包含:

  • 所有金额>1000的订单,
  • 同时满足国家为美国且状态为完成的订单。

而案例B的括号将amount > 1000 OR customer_country = 'US'作为整体条件,最终筛选的是:

  • 同时满足(金额>1000或国家为美国)状态为完成的订单。

三、实战案例:AND & OR在真实场景中的应用

3.1 电商系统中的商品筛选

假设有一个电商平台的products表,包含以下字段:id, name, category, price, stock

需求1:筛选价格在500-1000元之间的库存充足(stock>10)的电子产品

SELECT * FROM products  
WHERE category = 'electronics'  
AND price >= 500  
AND price <= 1000  
AND stock > 10;  

需求2:筛选价格低于200元或属于“促销”类别的商品

SELECT * FROM products  
WHERE price < 200 OR category = 'promotion';  

3.2 用户权限管理中的条件组合

在权限系统中,常需根据角色和部门筛选用户。例如:

需求3:查询既是“管理员”角色,或属于“技术部”,且入职时间超过2年的员工

SELECT * FROM employees  
WHERE (role = 'admin' OR department = 'tech')  
AND hire_date <= DATE_SUB(NOW(), INTERVAL 2 YEAR);  

此处使用括号确保OR条件优先计算,再与时间条件结合。


四、注意事项与进阶技巧

4.1 NULL值的陷阱

在条件判断中,若字段值为NULL,任何比较运算(如>=)都会返回UNKNOWN,而非FALSE。例如:

SELECT * FROM users WHERE age = 18 OR age IS NULL;  

此语句会同时筛选年龄为18岁和年龄未填写(NULL)的用户。

4.2 复合条件的优化技巧

对于复杂的AND/OR组合,可通过以下方法提升可读性:

  • 分层缩进
    SELECT * FROM orders  
    WHERE (status = 'pending' OR status = 'processing')  
      AND (customer_country = 'CN' OR customer_country = 'HK')  
      AND amount BETWEEN 500 AND 2000;  
    
  • 使用IN子句简化OR条件
    -- 替代多个OR条件  
    SELECT * FROM orders  
    WHERE status IN ('pending', 'processing')  
    AND customer_country IN ('CN', 'HK');  
    

4.3 性能优化建议

  • 避免全表扫描:确保条件字段有索引支持。
  • 减少OR的使用:OR可能破坏索引的效率,可尝试拆分为多个查询并用UNION合并。
    -- 原始语句(可能低效)  
    SELECT * FROM users WHERE gender = 'male' OR age > 60;  
    
    -- 优化后  
    SELECT * FROM users WHERE gender = 'male'  
    UNION  
    SELECT * FROM users WHERE age > 60;  
    

五、结论

SQL AND & OR 运算符是构建复杂查询逻辑的核心工具。通过理解它们的语法、优先级及实际应用场景,开发者可以更高效地筛选数据、优化查询性能。无论是初学者通过基础案例掌握逻辑组合,还是中级开发者通过进阶技巧提升代码质量,掌握这两个运算符都能为数据库开发之路打下坚实基础。

实践建议

  1. 使用真实数据表进行AND/OR组合查询的练习;
  2. 尝试通过EXPLAIN分析查询性能,观察索引的使用情况;
  3. 对复杂条件进行分步拆解,逐步构建复合查询。

掌握逻辑运算的精髓,你将能够像“数据导航员”一样,精准定位所需信息,解锁SQL的无限潜力。

最新发布