■ фраза GROUP BY для группировки оставшихся строк по значению столбца
product_type_id,
■ фраза HAVING для фильтрации групп строк, чтобы остались только те
группы, для которых средняя цена больше $13.
□ SELECT product_type_id, AVG(price)
FROM products
WHERE price < 15
GROUP BY product_type_id
HAVING AVG(PRICE) > 13
ORDER BY product_type_id;
PRODUCT_TYPE_ID AVG(PRICE)
2 14.55
3 13.24
13.49_
Сравните эти результаты с предыдущим примером. Следует заметить,
что была отброшена группа строк с produ ct_type_id , равным 4. Это связано
с тем, что для этой группы строк средняя цена оказалась меньше $13.
В заключительном примере к предыдущему запросу добавляется фраза
ORDER BY, чтобы упорядочить результаты по средней цене:
□ SELECT product_type_id, AVG(Price)
FROM products
WHERE price < 15
GROUP BY product_type_id
HAVING AVG(price) > 13
ORDER BY AVG(price);
PRODUCT_TYPE_ID AVG(PRICE)
3 13.24
13.49
2 14.45
Итоги
В этой главе вы узнали, что:
■ База данных Oracle имеет две основные группы функций: однострочные
функции и агрегатные функции.
■ Однострочные функции в каждый момент времени оперируют с одной
строкой и для каждой входной строки возвращают одну выходную
строку. Есть пять основных типов однострочных функций: символьные
функции, числовые функции, функции конвертирования, функции
для работы с датами и функции с регулярными выражениями.
134 Глава 4
■ Агрегатные функции в каждый момент времени оперируют с несколькими
строками и возвращают для них одну выходную строку.
■ Блоки строк могут быть сгруппированы при помощи фразы
GROUP BY.
■ Группы строк можно фильтровать при помощи фразы HAVING.
В следующей главе вы узнаете о датах и времени.
Глава 5
Хранение и обработка
дат и времени
Простые примеры записи и выборки дат
По умолчанию можно представлять в базе данных дату в формате DD-M0NYYYY,
где:
■ DD - двузначный номер дня, типа 05,
■ M0N - сокращенное до трех букв название месяца, типа FEB (февраль),
■ YYYY - полный (состоящий из четырех цифр) номер года, типа 1968.
Рассмотрим пример с добавлением строки в таблицу customers, в которой
содержится столбец типа DATE, названный dob (date o f birth - дата рождения).
Следующий оператор INSERT добавляет строку в таблицу customers,
устанавливая столбец dob на 05-FEB-1968:
□ INSERT INTO customers (
customer_id, first_name, last_name, dob, phone
) VALUES (
6, 'Fred’, ‘Brown’, ’05-FEB-1968’, ‘800-555-1215’
);
Вы можете также использовать ключевое слово DATE для передачи в базу
данных литерала типа даты. При этом дата должна соответствовать
стандарту ANSI для формата даты - YYYY-MM-DD, где:
■ YYYY - четырехзначное значение года,
■ ММ - двузначный номер месяца (от 1 до 12),
■ DD - двузначный номер дня.
Совет Использование формата ANSI для дат имеетто преимущество, что оператор INSERT
потенциально может быть выполнен и для других баз данных, а не только для Oracle.
Например, для задания даты «25 октября 1972 г.» можно использовать
DATE'1972-10-25'. Следующий оператор INSERT добавляет строку в таблицу
customers, посылая в столбец dob значение DATE '1972-10-25':
□ INSERT INTO customers (
customer_id, first_n am e, last_name, dob, phone
) VALUES (
7, ‘ S te v e ’ , ‘ P u rp le ’ , DATE ‘ 1972-10-25’ , ‘ 800-555-1215’
Хранение и обработка дат и времени 137
По умолчанию база данных выводит даты в формате DD-M0N-YY, где
YY - две последние цифры года. Следующий запрос осуществляет выборку
строк из таблицы customers, а затем выполняет оператор ROLLBACK,
чтобы отменить результаты выполнения операторов INSERT; обратите
внимание, что запрос возвращает в столбце dob две последние цифры
года:
□ SELECT *
FROM customers;
.ID FIRST_NAME LAST_NAME DOB PHONE
1 John Brown 01-JAN-65 800-555-1211
2 Cynthia Green 05-FEB-68 800-555-1212
3 Steve White 16-MAR-71 800-555-1213
4 Gail Black 800-555-1214
5 Doreen Blue 20-MAY-70
6 Fred Brown 05-FEB-68 800-555-1215
7 Steve Purple 25-0CT-72 800-555-1215
ROLLBACK;
Для покупателя № 4 dob имеет значение NULL; поэтому в предыдущей
распечатке на его месте выведен пробел.
Примечание Прежде чем выполнить показанные выше два оператора INSERT с помощью
SQL*Plus, следует убедиться, что отменены сделанные ранее изменения, выполнив оператор
ROLLBACK. Таким образом, база данных сохраняется в начальном состоянии, а выходные данные
ваших запросов будут соответствовать результатам из этой главы.
В этом разделе вы увидели несколько простых примеров использования
дат с применением форматов по умолчанию. В следующем разделе вы
узнаете, как создавать собственные форматы даты, и увидите, как конвертировать
дату-время в другой тип базы данных.