Część 12 kursu PHP pod kątem INF.03: SQL: filtrowanie, sortowanie i łączenie tabel. Teoria w skrócie i 16 ćwiczeń z automatycznym sprawdzaniem.
WHERE ogranicza wynik do wierszy spełniających warunek. Warunki łączymy słowem AND lub OR , a wartości tekstowe bierzemy w apostrofy.
$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>';
}
$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>';
}
Co robi WHERE w zapytaniu?
Poprawna: c) WHERE wybiera tylko pasujące wiersze.
ORDER BY ustawia kolejność: ASC rosnąco (domyślnie), DESC malejąco. Można sortować po kilku kolumnach, podając je po przecinku.
$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>';
}
$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>';
}
Co robi ORDER BY DESC?
Poprawna: a) DESC ustawia kolejność od największej wartości.
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.
$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>';
}
$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>';
}
Po czym łączymy tabele?
Poprawna: b) Warunek ON wskazuje powiązane kolumny.