SELECT список_выбора
Подзапросы в предложении WHERE
Лекция 9. Язык SQL. Подзапросы.
Подзапрос – это команда SELECT, вложенная в другую команду SQL. Подзапросы иногда называют вложенной командой SELECT, внутренней командой SELECT или подкомандой SELECT. С помощью подзапросов можно создавать из простых команд гораздо более мощные. Подзапросы можно использовать в разных предложениях команд SQL: SELECT, FROM, WHERE, HAVING.
Подзапросы очень полезны при написании команд SELECT для выборки значений по неизвестному условному значению. С помощью подзапроса можно находить неизвестные значения. Синтаксис включения подзапроса в предложении WHERE:
FROM таблица, …
WHERE выражение оператор
(SELECT список_выбора
FROM таблица, …);
где:
оператор | оператор сравнения (например, =, > или IN). |
Примечание: Подзапрос обязательно должен быть заключен в скобки и находиться после оператора сравнения. В подзапросе нельзя использовать предложение ORDER BY.
В случае использования подзапроса он, как правило, выполняется первым. Результат подзапроса используется внешним запросом.
Пример: Найти всех служащих, у которых зарплата такая же, как у служащего по фамилии Ngao.
Написать соответствующий запрос было бы совсем просто, если бы мы знали какова зарплата Ngao. Тогда запрос выглядел бы следующим образом:
SELECT last_name
FROM s_emp
WHERE salary=зарплата_Ngao;
К счастью зарплату Ngao мы легко можем найти с помощью следующего запроса:
SELECT salary
FROM s_emp
WHERE last_name='Ngao';
Теперь остается только вложить последний запрос в предложение WHERE предпоследнего:
SELECT last_name
FROM s_emp
WHERE salary=(SELECT salary
FROM s_emp
WHERE last_name='Ngao');
Результат:
LAST_NAME
-------------
Ngao
Quick-To-See
Dumas
Пример: Найти всех служащих, у которых зарплата ниже средней:
SELECT last_name
FROM s_emp
WHERE salary<(SELECT AVG(salary)
FROM s_emp);
В этом примере сначала выполнится вложенная команда SELECT, которая вернет среднюю заработную плату среди всех сотрудников. Затем будут найдены все служащие, у которых зарплата меньше найденного подзапросом значения.
Результат:
LAST_NAME
------------------
Urguhart
Menchu
Biri
Smith
Nozaki
Patel
Newman
…
12 rows selected.
Подзапросы могут быть вложены друг в друга на любую глубину.
Пример: Найти всех служащих, которые получают столько же, сколько и торговый представитель фирмы-клиента №215:
SELECT last_name
FROM s_emp
WHERE salary=(SELECT salary
FROM s_emp
WHERE id=(SELECT sales_rep_id
FROM s_customer
WHERE id=215));
Результат:
LAST_NAME
--------------
Ngao
Quick-To-See
Dumas
В этом примере сначала находится номер служащего, который является торговым представителем фирмы №215. Затем определяется зарплата этого служащего. И, наконец, определяются все служащие, имеющие такую же зарплату. Данная команда эквивалентна последовательности следующих команд:
SELECT sales_rep_id FROM s_customer
WHERE id=215;
Результат:
SALES_REP_ID
------------
SELECT salary FROM s_emp
WHERE id=15;
Результат:
SALARY
---------
SELECT last_name FROM s_emp
WHERE salary=1450;
Результат:
LAST_NAME
--------------
Ngao
Quick-To-See
Dumas