W SQL, bardzo często potrzebujemy danych, które są przechowywane w różnych tabelach. Aby je połączyć, możemy użyć klauzuli WHERE
, która jest prostszym i starszym sposobem niż klauzula JOIN
. W klauzuli WHERE
łączymy tabele na podstawie wspólnych kolumn, zazwyczaj kolumny zawierające klucze obce w jednej tabeli i klucze główne w drugiej.
Klauzula WHERE
do łączenia tabel
Aby połączyć dwie tabele przy użyciu klauzuli WHERE
, musimy wyspecyfikować warunek, który wskazuje na relację między tymi tabelami. Na przykład, możemy łączyć tabele Studenci
i Oceny
na podstawie kolumny ID
w tabeli Studenci
oraz StudentID
w tabeli Oceny
:
SELECT Studenci.Imie, Studenci.Nazwisko, Oceny.Ocena
FROM Studenci, Oceny
WHERE Studenci.ID = Oceny.StudentID;
W powyższym zapytaniu łączymy obie tabele za pomocą klauzuli WHERE
, wskazując warunek, że ID
w tabeli Studenci
musi być równe StudentID
w tabeli Oceny
. Dzięki temu uzyskujemy listę studentów wraz z ich ocenami.
Kluczowe aspekty
-
Łączenie wielu tabel – Możesz łączyć więcej niż dwie tabele, dodając więcej warunków w klauzuli
WHERE
. Na przykład, możemy połączyć tabeleStudenci
,Oceny
iKursy
, aby wyświetlić studentów, ich oceny oraz nazwy kursów. -
Funkcje agregujące – Łączenie tabel pozwala również na użycie funkcji agregujących, takich jak
COUNT
,SUM
,AVG
, itd. Możesz np. obliczyć średnią ocenę dla każdego kursu. -
Filtry warunkowe – Możesz również dodawać dodatkowe warunki w klauzuli
WHERE
, aby filtrować wyniki, np. pokazać tylko studentów z określonymi ocenami lub kursy, które trwają więcej niż określoną liczbę godzin.
Ćwiczenia praktyczne
Na potrzeby ćwiczeń stworzymy trzy tabele: Studenci
, Oceny
, i Kursy
. Studenci będą zapisani na różne kursy i otrzymają oceny za swoje uczestnictwo.
1. Tworzenie tabel
CREATE TABLE Studenci (
ID INT AUTO_INCREMENT PRIMARY KEY,
Imie VARCHAR(50),
Nazwisko VARCHAR(50),
RokStudiow INT
);
CREATE TABLE Kursy (
KodKursu VARCHAR(10) PRIMARY KEY,
NazwaKursu VARCHAR(100),
LiczbaGodzin INT
);
CREATE TABLE Oceny (
ID INT AUTO_INCREMENT PRIMARY KEY,
StudentID INT,
KodKursu VARCHAR(10),
Ocena DECIMAL(3,2),
FOREIGN KEY (StudentID) REFERENCES Studenci(ID),
FOREIGN KEY (KodKursu) REFERENCES Kursy(KodKursu)
);
2. Wypełnianie tabel danymi
-- Wstawianie danych do tabeli Studenci
INSERT INTO Studenci (Imie, Nazwisko, RokStudiow)
VALUES
('Jan', 'Kowalski', 1),
('Anna', 'Nowak', 2),
('Tomasz', 'Wisniewski', 3),
('Marta', 'Zielinska', 1),
('Piotr', 'Wojcik', 4),
('Kasia', 'Kowalczyk', 2),
('Magda', 'Lewandowska', 3),
('Karol', 'Dabrowski', 5),
('Ewa', 'Pawlak', 2),
('Rafal', 'Sikorski', 4);
-- Wstawianie danych do tabeli Kursy
INSERT INTO Kursy (KodKursu, NazwaKursu, LiczbaGodzin)
VALUES
('CS101', 'Wprowadzenie do programowania', 30),
('CS102', 'Algorytmy i struktury danych', 40),
('CS103', 'Bazy danych', 45),
('CS104', 'Sieci komputerowe', 35),
('CS105', 'Programowanie w Java', 50),
('CS106', 'Zaawansowane techniki programowania', 60),
('CS107', 'Podstawy systemów operacyjnych', 25),
('CS108', 'Zarzadzanie projektami IT', 30),
('CS109', 'Programowanie w Python', 40),
('CS110', 'Cyberbezpieczenstwo', 35);
-- Wstawianie danych do tabeli Oceny
INSERT INTO Oceny (StudentID, KodKursu, Ocena)
VALUES
(1, 'CS101', 4.5),
(2, 'CS102', 3.0),
(3, 'CS103', 5.0),
(4, 'CS104', 4.0),
(5, 'CS105', 3.5),
(6, 'CS106', 4.2),
(7, 'CS107', 5.0),
(8, 'CS108', 3.8),
(9, 'CS109', 4.9),
(10, 'CS110', 4.0),
(7, 'CS106', 4.5),
(3, 'CS104', 3.0),
(3, 'CS103', 5.0),
(3, 'CS104', 4.0),
(6, 'CS106', 3.5),
(1, 'CS106', 4.2),
(1, 'CS110', 5.0),
(10, 'CS108', 3.8),
(4, 'CS108', 4.9),
(10, 'CS108', 4.0);
Ćwiczenia
Ćwiczenie 1: Łączenie dwóch tabel
Napisz zapytanie SQL, które wyświetli imię i nazwisko studentów oraz ich oceny.
- Skorzystaj z klauzuli
WHERE
, aby połączyć tabeleStudenci
iOceny
. - Pokaż oceny dla studentów zapisanych na kursy.
Zadanie 1: Wyświetl imię, nazwisko oraz oceny studentów.
Zadanie 2: Wyświetl tylko tych studentów, którzy uzyskali ocenę wyższą niż 4.
Ćwiczenie 2: Łączenie trzech tabel
Napisz zapytanie, które połączy tabele Studenci
, Oceny
oraz Kursy
, aby wyświetlić imiona, nazwiska, nazwy kursów oraz oceny studentów.
- Skorzystaj z warunku
WHERE
, aby połączyć wszystkie trzy tabele.
Zadanie 1: Wyświetl imię, nazwisko, nazwę kursu oraz ocenę każdego studenta.
Zadanie 2: Wyświetl studentów, którzy otrzymali ocenę wyższą niż 4 w kursach, które mają więcej niż 40 godzin.
Ćwiczenie 3: Filtry z grupowaniem danych
Napisz zapytanie, które wyświetli średnią ocenę studentów dla każdego kursu.
- Skorzystaj z funkcji agregującej
AVG()
i klauzuliGROUP BY
.
Zadanie 1: Wyświetl nazwę kursu i średnią ocenę wszystkich studentów zapisanych na dany kurs.
Zadanie 2: Pokaż tylko te kursy, w których średnia ocena jest większa niż 4.
Ćwiczenie 4: Dodatkowe filtry w zapytaniach
Napisz zapytanie, które pokaże szczegóły tylko tych studentów, którzy są na trzecim roku studiów i mają ocenę większą niż 4.
- Skorzystaj z klauzuli
WHERE
z dodatkowymi filtrami.
Zadanie 1: Wyświetl imię, nazwisko oraz ocenę studentów, którzy są na trzecim roku.
Zadanie 2: Wyświetl studentów, którzy są na drugim roku i uzyskali ocenę mniejszą niż 4.