пятница, 28 июня 2013 г.

Внутренние объединения


Рубрика: Базы Данных

В прошлый раз (здесь) я рассказал в общих чертах про объединения. Теперь пора приступить к более подробному изложению. Сегодня это и сделал — описал внутренние объединения. Статья получилась большой, с примерами. Повторюсь — статья для новичков, а не для профи.

Кстати, пока обновлял знания по объединениям, нашел один интересный сайт (http://www.atmung.ru/) на нем можно приобрести кислородное оборудование. Просто иногда мысль меня посещает — может у нас в городе открыть бар по изготовлению кислородных коктейлей? Вот и цену на оборудование посмотрю (после того, как статью допишу). И вы можете.

Итак, при внутреннем объединении выдаются строки из всех объединяющихся таблиц, которые удовлетворяют условию объединения во where. Как я уже говорил – внутренние объединения (inner joins) – самый популярный и стандартный вид объединений, его все когда-нибудь да используют.
Пример: есть две таблицы, table1(id1, val1) и table2 (id2, val2, id1). В них есть значения. Нужно объединить их и найти строки, равные по id1. Те строки, в которых id1 во всех таблицах не будет одинаковым – во внутреннем объединении не появятся. Значения в таблицах:

ID1
VAL

ID2
VAL2
ID1
1
один

1
- 1 -
1
2
два

2
- 2 -
2
3
три

3
- 4 -
4
5
пять




7
семь






Выполните следующий запрос:
SELECT * FROM table1 t1, table2 t2 WHERE t1.id1 = t2.id1

В результате получите следующий результат:

ID1 VAL ID2 VAL2 ID1
1 один 1 - 1 -

2 два 2 - 2 -


Как можно увидеть – получилось две строки. Хоть во второй таблице и есть три записи, но по id1 – только две повторяется, вот две строки и появилось в результате.

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

Одной из разновидностей внутреннего объединения является декартово произведение (прямое объединение). Оно получается если объединить две таблицы и не указать условия объединения. В результате будет объединение каждой строки одной таблицы с каждой строкой другой таблицы (перемножение строк). Если прошлый пример посмотреть, то (выполнив простой запрос) SELECT * FROM table1 t1, table2 t2 получится:


ID1 VAL ID2 VAL2 ID1
1 один 1 - 1 - 1
2 два 1 - 1 - 1
3 три 1 - 1 - 1
5 пять 1 - 1 - 1
7 семь 1 - 1 - 1
1 один 2 - 2 - 2
2 два 2 - 2 - 2
3 три 2 - 2 - 2
5 пять 2 - 2 - 2
7 семь 2 - 2 - 2
1 один 3 - 4 - 4
2 два 3 - 4 - 4
3 три 3 - 4 - 4
5 пять 3 - 4 - 4
7 семь 3 - 4 - 4

И действительно, в результате получилось пятнадцать строк (5*3=15). 
Объединение по равенству и не по равенству: 
И заключительный момент. Существуют объединения по равенству (когда явно во where прописать знак равно (=), как в примере выше), и не по равенству, когда указываются размытые условия (например BETWEEN, <, > и др). И еще – типы данных объединяемых полей должны быть совместимыми – Oracle, если сможет, автоматически преобразовать типы. 

Комментариев нет:

Отправить комментарий