Решение заданий из тренажера SQL Academy
- Вывести имена всех людей, которые есть в базе данных авиакомпаний (сайт)
Решение
SELECT name
FROM passenger;
- Вывести названия всеx авиакомпаний (сайт)
Решение
SELECT name
FROM Company;
- Вывести все рейсы, совершенные из Москвы (сайт)
Решение
SELECT *
FROM trip
WHERE town_from = 'Moscow';
- Вывести имена людей, которые заканчиваются на "man" (сайт)
Решение
SELECT name
FROM passenger
WHERE name LIKE '%man';
- Вывести количество рейсов, совершенных на TU-134 (сайт)
Решение
SELECT COUNT(*) AS count
FROM trip
WHERE plane = 'TU-134';
- Какие компании совершали перелеты на Boeing (сайт)
Решение
SELECT DISTINCT cp.name
FROM company cp
JOIN trip tr ON cp.id = tr.company
WHERE plane = 'Boeing';
- Вывести все названия самолётов, на которых можно улететь в Москву (Moscow) (сайт)
Решение
SELECT DISTINCT plane
FROM trip
WHERE town_to = 'Moscow';
- В какие города можно улететь из Парижа (Paris) и сколько времени это займёт? (сайт)
Решение
SELECT town_to,
TIMEDIFF(time_in, time_out) AS flight_time
FROM trip
WHERE town_from = 'Paris';
- Какие компании организуют перелеты из Владивостока (Vladivostok)? (сайт)
Решение
SELECT name
FROM trip tr
JOIN company cp ON tr.company = cp.id
WHERE town_from = 'Vladivostok';
- Вывести вылеты, совершенные с 10 ч. по 14 ч. 1 января 1900 г. (сайт)
Решение
SELECT *
FROM trip
WHERE DATE(time_out) = '1900-01-01'
AND TIME_FORMAT(time_out, '%H:%i') >= '10:00'
AND TIME_FORMAT(time_out, '%H:%i') <= '14:00';
- Выведите пассажиров с самым длинным ФИО. Пробелы, дефисы и точки считаются частью имени. (сайт)
Решение
SELECT name
FROM passenger
WHERE LENGTH(name) = (
SELECT MAX(LENGTH(name))
FROM passenger);
- Вывести id и количество пассажиров для всех прошедших полётов (сайт)
Решение
SELECT trip,
COUNT(*) AS count
FROM passenger ps
JOIN Pass_in_trip pt ON ps.id = pt.passenger
GROUP BY trip;
- Вывести имена людей, у которых есть полный тёзка среди пассажиров (сайт)
Решение
SELECT name
FROM passenger
GROUP BY name
HAVING COUNT(*) > 1;
- В какие города летал Bruce Willis (сайт)
Решение
SELECT town_to
FROM passenger ps
JOIN Pass_in_trip pt ON ps.id = pt.passenger
JOIN trip tr ON tr.id = pt.trip
WHERE name = 'Bruce Willis';
- Выведите дату и время прилёта пассажира Стив Мартин (Steve Martin) в Лондон (London) (сайт)
Решение
SELECT time_in
FROM trip tr
JOIN Pass_in_trip pt ON tr.id = pt.trip
JOIN passenger ps ON pt.passenger = ps.id
WHERE name = 'Steve Martin'
AND town_to = 'London';
- Вывести отсортированный по количеству перелетов (по убыванию) и имени (по возрастанию) список пассажиров, совершивших хотя бы 1 полет. (сайт)
Решение
SELECT name,
COUNT(name) AS count
FROM passenger ps
JOIN Pass_in_trip pt ON ps.id = pt.passenger
JOIN trip tr ON pt.trip = tr.id
GROUP BY name
ORDER BY count DESC,
name ASC;
- Определить, сколько потратил в 2005 году каждый из членов семьи. В результирующей выборке не выводите тех членов семьи, которые ничего не потратили. (сайт)
Решение
SELECT member_name,
status,
SUM(unit_price * amount) AS costs
FROM FamilyMembers fm
JOIN Payments ps ON fm.member_id = ps.family_member
WHERE YEAR(DATE) = 2005
GROUP BY member_name,
status;
- Узнать, кто старше всех в семьe (сайт)
Решение
SELECT member_name
FROM FamilyMembers
ORDER BY birthday ASC
LIMIT 1;
- Определить, кто из членов семьи покупал картошку (potato) (сайт)
Решение
SELECT status
FROM FamilyMembers fm
JOIN Payments ps ON fm.member_id = ps.family_member
JOIN Goods gs ON ps.good = gs.good_id
WHERE good_name = 'potato'
GROUP BY status;
- Сколько и кто из семьи потратил на развлечения (entertainment). Вывести статус в семье, имя, сумму (сайт)
Решение
SELECT status,
member_name,
(amount * unit_price) AS costs
FROM FamilyMembers fm
JOIN Payments ps ON fm.member_id = ps.family_member
JOIN Goods gs ON ps.good = gs.good_id
JOIN GoodTypes gt ON gs.type = gt.good_type_id
WHERE good_type_name = 'entertainment';
- Определить товары, которые покупали более 1 раза (сайт)
Решение
SELECT good_name
FROM Goods gs
JOIN Payments ps ON gs.good_id = ps.good
GROUP BY good
HAVING COUNT(*) > 1;
- Найти имена всех матерей (mother) (сайт)
Решение
SELECT member_name
FROM FamilyMembers
WHERE status = 'mother';
- Найдите самый дорогой деликатес (delicacies) и выведите его цену
(сайт)
Решение
SELECT good_name,
unit_price
FROM Goods gs
JOIN GoodTypes gt ON gs.type = gt.good_type_id
JOIN Payments ps ON gs.good_id = ps.good
WHERE good_type_name = 'delicacies'
ORDER BY unit_price DESC
LIMIT 1;
- Определить кто и сколько потратил в июне 2005 (сайт)
Решение
SELECT member_name,
(amount * unit_price) AS costs
FROM FamilyMembers fm
JOIN Payments ps ON fm.member_id = ps.family_member
WHERE YEAR(date) = 2005
AND MONTH(date) = 6;
- Определить, какие товары не покупались в 2005 году (сайт)
Решение
SELECT good_name
FROM Goods
WHERE good_id NOT IN (
SELECT good
FROM Payments
WHERE YEAR(date) = 2005
);
- Определить группы товаров, которые не приобретались в 2005 году (сайт)
Решение
SELECT good_type_name
FROM GoodTypes
WHERE good_type_id NOT IN (
SELECT type
FROM Goods gs
JOIN Payments ps ON gs.good_id = ps.good
WHERE YEAR(date) = 2005
GROUP BY good_id
);
- Узнать, сколько потрачено на каждую из групп товаров в 2005 году. Вывести название группы и сумму (сайт)
Решение
SELECT good_type_name,
SUM(amount * unit_price) AS costs
FROM GoodTypes gt
JOIN Goods gs ON gt.good_type_id = gs.type
JOIN Payments ps ON gs.good_id = ps.good
WHERE YEAR(date) = 2005
GROUP BY good_type_name;
- Сколько рейсов совершили авиакомпании из Ростова (Rostov) в Москву (Moscow) ? (сайт)
Решение
SELECT COUNT(*) AS COUNT
FROM Trip
WHERE town_from = 'Rostov'
AND town_to = 'Moscow';
- Выведите имена пассажиров улетевших в Москву (Moscow) на самолете TU-134 (сайт)
Решение
SELECT name
FROM Passenger ps
JOIN Pass_in_trip pt ON ps.id = pt.passenger
JOIN Trip tr ON pt.trip = tr.id
WHERE plane = 'TU-134'
AND town_to = 'Moscow'
GROUP BY name;
- Выведите нагруженность (число пассажиров) каждого рейса (trip). Результат вывести в отсортированном виде по убыванию нагруженности. (сайт)
Решение
SELECT trip,
COUNT(passenger) AS count
FROM Pass_in_trip
GROUP BY trip
ORDER BY count DESC;
- Вывести всех членов семьи с фамилией Quincey. (сайт)
Решение
SELECT *
FROM FamilyMembers
WHERE member_name LIKE '% Quincey';
- Вывести средний возраст людей (в годах), хранящихся в базе данных. Результат округлите до целого в меньшую сторону. (сайт)
Решение
SELECT FLOOR(
AVG(TIMESTAMPDIFF(YEAR, birthday, CURRENT_TIMESTAMP))
) AS age
FROM FamilyMembers;
- Найдите среднюю стоимость икры. В базе данных хранятся данные о покупках красной (red caviar) и черной икры (black caviar). (сайт)
Решение
SELECT AVG(unit_price) AS cost
FROM Payments ps
JOIN Goods gs ON ps.good = gs.good_id
WHERE good_name = 'red caviar'
OR good_name = 'black caviar';
- Сколько всего 10-ых классов (сайт)
Решение
SELECT COUNT(name) AS count
FROM Class
WHERE name LIKE '10 %';
- Сколько различных кабинетов школы использовались 2.09.2019 в образовательных целях ? (сайт)
Решение
SELECT COUNT(DISTINCT classroom) AS count
FROM Student_in_class sc
JOIN Class cl ON sc.class = cl.id
JOIN Schedule sh ON sh.class = cl.id
WHERE DATE_FORMAT(date, '%e.%m.%Y') = '2.09.2019';
- Выведите информацию об обучающихся живущих на улице Пушкина (ul. Pushkina)? (сайт)
Решение
SELECT *
FROM Student
WHERE address RLIKE 'Pushkina';
- Сколько лет самому молодому обучающемуся ? (сайт)
Решение
SELECT TIMESTAMPDIFF(YEAR, birthday, CURRENT_TIMESTAMP) AS year
FROM Student
ORDER BY year ASC
LIMIT 1;
- Сколько Анн (Anna) учится в школе ? (сайт)
Решение
SELECT COUNT(*) AS count
FROM Student
WHERE first_name = 'Anna';
- Сколько обучающихся в 10 B классе ? (сайт)
Решение
SELECT COUNT(*) AS count
FROM Student_in_class sc
JOIN Class cl ON sc.class = cl.id
WHERE name = '10 B';
- Выведите название предметов, которые преподает Ромашкин П.П. (Romashkin P.P.) ? (сайт)
Решение
SELECT name AS subjects
FROM Subject sj
JOIN Schedule sc ON sj.id = sc.subject
JOIN Teacher tc ON tc.id = sc.teacher
WHERE last_name = 'Romashkin'
AND first_name LIKE 'P%'
AND middle_name LIKE 'P%';
- Во сколько начинается 4-ый учебный предмет по расписанию ? (сайт)
Решение
SELECT start_pair
FROM Timepair
WHERE id = 4;
- Сколько времени обучающийся будет находиться в школе, учась со 2-го по 4-ый уч. предмет? (сайт)
Решение
SELECT TIMEDIFF(MAX(end_pair), MIN(start_pair)) AS time
FROM Timepair
WHERE id BETWEEN 2 AND 4;
- Выведите фамилии преподавателей, которые ведут физическую культуру (Physical Culture). Отсортируйте преподавателей по фамилии в алфавитном порядке. (сайт)
Решение
SELECT last_name
FROM Teacher tc
JOIN Schedule sc ON tc.id = sc.teacher
JOIN Subject sj ON sj.id = sc.subject
WHERE name = 'Physical Culture'
ORDER BY last_name;
- Найдите максимальный возраст (колич. лет) среди обучающихся 10 классов ? (сайт)
Решение
SELECT TIMESTAMPDIFF(YEAR, birthday, CURRENT_TIMESTAMP) AS max_year
FROM Student st
JOIN Student_in_class sc ON sc.student = st.id
JOIN Class cl ON cl.id = sc.class
WHERE name LIKE '10 %'
ORDER BY max_year DESC
LIMIT 1;
- Какие кабинеты чаще всего использовались для проведения занятий? Выведите те, которые использовались максимальное количество раз. (сайт)
Решение
SELECT classroom
FROM Schedule
GROUP BY classroom
HAVING count(classroom) = (
SELECT COUNT(*) AS count
FROM Schedule
GROUP BY classroom
ORDER BY count DESC
LIMIT 1
);
- В каких классах введет занятия преподаватель "Krauze" ? (сайт)
Решение
SELECT name
FROM Schedule sc
JOIN Teacher tc ON tc.id = sc.teacher
JOIN Class cl ON cl.id = sc.class
WHERE last_name = 'Krauze'
GROUP BY name;
- Сколько занятий провел Krauze 30 августа 2019 г.? (сайт)
Решение
SELECT COUNT(*) AS count
FROM Schedule sc
JOIN Teacher tc ON tc.id = sc.teacher
WHERE DATE_FORMAT(date, '%e %M %Y') = '30 August 2019'
AND last_name = 'Krauze';
- Выведите заполненность классов в порядке убывания (сайт)
Решение
SELECT name,
COUNT(student) AS count
FROM Class cl
JOIN Student_in_class sc ON sc.class = cl.id
GROUP BY name
ORDER BY count DESC;
- Какой процент обучающихся учится в "10 A" классе? Выведите ответ в диапазоне от 0 до 100 без округления, например, 96.0201. (сайт)
Решение
SELECT COUNT(*) * 100 / (
SELECT COUNT(*)
FROM Student_in_class
) AS percent
FROM Student_in_class sc
JOIN Class cs ON cs.id = sc.class
WHERE name = '10 A';
- Какой процент обучающихся родился в 2000 году? Результат округлить до целого в меньшую сторону. (сайт)
Решение
SELECT FLOOR(
COUNT(*) * 100 / (
SELECT COUNT(*)
FROM Student_in_class
)
) AS percent
FROM Student_in_class sc
JOIN Student st ON st.id = sc.student
WHERE YEAR(birthday) = 2000;
- Добавьте товар с именем "Cheese" и типом "food" в список товаров (Goods). (сайт)
Решение
INSERT INTO Goods
SET good_id = (
SELECT COUNT(*) + 1
FROM Goods AS gs
),
good_name = 'Cheese',
type = (
SELECT good_type_id
FROM GoodTypes
WHERE good_type_name = 'food'
);
- Добавьте в список типов товаров (GoodTypes) новый тип "auto". (сайт)
Решение
INSERT INTO GoodTypes
SET good_type_id = (
SELECT COUNT(*) + 1
FROM GoodTypes AS gt
),
good_type_name = 'auto';
- Измените имя "Andie Quincey" на новое "Andie Anthony". (сайт)
Решение
UPDATE FamilyMembers
SET member_name = 'Andie Anthony'
WHERE member_name = 'Andie Quincey';
- Удалить всех членов семьи с фамилией "Quincey". (сайт)
Решение
DELETE
FROM FamilyMembers
WHERE member_name LIKE '% Quincey';
- Удалить компании, совершившие наименьшее количество рейсов. (сайт)
Решение
DELETE
FROM company
WHERE id IN (
SELECT company
FROM trip
GROUP BY company
HAVING COUNT(*) = (
SELECT COUNT(*) AS count
FROM trip
GROUP BY company
ORDER BY count
LIMIT 1
)
);
- Удалить все перелеты, совершенные из Москвы (Moscow). (сайт)
Решение
DELETE
FROM trip
WHERE town_from = 'Moscow';
- Перенести расписание всех занятий на 30 мин. вперед. (сайт)
Решение
UPDATE Timepair
SET start_pair = ADDTIME(start_pair, '00:30:00'),
end_pair = ADDTIME(end_pair, '00:30:00');
- Добавить отзыв с рейтингом 5 на жилье, находящиеся по адресу "11218, Friel Place, New York", от имени "George Clooney" (сайт)
Решение
INSERT INTO Reviews
SET id = (
SELECT COUNT(*) + 1
FROM Reviews rw
),
reservation_id = (
SELECT rs.id
FROM Reservations rs
JOIN Rooms rm ON rm.id = rs.room_id
JOIN Users us ON rs.user_id = us.id
WHERE address = '11218, Friel Place, New York'
AND name = 'George Clooney'
),
rating = 5;
- Вывести пользователей,указавших Белорусский номер телефона ? Телефонный код Белоруссии +375. (сайт)
Решение
SELECT *
FROM Users
WHERE phone_number LIKE '+375 %';
- Выведите идентификаторы преподавателей, которые хотя бы один раз за всё время преподавали в каждом из одиннадцатых классов. (сайт)
Решение
SELECT teacher
FROM Schedule sc
JOIN Class cl ON sc.class = cl.id
WHERE name LIKE '11 %'
GROUP BY teacher
HAVING COUNT(DISTINCT name) = 2;
- Выведите список комнат, которые были зарезервированы хотя бы на одни сутки в 12-ую неделю 2020 года. В данной задаче в качестве одной недели примите период из семи дней, первый из которых начинается 1 января 2020 года. Например, первая неделя года — 1–7 января, а третья — 15–21 января. (сайт)
Решение
SELECT Rooms.*
FROM Reservations
JOIN Rooms ON Rooms.id = Reservations.room_id
WHERE WEEK(start_date, 1) = 12
AND YEAR(start_date) = 2020;
- Вывести в порядке убывания популярности доменные имена 2-го уровня, используемые пользователями для электронной почты. Полученный результат необходимо дополнительно отсортировать по возрастанию названий доменных имён. (сайт)
Решение
SELECT SUBSTRING_INDEX(email, '@', -1) AS domain,
COUNT(substring_index(email, '@', -1)) AS count
FROM Users
GROUP BY domain
ORDER BY count DESC,
domain;
- Выведите отсортированный список (по возрастанию) фамилий и имен студентов в виде Фамилия.И. (сайт)
Решение
SELECT CONCAT(last_name, '.', LEFT(first_name, 1), '.') AS name
FROM Student
ORDER BY name;
- Вывести количество бронирований по каждому месяцу каждого года, в которых было хотя бы 1 бронирование. Результат отсортируйте в порядке возрастания даты бронирования. (сайт)
Решение
SELECT YEAR(start_date) AS year,
MONTH(start_date) AS month,
COUNT(*) AS amount
FROM Reservations
GROUP BY YEAR(start_date),
MONTH(start_date)
ORDER BY year,
month;
- Необходимо вывести рейтинг для комнат, которые хоть раз арендовали, как среднее значение рейтинга отзывов округленное до целого вниз. (сайт)
Решение
SELECT room_id,
FLOOR(AVG(rating)) AS rating
FROM Reservations rs
JOIN Reviews rw ON rw.reservation_id = rs.id
GROUP BY room_id;
- Вывести список комнат со всеми удобствами (наличие ТВ, интернета, кухни и кондиционера), а также общее количество дней и сумму за все дни аренды каждой из таких комнат. (сайт)
Решение
SELECT home_type,
address,
IFNULL(SUM(total / rs.price), 0) AS days,
IFNULL(SUM(total), 0) AS total_fee
FROM Rooms rm
LEFT JOIN Reservations rs ON rs.room_id = rm.id
WHERE has_tv = 1
AND has_internet = 1
AND has_kitchen = 1
AND has_air_con = 1
GROUP BY home_type,
address;
- Вывести время отлета и время прилета для каждого перелета в формате "ЧЧ:ММ, ДД.ММ - ЧЧ:ММ, ДД.ММ", где часы и минуты с ведущим нулем, а день и месяц без. (сайт)
Решение
SELECT CONCAT(
DATE_FORMAT(time_out, '%H:%i, %e.%c'),
' - ',
DATE_FORMAT(time_in, '%H:%i, %e.%c')
) AS flight_time
FROM Trip;
- Для каждой комнаты, которую снимали как минимум 1 раз, найдите имя человека, снимавшего ее последний раз, и дату, когда он выехал (сайт)
Решение
SELECT rs.room_id,
name,
date AS end_date
FROM (
SELECT room_id,
MAX(end_date) AS date
FROM Reservations
GROUP BY room_id
) rs
JOIN Reservations rsv ON rs.room_id = rsv.room_id
AND rs.date = rsv.end_date
JOIN Users us ON rsv.user_id = us.id;
- Вывести идентификаторы всех владельцев комнат, что размещены на сервисе бронирования жилья и сумму, которую они заработали (сайт)
Решение
SELECT owner_id,
IFNULL(SUM(total), 0) AS total_earn
FROM Rooms rm
LEFT JOIN Reservations rs ON rm.id = rs.room_id
GROUP BY owner_id;
- Необходимо категоризовать жилье на economy, comfort, premium по цене соответственно <= 100, 100 < цена < 200, >= 200. В качестве результата вывести таблицу с названием категории и количеством жилья, попадающего в данную категорию (сайт)
Решение
SELECT CASE
WHEN price <= 100 THEN 'economy'
WHEN price > 100
AND price < 200 THEN 'comfort'
WHEN price >= 200 THEN 'premium'
END AS category,
COUNT(price) AS count
FROM Rooms
GROUP BY category;
- Найдите какой процент пользователей, зарегистрированных на сервисе бронирования, хоть раз арендовали или сдавали в аренду жилье. Результат округлите до сотых. (сайт)
Решение
SELECT ROUND(
(
SELECT COUNT(*)
FROM (
SELECT DISTINCT owner_id
FROM Rooms rm
JOIN Reservations rs ON rm.id = rs.room_id
UNION
SELECT user_id
FROM Reservations
) active_users
) * 100 / (
SELECT COUNT(*)
FROM Users
),
2
) AS percent;
- Выведите среднюю стоимость бронирования для комнат, которых бронировали хотя бы один раз. Среднюю стоимость необходимо округлить до целого значения вверх. (сайт)
Решение
SELECT room_id,
CEILING(AVG(price)) AS avg_price
FROM Reservations
GROUP BY room_id;
- Выведите id тех комнат, которые арендовали нечетное количество раз (сайт)
Решение
SELECT room_id,
COUNT(*) AS count
FROM Reservations
GROUP BY room_id
HAVING count % 2 != 0;
- Выведите идентификатор и признак наличия интернета в помещении. Если интернет в сдаваемом жилье присутствует, то выведите «YES», иначе «NO». (сайт)
Решение
SELECT id,
IF(has_internet = 1, 'YES', 'NO') AS has_internet
FROM Rooms;
- Выведите фамилию, имя и дату рождения студентов, кто был рожден в мае. (сайт)
Решение
SELECT last_name,
first_name,
birthday
FROM Student
WHERE MONTHNAME(birthday) = 'May';
- Вывести имена всех пользователей сервиса бронирования жилья, а также два признака: является ли пользователь собственником какого-либо жилья (is_owner) и является ли пользователь арендатором (is_tenant). В случае наличия у пользователя признака необходимо вывести в соответствующее поле 1, иначе 0. (сайт)
Решение
SELECT name,
IF(
id IN (
SELECT owner_id
FROM Rooms
),
1,
0
) AS is_owner,
IF(
id IN (
SELECT user_id
FROM Reservations
),
1,
0
) AS is_tenant
FROM Users;
- Создайте представление с именем "People", которое будет содержать список имен (first_name) и фамилий (last_name) всех студентов (Student) и преподавателей(Teacher) (сайт)
Решение
CREATE VIEW People AS
SELECT first_name,
last_name
FROM Student
UNION
SELECT first_name,
last_name
FROM Teacher;
- Выведите всех пользователей с электронной почтой в «hotmail.com» (сайт)
Решение
SELECT *
FROM Users
WHERE email RLIKE '@hotmail.com';
- Выведите поля id, home_type, price у всех комнат из таблицы Rooms. Если комната имеет телевизор и интернет одновременно, то в качестве цены в поле price выведите цену, применив скидку 10% (сайт)
Решение
SELECT id,
home_type,
IF(has_tv AND has_internet, price * 0.9, price) AS price
FROM Rooms;
- Создайте представление «Verified_Users» с полями id, name и email, которое будет показывает только тех пользователей, у которых подтвержден адрес электронной почты. (сайт)
Решение
CREATE VIEW Verified_Users AS
SELECT id, name, email
FROM Users
WHERE email_verified_at IS NOT NULL;