⚡ AutoSnippets PRO EN

SQL: Produkcyjne Snippet'y Kodu

Zaawansowane zapytania SQL: funkcje okna, transakcje, triggery, CTE.

Python JavaScript TypeScript Java C# C++ Go PHP Rust SQL

Na tej stronie:

46. SQL: Zaawansowane Funkcje Okna

SQL

Analiza trendów i rankingi (ROW_NUMBER) w czasie.

SELECT 
    department_id,
    employee_name,
    salary,
    ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) as rank_in_dep
FROM employees;

Kiedy używać

Przydatne przy rankingach, porównaniach rok-do-roku czy analizach trendów bez konieczności pisania podzapytań.

Typowe pułapki

ROW_NUMBER() przypisuje unikalny numer nawet przy remisach — jeśli zależy Ci na wspólnej pozycji przy tej samej wartości, użyj RANK() lub DENSE_RANK().

47. SQL: Transakcja z Blokowaniem Wierszy

SQL

Bezpieczna modyfikacja stanów magazynowych lub sald finansowych.

BEGIN TRANSACTION;

SELECT stock_quantity 
FROM inventory 
WHERE product_id = 142 
FOR UPDATE;

UPDATE inventory 
SET stock_quantity = stock_quantity - 1 
WHERE product_id = 142;

COMMIT;

Kiedy używać

Niezbędne przy operacjach na stanach magazynowych lub saldach finansowych, gdzie dwie równoległe transakcje nie mogą nadpisać się nawzajem.

Typowe pułapki

FOR UPDATE blokuje wiersz do końca transakcji — zbyt długa transakcja może powodować, że inne zapytania będą długo czekać na dostęp do tego samego wiersza.

48. SQL: Automatyczny Trigger updated_at

SQL

Funkcja odświeżająca pole modyfikacji przy każdym UPDATE.

CREATE TRIGGER update_timestamp
BEFORE UPDATE ON users
FOR EACH ROW
SET NEW.updated_at = CURRENT_TIMESTAMP;

Kiedy używać

Wygodne rozwiązanie, żeby mieć pewność, że pole updated_at zawsze odzwierciedla ostatnią faktyczną zmianę rekordu.

Typowe pułapki

Składnia triggera różni się między silnikami baz danych (MySQL, PostgreSQL, SQL Server) — ten przykład wymaga dostosowania do konkretnego dialektu SQL.

49. SQL: Optymalizacyjny Indeks Częściowy

SQL

Indeksowanie tylko aktywnych rekordów w celu oszczędności pamięci.

CREATE INDEX idx_active_users_email 
ON users(email) 
WHERE status = 'active';

Kiedy używać

Przydatne, gdy zapytania regularnie filtrują po jednej wartości (np. status = 'active'), a reszta rekordów rzadko jest odpytywana.

Typowe pułapki

Indeks częściowy przyspiesza tylko zapytania pasujące dokładnie do warunku WHERE z jego definicji — inne zapytania go nie wykorzystają.

50. SQL: Zapytanie Rekurencyjne (CTE)

SQL

Przechodzenie przez powiązania hierarchiczne (np. organizacja).

WITH RECURSIVE org_chart AS (
    SELECT id, name, manager_id, 1 as level
    FROM employees
    WHERE manager_id IS NULL
    UNION ALL
    SELECT e.id, e.name, e.manager_id, o.level + 1
    FROM employees e
    JOIN org_chart o ON e.manager_id = o.id
)
SELECT * FROM org_chart;

Kiedy używać

Stosuj przy strukturach hierarchicznych — drzewach organizacyjnych, kategoriach zagnieżdżonych, komentarzach z odpowiedziami.

Typowe pułapki

Brak warunku kończącego rekurencję (albo błędna referencja) może doprowadzić do nieskończonej pętli — większość baz danych ma domyślny limit głębokości rekurencji jako zabezpieczenie.