Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПЗ 6-7.docx
Скачиваний:
15
Добавлен:
17.02.2016
Размер:
49.84 Кб
Скачать

Устранение дублирования в union

В отличие от обычных запросов UNION автоматически исключает из выходных данных дубликаты строк, например, в запросе

SELECT CITY

FROM STUDENT

UNION

SELECT CITY

FROM LECTURER;

совпадающие наименования городов будут исключены.

Если все же необходимо в каждом запросе вывести все строки независимо от того, имеются ли такие же строки в других объединяемых запросах, то следует использовать во множественном запросе конструкцию с оператором UNION ALL. Так, в запросе

SELECT CITY

FROM STUDENT

UNION ALL

SELECT CITY

FROM LECTURER;

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

Приведем еще один пример использования оператора UNION. Пусть необходимо составить отчет, содержащий для каждой даты сдачи экзаменов сведения по каждому студенту, получившему максимальную или минимальную оценки.

SELECT A.STUDENT_ID, SURNAME, OCENKA, EXAM_DATE

FROM STUDENT A, EXAM_OCENKA B

WHERE (A.STUDENT_ID = B.STUDENT_ID

AND B.OCENKA =

(SELECT MAX(OCENKA)

FROM EXAM_OCENKA C

WHERE C.EXAM_DATE = B.EXAM_DATE))

UNION ALL

SELECT A.STUDENT_ID, SURNAME, OCENKA, EXAM_DATE

FROM STUDENT A, EXAM_OCENKA B

WHERE (A.STUDENT_ID = B.STUDENT_ID

AND B.OCENKA =

(SELECT MIN(OCENKA)

FROM EXAM_OCENKA C

WHERE C.EXAM_DATE = B.EXAM_DATE));

Соединение таблиц с использованием оператора join

Если в операторе SELECT после ключевого слова FROM указывается не одна, а две таблицы, то в результате выполнения запроса, в котором отсутствует предложение WHERE, каждая строка одной таблицы будет соединена с каждой строкой второй таблицы. Такая операция в реляционной алгебре называется ДЕКАРТОВЫМ ПРОИЗВЕДЕНИЕМ, или ПОЛНЫМ (CROSS) СОЕДИНЕНИЕМ таблиц.

Сама по себе эта операция не имеет практического значения.

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

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

Это можно сделать с помощью следующего запроса:

SELECT STUDENT.SURNAME , UNIVERSITY.UNIV_NAME , STUDENT.CITY

FROM STUDENT, UNIVERSITY

WHERE STUDENT.CITY = UNIVERSITY.CITY ;

Соединение, использующее предикаты, основанные на равенствах, называется эквисоединением. Рассмотренный пример соединения таблиц относятся к виду так называемого внутреннего (INNER) соединения. При этом соединяются только те строки таблиц, для которых истинным является предикат, задаваемый в предложении ON выполняемого запроса.

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

SELECT STUDENT.SURNAME, UNIVERSITY.UNIV_NAME, STUDENT.CITY

FROM STUDENT INNER JOIN UNIVERSITY

ON STUDENT.CITY = UNIVERSITY.CITY;

Ключевое слово INNER в запросе может быть опущено, так как эта опция в операторе JOIN действует по умолчанию.