В данном посте, я визуализирую пример из книги Д. Осипова “Базы данных и Delphi” со своими вариациями. То есть, если представить это схематично, то соединение таблиц будет выглядеть таким образом.
1 2 3 4 5 6 7 |
SELECT field_name [,... n] FROM Table1 {INNER | {LEFT | RIGHT | FULL} OUTER | CROSS } JOIN Table2 {ON <condition> | USING (field_name [,... n])} |
INNER JOIN (ПЕРЕСЕЧЕНИЕ МНОЖЕСТВ)
Итак, разберем на примере, пускай у нас есть магазин, для которого мы создали таблицы SUPPLIERS и CONTRACTS. Магазин только начал свою работу, и не со всеми поставщиками заключили контракты.
Как отобразить только тех поставщиков, с кем у нас заключены контракты?
В программе WorBench создадим новую модель, базу данных и таблицы, о которых мы говорим.
Таблица Contracts…
Таблица Suppliers…
Итак, экспортируем, скрипт, выполняем его, в Delphi создаем клиента, получаем такую картину
Если по русски, то наш магазин только начал работу, и контракты заключены не со всеми поставщиками, а только с 1,2,3,4… , что видно из колонки Contract_supplier_key. При нажатии на кнопку “Выполнить”, запускается инструкция к серверу MySQL.
Select*from suppliers inner join contracts on SUPPLIERS.SUPPLIER_KEY=CONTRACTS.CONTRACT_SUPPLIER_KEY
Результат получается следующим.
То есть, выбрали записи из таблицы Suppliers, такие, для которых SUPPLIERS.SUPPLIER_KEY=CONTRACTS.CONTRACT_SUPPLIER_KEY, то есть с кем заключили контракты. При этом, с поставщиком DON, мы заключили контракты 2 раза, что и отражено в объединенной таблице.
LEFT JOIN (LEFT OUTER JOIN, ОБЪЕДИНЕНИЕ МНОЖЕСТВ)
Приcоединение к левой таблице.
Если используем эту инструкцию, то получим всех поставщиков, но в первую очередь с теми, с кем заключили договора.
Select*from suppliers left join contracts on SUPPLIERS.SUPPLIER_KEY=CONTRACTS.CONTRACT_SUPPLIER_KEY
RIGHT JOIN (RIGHT OUTER JOIN тоже самое, ОБЪЕДИНЕНИЕ МНОЖЕСТВ)
В данном случае, используем присоединение к правой таблице (contracts) с использованием условия равенства ключей.
Select*from suppliers left join contracts on SUPPLIERS.SUPPLIER_KEY=CONTRACTS.CONTRACT_SUPPLIER_KEY
USING (ОБЪЕДИНЕНИЕ МНОЖЕСТВ)
Вместо предиката ON, мы можем использовать предикат USING, при условии, что имена столбцов совпадают.
Select*from suppliers left join contracts USING SUPPLIER_KEY
В нашем примере имена ключевых полей, по которым мы производим объединение таблиц – разные, поэтому для того, чтобы продолжить пример, нужно будет сделать одинаковые названия полей.
На этом данный пост завершаю.
[block id=”mysql-first-steps”]