Poniżej znajduje się struktura tabel oraz dane, na których będziesz pracować. Struktura została zoptymalizowana pod kątem poprawności kluczy obcych (np. powiązanie `tZakwaterowanie` z `tPokoje`).
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, a następnie **SUM()** sumuje wpłaty. Warunek **HAVING** jest niezbędny do filtrowania wyników funkcji agregujących (SUM) po ich obliczeniu.
Oblicz łączną liczbę miejsc (**SUM(Liczba\_miejsc)**) we wszystkich pokojach, które znajdują się na **piętrze 3 lub 5**.
**Wyjaśnienie:** Operator **IN (3, 5)** jest wydajniejszym i bardziej czytelnym sposobem filtrowania po wielu wartościach.
Oblicz liczbę zakwaterowań w tabeli tZakwaterowanie, które dotyczą studentów z **Wydziału Mechanicznego** w roku akademickim **2024**.
**Wyjaśnienie:** Musimy użyć **JOIN**, ponieważ `Wydział` jest w tabeli tStudenci. **COUNT(\*)** zlicza wiersze spełniające oba warunki po połączeniu.
Wyświetl ID studenta, rok akademicki oraz sumę wszystkich wpłat (**SUM(Wpłata)**) dokonanych przez tego studenta w danym roku.
**Wyjaśnienie:** Aby poprawnie pogrupować, należy umieścić w **GROUP BY** obie kolumny, po których chcemy grupować: **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 przypada na każdy unikalny rok akademicki.
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.
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.
**Wyjaśnienie:** Polecenie **INSERT INTO** wstawia nowy rekord. Klucz obcy (ID\_zakw) 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**.
**Wyjaśnienie:** Łączymy **tStudenci (s)** z **tWpłaty (w)**. Grupujemy wyniki po numerze albumu i używamy **HAVING** do filtrowania wyników agregacji.
Wyświetl numer albumu studentów, którzy **nie dokonali żadnej wpłaty** w roku akademickim **2024**. Wykorzystaj **LEFT JOIN** i sprawdź, czy kolumna z prawej strony jest **NULL**.
**Wyjaśnienie:** **LEFT JOIN** zwraca wszystkich studentów. Umieszczając warunek roku w **ON**, zapobiegamy przypadkowemu odrzuceniu rekordów przez klauzulę WHERE. Warunek **WHERE w.StudentID IS NULL** filtruje tylko tych, dla których nie znaleziono żadnej pasującej wpłaty w roku 2024.
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 skalarnego**.
**Wyjaśnienie:** **Subzapytanie** w klauzuli **HAVING** oblicza średnią wpłat dla wszystkich studentów w roku 2024. Zapytanie główne porównuje sumę wpłat każdego studenta z wynikiem tego subzapytania.
Wyświetl numer albumu studentów, którzy zostali zakwaterowani w pokoju jednoosobowym (**Liczba\_miejsc = 1**) w roku akademickim 2024. Użyj połączeń tabel.
**Wyjaśnienie:** Wymagane jest **potrójne połączenie** (Studenci $\rightarrow$ Zakwaterowanie $\rightarrow$ Pokoje), aby połączyć dane osobowe studenta z cechami pokoju, w którym został zakwaterowany.
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:** Po pogrupowaniu studentów, klauzula **HAVING COUNT(w.ID) >= 2** filtruje grupy, pozostawiając tylko tych, dla których znaleziono dwie lub więcej wpłat w danym 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. **HAVING COUNT(DISTINCT p.Numer\_pokoju) > 1** następnie filtruje tylko tych studentów, którzy mają więcej niż jeden unikalny pokój.
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 przechowywana na serwerze i wykonuje zestaw instrukcji. Użycie **DELIMITER //** jest konieczne w MySQL do poprawnego zdefiniowania bloku 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.
**Wyjaśnienie:** Indeks wielokolumnowy jest bardzo efektywny, gdy zapytania często filtrują lub łączą dane używając **obu** kolumn, co jest kluczowe dla optymalizacji. [Image of B-tree index structure]
Utwórz **widok** (VIEW) o nazwie v\_Suma\_Wplat\_2024, który będzie zawierał ID studenta oraz sumę wpłat za rok 2024.
**Wyjaśnienie:** Widok to **wirtualna tabela**, która upraszcza złożone zapytania i zapewnia **warstwę abstrakcji**. Możesz go użyć w innych zapytaniach tak, jak zwykłej tabeli: SELECT * FROM v\_Suma\_Wplat\_2024;
Wyświetl Nr albumu studenta, Wydział oraz Rok zakwaterowania. Pokaż tylko te rekordy, które mają pasujące wpisy w obu tabelach: tStudenci i tZakwaterowanie.
**Wyjaśnienie:** **INNER JOIN** jest domyślnym typem połączenia, który eliminuje rekordy bez pasujących par. W tym przypadku pokazuje tylko studentów, którzy są faktycznie zakwaterowani.
Wyświetl wszystkich studentów (**Nr albumu**) i rok ich zakwaterowania. Jeśli student nie był zakwaterowany, pole z rokiem powinno być **NULL**.
**Wyjaśnienie:** **LEFT JOIN** gwarantuje, że wszystkie rekordy z lewej tabeli (tStudenci) zostaną zwrócone. Jeśli nie ma pasującego zakwaterowania, pola z tabeli tZakwaterowanie są wypełnione wartościami **NULL**.
Oblicz łączny koszt zakwaterowania (**SUM(Kwota\_mies\_oplaty)**) dla każdego studenta w roku 2024. Wyświetl numer albumu i sumę kosztów.
**Wyjaśnienie:** Wymagane jest **potrójne połączenie** (Studenci $\rightarrow$ Zakwaterowanie $\rightarrow$ Koszty) z filtrowaniem po Rok\_akad. **GROUP BY** agreguje koszty na poziomie studenta.
Wyświetl numer pokoju, piętro i liczbę miejsc dla pokoi, które w roku 2024 są zajęte przez **więcej niż jednego studenta**.
**Wyjaśnienie:** Łączymy pokoje z zakwaterowaniem. Klauzula **HAVING COUNT(ID\_studenta) > 1** zlicza studentów zakwaterowanych w tym samym pokoju, filtrując tylko te, które mają więcej niż jednego mieszkańca.