Рубрика:
Базы Данных
В прошлый раз (здесь) я рассказал в общих чертах про объединения. Теперь пора приступить к более подробному изложению. Сегодня это и сделал — описал внутренние объединения. Статья получилась большой, с примерами. Повторюсь — статья для новичков, а не для профи.
Кстати,
пока обновлял знания по объединениям,
нашел один интересный сайт
(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, если сможет,
автоматически преобразовать типы.
Комментариев нет:
Отправить комментарий