SQL MED klausul

Sql Med Klausul



När du är djupt in i SQL- och databasfrågor är en av de mest kraftfulla och otroliga funktionerna som du kommer att stöta på de vanliga tabelluttrycken som vanligtvis kallas CTE.

I SQL är WITH-satsen även känd som CTE. Det är en kraftfull funktion som gör att vi kan skapa tillfälliga resultatuppsättningar i en fråga. En viktig roll för CTE:er är att förenkla de komplexa frågorna till mindre och återanvändbara underfrågor. Detta hjälper till att göra koden mer läsbar och underhållbar på lång sikt.

Följ med oss ​​i den här handledningen när vi utforskar hur de vanliga tabelluttrycken fungerar med hjälp av WITH-satsen och den funktionalitet som stöds.







Krav:

För demonstrationsändamål kommer vi att använda följande:



  1. MySQL version 8.0 och senare
  2. Sakila exempeldatabas

Med de givna kraven uppfyllda kan vi fortsätta för att lära oss mer om CTE och WITH-klausulen.



SQL MED klausul

WITH-satsen tillåter oss att definiera en eller flera temporära resultatuppsättningar som är kända som vanliga tabelluttryck.





Vi kan referera till de resulterande CTE:erna i huvudfrågan som vilken annan tabell eller resultatuppsättning som helst. Detta spelar en avgörande roll för att skapa modulära SQL-frågor.

Även om syntaxen för CTE kan variera något beroende på dina krav, visar följande den grundläggande syntaxen för CTE i SQL:



MED cte_name (kolumn1, kolumn2, ...) AS (
-- CTE-fråga
VÄLJ ...
FRÅN ...
VAR ...
)
-- Huvudfråga
VÄLJ ...
FRÅN ...
JOIN cte_name PÅ ...
VAR ...

Vi börjar med nyckelordet WITH som talar om för SQL-databasen att vi vill skapa och använda CTE.

Därefter anger vi namnet för CTE som gör att vi kan referera till det i andra frågor.

Vi anger också en valfri lista med kolumnnamn om CTE inkluderar kolumnaliasen.

Därefter fortsätter vi med att definiera CTE-frågan. Detta innehåller alla uppgifter eller data som CTE utför inom ett par parenteser.

Slutligen anger vi huvudfrågan som refererar till CTE.

Exempel på användning:

Ett av de bästa sätten att förstå hur man använder och arbetar med CTE är att titta på ett praktiskt exempel.

Ta till exempel Sakila exempeldatabasen. Anta att vi vill hitta de 10 bästa kunderna med det högsta antalet uthyrningar.

Ta en titt på följande visade CTE.

Använda SQL WITH-klausulen för att hitta de 10 bästa kunderna med de högsta hyresvärdena:

MED CustomerRentals AS (
VÄLJ c.customer_id, c.first_name, c.last_name, COUNT(r.rental_id) AS rental_count
FRÅN kund c
JOIN uthyrning r PÅ c.customer_id = r.customer_id
GROUP BY c.customer_id, c.first_name, c.last_name
)
VÄLJ *
FRÅN CustomerRentals
BESTÄLL EFTER rental_count DESC
GRÄNS 10;

I det givna exemplet börjar vi med att definiera en ny CTE med nyckelordet WITH följt av namnet som vi vill tilldela CTE. I det här fallet kallar vi det 'CustomerRentals'.

Inuti CTE-organet beräknar vi hyresantalet för varje kund genom att gå med i kund- och hyrestabellen.

Slutligen, i huvudfrågan, väljer vi alla kolumner från CTE, beställer resultaten baserat på hyresantalet (fallande ordning) och begränsar utmatningen till bara de 10 översta raderna.

Detta gör att vi kan hämta kunder med det högsta antalet hyrda som visas i följande utdata:

  En namntabell Beskrivning genereras automatiskt

Rekursiva CTE

I vissa andra fall kanske du har att göra med hierarkiska datastrukturer. Det är här de rekursiva CTE:erna kommer in i bilden.

Låt oss ta till exempel ett fall där vi vill navigera i den hierarkiska organisationen eller representera en trädliknande struktur. Vi kan använda nyckelordet WITH RECURSIVE för att skapa en rekursiv CTE.

Eftersom det inte finns några hierarkiska data som vi kan använda i Sakila-databasen för att demonstrera en rekursiv CTE, låt oss skapa ett grundläggande exempel.

SKAPA TABELL avdelning (
department_id INT PRIMARY KEY AUTO_INCREMENT,
avdelningsnamn VARCHAR(255) NOT NULL,
parent_department_id INT,
FOREIGN KEY (parent_department_id) REFERENCES department(department_id)
);
INSERT INTO-avdelning (avdelningsnamn, parent_department_id)
VÄRDEN
('Företag', NULL),
('Finans', 1),
('HR', 1),
('Redovisning', 2),
'Rekrytering', 3),
('Lön', 4);

I det här fallet har vi ett exempel på en 'avdelning'-tabell med några slumpmässiga data. För att hitta den hierarkiska strukturen för avdelningarna kan vi använda en rekursiv CTE enligt följande:

MED RECURSIVE DepartmentHierarchy AS (
SELECT department_id, department_name, parent_department_id
FRÅN avdelning
WHERE parent_department_id ÄR NULL
UNION ALLA
VÄLJ d.department_id, d.department_name, d.parent_department_id
FRÅN avdelning d
GÅ MED DepartmentHierarchy dh PÅ d.parent_department_id = dh.department_id
)
VÄLJ *
FRÅN Institutionshierarki;

I det här fallet börjar den rekursiva CTE med avdelningar som har ett NULL 'parent_department_id' (rotavdelningar) och hämtar rekursivt de underordnade avdelningarna.

Slutsats

I den här handledningen lärde vi oss om de mest grundläggande och användbara funktionerna i SQL-databaser som Common Table Expressions genom att förstå hur man arbetar med nyckelordet WITH.