MySQL OR語句

2019-10-16 22:57:55

本教學將學習如何使用MySQL OR運算子組合布林表示式來過濾資料。

MySQL OR運算子介紹

MySQL OR運算子組合了兩個或兩個以上布林表示式。當任一條件為真時,返回true

下面說明了OR運算子的語法。

boolean_expression_1 OR boolean_expression_2

boolean_expression_1boolean_expression_2是布林表示式,它可能返回的結果是:truefalseNULL

下表顯示了OR運算子的結果。

TRUE FALSE NULL
TRUE TRUE TRUE TRUE
FALSE TRUE FALSE NULL
NULL TRUE NULL NULL

MySQL OR短路求值

MySQL使用OR運算子進行短路評估(求值計算)。 換句話說,當MySQL可以確定結果時,MySQL會停止評估(求值計算)語句的其餘部分。

請參見以下範例。

SELECT 1 = 1 OR 1 / 0;

執行上面程式碼,得到以下結果 -

mysql> SELECT 1 = 1 OR 1 / 0;
+----------------+
| 1 = 1 OR 1 / 0 |
+----------------+
|              1 |
+----------------+
1 row in set

因為表示式1 = 1總是返回true,MySQL不會對1/0進行求值。如果是這樣,它會發出一個除以零錯誤的錯誤訊息。

運算子優先順序

當您在語句中使用多個邏輯運算子時,MySQL會在AND運算子之後再對OR運算子進行求值。 這稱為運算子優先順序。

運算子優先順序決定運算子的求值順序。 MySQL首先對優先順序較高的運算子進行求值。

請參見以下範例。

SELECT true OR false AND false;

執行上面查詢,得到如下結果 -

mysql> SELECT true OR false AND false;
+-------------------------+
| true OR false AND false |
+-------------------------+
|                       1 |
+-------------------------+
1 row in set

上面得出的結果,運算的過程是怎麼樣呢?

  • 首先,MySQL對AND運算子求值,因此,false AND false返回false
  • 其次,MySQL對OR運算子求值,根據返回的false值再執行AND運算,因此true OR false返回true

要更改評估/求值的順序,請使用括號,例如:

SELECT (true OR false) AND false;

執行上面查詢,得到如下結果 -

mysql> SELECT (true OR false) AND false;
+---------------------------+
| (true OR false) AND false |
+---------------------------+
|                         0 |
+---------------------------+
1 row in set

上面得出的結果,運算的過程是怎麼樣呢?

  • 首先,MySQL計算小括號中的表示式(true OR false)返回true
  • 第二,MySQL評估求值語句的剩餘部分,將上面第一步中計算出的表示式結果-true和剩餘部分求值,即:true AND false返回false

MySQL OR運算子範例

下面,我們將使用範例資料庫(yiibaidb)中的customers表進行演示。customers表的結果如下所示 -

mysql> desc customers;
+------------------------+---------------+------+-----+---------+-------+
| Field                  | Type          | Null | Key | Default | Extra |
+------------------------+---------------+------+-----+---------+-------+
| customerNumber         | int(11)       | NO   | PRI | NULL    |       |
| customerName           | varchar(50)   | NO   |     | NULL    |       |
| contactLastName        | varchar(50)   | NO   |     | NULL    |       |
| contactFirstName       | varchar(50)   | NO   |     | NULL    |       |
| phone                  | varchar(50)   | NO   |     | NULL    |       |
| addressLine1           | varchar(50)   | NO   |     | NULL    |       |
| addressLine2           | varchar(50)   | YES  |     | NULL    |       |
| city                   | varchar(50)   | NO   |     | NULL    |       |
| state                  | varchar(50)   | YES  |     | NULL    |       |
| postalCode             | varchar(15)   | YES  |     | NULL    |       |
| country                | varchar(50)   | NO   |     | NULL    |       |
| salesRepEmployeeNumber | int(11)       | YES  | MUL | NULL    |       |
| creditLimit            | decimal(10,2) | YES  |     | NULL    |       |
+------------------------+---------------+------+-----+---------+-------+
13 rows in set

例如,要獲得美國(USA)或者法國(France)的客戶,請在WHERE子句中使用OR運算子,如下所示:

SELECT 
    customername, country
FROM
    customers
WHERE
    country = 'USA' OR country = 'France';

執行上面程式碼,得到如下結果 -

mysql> SELECT  customername, country FROM customers WHERE country = 'USA' OR country = 'France';
+------------------------------+---------+
| customername                 | country |
+------------------------------+---------+
| Atelier graphique            | France  |
| Signal Gift Stores           | USA     |
| La Rochelle Gifts            | France  |
| Mini Gifts Distributors Ltd. | USA     |
| Mini Wheels Co.              | USA     |
| Land of Toys Inc.            | USA     |
| Saveley & Henriot, Co.       | France  |
| Muscle Machine Inc           | USA     |
| Diecast Classics Inc.        | USA     |
| Technics Stores Inc.         | USA     |
... ...
+------------------------------+---------+
48 rows in set

以下宣告返回位於美國(USA)或者法國(France),並且信用額度大於10000的客戶。

SELECT 
    customername, country, creditLimit
FROM
    customers
WHERE
    (country = 'USA' OR country = 'France')
    AND creditlimit > 100000;

執行上面程式碼,得到如下結果 -

mysql> SELECT  customername, country, creditLimit FROM customers WHERE (country = 'USA' OR country = 'France') AND creditlimit > 100000;
+------------------------------+---------+-------------+
| customername                 | country | creditLimit |
+------------------------------+---------+-------------+
| La Rochelle Gifts            | France  | 118200      |
| Mini Gifts Distributors Ltd. | USA     | 210500      |
| Land of Toys Inc.            | USA     | 114900      |
| Saveley & Henriot, Co.       | France  | 123900      |
| Muscle Machine Inc           | USA     | 138500      |
| Diecast Classics Inc.        | USA     | 100600      |
| Collectable Mini Designs Co. | USA     | 105000      |
| Marta's Replicas Co.         | USA     | 123700      |
| Mini Classics                | USA     | 102700      |
| Corporate Gift Ideas Co.     | USA     | 105000      |
| Online Diecast Creations Co. | USA     | 114200      |
+------------------------------+---------+-------------+
11 rows in set

請注意,如果不使用括號,查詢將返回位於美國的客戶或者位於法國並且信用額度大於10000的客戶。

SELECT
    customername, country, creditLimit
FROM
    customers
WHERE
    country = 'USA' OR country = 'France' AND creditlimit > 100000;

執行上面程式碼,得到如下結果(共 38 行) -

mysql> SELECT customername, country, creditLimit FROM customers WHERE country = 'USA' OR country = 'France' AND creditlimit > 100000;
+------------------------------+---------+-------------+
| customername                 | country | creditLimit |
+------------------------------+---------+-------------+
| Signal Gift Stores           | USA     | 71800       |
| La Rochelle Gifts            | France  | 118200      |
| Mini Gifts Distributors Ltd. | USA     | 210500      |
| Mini Wheels Co.              | USA     | 64600       |
| Land of Toys Inc.            | USA     | 114900      |
| Saveley & Henriot, Co.       | France  | 123900      |
| Muscle Machine Inc           | USA     | 138500      |
| Diecast Classics Inc.        | USA     | 100600      |
| Technics Stores Inc.         | USA     | 84600       |
| American Souvenirs Inc       | USA     | 0           |
| Cambridge Collectables Co.   | USA     | 43400       |
| Gift Depot Inc.              | USA     | 84300       |
| Vitachrome Inc.              | USA     | 76400       |
| Auto-Moto Classics Inc.      | USA     | 23000       |
| Online Mini Collectables     | USA     | 68700       |
| Toys4GrownUps.com            | USA     | 90700       |
| Boards & Toys Co.            | USA     | 11000       |
| Collectable Mini Designs Co. | USA     | 105000      |
| Marta's Replicas Co.         | USA     | 123700      |
| Mini Classics                | USA     | 102700      |
| Mini Creations Ltd.          | USA     | 94500       |
| Corporate Gift Ideas Co.     | USA     | 105000      |
| Tekni Collectables Inc.      | USA     | 43000       |
| Classic Gift Ideas, Inc      | USA     | 81100       |
| Men 'R' US Retailers, Ltd.   | USA     | 57700       |
| Gifts4AllAges.com            | USA     | 41900       |
| Online Diecast Creations Co. | USA     | 114200      |
| Collectables For Less Inc.   | USA     | 70700       |
| Classic Legends Inc.         | USA     | 67500       |
| Gift Ideas Corp.             | USA     | 49700       |
| The Sharp Gifts Warehouse    | USA     | 77600       |
| Super Scale Inc.             | USA     | 95400       |
| Microscale Inc.              | USA     | 39800       |
| FunGiftIdeas.com             | USA     | 85800       |
| West Coast Collectables Co.  | USA     | 55400       |
| Motor Mint Distributors Inc. | USA     | 72600       |
| Signal Collectibles Ltd.     | USA     | 60300       |
| Diecast Collectables         | USA     | 85100       |
+------------------------------+---------+-------------+
38 rows in set

在本教學中,您已經學習了如何使用MySQL OR運算子來組合布林表示式來過濾資料。需要注意的是:使用組合運算子時,OR運算子和AND運算子的求值順序。