Оператор SELECT. Выбор данных из таблицы. Псевдонимы столбцов. Удаление повторяющихся строк, страница 5

Пример. Количество изданных книг автора. (Запрос Qual-Book-Author)

SELECT

au_id,

COUNT(*) AS "Кол-во книг"

FROM Title_authors

GROUP BY au_id

ORDER BY 2 DESC;

Пример. Расчет среднего – продажи по категориям. (Запрос COUNT-AVG)

SELECT

type,

SUM(sales) AS "Сумма продаж",

COUNT(sales) AS "COUNT(sales)",

COUNT(*) AS "COUNT(*)",

SUM(sales)/COUNT(sales) AS "SUM/COUNT(sales)",   

SUM(sales)/COUNT(*) AS "SUM/COUNT(*)",   

AVG(sales) AS "Средее"

FROM Title

GROUP BY type;

Задание.

1) Посчитать по категориям:

- объем продаж

- средний размер продаж

- количество изданий, вошедших в категорию.

Не учитывать книги дешевле 15 евро. Упорядочить по уменьшению продаж.

2) Перечислить в убывающем порядке количество изданий с группировкой по издателям и категориям.

3) Рассчитать средние продажи с разбивкой по цене издания в порядке ее уменьшения.

Контрольное задание 1.

Перечислить количество изданий с группированием по объемам продаж:

-менее 1 тыс.

- 1 тыс. – 10  тыс.

- 10 тыс. – 100 тыс.

- 100 тыс. – 1 млн.

- свыше 1 млн.

Примечание. Если в запросе предложение GROUP BY применяется без агрегатной функции, то запрос выполняется также как и предложение DISTINCT.

SELECT type FROM title GROUP BY type                    SELECT DISTINCT type FROM title

Фильтрация групп

Предложение HAVING накладывает ограничение на предложение GROUP BY аналогично тому, как предложение WHERE исполняется командой SELECT. WHERE ограничивает число строк, отображаемых командой SELECT, HAVING ограничивает число групп, формируемых предложением GROUP BY. Предложение WHERE выполняется до группировки, предложение HAVING – после. Предложение HAVING может содержать агрегатные функции.

Порядок выполнения:

- предложение WHERE фильтрует строки, полученные в результате выполнения FROM и JOIN;

- предложение GROUP BY группирует полученный результат;

- предложение HAVING фильтрует строки, полученные в результате группирования.

Таким образом, предложение HAVING обрабатывает строки групп.

Пример. Перечислить авторов, издавших не менее 3-х книг. (Запрос Author-Book-Condition)

SELECT

au_id,

COUNT(*) AS "Кол-во книг"

FROM Title_authors

GROUP BY au_id

HAVING COUNT(*)>=3;

Задание.

1) Перечислить категории книги, средний доход от которых превышает 1 млн. Указать количество книг в категории.

2) Сгруппировать по издателям и категориям опубликованные книги. Отразить количество книг и категории, в которых эта величина больше 1.

3) Для издателей PO3 и PO4 выбрать такие категории изданий, чтобы объем продаж был более 10 тыс. экз. и средняя цена книги менее 20 евро.

Примечание. В предложение HAVING следует включать только агрегаты. Другие условия целесообразно помещать в предложение WHERE. Такой запрос выполняется более эффективно.

Выбор данных из нескольких таблиц

При использовании в запросе нескольких таблиц применяют уточненные имена – имя является по структуре составным: таблица.колонка .Допускается применять одновременно уточненные и неуточненные имена. Однако уточненные имена не только устраняют неоднозначность идентификации (при наличии одинаковых имен в разных таблицах). Уточненные имена повышают производительность. Их также рекомендуют применять, чтобы исключить в будущем возникновение риска неоднозначность идентификации при выполнении модификации таблиц.

Псевдонимы можно употреблять не только для столбцов, но и для таблиц (конструкция AS опущена, т.к. применяется не во всех реализациях SQL, например в Oracle).

Пример. Псевдоним таблиц. (Запрос Alias-Tables). Конструкцию AS использовать необязательно, она вставляется автоматически (попробуйте удалить из текста, запроса, сохранить и закрыть запрос, а потом снова открыть).

SELECT

au_fname, au_lname, a.city

FROM authors a