Naar inhoud springen

Select (SQL)

Uit Wikipedia, de vrije encyclopedie
Dit is een oude versie van deze pagina, bewerkt door Riki (overleg | bijdragen) op 6 nov 2009 om 20:17. (+sjabloon)
Deze versie kan sterk verschillen van de huidige versie van deze pagina.

Een SELECT-opdracht in SQL geeft een verzameling rijen of records terug uit één of meer tabellen van een databank. Het resultaat van een SELECT-opdracht is dus een nieuwe (zij het virtuele, d.w.z. niet fysisch opgeslagen) tabel.

De opdracht wordt gebruikt om een query uit te voeren die nul of meer rijen ophaalt door data uit één of meer tabellen van een databank te raadplegen en mogelijk te converteren of zelfs samen te vatten. In de meeste toepassingen is SELECT het meest gebruikte Data Manipulation Language-commando (DML) van SQL.

Bij SELECT kan je meestal de volgende sleutelwoorden gebruiken:

  • FROM – het enige syntactisch verplichte sleutelwoord; om aan te geven welke tabel of tabellen ondervraagd wordt/worden.
  • WHERE – gebruikt om op te geven welke rijen moeten worden opgehaald door middel van één of meerdere criteria.
  • GROUP BY – gebruikt om rijen (met dezelfde waarde in de opgegeven expressie) samen te brengen in een kleinere groep rijen.
  • HAVING – gebruikt samen met GROUP BY om te bepalen welke groepen opgehaald moeten worden.
  • ORDER BY – gebruikt om de expressie(s) op te geven op basis waarvan de resultaatgegevens gesorteerd moeten worden.
  • INTO – gebruikt om de rijen te kopiëren naar een nieuw aan te maken tabel of naar één of meerdere variabelen.

Voorbeelden

Tabel "T" Query Resultaat
C1 C2
1 a
2 b
SELECT * FROM T;
C1 C2
1 a
2 b
C1 C2
1 a
2 b
SELECT C1 FROM T;
C1
1
2
C1 C2
1 a
2 b
SELECT * FROM T WHERE C1 = 1;
C1 C2
1 a

Gegeven een tabel T zal de query SELECT * FROM T; alle rijen en alle velden ophalen uit de tabel.

De query SELECT C1 FROM T; zal alleen de kolom C1 ophalen en daarvan alle rijen tonen — in relationele algebra noemt men dit een projectie.

De query SELECT * FROM T WHERE C1 = 1; zal alle kolommen ophalen en alle rijen waarvan de waarde van de kolom C1 gelijk is aan '1' — in relationele algebra heet dit een selectie.

SELECT * INTO nieuwetabel FROM T; zal een nieuwe tabel "nieuwetabel" aanmaken en alle rijen van T daarin plaatsen.

Join

In een SELECT-opdracht kunnen ook twee tabellen samengevoegd worden. Dit gaat door middel van een JOIN. Er zijn twee soorten joins, een inner-join en een outer-join.

Een outer join doet een query op één tabel en zoekt dan bij elk resultaatrecord extra velden van de tweede tabel. De syntaxis is als volgt:

SELECT * FROM tabel1 LEFT OUTER JOIN tabel2 ON tabel1.veld = tabel2.veld

Een outer join garandeert dus de aanwezigheid van alle rijen van de linker tabel (hier tabel1). Een inner join doet dat niet, omdat rijen van tabel1 waarvoor er in tabel2 geen enkele rij gevonden wordt waarvoor tabel1.veld = tabel2.veld niet getoond worden.

Dit kan aangevuld worden met de WHERE-clause en de andere clauses. In de ON-clause wordt gespecificeerd welke velden van de beide tabellen overeen moeten komen. Dit wordt gebruikt om de goede records van de tweede tabel bij de eerste te vinden. Indien geen record in tabel2 gevonden wordt is er toch een resultaatrecord, weliswaar met lege velden (NULLs) in het deel dat uit tabel2 afkomstig is. De sleutelwoordcombinatie RIGHT OUTER JOIN kan ook gebruikt worden. Verwissel in dat geval tabel1 en tabel2 in de uitleg hierboven. Een FULL OUTER JOIN ten slotte garandeert de aanwezigheid van alle rijen van zowel tabel1 als tabel2: het resultaat is dus de UNION van de LEFT OUTER JOIN en de RIGHT OUTER JOIN.

Tabel "T1" Tabel "T2" Query Resultaat
C1 C2
1 a
1 b
2 b
C1 C2
1 x
1 y
3 y
SELECT *
FROM T1
    INNER JOIN
  T2
    ON T1.C1 = T2.C1;
T1.C1 T1.C2 T2.C1 T2.C2
1 a 1 x
1 a 1 y
1 b 1 x
1 b 1 y
SELECT T1.C2, T2.C2
FROM T1
    LEFT OUTER JOIN
  T2
    ON T1.C1 = T2.C1;
T1.C2 T2.C2
a x
a y
b x
b y
b NULL
SELECT T1.C2, T2.C2
FROM T1
    FULL OUTER JOIN
  T2
    ON T1.C1 = T2.C1;
T1.C2 T2.C2
a x
a y
b x
b y
b NULL
NULL y

Een inner-join is in eerste instantie gelijk aan wat men in de verzamelingenleer en in de relationele algebra het cartesisch product noemt. Dit wil zeggen dat het resultaat alle combinaties van records van de eerste tabel met alle records van de tweede tabel bevat. In tweede instantie —na het ON keyword— worden deze records gefilterd zodat enkel de rijen overblijven waarvan de velden, die in de ON-clause gespecificeerd zijn, overeenkomen. De syntaxis is als volgt:

SELECT * FROM tabel1 INNER JOIN tabel2 ON tabel1.veld = tabel2.veld

Het aantal resultaatrecords van een inner-join kan maximaal oplopen tot het aantal records in het cartesisch product. Records van tabel1 waarvoor geen overeenkomstige records in tabel2 worden gevonden, worden niet getoond. Daar hebben we de eerder vermelde OUTER JOIN voor. Anderzijds worden records van tabel1 waarvoor meerdere overeenkomstige records van tabel2 worden gevonden, ook even zoveel keer getoond.

Voorheen werd de inner-join anders geformuleerd, namelijk zonder de ON-clause; de join-informatie stond gewoon in de WHERE-clause. Toen was een vergissing snel gemaakt. Een voorbeeld van de oude notatie:

SELECT * FROM tabel1, tabel2 WHERE tabel1.veld = tabel2.veld

Deze notatie is nog steeds syntactisch correct, en logisch equivalent aan de inner-join.

Zie ook