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 uczniowie i klasy.
  • 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 JOIN między uczniowie i oceny.
  • 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ź id projektu „Website".
  • Na tej podstawie wybierz pracownik_id z tabeli zadania.
  • 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_id z tabeli oceny, 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 uczniowie z klasy i oceny.
  • 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:

  1. Wyświetl uczniów z klasy „4TI" wraz ze średnią ocen z przedmiotu „INF.03".
  2. Wyświetl klasy i ich średnią ocenę z „INF.03", posortowane od najlepszej.
  3. 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ę!

  1. Do czego służy polecenie SELECT w SQL?
  2. Jak połączyć dwie tabele po kluczu obcym?
  3. Jaka jest różnica między INNER JOIN a LEFT JOIN?
  4. Czym jest podzapytanie i gdzie można je wykorzystać?
  5. Jak policzyć liczbę rekordów w grupie?
  6. 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 DESC na 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