Wanneer u gegevens wilt ophalen uit een database, doet u dit met behulp van Structured Query Language, of SQL. SQL is een computertaal die sterk lijkt op gewoon Engels, maar die wordt begrepen door databaseprogramma's. Elke query die u uitvoert, maakt achter de schermen gebruik van SQL.
Als u weet hoe SQL werkt, kunt u betere query's maken. Bovendien is het dan vaak eenvoudiger om een query aan te passen die niet helemaal het juiste resultaat oplevert.
Dit artikel maakt deel uit van een reeks artikelen over Access SQL. In dit artikel wordt het basisgebruik van SQL voor het selecteren van gegevens beschreven en worden voorbeelden gebruikt om de SQL-syntaxis te illustreren.
In dit artikel
Wat is SQL?
SQL is een computertaal voor het werken met feitenverzamelingen en de relaties tussen die verzamelingen. Relationele databaseprogramma's, zoals Microsoft Office Access, gebruiken SQL om te werken met gegevens. In tegenstelling tot veel andere computertalen, is SQL niet moeilijk om te lezen en te begrijpen, zelfs niet voor beginners. Net als veel computertalen is SQL een internationale standaard die wordt erkend door standaarden zoals ISO en ANSI.
U gebruikt SQL om sets gegevens te beschrijven die kunnen helpen om bepaalde vragen te beantwoorden. Wanneer u SQL gebruikt, moet u de juiste syntaxis gebruiken. Syntaxis verwijst naar de set regels waarmee de elementen van een taal correct kunnen worden gecombineerd. De SQL-syntaxis is gebaseerd op de syntaxis van de Engelse taal en bevat veel elementen die ook worden gebruikt in de syntaxis van Visual Basic for Applications (VBA).
Hieronder ziet u bijvoorbeeld een eenvoudige SQL-instructie waarmee een lijst met achternamen wordt opgehaald van contactpersonen met de voornaam Mary:
SELECT Last_Name
FROM Contacts WHERE First_Name = 'Mary';
Opmerking: SQL kan niet alleen worden gebruikt voor het manipuleren van gegevens, maar ook voor het maken en aanpassen van het ontwerp van databaseobjecten, zoals tabellen. Het onderdeel van SQL dat wordt gebruikt voor het maken en wijzigen van databaseobjecten, wordt DDL (Data Definition Language) genoemd. DDL komt niet aan bod in dit onderwerp. Zie voor meer informatie het artikel Tabellen of indexen maken of wijzigen met een definitiequery.
SELECT-instructies
Als u een set gegevens wilt beschrijven met behulp van SQL, schrijft u een SELECT-instructie. Een SELECT-instructie bevat een gedetailleerde beschrijving van een set gegevens die u wilt ophalen uit een database. De beschrijving bevat deze informatie:
-
In welke tabellen de gegevens zijn opgeslagen.
-
Hoe de gegevens uit verschillende bronnen zijn gerelateerd.
-
Welke velden of berekeningen de gegevens opleveren.
-
Criteria waaraan gegevens moeten voldoen om te worden geretourneerd.
-
Of en hoe de resultaten moeten worden gesorteerd.
SQL-componenten
Net zoals een zin bestaat een SQL-instructie uit componenten. Elke component voert een functie uit voor de SQL-instructie. Sommige componenten zijn vereist in een SELECT-instructie. De volgende tabel geeft een overzicht van de belangrijkste SQL-componenten.
SQL-component |
Resultaat |
Vereist |
SELECT |
Vermelding van de velden die de gewenste gegevens bevatten. |
Ja |
FROM |
Vermelding van de tabellen met de velden die in de SELECT-component worden vermeld. |
Ja |
WHERE |
Aanduiding van veldcriteria waaraan moet worden voldaan door elke record die in de resultaten moet worden opgenomen. |
Nee |
ORDER BY |
Aanduiding hoe de resultaten worden gesorteerd. |
Nee |
GROUP BY |
In een SQL-instructie met statistische functies vermelding van de velden die niet in de SELECT-component worden samengevat. |
Alleen als er sprake is van dergelijke velden |
HAVING |
In een SQL-instructie met statistische functies vermelding van de voorwaarden die gelden voor velden die in de SELECT-component worden samengevat. |
Nee |
SQL-termen
Elke SQL-component is opgebouwd uit termen, vergelijkbaar met woordsoorten. In de volgende tabel ziet u de typen SQL-termen.
SQL-term |
Vergelijkbare woordsoort |
Definitie |
Voorbeeld |
aanduiding |
zelfstandig naamwoord |
Een naam waarmee een databaseobject wordt aangeduid, zoals de naam van een veld. |
Klanten.[Telefoonnummer] |
operator |
werkwoord of bijwoord |
Een sleutelwoord waarmee een actie wordt aangeduid of gewijzigd. |
AS |
constante |
zelfstandig naamwoord |
Een waarde die niet wordt gewijzigd, zoals een getal of NULL. |
42 |
expressie |
bijvoeglijk naamwoord |
Een combinatie van aanduidingen, operators, constanten en functies die leidt tot één enkele waarde. |
>= Producten.[Prijs per eenheid] |
Basiscomponenten van SQL: SELECT, FROM en WHERE
Een SQL-instructie heeft deze algemene notatie:
SELECT field_1
FROM table_1 WHERE criterion_1 ;
Notities:
-
Regeleinden in een SQL-instructie worden genegeerd in Access. Het kan echter handig zijn om elke component op een aparte regel te plaatsen om zo de leesbaarheid van uw SQL-instructies te verbeteren, niet alleen voor uzelf maar ook voor anderen.
-
Elke SELECT-instructie eindigt op een puntkomma (;). Deze staat aan het einde van de laatste component of op een afzonderlijke regel aan het einde van de SQL-instructie.
Een voorbeeld in Access
Hieronder ziet u een voorbeeld van een eenvoudige SELECT-instructie van SQL in Access:
1. SELECT-component
2. FROM-component
3. WHERE-component
Deze SQL-instructie wordt als volgt geïnterpreteerd: 'Selecteer de gegevens die zijn opgeslagen in de velden E-mail Address en Company in de tabel met de naam Contacts, maar alleen voor records waarvan het veld City de waarde Seattle bevat'.
Laten we de SQL-syntaxis eens nader bestuderen door de componenten van dit voorbeeld één voor één te bespreken.
De SELECT-component
SELECT [E-mail Address], Company
Dit is de SELECT-component. Deze bestaat uit een operator (SELECT), gevolgd door twee aanduidingen ([E-mail Address] en Company).
Als een aanduiding spaties of speciale tekens bevat (zoals 'E-mail Address'), moet u de aanduiding tussen vierkante haken zetten.
Een SELECT-component hoeft niet te verwijzen naar de tabellen met de velden en kan niet de voorwaarden opgeven waaraan moet worden voldaan door de geretourneerde gegevens.
De SELECT-component staat altijd vóór de FROM-component in een SELECT-instructie.
De FROM-component
FROM Contacts
Dit is de FROM-component. Deze bestaat uit een operator (FROM), gevolgd door een aanduiding (Contacts).
Een FROM-component bevat niet de velden die moeten worden geselecteerd.
De WHERE-component
WHERE City="Seattle"
Dit is de WHERE-component. Deze component bestaat uit een operator (WHERE), gevolgd door een expressie (City="Seattle").
Opmerking: In tegenstelling tot de componenten SELECT en FROM, is de WHERE-component geen vereist element van een SELECT-instructie.
SELECT-, FROM- en WHERE-componenten worden gebruikt in veel van de acties die u met SQL kunt uitvoeren. Raadpleeg deze andere artikelen in de reeks voor meer informatie over het gebruiken van deze componenten:
De resultaten sorteren: ORDER BY
Net als in Microsoft Excel kunt u in Access queryresultaten sorteren in een gegevensblad. U kunt ook in de query opgeven hoe u de resultaten wilt sorteren wanneer de query wordt uitgevoerd, met behulp van een ORDER BY-component. Als u een ORDER BY-component gebruikt, is dit de laatste component in de SQL-instructie.
Een ORDER BY-component bevat een lijst met de velden die u wilt gebruiken voor het sorteren, in de volgorde waarin u de sorteerbewerkingen wilt toepassen.
Stel dat u de resultaten eerst in aflopende volgorde wilt sorteren op de waarde van het veld Company en daarna, als er records zijn met dezelfde waarde voor Company, in oplopende volgorde op de waarden in het veld E-mail Address. De ORDER BY-component ziet er dan zo uit:
ORDER BY Company DESC, [E-mail Address]
Opmerking: De standaardinstelling in Access is dat waarden in oplopende volgorde (A-Z, klein naar groot) worden gesorteerd. Gebruik het sleutelwoord DESC om waarden in aflopende volgorde te sorteren.
Zie het onderwerp ORDER BY, component voor meer informatie over de component ORDER BY.
Werken met samengevatte gegevens: GROUP BY en HAVING
Soms wilt u werken met samengevatte gegevens, zoals de totale verkopen in een maand of de duurste items op voorraad. Dit kan door een statistische functie toe te passen op een veld in de SELECT-component. Als u bijvoorbeeld een query wilt maken om het aantal e-mailadressen voor elk bedrijf op te vragen, maakt u een SELECT-component die er zo uitziet:
SELECT COUNT([E-mail Address]), Company
De statistische functies die u kunt gebruiken, worden bepaald door het type gegevens in het veld of de expressie die u wilt gebruiken. Zie Statistische SQL-functies voor meer informatie over de beschikbare statistische functies.
Velden opgeven die niet worden gebruikt in een statistische functie: de GROUP BY-component
Wanneer u statistische functies gebruikt, moet u meestal ook een GROUP BY-component maken. Een GROUP BY-component bevat alle velden die u wilt uitsluiten voor een statistische functie. Als u statistische functies wilt toepassen op alle velden in een query, hoeft u geen GROUP BY-component te maken.
Een GROUP BY-component staat direct na de WHERE-component, of de FROM-component als de instructie geen WHERE-component bevat. Een GROUP BY-component bevat de velden zoals deze worden weergegeven in de SELECT-component.
Als we het bovenstaande voorbeeld nemen en met de SELECT-component een statistische functie toepassen op [E-mail Address] maar niet op Company, ziet de GROUP BY-component er als volgt uit:
GROUP BY Company
Zie het onderwerp GROUP BY, component voor meer informatie over de component GROUP BY.
Aggregatiewaarden beperken met behulp van groepscriteria: de HAVING-component
Als u met behulp van criteria de queryresultaten wilt beperken, kunt u geen WHERE-component gebruiken als het veld waarop u criteria wilt toepassen in een statistische functie wordt gebruikt. In plaats daarvan kunt u een HAVING-component gebruiken. Een HAVING-component werkt hetzelfde als een WHERE-component, maar wordt gebruikt voor geaggregeerde gegevens.
Stel dat u de functie COUNT (om het aantal items te tellen) gebruikt met het eerste veld in de SELECT-component:
SELECT COUNT([E-mail Address]), Company
Als u het resultaat van de query wilt beperken op basis van de uitkomst van de functie COUNT, kunt u geen criteria voor dat veld gebruiken in de WHERE-component. In plaats daarvan plaatst u de criteria in een HAVING-component. Als de query bijvoorbeeld alleen rijen moet retourneren als er meer dan één e-mailadres is gekoppeld aan het bedrijf, kunt u een HAVING-component zoals deze gebruiken:
HAVING COUNT([E-mail Address])>1
Opmerking: Een query kan een WHERE-component en een HAVING-component hebben. Criteria voor velden die niet worden gebruikt in een statistische functie plaatst u in de WHERE-component en criteria voor velden die worden gebruikt met statistische functies voegt u toe aan de HAVING-component.
Zie het onderwerp HAVING, component voor meer informatie over de HAVING-component.
Queryresultaten combineren: UNION
Als u in een gecombineerde set alle gegevens wilt bekijken die het resultaat zijn van verschillende vergelijkbare selectiequery's, gebruikt u de operator UNION.
Met de operator UNION kunt u twee SELECT-instructies combineren. Deze instructies moeten evenveel uitvoervelden hebben die in dezelfde volgorde staan en met dezelfde of compatibele gegevenstypen. Wanneer u de query uitvoert, worden gegevens uit elke set corresponderende velden in één uitvoerveld gecombineerd, zodat de queryuitvoer hetzelfde aantal velden heeft als elk van de SELECT-instructies.
Opmerking: Voor een samenvoegquery zijn de gegevenstypen Numeriek en Tekst compatibel.
Wanneer u de operator UNION gebruikt, kunt u ook aangeven of de queryresultaten dubbele rijen moeten bevatten (als die bestaan). Hiervoor gebruikt u het trefwoord ALL.
Dit is de basissyntaxis voor een samenvoegquery waarin twee SELECT-instructies worden gecombineerd:
SELECT field_1
FROM table_1 UNION [ALL] SELECT field_a FROM table_a ;
Stel dat u een tabel Products hebt en een tabel Services. Beide tabellen hebben velden met de naam van het product of de service, de prijs, waarborg- of garantiebeschikbaarheid en of het een exclusief aanbod betreft. Hoewel de tabel Products waarborginformatie bevat en de tabel Services garantie-informatie, gaat het in wezen om dezelfde informatie (namelijk of een specifiek product of specifieke service met een belofte van kwaliteit wordt geleverd). U kunt de vier velden uit de twee tabellen combineren met een samenvoegquery zoals hieronder:
SELECT name, price, warranty_available, exclusive_offer
FROM Products UNION ALL SELECT name, price, guarantee_available, exclusive_offer FROM Services ;
Zie De resultaten van verschillende query's combineren met een samenvoegquery voor meer informatie over het combineren van SELECT-instructies met behulp van de operator UNION.