Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
49
Добавлен:
02.05.2014
Размер:
50.69 Кб
Скачать

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

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

Соседние файлы в папке Шпоры по базам данных2