sql >> Databáze >  >> RDS >> Database

Běžné tabulkové výrazy:Kdy a jak je používat

Co jsou běžné tabulkové výrazy (CTE)?

Common Table Expression (CTE) je výsledná sada dotazu, která existuje dočasně a pro použití pouze v kontextu většího dotazu. Podobně jako odvozená tabulka se výsledek CTE neukládá a existuje pouze po dobu trvání dotazu. Tento článek se zaměří na nerekurzivní CTE.

Jak jsou CTE užitečné?

CTE, stejně jako databázové pohledy a odvozené tabulky, umožňují uživatelům snadněji psát a udržovat složité dotazy díky vyšší čitelnosti a zjednodušení. Tohoto snížení složitosti je dosaženo dekonstruováním běžně složitých dotazů do jednoduchých bloků, které se použijí a v případě potřeby znovu použijí při přepisování dotazu. Příklady případů použití zahrnují:

  • Potřeba odkazovat na odvozenou tabulku vícekrát v jednom dotazu
  • Alternativa k vytvoření pohledu v databázi
  • Provedení stejného výpočtu vícekrát v rámci více komponent dotazu

Jak vytvořit CTE

  • Spusťte CTE pomocí „WITH“
  • Zadejte název dotazu, který bude brzy definován
  • Po přiřazení názvu následujte „AS“
  • Uveďte názvy sloupců (volitelný krok)
  • Definujte dotaz, abyste získali požadovanou sadu výsledků
  • Pokud je vyžadováno více CTE, začněte každý následující výraz čárkou a opakujte kroky 2–4.
  • Odkaz na výše definované CTE v následném dotazu

Syntaxe

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

##Příklad CTENásledující dotaz odpovídá na obchodní otázku:„Jaké jsou průměrné měsíční náklady na kampaň pro marketingové úsilí společnosti?“ Toho lze dosáhnout pomocí odvozeného dotazu (viz níže); nicméně použití CTE zlepšuje čitelnost

-- 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

Použití odvozeného dotazu:

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

Dokumentace

  • Postgres
  • Červený posuv
  • Oracle
  • SQLServer

  1. Efektivní monitorování MySQL pomocí SCUMM Dashboards:Část první

  2. 2 způsoby, jak zřetězit řetězce a čísla v MariaDB

  3. Získat výchozí hodnoty sloupců tabulky v Postgresu?

  4. JDBC vrací výjimku MySQLSyntaxError se správným příkazem