Использование подзапросов для решения запросов
Цели
План занятия
Использование подзапроса для решения проблемы
Синтаксис подзапроса
Использование подзапросов
Указания по использованию подзапросов
Типы подзапросов
План занятия
Однострочные подзапросы
Выполнение однострочных подзапросов
Использование в подзапросах групповых функций
Предложение HAVING в подзапросах
Что неправильно в этой инструкции?
Внутренний запрос не вернул ни одной строки
План занятия
Многострочные подзапросы
Использование оператора ANY в многострочных подзапросах
Использование оператора ALL в многострочных подзапросах
План занятия
Значения NULL в подзапросе
Заключение
297.50K
Категория: Базы данныхБазы данных

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

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