
Лабораторная работа №4 (SQL)
Объединение таблиц
Для вывода данных в запросе из двух связанных между собой таблиц, необходимо:
-
Указывать в запросе как наименования полей, так и наименования таблиц
-
В предложении WHERE запроса явно указывать условие объединения таблиц.
Пример запроса: Вывести список всех заказчиков и продавцов, проживающих в одинаковых городах
SELECT customer.cname,sales.sname,sales.city
FROM sales,customer
WHERE sales.city=customer.city
В названиях полей используются префиксы - названия таблиц
Условие sales.city = customer.city - условие ОБЪЕДИНЕНИЯ таблиц.
Выбираются только те записи из таблиц, которые удовлетворяют условию объединения,
Пример запроса: Вывести имена всех заказчиков и соответствующие им имена продавцов
SELECT customer.cname,sales.sname
FROM customer,sales
WHERE sales.snum=customer.snum
В таблице заказчиков (customer) ссылки на таблицу продавцов (sales) - по номеру продавца. Поле snum существует в обеих таблицах. Связь таблиц в запросе по этому полю называется связью по ССЫЛОЧНОЙ ЦЕЛОСТНОСТИ. Ссылочная целостность означает, что в подчиненной таблице (customer) не может находиться такой номер snum, которого бы не было в таблице sales
В запросах редко используется объединение таблиц по неравенству, хотя это вполне возможно. Так, запрос
SELECT sname,cname
FROM sales,customer
WHERE sname < cname AND rating < 200
выводит комбинации имен продавцов и заказчиков такие, в которых имя заказчика следовало за именем продавца в алфавитном порядке, а рейтинг заказчика меньше 200. Обратите внимание, что если поля в разных таблицах имеют разные имена, их можно писать без префикса.
Возможно объединение и большего, чем два, числа таблиц.
Пример запроса: Вывести данные о сделках, совершавшихся между продавцами и заказчиками из разных городов
SELECT onum,orders.cnum,orders.snum,customer.city,sales.city
FROM customer,sales,orders
WHERE customer.city <> sales.city
AND orders.cnum = customer.cnum
AND orders.snum = sales.snum
Условий связей между таблицами должно быть на единицу меньшим, чем число таблиц в запросе.
Возможно объединение таблицы с самой собой.
Пример запроса: Вывести все пары заказчиков с одинаковым рейтингом
SELECT first.cname,second.cname,first.rating
FROM customer first,customer second
WHERE first.rating=second.rating
В предложении FROM используются псевдонимы first и second. Псевдонимы определены только на период действия запроса. После его выполнения псевдонимы не существуют. Запрос сравнивает каждую строку таблицы со всеми строками этой же таблицы, поэтому в выводе имеется избыточность. Для устранения избыточности необходимо наложение асимметричности на любое из полей таблицы:
SELECT first.cname,second.cname,first.rating
FROM customer first,customer second
WHERE first.rating=second.rating
AND first.cnum < second.cnum
Задания для самостоятельного выполнения.
-
Вывести таблицу: номер сделки и имя заказчика, совершившего сделку.
-
Для каждой сделки укажите имена заказчиков и продавцов
-
Вывести имя заказчика, имя продавца, процент его комиссионных для продавцов с комиссионными 0,12
-
Вывести список: имя продавца, сумма его комиссионных для сделок, совершенных заказчиками с рейтингом выше 100
-
Вывести все пары продавцов, живущих в одном городе. Дубликаты и совпадения устранить.