SQL SELECT: query's uitvoeren

Leer vragen te beantwoorden met de gegevens in één databasetabel. Kies kolommen met SELECT en FROM, behoud de gewenste rijen met WHERE, vergelijkingsoperatoren, AND, OR en NOT, en selecteer op lijsten, bereiken en tekstpatronen met IN, BETWEEN en LIKE. Zoek en verwerk ontbrekende waarden met IS NULL, geef unieke waarden weer met DISTINCT en sorteer en beperk resultaten met ORDER BY en LIMIT. De voorbeelden gebruiken SQL die werkt in SQLite en PostgreSQL, inclusief de veelgebruikte LIMIT-clausule, met toelichtingen op de standaardvorm en de verschillen in MySQL, SQL Server en Oracle.

BeginnerLes 2 van 6 in SQL: de basis

Wat je leert

  1. Schrijf query's die gekozen kolommen uit één tabel lezen, begrijp de resultaatset die ze opleveren en geef unieke waarden in een kolom weer met DISTINCT.
    • Schrijf een eenvoudige SELECT-query
      Geef met SELECT aan welke kolommen je wilt weergeven en met FROM welke tabel je wilt lezen, volg de elementaire syntaxisregels en weet hoe het resultaat eruitziet.
    • Geef unieke waarden weer met DISTINCT
      Verwijder herhaalde rijen uit een resultaat met SELECT DISTINCT en voorspel hoeveel rijen overblijven, ook bij meerdere kolommen of ontbrekende waarden.
  2. Behoud alleen de rijen die een vraag beantwoorden door voorwaarden te schrijven met vergelijkingsoperatoren voor getallen, tekst en datums en door voorwaarden te combineren met AND, OR en NOT.
    • Vergelijk getallen met vergelijkingsoperatoren
      Gebruik WHERE met =, <>, <, >, <= en >= om rijen op numerieke waarden te selecteren en kies de juiste operator bij de formulering van een vraag.
    • Vergelijk tekst en datums op de juiste manier
      Schrijf tekst- en datumwaarden in de juiste vorm, voorspel hoe hoofdlettergebruik, alfabetische volgorde en datumnotaties een vergelijking beïnvloeden en vermijd de gebruikelijke fouten met aanhalingstekens en datums.
    • Combineer voorwaarden met AND, OR en NOT
      Verbind meerdere voorwaarden met AND en OR, keer een voorwaarde om met NOT en gebruik haakjes zodat de query precies test wat de vraag vraagt.
  3. Maak voorwaarden korter en preciezer met IN voor lijsten met waarden, BETWEEN voor bereiken en LIKE voor tekstpatronen, inclusief hun NOT-vormen en de gebruikelijke valkuilen.
    • Selecteer waarden uit een lijst met IN
      Gebruik IN en NOT IN om rijen te behouden waarvan de waarde een van meerdere opgegeven waarden is, en weet hoe lijsten samengaan met AND en met ontbrekende waarden.
    • Selecteer een bereik met BETWEEN
      Gebruik BETWEEN en NOT BETWEEN voor bereiken van getallen, datums en tekst, en weet dat beide grenswaarden zijn inbegrepen en waar dat tot fouten leidt.
    • Zoek tekstpatronen met LIKE
      Zoek tekst die met bepaalde tekens begint, ermee eindigt of ze bevat met LIKE en % en _, en ga om met hoofdlettergevoeligheid, letterlijke jokertekens en ontbrekende waarden.
  4. Herken NULL als een ontbrekende waarde, vind deze met IS NULL en IS NOT NULL en voorspel hoe ontbrekende waarden het resultaat van alle andere soorten voorwaarden veranderen.
    • Zoek ontbrekende waarden met IS NULL
      Maak onderscheid tussen NULL, nul en lege tekst, en gebruik IS NULL en IS NOT NULL om rijen te vinden waarin een waarde wel of niet is vastgelegd.
    • Voorspel hoe NULL voorwaarden beïnvloedt
      Pas driewaardige logica (waar, onwaar, onbekend) toe op vergelijkingen, AND, OR, NOT, IN, BETWEEN en LIKE en bepaal of rijen met ontbrekende waarden in een antwoord thuishoren.
  5. Zet resultaatrijen in een zinvolle volgorde met ORDER BY, sorteer op meerdere kolommen en ga daarbij om met gelijke en ontbrekende waarden, en haal de eerste rijen of één pagina met rijen op met LIMIT en OFFSET.
    • Sorteer rijen met ORDER BY
      Sorteer een resultaat op één kolom in oplopende of aflopende volgorde en voorspel hoe getallen, datums en tekst worden geordend.
    • Sorteer op meerdere kolommen en ga om met gelijke waarden en NULL-waarden
      Sorteer op meerdere kolommen met voor elke kolom een richting, voeg aanvullende sorteerkolommen toe voor een herhaalbare volgorde en bepaal waar ontbrekende waarden verschijnen.
    • Haal de eerste rijen en pagina's op met LIMIT en OFFSET
      Haal de eerste paar rijen van een gesorteerd resultaat op met LIMIT, sla rijen over met OFFSET om latere pagina's te tonen en schrijf hetzelfde verzoek in andere SQL-dialecten.
  6. Combineer alle clausules tot correcte, leesbare query's, begrijp in welke volgorde een query wordt verwerkt en zet alledaagse vragen om in query's waarvan je de resultaten controleert.
    • Zet de clausules in de juiste volgorde en begrijp hoe een query wordt verwerkt
      Schrijf SELECT, FROM, WHERE, ORDER BY en LIMIT in de vereiste volgorde en gebruik de logische verwerkingsvolgorde om te voorspellen welke gegevens elke clausule kan gebruiken.
    • Zet een vraag om in een query en controleer het antwoord
      Zet een alledaagse vraag stap voor stap om in een query op één tabel en controleer het resultaat daarna op grenswaarden, ontbrekende waarden, hoofdlettergebruik en gelijke waarden.

SQL SELECT: uitleg

6 hoofdstukken

1

Kies de gegevens die je wilt weergeven

Een bruikbare query begint met het kiezen van de tabel en de kolommen die je vraag beantwoorden. Het resultaat kan elk record tonen, enkele velden uit elk record of een lijst met verschillende waarden. Je werkt met twee kleine tabellen, zodat je elk resultaat kunt terugvoeren op de opgeslagen gegevens. Door de kolomnamen zorgvuldig te lezen en onderscheid te maken tussen kolomvolgorde en rijvolgorde, begrijp je latere filters en sorteringen makkelijker.

1.1 SELECT, FROM en de resultaattabel

Een query vraagt gegevens op uit een database. Een gewone SELECT-query leest de opgeslagen tabel zonder die te veranderen. SELECT geeft aan welke kolommen worden weergegeven en FROM welke tabel wordt gelezen.

De tekstvoorbeelden gebruiken gewone hoofdlettergevoelige gelijkheidsvergelijkingen in SQLite en PostgreSQL. Instellingen voor sorteerregels kunnen veranderen hoe tekst wordt vergeleken en gesorteerd.

Twee tabellen om mee te werken

De tabel employees bevat deze acht rijen. salary is het jaarsalaris in euro; hire_date is tekst in de vorm YYYY-MM-DD. NULL duidt een ontbrekende waarde aan.

employee_idfirst_namelast_namedepartmentcitysalaryhire_datephone
1AnaLopezSalesChicago52.0002019-03-15312-555-0147
2BenCarterITDenver71.0002021-07-01NULL
3ChloeNguyenSalesChicago48.0002023-01-09312-555-0198
4DavidKimMarketingBoston60.0002020-11-23617-555-0110
5EmmaBrownSalesDenver65.0002018-05-30NULL
6FaridHaddadITChicago83.0002017-09-12312-555-0175
7GraceOkaforNULLBoston45.0002024-02-19617-555-0133
8HugoO'NeillMarketingChicago58.0002022-08-05NULL

De tabel products legt prijzen in euro en voorraad in magazijneenheden vast.

product_idnamecategorypricestock
1Desk LampLighting24,9940
2Floor LampLighting89,0012
3Lamp ShadeLighting15,500
4Office ChairFurniture149,008
5Standing DeskFurniture349,005
6Desk OrganizerStorage18,7560
7BookshelfFurniture120,00NULL
8Paper TrayStorage9,9925
Lees de opbouw van de query
SELECT city, first_name
FROM employees;

De resultaatset is een andere tabel: acht rijen en twee kolommen, met city voorop. Er is geen filter, dus elke medewerker levert een rij op. SQL garandeert geen rijvolgorde totdat je ORDER BY toevoegt.

SELECT * FROM products; toont alle kolommen in de volgorde waarin ze in de tabel zijn gedefinieerd. De ster is handig om te verkennen. Als je in een opgeslagen query de kolommen bij naam noemt, blijft het resultaat gericht en verandert de vorm niet als een nieuwe kolom aan de tabel wordt toegevoegd.

Maak de syntaxis leesbaar

Scheid kolommen met komma's, zonder afsluitende komma vóór FROM. Sluit de instructie af met een puntkomma. Sleutelwoorden zijn niet hoofdlettergevoelig, dus select werkt, maar door hoofdletters zijn clausules makkelijk te vinden. Spaties en regeleinden scheiden woorden; ze veranderen de betekenis van deze query niet. Een commentaar met -- loopt door tot het einde van de regel.

Namen moeten overeenkomen met het schema. Als frist_name een foutmelding over een ontbrekende kolom veroorzaakt, vergelijk de spelling dan met first_name. Standaard-SQL gebruikt dubbele aanhalingstekens voor namen met spaties of gereserveerde woorden, zoals "order date". PostgreSQL zet namen zonder aanhalingstekens om naar kleine letters, terwijl "City" vraagt om die exacte naam met hoofdletter. MySQL gebruikt normaal gesproken backticks; dubbele aanhalingstekens duiden namen aan in de modus ANSI_QUOTES. SQL Server accepteert ook vierkante haken en accepteert dubbele aanhalingstekens als QUOTED_IDENTIFIER aanstaat, wat de standaard is.

Belangrijkste punten

  • SELECT kiest de weergegeven kolommen; FROM geeft aan in welke tabel ze staan.
  • De resultaatkolommen volgen de SELECT-lijst; voor een rijvolgorde is ORDER BY nodig.
  • SELECT * toont alle kolommen; expliciete namen houden opgeslagen query's gericht.
  • Gebruik komma's tussen kolommen en een puntkomma om een instructie af te sluiten.
  • Controleer namen aan de hand van het schema en gebruik de regels van de database voor aanhalingstekens rond identificatoren.

1.2 Verschillende waarden en verschillende combinaties

Een herhaalde waarde in een queryresultaat is vaak nuttig. Meerdere medewerkers kunnen in dezelfde plaats wonen en elke medewerker heeft nog steeds een rij nodig. Gebruik DISTINCT als de vraag om verschillende waarden of verschillende combinaties vraagt.

Kies wat als duplicaat moet tellen
SELECT DISTINCT city
FROM employees;

Het resultaat bevat Chicago, Denver en Boston, zonder gegarandeerde volgorde. Het gewone SELECT city zou acht rijen opleveren, omdat elke medewerker een plaats heeft. Toevoeging van DISTINCT beperkt die weergave tot drie verschillende waarden. Alle acht medewerkersrecords blijven in de opslag staan.

De vergelijking omvat elke geselecteerde kolom. Bekijk:

SELECT DISTINCT department, city
FROM employees;

Ana en Chloe leveren allebei (Sales, Chicago) op, dus dat paar komt één keer voor. Emma levert (Sales, Denver) op, dat anders is en behouden blijft. De andere paren zijn (IT, Denver), (Marketing, Boston), (IT, Chicago), (NULL, Boston) en (Marketing, Chicago). Er zijn zeven resultaatrijen. Afdelingen blijven herhaald voorkomen omdat een afdeling met een andere plaats een andere resultaatrij vormt.

Schrijf DISTINCT één keer, direct na SELECT. Het geldt voor de volledige geselecteerde rij. Als je het tussen kolomnamen plaatst, zoals in SELECT department, DISTINCT city, ontstaat een syntaxisfout.

Let op welke kolommen je opneemt

Als je employee_id aan de geselecteerde kolommen toevoegt, wordt elke rij uniek. SELECT DISTINCT employee_id, city FROM employees; levert nog steeds acht rijen op: elke identificatiewaarde is uniek, ook als de plaats wordt herhaald. Om “In welke plaatsen wonen medewerkers?” te beantwoorden, selecteer je alleen de plaats. Om “Welke medewerkers wonen in elke plaats?” te beantwoorden, behoud je identificerende kolommen en verwacht je herhaalde plaatsen.

Bij deze stap waarin duplicaten worden verwijderd, tellen herhaalde NULL-waarden als duplicaten. SELECT DISTINCT department FROM employees; levert Sales, IT, Marketing en één NULL-rij op. De NULL-rij geeft aan dat een afdeling ontbreekt; het is geen vierde afdelingsnaam. Deze regel voor duplicaten verschilt van NULL = NULL, wat in een filter onbekend oplevert.

Tekstvergelijkingen volgen sorteerregels: de regels van de database voor het vergelijken en ordenen van tekst. Met de gewone hoofdlettergevoelige vergelijkingen die in deze voorbeelden voor SQLite en PostgreSQL worden gebruikt, zijn Chicago en chicago verschillende waarden. Een DISTINCT-lijst kan inconsistent hoofdlettergebruik zichtbaar maken. Het verwijderen van herhaalde weergaven herstelt geen spelling in de opgeslagen gegevens.

Combineer DISTINCT met een gesorteerde beperkte lijst
SELECT DISTINCT city
FROM employees
ORDER BY city
LIMIT 2;

Eerst verdwijnen dubbele plaatsen. Daarna worden de drie plaatsen gesorteerd. Tot slot blijven twee resultaatrijen over: Boston en Chicago, in die volgorde. Als je de limiet eerst op medewerkersrijen zou toepassen, zou je een andere vraag beantwoorden.

Neem bij een DISTINCT-query de sorteerkolommen op in de SELECT-lijst. PostgreSQL vereist dit; SQLite staat sommige query's toe die op een niet-geselecteerde kolom sorteren, maar de keuze tussen verschillende verborgen waarden maakt hun volgorde moeilijk te interpreteren. Als een resultaat onverwacht herhalingen bevat, onderzoek dan welke kolommen je hebt geselecteerd voordat je besluit dat DISTINCT in de query thuishoort.

Belangrijkste punten

  • DISTINCT verwijdert dubbele volledige resultaatrijen zonder opgeslagen rijen te veranderen.
  • Toevoeging van kolommen verandert welke rijen als duplicaten tellen; een unieke sleutel houdt elke rij verschillend.
  • DISTINCT groepeert herhaalde NULL-waarden samen.
  • Duplicaten worden verwijderd voordat het gesorteerde resultaat wordt beperkt.
2

Behoud de rijen die de vraag beantwoorden

Met een filter maak je van een tabel een antwoord over bepaalde records: een salarisbereik, een plaats of een groep die aan meerdere voorwaarden voldoet. Kleine keuzes zijn belangrijk, bijvoorbeeld of een grenswaarde meetelt en of twee voorwaarden allebei moeten gelden. Numerieke vergelijkingen, tekst- en datumwaarden en gegroepeerde logica hebben elk hun eigen regels. Een query kan goed worden uitgevoerd en toch de verkeerde vraag stellen. Daarom ga je na welke rijen elke test doorstaan.

2.1 Getallen en grenswaarden

De WHERE-clausule behoudt een rij alleen als de voorwaarde waar is. De clausule volgt op FROM en kan elke kolom in de tabel testen, ook een kolom die je niet weergeeft.

Kies de operator bij de formulering
VerzoekOperatorVoorbeeldvoorwaarde
Gelijk aan=stock = 0
Ongelijk aan<>stock <> 0
Meer dan>salary > 60000
Minstens>=salary >= 60000
Minder dan<price < 20.50
Hoogstens<=price <= 20.50

<> is de standaard-SQL-vorm voor “ongelijk aan”. De vijf databases die hier worden besproken, accepteren ook !=. Gebruik één gelijkteken voor gelijkheid. SQLite accepteert ==, maar PostgreSQL wijst die vorm af.

Volg een rij op de grenswaarde
SELECT first_name, salary
FROM employees
WHERE salary > 60000;

Ben heeft 71.000, Emma heeft 65.000 en Farid heeft 83.000. Dat zijn de drie rijen die voldoen, zonder opgegeven volgorde. David verdient precies 60.000. Zijn rij voldoet niet aan > 60000, omdat “meer dan” gelijkheid uitsluit.

Verander alleen de operator in >=. David komt nu ook in het resultaat, zodat er vier rijen zijn. Zo verschilt “minstens 60.000” van “meer dan 60.000”. Een nuttige grenswaardencontrole vraagt wat er gebeurt met een waarde die precies gelijk is aan de grenswaarde; waarden die er ver boven liggen, kunnen die fout niet aan het licht brengen.

Bij “hoogstens 20,50” voldoet een prijs van 20,50 en valt een prijs van 20,51 af. Als een verzoek zowel een ondergrens als een bovengrens geeft, controleer dan elke grens afzonderlijk voordat je de tests verbindt.

Schrijf numerieke waarden als getallen

Gebruik gewone cijfers in SQL-voorwaarden: 60000, zonder scheidingsteken voor duizendtallen of valutateken. Een komma scheidt SQL-elementen; WHERE salary > 60,000 is een syntaxisfout. Decimale waarden krijgen een punt, zoals in WHERE price < 20.50. Salarissen en prijzen horen in numerieke kolommen, zodat vergelijkingen hun numerieke grootte gebruiken.

Tekst die op een getal lijkt, volgt bij een tekstvergelijking de regels voor tekst. De tekstwaarde '9' wordt na '10' gesorteerd omdat het eerste teken later komt. Dat zegt iets over tekens, niet over of negen groter is dan tien. Bekijk het gegevenstype van de kolom voordat je een onverwachte vergelijking interpreteert.

Filter zonder de geteste kolom weer te geven
SELECT first_name
FROM employees
WHERE salary < 50000;

Chloe en Grace voldoen. Hun salarissen worden gebruikt om de rijen te testen, maar staan niet in het resultaat. Je hoeft het salaris niet aan SELECT toe te voegen om het filter te laten werken. Tijdens het controleren van een query kan het helpen om het salaris tijdelijk te tonen, zodat je ziet waarom elke rij voldeed.

Met een gelijkheidsvergelijking op een primaire sleutel kun je een record direct opzoeken: WHERE employee_id = 6 vindt Farid. Een primaire sleutel identificeert één rij, dus die vergelijking kan niet meerdere medewerkers met dezelfde identificatiewaarde opleveren.

Ontbrekende gegevens vragen aparte aandacht. WHERE stock <> 0 levert zes producten op. Lamp Shade valt af omdat de bekende voorraad nul is. Bookshelf valt ook af: de voorraad is NULL, dus de vergelijking is onbekend en WHERE behoudt het product niet. Een test op “ongelijk aan” voegt geen ontbrekende waarden toe aan het resultaat.

Belangrijkste punten

  • WHERE behoudt alleen rijen waarvan de voorwaarde waar is.
  • > en < sluiten hun grenswaarden uit; >= en <= sluiten ze in.
  • Schrijf numerieke literals zonder valutatekens, aanhalingstekens of scheidingstekens voor duizendtallen.
  • Een filter kan een kolom testen die niet wordt weergegeven.
  • Gebruik een gelijkheidsvergelijking op een sleutel om één record op te zoeken.
  • Gewone vergelijkingen met NULL komen niet door een WHERE-filter.

2.2 Tekst, aanhalingstekens en volledige datums

Voorwaarden met tekst en datums hebben waarden nodig in een vorm die de database kan interpreteren. Een verkeerd gespelde waarde kan ongemerkt geen rijen opleveren, terwijl een ontbrekend aanhalingsteken die waarde in een kolomnaam kan veranderen.

Maak onderscheid tussen een waarde en een naam
SELECT first_name
FROM employees
WHERE city = 'Chicago';

Door de enkele aanhalingstekens is 'Chicago' een tekstwaarde. Het resultaat bevat Ana, Chloe, Farid en Hugo. Zonder aanhalingstekens wordt Chicago als naam gelezen, dus zoekt de database naar een kolom met die naam. Ook dubbele aanhalingstekens duiden in de standaard namen aan. PostgreSQL wijst city = "Chicago" af als zo'n kolom niet bestaat. Sommige SQLite-configuraties accepteren tekenreeksen tussen dubbele aanhalingstekens vanwege oud gedrag; gebruik consequent enkele aanhalingstekens voor waarden.

Een apostrof binnen een waarde wordt verdubbeld:

SELECT first_name
FROM employees
WHERE last_name = 'O''Neill';

Dit vindt Hugo. De twee enkele aanhalingstekens naast elkaar stellen één apostrof binnen de waarde voor; de buitenste aanhalingstekens geven het begin en het einde aan. Standaard-SQL gebruikt geen backslash als escape-teken voor die apostrof.

Controleer de vergelijkingsregels

Sorteerregels bepalen de gelijkheid en sortering van tekst, inclusief hoofdletters, kleine letters en letters met accenten. In de gewone hoofdlettergevoelige vergelijkingen van SQLite en PostgreSQL die hier worden gebruikt, verschillen 'Chicago' en 'chicago'. WHERE city = 'chicago' levert geen rijen op. MySQL en SQL Server gebruiken vaak hoofdletterongevoelige sorteerregels, zodat hun gebruikelijke instellingen beide schrijfwijzen kunnen laten overeenkomen.

Ook vergelijkingen van tekstbereiken volgen de sorteerregels. Met deze namen levert WHERE last_name < 'M' Brown, Carter, Haddad, Kim en Lopez op. Waarden worden vanaf links vergeleken. Een langere waarde die met dezelfde tekens begint, komt na het kortere beginstuk: 'Martin' komt na 'M'. Een grenswaarde van 'M' is niet hetzelfde als “alle namen die met M beginnen”.

Zet het jaar voorop

De voorbeeldkolom hire_date slaat volledige datums op als tekst: jaar, maand en dan dag, met vaste breedtes. Daardoor komt de tekstvolgorde overeen met de kalendervolgorde.

SELECT first_name, hire_date
FROM employees
WHERE hire_date >= '2022-01-01';

Chloe, Grace en Hugo voldoen. PostgreSQL heeft ook een echt DATE-gegevenstype dat deze literal accepteert. De standaardvorm met typeaanduiding is DATE '2022-01-01'; SQLite gebruikt die syntaxis voor getypeerde literals niet.

Een lokale datumtekenreeks zoals '03/04/2024' is dubbelzinnig in een datumkolom, omdat instellingen er 4 maart of 3 april van kunnen maken. Als tekst opgeslagen worden datums met de maand voorop eerst op maand en dan op jaar vergeleken. Zo wordt '12/01/2021' na '03/15/2024' gesorteerd, hoewel de eerste kalenderdatum eerder is.

Vertaal de volledige datumgrens

“Aangenomen na 2022” betekent vanaf '2023-01-01'. Als je tekst in plaats daarvan met '2022' vergelijkt, komt Hugo met '2022-08-05' ook mee: de langere tekst wordt na het overeenkomende beginstuk gesorteerd.

Als een kolom tijden bevat, selecteert een gelijkheidsvergelijking met alleen een datum niet alle tijden op die dag. Om 31 maart 2024 mee te nemen, gebruik je ordered_at >= '2024-03-31' AND ordered_at < '2024-04-01'. Dit behoudt elke tijd vanaf het begin van 31 maart tot, maar exclusief, het begin van 1 april.

Belangrijkste punten

  • Gebruik enkele aanhalingstekens voor tekstwaarden; verdubbel een apostrof binnen een waarde.
  • Sorteerregels bepalen hoe hoofdletters, kleine letters en tekens worden vergeleken.
  • Gebruik volledige YYYY-MM-DD-datums, zodat tekstdatums met vaste breedte chronologisch worden gesorteerd.
  • Om een hele dag met tijden te omvatten, sluit je het begin van die dag in en het begin van de volgende dag uit.

2.3 AND, OR, NOT en gegroepeerde voorwaarden

Een rij moet mogelijk aan meerdere tests voldoen. AND vereist dat beide voorwaarden waar zijn. OR vereist dat minstens één voorwaarde waar is. NOT keert waar en onwaar om; als een voorwaarde door NULL onbekend is, blijft die met NOT onbekend.

Bepaal of beide tests moeten gelden
SELECT first_name
FROM employees
WHERE department = 'Sales' AND city = 'Chicago';

Ana en Chloe voldoen aan beide tests. Emma werkt bij Sales maar woont in Denver, dus voldoet ze niet aan deze AND. Als je AND in OR verandert, komen Emma, Farid en Hugo ook mee: de vijf medewerkers die voldoen, voldoen aan één test of aan beide.

Een AND-voorwaarde toevoegen kan het resultaat gelijk houden of verkleinen. Een OR-voorwaarde toevoegen kan het resultaat gelijk houden of vergroten. Zo kun je snel controleren of een filter klopt als je het in stappen opbouwt.

Elke vergelijking moet volledig zijn. Schrijf department = 'IT' OR department = 'Marketing' en herhaal daarbij de kolom en operator. department = 'IT' OR 'Marketing' drukt de tweede vergelijking niet uit. PostgreSQL wijst dit af; SQLite behandelt de tekst op zichzelf als onwaar en levert alleen IT-medewerkers op. Schrijf op dezelfde manier salary > 50000 AND salary < 70000, met salaris aan beide kanten van AND.

Vertaal groepen alternatieven

“Medewerkers in Boston en Denver” vraagt meestal om mensen in een van beide plaatsen. Elke rij heeft één plaats, dus gebruik city = 'Boston' OR city = 'Denver'. Dat levert Ben, David, Emma en Grace op. Een AND tussen deze gelijkheidsvergelijkingen vraagt dat één plaatswaarde tegelijk beide plaatsen is en levert geen rijen op.

Als operatoren door elkaar worden gebruikt, wordt NOT vóór AND geëvalueerd en AND vóór OR. Zonder haakjes:

WHERE department = 'Sales'
   OR department = 'Marketing' AND city = 'Chicago'

Dit betekent Sales-medewerkers op elke locatie, plus Marketing-medewerkers in Chicago. Emma voldoet omdat de vergelijking met Sales voldoende is. Om beide afdelingen tot Chicago te beperken, groepeer je de alternatieven:

SELECT first_name
FROM employees
WHERE (department = 'Sales' OR department = 'Marketing')
  AND city = 'Chicago';

Nu voldoen Ana, Chloe en Hugo. De haakjes plaatsen de twee afdelingskeuzes onder één gedeelde plaatsvoorwaarde. Gebruik ze om een gemengd AND/OR-filter duidelijk te maken, ook als de standaardvolgorde al juist zou zijn.

Keer een hele groep om

NOT (city = 'Chicago' OR city = 'Denver') levert David en Grace in Boston op. Geen van beide genoemde plaatsen is toegestaan. Voor deze waarden is dit gelijkwaardig aan city <> 'Chicago' AND city <> 'Denver'.

OR gebruiken tussen die twee tests op “ongelijk aan” is een veelvoorkomende valkuil. Een Chicago-rij verschilt van Denver en een Denver-rij verschilt van Chicago. Elke medewerker met een vastgelegde plaats voldoet aan minstens één test, dus de OR sluit geen van beide plaatsen uit.

Bouw een complexe voorwaarde stap voor stap op. Controleer de rijen na de eerste test en daarna opnieuw als je de volgende hebt toegevoegd. Je kunt de twee kanten van een AND of de twee kanten van een OR omwisselen zonder het antwoord te veranderen; kies de volgorde waarin de groepen het makkelijkst te lezen zijn.

Belangrijkste punten

  • AND vereist beide voorwaarden; OR vereist er minstens één.
  • Schrijf aan elke kant van een logische operator een volledige vergelijking.
  • NOT wordt vóór AND geëvalueerd en daarna OR; haakjes maken de bedoelde groepering expliciet.
  • Alternatieven voor één kolom hebben meestal OR nodig, ook als het verzoek “en” zegt.
  • Om beide overeenkomsten uit te sluiten, ontken je de OR-groep of verbind je de twee uitsluitingen met AND.
3

Selecteer op lijsten, bereiken en tekstpatronen

Sommige vragen vragen om meerdere exacte keuzes, andere om een reeks waarden of een deel van een naam. IN, BETWEEN en LIKE geven elk soort verzoek een duidelijke vorm. De keuze begint bij wat een overeenkomst betekent: een volledige waarde, een waarde tussen grenspunten of tekst die bij een patroon past. Je controleert ook ontbrekende waarden en details die een antwoord veranderen, waaronder inbegrepen grenswaarden, de plaats van jokertekens en hoofdlettergevoeligheid.

3.1 Lijsten met exacte keuzes met IN

Gebruik IN als één kolom met een willekeurige waarde uit een lijst mag overeenkomen. Het verkort een groep gelijkheidsvergelijkingen die met OR zijn verbonden, terwijl de betekenis behouden blijft.

Maak een lijst met alternatieven
SELECT first_name
FROM employees
WHERE department IN ('IT', 'Marketing');

Ben, David, Farid en Hugo voldoen. Ieder van hen heeft een van de twee afdelingswaarden. Dezelfde test kun je schrijven als department = 'IT' OR department = 'Marketing'.

Zet lijstelementen tussen haakjes en scheid ze met komma's. Zet tekst tussen aanhalingstekens; laat die bij numerieke waarden weg. Zo selecteert employee_id IN (2, 4, 6) Ben, David en Farid. De volgorde van de elementen in de lijst sorteert het resultaat niet. Een herhaald element herhaalt geen overeenkomende rij: IN (6, 2, 2, 4) selecteert dezelfde records. Gebruik ORDER BY als je een resultaatvolgorde nodig hebt.

IN vergelijkt volledige waarden volgens dezelfde vergelijkingsregels als gelijkheid. city IN ('Chi') komt niet overeen met Chicago. Bij de gewone hoofdlettergevoelige vergelijkingen die hier worden gebruikt, komt city IN ('chicago') er ook niet mee overeen. Voor een zoekopdracht op een deel van een waarde is LIKE nodig, terwijl de omgang met hoofdletters en kleine letters afhangt van de sorteerregels.

Pas een andere regel toe op elke keuze
SELECT first_name
FROM employees
WHERE department IN ('IT', 'Marketing')
  AND city = 'Chicago';

Farid en Hugo voldoen. IN is één voorwaarde, dus AND past de plaatstest toe op de volledige afdelingskeuze. In de uitgeschreven versie met OR zet je haakjes om de twee afdelingsvergelijkingen. Zonder die haakjes komt bij department = 'IT' OR department = 'Marketing' AND city = 'Chicago' ook Ben mee, omdat AND sterker bindt en de plaatsregel alleen voor Marketing geldt.

Sluit de opgegeven waarden uit

WHERE city NOT IN ('Chicago', 'Denver') levert David en Grace op. Een vastgelegde plaats voldoet alleen als deze van beide elementen verschilt. Dit is een bruikbare vorm voor meerdere uitsluitingen en voorkomt de fout om voorwaarden met “ongelijk aan” met OR te verbinden.

Ontbrekende waarden komen met geen van beide vormen overeen. Grace heeft een NULL-afdeling, dus department NOT IN ('Sales') neemt haar niet mee. De database kan niet vaststellen dat de ontbrekende afdeling verschilt van Sales. Om ook medewerkers zonder toegewezen afdeling mee te nemen, schrijf je department NOT IN ('Sales') OR department IS NULL.

Een NULL binnen een NOT IN-lijst veroorzaakt een groter probleem. department NOT IN ('Sales', NULL) vereist zowel department <> 'Sales' als department <> NULL. De tweede vergelijking is altijd onbekend, dus de gecombineerde test is nooit waar en WHERE levert geen rijen op. Houd tests op ontbrekende waarden gescheiden van de waardenlijst.

Bij IN slaagt een echte overeenkomst nog steeds als een ander lijstelement NULL is. department IN ('Sales', NULL) behoudt de drie Sales-medewerkers, maar voegt Grace niet toe. Gebruik IS NULL om expliciet om ontbrekende waarden te vragen.

Een gewone SQL-IN-lijst heeft minstens één element nodig. PostgreSQL wijst IN () af; SQLite accepteert het als onwaar. Als een programma een lijst opbouwt uit gebruikerskeuzes, verwerk dan een lege lijst voordat je de query verstuurt, zodat het gedrag in alle databases bewust is gekozen.

Belangrijkste punten

  • IN komt overeen met elke volledige waarde in de lijst tussen haakjes, waarvan de elementen door komma's zijn gescheiden.
  • De lijstvolgorde en herhaalde elementen bepalen de resultaatvolgorde niet en verdubbelen overeenkomende rijen niet.
  • IN vormt bij combinatie met AND één voorwaarde.
  • NOT IN sluit opgegeven waarden uit, maar neemt geen ontbrekende waarden mee.
  • Een NULL binnen een NOT IN-lijst voorkomt dat een rij de WHERE-test doorstaat.

3.2 Bereiken en inbegrepen grenswaarden

BETWEEN test een bereik waarbij beide grenzen zijn inbegrepen. Gebruik het als “van” en “tot en met” de genoemde grenswaarden omvatten; gebruik expliciete vergelijkingen als een van beide grenzen moet worden uitgesloten.

Controleer de twee grenzen
SELECT name, price
FROM products
WHERE price BETWEEN 15.50 AND 89.00;

Desk Lamp, Floor Lamp, Lamp Shade en Desk Organizer voldoen. Floor Lamp kost precies 89,00 en Lamp Shade precies 15,50, dus beide blijven behouden. De voorwaarde betekent price >= 15.50 AND price <= 89.00.

Zet de laagste waarde voorop. price BETWEEN 89.00 AND 15.50 vraagt om een prijs van minstens 89,00 en hoogstens 15,50. Het is geldige syntaxis, maar levert geen overeenkomsten op. Gewoon BETWEEN wisselt de grenswaarden niet voor je om. PostgreSQL biedt BETWEEN SYMMETRIC om dat te doen, maar gebruik de vorm met de laagste waarde eerst voor een query die je ook met SQLite gebruikt.

Voor “meer dan 15,50 en minder dan 89,00” schrijf je price > 15.50 AND price < 89.00. Alleen Desk Lamp en Desk Organizer voldoen. Dat verschil gaat over de grenswaarden van de vraag, niet over de manier waarop het resultaat wordt weergegeven.

Buiten een bereik

price NOT BETWEEN 20 AND 100 betekent price < 20 OR price > 100. Het levert Lamp Shade, Office Chair, Standing Desk, Desk Organizer, Bookshelf en Paper Tray op. Waarden van precies 20 of 100 zouden binnen het oorspronkelijke bereik vallen en niet aan NOT BETWEEN voldoen.

Een ontbrekende geteste waarde is in beide tests onbekend. Voor de voorraad selecteert BETWEEN 5 AND 40 vijf producten en NOT BETWEEN selecteert er twee: Lamp Shade met 0 en Desk Organizer met 60. Bookshelf heeft voorraad NULL en hoort in geen van beide resultaten. Een bereik en de ontkenning daarvan hoeven dus niet alle opgeslagen rijen te omvatten.

Datums en tijden

Volledige datumtekenreeksen in de volgorde YYYY-MM-DD ondersteunen datumbereiken. hire_date BETWEEN '2020-01-01' AND '2022-12-31' selecteert Ben, David en Hugo en omvat alle drie kalenderjaren in deze kolom met alleen datums.

Een kolom met tijden heeft voor een hele maand een andere bovengrens nodig. Een grenswaarde met alleen een datum betekent in een tijdstempelkolom middernacht aan het begin van die dag. In tekst wordt zelfs '2024-03-31 00:00:00' na het kortere beginstuk '2024-03-31' gesorteerd. Om alle tijden in maart mee te nemen, gebruik je:

WHERE ordered_at >= '2024-03-01'
  AND ordered_at < '2024-04-01'

Dit sluit het begin van maart in en stopt vlak vóór april, zonder dat je de laatste fractie van een seconde op 31 maart hoeft te raden.

Tekstbereiken en de twee toepassingen van AND

Tekstgrenswaarden zijn volledige waarden. last_name BETWEEN 'A' AND 'C' omvat Brown maar sluit Carter uit, omdat Carter na zijn beginstuk C wordt gesorteerd. Volgens deze tekstregels omvat last_name >= 'A' AND last_name < 'D' namen die met A, B of C beginnen en levert dit Brown en Carter op.

In price BETWEEN 10 AND 100 AND category = 'Lighting' scheidt de eerste AND de grenswaarden van het bereik; de tweede verbindt de bereiktest met de categorietest. De overeenkomende producten zijn Desk Lamp, Floor Lamp en Lamp Shade. Regeleinden kunnen de twee functies duidelijker maken.

Belangrijkste punten

  • BETWEEN omvat beide grenswaarden en verwacht de laagste grenswaarde eerst.
  • NOT BETWEEN selecteert waarden onder de ondergrens of boven de bovengrens.
  • Met expliciete vergelijkingen kun je één of beide grenswaarden uitsluiten.
  • Voor een hele maand met tijden sluit je het begin van de maand in en stop je vóór de volgende maand.
  • Een tekstgrenswaarde is een volledige waarde, niet elke waarde die met die letter begint.
  • NULL in de geteste kolom voldoet aan geen van beide bereiktests.

3.3 Tekstpatronen met LIKE

LIKE toetst tekst aan een patroon. Gebruik het om naar een begin, een einde of een fragment te zoeken wanneer een gelijkheidsvergelijking om een volledige exacte waarde zou vragen.

Plaats de jokertekens
PatroonBetekenisOvereenkomende productnamen
'Lamp%'Begint met LampLamp Shade
'%Lamp'Eindigt op LampDesk Lamp, Floor Lamp
'%Lamp%'Bevat LampDesk Lamp, Floor Lamp, Lamp Shade
'Lamp'Precies LampGeen

Het patroon moet overeenkomen met de volledige waarde. % kan nul of meer tekens voorstellen, inclusief spaties. In '%Lamp%' kan elk procentteken met niets overeenkomen, zodat de tekst ook met Lamp kan beginnen of eindigen, naast Lamp in het midden bevatten.

_ staat voor precies één teken. last_name LIKE '_im' vindt Kim. Vier lage streepjes in first_name LIKE '____' vinden Emma en Hugo, de voornamen met precies vier letters. Het lage streepje is geen optioneel teken.

SELECT first_name, phone
FROM employees
WHERE phone LIKE '312-%';

Ana, Chloe en Farid voldoen omdat hun vastgelegde telefoonnummer als tekst met 312- begint. Het procentteken omvat alle overige tekens.

Kies de operator en de regel voor hoofdlettergebruik

Jokertekens horen bij LIKE-patronen. name = '%Lamp%' zoekt naar letterlijke procenttekens en levert hier geen producten op. De jokertekens voor het zoeken naar bestanden * en ? hebben in LIKE geen speciale betekenis; name LIKE 'Desk*' vraagt om de letterlijke asterisk na Desk.

LIKE in SQLite negeert normaal gesproken het verschil tussen hoofdletters en kleine letters voor de ASCII-letters A–Z, terwijl de gewone LIKE in PostgreSQL hoofdlettergevoelig is. name LIKE '%desk%' vindt daarom Desk Lamp, Standing Desk en Desk Organizer in SQLite, maar geen in PostgreSQL met hoofdlettergevoelige sorteerregels. PostgreSQL biedt ook het hoofdletterongevoelige ILIKE. Het gedrag van MySQL volgt de sorteerregels.

Voor de ASCII-productnamen die hier worden gebruikt, levert LOWER(name) LIKE '%desk%' dezelfde overeenkomsten op in SQLite en PostgreSQL: LOWER zet de naam vóór de vergelijking om naar kleine letters. Omzetting van hoofdletters en kleine letters in andere schriftsystemen hangt af van database- en taalregels. Ook de gelijkheidsvergelijking van SQLite verschilt van LIKE: city = 'chicago' vindt Chicago niet volgens de standaard binaire sorteerregels, hoewel city LIKE 'chicago' die plaats wel vindt.

Zoek naar een letterlijk jokerteken

Kies een escape-teken om een laag streepje letterlijk te vergelijken:

WHERE code LIKE 'SPRING!_%' ESCAPE '!'

In een tabel met kortingscodes komt dit overeen met 'SPRING_10', maar niet met 'SPRINGS10'. De !_ is een echt laag streepje; het laatste % komt nog steeds overeen met een reeks. Gebruik dezelfde aanpak met !% voor een letterlijk procentteken. Door ESCAPE expliciet te schrijven ben je niet afhankelijk van de standaardinstellingen van de database; PostgreSQL gebruikt normaal gesproken een backslash en SQLite heeft geen standaard escape-teken.

Ontkenning en omvang van de zoekopdracht

name NOT LIKE '%Lamp%' levert de andere vijf producten op. Ontbrekende tekst voldoet noch aan LIKE, noch aan NOT LIKE. Van de medewerkers komen drie telefoonnummers overeen met '312-%', twee vastgelegde telefoonnummers niet en de drie NULL-telefoonnummers staan in geen van beide resultaten.

Een % aan het begin geeft een gewone index geen vaste begintekst waarmee de zoekopdracht kan worden beperkt, zodat mogelijk een groot deel van de tabel wordt doorzocht. Een vast begin zoals 'Desk%' kan een geschikte index helpen. Gebruik voor datums datumbereiken: LIKE werkt op deze tekstdatums, maar PostgreSQL vereist een conversie voordat je LIKE op een echte DATE-kolom toepast.

Belangrijkste punten

  • LIKE vergelijkt de volledige waarde; % staat voor een willekeurig aantal tekens en _ voor precies één.
  • Zet % aan het begin, het einde of beide om te bepalen waar een fragment mag voorkomen.
  • De omgang met hoofdletters en kleine letters verschilt per database en sorteerregels; LOWER helpt bij deze ASCII-namen.
  • Met ESCAPE kun je een jokerteken als letterlijk teken gebruiken.
  • NULL voldoet noch aan LIKE, noch aan NOT LIKE.
  • Jokertekens aan het begin kunnen ervoor zorgen dat een zoekopdracht meer gegevens doorzoekt; gebruik bereiken voor datums.
4

Houd rekening met ontbrekende waarden

Ontbrekende gegevens veranderen welke records een filter kan vinden. Een voorraad van nul, een lege telefoonnummertekenreeks en een niet-vastgelegde waarde vertellen je verschillende dingen, ook als een queryprogramma sommige cellen er hetzelfde uit laat zien. Je gebruikt expliciete tests op ontbrekende waarden en volgt de derde waarheidswaarde, onbekend. Deze regels verklaren waarom een filter en het omgekeerde ervan dezelfde rijen kunnen weglaten en hoe je die rijen meeneemt als de vraag daarom vraagt.

4.1 NULL, nul en lege tekst

NULL duidt een ontbrekende waarde aan: een waarde kan onbekend zijn, niet zijn vastgelegd of niet van toepassing zijn. Dit verschilt van een bekende nul of bekende tekst zonder tekens.

Begrijp wat een ontbrekende waarde betekent

Lamp Shade heeft stock = 0. Het vastgelegde aantal is nul, dus het product is niet op voorraad. Bookshelf heeft stock NULL: het aantal is niet vastgelegd. De database kan je niet vertellen dat er nul eenheden zijn of enig ander aantal.

Dit onderscheid verandert de vraag die je kunt beantwoorden:

VraagVoorwaardeResultaat
Welke producten zijn niet op voorraad?stock = 0Lamp Shade
Welke voorraadaantallen zijn onbekend?stock IS NULLBookshelf
Welke aantallen zijn vastgelegd?stock IS NOT NULLDe andere zeven producten

Een cel die leeg lijkt in een queryprogramma is niet genoeg om onderscheid te maken tussen deze situaties. Sommige programma's tonen NULL als een lege cel; andere geven NULL weer. Test de opgeslagen waarde rechtstreeks.

Gebruik de tests op ontbrekende waarden
SELECT first_name
FROM employees
WHERE phone IS NULL;

Van Ben, Emma en Hugo is geen telefoonnummer vastgelegd. IS NULL levert waar op voor hun ontbrekende waarden. Om de vijf medewerkers met een vastgelegd telefoonnummer te vinden, gebruik je phone IS NOT NULL: Ana, Chloe, David, Farid en Grace.

Schrijf geen phone = NULL om ontbrekende telefoonnummers te vinden. Een gewone vergelijking met NULL levert onbekend op, zelfs als beide kanten NULL zijn. WHERE behoudt alleen rijen waarvoor de voorwaarde waar is, dus = NULL levert geen rijen op. <> NULL heeft hetzelfde probleem. IS NULL test op de aanduiding voor een ontbrekende waarde en levert voor deze afzonderlijke kolomwaarden een duidelijk antwoord waar of onwaar op.

De vorm NOT phone IS NULL vindt in SQLite en PostgreSQL ook aanwezige telefoonnummers, maar phone IS NOT NULL maakt de bedoelde test makkelijker leesbaar.

Maak onderscheid tussen drie soorten tekst
SQL-expressieWat deze voorstelt
NULLEen ontbrekende waarde
''Een bekende tekstwaarde met nul tekens
'NULL'Vier gewone letters

SQLite, PostgreSQL, MySQL en SQL Server maken onderscheid tussen lege tekst en NULL. phone = '' zou lege tekenreeksen vinden, niet de ontbrekende telefoonnummers van Ben, Emma of Hugo. Als een kolom beide kan bevatten, gebruik dan phone IS NULL OR phone = '' om beide situaties te vinden. Oracle behandelt een lege tekstwaarde als NULL, dus dit onderscheid verandert als je naar een andere database overstapt.

Gebruik de formulering en het schema

“Ontbreekt”, “niet vastgelegd” en “niet toegewezen” wijzen op IS NULL. department IS NULL vindt Grace. Haar ontbrekende afdeling betekent niet dat de afdelingstekst het woord 'NULL' is en stelt ook niet vast bij welke afdeling ze hoort.

De tabeldefinitie kan een kolom als NOT NULL aanduiden, wat betekent dat een opgeslagen rij in die kolom geen NULL kan hebben. Een IS NULL-query op zo'n kolom levert geen rijen op. Controleer deze regel als je een schema bekijkt: kolommen die ontbrekende gegevens toestaan, hebben bijzondere aandacht nodig als je uitsluitingen maakt of voorwaarden combineert.

Belangrijkste punten

  • NULL duidt een ontbrekende waarde aan; nul en lege tekst zijn bekende waarden.
  • IS NULL vindt ontbrekende waarden en IS NOT NULL vindt aanwezige waarden.
  • = NULL en <> NULL kunnen via gewone vergelijkingen geen rijen vinden.
  • Het tussen aanhalingstekens geplaatste 'NULL' is tekst en Oracle behandelt lege tekst anders dan de andere getoonde databases.
  • Een NOT NULL-kolom kan geen NULL opslaan.

4.2 Waar, onwaar en onbekend

Een voorwaarde in SQL kan waar, onwaar of onbekend zijn. Ontbrekende waarden maken de derde toestand noodzakelijk: zonder een vastgelegd aantal kan een database niet vaststellen of dat aantal boven een grenswaarde ligt.

Een voorwaarde en het omgekeerde

Voor Bookshelf is stock > 10 onbekend omdat de voorraad NULL is. Dat geldt ook voor stock <= 10. WHERE behoudt alleen rijen waarvoor de voorwaarde waar is en laat rijen met een onware of onbekende voorwaarde weg.

In de productentabel levert stock > 10 vier rijen op en stock <= 10 drie. Samen omvatten ze zeven van de acht producten. Bookshelf ontbreekt in beide. NOT toepassen brengt het product niet terug: NOT onbekend is onbekend, dus NOT (stock > 10) selecteert nog steeds alleen de drie bekende aantallen van hoogstens 10.

Dit verschilt van een waarde die niet aan een voorwaarde voldoet. De bekende nul van Lamp Shade maakt stock > 10 onwaar, dus NOT maakt de voorwaarde waar. Een ontbrekend aantal levert geen dergelijke duidelijke vergelijking op om om te keren.

Combineer onbekend met een andere test
CombinatieResultaat
Onbekend AND onwaarOnwaar
Onbekend AND waarOnbekend
Onbekend AND onbekendOnbekend
Onbekend OR waarWaar
Onbekend OR onwaarOnbekend
Onbekend OR onbekendOnbekend

Bookshelf kost 120,00. In stock > 10 OR price > 100 is de prijsvoorwaarde waar. OR heeft maar één waar deel nodig, dus de rij blijft behouden hoewel de voorraadvergelijking onbekend is. In stock > 10 AND price > 100 blijft de voorraadvoorwaarde onbeslist, dus is het resultaat onbekend en valt de rij af.

Neem ontbrekende waarden bewust mee
SELECT first_name
FROM employees
WHERE department <> 'Sales'
   OR department IS NULL;

Dit levert Ben, David, Farid, Hugo en Grace op. De vergelijking alleen zou er vier opleveren en Grace weglaten. De IS NULL-tak neemt expliciet medewerkers mee aan wie geen afdeling is toegewezen. Of zulke medewerkers onder “buiten Sales” vallen, hangt af van het bedoelde antwoord; de query moet die keuze uitdrukken.

Een NULL-waarde in een NOT IN-lijst kan het hele resultaat blokkeren. department NOT IN ('Sales', NULL) betekent dat de afdeling moet verschillen van Sales en van NULL. De laatste vergelijking is voor elke rij onbekend, dus is de volledige voorwaarde nooit waar. IN behoudt echte overeenkomsten nog wel: department IN ('Sales', NULL) selecteert de drie Sales-medewerkers, maar vindt Grace niet.

Een ontbrekende geteste waarde levert ook onbekend op bij LIKE en bij een gewoon BETWEEN-bereik. IS NULL en IS NOT NULL geven duidelijke antwoorden voor deze afzonderlijke kolomwaarden. Controleer ontbrekende waarden afzonderlijk met die tests als een aantal rijen verrassend lijkt.

Weet wanneer NULL-waarden worden gegroepeerd

NULL = NULL blijft onbekend; van twee ontbrekende telefoonnummers is niet bekend of het hetzelfde nummer is. DISTINCT behandelt herhaalde ontbrekende waarden echter als duplicaten en ORDER BY plaatst ze bij elkaar. Voor een vergelijking die twee NULL-waarden bewust als gelijk behandelt, bieden SQLite en PostgreSQL ook IS NOT DISTINCT FROM.

Belangrijkste punten

  • WHERE behoudt rijen waarvoor de voorwaarde waar is en verwijdert rijen waarvoor die onwaar of onbekend is.
  • NOT laat onbekend onveranderd; ontkende filters kunnen nog steeds NULL-rijen missen.
  • Een ware OR-tak kan een rij behouden waarvan een andere tak onbekend is.
  • Voeg IS NULL expliciet toe als ontbrekende waarden in het antwoord thuishoren.
  • Een NULL in een NOT IN-lijst betekent dat geen rij door dat uitsluitingsfilter kan komen.
  • Bij het verwijderen van duplicaten worden NULL-waarden gegroepeerd, hoewel een gewone gelijkheidsvergelijking van NULL met NULL onbekend is.
5

Sorteer resultaten en kies een pagina

Een rijlimiet krijgt pas betekenis als je bepaalt welke rijen vooraan moeten staan. Sorteren kan getallen, tekst of datums ordenen en latere sorteerkolommen beslissen tussen gelijke waarden in eerdere kolommen. Ontbrekende waarden en rijen met gelijke sorteerwaarden vragen aandacht als een beperkte lijst of een pagina herhaalbaar moet zijn. Je stelt volledige sorteervolgordes samen, past limieten toe na het filteren en herkent de verschillende syntaxis voor rijlimieten in veelgebruikte databasesystemen.

5.1 Oplopende en aflopende volgorde

ORDER BY bepaalt de volgorde van resultaatrijen. Zonder ORDER BY doet SQL geen toezegging over welke rij eerst verschijnt, ook niet als een kleine tabel steeds dezelfde volgorde lijkt op te leveren.

Kies de richting
RichtingGetallenVolledige datumsTekst
ASCKleinste eerstVroegste eerstVolgens de sorteerregels
DESCGrootste eerstLaatste eerstOmgekeerd volgens de sorteerregels

ASC is de standaard. ORDER BY salary en ORDER BY salary ASC vragen om dezelfde richting. “Hoogste salaris eerst” vraagt om ORDER BY salary DESC.

SELECT first_name, salary
FROM employees
ORDER BY salary DESC;

Lees het resultaat van hoog naar laag: Farid 83.000, Ben 71.000, Emma 65.000, David 60.000, Hugo 58.000, Ana 52.000, Chloe 48.000 en Grace 45.000. De database herschikt de resultaatrijen; deze query verandert de opgeslagen tabel niet.

Filter vóór het sorteren
SELECT name, price
FROM products
WHERE category = 'Lighting'
ORDER BY price;

Alleen de drie Lighting-rijen komen in dit resultaat. Hun oplopende prijzen leveren Lamp Shade 15,50, Desk Lamp 24,99 en daarna Floor Lamp 89,00 op. ORDER BY volgt in de instructie op WHERE. Als je die clausules omdraait, ontstaat een syntaxisfout.

De sorteerkolom hoeft niet te worden weergegeven. SELECT first_name FROM employees ORDER BY salary DESC; geeft dezelfde naamvolgorde zonder de salarissen te tonen. PostgreSQL beperkt dit als DISTINCT aanwezig is: een DISTINCT-query moet de sorteerkolommen selecteren.

Bekijk het opgeslagen gegevenstype

Numerieke kolommen worden op numerieke grootte gesorteerd. Tekstkolommen worden op tekens gesorteerd volgens hun sorteerregels. De tekstwaarden '10', '9' en '100' worden bij een gewone tekenvolgorde gesorteerd als '10', '100', '9'. Dat is geen juiste numerieke rangorde, dus controleer het kolomtype als bedragen niet op volgorde lijken te staan.

De voorbeeldwaarden van hire_date zijn volledige tekstdatums met vaste breedte en het jaar voorop. ORDER BY hire_date begint met Farid op 2017-09-12 en eindigt met Grace op 2024-02-19. DESC draait dat om voor de laatst aangenomen medewerkers eerst. Tekstdatums met de maand voorop, zoals MM/DD/YYYY, worden eerst op maand en dan op jaar vergeleken en leveren over meerdere jaren geen betrouwbare kalendervolgorde op.

Tekstvolgorde hangt af van sorteerregels

De standaard binaire sorteerregels van SQLite plaatsen ASCII-hoofdletters vóór kleine letters. Volgens die regel komt 'Zebra' vóór 'apple' en komt 'é' na 'z'. Veel PostgreSQL-databases gebruiken taalafhankelijke sorteerregels die een andere volgorde opleveren. Consistent hoofdlettergebruik helpt, maar de vergelijkingsregels van de database bepalen nog steeds de volgorde van letters met accenten en andere tekens.

Gebruik kolomnamen voor een duidelijke sorteeropgave. ORDER BY 2 DESC betekent het tweede element in de SELECT-lijst, dus als je kolommen verplaatst, kan de sortering ongemerkt veranderen. ORDER BY 'salary' duidt een tekstconstante aan, niet de salariskolom: SQLite levert er geen bruikbare volgorde mee op en PostgreSQL wijst het af. Schrijf ORDER BY salary.

Belangrijkste punten

  • ORDER BY bepaalt de rijvolgorde; ASC is de standaard en DESC keert de richting om.
  • WHERE filtert rijen voordat ze worden gesorteerd.
  • Numerieke grootte, datumweergave en tekstsorteerregels bepalen wat “oplopend” betekent.
  • Noem sorteerkolommen expliciet om tekstconstanten tussen aanhalingstekens en veranderende kolomposities te vermijden.

5.2 Meerdere sorteerkolommen, gelijke waarden en ontbrekende waarden

Een tweede sorteerkolom is alleen van belang als rijen in de eerste gelijke waarden hebben. Denk aan een gesorteerde medewerkerslijst: groepeer eerst op plaats en zet daarna de namen binnen elke plaats op volgorde.

Volg de sorteerkolommen van links naar rechts
SELECT last_name, city
FROM employees
ORDER BY city, last_name;

Het resultaat begint met Kim en Okafor in Boston. Daarna komen Haddad, Lopez, Nguyen en O'Neill in Chicago. Brown en Carter in Denver staan als laatste. last_name concurreert niet met city; de kolom bepaalt de volgorde alleen binnen een gedeelde plaats.

Als je de kolommen omdraait, verandert de hoofdvolgorde. ORDER BY last_name, city sorteert voornamelijk op achternaam en kijkt alleen naar de plaats als achternamen gelijk zijn. Gebruik één ORDER BY-clausule met komma's tussen de sorteerkolommen. Een tweede ORDER BY-clausule is ongeldig.

Geef elke kolom een richting

ORDER BY department, salary DESC betekent afdeling oplopend en vervolgens salaris aflopend binnen elke afdeling. DESC hoort alleen bij salaris. Om beide aflopend te maken, schrijf je department DESC, salary DESC.

In de standaard NULL-volgorde van SQLite plaatst de eerste vorm de ontbrekende afdeling van Grace vooraan. IT volgt met Farid en daarna Ben; Marketing heeft David en daarna Hugo; Sales heeft Emma, Ana en daarna Chloe. Je leest één hiërarchie van vergelijkingen; je sorteert niet eerst elke rij op salaris om die volgorde daarna te negeren.

Beslis tussen gelijke waarden met een unieke waarde

Rijen die in alle sorteerkolommen gelijk zijn, kunnen in willekeurige volgorde verschijnen. ORDER BY city bepaalt niet welke medewerker in Chicago eerst komt. Een volledige sorteervolgorde voegt een laatste kolom toe die elke rij uniek identificeert:

SELECT first_name, city
FROM employees
ORDER BY city, employee_id;

De identificatiewaarden beslissen tussen alle gelijke plaatswaarden. Bij ongewijzigde gegevens zorgt dit ervoor dat een latere LIMIT of pagina een herhaalbaar deel van de geordende lijst selecteert. Een unieke aanvullende sorteerkolom bepaalt welke rijen op een grens verschijnen; deze neemt geen extra rijen met gelijke waarden mee.

Plaats ontbrekende waarden bewust

De standaardinstellingen van databases verschillen:

DatabaseNULL in ASC-volgordeNULL in DESC-volgorde
SQLite, MySQL, SQL ServerEerstLaatst
PostgreSQL, OracleLaatstEerst

De afdelingsquery zet Grace volgens de standaardinstelling in PostgreSQL dus als laatste, terwijl ze in SQLite als eerste staat. Dit verschil staat los van de salarisrichting.

SELECT first_name, department, salary
FROM employees
ORDER BY department NULLS LAST, salary DESC;

SQLite 3.30 of later, PostgreSQL en Oracle ondersteunen NULLS FIRST en NULLS LAST. Hier zetten ze Grace na alle vastgelegde afdelingen, terwijl de salarisvolgorde binnen elke afdeling behouden blijft. MySQL en SQL Server accepteren die clausules niet.

Vertaal een gevraagde hiërarchie in dezelfde volgorde als waarin die wordt uitgesproken: “op afdeling, binnen elke afdeling het hoogste salaris eerst” levert department, salary DESC op. “Alfabetisch op achternaam, dan voornaam” levert last_name, first_name op. Voeg als laatste een identificatiewaarde toe als je een herhaalbare volgorde nodig hebt tussen mensen met identieke namen.

Belangrijkste punten

  • Latere ORDER BY-kolommen beslissen tussen gelijke waarden in eerdere kolommen.
  • ASC of DESC geldt voor de eigen kolom; een weggelaten richting is standaard ASC.
  • Een unieke laatste sorteerkolom maakt de volgorde volledig bij ongewijzigde gegevens.
  • De plaats van NULL hangt af van de database; ondersteunde NULLS FIRST/LAST-clausules bepalen die expliciet.
  • Een aanvullende sorteerkolom bepaalt de rijkeuze zonder een LIMIT uit te breiden met alle rijen met gelijke waarden.

5.3 Eerste resultaten en pagina's met LIMIT

LIMIT behoudt hoogstens een gekozen aantal resultaatrijen. Het bepaalt niet welke rijen vooraan moeten staan. Gebruik ORDER BY om een beperkte lijst een betekenis te geven, zoals hoogste salaris, nieuwste of goedkoopste.

Sorteer en beperk daarna
SELECT first_name, salary
FROM employees
ORDER BY salary DESC
LIMIT 3;

De gesorteerde salarissen beginnen met Farid 83.000, Ben 71.000 en Emma 65.000, dus die drie rijen blijven over. Zonder ORDER BY levert LIMIT 3 willekeurig drie rijen op, zonder garantie dat ze de hoogste salarissen hebben.

WHERE werkt vóór de limiet. WHERE city = 'Boston' ORDER BY salary DESC LIMIT 5 levert alleen David en Grace op omdat slechts twee medewerkers voldoen. LIMIT is een maximum, geen verzoek om extra rijen te verzinnen. LIMIT 0 levert er geen op.

Sla rijen over voor een latere pagina

OFFSET slaat rijen over voordat LIMIT de op te halen rijen telt. ORDER BY salary DESC LIMIT 3 OFFSET 3 slaat Farid, Ben en Emma over en levert daarna David, Hugo en Ana op: positie vier tot en met zes.

Voor pagina k met n rijen per pagina sla je (k − 1) × n rijen over. Pagina drie met drie rijen per pagina gebruikt LIMIT 3 OFFSET 6. Alleen Chloe en Grace blijven over. De eerste pagina heeft offset nul, niet één.

“De tweede rij” en “de tweede verschillende waarde” zijn verschillende verzoeken. ORDER BY salary DESC LIMIT 1 OFFSET 1 levert hier Ben met 71.000 op. Als twee medewerkers hetzelfde hoogste salaris hadden, zou die query nog een medewerker met het hoogste salaris opleveren. Om het op één na hoogste verschillende salaris te vinden, selecteer je DISTINCT salary voordat je sorteert en rijen overslaat.

Bepaal de grens

ORDER BY city LIMIT 3 bevat de twee medewerkers in Boston en één medewerker in Chicago, maar geeft niet aan welke medewerker in Chicago. ORDER BY city, employee_id LIMIT 3 selecteert David, Grace en Ana. De unieke identificatiewaarde bepaalt de keuze op de grens.

Om iedereen met dezelfde laatste sorteerwaarde te behouden, ondersteunen PostgreSQL 13 of later en Oracle FETCH FIRST 3 ROWS WITH TIES. Met ORDER BY city behoudt dit zes rijen: beide Boston-rijen en alle vier Chicago-rijen. Als ORDER BY ook een unieke identificatiewaarde bevat, kunnen rijen niet gelijk zijn op de volledige sorteersleutel.

Herken de syntaxis van de database
DatabaseEen limiet van drie rijen
SQLite, PostgreSQL, MySQLORDER BY salary DESC LIMIT 3
PostgreSQL, Oracle 12c of laterORDER BY salary DESC FETCH FIRST 3 ROWS ONLY
SQL ServerSELECT TOP (3) first_name, salary FROM employees ORDER BY salary DESC;

Standaard-SQL gebruikt OFFSET en FETCH, geen LIMIT. PostgreSQL en Oracle accepteren OFFSET 3 ROWS FETCH FIRST 3 ROWS ONLY. SQL Server gebruikt ORDER BY salary DESC OFFSET 3 ROWS FETCH NEXT 3 ROWS ONLY; ORDER BY is verplicht voor deze vorm van paginering.

SQLite en MySQL accepteren ook LIMIT 6, 3, met de offset eerst. Geef de voorkeur aan LIMIT 3 OFFSET 6, zodat de functies expliciet zijn. Bij paginering wordt voor elke pagina opnieuw een query uitgevoerd. Een volledige sorteervolgorde houdt pagina's consistent zolang de gegevens ongewijzigd blijven; toevoegingen of verwijderingen tussen verzoeken kunnen er nog steeds voor zorgen dat pagina's records herhalen of overslaan.

Belangrijkste punten

  • ORDER BY bepaalt welke rijen eerst komen; LIMIT behoudt hoogstens het gevraagde aantal.
  • OFFSET slaat rijen over voordat LIMIT telt; de eerste pagina gebruikt offset nul.
  • Selecteer eerst DISTINCT als je verschillende waarden rangschikt in plaats van afzonderlijke rijen.
  • Een unieke aanvullende sorteerkolom bepaalt de grens; WITH TIES kan extra rijen met dezelfde volledige sorteersleutel meenemen.
  • LIMIT, TOP en OFFSET/FETCH zijn databasespecifieke vormen om het aantal rijen te beperken.
  • Gewijzigde gegevens kunnen paginagrenzen tussen verzoeken verschuiven.
6

Stel een volledige query op en controleer deze

Een vraag uit de werkomgeving combineert meestal meerdere keuzes: welke records meetellen, welke details worden getoond en welke rijen eerst komen. Door die keuzes afzonderlijk te plannen, schrijf je makkelijker een query waarvan de onderdelen op elkaar aansluiten. De geschreven clausulevolgorde en de logische volgorde verklaren waarom een filter een verborgen kolom kan gebruiken en waarom een limiet geldt voor rijen die voldoen. Je controleert ook grenswaarden, ontbrekende gegevens en gelijke waarden voordat je een aannemelijk ogend resultaat vertrouwt.

6.1 Geschreven volgorde en logische verwerking

SQL-clausules hebben een vaste volgorde waarin ze worden geschreven. Hun logische volgorde verklaart het resultaat als een reeks beslissingen, ook als de database intern een ander uitvoeringsplan gebruikt.

Schrijf de instructie in clausulevolgorde
SELECT DISTINCT city
FROM employees
WHERE department = 'Sales'
ORDER BY city
LIMIT 2 OFFSET 0;

SELECT en FROM geven de gevraagde kolommen en de brontabel aan. De andere clausules zijn optioneel, maar behouden deze volgorde als ze worden gebruikt: WHERE, ORDER BY, LIMIT en daarna OFFSET in deze LIMIT-vorm. DISTINCT staat direct na SELECT.

Gebruik één WHERE-clausule met meerdere verbonden voorwaarden. Een tweede WHERE is een syntaxisfout. Hetzelfde geldt voor ORDER BY: zet meerdere sorteerkolommen in één clausule, gescheiden door komma's. Als je WHERE onder ORDER BY zet, vraag je niet om een andere verwerkingsvolgorde; je maakt ongeldige SQL.

Volg de logische beslissingen
Logische stapWat gebeurt er in het voorbeeld
FROMLees medewerkersrijen.
WHEREBehoud Ana, Chloe en Emma bij Sales.
SELECTBehoud hun plaatswaarden: Chicago, Chicago, Denver.
DISTINCTBeperk die waarden tot Chicago en Denver.
ORDER BYZet Chicago vóór Denver.
OFFSET en LIMITSla niets over en haal hoogstens twee rijen op.

Het resultaat is Chicago, daarna Denver. De herhaalde plaats verdwijnt voordat de limiet resultaatrijen telt. Je neemt niet eerst twee medewerkers om daarna te vragen of ze in verschillende plaatsen wonen.

De optimalisator kan een ander fysiek uitvoeringsplan gebruiken dat hetzelfde resultaat oplevert als deze logische volgorde.

Gebruik kolommen waar ze beschikbaar zijn

WHERE test de bronrijen voordat SELECT de weergegeven kolommen kiest:

SELECT first_name
FROM employees
WHERE salary > 60000;

Dit werkt zonder salaris in de uitvoer. De namen die voldoen zijn Ben, Emma en Farid. Salaris is nog steeds een kolom van elke bronrij wanneer de test wordt uitgevoerd.

Evenzo is filteren vóór het beperken essentieel voor een eerste resultaat binnen een groep:

SELECT first_name
FROM employees
WHERE department = 'Sales'
ORDER BY salary DESC
LIMIT 1;

Het antwoord is Emma. Eerst voldoen de Sales-medewerkers; daarna worden hun salarissen gerangschikt. Als je eerst de bestbetaalde medewerker van het bedrijf zou nemen en die ene rij op Sales zou testen, zou je het bedoelde antwoord missen, omdat Farid bij IT hoort.

Maak de structuur zichtbaar

Schrijf één clausule per regel en zet langere voorwaarden op afzonderlijke ingesprongen regels. Voor “Furniture-producten onder € 200, hoogste prijs eerst” gebruik je:

SELECT name, price
FROM products
WHERE category = 'Furniture'
  AND price < 200
ORDER BY price DESC;

Office Chair met 149,00 komt vóór Bookshelf met 120,00. De twee voorwaarden delen één WHERE, de numerieke grenswaarde heeft geen valutateken en ORDER BY sorteert de rijen die voldoen. Door elke regel aan de hand van zijn functie te controleren, vind je syntaxisfouten en verkeerde interpretaties makkelijker.

Belangrijkste punten

  • Schrijf SELECT, FROM, WHERE, ORDER BY en LIMIT in de vereiste clausulevolgorde.
  • Lees logisch gezien de tabel, filter, selecteer kolommen, verwijder duplicaten, sorteer en beperk daarna de rijen.
  • WHERE kan bronkolommen testen die SELECT niet weergeeft.
  • Door vóór het rangschikken te filteren, vind je het hoogste resultaat binnen de gevraagde groep.

6.2 Van een verzoek naar een gecontroleerd antwoord

Bepaal voordat je SQL schrijft de afzonderlijke beslissingen die in een alledaags verzoek verborgen zitten. Elke beslissing hoort bij een clausule en elke clausule kun je controleren aan de hand van het bedoelde antwoord.

Neem zes beslissingen
  1. Welke tabel bevat de records? Kies FROM.
  2. Welke records voldoen? Bouw WHERE op.
  3. Welke velden beantwoorden de vraag? Kies SELECT.
  4. Zijn herhaalde resultaatwaarden nuttig? Beslis over DISTINCT.
  5. Wat moet eerst komen? Bouw ORDER BY op.
  6. Is er een maximum of pagina? Voeg LIMIT en OFFSET toe.

Bij “minstens” sluit je gelijkheid in. “Een van” wijst op IN, “bevat” wijst op een LIKE-patroon met procenttekens aan beide kanten, “ontbreekt” wijst op IS NULL en “verschillende waarden” wijst op DISTINCT. Een verzoek om de eerste n resultaten heeft zowel een sorteerrichting als een limiet nodig.

Maak een beperkte medewerkerslijst

“Toon de namen en indiensttredingsdatums van de drie laatst aangenomen medewerkers buiten Sales van wie een telefoonnummer is vastgelegd, de nieuwste eerst.” Neem in dit verzoek medewerkers zonder toegewezen afdeling mee in de betekenis van buiten Sales.

Begin met employees. De afdelingsregel om te voldoen is department <> 'Sales' OR department IS NULL. Groepeer die keuze zodat de telefoonregel voor beide takken geldt. Toon namen en datums en rangschik daarna de rijen die voldoen:

SELECT first_name, last_name, hire_date
FROM employees
WHERE (department <> 'Sales' OR department IS NULL)
  AND phone IS NOT NULL
ORDER BY hire_date DESC
LIMIT 3;

Grace Okafor op 2024-02-19 staat als eerste, David Kim op 2020-11-23 als tweede en Farid Haddad op 2017-09-12 als derde. Als je de IS NULL-tak verwijdert, valt Grace af en blijven slechts twee resultaten over. Bepaal bij een onduidelijk verzoek hoe ontbrekende afdelingen moeten meetellen en vermeld de keuze bij het antwoord.

Combineer categorie, prijs en voorraad

“Welke producten uit Lighting of Storage kosten minder dan € 20 en zijn op voorraad, de goedkoopste eerst?” Gebruik IN voor de twee categoriekeuzes en vereis een bekend positief aantal:

SELECT name, price
FROM products
WHERE category IN ('Lighting', 'Storage')
  AND price < 20
  AND stock > 0
ORDER BY price;

Paper Tray met 9,99 komt vóór Desk Organizer met 18,75. Lamp Shade is goedkoop genoeg en valt in een gekozen categorie, maar de voorraad is nul, dus voldoet het product niet aan de laatste test. Een ontbrekend voorraadaantal zou ook niet voldoen, omdat daarmee niet kan worden vastgesteld dat de voorraad positief is.

Controleer de rijen die een fout kunnen blootleggen

Begin met SELECT * FROM products LIMIT 5; als je het schema en enkele records verkent. Voeg filters één voor één toe, controleer veranderingen in het aantal resultaten en toon geteste kolommen tijdelijk als dat nuttig is.

Test exacte grenswaarden, ontbrekende waarden, hoofdlettergebruik in tekst en gelijke waarden op de limiet. NOT toont rijen waarvoor een voorwaarde onwaar was; het toont geen rijen waarvoor de voorwaarde onbekend was. Voer IS NULL-tests afzonderlijk uit. Controleer of je uitvoer de gevraagde kolommen heeft en of ORDER BY beslist tussen gelijke waarden die het antwoord beïnvloeden.

Controleer bij het overzetten van de query naar een andere database de syntaxis voor rijlimieten, de regels voor hoofdlettergebruik bij gelijkheid en LIKE, aanhalingstekens rond identificatoren, de verwerking van datums en de plaats van NULL. De voorbeelden gebruiken LIMIT in SQLite en PostgreSQL; de rijlimietvorm van standaard-SQL is OFFSET met FETCH FIRST.

Belangrijkste punten

  • Plan de tabel, rijen die voldoen, uitvoerkolommen, duplicaten, volgorde en het aantal rijen afzonderlijk.
  • Schrijf de keuze voor ontbrekende waarden expliciet als een uitsluiting ook records zonder toewijzing moet omvatten.
  • Controleer grenswaarden en de effecten van afzonderlijke filters aan de hand van de vraag.
  • Onderzoek NULL-waarden afzonderlijk, omdat NOT onbekend niet in waar verandert.
  • Controleer hoofdlettergebruik, datums, namen, NULL-volgorde en rijlimieten opnieuw als je van database verandert.

SQL SELECT: voorbeelden

6 Walkthroughs

1

Van medewerkersrecords naar een plaatsenlijst

11 stappen
Kies resultaatkolommen en bepaal daarna wat als duplicaat moet tellen.
  1. 1
    IntroductieEén tabel, twee soorten antwoorden

    Een medewerkerslijst en een lijst met woonplaatsen van medewerkers gebruiken dezelfde medewerkersrecords, maar hebben een andere resultaatvorm nodig. Een eenvoudige SELECT kiest de velden die worden weergegeven. DISTINCT kan daarna herhaalde geselecteerde waarden terugbrengen. We bouwen eerst een medewerkersresultaat met twee kolommen, veranderen daarna de vraag naar verschillende plaatsen en volgen wat verdwijnt.

  2. 2
    UitlegKies de weergegeven kolommen

    Begin met een specifiek verzoek: toon van elke medewerker eerst de plaats en daarna de voornaam. Schrijf:

    SELECT city, first_name
    FROM employees;
    

    De SELECT-lijst bepaalt de volgorde van de uitvoerkolommen, dus de plaats komt eerst. FROM levert de tabel. Er is geen filter, dus alle acht medewerkers leveren een rij op; deze gewone query laat de opgeslagen records ongewijzigd.

  3. 3
    VoorbeeldLees de vorm van het resultaat

    Het record van Ana levert Chicago en Ana op; dat van Ben levert Denver en Ben op. Elke overige medewerker levert dezelfde twee velden. Het resultaat heeft dus acht rijen en twee kolommen. Herhaalde plaatsen blijven staan omdat die rijen nog steeds verschillende mensen beschrijven. Er is geen ORDER BY aanwezig, dus deze voorbeelden duiden rijen aan zonder een weergavevolgorde te garanderen.

  4. 4
    UitdagingControleer een gewijzigde SELECT-lijst

    Wat verandert er als de query SELECT first_name FROM employees; wordt? Geef het aantal rijen en het aantal kolommen.

    ---reveal---

    De query levert nog steeds acht rijen op, nu met één kolom, first_name. Als je city uit SELECT verwijdert, verwijder je een weergegeven veld, geen medewerkersrecords. Er is een filter of rijlimiet nodig om het aantal rijen te verminderen.

  5. 5
    TipHoud syntaxisfouten overzichtelijk

    Scheid kolomnamen met komma's, maar laat geen afsluitende komma vóór FROM staan. Gebruik een puntkomma om de instructie af te sluiten; -- begint commentaar dat tot het einde van de regel loopt. Als de database een onbekende kolom meldt, vergelijk de spelling dan met het schema. SELECT * is handig voor een eerste blik, terwijl expliciete namen een opgeslagen resultaat gericht houden.

  6. 6
    UitlegVraag om verschillende plaatsen

    Vraag nu in welke plaatsen medewerkers wonen. Voornamen horen niet langer bij dat antwoord:

    SELECT DISTINCT city
    FROM employees;
    

    De acht plaatsvermeldingen worden teruggebracht tot Chicago, Denver en Boston, zonder gegarandeerde volgorde. DISTINCT verwijdert herhalingen uit het geselecteerde resultaat, niet uit de opgeslagen medewerkerstabel. Elke plaats verschijnt één keer, ook als er meerdere mensen wonen.

  7. 7
    VoorbeeldVergelijk volledige geselecteerde rijen

    Voeg afdeling toe aan de SELECT-lijst. Ana en Chloe leveren allebei het paar Sales-Chicago op, dat tot één rij wordt teruggebracht. Emma levert Sales-Denver op, dat behouden blijft omdat de plaats verschilt. Het volledige resultaat van SELECT DISTINCT department, city FROM employees; heeft zeven rijen. DISTINCT wordt één keer na SELECT geschreven en vergelijkt alle geselecteerde velden samen.

  8. 8
    UitdagingEen unieke identificatiewaarde verandert het verwijderen van duplicaten

    Hoeveel rijen zou SELECT DISTINCT employee_id, city FROM employees; opleveren en waarom?

    ---reveal---

    Alle acht rijen blijven behouden. Elke employee_id is uniek, dus elk paar van identificatiewaarde en plaats verschilt van alle andere paren. Herhaalde plaatsen alleen zijn niet voldoende om volledige geselecteerde rijen tot duplicaten te maken.

  9. 9
    KernpuntBepaal wat een NULL-rij aangeeft

    Een DISTINCT-afdelingslijst bevat Sales, IT, Marketing en één NULL-rij voor Grace. Herhaalde aanduidingen voor ontbrekende waarden zouden ook tot één worden teruggebracht. Die rij geeft aan dat een afdeling niet is vastgelegd; het is geen andere benoemde afdeling. Bij het groeperen van duplicaten worden NULL-waarden samen behandeld, hoewel een gewone vergelijking NULL = NULL onbekend is.

  10. 10
    UitdagingSluit af met een gesorteerde beperkte lijst

    Voorspel SELECT DISTINCT city FROM employees ORDER BY city LIMIT 2;. Geef de waarden in de volgorde waarin ze worden opgehaald en leg uit wat de limiet telt.

    ---reveal---

    Boston, daarna Chicago. DISTINCT brengt eerst de plaatswaarden terug tot drie; ORDER BY sorteert die waarden en LIMIT behoudt er twee. De limiet telt verschillende plaatsen in het resultaat na het verwijderen van duplicaten, geen twee medewerkersrecords.

  11. 11
    SamenvattingStem de uitvoer af op de vraag

    Een medewerkersresultaat behoudt identificerende velden; een overzicht van plaatsen selecteert alleen de plaats met DISTINCT. Geselecteerde kolommen bepalen de vergelijkingen voor duplicaten, terwijl ORDER BY de rijvolgorde bepaalt. Controleer bij het wijzigen van een query zowel de uitvoervelden als wat één resultaatrij voorstelt.

2

Maak een filter dat betekent wat je bedoelt

13 stappen
Vertaal grenswaarden, waarden tussen aanhalingstekens en groepen voorwaarden naar rijtests.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieElk filter stelt een precieze vraag
  2. 2
    UitlegVertaal de salarisgrens
  3. 3
    UitdagingSluit de grenswaarde in wanneer nodig
  4. 4
    TipSchrijf numerieke literals zonder extra tekens
  5. 5
    UitlegZet een tekstwaarde tussen aanhalingstekens
  6. 6
    VoorbeeldBehoud een apostrof binnen de waarde
  7. 7
    UitlegGebruik een volledige datumgrens
  8. 8
    UitdagingControleer een datum met een tijd
  9. 9
    UitlegVerbind de voorwaarden
  10. 10
    VoorbeeldPas één plaatsregel toe op alternatieven
  11. 11
    UitdagingKeer de groep om
  12. 12
    UitdagingCombineer een datum en een afdelingsgroep
  13. 13
    SamenvattingVolg een veelzeggende rij
3

Kies een exacte lijst, een bereik of een patroon

15 stappen
Gebruik de selectievorm die bij de vraag past en controleer de grenzen.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieDrie betekenissen van een overeenkomst
  2. 2
    UitlegBegin met volledige categoriekeuzes
  3. 3
    VoorbeeldPas een voorraadregel toe op de lijst
  4. 4
    UitdagingVoorspel een uitsluiting
  5. 5
    UitlegPlaats een prijs binnen een bereik
  6. 6
    UitdagingSluit de grenswaarden bewust uit
  7. 7
    TipOmvat een hele maand met tijden
  8. 8
    UitlegBepaal waar het fragment moet staan
  9. 9
    VoorbeeldTel één teken met een laag streepje
  10. 10
    VoorbeeldMaak het jokerteken letterlijk
  11. 11
    UitdagingControleer een patroon aan de randen
  12. 12
    VerbandControleer de omgang met hoofdletters in de database
  13. 13
    UitdagingHoud rekening met een ontbrekend telefoonnummer
  14. 14
    UitdagingCombineer alle drie soorten selectie
  15. 15
    SamenvattingKies de vorm op basis van de betekenis
4

Zoek ontbrekende gegevens en redeneer ermee

10 stappen
Maak onderscheid tussen NULL en bekende waarden en volg onbekend door een filter.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieEen niet-vastgelegd aantal is onbeslist
  2. 2
    VoorbeeldMaak onderscheid tussen nul en ontbrekend
  3. 3
    UitlegTest aanwezigheid rechtstreeks
  4. 4
    UitdagingControleer lege tekst
  5. 5
    UitlegVolg een vergelijking en het omgekeerde
  6. 6
    VoorbeeldLaat een ware OR-tak beslissen
  7. 7
    UitdagingEen onware AND-tak kan de doorslag geven
  8. 8
    KernpuntVermijd NULL binnen een uitsluitingslijst
  9. 9
    UitdagingNeem ontbrekende afdelingen mee en vereis telefoonnummers
  10. 10
    SamenvattingOnderzoek ontbrekende gegevens afzonderlijk
5

Maak een herhaalbare gesorteerde pagina

15 stappen
Rangschik rijen die voldoen, beslis tussen gelijke waarden en pas een limiet en offset toe.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieEen pagina is een deel van een geordend antwoord
  2. 2
    VoorbeeldKies het hoogste eerst
  3. 3
    UitdagingSorteer alleen producten die voldoen
  4. 4
    TipBepaal of de sortering numeriek is
  5. 5
    UitlegLees sorteerprioriteiten vanaf links
  6. 6
    UitdagingGeef elke sorteerkolom een richting
  7. 7
    UitlegBeslis tussen de resterende gelijke waarden
  8. 8
    VerbandPlaats ontbrekende waarden expliciet
  9. 9
    VoorbeeldBehoud de eerste drie gerangschikte rijen
  10. 10
    VoorbeeldGa voorbij de eerste pagina
  11. 11
    KernpuntEen rijrang is geen rang van verschillende waarden
  12. 12
    UitdagingOnderzoek gelijke waarden op een grens
  13. 13
    TipHerken een andere vorm voor rijlimieten
  14. 14
    UitdagingBehoud de tweede pagina met plaatsen
  15. 15
    SamenvattingBepaal de rangorde vóór de selectie
6

Vertaal en controleer een verzoek uit de werkomgeving

12 stappen
Stel een volledige query op één tabel op en controleer hoe elke clausule het antwoord verandert.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieScheid de beslissingen in een verzoek
  2. 2
    UitlegSchrijf een geldige clausulevolgorde
  3. 3
    VoorbeeldVolg het logische model
  4. 4
    UitdagingFilter voordat je een winnaar kiest
  5. 5
    UitlegBepaal het medewerkersverzoek
  6. 6
    VoorbeeldMaak de afdelingsregel expliciet
  7. 7
    VoorbeeldPas de telefoonvoorwaarde toe
  8. 8
    VoorbeeldRangschik de records die voldoen
  9. 9
    UitdagingControleer de beslissing over ontbrekende waarden
  10. 10
    UitdagingVerbind de clausules tot één verwerkingsketen
  11. 11
    TipKies controles die fouten blootleggen
  12. 12
    SamenvattingLeg het antwoord naast het verzoek

SQL SELECT: oefenvragen

50 Oefenvragen in 5 sets

Set 1: Lijsten, bereiken en tekenpatronen10 Oefenvragen

Vraag 1 van 10

Een numerieke kolom fee heeft de waarden 12, 18, 24 en 30. Welke waarden voldoen aan WHERE fee BETWEEN 18 AND 30?
  1. Alleen 24
  2. 18, 24
  3. 18, 24, 30
  4. 12, 18, 24
Toon antwoordVerberg antwoord
Antwoord: C
BETWEEN omvat beide grenzen van het bereik, dus 18 en 30 voldoen samen met 24. Als je alleen de middelste waarde behoudt, behandel je beide grenswaarden als uitgesloten. De lagere waarde 12 valt af omdat deze onder 18 ligt, ongeacht de positie in de tabel.

Vraag 2 van 10

Welk LIKE-patroon selecteert tekst die eindigt op report?
  1. '%report'
  2. 'report%'
  3. '%report%'
  4. '_report'
Toon antwoordVerberg antwoord
Antwoord: A
Een procentteken aan het begin staat een willekeurig voorvoegsel toe en in het patroon volgt niets op report, dus de volledige waarde moet daar eindigen. Procenttekens aan beide kanten zouden ook een achtervoegsel toestaan en waarden toelaten waarin report in het midden staat. Een laag streepje staat slechts één teken als voorvoegsel toe.

Vraag 3 van 10

Een tabel requests heeft de rijen (request_id, region) (31, 'South'), (32, 'East'), (33, 'South'). Welke verzameling identificatiewaarden voldoet aan WHERE region IN ('South', 'South')?
  1. {31, 31, 33, 33}
  2. {31}
  3. {31, 32, 33}
  4. {31, 33}
Toon antwoordVerberg antwoord
Antwoord: D
Elke rij wordt één keer getest op aanwezigheid tussen de toegestane waarden, dus de twee South-records voldoen elk één keer. South herhalen in de lijst verdubbelt die resultaatrijen niet. De lijst geeft ook geen resultaatvolgorde, dus het antwoord is een verzameling identificatiewaarden.

Vraag 4 van 10

Welke verzameling waarden in een tabel labels komt overeen met label LIKE '__7%': 'AB7', 'A7', 'AB70' en 'ABC7'?
  1. {AB7, A7, AB70}
  2. {AB7, AB70}
  3. {AB70, ABC7}
  4. {A7, AB7}
Toon antwoordVerberg antwoord
Antwoord: B
De twee lage streepjes vereisen precies twee tekens vóór de letterlijke 7. Het laatste procentteken accepteert nul tekens in AB7 en één in AB70. ABC7 valt af omdat het derde teken C is, terwijl A7 maar één teken vóór de 7 heeft.

Vraag 5 van 10

Een numerieke kolom temperature bevat 4, 9, 14, 19 en NULL. Welke waarden voldoen aan WHERE temperature NOT BETWEEN 9 AND 14?
  1. 4, 19
  2. 4, 9, 14, 19
  3. 4, 19, NULL
  4. 9, 14
Toon antwoordVerberg antwoord
Antwoord: A
NOT BETWEEN behoudt waarden onder 9 of boven 14, dus 4 en 19 voldoen. De grenswaarden 9 en 14 liggen binnen het oorspronkelijke inclusieve bereik en zijn hier uitgesloten. NULL voldoet aan geen van beide vormen omdat de vergelijking onbekend is; ontkenning maakt die niet waar.

Vraag 6 van 10

Een kolom promo_code bevat 'VIP_2', 'VIPA2', 'VIP_' en 'VIP2'. Welke verzameling voldoet aan WHERE promo_code LIKE 'VIP!_%' ESCAPE '!'?
  1. {VIP_2, VIPA2, VIP_}
  2. {VIP_2}
  3. {VIP_2, VIP_}
  4. {VIPA2, VIP2}
Toon antwoordVerberg antwoord
Antwoord: C
Het escape-teken maakt van !_ een letterlijk laag streepje na VIP en het laatste procentteken kan overeenkomen met nul of meer tekens. VIP_2 en VIP_ voldoen daarom. VIPA2 zou voldoen aan een patroon met een laag streepje zonder escape-teken, maar mist het echte lage streepje dat hier vereist is.

Vraag 7 van 10

Een tabel appointments slaat tekst met tijden op in de vorm YYYY-MM-DD HH:MM:SS met vaste breedte. Welke voorwaarde selecteert elke afspraak in februari 2028?
  1. starts_at BETWEEN '2028-02-01' AND '2028-02-29'
  2. starts_at >= '2028-02-01' AND starts_at < '2028-03-01'
  3. starts_at > '2028-02-01' AND starts_at > '2028-03-01'
  4. starts_at >= '2028-02-01' AND starts_at <= '2028-03-01'
Toon antwoordVerberg antwoord
Antwoord: B
De ondergrens sluit het begin van februari in en de strikte bovengrens stopt voordat maart begint. Een bovengrens van 29 februari met alleen een datum wordt vóór tekst met een tijd op die datum gesorteerd, dus BETWEEN zou de afspraken op de laatste dag missen. De grens van de volgende maand voorkomt dat probleem.

Vraag 8 van 10

Welke verzameling uit 'Maple', 'map', 'roadmap' en 'MAPS' komt volgens het standaardgedrag van LIKE in SQLite overeen met word LIKE 'map%'?
  1. {map}
  2. {map, roadmap}
  3. {Maple, map}
  4. {Maple, map, MAPS}
Toon antwoordVerberg antwoord
Antwoord: D
De standaard-LIKE van SQLite negeert het verschil tussen hoofdletters en kleine letters bij ASCII-letters, dus alle drie waarden die met map beginnen, komen overeen. Het procentteken mag geen tekens voorstellen, waardoor map zelf ook voldoet. Roadmap valt af omdat het patroon geen jokerteken aan het begin heeft om tekens vóór map toe te staan.

Vraag 9 van 10

Een tabel members heeft de rijen (member_id, tier) (41, 'Gold'), (42, 'Silver'), (43, NULL). Welke verzameling identificatiewaarden voldoet aan WHERE tier IN ('Silver', NULL)?
  1. {}
  2. {42, 43}
  3. {41, 42}
  4. {42}
Toon antwoordVerberg antwoord
Antwoord: D
Silver heeft een echt overeenkomend lijstelement, dus lid 42 voldoet. Een ontbrekend niveau is niet gelijk aan het NULL-element in de lijst; die vergelijking is onbekend, dus lid 43 valt af. IN met een NULL-element kan bekende overeenkomsten behouden, anders dan NOT IN, dat niet elke vereiste ongelijkheid kan vaststellen.

Vraag 10 van 10

Een tabel shipments legt één port per rij vast. Welke voorwaarde sluit zowel Oakland als Tacoma uit als alle havenwaarden zijn vastgelegd?
  1. NOT (port = 'Oakland' OR port = 'Tacoma')
  2. NOT port = 'Oakland' OR port = 'Tacoma'
  3. port <> 'Oakland' OR port <> 'Tacoma'
  4. NOT (port <> 'Oakland' AND port <> 'Tacoma')
Toon antwoordVerberg antwoord
Antwoord: A
De gegroepeerde OR duidt een van beide ongewenste havens aan en NOT keert die volledige groep om. Als je de twee ongelijkheden met OR verbindt, zou elke vastgelegde haven meekomen, omdat elke haven van minstens één genoemde haven verschilt. De bedoelde uitsluiting vereist dat beide ongelijkheden gelden.
Set 2: Kolommen, vergelijkingen en duidelijke voorwaarden10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Een tabel rooms heeft 12 rijen. Wat is de vorm van het resultaat van SELECT floor, room_name FROM rooms;?
  1. 2 rijen en 12 kolommen
  2. 12 rijen en 2 kolommen
  3. 12 rijen en alle kolommen
  4. 2 rijen en alle kolommen
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Een tabel parcels slaat het numerieke weight_kg op. Welke voorwaarde behoudt pakketten die hoogstens 8 kilogram wegen?
  1. weight_kg < 8
  2. weight_kg >= 8
  3. weight_kg > 8
  4. weight_kg <= 8
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Welke SQL-voorwaarde komt overeen met de exacte tekstwaarde D'Arcy in een kolom surname?
  1. surname = 'D''Arcy'
  2. surname = 'D'Arcy'
  3. surname = "D'Arcy"
  4. surname = D'Arcy
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Een tabel tickets heeft status en een numerieke priority. Welke voorwaarde selecteert openstaande tickets of tickets in behandeling, elk met een prioriteit van minstens 4?
  1. status = 'open' OR status = 'pending' AND priority >= 4
  2. (status = 'open' AND status = 'pending') OR priority >= 4
  3. (status = 'open' OR status = 'pending') AND priority >= 4
  4. (status = 'open' OR status = 'pending') AND priority > 4
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Een tabel visits bevat de paren (site, day) ('East', 'Mon'), ('East', 'Mon'), ('East', 'Tue') en ('West', 'Mon'). Hoeveel rijen levert SELECT DISTINCT site, day FROM visits; op?
  1. 2 rijen
  2. 3 rijen
  3. 4 rijen
  4. 1 rij
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Een rij heeft team = 'Blue', city = 'Austin' en score = 62. Voldoet deze aan WHERE team = 'Blue' OR city = 'Miami' AND score >= 80, en waarom?
  1. Ja; de ware teamtest is genoeg voor de OR.
  2. Nee; de scoretest geldt voor beide locaties.
  3. Ja; OR vereist dat beide tekstvergelijkingen waar zijn.
  4. Nee; de plaatstoets is onwaar en moet altijd slagen.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Een tekstkolom slaat volledige datums op als YYYY-MM-DD. Welke voorwaarde selecteert datums na het kalenderjaar 2025?
  1. event_date > '2025'
  2. event_date > '2025-01-01'
  3. event_date >= '2025-12-31'
  4. event_date >= '2026-01-01'
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Welke voorwaarde selecteert records waarvan de volledige waarde van zone ofwel North ofwel West is?
  1. zone IN 'North', 'West'
  2. zone IN ('North, West')
  3. zone IN ('North', 'West')
  4. zone = 'North' AND zone = 'West'
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een tabel loans heeft de numerieke waarden 0, 2, 5 en NULL voor days_late. Hoeveel rijen voldoen aan WHERE days_late <> 0?
  1. 4 rijen
  2. 2 rijen
  3. 3 rijen
  4. 1 rij
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Een tabel stockrooms heeft de rijen (room_id, building) (1, 'C'), (2, 'A'), (3, 'A'), (4, 'B'), (5, 'C'). Welke geordende waarden levert SELECT DISTINCT building FROM stockrooms ORDER BY building DESC LIMIT 2; op?
  1. C, C
  2. A, B
  3. B, A
  4. C, B
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 3: Ontbrekende waarden en gecombineerde filters10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Een tabel routes heeft de rijen (route_id, depot) (61, 'A'), (62, 'B'), (63, NULL). Welke verzameling identificatiewaarden voldoet aan WHERE depot NOT IN ('A', NULL) OR depot IS NULL?
  1. {62, 63}
  2. {}
  3. {61, 62, 63}
  4. {63}
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Een tabel heeft vijf numerieke waarden voor load: 0, 3, 7, NULL, NULL. Twee query's gebruiken WHERE load > 3 en WHERE NOT (load > 3). Wat zijn hun aantallen rijen, in die volgorde?
  1. 1 en 2
  2. 3 en 2
  3. 1 en 4
  4. 2 en 3
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Een SQLite-tabel contacts slaat de waarden NULL, '', 'NULL' en '555-0188' op voor phone. Hoeveel rijen voldoen aan WHERE phone IS NULL?
  1. 2 rijen
  2. 3 rijen
  3. 4 rijen
  4. 1 rij
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Een rij in devices heeft battery_pct = NULL en status = 'ready'. Wat gebeurt er bij WHERE battery_pct > 50 OR status = 'ready'?
  1. De rij valt af omdat elke NULL de OR onbekend maakt.
  2. De rij blijft behouden omdat de statustak waar is.
  3. De rij valt af omdat beide takken waar moeten zijn.
  4. De rij blijft behouden omdat OR NULL-takken altijd negeert.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Welke voorwaarde vindt rijen met een vastgelegde waarde voor email, inclusief lege tekst als die in PostgreSQL als waarde is opgeslagen?
  1. email <> NULL
  2. email <> ''
  3. email IS NOT NULL
  4. email = 'NULL'
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Een tabel jobs bevat de rijen (job_id, hours, urgent) (51, NULL, 'yes'), (52, 6, 'no'), (53, 2, 'yes'), (54, NULL, 'no'). Welke verzameling voldoet aan WHERE NOT (hours > 4) OR urgent = 'yes'?
  1. {51, 53}
  2. {53}
  3. {51, 53, 54}
  4. {51, 52, 53}
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Een tabel files heeft de waarden 'Archive', 'Active' en NULL voor folder. Welke voorwaarde neemt Active en de ontbrekende map mee, maar sluit Archive uit?
  1. folder <> 'Archive'
  2. folder <> 'Archive' OR folder IS NULL
  3. folder <> 'Archive' AND folder IS NULL
  4. folder NOT IN ('Archive', NULL)
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Een tabel deliveries heeft de waarden 'Hill', NULL, 'Hill', NULL en 'Lake' voor district. Hoeveel rijen levert SELECT DISTINCT district FROM deliveries; op?
  1. 4 rijen
  2. 2 rijen
  3. 3 rijen
  4. 5 rijen
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een rapport gebruikt WHERE rating >= 4 en controleert daarna uitgesloten rijen met WHERE NOT (rating >= 4). Sommige records verschijnen in geen van beide resultaten. Welke aanvullende test toont records waarvan de beoordeling niet is vastgelegd?
  1. WHERE rating < 4
  2. WHERE rating = NULL
  3. WHERE rating IS NULL
  4. WHERE rating <> 4
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Een tabel messages heeft de onderwerpen 'Note A', 'Alert', NULL en 'Note B'. Hoeveel rijen voldoen aan WHERE subject NOT LIKE 'Note%'?
  1. 2 rijen
  2. 4 rijen
  3. 3 rijen
  4. 1 rij
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 4: Rangschikken, gelijke waarden en latere pagina's10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Een SQLite-tekstkolom slaat de waarden '6', '12' en '100' op met binaire sorteerregels. Wat is hun oplopende volgorde?
  1. 6, 12, 100
  2. 100, 6, 12
  3. 12, 100, 6
  4. 100, 12, 6
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Een numerieke kolom duration_minutes heeft de waarden 16, 4 en 23. Wat is hun volgorde bij ORDER BY duration_minutes?
  1. 23, 16, 4
  2. 16, 23, 4
  3. 4, 16, 23
  4. 16, 4, 23
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Een tabel racers heeft de rijen (racer_id, group_name, points) (71, 'A', 8), (72, 'B', 12), (73, 'A', 15). Welke volgorde van identificatiewaarden levert ORDER BY group_name, points DESC op?
  1. 73, 71, 72
  2. 73, 72, 71
  3. 72, 73, 71
  4. 71, 73, 72
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Een vast geordend resultaat bevat 23 rijen. Welke LIMIT en OFFSET leveren pagina 3 met 6 rijen per pagina op?
  1. LIMIT 6 OFFSET 3
  2. LIMIT 6 OFFSET 18
  3. LIMIT 3 OFFSET 6
  4. LIMIT 6 OFFSET 12
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Een vaste tabel orders heeft unieke waarden voor order_id en meerdere rijen hebben dezelfde order_date én total. Welke ORDER BY geeft de nieuwste datums eerst, de hoogste totalen binnen een datum en een volledige volgorde?
  1. ORDER BY order_date DESC, total DESC
  2. ORDER BY order_date DESC, total DESC, order_id
  3. ORDER BY order_id, order_date DESC, total DESC
  4. ORDER BY order_date, total DESC, order_id DESC
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Een tabel offers heeft de rijen (offer_id, rate) (81, 40), (82, 40), (83, 35), (84, 30). Welke waarde voor rate levert SELECT DISTINCT rate FROM offers ORDER BY rate DESC LIMIT 1 OFFSET 1; op?
  1. 40
  2. 35
  3. 30
  4. Geen waarde voor rate
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Een tabel queues bevat de namen 'Delta', NULL en 'Alpha'. Waar staat de NULL-rij bij de standaard ORDER BY queue_name ASC in SQLite en PostgreSQL?
  1. Eerst in SQLite; eerst in PostgreSQL.
  2. Laatst in SQLite; eerst in PostgreSQL.
  3. Eerst in SQLite; laatst in PostgreSQL.
  4. Laatst in SQLite; laatst in PostgreSQL.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Een tabel sales heeft de rijen (sale_id, amount) (91, 70), (92, 70), (93, 55), (94, 55), (95, 20). Hoeveel rijen levert SELECT sale_id, amount FROM sales ORDER BY amount DESC FETCH FIRST 3 ROWS WITH TIES; op in PostgreSQL?
  1. 4 rijen
  2. 2 rijen
  3. 5 rijen
  4. 3 rijen
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een paginaquery gebruikt ORDER BY item_id LIMIT 4 OFFSET 4 op ongewijzigde rijen met unieke identificatiewaarden 1 tot en met 12. Vóór de volgende paginaquery wordt rij 2 verwijderd. Welke identificatiewaarden levert LIMIT 4 OFFSET 8 nu op bij dezelfde sortering?
  1. 9, 10, 11, 12
  2. 8, 9, 10, 11
  3. 10, 11, 12
  4. 9, 10, 11
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Een tabel tasks heeft de rijen (task_id, owner, hours) (101, 'Lee', 9), (102, 'Ari', 8), (103, 'Lee', 5), (104, 'Lee', 3). Welke identificatiewaarde levert SELECT task_id FROM tasks WHERE owner = 'Lee' ORDER BY hours DESC LIMIT 1 OFFSET 1; op?
  1. 103
  2. 102
  3. 101
  4. 104
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 5: Volledige query's en resultaatcontroles10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Wat is de geschreven volgorde van clausules voor een tabelquery met een filter, een sortering en een rijlimiet?
  1. SELECT, FROM, ORDER BY, WHERE, LIMIT
  2. FROM, SELECT, WHERE, ORDER BY, LIMIT
  3. SELECT, FROM, WHERE, LIMIT, ORDER BY
  4. SELECT, FROM, WHERE, ORDER BY, LIMIT
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Een tabel courses heeft title, een numerieke fee en een numerieke places_left. Welke query toont de titels en kosten van cursussen onder € 75 met beschikbare plaatsen, de goedkoopste eerst?
  1. SELECT title, fee FROM courses WHERE fee < 75 AND places_left > 0 ORDER BY fee;
  2. SELECT title, fee FROM courses WHERE fee <= 75 AND places_left > 0 ORDER BY fee;
  3. SELECT title, fee FROM courses WHERE fee < 75 OR places_left > 0 ORDER BY fee;
  4. SELECT title, fee FROM courses WHERE fee < 75 AND places_left > 0 ORDER BY fee DESC;
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Een tabel cases heeft de rijen (case_id, team, opened_on, phone) (111, 'Red', '2026-06-12', 'x'), (112, NULL, '2026-06-20', 'y'), (113, 'Blue', '2026-06-18', NULL), (114, 'Blue', '2026-06-10', 'z'). Welke geordende identificatiewaarden geven de twee nieuwste zaken buiten Red, inclusief zaken zonder toegewezen team, met een vastgelegd telefoonnummer?
  1. 113, 114
  2. 112, 114
  3. 112, 113
  4. Alleen 114
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Een rij in rentals heeft branch = 'East' en returned = 'yes'. Een query moet niet-teruggebrachte huurartikelen uit East of West tonen, maar deze rij verschijnt. Het filter is branch = 'East' OR branch = 'West' AND returned = 'no'. Welke correctie past de terugbrengregel op beide vestigingen toe?
  1. branch = 'East' AND branch = 'West' AND returned = 'no'
  2. branch = 'East' OR (branch = 'West' AND returned = 'no')
  3. (branch = 'East' OR branch = 'West') AND returned = 'no'
  4. (branch = 'East' OR branch = 'West') OR returned = 'no'
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Een tabel catalog heeft ASCII-productnamen. Welke voorwaarde vindt namen die steel bevatten zonder onderscheid tussen ASCII-hoofdletters en kleine letters, zowel in SQLite als in PostgreSQL?
  1. LOWER(name) LIKE '%steel%'
  2. name LIKE 'steel%'
  3. LOWER(name) LIKE 'steel%'
  4. name = '%steel%'
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Een SQLite-tekstkolom heeft de codes 'G', 'G1', 'H2', 'J' en 'J1' met binaire sorteerregels. Welke verzameling voldoet aan WHERE code BETWEEN 'G' AND 'J' AND code NOT LIKE 'H%'?
  1. {G, H2, J}
  2. {G, G1, J, J1}
  3. {G1, J1}
  4. {G, G1, J}
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Een tabel logs bevat de rijen (region, channel) ('East', 'web'), ('East', 'web'), ('East', 'store'), ('West', 'web'), ('West', 'store'). Welke geordende rijen levert SELECT DISTINCT region, channel FROM logs WHERE channel = 'web' ORDER BY region DESC LIMIT 1; op?
  1. West-web, East-web
  2. East-web
  3. West-web
  4. West-store
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Een tabel bids in PostgreSQL heeft de rijen (bid_id, amount) (121, 90), (122, 90), (123, 80), (124, 80). Hoeveel rijen levert SELECT bid_id, amount FROM bids ORDER BY amount DESC, bid_id FETCH FIRST 3 ROWS WITH TIES; op?
  1. 4 rijen
  2. 3 rijen
  3. 2 rijen
  4. 1 rij
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een tabel sensors bevat de rijen (sensor_id, reading, enabled) (131, NULL, 'yes'), (132, 8, 'yes'), (133, 2, 'no'), (134, NULL, 'no'). Welke verzameling voldoet aan WHERE NOT (reading > 5 AND enabled = 'yes')?
  1. {131, 133, 134}
  2. {133}
  3. {131, 133}
  4. {133, 134}
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Een rapport moet kosten van minstens 50 bevatten. Het filter is fee > 50 en de enige beschikbare testrecords hebben kosten van 20 en 80. Welke extra testwaarde voor de kosten brengt de fout het directst aan het licht?
  1. 49
  2. 50
  3. 51
  4. 100
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Kom je niet uit je eigen opgave? Huiswerkhulp

Kernbegrippen

61 Kernbegrippen, elk met een definitie

A

Aanvullende sorteerkolom
Een aanvullende sorteerkolom is een latere sorteerkolom die wordt geraadpleegd als eerdere sorteerwaarden gelijk zijn; een unieke laatste waarde maakt de volgorde volledig.
Als je employee_id na plaats als aanvullende sorteerkolom toevoegt, bepaalt die welke van meerdere medewerkers uit Chicago de laatste plaats op een beperkte lijst krijgt.
AND
AND is een logische operator die vereist dat beide verbonden voorwaarden waar zijn om de volledige voorwaarde door een WHERE-filter te laten komen.
De voorwaarde Sales AND Chicago behoudt Sales-medewerkers in Chicago maar sluit een Sales-medewerker uit van wie de vastgelegde plaats Denver is.
ASC
ASC geeft een oplopende volgorde aan voor een sorteerkolom, bijvoorbeeld de kleinste numerieke waarde of vroegste datum eerst; het is de standaardrichting.
Als je Lighting-producten op price ASC sorteert, komt het goedkoopste Lighting-product eerst en het duurste laatst.

B

BETWEEN
BETWEEN is een bereiktest die vereist dat een waarde minstens de onderste en hoogstens de bovenste grenswaarde is, waarbij beide zijn inbegrepen.
price BETWEEN 15.50 AND 89.00 neemt producten mee met een prijs van precies 15,50 of 89,00, de twee genoemde grensprijzen.

C

Clausulevolgorde
Clausulevolgorde is de door SQL vereiste geschreven volgorde van onderdelen van een instructie, met onder meer WHERE vóór ORDER BY en daarna de rijlimiet.
De vereiste clausulevolgorde zet WHERE vóór ORDER BY, dus als je ze omdraait, ontstaat een syntaxisfout.

D

DATE-gegevenstype
Een DATE-gegevenstype slaat kalenderdatums op als datumwaarden, zodat een database ze op datum kan vergelijken in plaats van op lokale tekstopmaak.
Het DATE-gegevenstype van PostgreSQL accepteert DATE '2022-01-01'; SQLite gebruikt deze syntaxis voor getypeerde literals niet.
DESC
DESC geeft een aflopende volgorde aan voor de bijbehorende sorteerkolom en keert de oplopende volgorde om, zodat grotere getallen of recentere datums eerst komen.
ORDER BY hire_date DESC zet een medewerker die in 2024 is aangenomen vóór een medewerker die in 2023 is aangenomen in de medewerkerslijst.
DISTINCT
DISTINCT is een toevoeging aan SELECT die dubbele volledige rijen uit het geselecteerde resultaat verwijdert en opgeslagen records ongewijzigd laat.
Wanneer acht medewerkers in drie plaatsen werken, geeft SELECT DISTINCT city FROM employees; alleen die drie plaatsen weer.
Driewaardige logica
Driewaardige logica is het systeem van SQL om ware, onware en onbekende voorwaarden te combineren met operatoren zoals AND, OR en NOT.
Volgens de driewaardige logica komt een product met ontbrekende voorraad door een voorraad-OR-prijstest wanneer de tak price > 100 waar is.
Dubbele resultaatrij
Een dubbele resultaatrij is een rij waarvan alle geselecteerde waarden overeenkomen met een andere resultaatrij volgens de geldende regels voor duplicaatvergelijking.
Twee medewerkers met dezelfde afdeling en plaats leveren een dubbele resultaatrij op in een lijst met afdelingen en plaatsen, dus DISTINCT behoudt hun paar één keer.

E

Eerste sorteerkolom
De eerste sorteerkolom is het eerste ORDER BY-veld, dat de hoofdvolgorde bepaalt voordat latere kolommen tussen gelijke waarden beslissen.
Plaats is de eerste sorteerkolom in ORDER BY city, last_name, waardoor de namen uit Boston vóór die uit Chicago blijven.
ESCAPE-clausule
Een ESCAPE-clausule geeft een teken op dat een volgend jokerteken binnen een LIKE-patroon letterlijk maakt, zodat je naar een echte % of _ kunt zoeken.
De ESCAPE-clausule in LIKE 'SPRING!_%' ESCAPE '!' maakt het lage streepje na SPRING tot een letterlijk teken.

F

FROM-clausule
De FROM-clausule geeft aan welke tabel de records voor een eenvoudige query levert, zodat de geselecteerde kolommen daaruit kunnen worden gelezen.
De FROM-clausule in SELECT name, price FROM products; geeft products aan als bron van beide velden.

G

Geselecteerde combinatie
Een geselecteerde combinatie is de groep waarden die samen in één resultaatrij verschijnen; een kolom toevoegen kan veranderen of de combinatie uniek is.
Als je employee_id toevoegt, wordt elke geselecteerde combinatie in een plaatsresultaat verschillend omdat de identificatiewaarden uniek zijn.
Grenspunt
Een grenspunt is een grens die het begin of einde van een bereik bepaalt; of het is inbegrepen, hangt af van de gekozen vergelijking.
Elke grensprijs in BETWEEN 15.50 AND 89.00 is inbegrepen, dus producten met een prijs van precies 15,50 of 89,00 voldoen allebei.
Grenswaardencontrole
Een grenswaardencontrole test waarden precies op, net onder of net boven een grenswaarde om na te gaan of de query die volgens het verzoek wel of niet insluit.
Een grenswaardencontrole met een salaris van precies 60.000 maakt onderscheid tussen “minstens 60.000” en een strikt groter-danfilter.

H

Halfopen datumbereik
Een halfopen datumbereik sluit de begingrens in en de eindgrens uit, vaak het begin van de volgende dag of maand.
Een halfopen datumbereik voor maart stopt vóór '2024-04-01', zodat late tijden op de laatste dag behouden blijven.

I

Identificator
Een identificator is een naam voor een databaseobject, zoals een tabel of kolom; de spelling en aanhalingstekens moeten de regels van de database volgen.
De identificator hire_date duidt een kolom aan, terwijl de tekst '2024-02-19' tussen aanhalingstekens een waarde voorstelt.
ILIKE
ILIKE is de hoofdletterongevoelige operator voor patroonvergelijking van PostgreSQL; deze biedt een databasespecifiek alternatief voor gewone LIKE.
Een PostgreSQL-zoekopdracht met name ILIKE '%desk%' kan overeenkomen met productnamen die de tekst Desk met een hoofdletter bevatten.
IN
IN is een lidmaatschapstest die controleert of een volledige waarde gelijk is aan een element in een lijst met toegestane waarden tussen haakjes.
department IN ('IT', 'Marketing') selecteert elke IT- of Marketing-medewerker zonder een afdelingsvergelijking te herhalen.
IN-lijst
Een IN-lijst is een door komma's gescheiden verzameling mogelijke overeenkomsten tussen haakjes; de volgorde van de elementen ordent queryresultaten niet.
Een IN-lijst met (6, 2, 2, 4) komt overeen met dezelfde medewerkersrecords als (2, 4, 6), ondanks de volgorde en herhaling.
Inclusieve grenswaarde
Een inclusieve grenswaarde laat een waarde toe die precies gelijk is aan de grens; de vergelijkingsoperatoren >= en <= drukken die insluiting uit.
Een inclusieve grenswaarde van 60.000 behoudt een medewerker met een salaris van precies 60.000 als het filter salary >= 60000 gebruikt.
IS NOT DISTINCT FROM
IS NOT DISTINCT FROM is een vergelijking die twee NULL-waarden als gelijk behandelt en invoer die niet NULL is vergelijkt zoals bij gewone gelijkheid.
SQLite en PostgreSQL bieden IS NOT DISTINCT FROM als een vergelijking twee aanduidingen voor ontbrekende waarden als gelijk moet behandelen.
IS NOT NULL
IS NOT NULL is een directe test die waar is als een kolom een aanwezige afzonderlijke waarde bevat, inclusief lege tekst waar die verschilt van NULL.
Het filter phone IS NOT NULL behoudt een medewerker van wie het telefoonnummer is vastgelegd, ook als de afdeling van die medewerker ontbreekt.
IS NULL
IS NULL is een directe test op een ontbrekende afzonderlijke waarde; anders dan een gelijkheidsvergelijking met NULL geeft deze een duidelijk resultaat waar of onwaar.
phone IS NULL vindt de medewerkers in wier records geen telefoonwaarde is vastgelegd.
ISO-datumnotatie
De ISO-datumnotatie YYYY-MM-DD schrijft het jaar vóór de maand en dag met vaste breedte, zodat datumtekst chronologisch kan worden gesorteerd.
Met de ISO-datumnotatie neemt hire_date >= '2023-01-01' medewerkers mee die op of na die datum in dienst zijn getreden bij vergelijkingen in kalendervolgorde.

L

Laag streepje als jokerteken
Het lage streepje als jokerteken is het teken _ binnen een LIKE-patroon, waar het op die positie voor precies één teken staat.
Vier lage streepjes als jokerteken komen overeen met voornamen zoals Emma en Hugo omdat ze elk vier tekens hebben.
Lege tekenreeks
Een lege tekenreeks is een bekende tekenreeks met nul tekens, geschreven als twee enkele aanhalingstekens naast elkaar; de meeste databases maken onderscheid tussen een lege tekenreeks en NULL.
In SQLite controleert phone = '' op lege tekst en vindt het de ontbrekende telefoonwaarden van medewerkers niet.
LIKE
LIKE is een tekstvergelijkingsoperator die een volledige waarde toetst aan een patroon met letterlijke tekens en eventuele jokertekens.
name LIKE '%Lamp%' vindt elke productnaam die Lamp bevat, of Lamp nu aan het begin, in het midden of aan het einde staat.
LIMIT
LIMIT is een clausule voor het aantal rijen die hoogstens het opgegeven aantal resultaatrijen oplevert, zonder zelf een rangorde te kiezen.
Een filter voor medewerkers in Boston met LIMIT 5 levert slechts twee rijen op wanneer maar twee medewerkers in Boston voldoen.
Logische verwerkingsvolgorde
De logische verwerkingsvolgorde is het model dat het resultaat van een query verklaart door te lezen, filteren, selecteren, duplicaten te verwijderen, sorteren en rijen te beperken.
De logische verwerkingsvolgorde verwijdert herhaalde plaatsen voordat een LIMIT rijen telt in een DISTINCT-plaatsresultaat.

N

NOT
NOT is een logische operator die waar in onwaar en onwaar in waar verandert; in SQL laat deze een onbekende voorwaarde onbekend.
De ontkenning van stock > 10 neemt een product met ontbrekende voorraad niet mee, omdat die rij nog steeds een onbekende voorwaarde oplevert.
NOT BETWEEN
NOT BETWEEN is de ontkenning van een inclusieve bereiktest; voor een waarde die niet NULL is, behoudt deze waarden onder de ondergrens of boven de bovengrens.
stock NOT BETWEEN 5 AND 40 behoudt een product met nul voorraad en een product met zestig, maar sluit ontbrekende voorraad uit.
NOT IN
NOT IN is een uitsluitingstest die vereist dat een waarde verschilt van elk opgegeven element; een NULL in de lijst voorkomt een overeenkomst voor WHERE.
city NOT IN ('Chicago', 'Denver') behoudt medewerkers in Boston omdat hun plaatsen van beide elementen verschillen.
NULL
NULL is een aanduiding voor een ontbrekende waarde, zoals gegevens die onbekend, niet vastgelegd of niet van toepassing zijn, en verschilt van een bekende nul.
Wanneer een product voorraad NULL heeft, zegt de rij niets over het aantal eenheden dat momenteel in het magazijn ligt.
NULLS LAST
NULLS LAST is een toevoeging aan ORDER BY die ontbrekende waarden voor de bijbehorende sorteerkolom expliciet na vastgelegde waarden plaatst.
department NULLS LAST plaatst medewerkers zonder vastgelegde afdeling na de vastgelegde afdelingen in query's van de huidige versies van SQLite en PostgreSQL.
Numerieke literal
Een numerieke literal is een getal dat rechtstreeks in SQL wordt geschreven met cijfers en zo nodig een decimale punt, zonder valutanotatie.
De numerieke literal 20.50 in price < 20.50 heeft geen aanhalingstekens, scheidingsteken voor duizendtallen of valutateken.

O

OFFSET
OFFSET is een clausule die een opgegeven aantal resultaatrijen overslaat voordat de rijlimiet telt welke rijen moeten worden opgehaald.
Bij aflopende salarissen slaat LIMIT 3 OFFSET 3 de drie medewerkers met het hoogste salaris over en levert het de vierde, vijfde en zesde op.
Onbekende waarheidswaarde
De onbekende waarheidswaarde is de derde waarheidstoestand van SQL. Deze ontstaat als ontbrekende gegevens een duidelijke vergelijking verhinderen; WHERE laat rijen met deze toestand weg.
De ontbrekende voorraad van een product levert een onbekende waarheidswaarde op voor stock > 10, dus die rij komt niet door het filter.
Ondergrens
Een ondergrens is de waarde aan de onderkant van een bereik, die bij gewoon BETWEEN vóór AND staat; omgekeerde grenzen worden niet automatisch verwisseld.
De ondergrens 89,00 in price BETWEEN 89.00 AND 15.50 is hoger dan de bovengrens, zodat er geen overeenkomsten zijn.
Operatorprioriteit
Operatorprioriteit is de voorrangsvolgorde voor het evalueren van gemengde operatoren zonder haakjes; bij logische operatoren komt eerst NOT, dan AND en dan OR.
Door de operatorprioriteit zijn haakjes nodig als een plaatsvoorwaarde op elk van twee afdelingsalternatieven die met OR zijn verbonden moet worden toegepast.
OR
OR is een logische operator waarvan de voorwaarde waar is als minstens één verbonden voorwaarde waar is, ook als beide waar zijn.
Sales OR Chicago laat medewerkers van Sales in andere plaatsen toe, medewerkers in Chicago van andere afdelingen, evenals medewerkers die aan beide voldoen.
ORDER BY
ORDER BY is de clausule die resultaatrijen ordent op opgegeven sorteerwaarden; zonder deze clausule garandeert SQL geen rijvolgorde.
ORDER BY salary DESC plaatst de best betaalde medewerker eerst zonder een opgeslagen medewerkersrecord te veranderen.

P

Pagina
Een pagina is een deel van een queryresultaat; bij n rijen per pagina slaat pagina k de rijen in de k − 1 volledige pagina's ervoor over.
Met drie rijen per pagina gebruikt de derde pagina OFFSET 6 en toont de rijen na de zesde in een vaste salarisrangorde.
Procentteken als jokerteken
Het procentteken als jokerteken is het teken % binnen een LIKE-patroon, waar het staat voor een willekeurige reeks van nul of meer tekens.
Het procentteken als jokerteken in 'Lamp%' staat elk achtervoegsel na Lamp toe, ook geen achtervoegsel bij de waarde Lamp.

Q

Query
Een query is een verzoek om gegevens uit een database, geschreven als een instructie die aangeeft welke records of waarden moeten worden opgehaald.
De query SELECT first_name FROM employees; vraagt de database om het voornaamveld van elke medewerker.
Queryoptimalisator
Een queryoptimalisator kiest een intern uitvoeringsplan dat kan afwijken van het logische model, terwijl het gedefinieerde resultaat van de query behouden blijft.
Een queryoptimalisator kan overeenkomsten vinden zonder de hele tabel daadwerkelijk in de aangeleerde logische volgorde te verwerken.

R

Resultaatcontrole
Een resultaatcontrole vergelijkt de velden, rijen die voldoen, volgorde en het aantal rijen van een query met het verzoek om een aannemelijk maar verkeerd antwoord op te sporen.
Een resultaatcontrole op een product met nulvoorraad verklaart waarom dit product ontbreekt in een lijst met goedkope producten die op voorraad zijn.
Resultaatset
Een resultaatset is de tabel met rijen en kolommen die een query oplevert; deze kan minder velden of records bevatten dan de bron.
Voor een tabel met acht medewerkers heeft de resultaatset van SELECT city FROM employees; acht rijen, waarbij plaatswaarden herhaald mogen worden.

S

SELECT-clausule
De SELECT-clausule geeft aan welke kolommen in een queryresultaat worden weergegeven en bepaalt de volgorde waarin die uitvoerkolommen verschijnen.
De SELECT-clausule in SELECT city, first_name FROM employees; zet de plaats vóór de voornaam van de medewerker.
Sorteerkolom
Een sorteerkolom is een veld dat in ORDER BY wordt genoemd om de volgorde van resultaatrijen te bepalen; in een gewone SELECT-query hoeft het niet te worden weergegeven.
Salaris kan de sorteerkolom zijn als de uitvoer alleen first_name toont, wat een gerangschikte lijst met namen oplevert.
Sorteerregels
Sorteerregels zijn de regels voor het vergelijken en ordenen van tekst, inclusief hoe hoofdletters, kleine letters en tekens met accenten worden behandeld.
Hoofdlettergevoelige sorteerregels maken onderscheid tussen 'Chicago' en 'chicago', zodat een filter op 'chicago' rijen mist die als Chicago zijn opgeslagen.
SQL-commentaar
SQL-commentaar is toelichtende tekst die wordt genegeerd wanneer een instructie wordt uitgevoerd; twee koppeltekens beginnen commentaar dat tot het einde van de regel loopt.
SQL-commentaar na -- kan uitleggen waarom een filter medewerkers zonder toegewezen afdeling meeneemt, zonder de voorwaarden te veranderen.
SQL-dialect
Een SQL-dialect is de versie van SQL-syntaxis en -gedrag van een databasesysteem, inclusief verschillen in rijlimieten, tekstvergelijking en aanhalingstekens.
Als het SQL-dialect van SQLite naar SQL Server verandert, heeft een LIMIT-query in plaats daarvan TOP of OFFSET/FETCH nodig.
Stapsgewijze queryopbouw
Bij stapsgewijze queryopbouw voeg je steeds één voorwaarde toe en controleer je die, zodat je makkelijker kunt uitleggen door welke voorwaarde elke rij afvalt.
Bij stapsgewijze queryopbouw voeg je een telefoontest na een afdelingstest toe om te laten zien welke medewerkers door de telefoontest afvallen.

T

Tekstliteral
Een tekstliteral is een waarde die rechtstreeks tussen enkele aanhalingstekens in SQL wordt geschreven; een apostrof binnen de waarde wordt verdubbeld om die te behouden.
De tekstliteral 'O''Neill' komt overeen met de achternaam O'Neill omdat de twee enkele aanhalingstekens naast elkaar één apostrof voorstellen.
TOP
TOP is de syntaxis van SQL Server voor een rijlimiet bij SELECT, die samen met ORDER BY wordt gebruikt als een verzoek om een bepaalde hoogste of eerste reeks rijen vraagt.
SELECT TOP (3) kan een beperkte lijst met LIMIT voor drie rijen vervangen wanneer de query voor SQL Server wordt geschreven.

V

Vergelijkingsoperator
Een vergelijkingsoperator test de relatie tussen twee waarden, zoals gelijkheid of welke groter is, en levert een waarheidstoestand op.
De vergelijkingsoperator >= neemt een medewerker met een salaris van precies 60.000 mee in salary >= 60000 omdat dat salaris gelijk is aan de grenswaarde.
Volledige sorteervolgorde
Een volledige sorteervolgorde onderscheidt elke resultaatrij op basis van de sorteerwaarden en geeft herhaalbare rijposities zolang de gegevens ongewijzigd blijven.
De volledige sorteervolgorde ORDER BY city, employee_id bepaalt de positie van elke medewerker met behulp van de unieke identificatiewaarde.

W

WHERE-clausule
De WHERE-clausule filtert bronrecords met een voorwaarde en behoudt alleen de rijen waarvoor die voorwaarde waar is.
De WHERE-clausule WHERE salary < 50000 behoudt medewerkers met een salaris onder 50.000, ook als de uitvoer hun salarissen verbergt.
WITH TIES
WITH TIES breidt, waar ondersteund, een FETCH-rijlimiet uit met extra rijen die voor elke ORDER BY-waarde gelijk zijn aan de rij op de grens.
Met ORDER BY city neemt FETCH FIRST 3 ROWS WITH TIES elke rij mee die dezelfde plaats heeft als de derde rij, niet alleen drie rijen.

Over deze les

Door StudeliFout melden

Maak je eigen Studiemateriaal

Maak van je aantekeningen, slides en documenten Leermodules, Oefenvragen, Flashcards en 6 andere tools.

Aan de slag