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

Контрольное задание 4. Создать полный список авторов, в котором отобразить ФИО авторов, названия книг, тираж которых превысил 100 000 экз., и размер тиража. (Потребуется применить и внешнее объединение, т.к. полный список авторов, и внутреннее, т.к. авторы, названия, тираж расположены в разных таблицах.)

Самообъединение

Самообъединение – объединение таблицы со своей копией  выбирает строки в соответствии с условием объединения. Используется в таблицах с рефлексивными связями (связи между первичными и вторичными ключами).

Задание. Задана таблица стремя колонками: (КОД_СОТР, ФАМИЛИЯ_СОТР, КОД_НАЧАЛЬНИКА). Построить запрос, содержащий список сотрудников и их начальников.

Можно объединить таблицу с самой собой и случаях, когда нет рефлексивных связей. Обычно сравнивают столбец первой копии с тем же столбцом второй копии.

Пример. Получить список авторов (их кодов, городов), проживающих в том же штате, что и автор с кодом ao6. (запрос SELF-Authors-STATE)

SELECT

a1.au_id, a1.au_fname, a1.au_lname, a1.state, a1.city

FROM authors AS a1

INNER JOIN authors AS a2 ON a1.state = a2.state

WHERE a2.au_id='a06';

Пример. Преобразовать самообъединение в подзапрос. (запрос SELF-Authors-STATE#SubRequest)

SELECT

au_id, au_fname, au_lname, state, city

FROM authors WHERE state IN

(SELECT state FROM authors WHERE au_id='a06');

Задание. Для каждой книги отобразить список книг, которые продаются лучше. (запрос SELF-Authors-STATE#SubRequest)

Пример. Для каждой книги-биографии отобразить книги, пользующиеся большим спросом. (запрос Book-ListMoreSales)

SELECT

t1.title_id, t1.sales,

t2.title_id AS "BestBook", t2.sales AS "HighSale"

FROM title t1

INNER JOIN title t2

ON t1.sales < t2.sales

WHERE t1.type = 'biography' AND t2.type = 'biography'

ORDER BY t1.title_id, t2.sales

Контрольное задание 5. Преобразовать запрос так, чтобы отображались названия книг из 1-й таблицы, группировать по категориям, для каждой книги перечислять не весь список книг с большим рейтингом продаж, а только минимальную и максимальную величину продаж из этого списка.

Оператор UNION

Оператор UNION применяется для комбинирования результатов двух запросов в один результат. Оператор объединяет строки запросов (оператор SELECT комбинирует столбцами). В процессе объединения по умолчанию удаляются дубликаты, поэтому для их сохранения следует применять конструкцию ALL.

Команда объединения запросов имеет следующую структуру:

SELECT-оператор

UNION [ALL]

SELECT-оператор

Списки столбцов в командах SELECT должны содержать одинаковое число столбцов. Соответствующие столбцы обоих запросах должны перечисляться в одинаковом порядке. Названия соответствующих столбцов могут совпадать. Тогда результат будет иметь столбец с тем же названием. В противном случае, как правило, используется название столбца из первого запроса. Чтобы переименовать столбец, следует использовать конструкцию AS в первом запросе.

Для группировки строк результата применяется конструкция ORDER BY, которая помещается в конец фразы команды UNION. Рекомендуется ссылаться при сортировке на порядковые номера столбцов. Сортировка может выполняться и по умолчанию, т.к. СУБД идентифицирует повторяющиеся строки (внутренняя сортировка не выполняется в случае UNION ALL).

Инструкции группирования GROUP BY и отбора групп HAVING можно применять в каждом запросе. Нельзя группировать итоговые данные после объединения запросов.

Пример. Список штатов, где проживают авторы и расположены издательства. (запрос List-State)

SELECT state FROM authors

UNION

SELECT state FROM Publisher;

Можно в одном столбце объединить и разные по содержанию (но одинаковые по типу данные). Тогда обычно включают дополнительный столбец, чтобы идентифицировать из какого запроса были включены данные.