SQL MED klausul

Sql Med Klausul



Når du er dypt inne i SQL og databasespørringer, er en av de kraftigste og mest utrolige funksjonene du vil komme over, de vanlige tabelluttrykkene som er kjent som CTE-er.

I SQL er WITH-klausulen også kjent som CTE. Det er en kraftig funksjon som gjør det mulig for oss å lage midlertidige resultatsett i en spørring. En viktig rolle for CTE-er er å forenkle de komplekse spørringene til mindre og gjenbrukbare underspørringer. Dette er med på å gjøre koden mer lesbar og vedlikeholdbar i det lange løp.

Bli med oss ​​i denne opplæringen mens vi utforsker funksjonene til de vanlige tabelluttrykkene ved å bruke WITH-klausulen og støttet funksjonalitet.







Krav:

For demonstrasjonsformål vil vi bruke følgende:



  1. MySQL versjon 8.0 og nyere
  2. Sakila prøvedatabase

Med de gitte kravene oppfylt, kan vi fortsette for å lære mer om CTE-er og WITH-klausulen.



SQL MED klausul

WITH-leddet lar oss definere ett eller flere midlertidige resultatsett som er kjent som vanlige tabelluttrykk.





Vi kan referere til de resulterende CTE-ene i hovedspørringen som enhver annen tabell eller resultatsett. Dette spiller en avgjørende rolle i å lage modulære SQL-spørringer.

Selv om syntaksen til CTE kan variere litt avhengig av kravene dine, viser følgende den grunnleggende syntaksen til CTE i SQL:



MED cte_name (kolonne1, kolonne2, ...) AS (
-- CTE-spørring
PLUKKE UT ...
FRA ...
HVOR ...
)
-- Hovedspørsmål
PLUKKE UT ...
FRA ...
JOIN cte_name PÅ ...
HVOR ...

Vi starter med nøkkelordet WITH som forteller SQL-databasen at vi ønsker å lage og bruke CTE.

Deretter spesifiserer vi navnet på CTE som lar oss referere til det i andre spørringer.

Vi spesifiserer også en valgfri liste over kolonnenavn hvis CTE inkluderer kolonnealiasene.

Deretter fortsetter vi med å definere CTE-spørringen. Denne inneholder alle oppgavene eller dataene som CTE utfører inne i et par parenteser.

Til slutt spesifiserer vi hovedspørringen som refererer til CTE.

Eksempelbruk:

En av de beste måtene å forstå hvordan man bruker og jobber med CTE-er er å se på et praktisk eksempel.

Ta for eksempel Sakila-eksempeldatabasen. Anta at vi ønsker å finne de 10 beste kundene med det høyeste antallet leie.

Ta en titt på følgende viste CTE.

Bruk av SQL WITH-klausulen for å finne de 10 beste kundene med høyest leietelling:

MED CustomerRentals AS (
VELG c.customer_id, c.first_name, c.last_name, COUNT(r.rental_id) AS rental_count
FRA kunde c
BLI MEDLEIE r PÅ c.customer_id = r.customer_id
GROUP BY c.customer_id, c.first_name, c.last_name
)
PLUKKE UT *
FRA CustomerRentals
BESTILL ETTER rental_count DESC
GRENSE 10;

I det gitte eksemplet starter vi med å definere en ny CTE ved å bruke nøkkelordet WITH etterfulgt av navnet som vi ønsker å tilordne til CTE. I dette tilfellet kaller vi det 'CustomerRentals'.

Inne i CTE-organet beregner vi leietellingen for hver kunde ved å bli med i kunde- og leietabellen.

Til slutt, i hovedspørringen, velger vi alle kolonnene fra CTE, bestiller resultatene basert på leieantallet (synkende rekkefølge), og begrenser utgangen til bare de 10 øverste radene.

Dette lar oss hente kundene med det høyeste antallet leie som vist i følgende utdata:

  En tabell med navn Beskrivelse generert automatisk

Rekursive CTEer

I noen andre tilfeller kan det hende du har å gjøre med hierarkiske datastrukturer. Det er her de rekursive CTE-ene kommer inn i bildet.

La oss for eksempel ta et tilfelle der vi ønsker å navigere i den hierarkiske organisasjonen eller representere en trelignende struktur. Vi kan bruke nøkkelordet WITH RECURSIVE for å lage en rekursiv CTE.

Siden det ikke er hierarkiske data som vi kan bruke i Sakila-databasen for å demonstrere en rekursiv CTE, la oss sette opp et grunnleggende eksempel.

LAG TABELL-avdeling (
department_id INT PRIMARY KEY AUTO_INCREMENT,
avdelingsnavn VARCHAR(255) IKKE NULL,
parent_department_id INT,
FOREIGN KEY (parent_department_id) REFERANSER avdeling(department_id)
);
INSERT INTO-avdeling (avdelingsnavn, overordnet_avdelings-id)
VERDIER
('Bedrift', NULL),
('Finans', 1),
('HR', 1),
('Regnskap', 2),
'Rekruttering', 3),
('Lønn', 4);

I dette tilfellet har vi et eksempel på en «avdeling»-tabell med noen tilfeldige data. For å finne den hierarkiske strukturen til avdelingene kan vi bruke en rekursiv CTE som følger:

MED RECURSIVE DepartmentHierarchy AS (
VELG avdelings-id, avdelingsnavn, overordnet_avdelings-id
FRA avdeling
HVOR parent_department_id ER NULL
UNION ALLE
VELG d.department_id, d.department_name, d.parent_department_id
FRA avdeling d
BLI MED I DepartmentHierarchy dh PÅ d.parent_department_id = dh.department_id
)
PLUKKE UT *
FRA Institutthierarki;

I dette tilfellet starter den rekursive CTE med avdelinger som har en NULL 'parent_department_id' (rotavdelinger) og henter rekursivt de underordnede avdelingene.

Konklusjon

I denne opplæringen lærte vi om de mest grunnleggende og nyttige funksjonene i SQL-databaser som de vanlige tabelluttrykkene ved å forstå hvordan man arbeider med nøkkelordet WITH.