Łączenie tabel klauzulą JOIN

W SQL łączenie tabel pozwala na uzyskanie informacji z wielu tabel w jednym zapytaniu. Istnieje kilka rodzajów operacji JOIN, z których najczęściej używane to INNER JOIN, LEFT JOIN, RIGHT JOIN, oraz FULL JOIN. Każdy z tych JOIN-ów działa nieco inaczej, umożliwiając uzyskanie odpowiednich wyników w zależności od relacji między danymi w tabelach.

1. INNER JOIN

INNER JOIN zwraca rekordy, które mają pasujące wartości w obu tabelach. Innymi słowy, zwraca tylko te wiersze, które mają odpowiednie dopasowanie w obu tabelach.

Przykład:

SELECT Studenci.Imie, Studenci.Nazwisko, Kursy.NazwaKursu
FROM Studenci
INNER JOIN Oceny ON Studenci.ID = Oceny.StudentID
INNER JOIN Kursy ON Oceny.KodKursu = Kursy.KodKursu;

W tym przykładzie zwrócone zostaną dane tylko dla studentów, którzy mają przypisane oceny w kursach.

2. LEFT JOIN (lub LEFT OUTER JOIN)

LEFT JOIN zwraca wszystkie rekordy z lewej tabeli oraz odpowiadające im rekordy z prawej tabeli. Jeśli nie ma dopasowania w prawej tabeli, kolumny z prawej tabeli zostaną wypełnione wartością NULL.

Przykład:

SELECT Studenci.Imie, Studenci.Nazwisko, Kursy.NazwaKursu
FROM Studenci
LEFT JOIN Oceny ON Studenci.ID = Oceny.StudentID
LEFT JOIN Kursy ON Oceny.KodKursu = Kursy.KodKursu;

Tutaj zwrócimy wszystkie rekordy studentów, nawet jeśli nie mają przypisanych ocen, a kolumny kursów zostaną wypełnione wartością NULL, jeśli brakuje danych.

3. RIGHT JOIN (lub RIGHT OUTER JOIN)

RIGHT JOIN zwraca wszystkie rekordy z prawej tabeli oraz odpowiadające im rekordy z lewej tabeli. Jeśli nie ma dopasowania w lewej tabeli, kolumny z lewej tabeli zostaną wypełnione wartością NULL.

Przykład:

SELECT Studenci.Imie, Studenci.Nazwisko, Kursy.NazwaKursu
FROM Studenci
RIGHT JOIN Oceny ON Studenci.ID = Oceny.StudentID
RIGHT JOIN Kursy ON Oceny.KodKursu = Kursy.KodKursu;

Ten przykład zwróci wszystkie rekordy z tabeli kursów, nawet jeśli nie ma odpowiadających studentów.


Tworzenie i Wypełnianie Tabel

Zanim przystąpimy do ćwiczeń, poniżej znajdują się zapytania SQL do stworzenia i wypełnienia tabel, które będziemy wykorzystywać:

CREATE TABLE Studenci (
    ID INT PRIMARY KEY,
    Imie VARCHAR(50),
    Nazwisko VARCHAR(50)
);

INSERT INTO Studenci (ID, Imie, Nazwisko) VALUES
(1, 'Anna', 'Kowalska'),
(2, 'Jan', 'Nowak'),
(3, 'Piotr', 'Zielinski'),
(4, 'Magda', 'Wisniewska'),
(5, 'Tomasz', 'Lewandowski'),
(6, 'Katarzyna', 'Mazur'),
(7, 'Adam', 'Szymanski'),
(8, 'Ewa', 'Lis'),
(9, 'Grzegorz', 'Baran'),
(10, 'Pawel', 'Wolski'),
(11, 'Michal', 'Nowicki'),
(12, 'Zofia', 'Kowalska'),
(13, 'Lukasz', 'Kaczmarek'),
(14, 'Joanna', 'Sikora'),
(15, 'Krzysztof', 'Wozniak');

CREATE TABLE Kursy (
    KodKursu VARCHAR(10) PRIMARY KEY,
    NazwaKursu VARCHAR(100),
    LiczbaGodzin INT
);

INSERT INTO Kursy (KodKursu, NazwaKursu, LiczbaGodzin) VALUES
('CS101', 'Podstawy programowania', 30),
('CS102', 'Algorytmy', 40),
('CS103', 'Bazy danych', 35),
('CS104', 'Inzynieria oprogramowania', 45),
('CS105', 'Grafika komputerowa', 25),
('CS106', 'Sieci komputerowe', 50),
('CS107', 'Bezpieczenstwo systemow', 20),
('CS108', 'Sztuczna inteligencja', 60),
('CS109', 'Systemy operacyjne', 55),
('CS110', 'Programowanie obiektowe', 50),
('CS111', 'Podstawy kryptografii', 45),
('CS112', 'Programowanie w Pythonie', 30),
('CS113', 'Rozproszone systemy', 50),
('CS114', 'Bazy danych NoSQL', 40),
('CS115', 'Zaawansowane techniki programowania', 60);

CREATE TABLE Oceny (
    ID INT PRIMARY KEY AUTO_INCREMENT,
    StudentID INT,
    KodKursu VARCHAR(10),
    Ocena DECIMAL(3, 1),
    FOREIGN KEY (StudentID) REFERENCES Studenci(ID),
    FOREIGN KEY (KodKursu) REFERENCES Kursy(KodKursu)
);

INSERT INTO Oceny (StudentID, KodKursu, Ocena) VALUES
(1, 'CS101', 4.0),
(2, 'CS101', 3.5),
(3, 'CS102', 5.0),
(4, 'CS103', 3.0),
(5, 'CS104', 4.5),
(6, 'CS105', 4.0),
(7, 'CS106', 5.0),
(8, 'CS107', 2.5),
(9, 'CS108', 3.5),
(9, 'CS109', 2.0),
(10, 'CS109', 4.0);

Ćwiczenia

Ćwiczenie 1: INNER JOIN

Zadanie 1: Wyświetl imię, nazwisko studentów oraz nazwę kursu, na który są zapisani, używając INNER JOIN.

Zadanie 2: Wyświetl studentów, którzy mają ocenę wyższą niż 4 oraz ich kursy.


Ćwiczenie 2: LEFT JOIN

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

Zadanie 2: Pokaż studentów, którzy nie są zapisani na żaden kurs.


Ćwiczenie 3: RIGHT JOIN

Zadanie 1: Wyświetl wszystkie kursy oraz studentów, którzy na nie uczęszczają, używając RIGHT JOIN.

Zadanie 2: Pokaż kursy, na które nie jest zapisany żaden student.


Ćwiczenie 4: Zaawansowane Łączenie Tabel

Zadanie 1: Wyświetl imię i nazwisko studentów, którzy zapisali się na kursy, ale ich ocena jest mniejsza niż 3 lub nie mają oceny (użyj LEFT JOIN z warunkami w klauzuli WHERE).