Poniżej znajduje się struktura tabel oraz dane, na których będziesz pracować. Zapoznaj się z nazwami kolumn i ich typami.
Wyświetl ID studenta i łączną sumę wpłat (**SUM(Wpłata)**) za rok akademicki **2024**. Pokaż tylko tych studentów, których łączna suma wpłat jest mniejsza niż 1000 zł. Wyniki posortuj malejąco według ID.
**Wyjaśnienie:** Klauzula **GROUP BY** grupuje wiersze dla każdego studenta, a następnie funkcja **SUM()** sumuje wpłaty. Warunek **HAVING** jest niezbędny do filtrowania wyników funkcji agregujących (SUM) po ich obliczeniu. Zmieniono rok na 2024 (zgodnie z danymi).
Oblicz łączną liczbę miejsc (**SUM(Liczba\_miejsc)**) we wszystkich pokojach, które znajdują się na **piętrze 3 lub 5**. Wyświetl wynik jako LICZBA MIEJSC.
**Wyjaśnienie:** Funkcja **SUM()** oblicza sumę wartości z kolumny. Operator **IN (3, 5)** jest wydajniejszym i bardziej czytelnym sposobem filtrowania, niż użycie Pietro = 3 OR Pietro = 5.
Oblicz liczbę rekordów w tabeli tZakwaterowanie, które dotyczą studentów z **Wydziału Mechanicznego**. Załóż, że filtrujemy po roku akademickim **2024** (zgodnie z danymi).
**Wyjaśnienie:** Musimy użyć **JOIN**, ponieważ Wydział jest w tabeli tStudenci, a informacje o zakwaterowaniu w tZakwaterowanie. **COUNT(\*)** zlicza wiersze spełniające oba warunki: `Wydział` oraz `Rok_akad`.
Wylicz minimalną wartość wpłaty (**MIN(Wpłata)**) dokonaną w miesiącu **kwietniu (4)** lub **czerwcu (6)**. Wyświetl wynik jako MIN WPŁATA.
**Wyjaśnienie:** Funkcja **MONTH()** wyciąga numer miesiąca z kolumny typu `DATE`. Następnie używamy operatora **IN** do przefiltrowania wpłat tylko z tych dwóch miesięcy.
Oblicz liczbę studentów (**COUNT(\*)**) zamieszkałych w **Białowieży**, których numer albumu zawiera się w zakresie **[65555; 66000]**.
**Wyjaśnienie:** Użycie operatora **BETWEEN** jest najczytelniejszym sposobem filtrowania wartości w określonym zakresie, włączając podane granice (równoważne `Nr_albumu >= 65555 AND Nr_albumu <= 66000`).
Wyświetl ID studenta, rok akademicki oraz sumę wszystkich wpłat (**SUM(Wpłata)**) dokonanych przez tego studenta w danym roku.
**Wyjaśnienie:** Aby uzyskać sumę wpłat dla każdego studenta w każdym roku, musimy pogrupować dane jednocześnie po dwóch kolumnach: **StudentID** i **Za\_rok\_akad**.
Wyświetl liczbę zakwaterowań (**COUNT(\*)**) zarejestrowanych w tabeli tZakwaterowanie, grupując wyniki według roku akademickiego (**Rok\_akad**).
**Wyjaśnienie:** Grupowanie po kolumnie **Rok\_akad** pozwala na zliczenie, ile rekordów (zakwaterowań) przypada na każdy unikalny rok akademicki w tabeli.
Wyświetl numer piętra oraz całkowitą liczbę miejsc do zamieszkania (**SUM(Liczba\_miejsc)**) na każdym z pięter Domu Studenta.
**Wyjaśnienie:** Klauzula **GROUP BY Pietro** sumuje miejsca, grupując pokoje po numerze piętra, co jest typowym użyciem funkcji agregującej `SUM()` w połączeniu z grupowaniem.
Oblicz średnią wartość wpłat (**AVG(Wpłata)**) za zamieszkanie dla każdego roku akademickiego (**Za\_rok\_akad**).
**Wyjaśnienie:** Funkcja **AVG()** oblicza średnią. Grupowanie po kolumnie **Za\_rok\_akad** zapewnia, że średnia jest obliczana oddzielnie dla każdego roku, a nie dla wszystkich wpłat łącznie.
Wyświetl sumaryczną wartość wpłat (**SUM(Wpłata)**) pogrupowaną według miesiąca (**MONTH(Data\_wplaty)**) dla wszystkich wpłat dokonanych w roku **2024** (zgodnie z danymi).
**Wyjaśnienie:** Najpierw filtrujemy dane za pomocą **WHERE YEAR()** na rok 2024. Następnie używamy **GROUP BY MONTH()** do agregacji (sumowania) wpłat wewnątrz każdego miesiąca w tym roku.
Wprowadź nowy rekord danych do tabeli tKoszty\_zakwaterowania. Użyj wartości: ID\_zakw = **2** (musi istnieć w tZakwaterowanie), Od\_kiedy = '2025-01-01', Do\_kiedy = '2025-01-31', Kwota\_mies\_opłaty = 300.00. Pamiętaj, że ID\_historia\_opłat jest autonumerowane.
**Wyjaśnienie:** Polecenie **INSERT INTO** wstawia nowy rekord. Wartości dat należy podać w standardowym formacie SQL (YYYY-MM-DD), a klucz obcy (ID\_zakw = 2) musi istnieć w tabeli docelowej (tZakwaterowanie), aby zachować integralność referencyjną.
Wyświetl numer albumu i sumę wpłat (**SUM(Wpłata)**) studentów za rok 2024, których łączna suma wpłat jest **większa niż 350 zł**. Użyj **JOIN** do połączenia danych studentów i wpłat.
**Wyjaśnienie:** Łączymy **tStudenci (s)** z **tWpłaty (w)**. Grupujemy wyniki po numerze albumu i używamy **HAVING** do filtrowania wyników agregacji. W tym przykładzie wynik powinien pokazać studentów o ID 1, 3 i 5.
Wyświetl numer pokoju, piętro i liczbę miejsc dla pokoi, które w danym roku (załóżmy 2024) są zajęte przez **więcej niż jednego studenta**.
**Wyjaśnienie:** Łączymy pokoje z zakwaterowaniem. Grupujemy po identyfikatorze pokoju, a klauzula **HAVING COUNT(ID\_studenta) > 1** zlicza studentów zakwaterowanych w tym samym pokoju. Wg danych powinien być to pokój '101A'.
Wyświetl numer albumu studentów, którzy **nie dokonali żadnej wpłaty** w roku akademickim **2024**. Wykorzystaj **LEFT JOIN**.
**Wyjaśnienie:** **LEFT JOIN** zwraca wszystkie rekordy z lewej tabeli (tStudenci). Warunek **ON... AND w.Za\_rok\_akad = 2024** filtruje połączenie. Kluczowy jest warunek **WHERE w.StudentID IS NULL**, który odfiltrowuje studentów, dla których **nie znaleziono żadnej pasującej wpłaty** w roku 2024.
Oblicz łączny koszt zakwaterowania (**SUM(Kwota\_mies\_oplaty)**) dla każdego studenta, który był zakwaterowany w roku 2024. Wyświetl numer albumu i sumę kosztów.
**Wyjaśnienie:** Wymagane jest **potrójne połączenie** (JOIN) Studenci -> Zakwaterowanie -> Koszty. Filtrowanie po Rok\_akad = 2024 ogranicza dane do właściwego okresu. Następnie **GROUP BY** i **SUM()** agregują koszty na poziomie studenta.
Wyświetl studentów (Nr albumu) i ich łączną wpłatę, jeśli ich łączna wpłata w roku 2024 jest **większa niż średnia wpłat** za ten rok. Użyj **subzapytania**.
**Wyjaśnienie:** **Subzapytanie** w klauzuli **HAVING** oblicza średnią wpłat dla wszystkich studentów w roku 2024. Zapytanie główne grupuje wpłaty studentów i porównuje sumę każdej grupy z wynikiem zwróconym przez subzapytanie.
Wyświetl studentów (Nr albumu), którzy dokonali **co najmniej dwóch wpłat** w roku akademickim 2024. Użyj **COUNT()** i **HAVING**.
**Wyjaśnienie:** Klauzula **HAVING COUNT(w.ID) >= 2** filtruje grupy studentów, pozostawiając tylko tych, dla których znaleziono dwa lub więcej rekordów wpłat w tabeli tWpłaty dla danego roku.
Wyświetl studentów (Nr albumu), którzy zostali zakwaterowani w **różnych pokojach** (różne Numer\_pokoju) w trakcie roku 2024. Wyświetl listę tych pokoi.
**Wyjaśnienie:** Używamy **GROUP\_CONCAT(DISTINCT...)** do zebrania wszystkich unikalnych numerów pokoi dla każdego studenta. **HAVING COUNT(DISTINCT p.Numer\_pokoju) > 1** następnie filtruje tylko tych studentów, którzy mają więcej niż jeden unikalny pokój.
Wyświetl listę studentów (ID i Nr\_albumu) oraz ich łączną kwotę wpłat w roku 2024, jeśli ta kwota jest **wyższa niż średnia wszystkich wpłat** za ten rok. (Powtórzenie z 2\_5, ale z mniejszą ilością kolumn).
**Wyjaśnienie:** Kluczowe jest użycie subzapytania jako wartości porównawczej w klauzuli **HAVING**. Subzapytanie oblicza wartość **skalarną** (pojedynczą) średniej, którą można następnie porównać z każdą pogrupowaną sumą studenta.
Stwórz procedurę składowaną Oblicz\_Wplaty, która przyjmie **ID studenta** i **rok akademicki** jako parametry wejściowe (IN) i wyświetli całkowitą sumę wpłat tego studenta w danym roku.
**Wyjaśnienie:** **Procedura Składowana** (STORED PROCEDURE) jest wstępnie skompilowanym zestawem instrukcji SQL, który jest przechowywany na serwerze. Użycie **DELIMITER //** pozwala definiować blok procedury. Parametry **IN** przekazują wartości do procedury.
Stwórz instrukcję SQL, która utworzy indeks o nazwie idx\_studentID\_rok na kolumnach **StudentID** i **Za\_rok\_akad** w tabeli tWpłaty w celu optymalizacji zapytań o wpłaty w danym roku dla konkretnego studenta.
**Wyjaśnienie:** Indeks wielokolumnowy jest bardzo efektywny, gdy zapytania często filtrują lub łączą dane używając **obu** kolumn (**StudentID** i **Za\_rok\_akad**). Przyspiesza on operacje wyszukiwania, ponieważ baza danych nie musi przeszukiwać całej tabeli.