MYSQL:WHERE IN 和 OR 不返回相同的行

MYSQL : WHERE IN and OR are not returning the same rows

我是 mysql 的新手,正在使用 sakila 数据库。谁能暗示为什么这些查询不 return 完全相同的行?

如果我使用一系列 OR 语句:

mysql> use sakila
Database changed
mysql> SELECT first_name,last_name,address.city_id FROM customer
    -> JOIN store ON store.store_id=customer.store_id
    -> JOIN address ON customer.address_id=address.address_id
    -> WHERE store.store_id=1 AND address.city_id=1 OR address.city_id=42
    -> OR address.city_id=312 OR address.city_id=459;
+------------+-------------+---------+
| first_name | last_name   | city_id |
+------------+-------------+---------+
| JULIE      | SANCHEZ     |       1 |
| SCOTT      | SHELLEY     |      42 |
| CLINTON    | BUFORD      |      42 |
| MATTIE     | HOFFMAN     |     312 |
| CECIL      | VINES       |     312 |
| NELSON     | CHRISTENSON |     459 |
+------------+-------------+---------+
6 rows in set (0,00 sec)

如果我使用 IN ():

mysql> SELECT first_name,last_name,address.city_id FROM customer
    -> JOIN store ON store.store_id=customer.store_id
    -> JOIN address ON customer.address_id=address.address_id
    -> WHERE store.store_id=1 AND address.city_id IN (1,42,312,459);
+------------+-------------+---------+
| first_name | last_name   | city_id |
+------------+-------------+---------+
| JULIE      | SANCHEZ     |       1 |
| SCOTT      | SHELLEY     |      42 |
| CECIL      | VINES       |     312 |
| NELSON     | CHRISTENSON |     459 |
+------------+-------------+---------+
4 rows in set (0,00 sec)

IN() 似乎只列出了 city_id 的第一个实例。网络上到处都说这两种情况仅在性能方面有所不同。我错过了什么?

您需要在第一个查询中适当地将 AND OR 组合包含在 round brackets () 中。

子句 WHERE store.store_id=1 AND address.city_id=1 OR address.city_id=42 OR address.city_id=312 OR address.city_id=459 将 return 所有 store_id 为 1 和 city_id 的行加上所有 city_id 为 41 或 312 的行或 459,无论 store_id.

将其更改为以下查询,它将 return 与第二个 IN 查询完全相同的行。

SELECT first_name,last_name,address.city_id FROM customer
JOIN store ON store.store_id=customer.store_id
JOIN address ON customer.address_id=address.address_id
WHERE store.store_id=1
AND (address.city_id=1
    OR address.city_id=42 
    OR address.city_id=312
    OR address.city_id=459);

您只需要在查询中使用括号,因为在第二个查询中使用的 AND 仅适用于除此之外的两个条件。你应该试试这个

SELECT first_name,last_name,address.city_id FROM customer
JOIN store ON store.store_id=customer.store_id
JOIN address ON customer.address_id=address.address_id
WHERE store.store_id=1 AND 
(
    address.city_id = 1
    OR address.city_id = 42 
    OR address.city_id = 312
    OR address.city_id = 459
);

在这两个查询之后 return 相同的结果。

将查询替换为 ,

mysql> select first_name,last_name,address.city_id from customer
         ->join store on store.store_id=customer.store_id
         -> join address on customer.address_id=address.address_id
         -> where store.store_id=1 and   ( address.city_id = 1  or address.city_id = 42   or address.city_id = 312   or address.city_id = 459 );