Читаем Справка по SQL полностью

Напомним, что при декартовом произведении каждая строка из одной таблицы соединяется с каждой строкой второй таблицы. В результате количество строк результирующего набора равно произведению количества строк операндов декартова произведения. В нашем примере таблица 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

FROM PC INNER JOIN

Product ON PC.model = Product .model

UNION

SELECT Product .type, Laptop.model, price

FROM Laptop INNER JOIN

Product ON Laptop.model = Product .model

ORDER BY price DESC;


type

model

price

Laptop

1750

1200.0

Laptop

1752

1150.0

Laptop

1298

1050.0

PC

1233

980.0

Laptop

1321

970.0

PC

1233

950.0

PC

1121

850.0

Laptop

1298

700.0

PC

1232

600.0

PC

1233

600.0

PC

1232

400.0

PC

1232

350.0

PC

1260

350.0


Пересечение и разность


В стандарте языка SQL имеются предложения оператора SELECT для выполнения операций пересечения и разности запросов. Этими предложениями являются INTERSECT (пересечение) и EXCEPT (разность), которые работают аналогично предложению UNION. В результирующий набор попадают только те строки, которые присутствуют в обоих запросах (INTERSECT) или только те строки первого запроса, которые отсутствуют во втором (EXCEPT).

Однако многие СУБД не поддерживают эти предложения в операторе SELECT. Это справедливо и для MS SQL Server. Поэтому для выполнения операций пересечения и разности могут быть использованы другие средства. Здесь уместно заметить, что один и тот же результат можно получить с помощью различных формулировок оператора SELECT. В случае пересечения и разности можно воспользоваться предикатом существования EXISTS.

Проверка наличия записей. Предикат EXISTS


EXISTS::=

[NOT] EXISTS ()

Предикат EXISTS принимает значение TRUE, если подзапрос возвращает любое количество строк, иначе его значение равно FALSE. Для NOT EXISTS все наоборот. Этот предикат никогда не принимает значение UNKNOWN.

Обычно (как и в нашем случае) предикат EXISTS используется в зависимых подзапросах. Этот вид подзапроса имеет внешнюю ссылку, связанную со значением в основном запросе. Результат подзапроса может зависеть от этого значения и должен оцениваться отдельно для каждой строки запроса, в котором содержится данный подзапрос. Поэтому предикат EXISTS может иметь разные значения для каждой строки основного запроса.

Пример на пересечение. Найти тех производителей ПК-блокнотов, которые производят также и принтеры:


SELECT DISTINCT maker

FROM Product AS Lap_product

Перейти на страницу:

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

C++: базовый курс
C++: базовый курс

В этой книге описаны все основные средства языка С++ - от элементарных понятий до супервозможностей. После рассмотрения основ программирования на C++ (переменных, операторов, инструкций управления, функций, классов и объектов) читатель освоит такие более сложные средства языка, как механизм обработки исключительных ситуаций (исключений), шаблоны, пространства имен, динамическая идентификация типов, стандартная библиотека шаблонов (STL), а также познакомится с расширенным набором ключевых слов, используемым в .NET-программировании. Автор справочника - общепризнанный авторитет в области программирования на языках C и C++, Java и C# - включил в текст своей книги и советы программистам, которые позволят повысить эффективность их работы. Книга рассчитана на широкий круг читателей, желающих изучить язык программирования С++.

Герберт Шилдт

Программирование, программы, базы данных