Разобрали ответы и решения урока 2.4(База данных «Интернет-магазин книг», запросы на выборку) под курс «Интерактивный тренажер по SQL».
Предыдущий разбор модуля 2.3 следующий разбор модуль 2.5
Установите связи между информационными объектами Жанр и Книга, Город и Клиент, Заказ и Этапы. Выберите верную концептуальную схему.

Сопоставьте фрагменты концептуальной модели с фрагментами логической модели.
В этом задании все просто можно орентироваться на названия таблиц и будет все понятно
Вывести все заказы Баранова Павла (
idзаказа, какие книги, по какой цене и в каком количестве он заказал) в отсортированном по номеру заказа и названиям книг виде.
SELECT buy_book.buy_id, title, price, buy_book.amount
FROM
client
INNER JOIN buy ON client.client_id = buy.client_id
INNER JOIN buy_book ON buy_book.buy_id = buy.buy_id
INNER JOIN book ON buy_book.book_id=book.book_id
WHERE name_client LIKE 'Баранов Павел'
ORDER BY buy_book.buy_id, title; Посчитать, сколько раз была заказана каждая книга, для книги вывести ее автора (нужно посчитать, в каком количестве заказов фигурирует каждая книга). Вывести фамилию и инициалы автора, название книги, последний столбец назвать
Количество. Результат отсортировать сначала по фамилиям авторов, а потом по названиям книг.
SELECT author.name_author, book.title, COUNT(buy_book.book_id) AS Количество
FROM
book
INNER JOIN author ON author.author_id = book.author_id
LEFT JOIN buy_book ON buy_book.book_id = book.book_id
LEFT JOIN buy ON buy.buy_id = buy_book.buy_id
GROUP BY author.name_author, book.title
ORDER BY author.name_author, book.title Вывести города, в которых живут клиенты, оформлявшие заказы в интернет-магазине. Указать количество заказов в каждый город, этот столбец назвать
Количество. Информацию вывести по убыванию количества заказов, а затем в алфавитном порядке по названию городов.
SELECT city.name_city, COUNT(client_id) AS Количество
FROM buy
INNER JOIN client USING (client_id)
INNER JOIN city USING (city_id)
GROUP BY buy.client_id
ORDER BY Количество DESC, name_city; Вывести номера всех оплаченных заказов и даты, когда они были оплачены.
SELECT buy_id, date_step_end
FROM step
INNER JOIN buy_step ON step.step_id = buy_step.step_id
WHERE buy_step.step_id = 1 and date_step_end IS NOT Null; Вывести информацию о каждом заказе: его номер, кто его сформировал (фамилия пользователя) и его стоимость (сумма произведений количества заказанных книг и их цены), в отсортированном по номеру заказа виде. Последний столбец назвать
Стоимость.
SELECT buy_id, name_client, SUM(price * buy_book.amount) as Стоимость
FROM buy
INNER JOIN client using(client_id)
INNER JOIN buy_book using(buy_id)
INNER JOIN book using(book_id)
GROUP BY buy_book.buy_id
ORDER BY 1; Вывести номера заказов (
buy_id) и названия этапов, на которых они в данный момент находятся. Если заказ доставлен – информацию о нем не выводить. Информацию отсортировать по возрастаниюbuy_id.
SELECT buy_id, name_step
FROM buy_step
JOIN step USING(step_id)
WHERE date_step_beg IS NOT NULL and date_step_end IS NULL
ORDER BY buy_id В таблице
cityдля каждого города указано количество дней, за которые заказ может быть доставлен в этот город (рассматривается только этап Транспортировка). Для тех заказов, которые прошли этап транспортировки, вывести количество дней за которое заказ реально доставлен в город. А также, если заказ доставлен с опозданием, указать количество дней задержки, в противном случае вывести 0. В результат включить номер заказа (buy_id), а также вычисляемые столбцыКоличество_днейиОпоздание. Информацию вывести в отсортированном по номеру заказа виде.
SELECT buy_id, DATEDIFF(date_step_end, date_step_beg) AS Количество_дней,
IF(DATEDIFF(date_step_end, date_step_beg)<=days_delivery, 0, DATEDIFF(date_step_end, date_step_beg) - days_delivery) AS Опоздание
FROM buy_step JOIN buy USING(buy_id)
JOIN client USING(client_id)
JOIN city USING(city_id)
WHERE step_id=3 AND DATEDIFF(date_step_end, date_step_beg) IS NOT NULL
ORDER BY 1 Выбрать всех клиентов, которые заказывали книги Достоевского, информацию вывести в отсортированном по алфавиту виде. В решении используйте фамилию автора, а не его
id.
SELECT DISTINCT name_client
FROM client
INNER JOIN buy USING (client_id)
INNER JOIN buy_book USING (buy_id)
INNER JOIN book USING (book_id)
INNER JOIN author USING (author_id)
WHERE name_author LIKE "Достоевский%"
ORDER BY name_client; Вывести жанр (или жанры), в котором было заказано больше всего экземпляров книг, указать это количество. Последний столбец назвать Количество.
SELECT name_genre, SUM(buy_book.amount) as Количество
FROM genre JOIN book USING(genre_id)
JOIN buy_book USING(book_id)
GROUP BY name_genre
limit 1 Сравнить ежемесячную выручку от продажи книг за текущий и предыдущий годы. Для этого вывести год, месяц, сумму выручки в отсортированном сначала по возрастанию месяцев, затем по возрастанию лет виде. Название столбцов:
Год,Месяц,Сумма.
SELECT YEAR(date_payment) AS Год,
MONTHNAME(date_payment) AS Месяц,
SUM(amount*price) AS Сумма
FROM buy_archive
GROUP BY Год, Месяц
UNION ALL
SELECT YEAR(date_step_end) AS Год,
MONTHNAME(date_step_end) AS Месяц,
SUM(bb.amount*price) AS Сумма
FROM buy_book bb
JOIN buy_step bs ON bb.buy_id = bs.buy_id
AND bs.date_step_end
AND bs.step_id = 1
JOIN book USING(book_id)
GROUP BY Год, Месяц
ORDER BY Месяц, Год; Для каждой отдельной книги необходимо вывести информацию о количестве проданных экземпляров и их стоимости за текущий и предыдущий год . Вычисляемые столбцы назвать
КоличествоиСумма. Информацию отсортировать по убыванию стоимости.
WITH Title_sales AS (
SELECT title, buy_book.amount, price
FROM book
INNER JOIN buy_book USING(book_id)
INNER JOIN buy USING(buy_id)
INNER JOIN buy_step USING(buy_id)
INNER JOIN step USING(step_id)
WHERE date_step_end IS NOT Null and name_step = "Оплата"
UNION ALL
SELECT title, buy_archive.amount, buy_archive.price
FROM buy_archive
INNER JOIN book USING(book_id)
)
SELECT title, SUM(amount) AS Количество, SUM(amount*price) AS Сумма
FROM Title_sales
GROUP BY title
ORDER BY Сумма DESC; Если у вас не отображается решение последних задач, значит у вас включен блокировщик рекламы который вырезает эти ответы
Вывести жанр (или жанры), в котором было заказано больше всего экземпляров книг, указать это количество. Последний столбец назвать Количество.
SELECT name_genre, Количество
FROM (
SELECT name_genre, SUM(buy_book.amount) as Количество,
ROW_NUMBER() OVER (ORDER BY SUM(buy_book.amount) DESC) AS row_num
FROM genre
JOIN book USING(genre_id)
JOIN buy_book USING(book_id)
GROUP BY name_genre
) AS subquery
WHERE row_num = 1;
Вывести жанр (или жанры), в котором было заказано больше всего экземпляров книг, указать это количество. Последний столбец назвать Количество.
SELECT name_genre, SUM(buy_book.amount) AS Количество
FROM
genre
INNER JOIN book USING(genre_id)
INNER JOIN buy_book USING(book_id)
GROUP BY name_genre
HAVING SUM(buy_book.amount) =
(/* вычисляем максимальное количество по жанру */
SELECT MAX(sum_amount)
FROM
(/* считаем количество по жанру */
SELECT SUM(buy_book.amount) AS sum_amount
FROM buy_book JOIN book USING(book_id)
GROUP BY genre_id)
query_in
);
Для каждой отдельной книги необходимо вывести информацию о количестве проданных экземпляров и их стоимости за 2020 и 2019 год . Вычисляемые столбцы назвать
КоличествоиСумма. Информацию отсортировать по убыванию стоимости.SELECT title, SUM(Количество) AS Количество, SUM(Сумма) AS Сумма
FROM (SELECT book.title, SUM(buy_book.amount) AS Количество, SUM(book.price*buy_book.amount) AS Сумма
FROM buy_book
INNER JOIN book USING (book_id)
INNER JOIN buy USING(buy_id)
INNER JOIN buy_step USING(buy_id)
INNER JOIN step USING(step_id)
WHERE name_step =’Оплата’ AND date_step_end IS NOT NULL
GROUP BY book.title
UNION ALL
SELECT book.title, SUM(buy_archive.amount) AS Количество, SUM(buy_archive.price*buy_archive.amount) AS Сумма
FROM buy_archive
INNER JOIN book USING (book_id)
GROUP BY book.title) AS qwert
GROUP BY title
ORDER BY Сумма DESC
Вывести жанр (или жанры), в котором было заказано больше всего экземпляров книг, указать это количество. Последний столбец назвать Количество. от этого чет ответ не потходит
Сравнить ежемесячную выручку от продажи книг за текущий и предыдущий годы. Для этого вывести год, месяц, сумму выручки в отсортированном сначала по возрастанию месяцев, затем по возрастанию лет виде. Название столбцов:
Год,Месяц,Сумма:SELECT YEAR(date_payment) Год, MONTHNAME(date_payment) Месяц, SUM(price*amount) Сумма
FROM buy_archive
GROUP BY Год, Месяц
UNION
SELECT YEAR(date_step_beg) Год, MONTHNAME(date_step_beg) Месяц, SUM(book.price*buy_book.amount) Сумма
FROM book
INNER JOIN buy_book USING(book_id)
INNER JOIN buy_step USING(buy_id)
INNER JOIN step USING(step_id)
WHERE name_step=’Оплата’ AND date_step_end IS NOT NULL
GROUP BY Год, Месяц
ORDER BY 2 ASC, 1 ASC