maker | model_1 | model_2 | price |
---|---|---|---|
A | 1232 | 1232 | 600.0 |
A | 1232 | 1232 | 400.0 |
A | 1232 | 1232 | 350.0 |
A | 1232 | 1232 | 350.0 |
A | 1233 | 1233 | 600.0 |
A | 1233 | 1233 | 950.0 |
A | 1233 | 1233 | 980.0 |
B | 1121 | 1121 | 850.0 |
B | 1121 | 1121 | 850.0 |
B | 1121 | 1121 | 850.0 |
E | 1260 | 1260 | 350.0 |
Внешнее соединение LEFT JOIN означает, что помимо строк, для которых выполняется условие предиката, в результирующий набор попадут все остальные строки из первой таблицы (левой). При этом отсутствующие значения полей из правой таблицы будут заполнены NULL-значениями.
SELECT maker, Product.model AS model_1, PC.model AS model_2, price
FROM Product LEFT JOIN PC ON PC.model = Product.model
WHERE type = 'PC'
ORDER BY maker, PC.model;
Обратите внимание на то, что по сравнению с предыдущим примером, пришлось использовать предложение WHERE для отбора только производителей ПК. В противном случае в результирующий набор попали бы также и модели ПК-блокнотов и принтеров. В рассмотренном ранее примере это условие было бы излишним, т.к. соединялись только те строки, у которых совпадали номера моделей, и одной из таблиц была таблица
maker | model_1 | model_2 | price |
---|---|---|---|
A | 1232 | 1232 | 600.0 |
A | 1232 | 1232 | 400.0 |
A | 1232 | 1232 | 350.0 |
A | 1232 | 1232 | 350.0 |
A | 1233 | 1233 | 600.0 |
A | 1233 | 1233 | 950.0 |
A | 1233 | 1233 | 980.0 |
B | 1121 | 1121 | 850.0 |
B | 1121 | 1121 | 850.0 |
B | 1121 | 1121 | 850.0 |
E | 2111 | NULL | NULL |
E | 2112 | NULL | NULL |
E | 1260 | 1260 | 350.0 |
Поскольку моделей 2111 и 2112 из таблицы
Соединение RIGHT JOIN обратно соединению LEFT JOIN, т.е. в результирующий набор попадут все строки из второй таблицы, которые будут соединяться только с теми строками из первой таблицы, для которых выполняется условие соединения. В нашем случае левое соединение
Product LEFT JOIN PC ON PC.model = Product.model
будет эквивалентно правому соединению
PC RIGHT JOIN Product ON PC.model = Product.model
Запрос же
SELECT maker, Product.model AS model_1, PC.model AS model_2, price
FROM Product RIGHT JOIN PC ON PC.model = Product.model
ORDER BY maker, PC.model;
даст те же результаты, что и внутреннее соединение, поскольку в правой таблице (
Так запрос для таблиц A и B, приведенных в начале главы,
SELECT A.*, B.*
FROM A FULL JOIN B
ON A.a = B.c;
даст следующий результат:
a | b | c | d |
---|---|---|---|
1 | 2 | NULL | NULL |
2 | 1 | 2 | 4 |
NULL | NULL | 3 | 3 |
Заметим, что это соединение симметрично, т.е. "A FULL JOIN B" эквивалентно "B FULL JOIN A". Обратите также внимание на обозначение A.*, что означает "все поля таблицы А".
Традиционные операции над множествами и оператор SELECT
Традиционные операции над множествами - это объединение, пересечение, разность и декартово произведение.
Декартово произведение
Ранее мы уже рассмотрели реализацию декартова произведения, перечисляя через запятую табличные выражения в предложении FROM (таблицы, представления, подзапросы). Кроме того, можно использовать еще одну явную операцию соединения:
SELECT Laptop.model, Product.model
FROM Laptop CROSS JOIN Product;