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 );
我是 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 );