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

2. Отобразить в запросе ФИО автора вместо его идентификатора (см. как возможный вариант Author-GROUP-Pay#2)

Контрольное задание 3. Как видно из последних примеров Аванс оказывается больше доли автора с продаж. В таких случаях гонорар не выплачивается.

1. Построить запрос, который отображает гонорары авторов, выплачиваемые авторам после реализации книг.

2. Выполнить дополнительную группировку по издательствам. Отобразить в запросе данные по издательствам, расположенным в США.

Внешнее объединение

Внутреннее объединение не включает в результат те строки таблиц, которые не удовлетворяют условию объединения (чаще всего, совпадение значений в объединяемых столбцах). Внешнее объединение помещает в результат все строки хотя бы одной из таблиц. Порядок в котором перечисляются таблицы при внешнем объединении имеет значение (см. примеры).

Внешнее объединение позволяет получить ответы при поиске аномальных ситуаций: авторы, не написавшие ни одной книги, клиенты, не сделавшие заказа курсы, на которые не записался ни один студент и т.п.

Левое внешнее объединение включает в себя все строки левой таблицы, а не только те, для которых есть совпадения в связанных столбцах. Если совпадение в правой таблице отсутствует (условие объединения ложно), то результирующая строка содержит значения NULL для столбцов правой таблицы из списка SELECT. Правое внешнее объединение аналогично включает все строки из правой таблицы и заполняет колонки левой значениями NULL при отсутствии совпадения. Полное внешнее объединение – комбинация правого и левого объединений. Содержит все строки и левой и правой таблиц, заполняя соответствующие колонки значениями NULL в случае отсутствия соответствия. Поэтому в результатах внешних объединений нельзя различить, были добавлены значения NULL либо содержались в исходной таблице до объединения. (Условие NULL = NULL является неопределенным.)

Пример. Левое объединение – список городов, где проживают авторы и расположены издательства. (запрос Left-Author-Publisher)

SELECT a.au_fname, a.au_lname, p.pub_name

FROM authors AS a LEFT JOIN publisher AS p ON a.city = p.city;

В Access конструкция OUTER является необязательной (для сравнения запрос Left-Author-Publisher#1)

Пример. Правое объединение – список городов, где проживают авторы и расположены издательства. (запрос Right-Author-Publisher)

SELECT a.au_fname, a.au_lname, p.pub_name

FROM authors AS a RIGHT JOIN publisher AS p ON a.city = p.city;

Примечание. При работе с внешними объединениями следует использовать конструкцию JOIN. SQL не имеет стандарта для использования предложения WHERE с внешними объединениями. В разных СУБД применение этой конструкции в данных ситуациях различается. Ранние версии Microsoft SQL Server применяли операторы *= либо =* для обозначения левого и правого объединений.

SELECT a.au_fname, a.au_lname, p.pub_name

FROM authors AS a, publisher AS p WHERE a.city *= p.city;

Аналогичная ситуация и с ранними версиями Oracle – расширяемая пустыми значениями таблица обозначалась (+).

SELECT a.au_fname, a.au_lname, p.pub_name

FROM authors AS a, publisher AS p WHERE a.city = p.city (+);

Примечание. Microsoft Access и MySQL не поддерживают полные внешние объединения. Можно комбинировать левое и правое объединения командой UNION.

Пример. Правое объединение – список городов, где проживают авторы и расположены издательства. (запрос FULL#OUTER-Author-Publisher)

SELECT a.au_fname, a.au_lname, p.pub_name

FROM authors AS a LEFT JOIN publisher AS p ON a.city=p.city

UNION ALL

SELECT a.au_fname, a.au_lname, p.pub_name

FROM authors AS a RIGHT JOIN publisher AS p ON a.city=p.city;

Задание. Отобразить количество книг, опубликованных каждым автором (включая написанные в соавторстве).