Использование подзапросов
1/18

Использование подзапросов

1. Использование подзапросов

2. Цели

• Определение подзапросов
• Назначение подзапросов
• Типы подзапросов
• Синтаксис подзапросов

3. Задачи, решаемые подзапросами

У кого из сотрудников зарплата больше, чем у Авеля?
Главный запрос:
У каких сотрудников зарплата больше, чем у Абеля?
Подзапрос:
Какая зарплата у Авеля?

4. Синтаксис

SELECT select_list
FROM
table
WHERE expr operator
(SELECT
FROM
select_list
table);
• Подзапрос (внутренний запрос) выполняется перед основным
запросом (внешний запрос).
• Результат подзапроса используется основным запросом.

5. Использование подзапросов

SELECT last_name, salary
FROM
employees
11000
WHERE salary >
(SELECT salary
FROM
employees
WHERE last_name = 'Abel');

6. Правила использования подзапросов

• Заключите подзапросы в круглые скобки.
• Поместите подзапросы справа от условия сравнения для удобства
чтения. (Однако подзапрос может появиться по обе стороны от
оператора сравнения.)
• Используйте скалярные операторы для скалярных подзапросов.

7. Типы подзапросов

• Скалярный подзапрос
Главный запрос
подзапрос
возвращает
ST_CLERK
• Подзапросы, возвращающие несколько строк
Главный запрос
подзапрос
возвращает
ST_CLERK
SA_MAN

8. Скалярные подзапросы

• Возвращают единственную строку
• Применимые операторы
Оператор Описание
=
Равно
>
Более чем
>=
Более, либо равно
<
Менее чем
<=
Менее, либо равно
<>
Не равно

9. Скалярные подзапросы

SELECT last_name, job_id, salary
FROM
employees
WHERE job_id =
(SELECT job_id
FROM
employees
WHERE last_name = 'Taylor')
AND
salary >
(SELECT salary
FROM
employees
WHERE last_name = 'Taylor');

10. Использование функций группировки

SELECT last_name, job_id, salary
FROM
employees
WHERE salary =
(SELECT MIN(salary)
FROM
employees);

11. Конструкция HAVING

• СУБД сначала выполняет подзапросы.
• СУБД возвращает результаты в предложение HAVING основного
запроса.
SELECT
FROM
GROUP BY
HAVING
department_id, MIN(salary)
employees
department_id
MIN(salary) >
(SELECT MIN(salary)
FROM
employees
WHERE department_id = 50);

12. Возможные ошибки

SELECT employee_id, last_name
FROM
employees
WHERE salary =
(SELECT
MIN(salary)
FROM
employees
GROUP BY department_id);

13. Если подзапрос не возвращает данные

SELECT last_name, job_id
FROM
employees
WHERE job_id =
(SELECT job_id
FROM
employees
WHERE last_name = 'Haas');

14. Подзапросы, возвращающие несколько строк

Оператор
Значение
IN
Равный любому значению в списке
ANY
Должно идти после =, !=, >, <, <=, >=. Возвращает TRUE, если
хотя бы один элемент существует в результирующем наборе
подзапроса, для которого отношение TRUE.
Должно предшествовать =, !=, >, <, <=, >=. Возвращает TRUE,
если отношение TRUE для всех элементов в результирующем
наборе подзапроса.
ALL

15. Пример

SELECT employee_id, last_name, job_id, salary
FROM
employees
WHERE salary < ANY
(SELECT salary
FROM
employees
WHERE job_id = 'IT_PROG')
AND
job_id <> 'IT_PROG';

16. Пример

SELECT employee_id, last_name, job_id, salary
FROM
employees
WHERE salary < ALL
(SELECT salary
FROM
employees
WHERE job_id = 'IT_PROG')
AND
job_id <> 'IT_PROG';

17. Использование оператора EXISTS

SELECT employee_id,salary,last_name FROM employees M
WHERE EXISTS
(SELECT employee_id FROM employees W
WHERE (W.manager_id=M.employee_id) AND W.salary > 10000);
SELECT * FROM departments
WHERE NOT EXISTS
(SELECT * FROM employees
WHERE employees.department_id=departments.department_id);

18. Null-значения в подзапросах

SELECT emp.last_name
FROM
employees emp
WHERE emp.employee_id NOT IN
(SELECT mgr.manager_id
FROM
employees mgr);
Подзапрос не возвращает строк, поскольку одно из
значений, возвращаемых подзапросом, равно Null.
English     Русский Rules