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>';
}
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>';
}
Łą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>';
}
Ćwiczenia
- 1Warunek łączony WHERE z operatorem ANDwarunek łączony WHERE ANDZadanie i podpowiedzi →
- 2Alternatywa warunków WHERE z operatorem ORalternatywa warunków WHERE ORZadanie i podpowiedzi →
- 3Filtrowanie zakresem BETWEENfiltrowanie zakresem BETWEENZadanie i podpowiedzi →
- 4Wyszukiwanie po wzorcu nazwiskawyszukiwanie wzorcem LIKEZadanie i podpowiedzi →
- 5Sortowanie wyników ORDER BY DESCsortowanie malejące ORDER BY DESCZadanie i podpowiedzi →
- 6Sortowanie wielopoziomowesortowanie wielopoziomoweZadanie i podpowiedzi →
- 7Ograniczenie liczby wierszy LIMITograniczenie liczby wierszy LIMITZadanie i podpowiedzi →
- 8Paginacja wyników LIMIT z OFFSETpaginacja wyników LIMIT OFFSETZadanie i podpowiedzi →
- 9Klucz obcy kategoriiklucz obcy w tabeliZadanie i podpowiedzi →
- 10Łączenie dwóch tabelłączenie tabel INNER JOINZadanie i podpowiedzi →
- 11Aliasy kolumn w JOINaliasy kolumn w złączeniu ASZadanie i podpowiedzi →
- 12JOIN z warunkiem na działJOIN z filtrowaniem WHEREZadanie i podpowiedzi →
- 13Produkt bez kategorii (LEFT JOIN)złączenie lewostronne LEFT JOINZadanie i podpowiedzi →
- 14Obsługa wartości NULL w PHP (LEFT JOIN)obsługa NULL przy LEFT JOINZadanie i podpowiedzi →
- 15Popraw błędne łączeniepoprawa błędu w warunku ONZadanie i podpowiedzi →
- 16Zestawienie relacyjne (synteza INF.03)zestawienie relacyjne syntezaZadanie i podpowiedzi →