Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lektsii_BD.doc
Скачиваний:
12
Добавлен:
14.04.2019
Размер:
1.55 Mб
Скачать

4.3.5 Объединение нескольких запросов в один

Напоминаем, что реляционная операция объединение позволяет получить отношение, состоящее из всех строк, входящих в одно или оба объединяемых отношений. Но при этом исходные отношения или их объединяемые проекции должны быть совместимыми по объединению. Для SQL это означает, что две таблицы можно объединять тогда и только тогда, когда:

  1. они имеют одинаковое число столбцов, например, m;

  2. для всех i (i = 1, 2, ..., m) i-й столбец первой таблицы и i-й столбец второй таблицы имеют в точности одинаковый тип данных.

Пример 4.40 Получить всех продавцов и заказчиков, размещенных в Лондоне и вывести их как единое целое:

SELECT snum, sname FROM Продавцы WHERE city = 'Лондон'

UNION

SELECT cnum, cname FROM Заказчики WHERE city = 'Лондон';

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

Кроме того, обратите внимание, что только последний запрос заканчивается точкой с запятой. Отсутствие точки с запятой дает понять SQL, что имеется еще один или более запросов.

UNION будет автоматически исключать дубликаты строк из вывода. Это нечто несвойственное для SQL, так как одиночные запросы обычно содержат DISTINCT чтобы устранять дубликаты. Например, вывод следующего запроса не будет содержать дубликатов:

SELECT snum, city FROM Заказчики

UNION

SELECT snum, city FROM Продавцы;

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

SELECT a.snum, sname, onum, ‘наибольший на’, odate FROM Продавцы a, Порядкиs b

WHERE a.snum = b.snum AND b.amt = ( SELECT MAX (amt) FROM Порядки c

WHERE c.odate = b.odate )

UNION

SELECT a.snum, sname, onum, ‘наименьший на’, odate FROM Продавцы a, Порядкиs b

WHERE a.snum = b.snum AND b.amt = ( SELECT MIN (amt) FROM Порядки c

WHERE c.odate = b.odate);

4.3.6 Синтаксис оператора select

Приведем общий синтаксис оператора SELECT:

SELECT * | { [ DISTINCT | ALL] <список выбора >,….}

FROM { < имя_таблицы> [ < псевдоним > ] }.,..

[ WHERE <предикат>]

[ GROUP BY <имя_столбца>.,..]

[ HAVING <предикат>]

[ ORDER BY <имя_столбца>.,. | <номер_столбца>.,..]

[ { UNION [ALL]

SELECT * | { [DISTINCT | ALL] < < выражение >.,..}

FROM .] } ] ...;

Элементы, используемые в команде SELECT:

< список выбора > - выражения, включающее имена столбцов, функции, знаки операций

<предикат>::=< выражение1 > < оператор> < выражение2> | [NOT] EXISTS< выражение2 >

< оператор> ::= > | < | >= | <= | <> | = | IN | LIKE | BETWEEN …AND | OR | AND | NOT

< выражение2 >::= < выражение1> | [ANY | SOME | ALL ] <подзапрос>

<подзапрос>::= (SELECT * | { [ DISTINCT | ALL] < выражение >,….}

FROM { < имя_таблицы> [ < псевдоним > ] }.,..

[ WHERE <предикат>] …)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]