Соединение данных из множества таблиц. Рекомендации по выполнению работы и перечень типовых заданий. Учебно–методическое пособие
.pdf
Пример 23
Показать объединение первого столбца (ID) из таблицы Продажи
(Purchases) и столбцов (ID, Date, ID_Products) из таблицы Покупки
(Stores). База данных Shop (Магазин).
SELECT p."ID"
,current_date AS "Date"
,2 AS "2"
FROM "Purchases" p
UNION
SELECT s."ID"
,s."Date"
,s."ID_Products" FROM "Stores" s;
Рисунок 28 – Результат выполнения скрипта (Пример 23)
Как видно (Рисунок 28), данные Date и 2 преобразованы в соответствующий тип данных (дата и целочисленное значение).
Оператор UNION ALL применяется, как и оператор UNION для соединения данных из нескольких наборов. В отличие от оператора UNION дубликаты строк в данном случае не удаляются.
31
Пример 24
Сравнение работы операторов UNION и UNION ALL на примере
объединения данных из одной таблицы. База данных Shop (Магазин).
SELECT *
FROM "Products" p
UNION
SELECT *
FROM "Products" p;
Рисунок 29 – Результат выполнения оператора UNION
SELECT *
FROM "Products" p
UNION ALL
SELECT *
FROM "Products" p;
32
Рисунок 30 – Результат выполнения оператора UNION ALL
Как видно (Рисунок 30), дубликаты не были удалены, число строк
увеличено вдвое.
Оператор EXEPT
Для оператора Исключение EXEPT, как и для оператора объединение
UNION, от наборов данных требуется, чтобы количество столбцов и домены,
на которых они построены, совпадали. В результирующий набор данных попадают все данные из первого набора данных, которых нет во втором наборе данных.
SELECT
Table1.Field1
,...
,Table1.FieldN FROM Table1
EXEPT SELECT
Table2.Field1
,...
,Table2.FieldN FROM Table2
33
Пример 25
Какие продукты поставляет первый продавец, но не поставляет второй?
База данных Shop (Магазин).
SELECT p."ID_Products"
FROM "Purchases" p
WHERE "ID_Vendors" = 1
EXCEPT
SELECT p."ID_Products"
FROM "Purchases" p
WHERE "ID_Vendors" = 2;
Рисунок 31 – Результат выполнения оператора EXEPT
Действительно, поставщик с номером 1 поставляет продукты с номерами
2, 3, 4, 5, а поставщик с номером 2 – продукты с номерами 1, 3. Т. е. продукты с номерами 2, 4, 5 поставляется только первым продавцом.
Оператор INTERSECT
Оператор пересечение требует от наборов данных, чтобы количество столбцов и домены, на которых они построены, совпадали. В результирующий набор попадут данные, которые есть и в первом наборе, и во втором.
34
Пример 26
Какие продукты поставляются продавцом с номером 1 и продавцом с номером 2? База данных Shop (Магазин).
SELECT p."ID_Products"
FROM "Purchases" p
WHERE "ID_Vendors" = 1
INTERSECT
SELECT p."ID_Products"
FROM "Purchases" p
WHERE "ID_Vendors" = 2;
Рисунок 32 – Результат выполнения оператора INTERSECT
Действительно, продукт с номером 3 поставляются обоими поставщиками.
Ограничение результирующего набора данных.
Операторы LIMIT и OFFSET
Чтобы ограничить результирующий набор данных используются операторы LIMIT и OFFSET.
При использовании оператора LIMIT N выведутся первые N строк результирующего набора, при использовании оператора LIMIT N с
оператором ORDER BY выведутся первые N строк в отсортированном наборе данных.
При использовании оператора OFFSET пропускаются первые N строк
результирующего набора.
SELECT N Field1, ...FieldN
FROM Table1
LIMIT N;
35
Пример 27
Показать первые 5 строк таблицы продуктов (Purchases). База данных
Shop (Магазин).
SELECT p."ID_Products"
FROM "Purchases" p
LIMIT 5;
Рисунок 33 – Результат выполнения запроса с оператором TOP
Пример 28
Показать первые 5 строк таблицы продуктов (Purchases), таблицу
отсортировать по идентификационному номеру (первому столбцу).
SELECT p."ID_Products" FROM "Purchases" p ORDER BY p."ID_Products"
LIMIT 5;
Рисунок 34 – Результат выполнения запроса
с оператором LIMIT и ORDER BY
36
SELECT Field1
,...
,FieldN FROM Table OFFSET N;
Пример 29
Показать все товары из таблицы Purchases. Пропустить первые две
строки.
SELECT p."ID_Products" FROM "Purchases" p ORDER BY p."ID_Products"
OFFSET 2;
В результате выполнения данного запроса будет пропущено две строки.
Рисунок 35 – Результат выполнения запроса
с оператором OFFSET
37
Задание на лабораторную работу
1Вариант
1.Показать адреса электронной почты (EmailAddress) и поля
PersonType, FirstName, LastName из таблиц Person.Person,
Person.EmailAddress.
2.Показать список продуктов (поле Name), в котором указано, есть ли у продукта действительная цена (ActualCost) или нет, из таблиц
Production.Product, Production.WorkOrderRouting,
используя LEFT OUTER JOIN.
3.Показать список продуктов (поле Name), в котором указано, есть ли
упродукта подкатегория или нет, из таблиц
Production.ProductSubcategory, Production.Product,
используя RIGHT OUTER JOIN.
4.Показать список подкатегорий продуктов
(ProductSubcategoryID), которые имеют несколько нормативных цен (StandardCost), из таблицы
Production.Product, используя SELF JOIN.
5.Показать список нормативных цен (StandardCost), которые имеют несколько подкатегорий продуктов
(ProductSubcategoryID), из таблицы Production.Product,
используя SELF JOIN.
6.Показать список типов спецпредложений (Type), которые имеют несколько значений минимального количества (MinQty) не меньше
15, из таблицы Sales.SpecialOffer, используя SELF JOIN.
7.Показать комбинированный список таблиц
Person.BusinessEntityAddress,
Person.BusinessEntityContact, используя UNION.
38
8.Показать список BusinessEntityID, которые содержатся в таблице Sales.SalesPerson, но не содержатся в таблице
Sales.Store.
9.Ограничить результирующий набор, полученный в п.8.
10.Пропустить 15 строк из результирующего набора, полученного в п.9.
2Вариант
1.Показать номера телефонов (PhoneNumber) и поля PersonType,
FirstName, LastName из таблиц Person.Person,
Person.PersonPhone.
2.Показать список продуктов (поле Name), в котором указано, есть ли
упродукта название модели или нет, из таблиц
Production.ProductionModel, Production.Product,
используя LEFT OUTER JOIN.
3.Показать список ID людей (поле BusinessEntityId), в котором указано, работает ли человек в магазине или нет, из таблиц
Sales.Store, Person.BusinessEntity, используя RIGHT OUTER JOIN.
4.Показать список продуктов (ProductID), которые содержатся на нескольких складах (LocationID), из таблицы
Production.ProductInventory, используя SELF JOIN.
5.Показать список складов (LocationID), на которых содержатся несколько продуктов (ProductID), из таблицы
Production.ProductInventory, используя SELF JOIN.
6.Показать список продуктов из таблицы Production.Product с
таким же цветом как у продукта «ML Road Frame–W – Yellow, 38», используя SELF JOIN.
39
7.Показать комбинированный список таблиц Person.AddressType,
Person.ContactType по полям ID, Name, ModifiedDate,
используя UNION.
8.Показать список ID, которые содержатся в таблице Sales.Store
(поле BusinessEntityID), но не содержатся в таблице
Sales.Customer (поле CustomerID).
9.Ограничить результирующий набор, полученный в п.8.
10.Пропустить 15 строк из результирующего набора, полученного в п.9.
3Вариант
1.Показать должности (JobTitle) и поля PersonType, FirstName,
LastName из таблиц Person.Person,
HumanResources.Employee.
2.Показать список товаров (поле Name), в котором указано, есть ли у них количество в корзине покупателя или нет, из таблиц
Production.Product, Sales.ShoppingCartItem, используя
LEFT OUTER JOIN.
3.Показать список товаров (поле Name), в котором указан, есть ли у товара количество в запасе (поле Quantity) или нет, из таблицы
Production.ProductInventory, Production.Product,
используя RIGHT OUTER JOIN.
4.Показать список продуктов (ProductID), которые имеют несколько цен за штуку (UnitPrice), из таблицы
Purchasing.PurchaseOrderDetail, используя SELF JOIN.
5.Показать список цен за штуку (UnitPrice), к которым относятся несколько продуктов (ProductID), из таблицы
Purchasing.PurchaseOrderDetail, используя SELF JOIN.
40
