Шпоры по базам данных / Шпора по SQL 2
.DOCЗадание 3. Построить SQL-запрос для выборки сведений из БД, содержащей таблицы:
Поставщик (КодПост, НазвПост, Статус, Город) – справочник поставщиков;
Товар (КодТовара, НазвТовара, Вес, Цвет, Город) – справочник товаров;
Поставка (КодПост, КодТовара, Количество) – поставка данным поставщикам данного товара.
БИЛЕТ №37
Извлечь все пары поставщиков из одного города, такие, что статус второго поставщика не меньше статуса первого. Для каждого напарника указать код, название, статус. Для поставщиков не имеющих пары, значения напарника- NULL. Результат упорядочить по названиям поставщиков.
SELECT s.s_no, s.s_name, s.status
FROM s first LEFT JOIN s second ON( first.city=second.city)
WHERE first.status<=second.status
ORDER BY s.s_name
БИЛЕТ №38
Извлечь поставщиков, которые поставляют товары, и товары которые поставляются поставщикам. Результат должен содержать колонки: «код» (поставщика/товара); «название» (поставщика/товара); «тип» (поставщик/товар); «количество» (суммарное число товаров во всех поставках поставщика / товара). Упорядочить по типам, затем – по названиям.
SELECT DISTINER sp.s_no, s.s_name, поставщикютип, SUM(sp.qty)
FROM s INNER JOIN sp ON (s.s_no=sp.s_no)
WHERE count(*)>0
GROUP BY (sp.s_no)
UNION
SELECT p.p_no, p.p_name ‘товар’ AS ‘тип’, SUM
FROM p INNER JOIN sp ON (p.p_no=sp.p_no)
WHERE count(*)>0
GROUP BY sp.p_no
ORDER BY 3.2
БИЛЕТ №39
Извлечь коды и названия поставщиков, которые либо вовсе не поставляют всего один товар, причем из Парижа. Результат упорядочить по названиям.
SELECT sp.s_no, s.s_name
FROM s INNER JOIN sp ON(s.s_no=sp.s_no)
WHERE count(*)=0
UNION
SELECT sp.s_no, s.s_name
FROM s INNER JOIN sp ON (s.s_no=sp.s_no)
WHERE count(*)=1 AND city=’ paris’
GROUP BY sp.s_no
ORDER BY s.s_name
БИЛЕТ №40
Извлечь сведения о поставщиках со средним количеством товаров в поставке выше 200: код, название, количество поставок и суммарное количество поставляемых товаров. Упорядочить по названиям.
SELECT sp.s_no, s.s_name, count(*), SUM(sp.qty)
FROM s INNER JOIN sp ON (s.s_no=sp.s_no)
WHERE AVG(sp.qty)>200
GROUP BY sp.s_no
ORDER BY s.s_name
БИЛЕТ №41
Извлечь статистику поставщиков: статус, город, количество поставщиков с данным статусом из данного города, количество их поставок, суммарное количество поставляемых ими товаров. Упорядочить по статусам, затем – по городам.
SELECT s.status, s.city, count(*), SUM(sp.qty), count(sp.s_no)
FROM s INNER JOIN sp ON (s.s_no=sp.s_no)
GROUP BY s.status, s.city
ORDER BY s.status, s.city
БИЛЕТ №42
Извлечь сведения о товарах, у которых их суммарное количество в поставках поставщиков из Парижа выше, чем суммарное количество товаров, поставляемых поставщиком с кодом «123123»: код, название, суммарное количество.
SELECT sp.p_no, p.p_name, sum(sp.qty)
FROM sp, s, p
WHERE(sp.s_no=s.s_no) AND (sp.p_no=p.p_no) AND(s.city=’Paris’)
GROUP BY sp.p_no, p.p_name
HAVING SUM(sp.qty)>(SELECT SUM(sp.qty)
FROM sp
WHERE sp.s_no=’123123’)
БИЛЕТ № 43
Извлечь коды и названия поставщиков, поставляющих более 100 штук в точности тех товаров, которые поставляет поставщик «Иванов и Ко». отсортировать результат в алфавитном порядке названий.
SELECT s.s_no, s.s_name
FROM s INNER JOIN sp ON (s.s_no=sp.s_no)
WHERE
EXIST(SELECT DISTINCT sp.p_no
FROM sp INNER JOIN s ON (s.s_no=sp.s_no)
WHERE (s.s_name=’ Ivanov’) AND (sp.qty>100)
ORDER BY s.s_name
БИЛЕТ №44
Извлечь коды и названия товаров, которые поставляют в количестве больше 100 штук, по крайней мере, все те поставщики, которые поставляют товар «Шайба». Отсортировать результат в обратном алфавитном порядке названий.
SELECT sp.p_no, p.p_name
FROM p INNER JOIN sp ON (sp.p_no=p.p_no)
WHERE NOT EXIST(SELECT sp.s_no
FROM sp INNER JOIN p ON (…)
WHERE (p.p_name=’SHaiba’) AND
NOT IN (SELECT sp.s_no FROM sp, p
WHERE ((sp.p_no=p.p_no) AND sp.qty>100)
ORDER BY p.p_name DECT
БИЛЕТ №45
Извлечь коды и названия поставщиков, не поставляющих в количестве более 100 штук ни одного товара из тех, которые поставляет поставщик «Иванов и Ко» (предполагается, что это поставщик поставляет хотя бы один товар). Отсортировать результат в обратном порядке кодов.
SELECT s.s_no, s.s_name
FROM s INNER JOIN sp ON(s.s_no=sp.s_no)
WHERE NOT EXIST((SELECT sp.p_no
FROM sp INNER JOIN s ON (…)
WHERE s.s_name=’Ivanov) AND sp.qty>100)
ORDER BY s.s_no DECT