Similar presentations:
Использование подзапросов
1. Использование подзапросов
2. Цели
• Определение подзапросов• Назначение подзапросов
• Типы подзапросов
• Синтаксис подзапросов
3. Задачи, решаемые подзапросами
У кого из сотрудников зарплата больше, чем у Авеля?Главный запрос:
У каких сотрудников зарплата больше, чем у Абеля?
Подзапрос:
Какая зарплата у Авеля?
4. Синтаксис
SELECT select_listFROM
table
WHERE expr operator
(SELECT
FROM
select_list
table);
• Подзапрос (внутренний запрос) выполняется перед основным
запросом (внешний запрос).
• Результат подзапроса используется основным запросом.
5. Использование подзапросов
SELECT last_name, salaryFROM
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, salaryFROM
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, salaryFROM
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_nameFROM
employees
WHERE salary =
(SELECT
MIN(salary)
FROM
employees
GROUP BY department_id);
13. Если подзапрос не возвращает данные
SELECT last_name, job_idFROM
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, salaryFROM
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, salaryFROM
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 MWHERE 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_nameFROM
employees emp
WHERE emp.employee_id NOT IN
(SELECT mgr.manager_id
FROM
employees mgr);
Подзапрос не возвращает строк, поскольку одно из
значений, возвращаемых подзапросом, равно Null.