SQL
Wyszukiwanie informacji w bazie danych (SELECT, JOIN)
Wyszukiwanie, złączenia, podzapytania — INF.03
Teoria Zapytania SELECT, złączenia, podzapytania
- SELECT ... FROM ... WHERE — podstawowe zapytanie wyszukujące rekordy
- JOIN — łączy informacje z wielu tabel po kluczach
- INNER JOIN — tylko rekordy powiązane w obu tabelach
- LEFT JOIN — wszystkie rekordy z tabeli lewej, nawet jeśli brak dopasowania
- PODZAPYTANIA (subqueries) — zapytanie zagnieżdżone w innym (np. w WHERE)
- GROUP BY, ORDER BY — grupowanie i sortowanie wyników
Zaawansowane zapytania pozwalają odpowiadać na konkretne pytania, np. „która klasa ma najwięcej ocen?" lub „jaki jest średni wynik danego ucznia?".
Ćwiczenie 1 Podstawowe zapytania SELECT
Zadanie: Wyświetl wszystkich pracowników o stanowisku „Programista" oraz tylko wybrane kolumny.
- Wyświetl wszystkich Programistów (
SELECT *). - Wyświetl tylko kolumny: imię, nazwisko, stanowisko.
- Posortuj wynik rosnąco po nazwisku.
-- Wszyscy pracownicy o stanowisku „Programista" SELECT * FROM pracownicy WHERE stanowisko = 'Programista'; -- Tylko wybrane kolumny + sortowanie SELECT imie, nazwisko, stanowisko FROM pracownicy WHERE stanowisko = 'Programista' ORDER BY nazwisko ASC;
Ćwiczenie 2 Złączenie tabel INNER JOIN
Zadanie: Wyświetl imię i nazwisko każdego ucznia oraz nazwę jego klasy.
- Połącz tabele
uczniowieiklasy. - Wyświetl imię, nazwisko ucznia oraz nazwę klasy.
- Posortuj wynik według nazwy klasy, a następnie nazwiska.
SELECT uczniowie.imie,
uczniowie.nazwisko,
klasy.nazwa AS klasa
FROM uczniowie
INNER JOIN klasy ON uczniowie.klasa_id = klasy.id
ORDER BY klasy.nazwa, uczniowie.nazwisko;
Ćwiczenie 3 LEFT JOIN — wyświetlanie „sierot"
Zadanie: Wyświetl wszystkich uczniów, nawet tych bez żadnych ocen.
- Użyj
LEFT JOINmiędzyuczniowieioceny. - Wyświetl imię, nazwisko, przedmiot i ocenę.
- Sprawdź, że uczniowie bez ocen mają NULL w kolumnie ocena.
SELECT uczniowie.imie,
uczniowie.nazwisko,
oceny.przedmiot,
oceny.ocena
FROM uczniowie
LEFT JOIN oceny ON uczniowie.id = oceny.uczen_id;
Ćwiczenie 4 Podzapytanie w SELECT i WHERE
Zadanie: Wyświetl pracowników, którzy pracują przy projekcie „Website".
- W podzapytaniu znajdź
idprojektu „Website". - Na tej podstawie wybierz
pracownik_idz tabelizadania. - Wyświetl imię i nazwisko pasujących pracowników.
SELECT imie, nazwisko
FROM pracownicy
WHERE id IN (
SELECT pracownik_id
FROM zadania
WHERE projekt_id = (
SELECT id FROM projekty
WHERE nazwa = 'Website'
)
);
Ćwiczenie 5 Agregacja z GROUP BY
Zadanie: Znajdź liczbę ocen wystawionych w każdej klasie.
- Połącz tabele
klasy,uczniowie,oceny. - Policz oceny przy użyciu
COUNT(). - Wyświetl nazwę klasy i liczbę ocen.
SELECT klasy.nazwa AS klasa,
COUNT(oceny.id) AS liczba_ocen
FROM klasy
LEFT JOIN uczniowie ON klasy.id = uczniowie.klasa_id
LEFT JOIN oceny ON uczniowie.id = oceny.uczen_id
GROUP BY klasy.nazwa;
Ćwiczenie 6 Podzapytanie w WHERE
Zadanie: Wyświetl wszystkich uczniów, którzy otrzymali ocenę 5 z dowolnego przedmiotu.
- Wybierz
uczen_idz tabelioceny, gdzie ocena = 5. - Wykorzystaj to w zapytaniu po tabeli
uczniowie.
SELECT imie, nazwisko FROM uczniowie WHERE id IN ( SELECT uczen_id FROM oceny WHERE ocena = 5 );
Ćwiczenie 7 JOIN + filtr + sortowanie
Zadanie: Wypisz wszystkich uczniów z klasy „3A" wraz z ich ocenami, posortowanych malejąco po ocenie.
- Połącz
uczniowiezklasyioceny. - Odfiltruj tylko klasę „3A".
- Posortuj po ocenie malejąco.
SELECT uczniowie.imie,
uczniowie.nazwisko,
oceny.przedmiot,
oceny.ocena
FROM uczniowie
INNER JOIN klasy ON uczniowie.klasa_id = klasy.id
LEFT JOIN oceny ON uczniowie.id = oceny.uczen_id
WHERE klasy.nazwa = '3A'
ORDER BY oceny.ocena DESC;
Zadanie INF.03 Analiza danych „Dziennik ocen"
Opis: Masz tabele:
uczniowie(id, imie, nazwisko, klasa_id)klasy(id, nazwa)oceny(id, uczen_id, przedmiot, ocena)
Wykonaj zapytania SQL:
- Wyświetl uczniów z klasy „4TI" wraz ze średnią ocen z przedmiotu „INF.03".
- Wyświetl klasy i ich średnią ocenę z „INF.03", posortowane od najlepszej.
- Wyświetl uczniów, którzy nie mają żadnej oceny z „INF.03".
-- 1. Uczniowie z klasy „4TI" + średnia z INF.03
SELECT u.imie,
u.nazwisko,
AVG(o.ocena) AS srednia_inf03
FROM uczniowie u
JOIN klasy k ON u.klasa_id = k.id
JOIN oceny o ON u.id = o.uczen_id
WHERE k.nazwa = '4TI'
AND o.przedmiot = 'INF.03'
GROUP BY u.id, u.imie, u.nazwisko;
-- 2. Klasy + średnia z INF.03, sortowanie od najlepszej
SELECT k.nazwa AS klasa,
AVG(o.ocena) AS srednia_inf03
FROM klasy k
JOIN uczniowie u ON k.id = u.klasa_id
JOIN oceny o ON u.id = o.uczen_id
WHERE o.przedmiot = 'INF.03'
GROUP BY k.nazwa
ORDER BY srednia_inf03 DESC;
-- 3. Uczniowie bez żadnej oceny z INF.03
SELECT u.imie, u.nazwisko, k.nazwa AS klasa
FROM uczniowie u
JOIN klasy k ON u.klasa_id = k.id
WHERE u.id NOT IN (
SELECT uczen_id
FROM oceny
WHERE przedmiot = 'INF.03'
);
Quiz Sprawdź wiedzę!
- Do czego służy polecenie SELECT w SQL?
- Jak połączyć dwie tabele po kluczu obcym?
- Jaka jest różnica między INNER JOIN a LEFT JOIN?
- Czym jest podzapytanie i gdzie można je wykorzystać?
- Jak policzyć liczbę rekordów w grupie?
- Jak posortować wynik zapytania malejąco po kolumnie ocena?
- SELECT pobiera wybrane dane z tabel według zadanych warunków.
- Przez
JOIN ... ON, łącząc kolumny klucza głównego i obcego. - INNER JOIN zwraca tylko rekordy z dopasowaniem w obu tabelach, LEFT JOIN również rekordy „bez pary" z tabeli lewej.
- To zapytanie zagnieżdżone w innym (np. w WHERE lub SELECT), którego wynik jest używany przez zapytanie główne.
- Przy użyciu funkcji agregującej
COUNT()z klauzuląGROUP BY. - Dodając
ORDER BY ocena DESCna końcu zapytania.
Checklista Sprawdź umiejętności
- Tworzę zapytania SELECT z warunkami w WHERE.
- Łączę tabele przy pomocy INNER JOIN i LEFT JOIN.
- Stosuję podzapytania w klauzulach SELECT i WHERE.
- Używam GROUP BY, COUNT(), AVG() do analizowania danych.
- Sortuję wyniki przy użyciu ORDER BY.
Materiały: INF.03 — SELECT, JOIN, podzapytania · Autor: Tomasz Puchała © 2025