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