WHERE PC.model = prod.model AND price < 600;
Обратите внимание, что в этом случае в других предложениях оператора SELECTуже нельзя использовать квалификатор Product , поскольку таблица Product уже не используется. Вместо него используется псевдоним prod . Кроме того, ссылаться теперь можно только на те поля таблицы Product , которые перечислены в подзапросе.
Операции соединения. Предложения JOIN
В предложении FROMможет быть указана явная операция соединениядвух и более таблиц. Среди ряда операций соединения, описанных в стандарте языка SQL, многими серверами баз данных поддерживается лишь операция соединения по предикату. Синтаксис соединения по предикату имеет вид:
FROM[ INNER]
| {{ LEFT| RIGHT| FULL} [ OUTER]} JOIN
[ ON]
Соединение может быть либо внутренним( INNER), либо одним из внешних( OUTER). Служебные слова INNERи OUTERможно опускать, поскольку внешнее соединение однозначно определяется его типом - LEFT(левое), RIGHT(правое) или FULL(полное), а просто JOINбудет означать внутреннее соединение.
Предикат определяет условие соединения строк из разных таблиц. При этом INNER JOINозначает, что в результирующий набор попадут только те соединения строк двух таблиц, для которых значение предиката равно TRUE. Как правило, предикат определяет эквисоединение по внешнему и первичному ключам соединяемых таблиц, хотя это не обязательно.
Пример. Найти производителя, номер модели и цену каждого компьютера, имеющегося в базе данных:
SELECT maker, Product.model AS model_1, PC.model AS model_2, price
FROM Product INNER JOIN PC ON PC.model = Product.model
ORDER BY maker, PC.model;
В данном примере в результирующем наборе будут соединяться только те строки из таблиц PC и Product , у которых совпадают номера моделей.
Для контроля в результат включен как номер модели из таблицы PC , так и из таблицы Product :
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для отбора только производителей ПК. В противном случае в результирующий набор попали бы также и модели ПК-блокнотов и принтеров. В рассмотренном ранее примере это условие было бы излишним, т.к. соединялись только те строки, у которых совпадали номера моделей, и одной из таблиц была таблица PC , содержащая только ПК. В результате выполнения запроса получим:
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 из таблицы Product нет в таблице PC , в полях из таблицы PC содержится NULL.
Читать дальше