mysql中or和and有哪些区别

发布时间:2021-12-01 16:06:59 作者:小新
来源:亿速云 阅读:338
# MySQL中OR和AND有哪些区别

在MySQL查询中,`OR`和`AND`是两种最常用的逻辑运算符,它们决定了查询条件的组合方式。虽然二者都用于连接条件表达式,但它们的逻辑行为和查询结果有本质区别。本文将详细分析二者的差异,并通过示例说明其应用场景。

---

## 一、基础概念对比

### 1. AND运算符
- **逻辑含义**:所有条件必须**同时满足**
- **真值表**:
  | 条件A | 条件B | A AND B |
  |-------|-------|---------|
  | 真    | 真    | 真      |
  | 真    | 假    | 假      |
  | 假    | 真    | 假      |
  | 假    | 假    | 假      |

### 2. OR运算符
- **逻辑含义**:至少一个条件满足即可
- **真值表**:
  | 条件A | 条件B | A OR B |
  |-------|-------|--------|
  | 真    | 真    | 真     |
  | 真    | 假    | 真     |
  | 假    | 真    | 真     |
  | 假    | 假    | 假     |

---

## 二、核心区别分析

| 对比维度       | AND                              | OR                                |
|----------------|----------------------------------|-----------------------------------|
| **结果集范围** | 缩小结果集(严格筛选)           | 扩大结果集(宽松筛选)            |
| **执行顺序**   | 优先级低于OR(需用括号改变顺序) | 优先级高于AND                     |
| **索引利用**   | 多列AND条件更易利用复合索引      | OR条件可能导致索引失效            |
| NULL处理       | NULL AND 真 = NULL               | NULL OR 真 = 真                   |

---

## 三、实际查询示例

### 示例数据表`users`
```sql
CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    age INT,
    is_vip BOOLEAN
);

场景1:基础查询对比

-- AND示例:查询年龄大于20且是VIP的用户
SELECT * FROM users WHERE age > 20 AND is_vip = TRUE;

-- OR示例:查询年龄大于20或是VIP的用户
SELECT * FROM users WHERE age > 20 OR is_vip = TRUE;

场景2:优先级差异

-- 不加括号时:age>30 OR (is_vip=TRUE AND age>18)
SELECT * FROM users WHERE age > 30 OR is_vip = TRUE AND age > 18;

-- 显式控制优先级:查询VIP用户或年龄>30的用户,且年龄必须>18
SELECT * FROM users WHERE (age > 30 OR is_vip = TRUE) AND age > 18;

场景3:NULL值处理

-- AND处理NULL:返回NULL(未知结果)
SELECT * FROM users WHERE age > 20 AND NULL;

-- OR处理NULL:当有真值时返回真
SELECT * FROM users WHERE age > 20 OR NULL;

四、性能优化建议

  1. AND优化

    • 将选择性高的条件放在前面
    • 对多列AND条件建立复合索引
    CREATE INDEX idx_age_vip ON users(age, is_vip);
    
  2. OR优化

    • 避免在多列上使用OR(可改用UNION)

    ”`sql – 低效写法 SELECT * FROM users WHERE age > 30 OR is_vip = TRUE;

– 优化写法 SELECT * FROM users WHERE age > 30 UNION SELECT * FROM users WHERE is_vip = TRUE;

   - 对OR条件分别建立单列索引

3. **特殊技巧**:
   ```sql
   -- 使用IF函数转换OR逻辑
   SELECT * FROM users WHERE IF(age > 30 OR is_vip = TRUE, 1, 0) = 1;

五、复杂条件组合案例

混合使用AND/OR

-- 查询(年龄>25的VIP用户)或(年龄<18的非VIP用户)
SELECT * FROM users 
WHERE (age > 25 AND is_vip = TRUE) 
   OR (age < 18 AND is_vip = FALSE);

使用NOT反转逻辑

-- 查询不是VIP或年龄不大于20的用户(等价于NOT(age>20 AND is_vip=TRUE))
SELECT * FROM users WHERE NOT (age > 20 AND is_vip = TRUE);

六、总结

选择依据 推荐使用AND 推荐使用OR
需要严格筛选数据时
需要扩大结果范围时
多列条件且都有索引时
需要组合不同维度条件时

理解二者的本质差异后,开发者可以更精准地构建查询条件,同时注意通过括号明确优先级,避免出现意料之外的查询结果。 “`

推荐阅读:
  1. mysql和redis有哪些区别
  2. alisql和mysql有哪些区别

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

mysql or and

上一篇:Linq to sql动态查询的方法有哪些

下一篇:怎样深度解析Lustre体系结构

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》