Database
 sql >> Baza danych >  >> RDS >> Database

Typowe wyrażenia tabelowe:kiedy i jak ich używać

Co to są wspólne wyrażenia tabelowe (CTE)?

Common Table Expression (CTE) to zestaw wyników zapytania, który istnieje tymczasowo i jest używany tylko w kontekście większego zapytania. Podobnie jak tabela pochodna, wynik CTE nie jest przechowywany i istnieje tylko przez czas trwania zapytania. W tym artykule skupimy się na nierekurencyjnych CTE.

Jak przydatne są CTE?

CTE, takie jak widoki bazy danych i tabele pochodne, umożliwiają użytkownikom łatwiejsze pisanie i obsługę złożonych zapytań dzięki zwiększonej czytelności i uproszczeniu. Ta redukcja złożoności jest osiągana przez dekonstrukcję zwykle złożonych zapytań na proste bloki, które mają być użyte i ponownie użyte, jeśli to konieczne, przy przepisaniu zapytania. Przykładowe przypadki użycia to:

  • Konieczność wielokrotnego odwoływania się do tabeli pochodnej w jednym zapytaniu
  • Alternatywa dla tworzenia widoku w bazie danych
  • Wykonywanie tych samych obliczeń wielokrotnie w wielu składnikach zapytania

Jak utworzyć CTE

  • Zainicjuj CTE za pomocą „Z”
  • Podaj nazwę zapytania, które wkrótce ma zostać zdefiniowane
  • Po przypisaniu nazwy wykonaj „AS”
  • Określ nazwy kolumn (krok opcjonalny)
  • Zdefiniuj zapytanie, aby uzyskać pożądany zestaw wyników
  • Jeśli wymaganych jest wiele CTE, każde kolejne wyrażenie zainicjuj przecinkiem i powtórz kroki 2-4.
  • Odwołaj się do wyżej zdefiniowanych CTE w kolejnym zapytaniu

Składnia

WITH
expression_name_1 AS
(CTE query definition 1)

[, expression_name_X AS
   (CTE query definition X)
 , etc ]

SELECT expression_A, expression_B, ...
FROM expression_name_1

##Przykład CTENastępujące zapytanie odpowiada na pytanie biznesowe:„jaki jest średni miesięczny koszt kampanii dla działań marketingowych firmy?” Można to osiągnąć za pomocą zapytania pochodnego (pokazanego poniżej); jednak użycie CTE poprawia czytelność

-- define CTE:
WITH Cost_by_Month AS
(SELECT campaign_id AS campaign,
       TO_CHAR(created_date, 'YYYY-MM') AS month,
       SUM(cost) AS monthly_cost
FROM marketing
WHERE created_date BETWEEN NOW() - INTERVAL '3 MONTH' AND NOW()
GROUP BY 1, 2
ORDER BY 1, 2)

-- use CTE in subsequent query:
SELECT campaign, avg(monthly_cost) as "Avg Monthly Cost"
FROM Cost_by_Month
GROUP BY campaign
ORDER BY campaign

Za pomocą zapytania pochodnego:

SELECT campaign, avg(monthly_cost) as "Avg Monthly Cost"
FROM
    -- this is where the derived query is used
    (SELECT campaign_id AS campaign,
       TO_CHAR(created_date, 'YYYY-MM') AS month,
       SUM(cost) AS monthly_cost
    FROM marketing
    WHERE created_date BETWEEN NOW() - INTERVAL '3 MONTH' AND NOW()
    GROUP BY 1, 2
    ORDER BY 1, 2) as Cost_By_Month
GROUP BY campaign
ORDER BY campaign

Dokumentacja

  • Postgres
  • Przesunięcie ku czerwieni
  • Wyrocznia
  • SQLSerwer

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Statystyki zbudowane na zamówienie

  2. Kolejny sposób przeglądania automatycznych aktualizacji statystyk

  3. Jakie są etapy projektowania bazy danych?

  4. Zrozumienie sortowania na poziomie bazy danych i wpływu jego zmiany na bazę danych

  5. Polecenia SQL