KnigaRead.com/

W Cat - Справка по SQL

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн W Cat, "Справка по SQL" бесплатно, без регистрации.
Перейти на страницу:

Предикат определяет условие соединения строк из разных таблиц. При этом 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

ORDER BY maker, PC.model;


даст те же результаты, что и внутреннее соединение, поскольку в правой таблице (PC) нет таких моделей, которые отсутствовали бы в левой таблице (Product), что вполне естественно для типа связи "один-ко-многим", которая имеется между таблицами PC и Product. Наконец, при полном соединении (FULL JOIN) в результирующую таблицу попадут не только те строки, которые имеют одинаковые значения в сопоставляемых столбцах, но и все остальные строки исходных таблиц, не имеющие соответствующих значений в другой таблице. В этих строках все столбцы той таблицы, в которой не было найдено соответствия, заполняются NULL-значениями. Полное соединение представляет собой комбинацию левого и правого внешних соединений.

Так запрос для таблиц 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;


Напомним, что при декартовом произведении каждая строка из одной таблицы соединяется с каждой строкой второй таблицы. В результате количество строк результирующего набора равно произведению количества строк операндов декартова произведения. В нашем примере таблица Laptop содержит 5 строк, а таблица Product - 16. В результате получается 5*16 = 80 строк. Поэтому мы не приводим здесь результат выполнения этого запроса. Вы можете сами проверить это утверждение, выполнив приведенный выше запрос на учебной базе данных.

В чистом виде декартово произведение практически не используется. Оно, как правило, является промежуточным результатом выполнения операции горизонтальной проекции (выборки) при наличии в операторе SELECT предложения WHERE.

Объединение


Для объединения запросов используется служебное слово UNION:


UNION [ALL]


Оператор UNION объединяет выходные строки каждого из запросов в один результирующий набор. Если определен параметр ALL, то сохраняются все дубликаты выходных строк, в противном случае в результирующем наборе остаются только уникальные строки. Заметим, что можно связывать вместе любое число запросов. Кроме того, с помощью скобок можно менять порядок объединения.

При этом должны выполняться следующие условия:

* Количество выходных столбцов каждого из запросов должно быть одинаковым.

* Выходные столбцы каждого из запросов должны быть сравнимыми между собой (в порядке их следования) по типам данных.

* В результирующем наборе используются имена столбцов, заданные в первом запросе.

* Предложение ORDER BY применяется к результату соединения, поэтому оно может быть указано только в конце составного запроса.

Пример. Найти номера моделей и цены ПК и ПК-блокнотов:


SELECT model, price

FROM PC

UNION

SELECT model, price

FROM Laptop

ORDER BY price DESC;


model

price

1750

1200.0

1752

1150.0

1298

1050.0

1233

980.0

1321

970.0

1233

950.0

1121

850.0

1298

700.0

1232

600.0

1233

600.0

1232

400.0

1232

350.0

1260

350.0


Пример. Найти тип продукции, номер модели и цену ПК и ПК-блокнотов:


SELECT Product .type, PC.model, price

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*