РЕАЛИЗАЦИЯ ОПЕРАЦИЙ РЕЛЯЦИОННОЙ АЛГЕБРЫ ОПЕРАТОРОМ SELECT
С помощью предложения SELECT можно реализовать любую операцию реляционной алгебры.
□ Выборка (горизонтальное подмножество) таблицы создается из тех ее строк, которые удовлетворяют заданным условиям.
Пример:
SELECT * FROM Clients WHERE City = 'Тверь'
□ Проекция (вертикальное подмножество) таблицы создается из указанных ее столбцов (в заданном порядке) с последующим исключением избыточных дубликатов строк.
Пример:
SELECT DISTINCT City FROM Clients
□ Объединение двух таблиц содержит те строки, которые есть либо в первой, либо во второй, либо в обеих таблицах.
Пример:
SELECT * FROM Clients WHERE Age = (SELECT MIN(Age) FROM Clients) UNION
SELECT * FROM Clients WHERE Age = (SELECT MAX(Age) FROM Clients)
□ Пересечение двух таблиц содержит только те строки, которые есть и в первой, и во второй.
Пример:
SELECT * FROM Clients WHERE Age IN (SELECT MIN(Age) FROM Clients)
□ Разность двух таблиц содержит только те строки, которые есть в первой, но отсутствуют во второй. Пример:
SELECT * FROM Clients WHERE City NOT IN
(SELECT City FROM Clients GROUP BY City HAVING Count(*)<=10)
Декартово произведение таблиц и различные виды соединений рассмотрены ниже.
Выборки из нескольких таблиц
Когда в предложении FROM указаны несколько таблиц, то все они неявно считаются соединяемыми. По сути это означает, что можно получить все возможные комбинации строк (по одной из каждой таблицы), и именно с такой конкатенацией будут работать остальные операторы запроса. Эта конкатенированная таблица носит название декартово произведение или перекрестное соединение (cross join). Чаще всего пользователю нужно исключить большинство строк и выделить определенные данные, что обычно реализуется посредством установления отношений (или условий) при помощи предложения WHERE. Другой способ установить отношения – использование встроенных операций соединения, чтобы осуществить внутреннее соединение в предложении FROM. Результат этого соединения есть порожденная таблица, которая и должна обрабатываться остальными операторами запроса.
|
|
Допускаются перекрестные (CROSS), естественные (NATURAL) соединения, т.е. соединения по нескольким столбцам с одинаковыми именами, и соединения типа «объединений» (UNION). Соединение UNION и оператор UNION являются различными понятиями. Оператор UNION служит для объединения выходных данных нескольких операторов SELECT.
перекрестное соединение:
таблица A CROSS JOIN таблица B
естественно е соединение:
таблица A [NATURAL] [тип соединения] JOIN таблица B
соединение объединения:
таблица A UNION JOIN таблица B
объединение посредством предиката:
таблица A [тип соединения] JOIN таблица B ON предикат
объединение посредством имен столбцов:
таблица A [тип соединения] JOIN таблица B USING (имя столбца,..)
|
|
ти п соединения:
INNER|{{LEFT|RIGHT|FULL|[OUTER]}
Все эти структуры служат для того, чтобы заместить имя таблицы в предложении FROM. Хотя в перечне приведен синтаксис соединений, которые используют только две таблицы, можно соединять любое их количество. Результатом соединения является таблица, которая обрабатывается в качестве исходной остальными операторами запроса.
Ключевое слово OUTER (внешний) не является обязательным, оно употребляется только для уточнения и не используется ни в каких операциях с данными.
CROSS – перекрестное соединение. Это простое декартово произведение. Используются все комбинации строк. Пример перекрестного соединения приведен в таблице 2.2.
INNER – внутреннее соединение. Это тип соединения по умолчанию, оно используется, когда другой тип соединения не задан. Соединяются только те строки, где найдены совпадающие значения столбца. Внутреннее соединение иллюстрируется в таблице 3.
TABLE A
TABLE B
|
ID_NUM | NAME |
1334 | Иванов |
1399 | Петров |
1208 | Сидоров |
|
|
Перекрестное соединение
A CROSS JOIN B
|
Внутреннее соединение
A INNER JOIN В
ID_NUM | NAME | PHONE |
1334 | Иванов | 555-8554 |
1399 | Петров | 555-5223 |
1399 | Петров | 555-9111 |
LEFT (OUTER) – левое (внешнее). Это соединение включает в себя все строки из таблицы А (совпадающие и несовпадающие) плюс совпадающие значения из таблицы В. Для строк из таблицы А, которым не найдено соответствие, значения NULL заносятся в столбцы, извлекаемые из таблицы В.
Левое внешнее соединение A LEFT OUTER JOIN В
ID_NUM | NAME | PHONE |
1334 | Иванов | 555-8554 |
1399 | Петров | 555-5223 |
1399 | Петров | 555-9111 |
1208 | Сидоров | NULL |
RIGHT (OUTER) – правое (внешнее). Как можно предположить, это соединение является обратным предыдущему. Другими словами, все строки из таблицы В (правой таблицы) представлены в соединении и они дополнены совпадающими строками из таблицы А, в столбцы для строк, не имеющих совпадения, заносятся значения NULL.
|
|
FULL (OUTER) – полное (внешнее). Это комбинация левого и правого соединения. Присутствуют все строки из обоих таблиц. Если строки совпадают, то они заполнены реальными значениями. В несовпадающих строках значения столбцов заполняются значениями NULL. Этот тип соединения иллюстрируется в таблице 2.6.
Правое внешнее соединение
A RIGHT OUTER JOIN <В
Полное внешнее соединение
A FULL OUTER JOIN В
ID_NUM | NAME | PHONE |
1334 | Иванов | 555-8554 |
1399 | Петров | 555-5223 |
1399 | Петров | 555-9111 |
NULL | Крылов | 555-7894 |
|
Таблица 2.6
UNION – объединение. Этот тип соединения отличается от оператора UNION, который используется для объединения выходной информации нескольких запросов. Соединение типа UNION является обратным по отношению к INNER: оно включает только те строки из таблиц, для которых не найдено совпадений. В них используются значения NULL для столбцов, полученных из другой таблицы. Если взять полное внешнее соединение и удалить из него строки, полученные путем внутреннего соединения тех же таблиц, то в результате получится соединение типа «объединения» (union). Этот тип соединения иллюстрируется в таблице 2.7.
Соединение типа объединение
A UNION JOIN В
ID_NUM | NAME | PHONE |
1208 | Сидоров | NULL |
NULL | Крылов | 555-7894 |
Таблица 2.7
Тип соединения только определяет, из каких строк будут состоять выходные данные. Другие возможные соединения могут быть напрямую заданы с помощью ON или USING. USING определяет соединение по столбцам. Если это естественное соединение, то имена столбцов и типы данных должны совпадать. USING отличается от NATURAL тем, что позволяет соединять в таблицах только заданное подмножество столбцов с совпадающими именами, a NATURAL автоматически соединяет все столбцы с одинаковыми именами.
ON определяет предикат, который представляет собой выражение, подобное Сity='Тверь', например, A.NAME=B.NAME. Результатом вычисления выражения могут быть TRUE, FALSE или UNKNOWN (если присутствует значение NULL). Значение предиката в данном случае может вычисляться с использованием значений, взятых из строки- кандидата соединения. Под строкой - кандидатом понимается строка, которая, в свою очередь, получается, как декартово произведение строк таблиц, участвующих в соединении.
Дата добавления: 2019-09-13; просмотров: 311; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!