Важным компонентом любой системы реляционных баз данных является связь между таблицами. Это отношение облегчает соединение двух таблиц на основе данных, которые у них «общие». Оно выполняется с помощью JOIN, который представляет собой операцию, что сопоставляет строки из одной таблицы со строками в другой. Сопоставление выполняется таким образом, чтобы столбцы обеих таблиц располагались рядом, хотя они могли быть получены из отдельных таблиц. Однако следует сказать, что чем меньше таблиц объединяется, тем быстрее будет выполняться запрос. В этой статье рассказывается о соединениях и их использовании в движке реляционных баз данных.
Давайте создадим таблицы: CUSTOMERS и ORDERS следующим образом:
- CUSTOMERS (cust_id [PK], cust_fname, cust_lname, phone, address, country);
- ORDERS (order_id [PK], order_date, reqd_date, ship_date, cust_id [FK]);
ВНУТРЕННЕЕ СОЕДИНЕНИЕ (INNER JOIN)
Сценарий: нам нужно увидеть список клиентов и детали их соответствующих заказов.
Это самый простой тип объединения, где каждая строка в одной таблице сопоставляется со всеми другими строками в другой таблице. Только если условие соединения оценивается как истинное. Общие данные должны быть истинными для обеих таблиц, участвующих в JOIN.
SELECT
customers.cust_fname, orders.order_id, orders.order_date
FROM
customers INNER JOIN orders ON customer.cust_id = orders.cust_id;
Интересно, что (работает не для всех движков), вы также можете написать INNER JOIN-запрос с условием WHERE.
SELECT
customers.cust_fname, orders.order_id, orders.order_date
FROM
customers, orders
WHERE
customers.cust_id = orders.cust_id;
ЛЕВОЕ СОЕДИНЕНИЕ (LEFT JOIN)
Это СОЕДИНЕНИЕ извлекает все записи в таблице, которые находятся (буквально) в ЛЕВУЮ сторону от условия соединения И ... любые столбцы, которые соответствуют таблице в ПРАВОЙ стороне условия. Таким образом, клиент без заказов будет возвращен из таблицы клиентов, но значения NULL будут возвращены для столбцов в таблице заказов для строк, которые не соответствуют условию JOIN.
SELECT
customers.cust_fname, orders.order_id, orders.order_date
FROM
customers LEFT JOIN orders
ON customer.cust_id = orders.cust_id;
ПРАВОЕ СОЕДИНЕНИЕ (RIGHT JOIN)
Это СОЕДИНЕНИЕ делает инверсию ЛЕВОГО СОЕДИНЕНИЯ. Он возвращает все записи из таблицы справа со всеми строками, которые могут соответствовать условию из левой таблицы. Таким же образом значения NULL возвращаются для столбцов в левой таблице для строк, которые не соответствуют условию JOIN.
SELECT
customers.cust_fname, orders.order_id, orders.order_date
FROM
customers RIGHT JOIN orders
ON customer.cust_id = orders.cust_id;
Операторы LEFT и RIGHT JOIN иногда пишутся с необязательным ключевым словом OUTER :
- ЛЕВОЕ НАРУЖНОЕ СОЕДИНЕНИЕ (LEFT OUTER JOIN)
- ПРАВО НАРУЖНОЕ СОЕДИНЕНИЕ (RIGHT OUTER JOIN)
ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ (CROSS JOIN)
Перекрестное соединение возвращает столько комбинаций всех строк, сколько содержатся в соединенных таблицах. То есть каждая строка левой таблицы объединяется с каждой строкой в правой таблице. Следовательно, если в таблице A имеется всего M строк, а в таблице B - N строк, перекрестное соединение приведет к созданию M x N строк. Есть 2 способа сделать это. CROSS JOIN заключаются в следующем:
CROSS JOIN
SELECT
customers.cust_fname, orders.order_id, orders.order_date
FROM customers CROSS JOIN orders;
SELECT Statement
SELECT
customers.cust_fname, orders.order_id, orders.order_date
FROM
customers, orders;
ПОЛНОЕ СОЕДИНЕНИЕ (FULL JOIN)
Полное соединение позволяет полностью объединить две таблицы, возвращая полные строки, где выполняется условие JOIN, и значения NULL на стороне.
SELECT
customers.cust_fname, orders.order_id, orders.order_date
FROM
customers FULL JOIN orders
ON customer.cust_id = orders.cust_id;
Этот запрос попытается выполнить левое и правое соединение в одном и NULL там, где есть клиент без заказа, а затем также вернуть каждый отдельный заказ и NULL для заказов, которые не имеют подходящего клиента.
0 комментариев
Добавить комментарий