Ćwiczenia SQL – Zakwaterowanie w Domu Studenta

Struktura bazy danych

-- Tabela z informacjami o studentach CREATE TABLE tStudenci ( ID INT PRIMARY KEY, Nr_albumu INT NOT NULL, Miejsce_zamieszkania VARCHAR(100), Wydzial VARCHAR(100) ); -- Tabela z informacjami o zakwaterowaniach CREATE TABLE tZakwaterowanie ( ID_zakwaterowanie INT PRIMARY KEY, ID_studenta INT, Rok_akad INT, FOREIGN KEY (ID_studenta) REFERENCES tStudenci(ID) ); -- Tabela z informacjami o wpłatach CREATE TABLE tWpłaty ( ID INT, -- identyfikator osoby (studenta) Data_wpłaty DATE, Wpłata CURRENCY, Za_rok_akad INT ); -- Tabela z kosztami zakwaterowania CREATE TABLE tKoszty_zakwaterowania ( ID_historia_opłat AUTOINCREMENT PRIMARY KEY, ID_zakw INT, Od_kiedy DATE, Do_kiedy DATE, Kwota_mies_opłaty CURRENCY, FOREIGN KEY (ID_zakw) REFERENCES tZakwaterowanie(ID_zakwaterowanie) ); -- Tabela z pokojami CREATE TABLE tPokoje ( ID_pokoju INT PRIMARY KEY, Numer_pokoju VARCHAR(10), Pietro INT, Liczba_miejsc INT );

Dane przykładowe

-- Studenci INSERT INTO tStudenci (ID, Nr_albumu, Miejsce_zamieszkania, Wydzial) VALUES (1, 10001, 'Białowieża', 'Mechaniczny'), (2, 10002, 'Kielce', 'Informatyki'), (3, 10003, 'Pińczów', 'Zarządzania'), (4, 10004, 'Opatów', 'Informatyki'), (5, 10005, 'Busko-Zdrój', 'Mechaniczny'); -- Zakwaterowanie INSERT INTO tZakwaterowanie (ID_zakwaterowanie, ID_studenta, Rok_akad) VALUES (1, 1, 2024), (2, 2, 2024), (3, 3, 2024), (4, 4, 2023), (5, 5, 2024); -- Pokoje INSERT INTO tPokoje (ID_pokoju, Numer_pokoju, Pietro, Liczba_miejsc) VALUES (1, '101A', 1, 2), (2, '102B', 1, 3), (3, '201C', 2, 2), (4, '202D', 2, 1); -- Wpłaty INSERT INTO tWpłaty (ID, Data_wpłaty, Wpłata, Za_rok_akad) VALUES (1, '2024-10-05', 350.00, 2024), (1, '2024-11-10', 350.00, 2024), (2, '2024-10-15', 300.00, 2024), (3, '2024-12-01', 320.00, 2024), (4, '2023-09-20', 310.00, 2023), (5, '2024-10-02', 350.00, 2024), (5, '2024-11-05', 350.00, 2024), (5, '2024-12-10', 350.00, 2024); -- Koszty zakwaterowania INSERT INTO tKoszty_zakwaterowania (ID_zakw, Od_kiedy, Do_kiedy, Kwota_mies_opłaty) VALUES (1, '2024-10-01', '2024-10-31', 350.00), (1, '2024-11-01', '2024-11-30', 350.00), (2, '2024-10-01', '2024-10-31', 300.00), (3, '2024-12-01', '2024-12-31', 320.00), (4, '2023-09-01', '2023-09-30', 310.00), (5, '2024-10-01', '2024-10-31', 350.00), (5, '2024-11-01', '2024-11-30', 350.00), (5, '2024-12-01', '2024-12-31', 350.00);

Zadanie 1_1

Utwórz instrukcję SQL o nazwie sql1_1, która wyświetli informację o łącznej kwocie wpłat dokonanych przez każdą osobę za rok akademicki 2016. Należy wyświetlić tylko te osoby, których suma wpłat jest mniejsza niż 1000 zł. Wyniki posortuj malejąco według ID.

SELECT ID, SUM(Wpłata) AS [SUMA WPŁAT] FROM tWpłaty WHERE Za_rok_akad = 2016 GROUP BY ID HAVING SUM(Wpłata) < 1000 ORDER BY ID DESC;

Zadanie 1_2

Utwórz instrukcję SQL do wyliczenia liczby miejsc we wszystkich pokojach Domu Studenta ulokowanych na trzecim oraz piątym piętrze.

SELECT SUM(Liczba_miejsc) AS [LICZBA MIEJSC] FROM tPokoje WHERE Pietro IN (3, 5);

Zadanie 1_3

Utwórz instrukcję SQL do wyliczenia liczby wierszy w tabeli tZakwaterowanie dotyczących zakwaterowania w latach 2014 oraz 2016 osób skierowanych przez Wydział Mechaniczny.

SELECT COUNT(*) FROM tZakwaterowanie WHERE Year(Data_zakwaterowania) IN (2014, 2016) AND Wydział = 'Mechaniczny';

Zadanie 1_4

Utwórz instrukcję SQL do wyliczenia minimalnej wartości wpłat dokonanych w miesiącu kwietniu lub czerwcu.

SELECT MIN(Wpłata) AS [MIN WPŁATA] FROM tWpłaty WHERE Month(Data_wpłaty) IN (4, 6);

Zadanie 1_5

Utwórz instrukcję SQL do wyliczenia liczby studentów zamieszkałych na stałe w Białowieży, którzy mają numery albumu z zakresu <65555; 66000>.

SELECT COUNT(*) AS [LICZBA STUDENTÓW] FROM tStudenci WHERE Miejsce_zamieszkania = 'Białowieża' AND Nr_albumu BETWEEN 65555 AND 66000;

Zadanie 1_6

Utwórz polecenie SQL w celu wyświetlenia sum wszystkich wpłat dokonanych przez studenta o założonym numerze ID za każdy rok akademicki.

SELECT ID, Za_rok_akad, SUM(Wpłata) AS [SUMA] FROM tWpłaty GROUP BY ID, Za_rok_akad;

Zadanie 1_7

Utwórz polecenie SQL w celu wyświetlenia liczby zakwaterowań w Domu Studenta w każdym roku.

SELECT Year(Data_zakwaterowania) AS Rok, COUNT(*) AS Liczba FROM tZakwaterowanie GROUP BY Year(Data_zakwaterowania);

Zadanie 1_8

Utwórz polecenie SQL w celu wyświetlenia informacji ile w sumie jest miejsc do zamieszkania na każdym piętrze Domu Studenta.

SELECT Pietro, SUM(Liczba_miejsc) AS [SUMA MIEJSC] FROM tPokoje GROUP BY Pietro;

Zadanie 1_9

Utwórz polecenie SQL w celu wyświetlenia średniej wartości kwot wpłaconych za zamieszkanie w Domu Studenta dla każdego roku.

SELECT Year(Data_wpłaty) AS Rok, AVG(Wpłata) AS [ŚREDNIA KWOTA] FROM tWpłaty GROUP BY Year(Data_wpłaty);

Zadanie 1_10

Utwórz instrukcję SQL w celu wyświetlenia sumarycznej wartości kwot za zamieszkanie w Domu Studenta wpłaconych w każdym miesiącu 2017 roku. Dane należy pogrupować według miesiąca.

SELECT Month(Data_wpłaty) AS Miesiąc, SUM(Wpłata) AS [SUMA] FROM tWpłaty WHERE Year(Data_wpłaty) = 2017 GROUP BY Month(Data_wpłaty);

Zadanie 2

Utwórz instrukcję SQL o nazwie sql2 w celu wprowadzenia jednego rekordu danych do tabeli tKoszty_zakwaterowania. Pole ID_historia_opłat ma typ Autonumerowanie, więc nie podajemy dla niego wartości. Pole ID_zakw jest kluczem obcym i musi zawierać wartość istniejącą w tabeli tZakwaterowanie.

INSERT INTO tKoszty_zakwaterowania (ID_zakw, Od_kiedy, Do_kiedy, Kwota_mies_opłaty) VALUES (6, #2016-10-01#, #2017-06-30#, 280);

Zadanie 2_1

Utwórz instrukcję SQL o nazwie sql2_1, która wyświetli informacje o studentach, którzy zapłacili więcej niż 300 zł za zakwaterowanie w roku akademickim 2024. Wyświetl imiona i nazwiska studentów, numer albumu oraz sumę wpłat. Posortuj wynik według numeru albumu rosnąco.

SELECT tStudenci.Nr_albumu, tStudenci.Miejsce_zamieszkania, SUM(tWpłaty.Wpłata) AS [SUMA WPŁAT] FROM tStudenci JOIN tWpłaty ON tStudenci.ID = tWpłaty.ID WHERE tWpłaty.Za_rok_akad = 2024 GROUP BY tStudenci.Nr_albumu, tStudenci.Miejsce_zamieszkania HAVING SUM(tWpłaty.Wpłata) > 300 ORDER BY tStudenci.Nr_albumu;

Zadanie 2_2

Utwórz zapytanie SQL, które wyświetli pokoje, które są zajęte przez więcej niż jedną osobę. Wyświetl numer pokoju, piętro oraz liczbę miejsc. Posortuj wynik według numeru pokoju.

SELECT tPokoje.Numer_pokoju, tPokoje.Pietro, tPokoje.Liczba_miejsc FROM tPokoje JOIN tZakwaterowanie ON tPokoje.ID_pokoju = tZakwaterowanie.ID_zakwaterowanie GROUP BY tPokoje.Numer_pokoju, tPokoje.Pietro, tPokoje.Liczba_miejsc HAVING COUNT(tZakwaterowanie.ID_studenta) > 1 ORDER BY tPokoje.Numer_pokoju;

Zadanie 2_3

Stwórz zapytanie SQL, które pokaże studentów, którzy nie zapłacili za zakwaterowanie w roku akademickim 2024. Wyświetl numer albumu oraz imię i nazwisko studenta. Posortuj wynik według numeru albumu.

SELECT tStudenci.Nr_albumu, tStudenci.Miejsce_zamieszkania FROM tStudenci LEFT JOIN tWpłaty ON tStudenci.ID = tWpłaty.ID WHERE tWpłaty.Wpłata IS NULL AND tWpłaty.Za_rok_akad = 2024 ORDER BY tStudenci.Nr_albumu;

Zadanie 2_4

Utwórz zapytanie SQL, które obliczy łączny koszt zakwaterowania dla każdego studenta za cały rok akademicki 2024. Wyświetl numer albumu studenta oraz sumę kosztów. Posortuj wynik według numeru albumu.

SELECT tStudenci.Nr_albumu, SUM(tKoszty_zakwaterowania.Kwota_mies_opłaty) AS [SUMA KOSZTÓW] FROM tStudenci JOIN tZakwaterowanie ON tStudenci.ID = tZakwaterowanie.ID_studenta JOIN tKoszty_zakwaterowania ON tZakwaterowanie.ID_zakwaterowanie = tKoszty_zakwaterowania.ID_zakw WHERE tKoszty_zakwaterowania.Od_kiedy BETWEEN '2024-10-01' AND '2024-12-31' GROUP BY tStudenci.Nr_albumu ORDER BY tStudenci.Nr_albumu;

Zadanie 2_5

Utwórz zapytanie SQL, które wyświetli studentów, którzy zapłacili więcej niż średnia wartość opłat w roku akademickim 2024. Wyświetl numer albumu, imię i nazwisko studenta oraz łączną kwotę wpłat. Posortuj wynik malejąco według łącznej kwoty wpłat.

SELECT tStudenci.Nr_albumu, tStudenci.Miejsce_zamieszkania, SUM(tWpłaty.Wpłata) AS [SUMA WPŁAT] FROM tStudenci JOIN tWpłaty ON tStudenci.ID = tWpłaty.ID WHERE tWpłaty.Za_rok_akad = 2024 GROUP BY tStudenci.Nr_albumu, tStudenci.Miejsce_zamieszkania HAVING SUM(tWpłaty.Wpłata) > ( SELECT AVG(Wpłata) FROM tWpłaty WHERE Za_rok_akad = 2024 ) ORDER BY [SUMA WPŁAT] DESC;

Zadanie 2_6

Utwórz zapytanie SQL, które wyświetli numery pokoi, które były zajmowane przez studentów w roku akademickim 2024, ale nie zapłacili oni za zakwaterowanie. Wyświetl numer pokoju oraz piętro. Posortuj wynik według numeru pokoju.

SELECT tPokoje.Numer_pokoju, tPokoje.Pietro FROM tPokoje JOIN tZakwaterowanie ON tPokoje.ID_pokoju = tZakwaterowanie.ID_zakwaterowanie LEFT JOIN tWpłaty ON tZakwaterowanie.ID_studenta = tWpłaty.ID WHERE tWpłaty.Wpłata IS NULL AND tWpłaty.Za_rok_akad = 2024 ORDER BY tPokoje.Numer_pokoju;

Zadanie 2_7

Stwórz zapytanie SQL, które pokaże studentów, którzy zapłacili za zakwaterowanie w roku akademickim 2024, ale nie zostali zakwaterowani (brak wpisu w tabeli tZakwaterowanie). Wyświetl numer albumu studenta oraz miejsce zamieszkania. Posortuj wynik rosnąco według numeru albumu.

SELECT tStudenci.Nr_albumu, tStudenci.Miejsce_zamieszkania FROM tStudenci JOIN tWpłaty ON tStudenci.ID = tWpłaty.ID LEFT JOIN tZakwaterowanie ON tStudenci.ID = tZakwaterowanie.ID_studenta WHERE tWpłaty.Za_rok_akad = 2024 AND tZakwaterowanie.ID_studenta IS NULL ORDER BY tStudenci.Nr_albumu;

Zadanie 2_8

Utwórz zapytanie SQL, które wyświetli wszystkich studentów, którzy zostali zakwaterowani w pokoju jednoosobowym (Liczba_miejsc = 1) w roku akademickim 2024. Wyświetl numer albumu studenta oraz numer pokoju. Posortuj wynik według numeru pokoju.

SELECT tStudenci.Nr_albumu, tPokoje.Numer_pokoju FROM tStudenci JOIN tZakwaterowanie ON tStudenci.ID = tZakwaterowanie.ID_studenta JOIN tPokoje ON tZakwaterowanie.ID_zakwaterowanie = tPokoje.ID_pokoju WHERE tPokoje.Liczba_miejsc = 1 AND tZakwaterowanie.Rok_akad = 2024 ORDER BY tPokoje.Numer_pokoju;

Zadanie 2_9

Utwórz zapytanie SQL, które wyświetli studentów, którzy zapłacili za zakwaterowanie co najmniej dwa razy w roku akademickim 2024. Wyświetl numer albumu oraz imię i nazwisko studenta. Posortuj wynik według numeru albumu.

SELECT tStudenci.Nr_albumu, tStudenci.Miejsce_zamieszkania FROM tStudenci JOIN tWpłaty ON tStudenci.ID = tWpłaty.ID WHERE tWpłaty.Za_rok_akad = 2024 GROUP BY tStudenci.Nr_albumu, tStudenci.Miejsce_zamieszkania HAVING COUNT(tWpłaty.ID) >= 2 ORDER BY tStudenci.Nr_albumu;

Zadanie 2_10

Utwórz zapytanie SQL, które wyświetli studentów, którzy zapłacili za zakwaterowanie w różnych pokojach (inny pokój na każdy okres). Wyświetl numer albumu studenta oraz numery pokoi, w których byli zakwaterowani. Posortuj wynik według numeru albumu.

SELECT tStudenci.Nr_albumu, GROUP_CONCAT(DISTINCT tPokoje.Numer_pokoju ORDER BY tPokoje.Numer_pokoju) AS Pokoje FROM tStudenci JOIN tZakwaterowanie ON tStudenci.ID = tZakwaterowanie.ID_studenta JOIN tPokoje ON tZakwaterowanie.ID_zakwaterowanie = tPokoje.ID_pokoju JOIN tWpłaty ON tZakwaterowanie.ID_studenta = tWpłaty.ID WHERE tWpłaty.Za_rok_akad = 2024 GROUP BY tStudenci.Nr_albumu HAVING COUNT(DISTINCT tPokoje.Numer_pokoju) > 1 ORDER BY tStudenci.Nr_albumu;

Ćwiczenia SQL - Poziom Średniozaawansowany

Zadanie 2_11

Utwórz zapytanie SQL, które wyświetli listę studentów (ID i Nr_albumu) oraz kwotę wpłat, którzy zapłacili więcej niż średnia wpłat w roku akademickim 2024. Wykorzystaj subzapytanie oraz połączenie tabel.

SELECT s.ID, s.Nr_albumu, SUM(w.Wpłata) AS Suma_wplat FROM tStudenci s JOIN tWpłaty w ON s.ID = w.ID WHERE w.Za_rok_akad = 2024 GROUP BY s.ID HAVING SUM(w.Wpłata) > ( SELECT AVG(Wpłata) FROM tWpłaty WHERE Za_rok_akad = 2024 );

Zadanie 2_12

Utwórz zapytanie SQL, które wyświetli wszystkich studentów, którzy zapłacili mniej niż średnia kwota wpłat w roku akademickim 2024.

SELECT s.ID, s.Nr_albumu, SUM(w.Wpłata) AS Suma_wplat FROM tStudenci s JOIN tWpłaty w ON s.ID = w.ID WHERE w.Za_rok_akad = 2024 GROUP BY s.ID HAVING SUM(w.Wpłata) < ( SELECT AVG(Wpłata) FROM tWpłaty WHERE Za_rok_akad = 2024 );

Zadanie 2_13

Utwórz zapytanie SQL, które obliczy całkowitą sumę wpłat wszystkich studentów w roku akademickim 2024, używając funkcji agregujących.

SELECT SUM(Wpłata) AS Całkowita_wplata FROM tWpłaty WHERE Za_rok_akad = 2024;

Zadanie 2_14

Stwórz procedurę składowaną, która obliczy całkowitą kwotę wpłat dla studenta w danym roku akademickim. Przyjmij jako parametry ID studenta i rok akademicki.

DELIMITER // CREATE PROCEDURE Oblicz_Wplaty(IN studentID INT, IN rok INT) BEGIN SELECT SUM(Wpłata) AS Całkowita_wplata FROM tWpłaty WHERE ID = studentID AND Za_rok_akad = rok; END // DELIMITER ;

Zadanie 2_15

Stwórz zapytanie SQL, które utworzy indeks na kolumnie 'ID' w tabeli 'tWpłaty' w celu optymalizacji zapytań dotyczących tej kolumny.

CREATE INDEX idx_id ON tWpłaty(ID);