Praktyczne wykorzystania zapytania SELECT

Zapytanie SELECT jest jednym z najważniejszych narzędzi w SQL do manipulacji i przetwarzania danych w bazie danych. Dzięki SELECT możemy wydobywać, łączyć, filtrować i agregować informacje z różnych tabel, tworząc cenne raporty i analizy. W tej lekcji omówimy sposób wykorzystania SELECT w połączeniu z funkcjami agregującymi, klauzulą JOIN, warunkami oraz HAVING, a także dodamy sortowanie wyników przy użyciu ORDER BY.

Dropbox

Sortowanie Danych z ORDER BY

Klauzula ORDER BY umożliwia uporządkowanie danych według wybranych kolumn w kolejności rosnącej (domyślnie) lub malejącej. Używamy jej na końcu zapytania SELECT i stosujemy połączenie z ASC lub DESC, aby określić kolejność sortowania.

Przykład:

SELECT Imie, Nazwisko, Wynik
FROM Studenci
ORDER BY Wynik DESC;

Wynik zostanie posortowany malejąco według kolumny Wynik, pokazując najlepsze wyniki na początku.


Tworzenie Tabel

Oto struktura bazy danych, którą będziemy wykorzystywać do ćwiczeń.

-- Tabela Studenci
CREATE TABLE Studenci (
    StudentID INT PRIMARY KEY,
    Imie VARCHAR(30),
    Nazwisko VARCHAR(30),
    RokStudiow INT
);

-- Tabela Pracownicy
CREATE TABLE Pracownicy (
    PracownikID INT PRIMARY KEY,
    Imie VARCHAR(30),
    Nazwisko VARCHAR(30),
    Stanowisko VARCHAR(50),
    DataZatrudnienia DATE
);

-- Tabela Kursy
CREATE TABLE Kursy (
    KodKursu VARCHAR(10) PRIMARY KEY,
    NazwaKursu VARCHAR(100),
    LiczbaGodzin INT,
    PracownikID INT,
    FOREIGN KEY (PracownikID) REFERENCES Pracownicy(PracownikID)
);

-- Tabela Oceny
CREATE TABLE Oceny (
    OcenaID INT PRIMARY KEY,
    StudentID INT,
    KodKursu VARCHAR(10),
    Ocena FLOAT,
    FOREIGN KEY (StudentID) REFERENCES Studenci(StudentID),
    FOREIGN KEY (KodKursu) REFERENCES Kursy(KodKursu)
);

    -- Wstawienia do tabeli Studenci
INSERT INTO Studenci VALUES (1, 'Jan', 'Kowalski', 1);
INSERT INTO Studenci VALUES (2, 'Anna', 'Nowak', 2);
INSERT INTO Studenci VALUES (3, 'Tomasz', 'Wisniewski', 3);
INSERT INTO Studenci VALUES (4, 'Katarzyna', 'Zielinska', 4);
INSERT INTO Studenci VALUES (5, 'Marek', 'Zajac', 2);
INSERT INTO Studenci VALUES (6, 'Paulina', 'Krawczyk', 3);
INSERT INTO Studenci VALUES (7, 'Piotr', 'Lis', 1);
INSERT INTO Studenci VALUES (8, 'Magdalena', 'Bialek', 4);
INSERT INTO Studenci VALUES (9, 'Adrian', 'Nowicki', 3);
INSERT INTO Studenci VALUES (10, 'Julia', 'Mazur', 1);

-- Wstawienia do tabeli Pracownicy
INSERT INTO Pracownicy VALUES (1, 'Adam', 'Kowalski', 'Asystent', '2022-05-10');
INSERT INTO Pracownicy VALUES (2, 'Beata', 'Nowak', 'Wykladowca', '2021-03-15');
INSERT INTO Pracownicy VALUES (3, 'Cezary', 'Wisniewski', 'Asystent', '2019-11-20');
INSERT INTO Pracownicy VALUES (4, 'Daria', 'Zielinska', 'Wykladowca', '2018-09-01');
INSERT INTO Pracownicy VALUES (5, 'Edward', 'Zajac', 'Profesor', '2017-02-22');
INSERT INTO Pracownicy VALUES (6, 'Felicja', 'Krawczyk', 'Doktorant', '2020-07-30');
INSERT INTO Pracownicy VALUES (7, 'Grzegorz', 'Lis', 'Profesor', '2016-12-10');
INSERT INTO Pracownicy VALUES (8, 'Hanna', 'Bialek', 'Doktorant', '2022-01-05');
INSERT INTO Pracownicy VALUES (9, 'Ireneusz', 'Nowicki', 'Wykladowca', '2020-10-01');
INSERT INTO Pracownicy VALUES (10, 'Julia', 'Mazur', 'Asystent', '2021-05-15');

-- Wstawienia do tabeli Kursy (dodano PracownikID, aby połączyć kursy z prowadzącymi)
INSERT INTO Kursy VALUES ('CS101', 'Programowanie', 40, 5);
INSERT INTO Kursy VALUES ('CS102', 'Bazy danych', 30, 2);
INSERT INTO Kursy VALUES ('CS103', 'Statystyka', 35, 4);
INSERT INTO Kursy VALUES ('CS104', 'Sieci komputerowe', 45, 7);
INSERT INTO Kursy VALUES ('CS105', 'Matematyka', 50, 5);
INSERT INTO Kursy VALUES ('CS106', 'Algorytmy', 55, 6);
INSERT INTO Kursy VALUES ('CS107', 'Grafika komputerowa', 25, 9);
INSERT INTO Kursy VALUES ('CS108', 'Sztuczna inteligencja', 40, 10);
INSERT INTO Kursy VALUES ('CS109', 'Inzynieria oprogramowania', 50, 3);
INSERT INTO Kursy VALUES ('CS110', 'Systemy operacyjne', 30, 1);

-- Wstawienia do tabeli Oceny
INSERT INTO Oceny VALUES (1, 1, 'CS101', 4.5);
INSERT INTO Oceny VALUES (2, 1, 'CS102', 3.8);
INSERT INTO Oceny VALUES (3, 2, 'CS101', 5.0);
INSERT INTO Oceny VALUES (4, 2, 'CS103', 4.2);
INSERT INTO Oceny VALUES (5, 3, 'CS104', 2.5);
INSERT INTO Oceny VALUES (6, 4, 'CS102', 3.0);
INSERT INTO Oceny VALUES (7, 5, 'CS105', 4.0);
INSERT INTO Oceny VALUES (8, 6, 'CS106', 4.6);
INSERT INTO Oceny VALUES (9, 7, 'CS107', 3.7);
INSERT INTO Oceny VALUES (10, 8, 'CS108', 5.0);


Ćwiczenia

Ćwiczenie 1: Podstawowe Łączenie Tabel

Zadanie 1: Wyświetl imię, nazwisko i rok studiów studentów, którzy zapisali się na kursy (użyj odpowiedniego JOINA).

Zadanie 2: Wyświetl wszystkie kursy i studentów, którzy na nie uczęszczają, sortując wyniki malejąco według nazwy kursu.


Ćwiczenie 2: LEFT JOIN

Zadanie 1: Wyświetl wszystkich studentów oraz kursy, na które są zapisani (lub NULL dla tych, którzy nie są zapisani na żaden kurs), używając LEFT JOIN.

Zadanie 2: Wyświetl wszystkie kursy oraz przypisanych do nich studentów, w tym kursy bez żadnych uczestników (LEFT JOIN).


Ćwiczenie 3: Grupowanie i Funkcje Agregujące

Zadanie 1: Znajdź średnią ocenę każdego studenta, wyświetl jego imie i nazwisko, skorzystaj z GROUP BY i funkcji AVG().

Zadanie 2: Oblicz liczbę kursów prowadzonych przez poszczególnych pracowników, sortując wyniki malejąco według liczby kursów.


Ćwiczenie 4: Grupowanie z HAVING

Zadanie 1: Wyświetl studentów, którzy mają średnią ocenę powyżej 4, używając HAVING do filtrowania grupy.

Zadanie 2: Znajdź kursy, na których średnia ocena wynosi poniżej 3, również używając HAVING.


Ćwiczenie 5: Filtrowanie z Klauzulą WHERE

Zadanie 1: Pokaż wszystkie oceny z kursu Programowanie dla studentów drugiego roku.

Zadanie 2: Wyświetl pracowników zatrudnionych przed 2021 rokiem na stanowisku Asystent lub Doktorant (możesz użyć nawiasów).


Ćwiczenie 6: Zaawansowane Łączenie i Agregacja

Zadanie 1: Wyświetl średnią ocenę na każdym kursie oraz liczbę studentów, którzy są zpisani na każdy kurs, sortując kursy według średniej oceny malejąco.

Zadanie 2: Znajdź pracowników i studentów powiązanych z danym kursem, a wyniki posortuj według nazwiska pracownika.


Ćwiczenie 7: Łączenie i Filtrowanie z Klauzulą WHERE

Zadanie 1: Wyświetl studentów, którzy zapisali się na kursy prowadzone przez pracowników na stanowisku Profesor, pokazując imię i nazwisko studenta, nazwę kursu oraz nazwisko prowadzącego.

Zadanie 2: Pokaż wszystkich studentów, którzy są na pierwszym lub drugim roku i zapisali się na kursy trwające co najmniej 40 godzin.


Ćwiczenie 8: Zaawansowana Agregacja i Łączenie Tabel

Zadanie 1: Oblicz łączną liczbę godzin wszystkich kursów, na które zapisany jest każdy student, sortując wyniki malejąco według sumy godzin. Wyświetl ID studenta, imię, nazwisko oraz łączną liczbę godzin.

Zadanie 2: Wyświetl liczbę studentów, którzy sa zapisani na kursy, wyświetlając tylko kursy, które miały co najmniej dwóch lub żadnego uczestnika (użyj HAVING i COUNT()).