Przejdź do treści

Czytelny SQL — formatowanie zapytań i dobre praktyki

Redakcja AMKBIT · · 2 min czytania

Jak układać zapytania SELECT z JOIN, WHERE i GROUP BY, żeby były zrozumiałe po miesiącu, jak nazywać aliasy, dlaczego warto unikać SELECT * i jak chronić się przed SQL injection. Z przykładami przed i po.

Przed i po

select u.id,u.imie,count(z.id) zamowien from uzytkownicy u left join zamowienia z on z.uzytkownik_id=u.id where u.aktywny=1 group by u.id,u.imie having count(z.id)>2 order by zamowien desc

SELECT u.id, u.imie, COUNT(z.id) AS zamowien FROM uzytkownicy u LEFT JOIN zamowienia z ON z.uzytkownik_id = u.id WHERE u.aktywny = 1 GROUP BY u.id, u.imie HAVING COUNT(z.id) > 2 ORDER BY zamowien DESC

Drugą wersję czyta się „z góry na dół”: jakie kolumny, skąd, z jakimi warunkami, jak pogrupowane. Taki układ zrobi automatycznie formatowanie SQL — przyda się zwłaszcza przy zapytaniach skopiowanych z logów lub wygenerowanych przez ORM.

Zasady czytelnego SQL

  • Słowa kluczowe wielkimi literami, nazwy tabel i kolumn małymi — od razu widać strukturę.
  • Jedna klauzula — jedna sekcja; kolumny w SELECT jedna pod drugą (łatwo dodać, usunąć, zakomentować).
  • Warunki AND/OR na początku linii, nawiasy przy mieszaniu AND i OR — a AND (b OR c) to co innego niż a AND b OR c.
  • Jawne JOIN-y zamiast przecinków w FROM i warunków złączenia w WHERE.
  • Znaczące aliasy — u dla użytkowników jest czytelne w krótkim zapytaniu; w długich lepiej uzyt, zam.
  • AS przy aliasach kolumn — SUM(z.kwota) AS suma, a nie samo SUM(z.kwota) suma.

Unikaj SELECT *

Pobieranie wszystkich kolumn spowalnia zapytania (więcej danych z dysku i przez sieć), utrudnia korzystanie z indeksów pokrywających i psuje kod, gdy ktoś doda kolumnę do tabeli. Wypisuj kolumny, których naprawdę potrzebujesz.

SQL injection — najważniejsza zasada bezpieczeństwa

Nigdy nie sklejaj zapytania z tekstem od użytkownika:

// źle — podatne na SQL injection "SELECT * FROM uzytkownicy WHERE login = '" . $login . "'" // dobrze — zapytanie przygotowane z parametrem $st = $db->prepare('SELECT id, imie FROM uzytkownicy WHERE login = ?'); $st->execute([$login]);

Zapytania przygotowane (parametry) oddzielają kod SQL od danych — baza nigdy nie potraktuje danych jak polecenia. To ta sama idea co kodowanie danych przy wyświetlaniu w HTML (zob. ochrona przed XSS).

Wydajność w skrócie

  • Indeksy na kolumnach używanych w WHERE, JOIN i ORDER BY.
  • Unikaj funkcji na kolumnie w warunku (WHERE YEAR(data) = 2026) — lepiej zakres: WHERE data >= '2026-01-01' AND data < '2027-01-01'.
  • LIMIT przy podglądzie danych i stronicowaniu.
  • Sprawdzaj plan zapytania (EXPLAIN) przy wolnych zapytaniach.

Wyniki zapytań często trafiają do API jako JSON — o formacie przeczytasz w poradniku co to jest JSON, a dane sformatujesz w formatowaniu JSON.

Narzędzia do tego poradnika

SQLbazy danychMySQLformatowanie koduSQL injectiondobre praktyki

Przeczytaj też