Решенные мной задачи с сайта https://sql-academy.org/ru
Вывести имена всех людей, которые есть в базе данных авиакомпаний. Поля в результирующей таблице: name
SELECT name
FROM Passenger
Вывести названия всеx авиакомпаний. Поля в результирующей таблице: name
SELECT name
FROM Company
Вывести все рейсы, совершенные из Москвы. Поля в результирующей таблице: *
SELECT *
FROM Trip
WHERE town_from = 'Moscow'
Вывести имена людей, которые заканчиваются на "man". Поля в результирующей таблице: name
SELECT name
FROM Passenger
WHERE name LIKE '%man'
Вывести количество рейсов, совершенных на TU-134. Поля в результирующей таблице: count.
Используйте конструкцию "as count" для агрегатной функции подсчета количества рейсов. Это необходимо для корректной проверки.
SELECT COUNT(*) as count
FROM Trip
WHERE plane = 'TU-134'
Какие компании совершали перелеты на Boeing. Поля в результирующей таблице: name
SELECT DISTINCT Company.name
FROM Trip JOIN Company
ON Trip.company = Company.id
WHERE Trip.plane = 'Boeing'
Вывести все названия самолётов, на которых можно улететь в Москву (Moscow). Поля в результирующей таблице: plane
SELECT DISTINCT plane
FROM Trip
WHERE town_to = 'Moscow'
В какие города можно улететь из Парижа (Paris) и сколько времени это займёт? Поля в результирующей таблице: town_to, flight_time
Используйте конструкцию "as flight_time" для вывода необходимого времени. Это необходимо для корректной проверки. Формат для вывода времени: HH:MM:SS
SELECT town_to, TIMEDIFF(time_in, time_out) as flight_time
FROM Trip
WHERE town_from = 'Paris'
Какие компании организуют перелеты из Владивостока (Vladivostok)? Поля в результирующей таблице: name
SELECT DISTINCT Company.name
FROM Trip JOIN Company
ON Trip.company = Company.id
WHERE town_from = 'Vladivostok'
Вывести вылеты, совершенные с 10 ч. по 14 ч. 1 января 1900 г. Поля в результирующей таблице: *
SELECT *
FROM Trip
WHERE time_out BETWEEN '1900-01-01T10:00:00'
AND '1900-01-01T14:00:00'
Вывести пассажиров с самым длинным именем. Поля в результирующей таблице: name
SELECT name
FROM Passenger
WHERE LENGTH(name) = (
SELECT max(LENGTH(name))
FROM Passenger
)
Вывести id и количество пассажиров для всех прошедших полётов. Поля в результирующей таблице: trip, count
SELECT Trip.id as trip, count(*) as count
FROM Trip JOIN Pass_in_trip
ON Trip.id = Pass_in_trip.trip
GROUP BY Trip.id
Вывести имена людей, у которых есть полный тёзка среди пассажиров. Поля в результирующей таблице: name
SELECT name
FROM Passenger
GROUP BY name
HAVING count(*) >= 2
В какие города летал Bruce Willis. Поля в результирующей таблице: town_to
SELECT DISTINCT Trip.town_to
FROM Trip
JOIN Pass_in_trip ON Trip.id = Pass_in_trip.trip)
JOIN Passenger ON Pass_in_trip.passenger = Passenger.id
WHERE Passenger.name = 'Bruce Willis'
Выведите дату и время прилёта пассажира Стив Мартин (Steve Martin) в Лондон (London). Поля в результирующей таблице: time_in
SELECT Trip.time_in
FROM Trip
JOIN Pass_in_trip ON Trip.id = Pass_in_trip.trip)
JOIN Passenger ON Pass_in_trip.passenger = Passenger.id
WHERE Passenger.name = 'Steve Martin'
AND Trip.town_to = 'London'
Вывести отсортированный по количеству перелетов (по убыванию) и имени (по возрастанию) список пассажиров, совершивших хотя бы 1 полет. Поля в результирующей таблице: name, count
SELECT Passenger.name, count(Pass_in_trip.id) as count
FROM Trip
JOIN Pass_in_trip ON Trip.id = Pass_in_trip.trip)
JOIN Passenger ON Pass_in_trip.passenger = Passenger.id
GROUP BY Passenger.name
HAVING count(Pass_in_trip.id) >= 1
ORDER BY count(Pass_in_trip.id) DESC, name
Определить, сколько потратил в 2005 году каждый из членов семьи. В результирующей выборке не выводите тех членов семьи, которые ничего не потратили. Поля в результирующей таблице: member_name, status, costs
SELECT FamilyMembers.member_name,
FamilyMembers.status,
SUM(Payments.amount * Payments.unit_price) as costs
FROM FamilyMembers JOIN Payments
ON member_id = family_member
WHERE YEAR(Payments.date) = 2005
GROUP BY FamilyMembers.member_name, FamilyMembers.status
Узнать, кто старше всех в семьe. Поля в результирующей таблице: member_name
SELECT member_name
FROM FamilyMembers
ORDER BY birthday
LIMIT 1
Определить, кто из членов семьи покупал картошку (potato). Поля в результирующей таблице: status
SELECT DISTINCT status
FROM FamilyMembers
JOIN Payments ON member_id = family_member
JOIN Goods ON good = good_id
WHERE good_name = 'potato'
Сколько и кто из семьи потратил на развлечения (entertainment). Вывести статус в семье, имя, сумму. Поля в результирующей таблице: status, member_name, costs
SELECT status, member_name,
SUM(amount * unit_price) as costs
FROM FamilyMembers
JOIN Payments ON member_id = family_member
JOIN Goods ON good = good_id
JOIN GoodTypes ON type = good_type_id
WHERE good_type_name = 'entertainment'
GROUP BY status, member_name
Определить товары, которые покупали более 1 раза. Поля в результирующей таблице: good_name
SELECT good_name
FROM Payments JOIN Goods ON good = good_id
GROUP BY good_name
HAVING count(*) > 1
Найти имена всех матерей (mother). Поля в результирующей таблице: member_name
SELECT member_name
FROM FamilyMembers
WHERE status = 'mother'
Найдите самый дорогой деликатес (delicacies) и выведите его цену. Поля в результирующей таблице: good_name, unit_price
SELECT good_name, unit_price
FROM Payments JOIN Goods ON good = good_id
WHERE unit_price = (
SELECT MAX(unit_price)
FROM Payments
JOIN Goods ON good = good_id
JOIN GoodTypes ON type = good_type_id
WHERE good_type_name = 'delicacies'
)
Определить кто и сколько потратил в июне 2005. Поля в результирующей таблице: member_name, costs
SELECT member_name, SUM(amount * unit_price) as costs
FROM FamilyMembers JOIN Payments
ON member_id = family_member
WHERE date LIKE '2005-06%'
GROUP BY member_name
Определить, какие товары не покупались в 2005 году. Поля в результирующей таблице: good_name
SELECT DISTINCT good_name
FROM Goods
WHERE good_name NOT IN (
SELECT good_name
FROM Payments
JOIN Goods ON good = good_id
WHERE date LIKE '2005%'
)
Определить группы товаров, которые не приобретались в 2005 году. Поля в результирующей таблице: good_type_name
SELECT DISTINCT good_type_name
FROM GoodTypes
WHERE good_type_name NOT IN (
SELECT DISTINCT good_type_name
FROM Payments
JOIN Goods ON good = good_id
JOIN GoodTypes ON good_type_id = type
WHERE date LIKE '2005%'
)
Определить кто и сколько потратил в июне 2005. Поля в результирующей таблице: member_name, costs
SELECT good_type_name, SUM(amount * unit_price) AS costs
FROM Payments, Goods, GoodTypes
WHERE good = good_id
AND type = good_type_id
AND date LIKE '2005%'
GROUP BY good_type_name
Сколько рейсов совершили авиакомпании из Ростова (Rostov) в Москву (Moscow)? Поля в результирующей таблице: count
SELECT COUNT(*) AS count
FROM Trip
WHERE town_from = 'Rostov'
AND town_to = 'Moscow'
Выведите имена пассажиров улетевших в Москву (Moscow) на самолете TU-134. Поля в результирующей таблице: name
SELECT DISTINCT name
FROM Trip, Pass_in_trip, Passenger
WHERE Trip.id = trip
AND passenger = Passenger.id
AND town_to = 'Moscow'
AND plane = 'TU-134'
Выведите нагруженность (число пассажиров) каждого рейса (trip). Результат вывести в отсортированном виде по убыванию нагруженности. Поля в результирующей таблице: trip, count
SELECT Trip.id AS trip, COUNT(*) AS count
FROM Trip, Pass_in_trip
WHERE Trip.id = Pass_in_trip.trip
GROUP BY Trip.id
ORDER BY count DESC
Вывести всех членов семьи с фамилией Quincey. Поля в результирующей таблице: *
SELECT *
FROM FamilyMembers
WHERE member_name LIKE '%Quincey'
Вывести средний возраст людей (в годах), хранящихся в базе данных. Результат округлите до целого в меньшую сторону. Поля в результирующей таблице: age
SELECT ROUND(AVG(TIMESTAMPDIFF(YEAR, birthday, NOW()))) AS age
FROM FamilyMembers
Найдите среднюю стоимость икры. В базе данных хранятся данные о покупках красной (red caviar) и черной икры (black caviar). Поля в результирующей таблице: cost
SELECT AVG(unit_price) AS cost
FROM Payments, Goods
WHERE good = good_id
AND good_name IN ('red caviar', 'black caviar')
Сколько всего 10-ых классов. Поля в результирующей таблице: count
SELECT COUNT(*) AS count
FROM Class
WHERE name LIKE "10%"
Сколько различных кабинетов школы использовались 2.09.2019 в образовательных целях? Поля в результирующей таблице: count
SELECT COUNT(DISTINCT classroom) AS count
FROM Schedule
WHERE date LIKE "2019-09-02%"
Выведите информацию об обучающихся живущих на улице Пушкина (ul. Pushkina)? Поля в результирующей таблице: *
SELECT *
FROM Student
WHERE address LIKE 'ul. Pushkina%'
Сколько лет самому молодому обучающемуся? Поля в результирующей таблице: year
SELECT TIMESTAMPDIFF(YEAR, MAX(birthday), NOW()) AS year
FROM Student
Сколько Анн (Anna) учится в школе? Поля в результирующей таблице: count
SELECT COUNT(*) AS count
FROM Student
WHERE first_name = 'Anna'
Сколько обучающихся в 10 B классе? Поля в результирующей таблице: count
SELECT COUNT(*) AS count
FROM Class, Student_in_class
WHERE Class.id = Student_in_class.class
AND Class.name = '10 B'
Выведите название предметов, которые преподает Ромашкин П.П. (Romashkin P.P.)? Поля в результирующей таблице: subjects
SELECT DISTINCT Subject.name AS subjects
FROM Teacher, Schedule, Subject
WHERE Teacher.id = Schedule.teacher
AND Schedule.subject = Subject.id
AND Teacher.last_name = 'Romashkin'
Во сколько начинается 4-ый учебный предмет по расписанию? Поля в результирующей таблице: start_pair
SELECT start_pair
FROM Timepair
WHERE id = 4
Сколько времени обучающийся будет находиться в школе, учась со 2-го по 4-ый уч. предмет? Поля в результирующей таблице: time
SELECT TIMEDIFF(
(
SELECT end_pair
FROM Timepair
WHERE id = 4
),
(
SELECT start_pair
FROM Timepair
WHERE id = 2
)
) AS time
Выведите фамилии преподавателей, которые ведут физическую культуру (Physical Culture). Отcортируйте преподавателей по фамилии. Поля в результирующей таблице: last_name
SELECT DISTINCT Teacher.last_name
FROM Teacher, Schedule, Subject
WHERE Teacher.id = Schedule.teacher
AND Schedule.subject = Subject.id
AND Subject.name = 'Physical Culture'
ORDER BY Teacher.last_name
Найдите максимальный возраст (колич. лет) среди обучающихся 10 классов? Поля в результирующей таблице: max_year
SELECT MAX(2022 - YEAR(Student.birthday)) AS max_year
FROM Class, Student_in_class, Student
WHERE Class.id = Student_in_class.class
AND Student_in_class.student = Student.id
AND Class.name LIKE '10%'
Какие кабинеты чаще всего использовались для проведения занятий? Выведите те, которые использовались максимальное количество раз. Поля в результирующей таблице: classroom
WITH t AS (
SELECT classroom,
count(*) AS counts,
max(count(*)) OVER() AS max_counts
FROM Schedule
GROUP BY classroom
ORDER BY counts DESC
)
SELECT classroom
FROM t
WHERE counts = max_counts
В каких классах введет занятия преподаватель "Krauze"? Поля в результирующей таблице: name
SELECT DISTINCT name
FROM Class, Schedule, Teacher
WHERE Class.id = Schedule.class
AND Schedule.teacher = Teacher.id
AND last_name = 'Krauze'
Сколько занятий провел Krauze 30 августа 2019 г.? Поля в результирующей таблице: count
SELECT COUNT(*) AS count
FROM Teacher, Schedule
WHERE Teacher.id = Schedule.teacher
AND Teacher.last_name = 'Krauze'
AND Schedule.date LIKE '2019-08-30%'
Выведите заполненность классов в порядке убывания. Поля в результирующей таблице: name, count
SELECT Class.name, COUNT(Student_in_class.student) as count
FROM Class JOIN Student_in_class
ON Class.id = Student_in_class.class
GROUP BY Class.name
ORDER BY count DESC
Какой процент обучающихся учится в 10 A классе? Поля в результирующей таблице: percent
SELECT (
SELECT COUNT(*)
FROM Class,
Student_in_class,
Student
WHERE Class.id = Student_in_class.class
AND Student_in_class.student = Student.id
AND Class.name = '10 A'
) /(
SELECT COUNT(*)
FROM Student
) * 100 as percent
Какой процент обучающихся родился в 2000 году? Результат округлить до целого в меньшую сторону. Поля в результирующей таблице: percent
SELECT ROUND(
(
SELECT COUNT(*)
FROM Student
WHERE YEAR(birthday) = 2000
) /(
SELECT COUNT(*)
FROM Student
) * 100,
0
) as percent
Добавьте товар с именем "Cheese" и типом "food" в список товаров (Goods).
INSERT INTO Goods (good_id, good_name, type)
SELECT MAX(good_id) + 1,
"Cheese",
(
SELECT DISTINCT type
FROM Goods,
GoodTypes
WHERE good_type_id = type
AND good_type_name = "food"
)
FROM Goods
Добавьте в список типов товаров (GoodTypes) новый тип "auto".
INSERT into GoodTypes (good_type_id, good_type_name)
SELECT MAX(good_type_id) + 1,
'auto'
FROM GoodTypes
Измените имя "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(1) = (
SELECT COUNT(1) as count
FROM Trip as t
GROUP BY company
ORDER BY count
LIMIT 1
)
)
Удалить все перелеты, совершенные из Москвы (Moscow).
DELETE FROM Trip
WHERE town_from = 'Moscow'
Перенести расписание всех занятий на 30 мин. вперед.
UPDATE Timepair
SET start_pair = TIMESTAMPADD(MINUTE, 30, start_pair),
end_pair = TIMESTAMPADD(MINUTE, 30, end_pair)
Добавить отзыв с рейтингом 5 на жилье, находящиеся по адресу "11218, Friel Place, New York", от имени "George Clooney"
INSERT INTO Reviews (id, reservation_id, rating)
VALUES (
(
SELECT MAX(id) + 1
FROM Reviews as r
),
(
SELECT Reservations.id
FROM Users
JOIN Reservations ON Users.id = Reservations.user_id
JOIN Rooms ON Reservations.room_id = Rooms.id
WHERE Rooms.address = "11218, Friel Place, New York"
AND Users.name = "George Clooney"
),
5
)
Вывести пользователей,указавших Белорусский номер телефона ? Телефонный код Белоруссии +375. Поля в результирующей таблице: *
SELECT *
FROM Users
WHERE phone_number LIKE '+375%'
Выведите идентификаторы преподавателей, которые хотя бы один раз за всё время преподавали в каждом из одиннадцатых классов. Поля в результирующей таблице: teacher
SELECT Teacher.id as teacher
FROM Teacher
JOIN Schedule ON Teacher.id = Schedule.teacher
JOIN Class ON Schedule.class = Class.id
WHERE Class.name IN (
SELECT name
FROM Class
WHERE name LIKE "11%"
)
GROUP BY Teacher.id
HAVING COUNT(DISTINCT Class.name) = (
SELECT COUNT(name)
FROM Class
WHERE name LIKE "11%"
)
Выведите список комнат, которые были зарезервированы в течение 12 недели 2020 года. Поля в результирующей таблице: Rooms.*
SELECT DISTINCT Rooms.*
FROM Rooms
JOIN Reservations ON Rooms.id = Reservations.room_id
WHERE DAYOFYEAR(start_date) >= 78
AND DAYOFYEAR(start_date) < 84
Вывести в порядке убывания популярности доменные имена 2-го уровня, используемые пользователями для электронной почты. Полученный результат необходимо дополнительно отсортировать по возрастанию названий доменных имён. Поля в результирующей таблице: domain, count
SELECT SUBSTRING(email, (INSTR(email, "@") + 1)) as domain,
COUNT(1) as count
FROM Users
GROUP BY domain
ORDER BY count DESC, domain
Выведите отсортированный список (по возрастанию) фамилий и имен студентов в виде Фамилия.И. Поля в результирующей таблице: name
SELECT CONCAT(last_name, ".", SUBSTRING(first_name, 1, 1), ".") as name
FROM Student
ORDER BY last_name, first_name
Вывести количество бронирований по каждому месяцу каждого года, в которых было хотя бы 1 бронирование. Результат отсортируйте в порядке возрастания даты бронирования. Поля в результирующей таблице: year, month, amount
SELECT YEAR(start_date) as year,
MONTH(start_date) as month,
COUNT(1) as amount
FROM Reservations
GROUP BY year, month
HAVING amount >= 1
ORDER BY year, month
Необходимо вывести рейтинг для комнат, которые хоть раз арендовали, как среднее значение рейтинга отзывов округленное до целого вниз. Поля в результирующей таблице: room_id, rating
SELECT room_id, FLOOR(SUM(rating) / COUNT(1)) as rating
FROM Reviews JOIN Reservations
ON Reviews.reservation_id = Reservations.id
GROUP BY room_id
Вывести список комнат со всеми удобствами (наличие ТВ, интернета, кухни и кондиционера), а также общее количество дней и сумму за все дни аренды каждой из таких комнат. Поля в результирующей таблице: home_type, address, days, total_fee
SELECT home_type,
address,
COALESCE(SUM(DATEDIFF(end_date, start_date)), 0) as days,
COALESCE(SUM(total), 0) as total_fee
FROM Rooms
LEFT JOIN Reservations ON Reservations.room_id = Rooms.id
WHERE has_tv = 1
AND has_internet = 1
AND has_kitchen = 1
AND has_air_con = 1
GROUP BY home_type, address
Вывести время отлета и время прилета для каждого перелета в формате "ЧЧ:ММ, ДД.ММ - ЧЧ:ММ, ДД.ММ", где часы и минуты с ведущим нулем, а день и месяц без. Поля в результирующей таблице: flight_time
SELECT CONCAT(
DATE_FORMAT(time_out, "%H:%i, %e.%c"),
" - ",
DATE_FORMAT(time_in, "%H:%i, %e.%c")
) as flight_time
FROM Trip
Для каждой комнаты, которую снимали как минимум 1 раз, найдите имя человека, снимавшего ее последний раз, и дату, когда он выехал Поля в результирующей таблице: room_id, name, end_date
SELECT re1.room_id as room_id,
u.name,
re1.end_date
FROM Rooms as r1
JOIN Reservations re1 ON r1.id = re1.room_id
JOIN Users as u ON re1.user_id = u.id
WHERE end_date = (
SELECT MAX(end_date)
FROM Reservations as re2
WHERE re2.room_id = re1.room_id
)
Вывести идентификаторы всех владельцев комнат, что размещены на сервисе бронирования жилья и сумму, которую они заработали. Поля в результирующей таблице: owner_id, total_earn
SELECT owner_id, COALESCE(SUM(total), 0) as total_earn
FROM Rooms LEFT JOIN Reservations
ON Rooms.id = Reservations.room_id
GROUP BY owner_id
Необходимо категоризовать жилье на economy, comfort, premium по цене соответственно <= 100, 100 < цена < 200, >= 200. В качестве результата вывести таблицу с названием категории и количеством жилья, попадающего в данную категорию. Поля в результирующей таблице: category, count
SELECT CASE
WHEN price <= 100 THEN "economy"
WHEN price > 100
AND price < 200 THEN "comfort"
WHEN price >= 200 THEN "premium"
END as category,
COUNT(1) as count
FROM Rooms
GROUP BY category
Найдите какой процент пользователей, зарегистрированных на сервисе бронирования, хоть раз арендовали или сдавали в аренду жилье. Результат округлите до сотых. Поля в результирующей таблице: percent
SELECT ROUND(
(
SELECT COUNT(DISTINCT Users.id)
FROM Users,
Rooms,
Reservations
WHERE Users.id = Reservations.user_id
OR (
Users.id = Rooms.owner_id
AND Rooms.id = Reservations.room_id
)
) / (
SELECT COUNT(1)
FROM Users
) * 100,
2
) as percent
Выведите среднюю стоимость бронирования для комнат, которых бронировали хотя бы один раз. Среднюю стоимость необходимо округлить до целого значения вверх. Поля в результирующей таблице: room_id, avg_price
SELECT room_id,
CEILING(SUM(Reservations.price) / COUNT(1)) as avg_price
FROM Rooms
JOIN Reservations ON Rooms.id = Reservations.room_id
GROUP BY room_id
Выведите id тех комнат, которые арендовали нечетное количество раз. Поля в результирующей таблице: room_id, count
SELECT room_id,
COUNT(1) as count
FROM Rooms
JOIN Reservations ON Rooms.id = Reservations.room_id
GROUP BY room_id
HAVING COUNT(1) %2 = 1