Несвязанные подзапросы
175
| 7 | Chris | Tucker | Teller |
| 8 | Sarah | Parker | Teller |
| 9 | Jane | Grossman | Teller |
| 11 | Thomas | Ziegler | Teller |
| 12 | Samantha | Jameson | Teller |
| 14 | Cindy | Mason | Teller |
| 15 | Frank | Portman | Teller |
| 17 | Beth | Fowler | Teller |
| 18 | Rick | Tulman | Teller |
+++++
11 rows in set (0.05 sec)
И опять подзапрос возвращает набор ID сотрудников, имеющих подчи
ненных. Основной запрос возвращает данные для всех сотрудников,
ID которых не равны ни одному возвращенному подзапросом ID. Ина
че говоря, запрос находит всех сотрудников«неруководителей». Если
этот подход кажется вам несколько топорным, вы не одиноки; многие
предпочли бы построить запрос подругому, обойдясь без оператора
all
. Например, результаты этого запроса аналогичны последнему при
меру с оператором
not
in
из предыдущего раздела. Дело вкуса, но, ду
маю, что этим многим версия с
not
in
просто кажется более понятной.
Сравнивать значения с набором значений с помощью операто
ров
not
in
или
<>
all
нужно аккуратно, убедившись, что в наборе
нет значения
null
. Сервер приравнивает значение из левой час
ти выражения к каждому члену набора, и любая попытка при
равнять значение к
null
дает в результате
unknown
. Таким обра
зом, следующий запрос возвратит пустой набор:
mysql> SELECT emp_id, fname, lname, title
> FROM employee
> WHERE emp_id NOT IN (1, 2, NULL);
Empty set (0.00 sec)
Бывают случаи, когда оператор
all
чуть более естественен. Следую
щий пример использует
all
для поиска счетов, доступный остаток ко
торых меньше, чем на любом из счетов Фрэнка Такера (Frank Tucker):
mysql>
Достарыңызбен бөлісу: