溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

mysql中or和and有哪些區別

發布時間:2021-12-01 16:06:59 來源:億速云 閱讀:342 作者:小新 欄目:MySQL數據庫
# 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
需要嚴格篩選數據時 ?
需要擴大結果范圍時 ?
多列條件且都有索引時 ?
需要組合不同維度條件時 ?

理解二者的本質差異后,開發者可以更精準地構建查詢條件,同時注意通過括號明確優先級,避免出現意料之外的查詢結果。 “`

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女