Справка по SQL - страница 7

Шрифт
Интервал

стр.


model_1

model_2

1232

1233

1232

1260


Переименование также требуется, если в предложении FROM используется подзапрос. Так, первый пример можно переписать следующим образом:


>SELECT DISTINCT PC.model, maker

>FROM PC,

> (SELECT maker, model

> FROM Product) AS prod

>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.

Соединение 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


стр.

Похожие книги