Skip to content

Commit 5297c6a

Browse files
committed
add: 2.3 solutions
1 parent 3aa1118 commit 5297c6a

File tree

1 file changed

+111
-0
lines changed

1 file changed

+111
-0
lines changed
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
/* Для книг, которые уже есть на складе (в таблице book), но по другой цене, чем в поставке (supply),
2+
необходимо в таблице book увеличить количество на значение, указанное в поставке, и пересчитать цену.
3+
А в таблице supply обнулить количество этих книг. Формула для пересчета цены:
4+
5+
price= (book_price * book_amount + supply_price * supply_amount) \ (book_amount + supply_amount) */
6+
UPDATE book b
7+
JOIN author a ON a.author_id = b.author_id
8+
JOIN supply s ON a.name_author = s.author AND b.title = s.title
9+
10+
SET b.amount = b.amount + s.amount,
11+
s.amount = 0,
12+
b.price = (b.price * b.amount + s.price * s.amount) / (b.amount + s.amount)
13+
WHERE b.price <> s.price;
14+
15+
/* Включить новых авторов в таблицу author с помощью запроса на добавление, а затем вывести все данные из таблицы author.
16+
Новыми считаются авторы, которые есть в таблице supply, но нет в таблице author. */
17+
-- 1 variant
18+
INSERT INTO author (name_author)
19+
SELECT s.author
20+
FROM author a
21+
RIGHT JOIN supply s ON a.name_author = s.author
22+
WHERE a.name_author IS NULL;
23+
-- 2 variant
24+
INSERT INTO author (name_author)
25+
SELECT author
26+
FROM supply
27+
WHERE author NOT IN (SELECT name_author FROM author);
28+
29+
/* Добавить новые книги из таблицы supply в таблицу book. Затем вывести для просмотра таблицу book.
30+
См. запросы в лекциях. */
31+
INSERT INTO book(title, author_id, price, amount)
32+
SELECT title, author_id, price, amount
33+
FROM author a
34+
JOIN supply s ON a.name_author = s.author
35+
WHERE s.amount <> 0;
36+
37+
/* Занести для книги «Стихотворения и поэмы» Лермонтова жанр «Поэзия», а для книги «Остров сокровищ» Стивенсона - «Приключения».
38+
(Использовать два запроса). */
39+
UPDATE book
40+
SET genre_id =
41+
(
42+
SELECT genre_id
43+
FROM genre
44+
WHERE name_genre = 'Поэзия'
45+
)
46+
WHERE title = 'Стихотворения и поэмы';
47+
48+
UPDATE book
49+
SET genre_id =
50+
(
51+
SELECT genre_id
52+
FROM genre
53+
WHERE name_genre = 'Приключения'
54+
)
55+
WHERE title = 'Остров сокровищ';
56+
57+
/* Удалить всех авторов и все их книги, общее количество книг которых меньше 20. */
58+
DELETE FROM author
59+
WHERE author_id IN (
60+
SELECT author_id
61+
FROM book
62+
GROUP BY author_id
63+
HAVING SUM(amount) < 20
64+
);
65+
66+
/* Удалить все жанры, к которым относится меньше 4-х книг. В таблице book для этих жанров установить значение Null. */
67+
DELETE FROM genre
68+
WHERE genre_id IN (
69+
SELECT genre_id
70+
FROM book
71+
GROUP BY genre_id
72+
HAVING COUNT(title) < 4
73+
);
74+
/* Удалить все жанры, к которым относится меньше 4-х книг.
75+
В таблице book для этих жанров установить значение Null. */
76+
-- 1 variant
77+
DELETE FROM author
78+
USING author
79+
JOIN book b ON author.author_id = b.author_id
80+
JOIN genre g ON b.genre_id = g.genre_id
81+
WHERE g.name_genre = 'Поэзия';
82+
-- 2 variant
83+
DELETE FROM author
84+
USING author JOIN book USING(author_id)
85+
JOIN genre USING(genre_id)
86+
WHERE name_genre='Поэзия';
87+
88+
/* Произвольное задание.
89+
Нас взломали хакеры. В жанр добавлена новая запись "Страшилки". Теперь этот жанр присвоен всем книгам Достоевского и Булгакова,
90+
книги писателей в таблице supply увеличены на 100 единиц у каждого из указанных авторов. Задание - замоделировать такие изменения в базу данных. */
91+
SELECT * FROM genre;
92+
INSERT INTO genre (name_genre) VALUES ('Страшилка');
93+
SELECT * FROM genre;
94+
SELECT * FROM book;
95+
96+
UPDATE book
97+
SET genre_id = (
98+
SELECT genre_id
99+
FROM genre
100+
WHERE name_genre = 'Страшилка')
101+
WHERE author_id IN (
102+
SELECT author_id
103+
FROM author
104+
WHERE name_author IN ('Достоевский Ф.М.', 'Булгаков М.А.'));
105+
106+
SELECT * FROM book;
107+
SELECT * FROM supply;
108+
109+
UPDATE supply
110+
SET amount = supply.amount + 100
111+
WHERE author IN ('Достоевский Ф.М.', 'Булгаков М.А.');

0 commit comments

Comments
 (0)