Шпоры по базам данных2 / 1
.doc1 Извлечь все различные пары продуктов, имеющих одинаковую калорийность. Указать коды и названия продуктов, их калорийность. Для продуктов, не имеющих пары, соответствующие значения – Null. Результат упорядочить по калорийности, затем – по названиям.
SELECT A.`pname`, A.`pno`, B.`pname`, B.`pno`, A.`kal`
FROM prod as A
left join prod as B
ON (A.kal = B.kal AND A.pno <> B.pno)
ORDER BY A.kal, A.pname
2 Извлечь блюда, для которых заданы продукты, и продукты, которые используются в блюдах.
Результат должен содержать колонки: «код» (блюда или продукта); «название»; «тип»
(значения – «блюдо» или «продукт»); «использование» (для блюда – число продуктов в этом
блюде, для продукта – число блюд с этим продуктом). Упорядочить по типам,
затем – по названиям.
select bl.bno as `Код`, bl.bname as `Название`, 'блюдо' as `Тип`, count(*) as `Использование`
from bl inner join rec on bl.bno=rec.bno
group by bl.bno
union
select prod.pno as `Код`, prod.pname as `Название`, 'продукт' as `Тип`, count(*) as `Использование`
from prod inner join rec on prod.pno=rec.pno
group by prod.pno
order by Тип , Название
3 Извлечь коды и названия всех блюд, для которых либо вовсе не указаны входящие в него продукты, либо указан всего один продукт, причем такой, что калорийность его ниже 50 ед. Результат упорядочить по названиям блюд.
SELECT bl.`bno` AS 'Код', bl.`bname` AS 'Название'
FROM bl
left join rec ON (bl.`bno` = rec.`bno`)
left join prod ON (rec.`pno` = prod.`pno`)
group by bl.bno
having count(bl.bno)=1 and sum(prod.`kal`) < 60 or isnull(sum(prod.`kal`))
ORDER BY Название
4 Извлечь сведения о блюдах с калорийностью ниже 500 ед.: код, название, количество продуктов, входящих в блюдо. Калорийность блюда рассчитывать как произведение калорийности продукта на количество продукта в блюде, просуммированное по всем продуктам, входящим в блюдо.
SELECT bl.`bno` AS `Код`, bl.`bname` AS `Название`, sum(rec.`kol`) AS `Количество продуктов`
FROM bl
left join rec ON (bl.`bno` = rec.`bno`)
left join prod ON (rec.`pno` = prod.`pno`)
GROUP BY bl.`bno`
HAVING sum(rec.`kol` * prod.`kal`)<500
5 Извлечь статистику уровней калорийности продуктов: уровень калорийности, количество
продуктов, имеющих эту калорийность, количество блюд, содержащих продукты этой
калорийности. Не учитывать продукты, названия которых начинаются на «А», и блюда
категории «Б». Упорядочить по убыванию калорийности.
SELECT prod.`kal`, count(distinct prod.`pno`) AS `Количество продуктов`, count(distinct bl.`bno`) AS `Количество блюд`
FROM prod
INNER JOIN rec ON (prod.`pno` = rec.`pno`)
INNER JOIN bl ON (rec.`bno` = bl.`bno`)
WHERE (
bl.`kat` <> 'B'
AND NOT (prod.`pname` LIKE 'A%')
)
GROUP BY prod.`kal`
ORDER BY prod.`kal` ASC
6 Извлечь сведения о блюдах с калорийностью выше калорийности блюда с кодом «123»: код, название, калорийность. Учитывать только блюда, приготавливаемые более, чем из трех продуктов. Калорийность блюда рассчитывать как произведение калорийности продукта на количество продукта в блюде, просуммированное по всем продуктам, входящим в блюдо.
SELECT bl.`bno`, bl.`bname`, sum(rec.`kol` * prod.`kal`) AS `Калорийность`
FROM bl
INNER JOIN rec ON (bl.`bno` = rec.`bno`)
INNER JOIN prod ON (rec.`pno` = prod.`pno`)
GROUP BY bl.`bno`
HAVING count(*) > 3 AND sum(rec.`kol` * prod.`kal`) >
(
SELECT sum(rec.`kol` * prod.`kal`) AS `Калорийность`
FROM bl
INNER JOIN rec ON (bl.`bno` = rec.`bno`)
INNER JOIN prod ON (rec.`pno` = prod.`pno`)
WHERE bl.`bno` = 'b3'
)
7 Извлечь коды и названия блюд, содержащих в точности все те продукты, которые содержит блюдо «Солянка московская». Отсортировать результат в алфавитном порядке названий блюд.
SELECT DISTINCT x.КодБлюда, НазвБлюда
FROM Рецепт AS x, Блюдо AS y
WHERE x.КодБлюда = y.КодБлюда AND y.НазвБлюда <> 'Солянка московская' AND x.КодПродукта IN
(SELECT КодПродукта
FROM Рецепт AS x, Блюдо AS y
WHERE x.КодБлюда = y.КодБлюда AND y.НазвБлюда = 'Солянка московская')
ORDER BY НазвБлюда ASC
8 Извлечь номера и названия блюд, содержащих в количестве более 100 ед., по крайней мере, все те продукты, которые содержит блюдо «Солянка балтийская». Отсортировать результат в обратном алфавитном порядке названий блюд.
SELECT y.КодБлюда, y.НазвБлюда
FROM Рецепт AS x, Блюдо AS y
WHERE x.КодБлюда = y.КодБлюда AND x.КолПродВБлюде > 100 AND x.КодБлюда NOT IN
(SELECT КодБлюда FROM Рецепт
WHERE КодПродукта <> ALL
(SELECT DISTINCT КодПродукта
FROM Рецепт AS x, Блюдо AS y
WHERE x.КодБлюда = y.КодБлюда AND y.НазвБлюда = 'Солянка балтийская'))
ORDER BY y.НазвБлюда DESC
1 Извлечь все различные пары продуктов, имеющих одинаковую калорийность. Указать коды и названия продуктов, их калорийность. Для продуктов, не имеющих пары, соответствующие значения – Null. Результат упорядочить по калорийности, затем – по названиям.
SELECT A.`pname`, A.`pno`, B.`pname`, B.`pno`, A.`kal`
FROM prod as A
left join prod as B
ON (A.kal = B.kal AND A.pno <> B.pno)
ORDER BY A.kal, A.pname
2 Извлечь блюда, для которых заданы продукты, и продукты, которые используются в блюдах.
Результат должен содержать колонки: «код» (блюда или продукта); «название»; «тип»
(значения – «блюдо» или «продукт»); «использование» (для блюда – число продуктов в этом
блюде, для продукта – число блюд с этим продуктом). Упорядочить по типам,
затем – по названиям.
select bl.bno as `Код`, bl.bname as `Название`, 'блюдо' as `Тип`, count(*) as `Использование`
from bl inner join rec on bl.bno=rec.bno
group by bl.bno
union
select prod.pno as `Код`, prod.pname as `Название`, 'продукт' as `Тип`, count(*) as `Использование`
from prod inner join rec on prod.pno=rec.pno
group by prod.pno
order by Тип , Название
3 Извлечь коды и названия всех блюд, для которых либо вовсе не указаны входящие в него продукты, либо указан всего один продукт, причем такой, что калорийность его ниже 50 ед. Результат упорядочить по названиям блюд.
SELECT bl.`bno` AS 'Код', bl.`bname` AS 'Название'
FROM bl
left join rec ON (bl.`bno` = rec.`bno`)
left join prod ON (rec.`pno` = prod.`pno`)
group by bl.bno
having count(bl.bno)=1 and sum(prod.`kal`) < 60 or isnull(sum(prod.`kal`))
ORDER BY Название
4 Извлечь сведения о блюдах с калорийностью ниже 500 ед.: код, название, количество продуктов, входящих в блюдо. Калорийность блюда рассчитывать как произведение калорийности продукта на количество продукта в блюде, просуммированное по всем продуктам, входящим в блюдо.
SELECT bl.`bno` AS `Код`, bl.`bname` AS `Название`, sum(rec.`kol`) AS `Количество продуктов`
FROM bl
left join rec ON (bl.`bno` = rec.`bno`)
left join prod ON (rec.`pno` = prod.`pno`)
GROUP BY bl.`bno`
HAVING sum(rec.`kol` * prod.`kal`)<500
5 Извлечь статистику уровней калорийности продуктов: уровень калорийности, количество
продуктов, имеющих эту калорийность, количество блюд, содержащих продукты этой
калорийности. Не учитывать продукты, названия которых начинаются на «А», и блюда
категории «Б». Упорядочить по убыванию калорийности.
SELECT prod.`kal`, count(distinct prod.`pno`) AS `Количество продуктов`, count(distinct bl.`bno`) AS `Количество блюд`
FROM prod
INNER JOIN rec ON (prod.`pno` = rec.`pno`)
INNER JOIN bl ON (rec.`bno` = bl.`bno`)
WHERE (
bl.`kat` <> 'B'
AND NOT (prod.`pname` LIKE 'A%')
)
GROUP BY prod.`kal`
ORDER BY prod.`kal` ASC
6 Извлечь сведения о блюдах с калорийностью выше калорийности блюда с кодом «123»: код, название, калорийность. Учитывать только блюда, приготавливаемые более, чем из трех продуктов. Калорийность блюда рассчитывать как произведение калорийности продукта на количество продукта в блюде, просуммированное по всем продуктам, входящим в блюдо.
SELECT bl.`bno`, bl.`bname`, sum(rec.`kol` * prod.`kal`) AS `Калорийность`
FROM bl
INNER JOIN rec ON (bl.`bno` = rec.`bno`)
INNER JOIN prod ON (rec.`pno` = prod.`pno`)
GROUP BY bl.`bno`
HAVING count(*) > 3 AND sum(rec.`kol` * prod.`kal`) >
(
SELECT sum(rec.`kol` * prod.`kal`) AS `Калорийность`
FROM bl
INNER JOIN rec ON (bl.`bno` = rec.`bno`)
INNER JOIN prod ON (rec.`pno` = prod.`pno`)
WHERE bl.`bno` = 'b3'
)
7 Извлечь коды и названия блюд, содержащих в точности все те продукты, которые содержит блюдо «Солянка московская». Отсортировать результат в алфавитном порядке названий блюд.
SELECT DISTINCT x.КодБлюда, НазвБлюда
FROM Рецепт AS x, Блюдо AS y
WHERE x.КодБлюда = y.КодБлюда AND y.НазвБлюда <> 'Солянка московская' AND x.КодПродукта IN
(SELECT КодПродукта
FROM Рецепт AS x, Блюдо AS y
WHERE x.КодБлюда = y.КодБлюда AND y.НазвБлюда = 'Солянка московская')
ORDER BY НазвБлюда ASC
8 Извлечь номера и названия блюд, содержащих в количестве более 100 ед., по крайней мере, все те продукты, которые содержит блюдо «Солянка балтийская». Отсортировать результат в обратном алфавитном порядке названий блюд.
SELECT y.КодБлюда, y.НазвБлюда
FROM Рецепт AS x, Блюдо AS y
WHERE x.КодБлюда = y.КодБлюда AND x.КолПродВБлюде > 100 AND x.КодБлюда NOT IN
(SELECT КодБлюда FROM Рецепт
WHERE КодПродукта <> ALL
(SELECT DISTINCT КодПродукта
FROM Рецепт AS x, Блюдо AS y
WHERE x.КодБлюда = y.КодБлюда AND y.НазвБлюда = 'Солянка балтийская'))
ORDER BY y.НазвБлюда DESC