Вопросы и ответы. Декартово произведение является результатом декартова связывания (CARTESIAN JOIN) или отсутствия связывания таблиц в запросе

Резюме

Декартово произведение

Декартово произведение является результатом декартова связывания (CARTESIAN JOIN) или отсутствия связывания таблиц в запросе. Если в запросе указываются две или более таблиц и не используется их связывание, то в выводе будут присутствовать все возможные комбинации строк выбранных таблиц. Если таблицы большие, в результате получится, может быть, сотни, тысячи или даже миллионы записей. При использовании в запросе декартова произведения таблиц, настоятельно рекомендуется использовать ключевое слово WHERE. Декартово произведение таблиц иначе называется кросс-связыванием (cross join).

Синтаксис соответствующей части оператора следующий.

FROM таблица1, таблица2 [,таблицаЗ ]

WHERE таблица1, таблица2 [,таблицаЗ ]

Вот пример кросс-связывания или ужасного декартова произведения таблиц.

SELECT E.EMP_ID, E.LAST_NAME, P.POSITION

FROM EMPLOYEE_TBL E, EMPLOYEE_PAY_TBL P;

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

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

SELECT X FROM TABLE1;

X

A

В

С

D

SELECT X FROM TABLE2;

X

A

В

С

D

SELECT TABLE1.X, TABLE2.X FROM TABLE1, TABLE2;

X X

_ _

A A

В А

С А

D A

А В

в в

с в

D В

А С

в с

с с

D С

A D

В D

С D

D D

При связывании таблиц в запросе всегда следует быть внимательным. Если какие-то две таблицы в запросе окажутся не связанными и число записей в каждой из них будет около 1000, то их прямое произведение будет содержать уже 1000000 выводимых записей.

Вы получили представление об одной из важнейших возможностей SQL – связывании таблиц. Представьте, какие были бы ограничения, если бы в запросе нельзя было извлечь данные из нескольких таблиц сразу. Мы с вами рассмотрели несколько типов связывания таблиц, каждый из которых выполняет свои задачи в зависимости от условий запроса. Данные можно связывать по равенству или по неравенству. Внешнее связывание позволяет извлекать данные из связанных таблиц даже тогда, когда не все записи одной таблицы имеют соответствующие записи в другой. Рекурсивное связывание позволяет связать таблицу саму с собой. Берегитесь кросс-связывания, известного так же, как декартово произведение таблиц. В результате декартова произведения, возникающего при использовании в запросе нескольких таблиц без их связывания, объем выводимых данных может оказаться огромным. При выборе данных из нескольких таблиц внимательно проверьте условия связывания таблиц по родственным столбцам (обычно это должны быть ключевые поля). Неправильное связывание таблиц обычно оборачивается неправильно выведенными или неверными данными.

При связывании таблиц должны ли они связываться в том же порядке, в каком они указаны в выражении ключевого слова FROM?

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

При использовании связующей таблицы для связывания пары таблиц, не имеющих общих столбцов, обязательно ли выбирать в запросе хотя бы один из ее столбцов?

Нет, использование в операторе запроса связующей таблицы не обязывает отображать данные ее столбцов.

Можно ли связывать в запросе не один, а несколько столбцов таблиц?

Да, чтобы обеспечить необходимое соответствие данных, вполне вероятно, что в запросе может понадобиться связывание нескольких столбцов таблиц.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: