Przejdź do treści

Centrum Kształcenia Zawodowego i Ustawicznego w Mrągowie

Common Table Expression

sobota,

Common Table Expression

Common Table Expression (CTE), czyli wspólne wyrażenia tablicowe, to funkcja używana w języku SQL do zarządzania bazami danych. Jest to tymczasowy zestaw wyników, który można wykorzystać w ramach zapytań SELECT, INSERT, UPDATE lub DELETE. CTE są szczególnie przydatne w upraszczaniu skomplikowanych zapytań, ponieważ pozwalają na podzielenie zapytania na prostsze części.

Podstawowe informacje

  • Składnia – CTE definiuje się za pomocą słowa kluczowego WITH, po którym następuje nazwa CTE i słowo kluczowe AS, które wprowadza zapytanie CTE.
  • Czytelność – użycie CTE umożliwia zwiększenie czytelności i łatwiejsze utrzymanie skomplikowanych zapytań poprzez podzielenie ich na prostsze części.
  • Rekurencja – jedną z kluczowych cech CTE jest ich zdolność do bycia rekurencyjnymi. Rekurencyjne CTE to takie, które odwołują się same do siebie. Jest to szczególnie użyteczne w przypadku hierarchicznych lub drzewiastych struktur danych.
  • Zastosowanie – CTE mogą być używane do organizowania danych przed ich ostatecznym przetworzeniem, co może być przydatne w przypadkach, gdy dane muszą być przetworzone w określony sposób, zanim będą mogły być użyte w głównym zapytaniu.
  • Zasięg – CTE są dostępne tylko w zapytaniu, w którym zostały zdefiniowane i nie mogą być używane w innych zapytaniach.

Przykład prostego CTE

 WITH CTE_Name AS (
      SELECT * FROM Tabela
      WHERE warunek
 )
 SELECT * FROM CTE_Name;

W powyższym przykładzie CTE_Name jest tymczasowym zestawem wyników, który zawiera wszystkie rekordy z Tabela, spełniające określony warunek. Następnie wykonane zostaje zapytanie SELECT, aby pobrać dane z tego CTE.

Przykłady

Common Table Expressions mogą być wykorzystywane w różnorodnych scenariuszach związanych z zapytaniami SQL. Poniższe przykłady pokazują, jak CTE mogą być używane do upraszczania, organizowania i optymalizowania różnych rodzajów zapytań SQL.

Uproszczenie złożonych zapytań

CTE pozwalają na rozbijanie skomplikowanych zapytań na mniejsze, łatwiejsze w zarządzaniu części. Dzięki temu, zamiast tworzyć długie i skomplikowane zapytania z wieloma połączeniami (joins) i podzapytaniami, można użyć serii prostszych CTE, co ułatwia zrozumienie i utrzymanie kodu.

WITH CTE_1 AS (
     SELECT kolumna1, kolumna2 FROM tabela1 WHERE warunek
),
CTE_2 AS (
     SELECT kolumna3, kolumna4 FROM tabela2
)
SELECT * FROM CTE_1 JOIN CTE_2 ON CTE_1.kolumna2 = CTE_2.kolumna3;

Zapytania rekurencyjne

Rekurencyjne CTE są bardzo przydatne w przypadku pracy z hierarchicznymi lub drzewiastymi strukturami danych, jak np. drzewa genealogiczne, struktury organizacyjne firm, czy kategorie produktów.

WITH RECURSIVE CTE_Tree AS (
     SELECT id, nazwa, parent_id FROM tabela WHERE parent_id IS NULL
     UNION ALL
     SELECT t.id, t.nazwa, t.parent_id FROM tabela t
     INNER JOIN CTE_Tree ct ON ct.id = t.parent_id
)
SELECT * FROM CTE_Tree;

Tworzenie raportów i analiz

CTE mogą być używane do wstępnego przetwarzania danych przed wykonaniem analizy lub stworzeniem raportu. Na przykład, można użyć CTE do agregacji danych przed ich użyciem w bardziej skomplikowanym zapytaniu.

WITH CTE_Summary AS (
     SELECT kategoria, COUNT(*) AS Liczba, AVG(cena) AS SredniaCena
     FROM produkty
     GROUP BY kategoria
)
SELECT kategoria, Liczba, SredniaCena FROM CTE_Summary WHERE Liczba > 10;

Usuwanie duplikatów

CTE mogą być również wykorzystywane do identyfikacji i usuwania duplikatów w danych.

WITH CTE_Duplicates AS (
     SELECT *, ROW_NUMBER() OVER (PARTITION BY kolumna1 ORDER BY kolumna2) AS rn
     FROM tabela
)
DELETE FROM CTE_Duplicates WHERE rn > 1;

Aktualizacje warunkowe

W przypadku skomplikowanych aktualizacji, gdzie wartości w jednej tabeli zależą od wartości w innej, CTE mogą uporządkować logikę i uczynić ją bardziej zrozumiałą.

WITH CTE_Data AS (
     SELECT id, kolumna1, (SELECT SUM(kolumna2) FROM tabela2 WHERE tabela2.id = tabela1.id) AS suma
     FROM tabela1
)
UPDATE tabela1 SET kolumna3 = CTE_Data.suma FROM CTE_Data WHERE tabela1.id = CTE_Data.id;

Obsługa Common Table Expression w popularnych maszynach baz danych

CTE są obecnie standardową funkcją w większości nowoczesnych systemów zarządzania bazami danych, oferując programistom potężne narzędzie do tworzenia bardziej zrozumiałych, modularnych i wydajnych zapytań SQL.

  • PostgreSQL – obsługuje CTE od wersji 8.4, która została wydana w lipcu 2009 roku. PostgreSQL oferuje pełne wsparcie dla rekurencyjnych CTE.
  • MySQL – wprowadził wsparcie dla CTE w wersji 8.0, wydanej w kwietniu 2018 roku. Przed tą wersją MySQL nie obsługiwał CTE.
  • Microsoft SQL Server – obsługuje CTE od wersji SQL Server 2005, wydanej w styczniu 2006 roku. SQL Server zapewnia wsparcie zarówno dla standardowych, jak i rekurencyjnych CTE.
  • Oracle Database – obsługuje CTE od wersji 9i, wydanej w 2001 roku. Oracle również wspiera rekurencyjne CTE, znane jako „subquery factoring”.
  • SQLite – wprowadził wsparcie dla CTE w wersji 3.8.3, wydanej w lutym 2014 roku. SQLite obsługuje zarówno zwykłe, jak i rekurencyjne CTE.
  • IBM DB2 – DB2 obsługuje CTE od dłuższego czasu, ze wsparciem zarówno dla standardowych, jak i rekurencyjnych CTE.
  • MariaDB – jako fork MySQL, MariaDB zaczął obsługiwać CTE od wersji 10.2, wydanej w maju 2017 roku. Wcześniej nie obsługiwał CTE.

Trzy miesiące temu na naszej stronie…

Artykuł: Józef Piłsudski

Józef Piłsudski

Artykuł: GIMP: Zaznaczanie prostokątne i eliptyczne

GIMP: Zaznaczanie prostokątne i eliptyczne

Artykuł: GIMP: Zapisywanie zaznaczenia

GIMP: Zapisywanie zaznaczenia

Artykuł: Symulator sieci komputerowej

Symulator sieci komputerowej

Artykuł: Linux: Polecenie dmidecode

Linux: Polecenie dmidecode

Artykuł: Specyfikacja: Przydatne programy

Specyfikacja: Przydatne programy

Nasze technikum

Technik informatyk

Szkoły dla dorosłych

Nasza szkoła

Pełna oferta edukacyjna

Oferta szkoły