Velg (SQL) - Select (SQL)

Den SQL SELECT -setning returnerer et resultat sett med poster, fra en eller flere tabeller .

En SELECT-setning henter null eller flere rader fra en eller flere databasetabeller eller database utsikt . I de fleste applikasjoner SELECTer den mest brukte kommandoen data manipulering språk (DML). Siden SQL er et deklarativt programmeringsspråk , SELECTangir spørringer et resultatsett, men angir ikke hvordan det skal beregnes. Databasen oversetter spørringen til en " spørringsplan " som kan variere mellom henrettelser, databaseversjoner og databaseprogramvare. Denne funksjonaliteten kalles " spørringsoptimereren ", ettersom den er ansvarlig for å finne den best mulige utførelsesplanen for spørringen, innenfor gjeldende begrensninger.

SELECT -setningen har mange valgfrie ledd:

  • SELECTledd er listen over kolonner eller SQL -uttrykk som må returneres av spørringen. Dette er omtrent den relasjons algebra projeksjon drift.
  • ASgir eventuelt et alias for hver kolonne eller uttrykk i SELECTleddet. Dette er den relasjonelle algebra -omdøpsoperasjonen .
  • FROM angir fra hvilken tabell dataene skal hentes.
  • WHEREangir hvilke rader som skal hentes. Dette er omtrent på relasjonsalgebra utvalget drift.
  • GROUP BYgrupper rader som deler en eiendom, slik at en samlet funksjon kan brukes på hver gruppe.
  • HAVING velger blant gruppene definert av GROUP BY -klausulen.
  • ORDER BY angir hvordan du skal bestille de returnerte radene.

Oversikt

SELECTer den vanligste operasjonen i SQL, kalt "spørringen". SELECThenter data fra en eller flere tabeller eller uttrykk. Standard SELECTuttalelser har ingen vedvarende effekter på databasen. Noen ikke-standardiserte implementeringer av SELECTkan ha vedvarende effekter, for eksempel SELECT INTOsyntaksen i noen databaser.

Forespørsler lar brukeren beskrive ønskede data, slik at databasesystemet (DBMS) kan utføre planlegging , optimalisering og utførelse av de fysiske operasjonene som er nødvendige for å produsere det resultatet etter eget valg.

En spørring inneholder en liste over kolonner som skal inkluderes i det endelige resultatet, normalt umiddelbart etter SELECTsøkeordet. En stjerne (" *") kan brukes til å angi at spørringen skal returnere alle kolonnene i tabellene du spør. SELECTer den mest komplekse setningen i SQL, med valgfrie søkeord og setninger som inkluderer:

  • Det FROMpunkt, noe som indikerer tabellen (e) for å hente data fra. Den FROMklausulen kan inneholde valgfrie JOINunderavsnitt for å angi reglene for å bli med tabeller.
  • Den WHEREbestemmelsen inkluderer predikat en sammenligning, noe som begrenser de rader som returneres av spørringen. Den WHEREklausulen eliminerer alle rader fra resultatsettet der sammenligningen predikatet ikke evaluere til True.
  • Den GROUP BYklausulen prosjekter rekker å ha felles verdier i et mindre sett med rader. GROUP BYbrukes ofte sammen med SQL -aggregeringsfunksjoner eller for å eliminere dupliserte rader fra et resultatsett. Den WHEREleddet påføres før GROUP BYleddet.
  • Den HAVINGbestemmelsen inkluderer predikat en brukes til å filtrere rader som følge av GROUP BYleddet. Fordi det virker på resultatene av GROUP BYklausulen, kan aggregeringsfunksjoner brukes i HAVINGklausulpredikatet.
  • De ORDER BYPunkt identifiserer hvilken kolonne [s] for å bruke til å sortere de resulterende data, og i hvilken retning for å sortere dem (stigende eller synkende). Uten en ORDER BYklausul er rekkefølgen på radene som returneres av en SQL -spørring udefinert.
  • De DISTINCTsøkeord eliminerer duplisere data.

Følgende eksempel på en SELECTforespørsel returnerer en liste over dyre bøker. Spørringen henter alle rader fra Book bord der prisen kolonnen inneholder en verdi som er større enn 100,00. Resultatet er sortert i stigende rekkefølge etter tittel . Stjernen (*) i valglisten indikerer at alle kolonnene i Bok tabellen bør inkluderes i resultatsettet.

SELECT *
 FROM  Book
 WHERE price > 100.00
 ORDER BY title;

Eksemplet nedenfor viser en forespørsel om flere tabeller, gruppering og aggregering, ved å returnere en liste over bøker og antall forfattere som er knyttet til hver bok.

SELECT Book.title AS Title,
       count(*) AS Authors
 FROM  Book
 JOIN  Book_author
   ON  Book.isbn = Book_author.isbn
 GROUP BY Book.title;

Eksempelutgang kan ligne på følgende:

Title                  Authors
---------------------- -------
SQL Examples and Guide 4
The Joy of SQL         1
An Introduction to SQL 2
Pitfalls of SQL        1

Under forutsetning at ISBN er den eneste felles kolonne navnet på de to tabellene og at en kolonne som heter tittelen bare eksisterer i Bok bordet, kan man omskrive spørsmålet ovenfor i følgende form:

SELECT title,
       count(*) AS Authors
 FROM  Book
 NATURAL JOIN Book_author
 GROUP BY title;

Imidlertid støtter mange leverandører enten ikke denne tilnærmingen, eller de krever visse konvensjoner om navngivning av kolonner for at naturlige sammenføyninger skal fungere effektivt.

SQL inkluderer operatører og funksjoner for beregning av verdier på lagrede verdier. SQL tillater bruk av uttrykk i valglisten til prosjektdata, som i følgende eksempel, som returnerer en liste over bøker som koster mer enn 100.00 med en ekstra sales_tax kolonne som inneholder en omsetningsavgift tallet beregnet til 6% av prisen .

SELECT isbn,
       title,
       price,
       price * 0.06 AS sales_tax
 FROM  Book
 WHERE price > 100.00
 ORDER BY title;

Underforespørsler

Spørringer kan nestes slik at resultatene av en spørring kan brukes i en annen spørring via en relasjonsoperator eller aggregeringsfunksjon. En nestet forespørsel er også kjent som en undersøkelse . Mens joins og andre bordoperasjoner gir beregningsmessig overlegne (dvs. raskere) alternativer i mange tilfeller, introduserer bruk av undersøkelser et hierarki i utførelsen som kan være nyttig eller nødvendig. I følgende eksempel AVGmottar aggregeringsfunksjonen resultatet av en undersøkelse som input:

SELECT isbn,
       title,
       price
 FROM  Book
 WHERE price < (SELECT AVG(price) FROM Book)
 ORDER BY title;

En undersøkelse kan bruke verdier fra den ytre spørringen, i så fall er den kjent som en korrelert undersøkelse .

Siden 1999 tillater SQL -standarden navngitte underforespørsler kalt vanlige tabelluttrykk (navngitt og designet etter implementering av IBM DB2 versjon 2; Oracle kaller disse subquery factoring ). CTE kan også være rekursive ved å referere til seg selv; den resulterende mekanismen tillater tre- eller grafoverganger (når det er representert som relasjoner), og mer generelt fixpoint -beregninger.

Avledet bord

En avledet tabell er bruken av å referere til en SQL -undersøkelse i en FROM -klausul. I hovedsak er den avledede tabellen en undersøkelse som kan velges fra eller kobles til. Avledet tabellfunksjonalitet lar brukeren referere til undersøkelsen som en tabell. Den avledede tabellen blir også referert til som en innebygd visning eller en velg fra listen .

I det følgende eksemplet innebærer SQL -setningen en sammenføyning fra den første boktabellen til den avledede tabellen "Salg". Denne avledede tabellen fanger tilhørende boksalgsinformasjon ved hjelp av ISBN for å bli med i bøkertabellen. Som et resultat, gir den avledede tabellen resultatsettet med flere kolonner (antall solgte varer og selskapet som solgte bøkene):

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

Tabell "T" Spørsmål Resultat
C1 C2
1 en
2 b
SELECT * FROM T;
C1 C2
1 en
2 b
C1 C2
1 en
2 b
SELECT C1 FROM T;
C1
1
2
C1 C2
1 en
2 b
SELECT * FROM T WHERE C1 = 1;
C1 C2
1 en
C1 C2
1 en
2 b
SELECT * FROM T ORDER BY C1 DESC;
C1 C2
2 b
1 en
eksisterer ikke SELECT 1+1, 3*2;
`1+1` `3*2`
2 6

Gitt en tabell T, vil spørringen resultere i at alle elementene i alle radene i tabellen vises. SELECT * FROM T

Med den samme tabellen vil spørringen resultere i at elementene fra kolonnen C1 i alle radene i tabellen vises. Dette ligner på en projeksjon i relasjonsalgebra , bortsett fra at i det generelle tilfellet kan resultatet inneholde dupliserte rader. Dette er også kjent som en vertikal partisjon i noen databasetermer, som begrenser utdata fra spørringen til å vise bare angitte felt eller kolonner. SELECT C1 FROM T

Med den samme tabellen vil spørringen resultere i at alle elementene i alle radene der verdien i kolonne C1 er '1' vises - i relasjonsalgebra -termer vil et valg bli utført på grunn av WHERE -leddet. Dette er også kjent som en horisontal partisjon, som begrenser rader som sendes ut av en spørring i henhold til angitte betingelser. SELECT * FROM T WHERE C1 = 1

Med mer enn én tabell vil resultatsettet være hver kombinasjon av rader. Så hvis to tabeller er T1 og T2, vil det resultere i hver kombinasjon av T1 -rader med hver T2 -rad. For eksempel, hvis T1 har 3 rader og T2 har 5 rader, vil det resultere i 15 rader. SELECT * FROM T1, T2

Selv om det ikke er i standard, tillater de fleste DBMS å bruke en valgt klausul uten en tabell ved å late som om en imaginær tabell med en rad brukes. Dette brukes hovedsakelig til å utføre beregninger der en tabell ikke er nødvendig.

SELECT -setningen spesifiserer en liste over egenskaper (kolonner) etter navn, eller jokertegnet ("*") som betyr "alle egenskaper".

Begrensning av resultatrader

Ofte er det praktisk å angi et maksimalt antall rader som returneres. Dette kan brukes til testing eller for å forhindre bruk av for store ressurser hvis spørringen returnerer mer informasjon enn forventet. Tilnærmingen for å gjøre dette varierer ofte per leverandør.

I ISO SQL: 2003 kan resultatsett begrenses ved bruk

ISO SQL: 2008 introduserte FETCH FIRSTklausulen.

I følge PostgreSQL v.9 -dokumentasjonen utfører en SQL -vindusfunksjon "en beregning på tvers av et sett med tabellrader som på en eller annen måte er relatert til den nåværende raden", på en måte som ligner på aggregerte funksjoner. Navnet minnes signalprosesseringsvindusfunksjoner . Et vindusfunksjonsanrop inneholder alltid en OVER -klausul.

ROW_NUMBER () vindusfunksjon

ROW_NUMBER() OVERkan brukes til en enkel tabell på de returnerte radene, f.eks. for å returnere ikke mer enn ti rader:

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, hver gang du kjører spørringen, er det mulig å få forskjellige radnummer tilordnet alle rader der sort_key er den samme. Når sort_key er unik, vil hver rad alltid få et unikt radnummer.

RANK () vindusfunksjon

Den RANK() OVERvindusfunksjon fungerer som ROW_NUMBER, men kan komme tilbake mer eller mindre enn n rader i tilfelle av tie betingelser, for eksempel for å returnere de øverste 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

Koden ovenfor kan returnere mer enn ti rader, f.eks. Hvis det er to personer på samme alder, kan den returnere elleve rader.

FETCH FIRST -klausul

Siden ISO SQL: 2008 -resultatgrenser kan spesifiseres som i følgende eksempel ved å bruke FETCH FIRSTklausulen.

SELECT * FROM T 
FETCH FIRST 10 ROWS ONLY

Denne klausulen støttes for tiden av CA DATACOM/DB 11, IBM DB2, SAP SQL Anywhere, PostgreSQL, EffiProz, H2, HSQLDB versjon 2.0, Oracle 12c og Mimer SQL .

Microsoft SQL Server 2008 og høyere støtterFETCH FIRST , men det regnes som en del av ORDER BYklausulen. Alle ORDER BY, OFFSETog FETCH FIRSTklausuler kreves for denne bruken.

SELECT * FROM T 
ORDER BY acolumn DESC OFFSET 0 ROWS FETCH FIRST 10 ROWS ONLY

Ikke-standard syntaks

Noen DBMS tilbyr ikke-standard syntaks enten i stedet for eller i tillegg til SQL standardsyntaks. Nedenfor er varianter av den enkle grensespørringen for forskjellige DBMSer listet opp:

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 gjør det)
SELECT * FROM T 
LIMIT 10 OFFSET 20
Netezza , MySQL , MariaDB , SAP SQL Anywhere , PostgreSQL (støtter også standarden siden versjon 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 (radnummer filtreres etter at ordre etter er evaluert. SKIP -klausul ble introdusert 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 (hopper over 20, leverer neste 10)
SELECT TOP 10 START AT 20 * FROM T SAP SQL Anywhere (støtter også standarden siden versjon 9.0.1)
SELECT FIRST 10 SKIP 20 * FROM T Firebird
SELECT * FROM T
ROWS 20 TO 30
Firebird (siden versjon 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 rader filtreres etter sammenligning med nøkkelkolonnen i tabell T)

Rader paginering

Rader paginering er en tilnærming som brukes til å begrense og vise bare en del av de totale dataene til et søk i databasen. I stedet for å vise hundrevis eller tusenvis av rader samtidig, blir serveren bedt om bare én side (et begrenset sett med rader, for eksempel bare 10 rader), og brukeren begynner å navigere ved å be om den neste siden, og deretter den neste , og så videre. Det er veldig nyttig, spesielt i nettsystemer, der det ikke er noen dedikert forbindelse mellom klienten og serveren, så klienten trenger ikke å vente med å lese og vise alle radene på serveren.

Data i pagineringstilnærming

  • {rows} = Antall rader på en side
  • {page_number} = Nummer på gjeldende side
  • {begin_base_0} = Nummeret på raden - 1 der siden starter = (sidenummer -1) * rader

Enkleste metode (men veldig ineffektiv)

  1. Velg alle radene fra databasen
  2. Les alle radene, men send til visning bare når radnummeret til radene som er lest er mellom {begin_base_0 + 1}og{begin_base_0 + rows}
Select * 
from {table} 
order by {unique_key}

En annen enkel metode (litt mer effektiv enn å lese alle radene)

  1. Velg alle radene fra begynnelsen av tabellen til den siste raden for å vise ( {begin_base_0 + rows})
  2. Les {begin_base_0 + rows}radene, men send til visning bare når radnummeret til radene som er lest er større enn{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 posisjonering

  1. Velg bare {rows}rader som starter fra neste rad for å vise ( {begin_base_0 + 1})
  2. Les og send for å vise alle radene som er lest 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 mer sofistikert, men nødvendig for veldig store datasett)

  1. Velg bare {rows}rader med filter:
    1. Første side: Velg bare de første {rows}radene, avhengig av databasetype
    2. Neste side: Velg bare de første {rows}radene, avhengig av databasetypen, der den {unique_key}er større enn {last_val}(verdien {unique_key}av den siste raden på den gjeldende siden)
    3. Forrige side: sorter dataene i motsatt rekkefølge, velg bare de første {rows}radene, der verdien {unique_key}er mindre enn {first_val}(verdien {unique_key}til den første raden på gjeldende side), og sorter resultatet i riktig rekkefølge
  2. Les og send for å vise alle radene som er lest fra databasen
Første side Neste 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 spørring

Noen databaser gir spesialisert syntaks for hierarkiske data .

En vindusfunksjon i SQL: 2003 er en samlet funksjon som brukes på en partisjon av resultatsettet.

For eksempel,

sum(population) OVER( PARTITION BY city )

beregner summen av populasjonene i alle radene som har samme sentrum verdi som den aktuelle rad.

Partisjoner er spesifisert ved bruk av OVER -klausulen som endrer aggregatet. Syntaks:

<OVER_CLAUSE> :: =
   OVER ( [ PARTITION BY <expr>, ... ]
          [ ORDER BY <expression> ] )

OVER -klausulen kan partisjonere og bestille resultatsettet. Bestilling brukes til ordrerelaterte funksjoner som radnummer.

Spørreevaluering ANSI

Behandlingen av en SELECT -setning i henhold til ANSI SQL vil være følgende:

  1. select g.*
    from users u inner join groups g on g.Userid = u.Userid
    where u.LastName = 'Smith'
    and u.FirstName = 'John'
    
  2. FROM -klausulen evalueres, en kryssforbindelse eller et kartesisk produkt produseres for de to første tabellene i FROM -klausulen, noe som resulterer i en virtuell tabell som Vtable1
  3. ON -klausulen er evaluert for vtable1; bare poster som oppfyller betingelsen g.Userid = u.Userid settes inn i Vtable2
  4. Hvis det er angitt en ytre sammenføyning, blir poster som ble slettet fra vTable2 lagt til i VTable 3, for eksempel hvis spørringen ovenfor var:
    select u.*
    from users u left join groups g on g.Userid = u.Userid
    where u.LastName = 'Smith'
    and u.FirstName = 'John'
    
    alle brukere som ikke tilhørte noen grupper, ville bli lagt tilbake til Vtable3
  5. WHERE -klausulen evalueres, i dette tilfellet vil bare gruppeinformasjon for bruker John Smith bli lagt til vTable4
  6. GROUP BY evalueres; hvis spørringen ovenfor var:
    select g.GroupName, count(g.*) as NumberOfMembers
    from users u inner join groups g on g.Userid = u.Userid
    group by GroupName
    
    vTable5 ville bestå av medlemmer returnert fra vTable4 arrangert av grupperingen, i dette tilfellet GroupName
  7. HAVING -klausulen evalueres for grupper som HAVING -klausulen er sann for, og settes inn 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
    
  8. SELECT -listen evalueres og returneres som tabell 7
  9. DISTINCT -klausulen evalueres; dupliserte rader fjernes og returneres som tabell 8
  10. ORDER BY -klausulen evalueres, bestiller radene og returnerer VCursor9. Dette er en markør og ikke en tabell fordi ANSI definerer en markør som et ordnet sett med rader (ikke relasjonelt).

Støtte for vindusfunksjoner av RDBMS -leverandører

Implementeringen av vindusfunksjoner fra leverandører av relasjonsdatabaser og SQL -motorer er veldig forskjellig. De fleste databaser støtter minst en smak av vindusfunksjoner. Når vi ser nærmere på det, blir det imidlertid klart at de fleste leverandører bare implementerer et delsett av standarden. La oss ta den kraftige RANGE -klausulen som et eksempel. Bare Oracle, DB2, Spark/Hive og Google Big Query implementerer denne funksjonen fullt ut. Mer nylig har leverandører lagt til nye utvidelser til standarden, f.eks. Array -aggregeringsfunksjoner. Disse er spesielt nyttige i sammenheng med å kjøre SQL mot et distribuert filsystem (Hadoop, Spark, Google BigQuery) der vi har svakere data-samlokalitetsgarantier enn på en distribuert relasjonsdatabase (MPP). I stedet for å fordele dataene jevnt på tvers av alle noder, kan SQL-motorer som kjører forespørsler mot et distribuert filsystem, oppnå data-samlokalitetsgarantier ved å hekke data og dermed unngå potensielt dyre sammenføyninger som involverer kraftig blanding over nettverket. Brukerdefinerte aggregerte funksjoner som kan brukes i vindusfunksjoner er en annen ekstremt kraftig funksjon.

Generere data i T-SQL

Metode for å generere data basert 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 støtter "radkonstruktøren" spesifisert i SQL3 -standarden ("SQL: 1999")

select *
from (values (1, 1), (1, 2), (1, 3), (2, 1), (5, 1)) as x(a, b)

Referanser

Kilder

  • Horisontal og vertikal partisjonering, Microsoft SQL Server 2000 Books Online.

Eksterne linker