
Microsoft Access blijft in veel bedrijven het snelle querytool om lokale bestanden of ODBC-bronnen te benutten. De ACE-engine (opvolger van Jet), nog steeds geïntegreerd in Microsoft 365, draait interne applicaties die soms tientallen jaren oud zijn. Leren om SQL-query’s direct in Access te schrijven, helpt om te begrijpen wat de QBE-grid achter de schermen genereert en om in te grijpen wanneer het resultaat niet overeenkomt met wat verwacht wordt.
Jet/ACE SQL en standaard SQL: wat Access accepteert en wat het weigert
De meeste online SQL-tutorials gebruiken MySQL, PostgreSQL of SQL Server als referentie. De voorbeelden werken vaak zoals ze zijn op deze engines, maar niet altijd op Access. Het SQL-dialect van Access (Jet/ACE SQL) heeft bijzonderheden die beginners verwarren die gewend zijn om code van een forum te kopiëren en plakken.
Access ondersteunt geen CTE (WITH) of vensterfuncties die beschikbaar zijn in SQL Server of PostgreSQL. Elke recursieve of analytische query die online wordt gevonden, moet opnieuw worden geschreven, vaak met behulp van geneste subquery’s of tijdelijke opgeslagen query’s.
Daarentegen biedt Access de TRANSFORM-clausule voor kruistabellen, een syntaxis die ontbreekt in de SQL-norm. Deze clausule maakt het mogelijk om rijen naar kolommen te draaien zonder een spreadsheet te gebruiken. Degenen die willen leren SQL-query’s op Access te schrijven, besparen tijd door deze afwijkingen vanaf het begin te identificeren, in plaats van te zoeken waarom een algemeen voorbeeld een syntaxisfout veroorzaakt.
Een andere opmerkelijke verschil: de syntaxis van joins. Access vereist vaak geneste haakjes zodra meerdere JOIN’s in dezelfde query worden aaneengeschakeld, terwijl andere engines een lineaire schrijfwijze accepteren. Het vergeten van deze haakjes veroorzaakt een compilatiefout zonder duidelijke boodschap.

SQL-modus van Access: schakelen van grafisch naar directe invoer
De grafische query-ontwerper (QBE-grid) is het gebruikelijke toegangspunt in Access. Elke actie, zoals het slepen van een veld, het aanvinken van een sorteervakje of het instellen van een criterium, genereert SQL op de achtergrond. Overschakelen naar SQL-modus (tabblad “Weergave” en dan “SQL-modus”) toont de query zoals de ACE-engine deze zal uitvoeren.
Lezen voordat je schrijft
Voordat je een query vanaf nul schrijft, is de meest effectieve methode om de query in grafische modus op te bouwen en vervolgens de geproduceerde SQL te lezen. Deze lezing maakt het mogelijk om elk visueel element (tabel, koppeling, criterium) aan de SQL-vertaling te koppelen. Je herkent snel de structuur SELECT, FROM, WHERE, ORDER BY.
Eenmaal deze overeenkomst verworven, wordt het natuurlijk om de SQL direct te wijzigen. Je voegt een functie toe, vervangt een criterium, voegt een GROUP BY in, alles zonder opnieuw door de grid te gaan.
De basiscommando’s in de context van Access
- SELECT en FROM: velden selecteren uit een of meerdere tabellen. Access gebruikt de punt om de naam van de tabel van de naam van het veld te scheiden (Clients.Nom), en haakjes om namen met spaties of speciale tekens te omringen ([Datum van bestelling]).
- WHERE: records filteren. De klassieke vergelijkingsoperatoren werken, maar de wildcards verschillen: Access gebruikt het sterretje (*) in plaats van het percentage (%) met de LIKE-operator.
- JOIN: tabellen met elkaar verbinden. Access geeft de voorkeur aan de syntaxis INNER JOIN, LEFT JOIN, RIGHT JOIN met de eerder genoemde vereiste voor meerdere haakjes.
- ORDER BY en GROUP BY: sorteren en groeperen. De HAVING-clausule werkt zoals in de standaard SQL, wat het filteren na aggregatie vereenvoudigt.
Veelvoorkomende fouten bij het beginnen met SQL op Access
Bepaalde fouten komen systematisch voor bij beginners. Deze vooraf identificeren voorkomt uren frustrerende debugging.
De eerste betreft de ontbrekende haakjes rond veldnamen. Zodra een kolomnaam een spatie, accent of gereserveerd teken bevat, vereist Access haakjes. Het schrijven van Datum van bestelling in plaats van [Datum van bestelling] veroorzaakt onmiddellijk een fout.
De tweede betreft de gegevenstypen. Access maakt onderscheid tussen dubbele aanhalingstekens voor tekst in bepaalde versies en enkele aanhalingstekens in andere contexten. Het hekje (#) omringt datums: WHERE [Datum van bestelling] > #01/01/2024#. Het gebruik van aanhalingstekens in plaats van het hekje voor een datum is een veelvoorkomende bron van verwarring.
De derde fout betreft meerdere joins. Elke paar JOIN moet in haakjes worden ingekapseld wanneer er meer dan twee tabellen worden overschreden. De foutmelding die Access in dit geval weergeeft, is weinig expliciet, wat veel beginners ertoe aanzet de SQL-query te laten vallen en terug te keren naar de grafische grid.

Vooruitgang boeken voorbij SELECT-query’s op Access
Eenmaal de select-query’s beheerst, opent Access de deur naar actie-query’s: INSERT INTO, UPDATE en DELETE. Deze commando’s functioneren op een vergelijkbare manier als de standaard SQL, met een extra voorzorg: Access voert actie-query’s standaard uit zonder bevestiging te vragen als de waarschuwingen zijn uitgeschakeld in de database-opties.
Eerst testen in select-modus (tijdelijk de UPDATE omzetten in SELECT om de doelrijen te controleren) blijft een goede praktijk voordat je gegevens wijzigt.
Kruistabellen, toegankelijk via de TRANSFORM-clausule, verdienen extra aandacht. Ze maken het mogelijk om een direct bruikbare samenvattingstabel te produceren, zonder export naar Excel. De syntaxis is specifiek voor Access: TRANSFORM gevolgd door de aggregatiefunctie, gevolgd door een klassieke SELECT aangevuld met een PIVOT op het veld dat in kolommen moet worden omgezet.
Voor degenen die Access willen verbinden met externe bronnen (SQL Server, CSV-bestanden via ODBC), zijn passthrough SQL-query’s een geavanceerde optie. Ze sturen de SQL rechtstreeks naar de externe server, waardoor de beperkingen van de ACE-engine worden omzeild. De SQL die in deze modus is geschreven, moet voldoen aan de syntaxis van de doelsserver, niet die van Access.
Het SQL-dialect van Access heeft zijn beperkingen, maar biedt een concrete leermogelijkheid voor degenen die al dagelijks met dit hulpmiddel werken. Het beheersen van de bijzonderheden van Jet/ACE SQL voorkomt dat je blindelings ongeschikte voorbeelden herhaalt en biedt een solide basis om later over te stappen naar krachtigere engines.