Читайте также:
|
|
Оператор in используется для поиска выражения в наборе выражений, а оператор all (все) позволяет проводить сравнение одиночного значе_ ния с каждым значением набора. Для построения такого условия, по_ мимо оператора all, понадобится один из операторов сравнения (=, <>, <, > и т. д.). Например, следующий запрос находит всех сотрудников, ID которых не равен ни одному из ID руководителей:
mysql> | SELECT | emp_id, fname, lname, title |
_> | FROM employee | |
_> | WHERE emp_id <> ALL (SELECT superior_emp_id | |
_> | FROM | employee |
_> | WHERE superior_emp_id IS NOT NULL); |
+________+__________+__________+________________+ | emp_id | fname | lname | title | +________+__________+__________+________________+
| | | | Susan | | | Barker | | | Vice | President | | |
| | | | John | | | Gooding | | | Loan | Manager | |
Несвязанные подзапросы | |||||
| | | Chris | | Tucker | | Teller | | | |
| | | Sarah | | Parker | | Teller | | | |
| | | Jane | | Grossman | | Teller | | | |
| | | Thomas | | Ziegler | | Teller | | | |
| | | Samantha | | Jameson | | Teller | | | |
| | | Cindy | | Mason | | Teller | | | |
| | | Frank | | Portman | | Teller | | | |
| | | Beth | | Fowler | | Teller | | | |
| | | 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> | SELECT account_id, cust_id, product_cd, avail_balance | ||||||
_> | FROM account | ||||||
_> | WHERE | avail_balance < ALL (SELECT a.avail_balance | |||||
_> | FROM account a INNER JOIN individual i | ||||||
_> | ON a.cust_id = i.cust_id | ||||||
_> | WHERE i.fname = 'Frank' AND i.lname = 'Tucker'); | ||||||
+____________+_________+____________+_______________+ | |||||||
| account_id | | cust_id | product_cd | avail_balance | | ||||||
+____________+_________+____________+_______________+ | |||||||
| | | | | SAV | | | 500.00 | | | ||
| | | | | SAV | | | 200.00 | | | ||
| | | | | CHK | | | 534.12 | | | ||
| | | | | SAV | | | 767.77 | | | ||
| | | | | CHK | | | 122.37 | | |
Глава 9. Подзапросы | ||||
| | 16 | | 8 | SAV | | | 387.99 | |
| | 17 | | 9 | CHK | | | 125.67 | |
| | 21 | | 10 | BUS | | | 0.00 | |
+____________+_________+____________+_______________+ | ||||
rows in set (0.01 sec) | ||||
Вот таблица, возвращенная подзапросом. Она включает доступные ос_ | ||||
татки всех счетов Фрэнка: | ||||
mysql> SELECT a.avail_balance | ||||
_> FROM account a INNER JOIN individual i | ||||
_> ON a.cust_id = i.cust_id | ||||
_> WHERE i.fname = 'Frank' AND i.lname = 'Tucker'; | ||||
+_______________+ | ||||
| avail_balance | | ||||
+_______________+ | ||||
| | 1057.75 | | |||
| | 2212.50 | | |||
+_______________+ | ||||
rows in set (0.01 sec) |
У Фрэнка два счета, минимальный остаток – 1057,75 долларов. Основ_ ной запрос находит все счета, остаток на которых меньше, чем на лю_ бом из счетов Фрэнка. Таким образом, результирующий набор вклю_ чает все счета, остаток на которых меньше 1057,75 долларов.
Дата добавления: 2015-08-17; просмотров: 50 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Gt; FROM employee | | | Оператор any |