![](/user_photo/2706_HbeT2.jpg)
- •Оглавление Извлечение данных. Оператор select
- •Оператор select
- •Предикаты (часть I)
- •Предикаты сравнения
- •Предикат between
- •Предикат in
- •Переименование столбцов и вычисления в результирующем наборе
- •Предикаты (часть 2) Предикат like
- •Использование значения null в условиях поиска Предикат is [not] null
- •Получение итоговых значений
- •Предложение group by
- •Предложение having
- •Использование в запросе нескольких источников записей
- •Явные операции соединения
- •Традиционные операции над множествами и оператор select
- •Декартово произведение
- •Объединение
- •Пересечение и разность
- •Предикат exists
- •Использование ключевых слов some | any и all с предикатами сравнения
- •Еще о подзапросах
- •Преобразование типов
- •Оператор case
- •Функции Transact-sql для обработки даты/времени
- •Функция dateadd
- •Функция datediff
- •Функция datepart
- •Функция datename
- •Функции работы со строками в ms sql server 2005
- •Функция substring
- •Функция reverse
- •Функция replace
- •Функции ltrim и rtrim
- •Функции lower и upper
- •Функция unicode
- •Функция nchar
- •Операторы модификации данных
- •Оператор insert
- •Вставка строк в таблицу, содержащую автоинкрементируемое поле
- •Оператор update
- •Оператор delete
- •Приложение 1. Описание учебных баз данных
- •1. Компьютерная фирма
- •2. Фирма вторсырья
- •3. Корабли
- •4. Аэрофлот
- •5. Окраска
- •Приложение 2. Список упражнений (select)
- •Как объединить данные из двух столбцов в один без использования union и join?
- •1. Union all
- •2. Full join
- •3. Unpivot
- •Комментарии
- •Как добавить новый столбец в таблицу между существующими столбцами?
- •Как вывести по n строк из каждой группы?
- •"Классическое" решение
- •1. Соединение
- •2. Подзапрос в предложении select
- •Решение на основе ранжирующих функций
- •Как удалить дубликаты строк из таблицы?
- •1. Нумерация строк
- •2. Ранжирование строк внутри групп дубликатов
- •3. Удаление дубликатов из виртуальной таблицы
- •Как удалить дубликаты строк при наличии первичного ключа?
- •Id name
- •Id_pk color
- •Id name color
- •Обновление таблицы t_details
- •Id_pk name color dup min_id
- •Id_pk color
- •Id name
- •Id_pk color
Традиционные операции над множествами и оператор select
Традиционные операции над множествами - это объединение, пересечение, разность и декартово произведение.
Декартово произведение
Ранее мы уже рассмотрели реализацию декартова произведения, перечисляя через запятую табличные выражения в предложении FROM (таблицы, представления, подзапросы). Кроме того, можно использовать еще одну явную операцию соединения:
SELECT Laptop.model, Product.model FROM Laptop CROSS JOIN Product; |
Напомним, что при декартовом произведении каждая строка из одной таблицы соединяется с каждой строкой второй таблицы. В результате количество строк результирующего набора равно произведению количества строк операндов декартова произведения. В нашем примере таблица Laptop содержит 5 строк, а таблица Product - 16. В результате получается 5*16 = 80 строк. Поэтому мы не приводим здесь результат выполнения этого запроса. Вы можете сами проверить это утверждение, выполнив приведенный выше запрос на учебной базе данных.
В чистом виде декартово произведение практически не используется. Оно, как правило, является промежуточным результатом выполнения операции горизонтальной проекции (выборки) при наличии в операторе SELECT предложения WHERE.
Объединение
Для объединения запросов используется служебное слово UNION:
<запрос 1> UNION [ALL] <запрос 2>
Оператор 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 |