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

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

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

© Oracle, 2007. Все права защищены.

2. Цели

Изучив материал этого занятия, вы сможете:
• Определять подзапросы
• Описывать типы проблем, для решения которых можно
использовать подзапросы
• Перечислять типы подзапросов
• Создавать однострочные и многострочные подзапросы
7-2
© Oracle, 2007. Все права защищены.

3. План занятия

• Подзапрос: типы, синтаксис и указания
• Однострочные подзапросы:
– групповые функции в подзапросе
– предложение HAVING с подзапросами
• Многострочные подзапросы
– использование оператора ALL или ANY
• Значения NULL в подзапросе
7-3
© Oracle, 2007. Все права защищены.

4. Использование подзапроса для решения проблемы

У кого оклад больше, чем у Abel?
Основной запрос:
У кого из сотрудников оклады больше, чем оклад
у Abel?
Подзапрос:
Какой оклад у Abel?
7-4
© Oracle, 2007. Все права защищены.

5. Синтаксис подзапроса

SELECT
FROM
WHERE
select_list
table
expr operator
(SELECT
FROM
select_list
table);
• Подзапрос (внутренний запрос) выполняется перед
основным (внешним) запросом.
• Результат подзапроса используется основным запросом.
7-5
© Oracle, 2007. Все права защищены.

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

SELECT last_name, salary
11000
FROM
employees
WHERE salary >
(SELECT salary
FROM
employees
WHERE last_name = 'Abel');
7-6
© Oracle, 2007. Все права защищены.

7. Указания по использованию подзапросов

• Заключайте подзапросы в скобки.
• Для повышения наглядности кода размещайте
подзапросы справа от условия сравнения (хотя
в принципе запрос допустимо помещать с любой
стороны от условия сравнения).
• Используйте с однострочными подзапросами
однострочные операторы, а с многострочными
подзапросами – многострочные операторы.
7-7
© Oracle, 2007. Все права защищены.

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

• Однострочный подзапрос
Основной запрос
Подзапрос
возвращает
ST_CLERK
• Многострочный подзапрос
Основной запрос
Подзапрос
7-8
возвращает
© Oracle, 2007. Все права защищены.
ST_CLERK
SA_MAN

9. План занятия

• Подзапрос: типы, синтаксис и указания
• Однострочные подзапросы:
– групповые функции в подзапросе
– предложение HAVING с подзапросами
• Многострочные подзапросы
– использование оператора ALL или ANY
• Значения NULL в подзапросе
7-9
© Oracle, 2007. Все права защищены.

10. Однострочные подзапросы

• Возвращают только одну строку
• Используют однострочные операторы сравнения
Оператор Значение
=
Равно
7 - 10
>
Больше
>=
Больше или равно
<
Меньше
<=
Меньше или равно
<>
Не равно
© Oracle, 2007. Все права защищены.

11. Выполнение однострочных подзапросов

SELECT last_name, job_id, salary
FROM
employees
SA_REP
WHERE job_id =
(SELECT job_id
FROM
employees
WHERE last_name = ‘Taylor’)
AND
salary >
8600
(SELECT salary
FROM
employees
WHERE last_name = ‘Taylor’);
7 - 11
© Oracle, 2007. Все права защищены.

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

SELECT last_name, job_id, salary
2500
FROM
employees
WHERE salary =
(SELECT MIN(salary)
FROM
employees);
7 - 12
© Oracle, 2007. Все права защищены.

13. Предложение HAVING в подзапросах

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

7 - 13
© Oracle, 2007. Все права защищены.

14. Что неправильно в этой инструкции?

SELECT employee_id, last_name
FROM
employees
WHERE salary =
(SELECT
MIN(salary)
FROM
employees
GROUP BY department_id);
Однострочный
оператор
с многострочным
подзапросом
7 - 14
© Oracle, 2007. Все права защищены.

15. Внутренний запрос не вернул ни одной строки

SELECT last_name, job_id
FROM
employees
WHERE job_id =
(SELECT job_id
FROM
employees
WHERE last_name = 'Haas');
Подзапрос не вернул ни одной строки,
поскольку нет сотрудника с фамилией «Haas».
7 - 15
© Oracle, 2007. Все права защищены.

16. План занятия

• Подзапрос: типы, синтаксис и указания
• Однострочные подзапросы:
– групповые функции в подзапросе
– предложение HAVING с подзапросами
• Многострочные подзапросы
– использование оператора ALL или ANY
• Значения NULL в подзапросе
7 - 16
© Oracle, 2007. Все права защищены.

17. Многострочные подзапросы

• Возвращают больше одной строки
• Используют многострочные операторы сравнения
Оператор
Значение
IN
Равен любому элементу из списка
ANY
Перед ним должны использоваться операторы =,
!=, >, <, <=, >=. Сравнивает текущее значение
ALL
7 - 17
с каждым значением, перечисленным в списке
|или возвращенным запросом. Получает значение
FALSE, если запрос не вернул ни одной строки.
Перед ним должны использоваться операторы =,
!=, >, <, <=, >=. Сравнивает текущее значение со
всеми значениями, перечисленными в списке или
возвращенными запросом. Получает значение
TRUE, если запрос не вернул ни одной строки.
© Oracle, 2007. Все права защищены.

18. Использование оператора ANY в многострочных подзапросах

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

7 - 18
© Oracle, 2007. Все права защищены.

19. Использование оператора ALL в многострочных подзапросах

SELECT employee_id, last_name, job_id, salary
9000, 6000, 4200
FROM
employees
WHERE salary < ALL
(SELECT salary
FROM
employees
WHERE job_id = 'IT_PROG')
AND
job_id <> 'IT_PROG';
7 - 19
© Oracle, 2007. Все права защищены.

20. План занятия

• Подзапрос: типы, синтаксис и указания
• Однострочные подзапросы:
– групповые функции в подзапросе
– предложение HAVING с подзапросами
• Многострочные подзапросы
– использование оператора ALL или ANY
• Значения NULL в подзапросе
7 - 20
© Oracle, 2007. Все права защищены.

21. Значения NULL в подзапросе

SELECT emp.last_name
FROM
employees emp
WHERE emp.employee_id NOT IN
(SELECT mgr.manager_id
FROM
employees mgr);
7 - 21
© Oracle, 2007. Все права защищены.

22.

Заключение
На этом занятии были изучены следующие темы:
• Ситуации, когда для решения проблемы целесообразно
использовать подзапросы
• Создание подзапросов для запросов, учитывающих
неизвестные значения
SELECT
FROM
WHERE
7 - 23
select_list
table
expr operator
(SELECT select_list
FROM
table);
© Oracle, 2007. Все права защищены.

23. Заключение

Упражнение 7: обзор
Это упражнение охватывает следующие темы:
• Создание подзапросов для запроса данных с учетом
неизвестных условий
• Использование подзапросов для поиска значений,
существующих в одном наборе данных и отсутствующих
в другом
7 - 24
© Oracle, 2007. Все права защищены.
English     Русский Rules