Запомните: 21 IQ ITEM 47
Его можно декодировать с любой телефонной панели, или вы можете просто записать его на бумаге.
Чтобы вспомнить «21 IQ ITEM 47», я бы сказал: «Hitman: Codename 47 имел 21 миссию, каждая из которых была IQ ITEM».
Или «Я чищу зубы каждый день в 21:47, потому что у меня высокий IQ и я не люблю предметы во рту».
ВЫБРАТЬ * ИЗ ИМЕНИ ТАБЛИЦЫ, ГДЕ b IN (5,7) И c IN (4,4)
Этот запрос вернет строки, где b
равно 5
или 7
, И c
равно 4
].
Что вы подразумеваете под «оценкой в парах?»
Обновление:
Я добавлю еще одну строку в образец:
+----------+----------+----------+
| PK | b | c |
+----------+----------+----------+
| 1 | 2 | 3 |
+----------+----------+----------+
| 2 | 5 | 4 |
+----------+----------+----------+
| 3 | 7 | 9 |
+----------+----------+----------+
| 4 | 7 | 4 |
+----------+----------+----------+
| 5 | 2 | 9 |
+----------+----------+----------+
Если вы хотите сопоставить все наборы, вы можете использовать этот синтаксис:
SELECT *
FROM table_name
WHERE (b, c) IN ((2, 3), (7, 9))
Это означает: «вернуть все строки, где b
равно 2
, а c
равно 3
, одновременно, ИЛИ b
равно 7
и с
равно 9
одновременно. "
В приведенном выше примере этот запрос вернет rows 1
и 3
Но если вы переписываете этот запрос наоборот, например:
SELECT *
FROM table_name
WHERE b IN (2, 7)
AND c IN (3, 9)
, это будет означать "вернуть все строки, где b
равно 2
или 7
, И c
равно 3
или 9
).
Это вернет строки 1
, 3
и 5
, поскольку строка 5
удовлетворяет условию для второй запрос, но не первый.
Строки 2 и 4 возвращаются правильно, хотя ваш выбор (4,4) может немного сбить с толку, поскольку он избыточен. И означает, что строка должна удовлетворять обоим вашим условиям, чтобы быть истинными. Если бы в запросе было WHERE b IN (5,7) AND c IN (4,9)
, вы бы получили строки 2, 3 и 4.
Если вы думаете об этом попарно, вам нужно иметь все комбинации. например, b IN (5,7) AND c IN (4,9)
даст (5,4), (5,9), (7,4) и (7,9) как возможные комбинации, которые будут работать, а НЕ только (5,4) и (7,9)
Вы можете оценить каждое условие по порядку, это может дать вам лучшее представление о том, что здесь происходит. В вашем запросе указано, что должны быть выбраны все значения, где b равно 5 или 7, а c равно 4, поэтому давайте уменьшим таблицу, используя первое условие ( b IN (5,7)
):
+----------+----------+----------+
| PK | b | c |
+----------+----------+----------+
| 1 | 2 | 3 | < No match
+----------+----------+----------+
| 2 | 5 | 4 | < Match
+----------+----------+----------+
| 3 | 7 | 9 | < Match
+----------+----------+----------+
| 4 | 7 | 4 | < Match
+----------+----------+----------+
Теперь, давайте оценим следующее условие, оба должны быть истинными, чтобы строка была выбрана ( c IN (4,4)
, это по сути то же самое, что c = 4
):
+----------+----------+----------+
| PK | b | c |
+----------+----------+----------+
| 2 | 5 | 4 | < Match
+----------+----------+----------+
| 3 | 7 | 9 | < No match
+----------+----------+----------+
| 4 | 7 | 4 | < Match
+----------+----------+----------+
Все остальное верно:
+----------+----------+----------+
| PK | b | c |
+----------+----------+----------+
| 2 | 5 | 4 |
+----------+----------+----------+
| 4 | 7 | 4 |
+----------+----------+----------+
Да, я считаю, что вы правы.
Фактически, «IN» можно рассматривать как сокращение для (b = 5 OR b = 7). Это НЕ работает «под капотом», но это простой способ думать об этом.
Для больших таблиц использование нескольких предложений IN вызовет проблемы с производительностью.
РЕДАКТИРОВАТЬ:
Вышеупомянутое плакат правильный, c IN (4, 4) бессмысленно. С таким же успехом вы могли бы сказать «И c = 4».
Если вы преобразуете предложения в их логические эквиваленты, вы поймете, почему:
SELECT * FROM table ГДЕ (b = 5 OR b = 7) AND (c = 4 OR c = 4)
Ваш пример не совсем иллюстрирует ваш вопрос, но несколько предложений IN не связаны друг с другом; они вычисляются последовательно, как и любое другое предложение WHERE .
Таким образом, следующий запрос
SELECT * FROM FOO WHERE b IN(5,7) AND c IN(4,8)
будет соответствовать любому из следующего:
b c ---- 5 4 5 8 7 4 7 8
IN
можно рассматривать как сокращение для сравнений с разделением или. Это означает, что предыдущий запрос также может быть записан как (механика немного отличается, но концепция та же):
SELECT * FROM FOO WHERE (b = 5 OR b = 7) AND (c = 4 OR c = 8)
Итак, в вашем примере да, возвращаются только строки 2 и 4. Но это не совсем так. по той причине, которую вы полагаете.