ChatGPT do pisania SQL — jak nie zrobić sobie krzywdy?
ChatGPT pisze sensowny SQL znacznie szybciej niż człowiek od zera, a na publicznych benchmarkach (np. Spider, BIRD) sięga 60–80% poprawności zależnie od złożoności zapytania. Świetnie nadaje się do generowania
SELECT-ów,JOIN-ów, agregacji i refaktoringu. Bądź jednak szczególnie ostrożny w trzech sytuacjach: zapytania na produkcji bez planu wykonania, operacjeDELETE/UPDATEbez transakcji i zadania, które wymagają znajomości Twojego rzeczywistego schematu, statystyk i wzorca obciążenia.
SQL to język, w którym AI radzi sobie wyjątkowo dobrze. Powód jest prozaiczny: w internecie są
miliony przykładów SELECT * FROM ... — modele językowe miały bardzo bogaty materiał treningowy.
W praktyce oznacza to, że ChatGPT pisze sensowny SQL znacznie częściej niż sensowny DAX czy VBA.
To nie znaczy, że można mu ufać bezkrytycznie. Oznacza to, że można delegować dużo, jeśli wiesz co i jak walidować.
1. Generowanie zapytań — najmocniejsza strona AI
Klasyczny scenariusz: dostajesz zadanie „pokaż top 10 klientów po obrocie w tym roku, z liczbą zamówień, średnią wartością i datą ostatniej transakcji".
W SQL to 15-20 linii z JOIN-ami, GROUP BY, ORDER BY i podzapytaniem. Pisanie ręcznie:
3-5 minut, jeśli pamiętasz składnię. Z ChatGPT:
SELECT TOP 10
k.Nazwa,
COUNT(z.Id) AS LiczbaZamowien,
SUM(z.Wartosc) AS Obrot,
AVG(z.Wartosc) AS SredniaWartosc,
MAX(z.DataZamowienia) AS OstatniaTransakcja
FROM Klienci k
INNER JOIN Zamowienia z ON z.KlientId = k.Id
WHERE z.DataZamowienia >= DATEFROMPARTS(YEAR(GETDATE()), 1, 1)
GROUP BY k.Nazwa
ORDER BY Obrot DESC;
5 sekund zamiast kilku minut wyklikiwania JOIN-ów. Co więcej, ChatGPT zwykle używa
czytelnych aliasów (k, z) zamiast generycznych a, b.
Pułapki, na które trzeba uważać:
LIMITvsTOPvsOFFSET ... FETCH NEXT. ChatGPT bywa nieprzewidywalny w doborze dialektu. W SQL ServerzeLIMITnie działa — musi byćTOP nlubOFFSET … FETCH NEXT n ROWS ONLY(to drugie wymagane przy paginacji). PostgreSQL/MySQL akceptująLIMIT. Zawsze podawaj modelowi konkretny dialekt w prompcie.- Funkcje na kolumnach w
WHERE—YEAR(z.DataZamowienia) = YEAR(GETDATE())jest poprawne semantycznie, ale uniemożliwia użycie indeksu naDataZamowienia. Optymalizator nie potrafi zindeksować wyniku funkcji. Forma w przykładzie wyżej (DataZamowienia >= DATEFROMPARTS(...)) jest sargable i korzysta z indeksu. - Hint
WITH (NOLOCK)— ChatGPT czasem dorzuca go „dla wydajności". To brudne odczyty (dirty reads): możesz dostać dane w połowie transakcji, zduplikowane wiersze albo pominięte rekordy. Jeśli Twoja firma nie używa świadomie izolacjiREAD UNCOMMITTEDaniRCSI— usuwaj.
Praktyka, która działa: zawsze podaj ChatGPT schemat tabel z typami kolumn i dialekt SQL (SQL Server / PostgreSQL / MySQL). Generowane zapytanie wtedy będzie celowane, nie generyczne.
2. Refaktoring zapytań — drugi co do wartości use case
Dostajesz po koleżance zapytanie z 200 linii z trzema poziomami zagnieżdżonych podzapytań. Powinno wziąć tabelę faktów, połączyć z trzema wymiarami, policzyć trzy agregaty.
ChatGPT z promptem „przepisz to zapytanie używając CTE i okiennych funkcji, zachowując semantykę" dostarcza w 30 sekund coś, co czyta się jak proza zamiast sznurka spaghetti.
Co AI robi dobrze:
- zamienia podzapytania na CTE (
WITH ... AS) - wyciąga powtarzające się logiki do common table expressions
- używa
ROW_NUMBER(),RANK(),LAG()zamiast self-joinów - proponuje nazwy aliasów, które coś znaczą
Czego nie robi:
- nie testuje, czy semantyka się zgadza. Refaktor może zmienić liczbę zwracanych wierszy w
edge case'ach (
NULL-e, duplikaty) - nie zna planów wykonania. Nowsza wersja zapytania może być wolniejsza, mimo że czytelniejsza
- nie wie, jakie indeksy masz w bazie
Praktyka: po refaktorze zawsze porównaj wynik na próbce. Najlepiej EXCEPT — jeśli zwraca
0 wierszy w obie strony, refaktor jest semantycznie zgodny.
3. Wyjaśnianie zapytań — niedoceniany use case
Dostajesz query, którego nie rozumiesz. Pewnie po koleżance, która już nie pracuje. Zapytanie ma 500 linii, używa pivotów, kursorów, trzech poziomów stored procedure.
ChatGPT z promptem „wyjaśnij krok po kroku, co robi to zapytanie, w stylu tutorialu" dostarcza streszczenie, które oszczędza godzinę debugowania. Szczególnie przy dziedziczonych skryptach ETL — gdzie nikt już nie pamięta, dlaczego coś jest tak, a nie inaczej.
To samo działa dla wyjaśniania błędów. Wklejasz:
Msg 8120, Level 16, State 1, Line 5. Column 'Klienci.Email' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
I dostajesz tłumaczenie, dlaczego SQL Server protestuje, plus poprawioną wersję zapytania.
4. Optymalizacja zapytań — tu już ostrożnie
Wklejasz zapytanie + plan wykonania (SET STATISTICS IO ON; SET STATISTICS TIME ON;) i pytasz
„co można zoptymalizować".
ChatGPT proponuje sensowne rzeczy:
- dodanie indeksu pokrywającego (covering index) na konkretnych kolumnach
- przepisanie
ORnaUNION ALL(czasami szybsze) - rozbicie dużego zapytania na temp tables
Ale:
- nie wie, jak duża jest Twoja tabela ani jak rozproszone są dane
- nie wie, czy indeks już istnieje pod inną nazwą
- nie uwzględnia, że każdy nowy indeks zwalnia operacje
INSERT/UPDATE/DELETEi zajmuje dodatkowe miejsce na dysku
Praktyka: traktować propozycje jako hipotezy do przetestowania, nie jako gotową rekomendację. Każdy proponowany indeks należy zważyć: przyspiesza odczyt, ale wydłuża zapisy i zajmuje miejsce. Wszystkie AI do baz danych mają tę samą wadę — brak kontekstu Twojej rzeczywistej infrastruktury, statystyk i wzorca obciążenia.
5. Czerwona linia — czego nigdy nie deleguj
Trzy operacje, których nie dawaj AI bez pełnej kontroli:
DELETE/UPDATEna produkcji bez transakcji. ChatGPT generujeDELETE FROM Klienci WHERE ..., Ty kopiujesz, klikasz Execute, WHERE okazuje się za szeroki — i kasujesz wiersze, które miały zostać. Standard:BEGIN TRAN; DELETE ...; SELECT @@ROWCOUNT; ROLLBACK;— jeśli liczba zwróconych wierszy się zgadza, robiszCOMMIT. Inaczej rollback i żadnej szkody.- DDL bez review.
ALTER TABLEna dużej tabeli (setki milionów wierszy) potrafi zablokować bazę na godziny — AI nie widzi statystyk ani zależności. Zmiany schematu zawsze przez ścieżkę review + okno serwisowe. - Dane wrażliwe w prompcie. Wklejanie produkcyjnych danych klientów (PESEL, e-maile, dane finansowe) do publicznego ChatGPT to ryzyko naruszenia NDA i RODO — niezależnie od tego, że OpenAI deklaruje brak treningu na danych z API. Standard: schemat tak, próbka tak (po anonimizacji), realne dane produkcyjne — nie.
6. Stack, który ma sens dla zespołu
- ChatGPT Plus / Claude / GitHub Copilot dla developerów piszących SQL na co dzień.
- Sandboxowa baza testowa. Wszystkie generowane zapytania uruchamiamy najpierw tam.
- Obowiązkowy review kodu. Każde zapytanie produkcyjne z AI przechodzi przez code review, tak samo jak ręcznie pisane.
- Anonimizacja danych w promptach. Schemat tak, dane prawdziwe nie. Generujemy „dummy schema" do dzielenia z modelami zewnętrznymi.
Co dalej?
ChatGPT zmienił krzywą uczenia SQL bardziej niż jakiekolwiek narzędzie ostatniej dekady. Junior może dziś pisać zapytania na poziomie mid-developera, jeśli umie zadawać pytania. Mid-developer robi w godzinę to, co kiedyś trwało cały dzień.
Ale fundament wiedzy o SQL — jak działają indeksy, czym jest plan wykonania, jak silnik optymalizuje zapytania — wciąż jest niezbędny. Inaczej AI generuje Ci kod, który działa na próbce i ginie na produkcji.
Jeśli chcesz, żeby Twój zespół miał ten fundament i mógł świadomie używać AI jako wzmacniacza, a nie magiczno-ezoteryczno-wróżbiarskiej szklanej kuli, zapraszam na warsztat Microsoft SQL Server. Pracujemy na realnych zapytaniach, planach wykonania i przypadkach optymalizacji. AI omawiam jako narzędzie codzienne — z konkretną listą co warto, a czego nie warto delegować.
