sql >> Databáze >  >> RDS >> Mysql

Společný tabulkový výraz v MySQL

Common Table Expressions (CTE) vám umožní snadno psát složité SQL dotazy v MySQL. V tomto článku se podíváme na to, co je Common Table Expression v MySQL a jak psát CTE v MySQL.


Co je společný tabulkový výraz

Common Table Expression je pojmenovaná sada výsledků, jejíž rozsah je omezen na dotaz SQL, ve kterém je definován a používán. Je podobná odvozené tabulce, ale není uložena jako objekt a na rozdíl od odvozených tabulek může odkazovat sama na sebe. Výsledkem je, že CTE poskytuje lepší výkon než odvozené tabulky v MySQL.

Bonusové čtení:Jak vypočítat marži v MySQL


Běžný tabulkový výraz v MySQL

Zde je syntaxe běžného tabulkového výrazu v MySQL.

WITH cte_name (column_list) AS (     
      query 
)  
SELECT * FROM cte_name;

Ve výše uvedeném dotazu musíte zadat název CTE, dotaz SQL, jehož výsledek by měl být odkazován pomocí názvu CTE. Všimněte si prosím počtu sloupců v column_list by měly být stejné jako ty ve vašem dotazu .

Podívejme se na příklad běžného tabulkového výrazu (CTE).

Bonusové čtení:Jak získat nejprodávanější produkt pomocí SQL Query

Řekněme, že máte prodej(id, datum_objednávky, částka) tabulka.

mysql> create table sales(id int, order_date date, amount int);

mysql> insert into sales(id, order_date, amount)
      values(1, '2021-01-01', 200),
      (2, '2021-01-02', 250),
      (3, '2021-01-03', 220),
      (4, '2021-01-04', 230),
      (5, '2021-01-05', 210),
      (6, '2021-01-06', 100),
      (7, '2021-01-07', 120),
      (8, '2021-01-08', 150),
      (9, '2021-01-09', 180),
      (10, '2021-01-10', 200);

 mysql> select * from sales;
 +------+------------+--------+
 | id   | order_date | amount |
 +------+------------+--------+
 |    1 | 2021-01-01 |    200 |
 |    2 | 2021-01-02 |    250 |
 |    3 | 2021-01-03 |    220 |
 |    4 | 2021-01-04 |    230 |
 |    5 | 2021-01-05 |    210 |
 |    6 | 2021-01-06 |    100 |
 |    7 | 2021-01-07 |    120 |
 |    8 | 2021-01-08 |    150 |
 |    9 | 2021-01-09 |    180 |
 |   10 | 2021-01-10 |    200 |
 +------+------------+--------+

Zde je CTE pro výběr pouze záznamů prodeje, které mají částku>200.

with test_cte as (
     select id,order_date,amount from sales
     where amount>200
 ) select * from test_cte; 

 +------+------------+--------+
 | id   | order_date | amount |
 +------+------------+--------+
 |    1 | 2021-01-01 |    200 |
 |    2 | 2021-01-02 |    250 |
 |    3 | 2021-01-03 |    220 |
 |    4 | 2021-01-04 |    230 |
 |    5 | 2021-01-05 |    210 |
 |   10 | 2021-01-10 |    200 |
 +------+------------+--------+

Ve výše uvedeném CTE zadáváme dotaz SELECT pro filtrování řádků s množstvím>200 uvnitř klauzule WITH.

Bonusové čtení:Jak používat příkaz CASE v MySQL

Vezměte prosím na vědomí, že CTE můžete použít s příkazy SELECT, UPDATE, INSERT a DELETE. Zde jsou syntaxe pro totéž.

WITH … SELECT …
WITH … UPDATE …
WITH … DELETE …

Také můžete použít CTE jako dílčí dotaz, jak je uvedeno níže

SELECT … WHERE id IN (WITH … SELECT …);
SELECT * FROM (WITH … SELECT …) AS temporary_table;

Pokud použijete výsledek příkazu SELECT jako vstup pro příkazy CREATE/INSERT/REPLACE, můžete v něm také použít klauzuli WITH. Zde je několik příkladů,

CREATE TABLE … WITH … SELECT …
CREATE VIEW … WITH … SELECT …
INSERT … WITH … SELECT …
REPLACE … WITH … SELECT …
DECLARE CURSOR … WITH … SELECT …
EXPLAIN … WITH … SELECT …

Bonusové čtení:Získejte vícenásobné počty s různými podmínkami v MySQL


Běžný tabulkový výraz v Ubiq

Nástroj Ubiq Reporting podporuje SELECT dotazy založené na CTE a usnadňuje vizualizaci výsledků SQL různými způsoby. Umožňuje také vytvářet řídicí panely a grafy z výsledků dotazů MySQL. Zde je výše uvedený dotaz CTE v Ubiq.

Ve skutečnosti po spuštění dotazu můžete jednoduše kliknout na typ vizualizace a výsledek vykreslit do grafu.

Potřebujete nástroj pro vytváření sestav pro MySQL? Ubiq usnadňuje vizualizaci dat během několika minut a sledování na řídicích panelech v reálném čase. Vyzkoušejte to ještě dnes!

  1. Vložte aktualizaci uloženou proc na SQL Server

  2. 4 způsoby, jak vybrat duplicitní řádky v PostgreSQL

  3. Řešení pro DATEDIFF() Ignorování SET DATEFIRST v SQL Server (příklad T-SQL)

  4. Existuje v ORACLE způsob, jak spojit více řádků řádků do jednoho, pomocí dvou tabulek, kde jsou konečné hodnoty odděleny čárkami?