Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практикум по ORACLE 2004 года.doc
Скачиваний:
26
Добавлен:
03.05.2015
Размер:
466.43 Кб
Скачать

Предложение having

Предложение HAVING задает условие отбора групп для вывода. Следовательно, на группы накладывается дальнейшее ограничение, основанное на сводной информации.

Если используется предложение HAVING, сервер Oracle выполняет следующие действия:

  • Группирует строки.

  • Применяет групповую функцию.

  • Производит вывод групп, удовлетворяющих условию предложения HAVING.

Пример.

Вывод названия фильма и общей стоимости проката кассет для всех наименований фильмов, со стоимостью проката больше 50. Выходные строки сортируются по стоимости проката.

SQL> SELECT namef, SUM(stoimost_prok) as «Общая стоимость»

2 from film

3 GROUP BY namef

4 HAVING SUM(stoimost_prok)>50

5 ORDER BY SUM(stoimost_prok);

NAMEF Общая стоимость

------------------------- --------------------------------------

Куклы 60

Звонок 121

Лабораторная работа №8 Тема: подзапросы

Синтаксис

SELECT список_выбора

From таблица

WHERE выражение оператор

(Select список_выбора

FROM таблица);

где: оператор оператор сравнения (например, >, = или IN).

Операторы сравнения делятся на два класса: однострочные (>,=,>=,<,<>,<=) и многострочные (IN, NOT IN).

Подзапросы иногда называют вложенной командой SELECT, подкомандой SELECT или внутренней командой SELECT. Как правило, подзапрос выполняется первым, а его результат используется для полного определения условия во внешнем запросе.

  • Подзапрос должен быть заключен в скобки.

  • Подзапрос должен находиться после оператора сравнения.

  • В подзапросе нельзя использовать предложение ORDER BY. На каждую команду SELECT разрешается только одно предложение ORDER BY, и если оно используется, то должно быть последним в главной команде SELECT.

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

Однострочный подзапрос возвращает из вложенной команды SELECT только одну строку. В подзапросах этого типа используется однострочный оператор сравнения.

Пример.

Вывод списка названий фильмов, имеющих такую же прокатную стоимость, что и фильм «Дом»

SQL> SELECT namef, stoimost_prok

2 FROM film

3 WHERE stoimost_prok =

4 (SELECT stoimost_prok

5 FROM film

6 WHERE namef = 'Дом');

NAMEF STOIMOST_PROK

------------------------- -------------

Дом 40

Азазель 40

Куклы 40

Ледниковый период 40

  1. Первой выполняется команда SELECT вложенного блока запроса. Результат запроса – 40.

SQL> (SELECT stoimost_prok

2 FROM film

  1. WHERE namef = 'Дом');

2. Далее обрабатывается главный блок запроса. Результат подзапроса используется при этом для вычисления условия поиска.

Фактически, для сервера Oracle главный запрос будет выглядеть следующим образом:

SQL> SELECT namef, stoimost_prok

2 FROM film

  1. WHERE stoimost_prok = 40

Пример.

Вывод названия фильма и стоимости проката кассет всех фильмов, стоимость проката которых ниже средней.

SQL> SELECT namef, stoimost_prok

2 from film

3 WHERE stoimost_prok <

4 (SELECT AVG(stoimost_prok)

5 from film);

NAMEF STOIMOST_PROK

------------------------- ---------------------------

Звонок 35

Звонок 36

Куклы 20

Ошибки в подзапросах

Одна из распространенных ошибок — возврат однострочным подзапросом более, чем одной строки.

KLIENTID FILMID VIDACHA VOZVRAT

---------------- -------------- --------------- ---------------

1 1 01.02.03 01.04.03

1 11 01.01.03

2 1 12.03.03

Пример.

Подзапрос возвращает более одной строки, но использует однострочный оператор cравнения. Для исправления ошибки следует изменить "=" на "IN".

SQL> select namef, stoimost_prok

2 from film

3 where filmID =

4 (select filmID

5 from dogovor

6 where klientID<3);

(select filmID

*

ошибка в строке 4:

ORA-01427: подзапрос одиночной строки возвращает более одной строки