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

Пример. Перечислить для штата Нью-Йорк, имена проживающих авторов и названия расположенных издательств. (запрос UNION-Select-State-Authors#Publishers)

SELECT

'authors' AS "Type",

au_fname+' ' + au_lname AS "Name",

state FROM authors

WHERE state = 'NY'

UNION

SELECT

'publisher',

pub_name,

state FROM Publisher

WHERE state = 'NY'

ORDER BY 1, 2;

Задание.  Добавьте к именам и названием заголовки (title) книг, изданных в штате Нью-Йорк.

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

Пример. Отобразить количество авторов, издательств из штата Нью-Йорк, книг, опубликованных в этом штате. (запрос UNION-Count-Authors#Publishers#Books)

SELECT

'authors' AS "Type",

COUNT(au_id) AS "Count"

FROM authors

WHERE state = 'NY'

UNION

SELECT

'publisher',

COUNT(pub_id)

FROM Publisher

WHERE state = 'NY'

UNION SELECT

'books',

COUNT(title_id)

FROM Title t

INNER JOIN publisher p

ON  t.pub_id = p.pub_id

WHERE p.state = 'NY'

ORDER BY 1;

Примечание. Оператор UNION можно использовать вместо конструкции CASE, объедияняя несколько запросов

Задание.  Повышаются цены на книги в зависимости от категории: история – 10%, психология – 20%. Отобразить список цен на издания с указанием старой и новой цены (можно указать идентификатор книги).

Поиск общих строк

Стандартом SQL предусматривается возможность выбора общих строк в запросах. Например, можно получить список городов, в которых живут авторы и расположены издательства.

SELECT city

FROM authors

INTERSECT

SELECT city

FROM publisher

Access, Microsoft SQL, MySQL этот оператор не поддерживают, поэтому применяется внутренне объединение или подзапрос.

Пример. Города, где проживают авторы и есть издательства. (запрос City-Authors#Publishers)

SELECT DISTINCT

a.city

FROM authors a

INNER JOIN publisher p

ON  a.city = p.city

Поиск разных строк

Для отбора строк первого запроса, которых нет во втором запросе, SQL предлагает оператор EXEPT (в ORACLE - MINUS). Access, Microsoft SQL, MySQL такой оператор тоже не поддерживают, поэтому применяется внешнне объединение или подзапрос.

Пример. Города, где проживают авторы и нет издательств. (запрос City-Authors#Publishers#1)

SELECT DISTINCT a.city

FROM authors AS a

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

WHERE p.city IS NULL;

Подзапросы

Подзапрос – команда SELECT, встроенная в другую команду SQL. Подзапрос можно включить в:

- предложения FROM, WHERE или HAVING,

- другой подзапрос

- команды INSERT, UPDATE, DELETE.

Подзапрос часто называют внутренним запросом.

Пример. Отобразить названия издательств, в которых опубликованы книги-биографии. (запрос Publisher-typeBook)

SELECT pub_name

FROM publisher

WHERE pub_id IN

(SELECT pub_id FROM title

WHERE type = 'biography');

Подзапрос формирует список идентификаторов, в котором выполняет поиск на соответствие основной запрос.

Тот же результат может быть получен путем внутреннего объединения. (запрос Publisher-typeBook#1)

SELECT DISTINCT pub_name

FROM publisher p

INNER JOIN title t

ON p.pub_id = t.pub_id

WHERE t.type = 'biography';

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

Аналогичный результат можно получит, если построить временную таблицу для результатов подзапроса.

Подзапрос всегда заключается в скобки. Сортировка в подзапросе не применяется.

Чаще всего подзапрос встречается в предложении WHERE (условие отбора строк), в одной из форм:

- <выражение> <оператор сравнения> (<запрос>);

- <выражение> [NOT] IN (<запрос>);

- <выражение> <оператор сравнения> ALL (<запрос>);

- <выражение> <оператор сравнения> ANY (<запрос>);

- [NOT] EXISTS (<запрос>).

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