Vælg (SQL) - Select (SQL)
Den SQL SELECT- sætning returnerer et resultat sæt af poster fra en eller flere tabeller .
En SELECT-sætning henter nul eller flere rækker fra en eller flere databasetabeller eller database synspunkter . I de fleste applikationer SELECTer den mest almindeligt anvendte kommando for databehandlingssprog (DML). Da SQL er et deklarativt programmeringssprog , SELECTangiver forespørgsler et resultatsæt, men angiver ikke, hvordan det skal beregnes. Databasen oversætter forespørgslen til en " forespørgselsplan ", som kan variere mellem henrettelser, databaseversioner og databasesoftware. Denne funktionalitet kaldes " forespørgselsoptimering ", da den er ansvarlig for at finde den bedst mulige udførelsesplan for forespørgslen inden for gældende begrænsninger.
SELECT -sætningen har mange valgfrie klausuler:
-
SELECTklausul er listen over kolonner eller SQL -udtryk, der skal returneres af forespørgslen. Dette er omtrent den relationelle algebra projektionsoperation . -
ASgiver eventuelt et alias for hver kolonne eller udtryk iSELECTklausulen. Dette er den relationelle algebra -omdøbning . -
FROMangiver fra hvilken tabel dataene skal hentes. -
WHEREangiver, hvilke rækker der skal hentes. Dette er omtrent den relationelle valg af algebra . -
GROUP BYgrupperækker, der deler en ejendom, så en samlet funktion kan anvendes på hver gruppe. -
HAVINGvælger blandt de grupper, der er defineret af GROUP BY -klausulen. -
ORDER BYangiver, hvordan de returnerede rækker skal bestilles.
Oversigt
SELECTer den mest almindelige operation i SQL, kaldet "forespørgslen". SELECThenter data fra en eller flere tabeller eller udtryk. Standardudsagn SELECThar ingen vedvarende virkninger på databasen. Nogle ikke-standardiserede implementeringer af SELECTkan have vedvarende effekter, f.eks. SELECT INTOSyntaksen i nogle databaser.
Forespørgsler giver brugeren mulighed for at beskrive ønskede data, så databasestyringssystemet (DBMS) kan udføre planlægning , optimering og udførelse af de fysiske operationer, der er nødvendige for at producere det resultat, som det vælger.
En forespørgsel indeholder en liste over kolonner, der skal medtages i det endelige resultat, normalt umiddelbart efter SELECTsøgeordet. En stjerne (" *") kan bruges til at angive, at forespørgslen skal returnere alle kolonner i de forespurgte tabeller. SELECTer den mest komplekse erklæring i SQL med valgfri søgeord og klausuler, der omfatter:
- Den
FROMbestemmelse, der angiver tabel (ler) til at hente data fra. DenFROMklausul kan indeholde valgfrieJOINunderpunkter at præcisere reglerne for at blive medlem tabeller. - Den
WHEREbestemmelse indbefatter en sammenligning prædikat, hvilket begrænser rækkerne returneres af forespørgslen. DenWHEREklausul fjerner alle rækker fra resultatet sæt, hvor sammenligningen prædikat ikke vurdere til True. - De
GROUP BYklausul projekter rækker har fælles værdier i et mindre sæt rækker.GROUP BYbruges ofte sammen med SQL -aggregeringsfunktioner eller til at eliminere dublerede rækker fra et resultatsæt. DenWHEREklausul påføres førGROUP BYklausul. - Den
HAVINGbestemmelse indbefatter et prædikat bruges til at filtrere rækker som følge afGROUP BYklausulen. Fordi det virker på resultaterne afGROUP BYklausulen, kan aggregeringsfunktioner bruges iHAVINGklausulprædikatet. - De
ORDER BYclause identificerer hvilken kolonne [s] for at bruge til at sortere de resulterende data, og i hvilken retning at sortere dem (stigende eller faldende). Uden enORDER BYklausul er rækkefølgen af rækker, der returneres af en SQL -forespørgsel, udefineret. - De
DISTINCTsøgeord eliminerer duplikere data.
Følgende eksempel på en SELECTforespørgsel returnerer en liste over dyre bøger. Forespørgslen henter alle rækker fra Bog tabellen, hvor prisen kolonne indeholder en værdi større end 100,00. Resultatet sorteres i stigende rækkefølge efter titel . Stjernen (*) i select-listen viser, at alle kolonner i bog tabellen bør indgå i resultatet sæt.
SELECT *
FROM Book
WHERE price > 100.00
ORDER BY title;
Nedenstående eksempel viser en forespørgsel efter flere tabeller, gruppering og aggregering ved at returnere en liste over bøger og antallet af forfattere, der er knyttet til hver bog.
SELECT Book.title AS Title,
count(*) AS Authors
FROM Book
JOIN Book_author
ON Book.isbn = Book_author.isbn
GROUP BY Book.title;
Eksempeloutput ligner muligvis følgende:
Title Authors ---------------------- ------- SQL Examples and Guide 4 The Joy of SQL 1 An Introduction to SQL 2 Pitfalls of SQL 1
Under forudsætning af, at isbn er det eneste fælles kolonne navn på de to tabeller, og at en kolonne med navnet titel kun eksisterer i Bog tabellen, kunne man omskrive forespørgslen ovenfor i følgende form:
SELECT title,
count(*) AS Authors
FROM Book
NATURAL JOIN Book_author
GROUP BY title;
Imidlertid understøtter mange leverandører enten ikke denne fremgangsmåde eller kræver visse konventioner om navngivning af kolonner for at naturlige sammenføjninger fungerer effektivt.
SQL inkluderer operatører og funktioner til beregning af værdier på lagrede værdier. SQL tillader brug af udtryk i SELECT-listen til projektdata, som i det følgende eksempel, som returnerer en liste over bøger, som koster mere end 100,00 med en ekstra sales_tax kolonne, der indeholder en omsætningsafgift tallet opgjort til 6% af prisen .
SELECT isbn,
title,
price,
price * 0.06 AS sales_tax
FROM Book
WHERE price > 100.00
ORDER BY title;
Underforespørgsler
Forespørgsler kan indlejres, så resultaterne af en forespørgsel kan bruges i en anden forespørgsel via en relationel operator eller aggregeringsfunktion. En indlejret forespørgsel er også kendt som en forespørgsel . Mens joins og andre bordoperationer giver beregningsmæssigt overlegne (dvs. hurtigere) alternativer i mange tilfælde, introducerer brugen af underforespørgsler et hierarki i udførelsen, der kan være nyttigt eller nødvendigt. I det følgende eksempel modtager aggregeringsfunktionen AVGresultatet af en underforespørgsel som input:
SELECT isbn,
title,
price
FROM Book
WHERE price < (SELECT AVG(price) FROM Book)
ORDER BY title;
En underforespørgsel kan bruge værdier fra den ydre forespørgsel, i hvilket tilfælde den er kendt som en korreleret underforespørgsel .
Siden 1999 tillader SQL -standarden navngivne underforespørgsler kaldet almindelige tabeludtryk (navngivet og designet efter implementeringen af IBM DB2 version 2; Oracle kalder disse subquery factoring ). CTE'er kan også være rekursive ved at henvise til sig selv; den resulterende mekanisme tillader træ- eller grafoverfarter (når de er repræsenteret som relationer) og mere generelt fixpoint -beregninger .
Afledt bord
En afledt tabel er brugen af at henvise til en SQL -underforespørgsel i en FROM -klausul. I det væsentlige er den afledte tabel en underforespørgsel, der kan vælges fra eller sluttes til. Afledt tabelfunktionalitet giver brugeren mulighed for at referere til forespørgslen som en tabel. Den afledte tabel kaldes også en inline -visning eller en vælg fra listen .
I det følgende eksempel involverer SQL -sætningen en sammenføjning fra den indledende bogtabel til den afledte tabel "Salg". Denne afledte tabel indsamler tilknyttede bogsalgsoplysninger ved hjælp af ISBN til at deltage i tabellen Bøger. Som et resultat heraf giver den afledte tabel resultatsættet med yderligere kolonner (antallet af solgte varer og det selskab, der solgte bøgerne):
SELECT b.isbn, b.title, b.price, sales.items_sold, sales.company_nm
FROM Book b
JOIN (SELECT SUM(Items_Sold) Items_Sold, Company_Nm, ISBN
FROM Book_Sales
GROUP BY Company_Nm, ISBN) sales
ON sales.isbn = b.isbn
Eksempler
| Tabel "T" | Forespørgsel | Resultat | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
SELECT * FROM T;
|
|
||||||||||||
|
SELECT C1 FROM T;
|
|
||||||||||||
|
SELECT * FROM T WHERE C1 = 1;
|
|
||||||||||||
|
SELECT * FROM T ORDER BY C1 DESC;
|
|
||||||||||||
| eksisterer ikke |
SELECT 1+1, 3*2;
|
|
Ved en tabel T vil forespørgslen resultere i, at alle elementerne i alle tabellernes rækker vises.
SELECT * FROM T
Med den samme tabel vil forespørgslen resultere i, at elementerne fra kolonnen C1 i alle rækker i tabellen vises. Dette ligner en fremskrivning i relationel algebra , bortset fra at resultatet i almindelighed kan indeholde dubletter. Dette er også kendt som en lodret partition i nogle databasetermer, der begrænser forespørgselsoutput til kun at se specificerede felter eller kolonner.
SELECT C1 FROM T
Med den samme tabel vil forespørgslen resultere i, at alle elementerne i alle de rækker, hvor værdien i kolonne C1 er '1', vises - i relationelle algebra -termer vil der blive udført et valg på grund af WHERE -klausulen. Dette er også kendt som en vandret partition, der begrænser rækker, der udsendes af en forespørgsel i henhold til angivne betingelser.
SELECT * FROM T WHERE C1 = 1
Med mere end en tabel vil resultatsættet være hver kombination af rækker. Så hvis to tabeller er T1 og T2, vil det resultere i hver kombination af T1 -rækker med hver T2 -række. F.eks. Hvis T1 har 3 rækker og T2 har 5 rækker, resulterer der 15 rækker.
SELECT * FROM T1, T2
Selvom det ikke er i standard, tillader de fleste DBMS at bruge en udvalgte klausul uden en tabel ved at foregive, at der bruges en imaginær tabel med en række. Dette bruges hovedsageligt til at udføre beregninger, hvor en tabel ikke er nødvendig.
SELECT -klausulen angiver en liste over egenskaber (kolonner) efter navn eller jokertegnet ("*") til at betyde "alle egenskaber".
Begrænsning af resultatrækker
Ofte er det praktisk at angive et maksimalt antal rækker, der returneres. Dette kan bruges til test eller til at forhindre forbrug af for store ressourcer, hvis forespørgslen returnerer flere oplysninger end forventet. Metoden til at gøre dette varierer ofte fra leverandør til leverandør.
I ISO SQL: 2003 kan resultatsæt begrænses ved at bruge
- markører eller
- ved at tilføje en SQL-vinduesfunktion til SELECT-sætningen
ISO SQL: 2008 introducerede FETCH FIRSTklausulen.
Ifølge PostgreSQL v.9 -dokumentation udfører en SQL -vinduesfunktion "en beregning på tværs af et sæt tabelrækker, der på en eller anden måde er relateret til den aktuelle række", på en måde, der ligner aggregerede funktioner. Navnet minder om signalbehandlingsvinduets funktioner . Et vinduesfunktionsopkald indeholder altid en OVER -klausul.
ROW_NUMBER () vinduesfunktion
ROW_NUMBER() OVERkan bruges til en simpel tabel på de returnerede rækker, f.eks. til ikke at returnere mere end ti rækker:
SELECT * FROM
( SELECT
ROW_NUMBER() OVER (ORDER BY sort_key ASC) AS row_number,
columns
FROM tablename
) AS foo
WHERE row_number <= 10
ROW_NUMBER kan være ikke-deterministisk : Hvis sort_key ikke er unik, er det muligt hver gang du kører forespørgslen at få forskellige rækkenumre tildelt alle rækker, hvor sort_key er den samme. Når sort_key er unik, får hver række altid et unikt rækkenummer.
RANK () vinduesfunktion
Den RANK() OVERvinduesfunktionen fungerer som ROW_NUMBER, men kan returnere mere eller mindre end n rækker i tilfælde af slips forhold, fx at returnere top-10 yngste personer:
SELECT * FROM (
SELECT
RANK() OVER (ORDER BY age ASC) AS ranking,
person_id,
person_name,
age
FROM person
) AS foo
WHERE ranking <= 10
Ovenstående kode kunne returnere mere end ti rækker, f.eks. Hvis der er to personer i samme alder, kan den returnere elleve rækker.
FETCH FIRST -klausul
Da ISO SQL: 2008 -resultatgrænser kan specificeres som i følgende eksempel ved hjælp af FETCH FIRSTklausulen.
SELECT * FROM T
FETCH FIRST 10 ROWS ONLY
Denne klausul understøttes i øjeblikket af CA DATACOM/DB 11, IBM DB2, SAP SQL Anywhere, PostgreSQL, EffiProz, H2, HSQLDB version 2.0, Oracle 12c og Mimer SQL .
Microsoft SQL Server 2008 og højere understøtterFETCH FIRST , men det betragtes som en del af ORDER BYklausulen. De ORDER BY, OFFSETog FETCH FIRSTklausuler er alle nødvendige for denne brug.
SELECT * FROM T
ORDER BY acolumn DESC OFFSET 0 ROWS FETCH FIRST 10 ROWS ONLY
Ikke-standard syntaks
Nogle DBMS'er tilbyder ikke-standard syntaks enten i stedet for eller ud over SQL standardsyntaks. Nedenfor er varianter af den simple grænseforespørgsel for forskellige DBMS'er opført:
SET ROWCOUNT 10
SELECT * FROM T
|
MS SQL Server (Dette fungerer også på Microsoft SQL Server 6.5, mens Select top 10 * fra T ikke gør det) |
SELECT * FROM T
LIMIT 10 OFFSET 20
|
Netezza , MySQL , MariaDB , SAP SQL Anywhere , PostgreSQL (understøtter også standarden siden version 8.4), SQLite , HSQLDB , H2 , Vertica , Polyhedra , Couchbase Server , Snowflake Computing , OpenLink Virtuoso |
SELECT * from T
WHERE ROWNUM <= 10
|
Oracle |
SELECT FIRST 10 * from T
|
Ingres |
SELECT FIRST 10 * FROM T order by a
|
Informix |
SELECT SKIP 20 FIRST 10 * FROM T order by c, d
|
Informix (rækkenumre filtreres efter ordre efter er evalueret. SKIP -klausul blev indført i en v10.00.xC4 fixpack) |
SELECT TOP 10 * FROM T
|
MS SQL Server , SAP ASE , MS Access , SAP IQ , Teradata |
SELECT * FROM T
SAMPLE 10
|
Teradata |
SELECT TOP 20, 10 * FROM T
|
OpenLink Virtuoso (springer over 20, leverer næste 10) |
SELECT TOP 10 START AT 20 * FROM T
|
SAP SQL Anywhere (understøtter også standarden siden version 9.0.1) |
SELECT FIRST 10 SKIP 20 * FROM T
|
Ildfugl |
SELECT * FROM T
ROWS 20 TO 30
|
Firebird (siden version 2.1) |
SELECT * FROM T
WHERE ID_T > 10 FETCH FIRST 10 ROWS ONLY
|
DB2 |
SELECT * FROM T
WHERE ID_T > 20 FETCH FIRST 10 ROWS ONLY
|
DB2 (nye rækker filtreres efter sammenligning med nøglekolonnen i tabel T) |
Rækker pagination
Rækker pagination er en metode, der bruges til at begrænse og vise kun en del af de samlede data for en forespørgsel i databasen. I stedet for at vise hundredvis eller tusinder af rækker på samme tid, bliver serveren kun anmodet om en side (et begrænset sæt rækker pr. Eksempelvis kun 10 rækker), og brugeren begynder at navigere ved at anmode om den næste side og derefter den næste , og så videre. Det er meget nyttigt, specielt i websystemer, hvor der ikke er en dedikeret forbindelse mellem klienten og serveren, så klienten ikke behøver at vente med at læse og vise alle serverens rækker.
Data i pagineringstilgang
-
{rows}= Antal rækker på en side -
{page_number}= Nummeret på den aktuelle side -
{begin_base_0}= Nummer på rækken - 1 hvor siden starter = (page_number -1) * rækker
Den enkleste metode (men meget ineffektiv)
- Vælg alle rækker fra databasen
- Læs alle rækker, men send kun til visning, når rækkenummeret for de læste rækker er mellem
{begin_base_0 + 1}og{begin_base_0 + rows}
Select *
from {table}
order by {unique_key}
Anden enkel metode (lidt mere effektiv end at læse alle rækker)
- Vælg alle rækker fra begyndelsen af tabellen til den sidste række for at få vist (
{begin_base_0 + rows}) - Læs
{begin_base_0 + rows}rækkerne, men send dem kun til visning, når rækkenummeret for de læste rækker er større end{begin_base_0}
| SQL | Dialekt |
|---|---|
select *
from {table}
order by {unique_key}
FETCH FIRST {begin_base_0 + rows} ROWS ONLY
|
SQL ANSI 2008 PostgreSQL SQL Server 2012 Derby Oracle 12c DB2 12 Mimer SQL |
Select *
from {table}
order by {unique_key}
LIMIT {begin_base_0 + rows}
|
MySQL SQLite |
Select TOP {begin_base_0 + rows} *
from {table}
order by {unique_key}
|
SQL Server 2005 |
SET ROWCOUNT {begin_base_0 + rows}
Select *
from {table}
order by {unique_key}
SET ROWCOUNT 0
|
Sybase, SQL Server 2000 |
Select *
FROM (
SELECT *
FROM {table}
ORDER BY {unique_key}
) a
where rownum <= {begin_base_0 + rows}
|
Oracle 11 |
Metode med positionering
- Vælg kun
{rows}rækker fra den næste række for at få vist ({begin_base_0 + 1}) - Læs og send for at få vist alle de læste rækker fra databasen
| SQL | Dialekt |
|---|---|
Select *
from {table}
order by {unique_key}
OFFSET {begin_base_0} ROWS
FETCH NEXT {rows} ROWS ONLY
|
SQL ANSI 2008 PostgreSQL SQL Server 2012 Derby Oracle 12c DB2 12 Mimer SQL |
Select *
from {table}
order by {unique_key}
LIMIT {rows} OFFSET {begin_base_0}
|
MySQL MariaDB PostgreSQL SQLite |
Select *
from {table}
order by {unique_key}
LIMIT {begin_base_0}, {rows}
|
MySQL MariaDB SQLite |
Select TOP {begin_base_0 + rows}
*, _offset=identity(10)
into #temp
from {table}
ORDER BY {unique_key}
select * from #temp where _offset > {begin_base_0}
DROP TABLE #temp
|
Sybase 12.5.3: |
SET ROWCOUNT {begin_base_0 + rows}
select *, _offset=identity(10)
into #temp
from {table}
ORDER BY {unique_key}
select * from #temp where _offset > {begin_base_0}
DROP TABLE #temp
SET ROWCOUNT 0
|
Sybase 12.5.2: |
select TOP {rows} *
from (
select *, ROW_NUMBER() over (order by {unique_key}) as _offset
from {table}
) xx
where _offset > {begin_base_0}
|
SQL Server 2005 |
SET ROWCOUNT {begin_base_0 + rows}
select *, _offset=identity(int,1,1)
into #temp
from {table}
ORDER BY {unique-key}
select * from #temp where _offset > {begin_base_0}
DROP TABLE #temp
SET ROWCOUNT 0
|
SQL Server 2000 |
SELECT * FROM (
SELECT rownum-1 as _offset, a.*
FROM(
SELECT *
FROM {table}
ORDER BY {unique_key}
) a
WHERE rownum <= {begin_base_0 + cant_regs}
)
WHERE _offset >= {begin_base_0}
|
Oracle 11 |
Metode med filter (det er mere sofistikeret, men nødvendigt for meget store datasæt)
- Vælg kun derefter
{rows}rækker med filter:- Første side: Vælg kun de første
{rows}rækker afhængigt af databasetypen - Næste side: Vælg kun de første
{rows}rækker, afhængigt af typen af database, hvor værdien{unique_key}er større end{last_val}(værdien{unique_key}af den sidste række på den aktuelle side) - Forrige side: sorter dataene i omvendt rækkefølge, vælg kun de første
{rows}rækker, hvor den{unique_key}er mindre end{first_val}(værdien{unique_key}af den første række på den aktuelle side), og sorter resultatet i den korrekte rækkefølge
- Første side: Vælg kun de første
- Læs og send for at få vist alle de læste rækker fra databasen
| Første side | Næste side | Forrige side | Dialekt |
|---|---|---|---|
select *
from {table}
order by {unique_key}
FETCH FIRST {rows} ROWS ONLY
|
select *
from {table}
where {unique_key} > {last_val}
order by {unique_key}
FETCH FIRST {rows} ROWS ONLY
|
select *
from (
select *
from {table}
where {unique_key} < {first_val}
order by {unique_key} DESC
FETCH FIRST {rows} ROWS ONLY
) a
order by {unique_key}
|
SQL ANSI 2008 PostgreSQL SQL Server 2012 Derby Oracle 12c DB2 12 Mimer SQL |
select *
from {table}
order by {unique_key}
LIMIT {rows}
|
select *
from {table}
where {unique_key} > {last_val}
order by {unique_key}
LIMIT {rows}
|
select *
from (
select *
from {table}
where {unique_key} < {first_val}
order by {unique_key} DESC
LIMIT {rows}
) a
order by {unique_key}
|
MySQL SQLite |
select TOP {rows} *
from {table}
order by {unique_key}
|
select TOP {rows} *
from {table}
where {unique_key} > {last_val}
order by {unique_key}
|
select *
from (
select TOP {rows} *
from {table}
where {unique_key} < {first_val}
order by {unique_key} DESC
) a
order by {unique_key}
|
SQL Server 2005 |
SET ROWCOUNT {rows}
select *
from {table}
order by {unique_key}
SET ROWCOUNT 0
|
SET ROWCOUNT {rows}
select *
from {table}
where {unique_key} > {last_val}
order by {unique_key}
SET ROWCOUNT 0
|
SET ROWCOUNT {rows}
select *
from (
select *
from {table}
where {unique_key} < {first_val}
order by {unique_key} DESC
) a
order by {unique_key}
SET ROWCOUNT 0
|
Sybase, SQL Server 2000 |
select *
from (
select *
from {table}
order by {unique_key}
) a
where rownum <= {rows}
|
select *
from (
select *
from {table}
where {unique_key} > {last_val}
order by {unique_key}
) a
where rownum <= {rows}
|
select *
from (
select *
from (
select *
from {table}
where {unique_key} < {first_val}
order by {unique_key} DESC
) a1
where rownum <= {rows}
) a2
order by {unique_key}
|
Oracle 11 |
Hierarkisk forespørgsel
Nogle databaser giver specialiseret syntaks for hierarkiske data .
En vinduesfunktion i SQL: 2003 er en samlet funktion, der anvendes på en partition af resultatsættet.
For eksempel,
sum(population) OVER( PARTITION BY city )
beregner summen af befolkningerne i alle rækker, der har samme by værdi som den aktuelle række.
Partitioner specificeres ved hjælp af OVER -klausulen, der ændrer aggregatet. Syntaks:
<OVER_CLAUSE> :: =
OVER ( [ PARTITION BY <expr>, ... ]
[ ORDER BY <expression> ] )
OVER -klausulen kan opdele og bestille resultatsættet. Ordning bruges til ordre-relative funktioner, f.eks. Row_number.
Forespørgselsevaluering ANSI
Behandlingen af en SELECT -sætning ifølge ANSI SQL ville være følgende:
select g.* from users u inner join groups g on g.Userid = u.Userid where u.LastName = 'Smith' and u.FirstName = 'John'
- FROM -klausulen evalueres, en tværforbindelse eller kartesisk produkt produceres for de to første tabeller i FROM -klausulen, hvilket resulterer i en virtuel tabel som Vtable1
- ON -klausulen evalueres for vtable1; kun poster, der opfylder joinbetingelsen g.Userid = u.Userid indsættes i Vtable2
- Hvis der er angivet en ydre joinforbindelse, tilføjes poster, der blev droppet fra vTable2, til VTable 3, f.eks. Hvis ovenstående forespørgsel var:
alle brugere, der ikke tilhørte nogen grupper, ville blive tilføjet tilbage til Vtable3
select u.* from users u left join groups g on g.Userid = u.Userid where u.LastName = 'Smith' and u.FirstName = 'John'
- WHERE -klausulen evalueres, i dette tilfælde vil kun gruppeoplysninger for bruger John Smith blive tilføjet til vTable4
- GROUP BY evalueres; hvis ovenstående forespørgsel var:
vTable5 ville bestå af medlemmer returneret fra vTable4 arrangeret af gruppen, i dette tilfælde GroupName
select g.GroupName, count(g.*) as NumberOfMembers from users u inner join groups g on g.Userid = u.Userid group by GroupName
- HAVING -klausulen evalueres for grupper, for hvilke HAVING -klausulen er sand, og indsættes i vTable6. For eksempel:
select g.GroupName, count(g.*) as NumberOfMembers from users u inner join groups g on g.Userid = u.Userid group by GroupName having count(g.*) > 5
- SELECT -listen evalueres og returneres som Vtable 7
- DISTINCT -klausulen evalueres; dublerede rækker fjernes og returneres som tabel 8
- ORDER BY -klausulen evalueres, rækkefølgen ordnes og VCursor9 returneres. Dette er en markør og ikke en tabel, fordi ANSI definerer en markør som et ordnet sæt rækker (ikke relationelt).
Understøttelse af vinduesfunktioner fra RDBMS -leverandører
Implementering af vinduesfunktionsfunktioner af leverandører af relationsdatabaser og SQL -motorer adskiller sig voldsomt. De fleste databaser understøtter i det mindste en smag af vinduesfunktioner. Når vi ser nærmere på det, bliver det imidlertid klart, at de fleste leverandører kun implementerer et delsæt af standarden. Lad os tage den kraftfulde RANGE -klausul som et eksempel. Kun Oracle, DB2, Spark/Hive og Google Big Query implementerer denne funktion fuldt ud. For nylig har leverandører tilføjet nye udvidelser til standarden, f.eks. Array -aggregeringsfunktioner. Disse er især nyttige i forbindelse med at køre SQL mod et distribueret filsystem (Hadoop, Spark, Google BigQuery), hvor vi har svagere data-co-lokalitetsgarantier end på en distribueret relationsdatabase (MPP). I stedet for jævnt at distribuere dataene på tværs af alle noder, kan SQL-motorer, der kører forespørgsler mod et distribueret filsystem, opnå data-samlokalitetsgarantier ved at indlejre data og dermed undgå potentielt dyre joins, der involverer kraftig blanding på tværs af netværket. Brugerdefinerede samlede funktioner, der kan bruges i vinduesfunktioner, er en anden ekstremt kraftfuld funktion.
Generering af data i T-SQL
Metode til at generere data baseret på fagforeningen alle
select 1 a, 1 b union all
select 1, 2 union all
select 1, 3 union all
select 2, 1 union all
select 5, 1
SQL Server 2008 understøtter den "rækkonstruktør", der er angivet i standarden SQL3 ("SQL: 1999")
select *
from (values (1, 1), (1, 2), (1, 3), (2, 1), (5, 1)) as x(a, b)
Referencer
Kilder
- Vandret og lodret partitionering, Microsoft SQL Server 2000 Books Online.