Использование подзапросов
Цели
Задачи, решаемые подзапросами
Синтаксис
Использование подзапросов
Правила использования подзапросов
Типы подзапросов
Скалярные подзапросы
Скалярные подзапросы
Использование функций группировки
Конструкция HAVING
Возможные ошибки
Если подзапрос не возвращает данные
Подзапросы, возвращающие несколько строк
Пример
Пример
Использование оператора EXISTS
Null-значения в подзапросах
149.92K
Категория: Базы данныхБазы данных

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

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     Русский Правила