Читайте также: |
|
_> WHERE emp_id IN (SELECT superior_emp_id _> FROM employee);
Несвязанные подзапросы | |||||
+________+_________+___________+____________________+ | |||||
| emp_id | | fname | | | lname | | title | | |
+________+_________+___________+____________________+ | |||||
| | | Michael | Smith | | President | | | ||
| | | Robert | | Tyler | | Treasurer | | | |
| | | Susan | | Hawthorne | | Operations Manager | | ||
| | | Helen | | Fleming | | Head Teller | | | |
| | | Paula | | Roberts | | Head Teller | | | |
| | | John | | Blake | | Head Teller | | | |
| | | Theresa | | Markham | | Head Teller | | | |
+________+_________+___________+____________________+ | |||||
rows in set (0.01 sec) |
Подзапрос возвращает ID всех сотрудников, имеющих кого_то в под_ чинении, а основной запрос извлекает для этих сотрудников четыре столбца таблицы employee. Вот результаты подзапроса:
mysql> SELECT superior_emp_id
_> FROM employee;
+_________________+ | superior_emp_id | +_________________+
| NULL |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | |
+_________________+
18 rows in set (0.00 sec)
Как видите, ID некоторых сотрудников встречаются по нескольку раз, поскольку у них более одного подчиненного. Это не оказывает нега_ тивного влияния на результаты основного запроса, потому что совер_ шенно неважно, сколько раз встречается ID сотрудника в результи_ рующем наборе подзапроса. Конечно, если вас беспокоят дублирую_ щие значения в возвращаемой подзапросом таблице, можно добавить в блок select подзапроса ключевое слово distinct, но это никак не отра_ зится на результирующем наборе основного запроса.
174 Глава 9. Подзапросы
Можно проверять не только наличие значения в наборе значений, но и его отсутствие. Делается это с помощью оператора not in (нет в). Вот другой вариант предыдущего запроса с оператором not in вместо in:
mysql> | SELECT | emp_id, fname, lname, title |
_> | FROM employee | |
_> | WHERE emp_id NOT IN (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.00 sec)
Этот запрос находит всех сотрудников, которые никем не руководят. Здесь потребовалось добавить в подзапрос условие фильтрации, чтобы гарантировать отсутствие значений null в возвращаемой подзапросом таблице. В следующем разделе объясняется, почему в данном случае понадобился этот фильтр.
Дата добавления: 2015-08-17; просмотров: 48 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Несвязанные подзапросы | | | Оператор all |