РЕАЛИЗАЦИЯ ОПЕРАЦИЙ РЕЛЯЦИОННОЙ АЛГЕБРЫ ОПЕРАТОРОМ 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


NAME PHONE
Иванов 555-8554
Петров 555-5223
Петров 555-9111
Крылов 555-7894

 

ID_NUM NAME
1334 Иванов
1399 Петров
1208 Сидоров


 


 

Перекрестное соединение

A CROSS JOIN B

ID_NUM A.NAME B.NAME PHONE
1334 Иванов Иванов 555-8554
1399 Петров Иванов 555-8554
1208 Сидоров Иванов 555-8554
1334 Иванов Петров 555-5223
1399 Петров Петров 555-5223
1208 Сидоров Петров 555-5223
1334 Иванов Петров 555-9111
1399 Петров Петров 555-9111  
1208 Сидоров Петров 555-9111
1334 Иванов Крылов 555-7894
1399 Петров Крылов 555-7894
1208 Сидоров Крылов 555-7894

 

 


 

 

Внутреннее соединение

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

 

ID_NUM NAME PHONE
1334 Иванов 555-8554
1399 Петров 555-5223
1399 Петров 555-9111
1208 Сидоров NULL
NULL Крылов 555-7894

 

Таблица 2.5

 

Таблица 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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!