- •Практическое занятие №6 Использование в запросах операторов exists, in, any, all
- •Теоретический материал Использование в запросах оператора exi sts
- •Операторы сравнения с множеством значений in, any, all
- •Примеры запросов с использованием приведенных операторов
- •Особенности применения операторов any, all, exists при обработке пустых значений (null)
- •Использование count вместо exists
- •Ход работы:
- •Задания:
- •Контрольные вопросы:
- •Устранение дублирования в union
- •Соединение таблиц с использованием оператора join
- •Операции соединения таблиц посредством ссылочной целостности
- •Внешнее соединение таблиц
- •Ход работы:
- •Задания:
- •Контрольные вопросы:
Устранение дублирования в 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 действует по умолчанию.