Добавить в корзинуПозвонить
Найти в Дзене

Виды соединений таблиц: введение (1 часть)

Всем привет! Начнем с простой и базовой, но важной темы. Недавно проходил тест по sql на hh по подтверждению квалификации, и один из вопросов был именно на это. Для чего вообще нужны эти соединения? Исходя из реляционной теории баз данных для более эффективного использования места и недопущения различных ошибок при обновлениях, вставках и удалениях, данные разбиваются по таблицам, чтобы соответствовать некоторой нормальной форме (обычно хотя бы 3ей). Например, производители автомобилей в одной и марки автомобилей в другой. И потом, чтобы собрать воедино эти данные (например, для отображения отчетности для бизнеса) и нужно использовать различные соединения. Из картинки выше, в принципе, все должно быть понятно. Хочу отметить пару моментов. В работе, в основном используют только два вида соединений: left join и inner join (пишут просто join для краткости). Связанно это с тем, что в организациях пользуются определенной архитектурой при которой другие виды соединений редко бывают нужн

Виды соединений
Виды соединений

Всем привет!

Начнем с простой и базовой, но важной темы. Недавно проходил тест по sql на hh по подтверждению квалификации, и один из вопросов был именно на это.

Для чего вообще нужны эти соединения? Исходя из реляционной теории баз данных для более эффективного использования места и недопущения различных ошибок при обновлениях, вставках и удалениях, данные разбиваются по таблицам, чтобы соответствовать некоторой нормальной форме (обычно хотя бы 3ей). Например, производители автомобилей в одной и марки автомобилей в другой. И потом, чтобы собрать воедино эти данные (например, для отображения отчетности для бизнеса) и нужно использовать различные соединения.

Из картинки выше, в принципе, все должно быть понятно. Хочу отметить пару моментов. В работе, в основном используют только два вида соединений: left join и inner join (пишут просто join для краткости). Связанно это с тем, что в организациях пользуются определенной архитектурой при которой другие виды соединений редко бывают нужны.

Так же, есть еще один особый вид соединения - это декартово произведение (cartesian product), когда каждому элементу одной таблицы подставляется элемент другой таблицы. Это соединение наиболее тяжелое и трудозатратное для базы, с временной сложностью O(n^2). Прописывается оно просто, перечисляя таблицы через запятую (либо написать cross join). В одном запросе нельзя одновременно прописать декартово произведение с другими видами соединений. Если нам такое нужно, то можно вставить произведение таблиц в подзапрос, а например left "приджойнить" уже снаружи.

Различный синтаксис декартового соединения
Различный синтаксис декартового соединения

Интересный факт, что в Оракл до 9i (2001 г) версии не поддерживал стандартные ANSI соединения. Для соединения таблиц нужно было сделать их декартово произведение, а потом в where вставить условие по каким колонкам они должны совпадать. Если нужно было использовать left или right соединение, то писали (+) для необязательной колонки. Подобный код до сих пор можно увидеть в legacy code или у олд-скульных разработчиков. Например, вот эти запросы эквиваленты:

Примеры старого и нового синтаксиса левого соединения
Примеры старого и нового синтаксиса левого соединения

Есть и другие, довольно экзотические виды соединений, такие как natural join, или partitioned join. Однако они не дадут нам каких-то новых возможностей в плане работы с множествами, скорее больше какого-то удобства или быстродействия. Их я рассмотрю в следующих статьях.

Следующая статья: Виды соединений таблиц (2 часть): внешние/внутренние, using и natural join