Пример. Перечислить для штата Нью-Йорк, имена проживающих авторов и названия расположенных издательств. (запрос 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 (<запрос>).
Многие запросы с подзапросами можно преобразовать в объединения. Из-за сложности подзапросов иногда используются объединения. Однако для некоторых задач подзапрос – единственный способ решения.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.