W budowie
Materiał edukacyjny · Informatyka WHERE złożone, ORDER BY, LIMIT oraz relacje INNER/LEFT JOIN

CZĘŚĆ 12

SQL: filtrowanie, sortowanie i łączenie tabel

PPrezentacja dla nauczyciela

Rzeczywiste bazy danych składają się z wielu powiązanych ze sobą tabel. W tej części opanujesz zaawansowane filtrowanie (AND, OR, BETWEEN), sortowanie wyników (ORDER BY), ograniczanie liczby rekordów (LIMIT) oraz łączenie tabel kluczem obcym (INNER JOIN i LEFT JOIN).

Filtrowanie warunkiem WHERE

WHERE ogranicza wynik do wierszy spełniających warunek. Warunki łączymy słowem AND lub OR, a wartości tekstowe bierzemy w apostrofy.

Do wyszukiwania fragmentu tekstu służy LIKE z znakiem procentu: WHERE imie LIKE 'A%' znajdzie imiona zaczynające się na A, a '%a%' — zawierające literę a.

Wartość z formularza trzeba zabezpieczyć przed wstrzyknięciem — najlepiej zapytaniem przygotowanym. Samo dodanie apostrofów nie wystarcza.

$klasa = '3TI';
$sql = "SELECT imie FROM uczniowie WHERE klasa = '" . mysqli_real_escape_string($polaczenie, $klasa) . "'";

$wynik = mysqli_query($polaczenie, $sql);
while ($w = mysqli_fetch_assoc($wynik)) {
    echo '<p>' . htmlspecialchars($w['imie']) . '</p>';
}
1. Co robi WHERE w zapytaniu?
2. Co oznacza znak % w LIKE?
3. Czym łączymy dwa warunki?

Sortowanie i limitowanie wyniku

ORDER BY ustawia kolejność: ASC rosnąco (domyślnie), DESC malejąco. Można sortować po kilku kolumnach, podając je po przecinku.

LIMIT ogranicza liczbę wierszy: LIMIT 5 daje pięć pierwszych, a LIMIT 10, 5 — pięć wierszy od jedenastego. To podstawa stronicowania wyników.

Kolejność klauzul jest stała: WHERE, ORDER BY, LIMIT. Przestawienie ich kończy się błędem składni.

$sql = 'SELECT imie, punkty FROM uczniowie
        WHERE punkty > 10
        ORDER BY punkty DESC, imie ASC
        LIMIT 3';

$wynik = mysqli_query($polaczenie, $sql);
while ($w = mysqli_fetch_assoc($wynik)) {
    echo '<p>' . $w['imie'] . ': ' . $w['punkty'] . '</p>';
}
4. Co robi ORDER BY DESC?
5. Co ogranicza LIMIT?
6. Jaka jest kolejność klauzul?

Łączenie tabel JOIN

JOIN pozwala pobrać dane z dwóch tabel po kluczu. Warunek połączenia zapisujemy w ON: ON u.klasa_id = k.id, gdzie litery to aliasy tabel.

Aliasy skracają zapis i pozwalają odróżnić kolumny o tych samych nazwach. W SELECT wymieniamy kolumny z obu tabel, np. u.imie, k.nazwa.

INNER JOIN zwraca tylko pasujące pary. LEFT JOIN dodatkowo wiersze bez pary — przydaje się, gdy chcemy pokazać także uczniów bez klasy.

$sql = 'SELECT u.imie, k.nazwa
        FROM uczniowie u
        JOIN klasy k ON k.id = u.klasa_id
        ORDER BY k.nazwa, u.imie';

$wynik = mysqli_query($polaczenie, $sql);
while ($w = mysqli_fetch_assoc($wynik)) {
    echo '<p>' . htmlspecialchars($w['imie']) . ' (' . htmlspecialchars($w['nazwa']) . ')</p>';
}
7. Po czym łączymy tabele?
8. Do czego służy alias tabeli?
9. Co zwraca LEFT JOIN?

Ćwiczenia