- Leren
- Informatica & ICT
- Programmeren
- De basis van SQL
- SQL CASE en functies
SQL CASE en functies: berekende kolommen
BeginnerLes 3 van 6 in SQL: de basis
Wat je leert
- Bereken voor elke rij nieuwe waarden met rekenkundige operatoren en functies, geef de resultaten duidelijke namen en voorkom dat gegevenstypen de uitkomst veranderen.
- Bereken nieuwe kolommen en geef ze namen met aliassenSchrijf expressies in de SELECT-lijst, geef de resultaten een naam met AS en weet waar je die namen in een query kunt gebruiken.
- Reken met rekenkundige operatoren en numerieke functiesGebruik +, -, *, / en % in de juiste volgorde, voorkom verrassingen door gehele deling en rond resultaten af met ROUND en verwante functies.
- Converteer waarden naar andere gegevenstypenHerken het type van elke waarde, converteer dit expliciet met CAST en herken automatische conversies die de sortering, vergelijkingen en resultaten veranderen.
- Bereken nieuwe kolommen en geef ze namen met aliassen
- Voorspel wat NULL doet met berekeningen, vergelijkingen en filters en vervang of maak bewust ontbrekende waarden.
- Voorspel hoe NULL zich gedraagt in berekeningen en voorwaardenLeg uit wat NULL betekent, hoe het zich door expressies verspreidt en waarom een voorwaarde met NULL waar noch onwaar is.
- Vervang en maak ontbrekende waarden met COALESCE en NULLIFVul ontbrekende waarden aan met COALESCE, zet nullen en plaatsaanduidingen om in NULL met NULLIF en kies vervangingswaarden die de betekenis van de gegevens behouden.
- Voorspel hoe NULL zich gedraagt in berekeningen en voorwaarden
- Voeg tekstwaarden samen, schoon ze op, bepaal hun lengte en splits ze, zodat namen, e-mailadressen en codes consistent en bruikbaar worden.
- Voeg tekstwaarden samen en schoon ze opVoeg tekst samen, zet letters om naar hoofdletters of kleine letters, verwijder spaties en vervang tekens. Nest deze functies om rommelige invoer op te schonen.
- Bepaal de lengte van tekst en haal tekstdelen opTel tekens, zoek waar een teken voorkomt en haal stukken tekst op met posities die bij 1 beginnen.
- Voeg tekstwaarden samen en schoon ze op
- Schrijf en lees datumwaarden correct, haal ze uit elkaar en maak ze op, en reken met dagen, maanden en tijdspannen.
- Noteer, bewaar en lees datum- en tijdwaardenKen de datum- en tijdtypen, schrijf datums in de ondubbelzinnige ISO-notatie, converteer tekst naar datums en haal de huidige datum en tijd op.
- Haal datumonderdelen op en maak ze opHaal het jaar, de maand of de weekdag op, groepeer datums per periode en zet datums om in leesbare tekst.
- Reken met datums en filter op datumbereikenTel dagen en maanden op, bepaal de tijd tussen twee datums en schrijf datumfilters die elke rij binnen een periode meenemen.
- Noteer, bewaar en lees datum- en tijdwaarden
- Zet voorwaarden met CASE om in labels, categorieën en aangepaste sorteervolgordes en combineer CASE met de andere functies in volledige rapportagequery's.
- Deel rijen in categorieën in met CASE-expressies met voorwaardenSchrijf CASE WHEN … THEN … ELSE … END, zet de voorwaarden zo op volgorde dat elke rij in de juiste groep terechtkomt en verwerk grenswaarden en NULL-waarden.
- Gebruik eenvoudige CASE-expressies en pas CASE toe op verschillende plaatsen in een queryZet codes om met eenvoudige CASE-expressies, maak indicatoren en aangepaste sorteervolgordes en herken de kortere vormen die andere databases bieden.
- Combineer functies tot een volledige rapportagequeryBouw stap voor stap een rapport met meerdere berekende kolommen, nest functies correct en controleer elke kolom aan de hand van met de hand uitgewerkte rijen.
- Deel rijen in categorieën in met CASE-expressies met voorwaarden
SQL CASE en functies: uitleg
1Maak berekende kolommen met expressies en aliassen
Berekende kolommen zetten de waarden die al in een rij staan om in bruikbare antwoorden: een regelbedrag, een korting of een procentuele verandering. Duidelijke aliassen maken die resultaten leesbaar, terwijl haakjes en gegevenstypen bepalen wat SQL daadwerkelijk berekent. Je bouwt expressies in kleine stappen op, ziet waarom gehele deling een breuk kan laten verdwijnen en kiest expliciete typeconversies als de opgeslagen vorm niet bij de bewerking past.
1.1 Bereken nieuwe kolommen en geef ze namen met aliassen
Een resultaatkolom kan een waarde tonen die nergens in de tabel is opgeslagen. SQL berekent die op basis van de huidige rij. Een expressie combineert kolommen, vaste waarden, operatoren en functieaanroepen.
Bereken voor elke rij een waarde
SELECT order_id,
quantity * unit_price AS line_total
FROM orders;
Bij hoeveelheid 3 en eenheidsprijs 12,50 toont de nieuwe kolom 37.5. Elke rij levert zijn eigen hoeveelheid en prijs. De query laat de opgeslagen kolommen ongemoeid. Een scalaire functie, zoals ROUND(unit_price, 0), geeft ook één waarde per invoerrij terug. Als je die aan de SELECT-lijst toevoegt, worden rijen niet gecombineerd. Een aggregatiefunctie zoals SUM of AVG berekent daarentegen een waarde voor een groep.
De naam na AS is een kolomalias: een kolomkop voor het resultaat. Zonder alias gebruikt SQLite de expressie als kolomkop; PostgreSQL gebruikt ?column? voor deze rekenkundige expressie. AS is optioneel, maar maakt een naam gemakkelijker te onderscheiden van een ontbrekende komma.
Kies namen en aanhalingstekens
Gebruik een eenvoudige naam zoals line_total: letters, cijfers en lage streepjes, beginnend met een letter. Een naam met een spatie of een gereserveerd woord heeft dubbele aanhalingstekens nodig: AS "Line Total" of AS "order". Enkele aanhalingstekens markeren tekstwaarden, zoals 'Boston'. MySQL accepteert voor namen ook backticks en SQL Server accepteert rechte haken.
PostgreSQL zet namen zonder aanhalingstekens om naar kleine letters: AS LineTotal levert linetotal op. Dubbele aanhalingstekens behouden de schrijfwijze in AS "LineTotal". SQLite behoudt een alias zoals je die hebt getypt. Namen in kleine letters met lage streepjes werken in beide systemen goed.
Gebruik een alias op het juiste moment
De logische volgorde is FROM, WHERE, SELECT en dan ORDER BY. De tabel wordt gekozen en rijen worden gefilterd voordat uitvoerexpressies hun aliassen krijgen. Het sorteren gebeurt daarna.
SELECT order_id,
quantity * unit_price AS line_total
FROM orders
WHERE quantity * unit_price > 100
ORDER BY line_total DESC;
ORDER BY kan line_total gebruiken. Standaard-SQL, PostgreSQL en MySQL kunnen die nieuwe alias niet in WHERE gebruiken; herhaal daar de expressie. SQLite accepteert een alias in WHERE als uitbreiding, maar die vorm mislukt als je hem naar PostgreSQL verplaatst.
Een nieuwe alias is ook niet beschikbaar voor een andere expressie in dezelfde SELECT-lijst. Na unit_price * 1.08 AS with_tax mislukt with_tax - unit_price AS tax als de tabel geen kolom with_tax heeft. Schrijf in plaats daarvan unit_price * 1.08 - unit_price AS tax.
Onderzoek een verrassend resultaat
SELECT first_name last_name FROM customers; is geldige SQL. Het toont één kolom met voornamen met de alias last_name. Om beide kolommen op te halen, schrijf je SELECT first_name, last_name FROM customers;. Een ontbrekende komma kan dus zonder foutmelding een misleidend resultaat opleveren.
Voor een snelle controle van een expressie is geen tabel nodig: SELECT 19.99 * 3 AS total; geeft 59.97 terug in SQLite en PostgreSQL. Oracle vóór Release 23 vereist FROM DUAL voor deze query; Release 23 en later staan ook SELECT zonder FROM toe.
Belangrijkste punten
- Een berekende kolom berekent voor elke rij een waarde zonder opgeslagen gegevens te wijzigen.
- Een scalaire functie behoudt de rijen; een aggregatiefunctie combineert waarden binnen een groep.
- Gebruik dubbele aanhalingstekens voor namen die aanhalingstekens nodig hebben en enkele voor tekstwaarden.
- ORDER BY kan een uitvoeralias gebruiken; herhaal de expressie in een WHERE-clausule die ook in andere databases werkt.
- Een nieuwe alias is elders in dezelfde SELECT-lijst niet beschikbaar.
- Een ontbrekende komma kan de volgende kolomnaam in een alias veranderen.
1.2 Reken met rekenkundige operatoren en numerieke functies
Rekenkundige expressies zetten oorspronkelijke hoeveelheden om in bedragen, percentages en verschillen. De operatoren zijn +, -, *, / en %; modulo geeft de rest na deling.
Bepaal de rekenvolgorde
Vermenigvuldigen, delen en modulo gaan vóór optellen en aftrekken. Operatoren met dezelfde prioriteit worden van links naar rechts uitgevoerd. Zo geeft 10 + 3 * 2 de uitkomst 16, terwijl (10 + 3) * 2 de uitkomst 26 geeft.
Voor hoeveelheid 3, eenheidsprijs 12,50 en kortingspercentage 10:
quantity * unit_price * (1 - discount_pct / 100.0)
Eerst geeft 10 / 100.0 de uitkomst 0.1. De haakjes geven het betaalde deel, 0.9. Het brutobedrag is 37.5, dus het nettobedrag is 33.75. Zonder haakjes trekt quantity * unit_price * 1 - discount_pct / 100.0 de waarde 0.1 af van 37.5 en geeft 37.4.
Behoud breuken bij het delen
In SQLite, PostgreSQL en SQL Server wordt bij deling van een geheel getal door een geheel getal het deel achter de komma afgekapt in de richting van nul: 7 / 2 geeft 3 en -7 / 2 geeft -3. MySQL en Oracle geven bij / een decimaal antwoord. Maak in SQLite en PostgreSQL vóór de deling een operand decimaal: 7 / 2.0, 7 * 1.0 / 2 of CAST(7 AS REAL) / 2 geeft 3.5. Bij CAST(7 / 2 AS REAL) is het te laat en krijg je 3.0.
Bij een stijging van 80 naar 92 geeft (92 - 80) * 100.0 / 80 de uitkomst 15.0 procent. Als je het gehele verschil eerst door 80 deelt, gaat het deel achter de komma verloren. Modulo geeft de rest: 135 / 60 is 2 uur en 135 % 60 is 15 minuten. In SQLite en PostgreSQL geeft -7 % 3 de uitkomst -1; de rest volgt het teken van de linkeroperand. Oracle schrijft MOD(17, 5) in plaats van %.
Een deler nul geeft een fout in PostgreSQL en SQL Server; SQLite en MySQL geven NULL terug. Met amount / NULLIF(divisor, 0) geven deze systemen bij nul allemaal NULL terug.
Rond af of kies een geheel getal
ROUND(x, n) rondt af op n decimalen. Een lamp met een verkoopprijs van 24,00 en kosten van 15,50 heeft een winst van 8.5. ROUND((price - cost) / price * 100, 1) geeft een marge van 35.4 procent. PostgreSQL ondersteunt negatieve aantallen decimalen: ROUND(1234.5678, -2) geeft 1200; SQLite behandelt het aantal decimalen als nul en geeft 1235.0.
| Functie | Betekenis | Voorbeeld |
|---|---|---|
ABS | Afstand tot nul | ABS(-4.2) geeft 4.2 |
CEIL | Kleinste gehele getal dat minstens even groot is | CEIL(4.1) geeft 5 |
FLOOR | Grootste gehele getal dat hoogstens even groot is | FLOOR(-4.1) geeft -5 |
TRUNC | Kap het deel achter de komma af in de richting van nul | TRUNC(42.8) geeft 42 |
PostgreSQL biedt deze functies. SQLite biedt ABS; voor CEIL, FLOOR en TRUNC is een versie nodig die met wiskundige functies is gecompileerd, beschikbaar vanaf 3.35.
Stem de precisie af op de gegevens
ROUND in SQLite en ROUND voor numeric in PostgreSQL ronden waarden precies halverwege twee uitkomsten af van nul af: ROUND(-2.5) geeft -3. PostgreSQL rondt drijvendekommagetallen bij zulke waarden meestal af naar het dichtstbijzijnde even gehele getal; ROUND met twee argumenten vereist numeric, dus gebruik ROUND(CAST(x AS numeric), 2) voor een kolom met dubbele precisie.
Drijvendekommagetallen benaderen veel decimale breuken. In SQLite kan 0.1 + 0.2 = 0.3 onwaar zijn en kan ROUND(2.675, 2) de uitkomst 2.67 geven. Decimale literals in PostgreSQL gebruiken het exacte type numeric. Gebruik voor exacte geldbedragen NUMERIC/DECIMAL in PostgreSQL of gehele centen in SQLite. Een kolom als DECIMAL declareren in SQLite zorgt niet voor exacte decimale opslag. Behoud de precisie tijdens berekeningen en rond af voor de weergave.
Belangrijkste punten
- Haakjes bepalen welke bedragen worden gecombineerd vóór vermenigvuldigen of delen.
- Converteer een operand vóór een gehele deling; conversie van het resultaat kan verloren cijfers niet herstellen.
- Modulo geeft een rest, zoals de overgebleven minuten na hele uren.
- ROUND, FLOOR, CEIL en TRUNC maken verschillende keuzes bij een waarde met een deel achter de komma.
- Afronding van drijvendekommagetallen en beschikbare numerieke functies hangen af van het type en de database.
- Gebruik voor exacte bedragen een exact numeriek type in PostgreSQL of gehele centen in SQLite.
- Met NULLIF kan een deler nul NULL opleveren in plaats van een fout.
1.3 Converteer waarden naar andere gegevenstypen
Het gegevenstype van een waarde beïnvloedt berekeningen, vergelijkingen en sortering. Het getal 42 verschilt van de tekst '42', ook als ze in een resultatenoverzicht hetzelfde worden weergegeven.
Converteer een waarde expliciet
Veelvoorkomende typen zijn INTEGER voor gehele getallen, NUMERIC of DECIMAL voor exacte decimalen in PostgreSQL, REAL of double precision voor benaderde getallen, TEXT of VARCHAR voor tekst en DATE, TIME, TIMESTAMP en BOOLEAN waar die worden ondersteund.
SELECT CAST('42' AS INTEGER) AS number_value,
CAST(42 AS TEXT) AS text_value;
CAST(expression AS type) is standaard-SQL. Het eerste resultaat is een getal; het tweede is tekst. PostgreSQL accepteert ook '42'::integer. Conversie van NULL geeft nog steeds NULL.
Schrijf voor decimale deling in SQLite CAST(quantity AS REAL) / 4; schrijf in PostgreSQL CAST(quantity AS NUMERIC) / 4. Hoeveelheid 7 geeft 1.75. CAST(7 AS NUMERIC) / 2 in SQLite geeft nog steeds 3: NUMERIC laat die gehele waarde als geheel getal opgeslagen. REAL is hiervoor de geschikte conversie in SQLite.
Weet wat conversie naar een geheel getal doet
| Invoer en conversie | SQLite | PostgreSQL |
|---|---|---|
CAST(3.9 AS INTEGER) | 3 | 4 |
CAST(-3.9 AS INTEGER) | -3 | -4 |
CAST('abc' AS INTEGER) | 0 | Fout |
SQLite kapt het deel achter de komma af in de richting van nul. PostgreSQL rondt een numerieke waarde af op het dichtstbijzijnde gehele getal. Gebruik eerst ROUND, TRUNC, FLOOR of CEIL als de gewenste regel ertoe doet. PostgreSQL wijst tekst af die geen geldig getal is. SQLite leest een numeriek begin: '12abc' wordt 12 en '12.5' wordt 12 bij conversie naar INTEGER. Nul na een conversie in SQLite bewijst dus niet dat de oorspronkelijke tekst een geldige nul was. TRY_CAST in SQL Server geeft NULL terug bij een mislukte conversie.
Onderscheid hoeveelheden van identificatoren
Tekst wordt teken voor teken gesorteerd. De tekenreeksen '9', '10' en '100' worden gesorteerd als '10', '100', '9'. Gebruik ORDER BY CAST(code AS INTEGER) om echte numerieke hoeveelheden die als tekst zijn opgeslagen te ordenen, nadat je hebt gecontroleerd dat het geldige getallen zijn.
Een Amerikaanse postcode zoals '02134' is een identificator. Conversie geeft 2134 en laat de eerste nul weg. Ook telefoonnummers horen als tekst te worden opgeslagen: hun cijfers duiden iets aan en beschrijven geen hoeveelheid die je kunt optellen of middelen.
Herken automatische conversies
Zowel SQLite als PostgreSQL zet het getal in 'Order #' || 42 om naar tekst, met als resultaat 'Order #42'. Beide berekenen ook de literal tussen aanhalingstekens in '5' + 3 als een getal. In PostgreSQL ligt het type van die literal aanvankelijk nog open; een TEXT-kolom heeft niet dezelfde vrijheid. Als je 3 bij een TEXT-kolom optelt, mislukt dat, dus converteer de kolom expliciet.
SQLite geeft kolommen een typevoorkeur, typeaffiniteit genoemd, en kan verschillende waardetypen in één gewone kolom bewaren. typeof(42), typeof(4.2), typeof('42') en typeof(NULL) geven 'integer', 'real', 'text' en 'null'. SQLite heeft geen afzonderlijk DATE-type: CAST('2026-03-14' AS DATE) geeft 2026. Gebruik date('2026-03-14') voor de datumfuncties.
Oracle biedt TO_NUMBER, TO_CHAR en TO_DATE. TO_CHAR en TO_DATE in PostgreSQL gebruiken opmaakpatronen zoals 'MM/DD/YYYY'. CONVERT in SQL Server gebruikt een numerieke stijlcode: CONVERT(date, '03/14/2026', 101) leest de Amerikaanse datumnotatie.
Belangrijkste punten
- CAST verandert een waarde expliciet naar een gevraagd type; NULL blijft NULL.
- SQLite kapt bij conversie van een numerieke waarde naar een geheel getal af, terwijl PostgreSQL afrondt.
- SQLite kan ongeldige numerieke tekst omzetten in een gedeeltelijk getal of nul.
- Bewaar Amerikaanse postcodes en telefoonnummers als tekst om hun identificerende waarde te behouden.
- Sorteren als tekst en sorteren als getal kunnen verschillende volgordes opleveren.
2Verwerk ontbrekende waarden met NULL-logica en COALESCE
Een ontbrekende waarde kan een berekening veranderen en ook beïnvloeden welke rijen een filter behoudt. Om NULL te begrijpen, volg je zowel de gegevens als de voorwaarde die ze gebruikt. Je leert ontbrekende waarden onderscheiden van nul en lege tekst, volgt TRUE, FALSE en UNKNOWN door een query en kiest vervangingswaarden die de betekenis van een rapport behouden. Met COALESCE en NULLIF kun je vervolgens ontbrekende waarden aanvullen of bewust maken.
2.1 Voorspel hoe NULL zich gedraagt in berekeningen en voorwaarden
NULL geeft een ontbrekende of onbekende waarde aan. Een lege cel in het resultaat kan NULL weergeven, maar NULL is geen gewone waarde die je met = vergelijkt.
Volg een ontbrekende invoer door een expressie
Nul is een bekend getal. Lege tekst, '', is een bekende tekenreeks zonder tekens. De tekst 'N/A' is een geregistreerd label. NULL zegt dat er geen waarde beschikbaar is. Oracle behandelt lege tekst als NULL; SQLite en PostgreSQL maken er onderscheid tussen.
De meeste rekenkundige bewerkingen en functies geven een ontbrekende invoer door als NULL. Bij salaris 50.000 en bonus NULL geeft salary + bonus de uitkomst NULL. Het totaal is onbekend omdat de bonus onbekend is. Ook UPPER(NULL), ROUND(NULL, 2) en 'Ana ' || NULL geven NULL terug in SQLite en PostgreSQL.
Test rechtstreeks op NULL
bonus = NULL, bonus <> NULL en zelfs NULL = NULL leveren UNKNOWN op. Van twee ontbrekende waarden is niet bekend dat ze gelijk zijn. Gebruik bonus IS NULL of bonus IS NOT NULL. Deze tests geven altijd TRUE of FALSE terug.
SQL-voorwaarden hebben drie mogelijke resultaten: TRUE, FALSE en UNKNOWN. SQLite toont TRUE als 1, FALSE als 0 en UNKNOWN als NULL.
| Voorwaarde | Resultaat | Reden |
|---|---|---|
FALSE AND UNKNOWN | FALSE | Eén onware eis sluit AND uit |
TRUE AND UNKNOWN | UNKNOWN | De tweede eis is onbeslist |
TRUE OR UNKNOWN | TRUE | Eén waar alternatief maakt OR waar |
FALSE OR UNKNOWN | UNKNOWN | Het andere alternatief is onbeslist |
NOT UNKNOWN | UNKNOWN | Een onbekende waarde omkeren maakt haar niet bekend |
Begrijp welke rijen WHERE behoudt
WHERE behoudt alleen TRUE. Zowel FALSE als UNKNOWN laat de rij wegvallen. Bij bonussen van 1000, 0, NULL, 2500 en NULL behoudt WHERE bonus < 1000 alleen de nul. WHERE bonus >= 1000 behoudt 1000 en 2500. Deze filters omvatten drie rijen, geen vijf. Ook WHERE NOT (bonus < 1000) behoudt alleen de twee bekende bonussen van minstens 1000.
Hetzelfde probleem geldt voor <>. Bij de steden Boston, Denver, NULL, Boston en Austin behoudt WHERE city <> 'Boston' Denver en Austin. Neem de onbekende stad expliciet mee:
WHERE city <> 'Boston' OR city IS NULL
Dit behoudt drie rijen. NOT haalt ontbrekende waarden niet automatisch terug.
Let op bij lijsten en vergelijkingen
3 IN (1, 2, NULL) is UNKNOWN: het ontbrekende lid kan 3 zijn. Voor x NOT IN (1, 2, NULL) voldoet een overeenkomende waarde niet aan NOT IN en geeft elke niet-overeenkomende waarde UNKNOWN. In een WHERE-clausule behoudt deze vaste lijst geen rijen. Verwijder een onbedoelde NULL uit een uitsluitingslijst voordat je die gebruikt.
Gebruik a IS NOT DISTINCT FROM b voor een gelijkheidsvergelijking die twee NULL-waarden als gelijk behandelt. Het tegenovergestelde, a IS DISTINCT FROM b, is TRUE als de ene waarde NULL is en de andere niet; twee NULL-waarden zijn niet verschillend. PostgreSQL en SQLite vanaf 3.39 ondersteunen deze vormen. SQLite heeft ook IS en IS NOT; MySQL schrijft NULL-veilige gelijkheid als <=>.
De standaardplaats voor NULL bij het sorteren verschilt: SQLite zet NULL vooraan bij oplopend sorteren; PostgreSQL zet NULL achteraan. Geef de plaats aan als die ertoe doet: ORDER BY bonus DESC NULLS LAST zet bekende bonussen in aflopende volgorde en ontbrekende bonussen aan het einde.
Belangrijkste punten
- NULL is ontbrekend of onbekend, geen nul of lege tekst.
- Vergelijkingen met NULL geven UNKNOWN; test met IS NULL of een waarde ontbreekt.
- WHERE behoudt alleen TRUE, dus NOT en <> halen rijen met een onbekend resultaat niet terug.
- AND en OR kunnen een onbekende waarde alleen oplossen als de andere voorwaarde het resultaat bepaalt.
- Een NULL in een NOT IN-lijst verhindert dat die voorwaarde TRUE wordt.
- IS NOT DISTINCT FROM behandelt twee NULL-waarden als gelijk.
- NULLS FIRST of NULLS LAST maakt de sorteervolgorde expliciet.
2.2 Vervang en maak ontbrekende waarden met COALESCE en NULLIF
Soms hebben ontbrekende waarden een vervangingswaarde nodig en soms moeten ze ontbreken. Die keuze maakt deel uit van de betekenis van een rapport. COALESCE vult een ontbrekende waarde aan; NULLIF maakt van een overeenkomende plaatsaanduiding een ontbrekende waarde.
Kies de eerste beschikbare waarde
COALESCE(a, b, ...) controleert van links naar rechts en geeft het eerste argument terug dat niet NULL is. Het geeft NULL terug als elk argument NULL is.
SELECT COALESCE(mobile_phone, home_phone, 'no phone') AS contact
FROM customers;
Zonder mobiel nummer en met huistelefoonnummer '555-0100' is het contactnummer '555-0100'. Als geen van beide nummers is geregistreerd, is het 'no phone'. Een bekende nul of lege tekenreeks geldt als beschikbaar: COALESCE slaat NULL over, geen waarden die leeg of onwaar lijken.
Voor de beloning geeft salary + COALESCE(bonus, 0) de uitkomst 50.000 als het salaris 50.000 is en de bonus NULL. Dit is passend als een ontbrekende bonus betekent dat er geen is betaald. Een ontbrekende productbeoordeling betekent geen beoordeling van nul; door die te vervangen zou je een slechte beoordeling verzinnen. Laat dat getal ontbreken of maak een tekstlabel voor de weergave.
Houd vervangingstypen compatibel
PostgreSQL kan de gehele waarde rating en de tekst 'not rated' niet combineren in één numeriek resultaat. Converteer de bekende beoordelingen eerst naar tekst:
COALESCE(CAST(rating AS TEXT), 'not rated')
Een beoordeling van 4 wordt weergegeven als de tekst '4'; een NULL wordt weergegeven als 'not rated'. SQLite accepteert gemengde numerieke en tekstargumenten, maar de uitvoer kan dan verschillende typen bevatten. Maak het gewenste resultaattype duidelijk als je een query tussen databases verplaatst.
COALESCE is standaard-SQL en accepteert twee of meer argumenten. De gebruikelijke alternatieven met twee argumenten zijn IFNULL in SQLite en MySQL, ISNULL in SQL Server en NVL in Oracle.
Zet een plaatsaanduiding om in NULL
NULLIF(a, b) geeft NULL terug als de argumenten gelijk zijn; anders geeft het het eerste argument terug. NULLIF(0, 0) is NULL, terwijl NULLIF(5, 0) gelijk is aan 5.
Een bruikbare expressie voor een percentage is:
orders * 100.0 / NULLIF(visits, 0) AS conversion_pct
Bij 12 orders en 300 bezoeken blijft de deler 300 en is het percentage 4.0. Bij nul bezoeken wordt de deler NULL en wordt het percentage NULL. PostgreSQL voorkomt zo een fout door deling door nul en het resultaat geeft correct aan dat het percentage niet is gedefinieerd. Dat percentage vervangen door nul zou iets anders beweren.
Schoon ontbrekende waarden op voordat je een label geeft
COALESCE(NULLIF(phone, ''), 'unknown')
De binnenste NULLIF zet een lege tekenreeks om in NULL. De buitenste COALESCE geeft vervolgens zowel een oorspronkelijke NULL als een lege tekenreeks het label 'unknown'. Een geregistreerd telefoonnummer komt er ongewijzigd doorheen.
Neem bij een optionele tweede voornaam de afsluitende spatie op binnen de vervangingswaarde:
first_name || ' ' || COALESCE(middle_name || ' ', '') || last_name
Een tweede voornaam die NULL is, voegt niets toe en geeft 'Ana Lopez'. Een tweede voornaam 'Maria' voegt 'Maria ' toe en geeft 'Ana Maria Lopez'.
Deze expressies veranderen alleen het queryresultaat. Ze laten de oorspronkelijke waarden in de tabel staan. Een filter zoals WHERE COALESCE(bonus, 0) = 0 groepeert bekende nulbonussen en ontbrekende bonussen samen, dus gebruik dit als je die twee groepen wilt hebben.
Belangrijkste punten
- COALESCE geeft het eerste argument terug dat niet NULL is, ook als dat een bekende nul of lege tekst is.
- Een vervangingswaarde moet de betekenis van de ontbrekende gegevens uitdrukken en een compatibel type hebben.
- NULLIF geeft NULL terug bij gelijkheid en anders het eerste argument.
- Gebruik NULLIF rond een deler om bij een noemer nul NULL terug te geven.
- Schoon een plaatsaanduiding op met NULLIF voordat je met COALESCE een vervangingswaarde voor de weergave toepast.
3Schoon tekst op, voeg tekst samen en splits tekst met tekenreeksfuncties
Tekst uit een tabel moet vaak een bruikbare vorm krijgen: een volledige naam, een consistent e-mailadres of een deel van een code. SQL kan tekenreeksen samenvoegen en opschonen, hun tekens tellen en het deel vóór of na een scheidingsteken ophalen. Je volgt de tekenposities bij elke stap en controleert hoe spaties, hoofdletters en kleine letters, en NULL het resultaat beïnvloeden. SQLite en PostgreSQL delen veel functies, maar verschillen in diverse namen en gedragingen.
3.1 Voeg tekstwaarden samen en schoon ze op
SQL behandelt een tekstwaarde als een tekenreeks. Tekstfuncties kunnen een volledige naam samenstellen of een e-mailadres opschonen voor vergelijking. Hun resultaten verschijnen in de query; opgeslagen tekst blijft ongewijzigd.
Schrijf tekst en voeg die samen
Tekstliterals gebruiken enkele aanhalingstekens. Om een apostrof op te nemen, verdubbel je die: 'O''Brien' stelt “O'Brien” voor. Een paar enkele aanhalingstekens, '', is lege tekst.
SELECT first_name || ' ' || last_name AS full_name
FROM customers;
De concatenatie-operator || voegt de onderdelen precies zoals geschreven samen. Met 'Ana' en 'Lopez' is het resultaat 'Ana Lopez'. De middelste literal levert de spatie; concatenatie voegt die niet automatisch in.
SQLite, PostgreSQL en Oracle gebruiken ||. In MySQL betekent || standaard OR, dus gebruik daar CONCAT. SQL Server gebruikt + en ondersteunt vanaf 2025 ook ||. Om een numerieke orderidentificatie samen te voegen met tekst, zetten SQLite en PostgreSQL die in 'Order #' || order_id om naar tekst. Converteer het getal eerst bij + in SQL Server: 'Order #' + CAST(order_id AS VARCHAR(10)).
Kies hoe je een ontbrekend onderdeel samenvoegt
In SQLite en PostgreSQL maakt een NULL-operand het resultaat van || NULL. Oracle behandelt dat ontbrekende onderdeel als lege tekst. Ook CONCAT verschilt per database:
| Database | CONCAT('Ana', NULL, 'Lopez') |
|---|---|
| PostgreSQL, SQL Server, SQLite vanaf 3.44 | 'AnaLopez' |
| MySQL | NULL |
CONCAT in Oracle gebruikt precies twee argumenten. CONCAT_WS(' ', first_name, middle_name, last_name) plaatst spaties tussen onderdelen die niet NULL zijn, dus een ontbrekende tweede voornaam geeft 'Ana Lopez'. SQLite heeft CONCAT en CONCAT_WS toegevoegd in 3.44. NULL overslaan verwijdert nog steeds geen lege tekenreeks.
Zet letters om en verwijder spaties aan de randen
UPPER('boston') geeft 'BOSTON'; LOWER zet letters om naar kleine letters. INITCAP('ana LOPEZ') in PostgreSQL geeft 'Ana Lopez'. SQLite heeft geen INITCAP en de ingebouwde omzetting verandert alleen A–Z: UPPER('é') blijft 'é' zonder de ICU-uitbreiding. De omzetting in PostgreSQL volgt de taal- en regio-instellingen.
TRIM verwijdert spaties aan beide uiteinden; LTRIM verwijdert ze alleen aan het begin en RTRIM alleen aan het einde. TRIM(' New York ') geeft 'New York' en behoudt de twee spaties binnenin. Om x aan beide uiteinden te verwijderen, schrijft SQLite TRIM('xxBostonxx', 'x'); PostgreSQL schrijft TRIM(BOTH 'x' FROM 'xxBostonxx').
Vervang tekens en nest opschoonstappen
REPLACE('555-0100', '-', '') geeft '5550100'. Het vervangt elke exacte overeenkomst. Hoofdletters en kleine letters doen ertoe: 'st' vervangen in 'Main St' verandert niets, omdat 'St' een hoofdletter S heeft.
SELECT LOWER(TRIM(email)) AS email_clean
FROM customers;
Voor ' Ana@Example.COM ' geeft TRIM eerst 'Ana@Example.COM', waarna LOWER 'ana@example.com' geeft. Nesten betekent dat de binnenste functie de invoer voor de volgende levert.
Gewone tekstgelijkheid is standaard hoofdlettergevoelig in SQLite en PostgreSQL. WHERE LOWER(TRIM(email)) = 'ana@example.com' kan invoer met andere hoofdletters en spaties aan de randen vinden. De standaard sorteerregels van MySQL negeren hoofdletters en LIKE in SQLite negeert het verschil tussen hoofdletters en kleine letters voor A–Z, hoewel de standaardvergelijking met = dat niet doet.
Belangrijkste punten
- Gebruik enkele aanhalingstekens voor tekst en verdubbel een apostrof binnen een literal.
- Concatenatie voegt exacte onderdelen samen; voeg scheidingstekens expliciet toe.
- De omgang met NULL verschilt tussen ||, CONCAT en databasedialecten.
- TRIM verwijdert spaties aan de randen, terwijl REPLACE overeenkomende tekens overal vervangt.
- Geneste functies worden van binnen naar buiten uitgevoerd.
- Omzetting naar hoofdletters of kleine letters en hoofdlettergevoelige vergelijkingen hangen af van de database en de taal- en regio-instellingen.
3.2 Bepaal de lengte van tekst en haal tekstdelen op
Tekstfuncties zoeken en selecteren delen van tekst op basis van tekenposities. In SQL beginnen posities bij 1, dus het eerste teken staat op positie 1. Een gevonden positie en een aantal tekens zijn verschillende invoerwaarden.
Bepaal de lengte en haal een deel van een tekenreeks op
LENGTH('Boston') geeft 6. Spaties tellen mee: LENGTH(' Bo ') geeft 4. Lege tekst heeft lengte 0; LENGTH(NULL) is NULL. LENGTH in MySQL telt bytes, dus gebruik daar CHAR_LENGTH voor tekens. SQL Server gebruikt LEN, dat spaties aan het einde negeert.
SELECT SUBSTR('Boston', 1, 3) AS beginning,
SUBSTR('Boston', 4) AS ending;
De resultaten zijn 'Bos' en 'ton'. De eerste aanroep neemt drie tekens vanaf positie 1. De tweede laat het aantal weg en neemt alles vanaf positie 4. PostgreSQL schrijft ook SUBSTRING('Boston' FROM 4 FOR 3). SQLite accepteert de naam SUBSTRING vanaf 3.34. SQL Server gebruikt SUBSTRING(text, start, count); het aantal is verplicht tot en met 2022 en optioneel vanaf 2025.
SQLite kan vanaf rechts tellen: SUBSTR('Boston', -3) geeft 'ton'. Negatieve startposities in PostgreSQL tellen niet terug vanaf het einde. Gebruik daar RIGHT('Boston', 3); LEFT haalt tekens vanaf het begin op. SQLite heeft geen LEFT en geen RIGHT.
Zoek het splitsingspunt
INSTR(text, search) in SQLite geeft de eerste positie terug waarop een overeenkomst staat. PostgreSQL gebruikt STRPOS of POSITION(search IN text). Deze functies geven 0 terug als er geen overeenkomst is. De zoekopdracht is hoofdlettergevoelig: INSTR('Ana', 'a') is 3.
In 'ana@example.com' staat de @ op positie 4. De gebruikersnaam eindigt er vlak voor; het domein begint er vlak na:
SUBSTR(email, 1, INSTR(email, '@') - 1) AS user_name,
SUBSTR(email, INSTR(email, '@') + 1) AS domain
De eerste expressie wordt SUBSTR(email, 1, 3) en levert 'ana' op. De tweede begint op 5 en levert 'example.com' op. Als je - 1 weglaat, komt @ in de gebruikersnaam terecht. Als je + 1 weglaat, komt het teken aan het begin van het domein te staan. Vervang in PostgreSQL INSTR door STRPOS of gebruik SPLIT_PART(email, '@', 2) voor het domein.
Ga om met een ontbrekend scheidingsteken
Voor 'anaexample.com' geeft INSTR 0 terug. De domeinformule begint op 1 en geeft ten onrechte de hele tekenreeks terug. De formule voor de gebruikersnaam geeft in SQLite lege tekst; PostgreSQL wijst de negatieve lengte van de deeltekenreeks af. Beveilig het ophalen:
CASE
WHEN INSTR(email, '@') > 0
THEN SUBSTR(email, INSTR(email, '@') + 1)
END
Dit geeft NULL terug als het scheidingsteken ontbreekt. De controle zoekt naar een scheidingsteken en controleert niet alle regels voor een geldig e-mailadres.
Maak korte labels en codes met een vaste breedte
SUBSTR(first_name, 1, 1) || '. ' || last_name geeft 'A. Lopez' voor Ana Lopez. WHERE LENGTH(zip_code) <> 5 vindt geregistreerde Amerikaanse postcodes als tekenreeks met de verkeerde lengte; NULL-lengtes leveren UNKNOWN op en vallen weg.
LPAD('42', 5, '0') in PostgreSQL geeft '00042'; RPAD vult rechts aan. SQLite kan die code maken met SUBSTR('00000' || 42, -5). Door slechts vijf tekens te behouden, wordt een langere waarde ook afgekapt, dus deze expressie met vaste breedte vereist een code die past.
Belangrijkste punten
- Posities in SQL-tekenreeksen beginnen bij 1; LENGTH telt spaties mee.
- SUBSTR gebruikt een startpositie en een optioneel aantal tekens.
- INSTR, STRPOS en POSITION geven 0 terug als er geen overeenkomst is.
- Gebruik de positie min 1 vóór een scheidingsteken en de positie plus 1 erna.
- Controleer of een scheidingsteken ontbreekt voordat je een deel ophaalt.
- Tekst vanaf het einde ophalen en opvullen hebben verschillende namen in SQLite en PostgreSQL.
4Werk met datums en tijden
Werken met datums begint met een duidelijk onderscheid tussen een kalenderdag, een tijdstip en een tijdstempel. Van daaruit kan SQL jaar-maandaanduidingen maken, deadlines berekenen, verstreken tijd bepalen en een volledige periode filteren. Je houdt datumwaarden gescheiden van tekst voor de weergave, houdt rekening met maandultimo's en verjaardagen en vergelijkt de expressies waarmee SQLite en PostgreSQL dezelfde taak uitvoeren. Grensgevallen maken deze berekeningen betrouwbaar.
4.1 Noteer, bewaar en lees datum- en tijdwaarden
Een datum is gemakkelijker om mee te rekenen als de opslag en schrijfwijze duidelijk zijn. De tekst '03/04/2026' kan 4 maart of 3 april betekenen. Een ISO-datum, '2026-03-14', zet jaar, maand en dag in een ondubbelzinnige volgorde.
Stem de waarde af op het type
PostgreSQL heeft DATE voor een kalenderdag, TIME voor een tijdstip en TIMESTAMP voor een datum en tijdstip. TIMESTAMP WITH TIME ZONE, ook timestamptz genoemd, slaat een moment op in UTC en toont het in de tijdzone van de sessie. Een gewone TIMESTAMP heeft die tijdzonebetekenis niet.
SQLite slaat datums en tijden op als ISO-tekst of als getallen, niet als afzonderlijke datum- en tijdtypen. Numerieke vormen zijn onder meer Juliaanse dagnummers en Unixtijd. De datumfuncties interpreteren deze waarden en geven een datum, tijdstip of numerieke maat terug.
Gebruik ISO-tekst met een vaste breedte zoals '2026-03-14', inclusief voorloopnullen. Voeg een tijdstip toe volgens de 24-uursklok: '2026-03-14 09:30:00'. De getypeerde literal DATE '2026-03-14' van PostgreSQL maakt expliciet een datum.
Behoud de chronologische volgorde
ISO-tekst met vaste breedte wordt in datumvolgorde vergeleken, omdat die met het grootste onderdeel begint. '2026-03-14' komt vóór '2026-11-02'. Amerikaanse tekst voor de weergave heeft deze eigenschap niet: als tekenreeksen wordt '11/02/2025' na '03/14/2026' gesorteerd, hoewel die datum eerder is.
De omzettingsfunctie van SQLite heeft de ondersteunde notatie nodig. date('2026-3-14') geeft NULL terug omdat de maand niet uit twee cijfers bestaat. De functie kan ook een onmogelijke datum normaliseren: date('2026-02-30') geeft '2026-03-02' terug. Een resultaat dat niet NULL is, bewijst op zichzelf niet dat de invoer een geldige kalenderdag was. PostgreSQL wijst DATE '2026-02-30' af.
Lees tekst in een andere notatie
PostgreSQL en Oracle gebruiken TO_DATE('03/14/2026', 'MM/DD/YYYY') om een Amerikaanse notatie te lezen. PostgreSQL leest ISO-tekst ook met CAST('2026-03-14' AS DATE) of '2026-03-14'::date.
SQLite heeft geen TO_DATE-omzettingsfunctie. Bouw voor tekst in vaste MM/DD/YYYY-notatie in d de ISO-tekst opnieuw op:
SUBSTR(d, 7, 4) || '-' ||
SUBSTR(d, 1, 2) || '-' || SUBSTR(d, 4, 2)
De onderdelen zijn het jaar '2026', de maand '03' en de dag '14'. Het resultaat is '2026-03-14', dat de datumfuncties van SQLite kunnen lezen. De posities werken alleen als de invoer daadwerkelijk de vaste notatie gebruikt.
Haal de huidige datum en tijd op
CURRENT_DATE en CURRENT_TIMESTAMP werken in SQLite en PostgreSQL. SQLite geeft UTC-tekst terug; date('now', 'localtime') geeft de lokale datum. Rond middernacht kunnen UTC en de lokale kalenderdatum verschillen.
PostgreSQL gebruikt de tijdzone van de sessie. CURRENT_TIMESTAMP en NOW() geven de begintijd van de huidige transactie weer, dus wachten binnen die transactie verandert hun waarde niet. MySQL biedt NOW() en CURDATE(); SQL Server heeft GETDATE() en SYSDATETIME(); Oracle heeft SYSDATE, inclusief een tijdstip, en CURRENT_DATE.
Gebruik om een berekening van een vervaldatum te controleren eerst een vast uitgangspunt zoals DATE '2026-10-21' in PostgreSQL of '2026-10-21' in SQLite. Je kunt het resultaat dan met een kalender vergelijken zonder dat het antwoord de volgende dag verandert.
Belangrijkste punten
- DATE is een kalenderdag; TIMESTAMP voegt een tijdstip toe.
- Gebruik YYYY-MM-DD met vaste breedte voor ondubbelzinnige datumtekst die in verschillende systemen werkt.
- ISO-tekst wordt chronologisch gesorteerd als de notatie en de gebruikte tijdsbasis consistent zijn.
- Een datumresultaat in SQLite kan een onmogelijke invoer normaliseren in plaats van afwijzen.
- Functies voor de huidige datum hanteren verschillende regels voor tijdzones en transacties.
4.2 Haal datumonderdelen op en maak ze op
Haal een datumonderdeel op als je een jaar of weekdag nodig hebt om mee te rekenen. Maak een datum op als je tekst voor een lezer nodig hebt. Deze bewerkingen kunnen verschillende typen opleveren, ook als de weergegeven tekens er hetzelfde uitzien.
Haal een jaar, maand of weekdag op
PostgreSQL gebruikt het standaardcommando EXTRACT(part FROM value). Voor DATE '2026-03-14' geeft YEAR de uitkomst 2026 en MONTH de uitkomst 3, beide als getal. MySQL en Oracle ondersteunen EXTRACT ook.
SQLite gebruikt strftime(format, value), dat tekst teruggeeft:
| SQLite-patroon | Resultaat voor '2026-03-14' |
|---|---|
'%Y' | '2026' |
'%m' | '03' |
'%d' | '14' |
'%w' | '6' |
%w in SQLite en DOW in PostgreSQL nummeren de dagen van zondag als 0 tot en met zaterdag als 6. 14 maart 2026 is een zaterdag. ISODOW in PostgreSQL nummert daarentegen van maandag als 1 tot en met zondag als 7. Een weekendfilter in SQLite is WHERE strftime('%w', order_date) IN ('0', '6').
Vergelijk de juiste typen
strftime('%m', order_date) = 3 is onwaar voor een datum in maart in SQLite: de functie geeft de tekst '03' terug, niet het getal 3. Vergelijk met = '03' of converteer eerst:
CAST(strftime('%m', order_date) AS INTEGER) = 3
Dit is ook nuttig in de kwartaalexpressie (CAST(strftime('%m', d) AS INTEGER) + 2) / 3. Gehele deling geeft kwartaal 1 voor maart en kwartaal 4 voor november. PostgreSQL heeft rechtstreeks EXTRACT(QUARTER FROM d).
Duid een maand aan als volledige periode
strftime('%Y-%m', order_date) maakt in SQLite een label zoals '2026-03'. date(order_date, 'start of month') maakt '2026-03-01'. PostgreSQL kan TO_CHAR(order_date, 'YYYY-MM') gebruiken voor een label of DATE_TRUNC('month', order_date) voor het eerste moment van die maand.
Behoud het jaar in een periodelabel. Een losse maandwaarde van 3 zou maart uit verschillende jaren combineren. De waarde voor de eerste van de maand kan de waarde voor berekeningen en sortering blijven, terwijl een afzonderlijke expressie voor de weergave zorgt.
Maak op bij de uitvoer
In PostgreSQL geeft TO_CHAR(DATE '2026-03-14', 'MM/DD/YYYY') de tekst '03/14/2026' en geeft het patroon 'Mon DD, YYYY' de tekst 'Mar 14, 2026'. Oracle gebruikt deze patronen ook. De Amerikaanse notatie in SQLite is strftime('%m/%d/%Y', '2026-03-14').
Patroonletters horen bij hun database. In PostgreSQL betekent MM maand en MI minuut. In SQLite betekent %m maand en %M minuut; als je die hoofdletter verandert, verandert de gevraagde informatie.
SELECT TO_CHAR(order_date, 'MM/DD/YYYY') AS order_day
FROM orders
ORDER BY order_date;
Hier toont PostgreSQL leesbare tekst, maar sorteert het op de werkelijke datums. Sorteren op order_day zou de weergegeven tekenreeksen eerst op maand sorteren en datums uit verschillende jaren in de verkeerde volgorde kunnen zetten.
Belangrijkste punten
- EXTRACT in PostgreSQL geeft numerieke onderdelen terug; strftime in SQLite geeft tekst terug.
- Vergelijk een SQLite-maand met voorloopnul met tekst of converteer die naar een getal.
- De nummering van weekdagen hangt af van de gekozen conventie.
- Behoud het jaar in jaar-maandaanduidingen en maak alleen op voor de weergave.
4.3 Reken met datums en filter op datumbereiken
Bij kalenderberekeningen moet je rekening houden met maandlengtes, tijdsonderdelen en het soort antwoord dat nodig is. Een aantal dagen, een kalendermaand en een voltooid levensjaar zijn verschillende maten.
Tel dagen en kalendermaanden op
PostgreSQL schrijft DATE '2026-03-14' + 30; SQLite schrijft date('2026-03-14', '+30 days'). Beide komen uit op 13 april: na 17 dagen is maart voorbij en de overige 13 dagen brengen je op 13 april. De rechtstreekse expressie '2026-03-14' + 30 van SQLite geeft daarentegen 2056, omdat de rekenkundige bewerking het jaartal aan het begin als getal leest.
Voor het einde van de maand is een expliciete regel nodig. DATE '2026-01-31' + INTERVAL '1 month' in PostgreSQL geeft 28 februari om middernacht, met de laatste beschikbare dag. date('2026-01-31', '+1 month') in SQLite telt overtollige dagen door in maart en geeft '2026-03-03'. Voeg vanaf SQLite 3.46 na de verschuiving 'floor' toe om '2026-02-28' te kiezen. ADD_MONTHS in Oracle verschuift ook naar de laatste dag van de kortere maand.
Bepaal de verstreken tijd
Aftrekken van DATE-waarden in PostgreSQL geeft hele dagen terug: DATE '2026-04-13' - DATE '2026-03-14' is 30. SQLite trekt numerieke dagwaarden af: julianday('2026-04-13') - julianday('2026-03-14') is 30.0. SQL Server gebruikt DATEDIFF(day, start, end); MySQL gebruikt DATEDIFF(end, start).
Voor tijdstempels van 14 maart om 09:30 tot 18:00 geeft aftrekken in PostgreSQL een interval van 08:30:00; EXTRACT(EPOCH FROM interval) / 3600 drukt dit uit als 8,5 uur. Vanaf SQLite 3.38 kun je schrijven:
(unixepoch('2026-03-14 18:00') -
unixepoch('2026-03-14 09:30')) / 3600.0
Dit geeft 8.5. Een verschil tussen Juliaanse dagnummers vermenigvuldigd met 24 kan 8.49999999627471 geven door benadering met drijvendekommagetallen; rond de weergave af. Een tijdsduur tussen tijdstempels die een deel achter de komma bevat, moet je niet naar INTEGER converteren voordat de gewenste eenheid is berekend.
Tel voltooide verjaardagen
Iemand die op 2 november 1990 is geboren, is op 21 oktober 2026 35 jaar. De jaartallen verschillen 36, maar de verjaardag is nog niet geweest. PostgreSQL gebruikt EXTRACT(YEAR FROM AGE(DATE '2026-10-21', DATE '1990-11-02')), met als resultaat 35.
SQLite trekt er één af als de verjaardag dit jaar nog moet komen:
strftime('%Y', '2026-10-21') - strftime('%Y', birth_date)
- (strftime('%m-%d', '2026-10-21') < strftime('%m-%d', birth_date))
De vergelijking levert 1 op als de verjaardag nog moet komen en anders 0. Verstreken dagen delen door 365 is onbetrouwbaar: op 1 november 2026 heeft deze persoon 13.148 dagen geleefd, wat gedeeld door 365 de uitkomst 36,02 geeft, hoewel de 36e verjaardag morgen is. DATEDIFF in SQL Server telt grenzen: van 31 december naar 1 januari gaan telt als een jaargrens, niet als een voltooid levensjaar.
Neem elke tijdstempel in een periode mee
BETWEEN sluit beide grenspunten in. Voor DATE-kolommen omvat 1 maart tot en met 31 maart heel maart. Voor tijdstempels betekent een bovengrens van '2026-03-31' middernacht aan het begin van de laatste dag, waardoor de rest van die dag ontbreekt.
WHERE ordered_at >= '2026-03-01'
AND ordered_at < '2026-04-01'
Dit halfopen bereik sluit het begin in en het begin van de volgende periode uit. Zo valt elk tijdstip in maart binnen het bereik zonder een laatste fractie van een seconde te kiezen.
Achterstallige datums voldoen aan due_date < CURRENT_DATE. De ondergrens voor de afgelopen 30 dagen is CURRENT_DATE - 30 in PostgreSQL en date('now', '-30 days') in SQLite. De dagen tot een deadline zijn due_date - CURRENT_DATE voor DATE-waarden in PostgreSQL en julianday(due_date) - julianday(date('now')) in SQLite.
Belangrijkste punten
- Gebruik datumrekenfuncties of getypeerde datums, geen rekenkundige bewerkingen op datumtekst in SQLite.
- Bepaal hoe je bij het optellen van een maand omgaat met een dag die in de volgende maand ontbreekt.
- Verschillen tussen DATE-waarden tellen dagen; verschillen tussen tijdstempels kunnen delen van dagen bevatten.
- Leeftijd telt voltooide verjaardagen, geen verstreken dagen gedeeld door 365.
- Een halfopen bereik voor tijdstempels sluit het begin van de periode in en het volgende begin uit.
- Gebruik een huidige waarde met alleen een datum voor deadlineberekeningen in hele dagen.
5Deel rijen in categorieën in met CASE-expressies
Een rapport heeft vaak een regel nodig die gegevens omzet in een label of bedrag: een kleine order, een nog te verzenden zending of een prioriteitsvolgnummer. CASE drukt die keuze uit binnen een query. Je volgt welke voorwaarde wint, plaatst exacte grenzen en ontbrekende waarden in de juiste categorie en zet codes om met een eenvoudige CASE-expressie. Het eindrapport combineert indeling in categorieën met rekenkundige bewerkingen, tekst, datums en vervangingswaarden en controleert elke uitvoer aan de hand van bekende rijen.
5.1 Deel rijen in categorieën in met CASE-expressies met voorwaarden
Een CASE-expressie kiest voor elke rij één resultaat. Je kunt die gebruiken om een prijsklasse een label te geven, kosten te berekenen of een record te markeren dat aandacht nodig heeft.
Lees de vorm met voorwaarden
CASE
WHEN total < 50 THEN 'small'
WHEN total < 200 THEN 'medium'
ELSE 'large'
END AS size_band
Elke WHEN bevat een voorwaarde en THEN bevat de waarde die wordt teruggegeven als die voorwaarde TRUE is. De database controleert van boven naar beneden en neemt de eerste voorwaarde die waar is. END sluit de expressie af; daarna kan een alias volgen. Als geen voorwaarde TRUE is en ELSE ontbreekt, is het resultaat NULL.
Een totaal van 35 voldoet aan de eerste voorwaarde en wordt 'small'. Een totaal van 50 voldoet niet aan de eerste maar wel aan de tweede en wordt 'medium'. Hetzelfde geldt voor 199,99. Een totaal van 200 komt bij ELSE en wordt 'large'.
Stem volgorde en grenzen af op de regel
De tweede tak heeft geen total >= 50 nodig: een waarde onder 50 is al door de eerste tak teruggegeven. Oplopende grenswaarden met < werken omdat eerdere takken de kleinere waarden wegnemen. Aflopende grenswaarden met >= kunnen om dezelfde reden werken.
Als je WHEN total < 200 eerst zet, wordt een latere tak met < 50 onbereikbaar. Een totaal van 35 voldoet al aan < 200 en stopt daar dus. CASE kiest niet de meest specifieke voorwaarde en controleert niet welk label het beste klinkt.
Vergelijk de bedrijfsregel met elk grenspunt. < 50 plaatst precies 50 in de middelste klasse; <= 50 plaatst die waarde in de kleine klasse. Controleer 49,99, 50, 199,99 en 200 om beide kanten en de grenzen te bekijken. Als voorwaarden als expliciete intervallen zijn geschreven, laat de grenspunten dan aansluiten zonder tussenruimte of onbedoelde overlap.
Verwerk NULL vóór gewone bereiken
Een NULL-totaal maakt beide vergelijkingen UNKNOWN. In de eerste expressie komt het daarom bij ELSE terecht en wordt het 'large', wat misleidend is. Vang een ontbrekende waarde eerst op:
CASE
WHEN total IS NULL THEN 'unknown'
WHEN total < 50 THEN 'small'
WHEN total < 200 THEN 'medium'
ELSE 'large'
END
ELSE betekent “geen voorwaarde was waar” en kan dus zowel ontbrekende invoer als bekende waarden buiten de geteste bereiken opvangen.
Geef een consistent soort waarde terug
PostgreSQL heeft compatibele THEN- en ELSE-typen nodig. CASE WHEN quantity > 0 THEN unit_price ELSE 'n/a' END mislukt als unit_price numeriek is, omdat 'n/a' niet in een getal kan worden omgezet. Gebruik NULL voor een niet-beschikbaar numeriek resultaat, of converteer de prijs naar tekst als de hele uitvoer een weergavelabel is. SQLite staat gemengde resultaattypen toe, wat latere berekeningen kan bemoeilijken.
Een voorwaarde kan kolommen combineren:
CASE
WHEN country = 'US' AND subtotal >= 100 THEN 0
ELSE 7.99
END AS shipping_fee
De teruggegeven kosten kunnen voorkomen in subtotal + CASE ... END AS amount_due. Een CASE is een waarde-expressie, geen opdracht die meerdere kolommen wijzigt; elke resultaatkolom heeft een eigen expressie nodig.
CASE kan ook een deling per rij afschermen: CASE WHEN visits = 0 THEN NULL ELSE orders * 100.0 / visits END. Een rij met nul kiest de NULL-tak. orders * 100.0 / NULLIF(visits, 0) drukt dezelfde regel voor een ontbrekend percentage korter uit.
Belangrijkste punten
- CASE geeft de waarde terug van de eerste voorwaarde die TRUE is.
- Zet overlappende bereikvoorwaarden zo op volgorde dat een brede test een smallere niet verbergt.
- Kies < of <= om een exacte grens in de bedoelde klasse te plaatsen.
- Test vóór een bereik expliciet op NULL als ELSE die waarde geen label moet geven.
- Houd resultaattypen compatibel en gebruik CASE overal waar een waarde-expressie past.
5.2 Gebruik eenvoudige CASE-expressies en pas CASE toe op verschillende plaatsen in een query
De eenvoudige CASE-expressie zet de ene waarde om in een andere. Een CASE-expressie met voorwaarden test voorwaarden; een eenvoudige CASE vergelijkt dezelfde expressie met een reeks waarden.
Zet codes om met een eenvoudige CASE
CASE status
WHEN 'S' THEN 'Shipped'
WHEN 'P' THEN 'Pending'
WHEN 'C' THEN 'Canceled'
ELSE 'Other'
END AS status_label
De impliciete tests zijn status = 'S', daarna status = 'P' en daarna status = 'C'. Een status buiten deze codes krijgt 'Other'. De vorm met voorwaarden kan dezelfde gelijkheidstests expliciet schrijven. Kies een CASE met voorwaarden voor bereiken, LIKE-patronen, NULL-tests of voorwaarden over meerdere kolommen.
CASE region WHEN NULL THEN 'missing' ELSE region END kan een NULL-regio niet opvangen. De impliciete vergelijking region = NULL is UNKNOWN, dus de rij komt bij ELSE en blijft NULL. Schrijf CASE WHEN region IS NULL THEN 'missing' ELSE region END.
Ken een aangepast sorteervolgnummer toe
De alfabetische prioriteitsvolgorde is high, low, medium. Om op urgentie te sorteren, zet je de labels om in getallen:
SELECT ticket_id, priority
FROM tickets
ORDER BY CASE priority
WHEN 'high' THEN 1
WHEN 'medium' THEN 2
WHEN 'low' THEN 3
ELSE 4
END;
De oplopende volgorde plaatst nu high vóór medium en medium vóór low, met andere of ontbrekende waarden achteraan. De CASE is een sorteerexpressie en hoeft geen weergegeven kolom te zijn. DESC zou de numerieke rangschikking omkeren.
Maak een numerieke indicator
CASE WHEN discount_pct > 0 THEN 1 ELSE 0 END AS is_discounted
Een positief percentage krijgt 1; een bekende nul krijgt 0. Een NULL-percentage krijgt ook 0 omdat > 0 UNKNOWN is en ELSE dit opvangt. Deze indicator betekent dus “er is een positieve korting geregistreerd”. Hij behoudt het onderscheid tussen geen korting en een onbekende korting niet. Als dat onderscheid nodig is, voeg dan een IS NULL-tak met een eigen resultaat toe.
Je kunt indicatoren selecteren, sorteren, filteren of in berekeningen opnemen. Herhaal in een WHERE-clausule die ook in andere databases werkt de expressie of gebruik de oorspronkelijke voorwaarde in plaats van naar een nieuw gedefinieerde uitvoeralias te verwijzen.
Herken verwante voorwaardelijke functies
COALESCE(bonus, 0) is een korte vorm van CASE WHEN bonus IS NOT NULL THEN bonus ELSE 0 END. NULLIF(a, b) komt overeen met CASE WHEN a = b THEN NULL ELSE a END. Hun namen maken deze gebruikelijke doelen direct duidelijk.
SQLite vanaf 3.32 en SQL Server hebben IIF(condition, true_value, false_value); MySQL heeft IF. DECODE in Oracle zet gelijke waarden om, bijvoorbeeld DECODE(status, 'S', 'Shipped', 'P', 'Pending', 'Other'). DECODE behandelt twee NULL-waarden als gelijk, anders dan de gelijkheidsvergelijkingen in een eenvoudige CASE. Standaard-CASE werkt in al deze systemen.
Een CASE kan een andere CASE bevatten, maar gecombineerde voorwaarden maken een enkele expressie vaak duidelijker. Een verzendregel kan rechtstreeks WHEN country = 'US' AND subtotal >= 100 THEN 0 bevatten, zodat de tests voor land en subtotaal bij elkaar blijven.
Belangrijkste punten
- Een eenvoudige CASE vergelijkt één expressie met waarden op gelijkheid.
- Gebruik een CASE met voorwaarden voor NULL-tests, bereiken en gecombineerde voorwaarden.
- Een numerieke CASE in ORDER BY maakt een aangepaste rangschikking.
- Een indicator met ELSE 0 kent ook nul toe als de voorwaarde UNKNOWN is.
- COALESCE en NULLIF drukken veelvoorkomende bijzondere gevallen van CASE uit.
- DECODE in Oracle behandelt twee NULL-waarden als gelijk; een eenvoudige CASE doet dat niet.
5.3 Combineer functies tot een volledige rapportagequery
Een rapport kan in één SELECT namen opschonen, nettototalen berekenen, maanden aanduiden en de verzendsnelheid een label geven. Bouw elke expressie op vanuit de invoer en controleer het resultaat voordat je haar met de andere combineert.
Werk met bekende rijen
Een ordertabel bevat deze records. Datums zijn ISO-tekst voor de SQLite-query hieronder; quantity is een geheel getal en unit_price is numeriek.
| Order | Klant | Hoeveelheid | Prijs | Korting % | Besteld | Verzonden |
|---|---|---|---|---|---|---|
| 1001 | Ana Lopez | 3 | 12,50 | 10 | 2026-03-14 | 2026-03-17 |
| 1002 | Ben Okafor | 1 | 240,00 | 0 | 2026-03-30 | NULL |
| 1003 | Chen Wu | 12 | 4,25 | NULL | 2026-04-02 | 2026-04-03 |
Hier betekent een ontbrekende korting dat er geen korting is. Begin met het ophalen van de oorspronkelijke velden. Voeg telkens één berekende kolom toe en gebruik LIMIT 5 om een kleine steekproef te controleren.
Volg een geneste berekening
ROUND(quantity * unit_price *
(1 - COALESCE(discount_pct, 0) / 100.0), 2)
COALESCE levert eerst een bekende korting. Delen door 100.0 behoudt het deel achter de komma. Aftrekken van 1 geeft het betaalde deel, vermenigvuldiging geeft het nettobedrag en ROUND bepaalt de uiteindelijke precisie. Ana's bedrag is 33,75, dat van Ben is 240,0 en dat van Chen is 51,0. De NULL-korting van Chen wordt nul; een ontbrekende verzenddatum moet daarentegen ontbreken in het aantal dagen.
Stel het SQLite-rapport samen
SELECT order_id,
first_name || ' ' || last_name AS customer,
ROUND(quantity * unit_price *
(1 - COALESCE(discount_pct, 0) / 100.0), 2) AS net_total,
strftime('%Y-%m', order_date) AS order_month,
CAST(julianday(shipped_date) - julianday(order_date)
AS INTEGER) AS days_to_ship,
CASE
WHEN shipped_date IS NULL THEN 'not shipped'
-- fast = shipped within 2 days
WHEN julianday(shipped_date) - julianday(order_date) <= 2
THEN 'fast'
ELSE 'standard'
END AS shipping
FROM orders
ORDER BY order_id;
Elke expressie heeft een duidelijke uitvoeralias. Het numerieke dagverschil wordt naar INTEGER geconverteerd omdat dit waarden met alleen een datum zijn. De IS NULL-tak komt vóór de vergelijking van de snelheid, zodat een niet-verzonden order een bruikbaar label krijgt.
De uitvoer is:
| Order | Klant | Nettototaal | Maand | Dagen | Verzending |
|---|---|---|---|---|---|
| 1001 | Ana Lopez | 33,75 | 2026-03 | 3 | standard |
| 1002 | Ben Okafor | 240,0 | 2026-03 | NULL | not shipped |
| 1003 | Chen Wu | 51,0 | 2026-04 | 1 | fast |
Pas typen en queryclausules aan
Gebruik voor DATE-kolommen in PostgreSQL TO_CHAR(order_date, 'YYYY-MM') voor de maand en shipped_date - order_date voor het aantal dagen en de CASE-vergelijking. Houd unit_price als exact numeric voor ROUND met twee argumenten. De concatenatie, vervangingswaarde voor korting en indelingsregel behouden dezelfde betekenis.
Om in beide databases te filteren op afgeronde totalen boven 50, herhaal je de volledige netto-expressie in WHERE. Orders 1002 en 1003 blijven over. SQLite staat ook WHERE net_total > 50 toe, maar PostgreSQL kan die nieuwe alias tijdens het filteren niet zien. ORDER BY net_total DESC werkt in beide.
Controleer bij het verplaatsen van een rapport de typen en functienamen in elke expressie. Een tekstfunctie moet tekst ontvangen, een datumberekening moet een ondersteunde datumwaarde ontvangen en een numerieke vervangingswaarde moet de bedoelde regel uitdrukken. Zet elke uitvoer op een eigen regel; een kort commentaar kan een bedrijfsgrenswaarde definiëren zonder de SQL onduidelijk te maken.
Belangrijkste punten
- Bouw en controleer telkens één berekende kolom op een kleine steekproef.
- Geneste functies geven hun resultaten naar buiten door; zorg dat elk invoertype geschikt is.
- Een ontbrekende korting en een ontbrekende verzenddatum kunnen een verschillende behandeling vereisen.
- Gebruik datumexpressies die bij het dialect passen en houd de rapportregels consistent.
- Filter waar passend met de volledige expressie en sorteer met de uitvoeralias.
SQL CASE en functies: voorbeelden
1Bereken en controleer een regelbedrag na korting
16 stappen
- 1IntroductieMaak van één rij een bruikbaar bedrag
Een orderregel bevat acht artikelen van elk 7,50 met 20 procent korting. Het rapport heeft een nettobedrag nodig, maar de tabel slaat alleen de invoerwaarden op. Je bouwt de expressie in stappen op, geeft de uitvoer een naam en controleert wat gehele deling met de korting doet.
De voorbeelden gebruiken SQLite en PostgreSQL. Waar hun typeregels verschillen, geeft de databasenaam aan bij welk systeem het resultaat hoort.
- 2UitlegBegin met een expressie
Een expressie combineert waarden om een andere waarde op te leveren. Hier gebruikt
quantity * unit_pricetwee kolommen uit de huidige rij.SELECT quantity * unit_price AS gross_total FROM order_lines;gross_totalis de uitvoeralias. Voor de voorbeeldrij is de nieuwe waarde60.0in SQLite. Elke andere rij levert zijn eigen invoerwaarden; de query schrijft deze totalen niet terug naar de tabel. - 3VerbandBij elke rij blijft één waarde horen
Een scalaire functie geeft één waarde terug voor elke invoerrij.
ROUND(unit_price, 0)verandert de weergegeven prijs voor een rij, terwijlUPPER(item_name)de weergegeven tekst verandert.Deze functies combineren de orderregels niet. Een aggregatiefunctie zoals SUM combineert wel waarden binnen een groep en beantwoordt dus een ander soort vraag. Een berekening in SELECT kan het detail van afzonderlijke orders behouden.
- 4TipGeef het resultaat een duidelijke naam
AS net_totalis een eenvoudige, leesbare alias. Gebruik dubbele aanhalingstekens als een naam een spatie bevat, zoals inAS "Net Total". Enkele aanhalingstekens duiden daarentegen tekstwaarden aan.Houd een komma tussen uitvoerexpressies.
SELECT quantity unit_pricegeeft één kolom met hoeveelheden terug onder de kolomkop unit_price: zonder komma wordt de tweede naam een alias. Die query kan slagen en toch minder kolommen tonen dan bedoeld. - 5UitdagingPlaats de alias in de query
De tabel heeft alleen quantity en unit_price. Een query definieert
quantity * unit_price AS gross_total. Kan een WHERE-filter in PostgreSQLgross_total > 50gebruiken en kan ORDER BYgross_total DESCgebruiken?---reveal---
WHERE kan die nieuwe alias niet zien omdat het logisch vóór SELECT komt. Herhaal
quantity * unit_price > 50. ORDER BY volgt op SELECT en kangross_total DESCgebruiken. SQLite staat de alias in WHERE toe als uitbreiding, maar PostgreSQL niet. - 6VoorbeeldZet een korting om in het betaalde deel
Het brutobedrag is
8 * 7.50, oftewel 60. Na 20 procent korting blijft 80 procent te betalen over. Druk dat uit als1 - discount_pct / 100.0.quantity * unit_price * (1 - discount_pct / 100.0)De deling geeft
0.2; de haakjes geven0.8; vermenigvuldigen geeft een nettobedrag van48.0. De haakjes houden de aftrekking bij elkaar als vermenigvuldigingsfactor. - 7KernpuntEen latere decimale waarde kan een eerdere deling niet herstellen
Stel dat discount_pct een geheel getal is en de deler als
100wordt geschreven. SQLite en PostgreSQL berekenen20 / 100als gehele deling en krijgen 0. De vermenigvuldigingsfactor wordt 1, dus het nettobedrag blijft ten onrechte 60.De decimale prijs elders herstelt die binnenste deling niet. Gebruik
100.0in de deling zelf. Het voltooide quotiënt achteraf converteren verandert het type, maar kan het ontbrekende deel achter de komma niet herstellen. - 8UitdagingZoek de berekening die het deel achter de komma verloor
Een SQLite-rij heeft het gehele getal completed = 9 en het gehele getal assigned = 12. Wat geeft
completed / assigned * 100.0terug en hoe moet de expressie het percentage wel berekenen?---reveal---
De expressie geeft
0.0terug: de gehele deling9 / 12wordt eerst 0. Schrijfcompleted * 100.0 / assigned, wat75.0geeft. De conversie moet vóór de deling plaatsvinden, niet pas vóór de uiteindelijke weergave. - 9UitlegKies de regel voor gehele getallen
ROUND kiest een nabijgelegen afgeronde waarde. FLOOR gaat omlaag naar een geheel getal, CEIL gaat omhoog en TRUNC kapt het deel achter de komma af in de richting van nul.
Voor
-6.4geeft FLOOR-7, terwijl CEIL en TRUNC-6geven. De richting is van belang bij negatieve invoer. PostgreSQL biedt deze functies; voor CEIL, FLOOR en TRUNC in SQLite is een versie nodig die met wiskundige functies is gecompileerd. ABS, dat de afstand tot nul geeft, is ingebouwd in SQLite. - 10TipControleer het getaltype voordat je afrondt
In PostgreSQL gebruikt ROUND met twee argumenten
numeric, geen double precision. Schrijf voor een drijvendekommakolomROUND(CAST(amount AS numeric), 2). SQLite accepteert zijn eigen numerieke ROUND-vorm.Benaderde drijvendekommagetallen kunnen verrassende uitkomsten geven bij waarden halverwege twee afrondingsuitkomsten. Voor exacte bedragen slaan NUMERIC/DECIMAL in PostgreSQL exacte decimalen op; SQLite kan hele centen als gehele getallen bewaren. Rond het weergegeven resultaat af na de berekening.
- 11UitlegMaak een typewijziging expliciet
CAST(expression AS type)vraagt om een conversie. De tekst'28'kan het gehele getal 28 worden metCAST('28' AS INTEGER). Het getal kan tekst worden metCAST(28 AS TEXT).Voor een deling met een deel achter de komma heeft SQLite REAL nodig om betrouwbaar een niet-gehele operand te krijgen.
CAST(7 AS NUMERIC)kan daar nog steeds het gehele getal 7 zijn. NUMERIC in PostgreSQL geeft een exact decimaal type. Een CAST van NULL blijft NULL. - 12VoorbeeldHoud identificatoren gescheiden van hoeveelheden
Stel dat een label de Amerikaanse postcode
'00421'bevat. Conversie naar een geheel getal geeft421, waarbij de voorloopnullen verloren gaan. Het is een identificator, dus ermee rekenen is niet de bedoeling.Een tekstkolom die werkelijk hoeveelheden bevat, moet mogelijk worden geconverteerd om numeriek te sorteren. De tekstwaarden
'12','3'en'80'worden in die volgorde gesorteerd; numeriek sorteren geeft 3, 12, 80. Kies de conversie op basis van de betekenis van de kolom. - 13UitdagingInterpreteer een conversie zonder die als validatie te vertrouwen
SQLite voert
CAST('31units' AS INTEGER)met succes uit. Welke waarde geeft dit terug en laat het succes zien dat de oorspronkelijke tekst een geldig geheel getal was?---reveal---
De functie geeft 31 terug door het numerieke begin te lezen. Het succes valideert niet de hele tekenreeks. PostgreSQL wijst dezelfde tekst af als geheel getal. SQLite kan ook tekst zonder numeriek begin in nul omzetten en zo ongeldige invoer verhullen.
- 14KernpuntConversie naar een geheel getal werkt niet overal hetzelfde
Voor de numerieke waarde
4.7kaptCAST(... AS INTEGER)in SQLite af naar 4, terwijl PostgreSQL afrondt naar 5. Als een rapport “hele eenheden die deze waarde niet overschrijden” bedoelt, druk dat dan vóór de conversie uit met FLOOR.Ook een impliciete conversie is databasespecifiek. PostgreSQL kan in een berekening een getal afleiden uit een literal tussen aanhalingstekens, maar een TEXT-kolom heeft een expliciete conversie nodig. De zichtbare tekens alleen bepalen het type van de operand niet.
- 15UitdagingControleer de volledige netto-expressie
Voor acht artikelen van 7,50 met het gehele getal discount_pct = 20 gebruikt een rapport
ROUND(quantity * unit_price * (1 - discount_pct / 100.0), 2) AS net_total. Wat is het resultaat en kan die alias de uitvoer sorteren?---reveal---
Het brutobedrag is 60, het betaalde deel is 0,8 en het nettobedrag is
48.0in SQLite.ORDER BY net_totalis geldig in zowel SQLite als PostgreSQL omdat sorteren de SELECT-alias kan zien. - 16SamenvattingLees de invoer, berekening en uitvoernaam
Een berekend bedrag volgt een pad: de rij levert waarden, rekenkundige bewerkingen en functies leveren het resultaat en een alias geeft het een naam. Controleer de volgorde van de bewerkingen en de typen van de operanden voordat je een weergegeven getal accepteert.
Bekijk bij een onverwacht resultaat eerst een binnenste deling of conversie. Om in verschillende databases op een berekende waarde te filteren, herhaal je de expressie in WHERE; om erop te sorteren, gebruik je de uitvoeralias in ORDER BY.
2Volg ontbrekende gegevens door een query
12 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieEen ontbrekend bedrag verandert meer dan een cel
- 2UitlegNULL is een onbekende invoer
- 3VoorbeeldGebruik een test die controleert of een waarde ontbreekt
- 4KernpuntWHERE accepteert alleen TRUE
- 5UitdagingCombineer een bekende voorwaarde met een onbekende
- 6TipLaat geen NULL in een uitsluitingslijst staan
- 7UitlegKies een vervangingswaarde op basis van de betekenis
- 8VoorbeeldHoud het weergavetype consistent
- 9VoorbeeldMaak van een noemer nul een ontbrekende waarde
- 10UitdagingSchoon lege tekst op vóór het label
- 11UitdagingOnderscheid een weergavekeuze van een filterkeuze
- 12SamenvattingHoud de betekenis van een ontbrekende waarde zichtbaar
3Schoon een naam op en haal een e-maildomein op
14 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieMaak tekst bruikbaar zonder de onderdelen te verliezen
- 2VoorbeeldVoeg de spatie tussen namen toe
- 3UitlegBepaal wat een ontbrekend naamdeel doet
- 4VoorbeeldSchoon het e-mailadres van binnen naar buiten op
- 5UitdagingKies tussen spaties verwijderen en vervangen
- 6TipControleer teken- en dialectregels
- 7UitlegTel vanaf één
- 8VoorbeeldZoek het scheidingsteken
- 9VoorbeeldHaal de tekens vóór en na @ op
- 10UitdagingZoek het resultaat met een positieverschil van één
- 11KernpuntEen zoekresultaat nul heeft een eigen aanpak nodig
- 12TipHaal eindstukken op en vul codes aan in het juiste dialect
- 13UitdagingCombineer opschonen met ophalen
- 14SamenvattingVolg de exacte tekens
4Maak datumlabels en betrouwbare periodefilters
18 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieHoud de kalenderwaarde gescheiden van het label
- 2UitlegKies een duidelijke datumweergave
- 3VoorbeeldLees een vaste lokale notatie
- 4UitdagingLeg uit welke tekst op datum sorteert
- 5TipControleer de datumverwerking en de tijdsbasis van de huidige datum
- 6VoorbeeldHaal de maand op met het juiste retourtype
- 7UitlegBehoud het jaar in de jaar-maandaanduiding
- 8VoorbeeldMaak een weergave zonder de sortering te veranderen
- 9UitdagingBepaal het juiste kwartaal
- 10VerbandKies de conventie voor de nummering van weekdagen
- 11VoorbeeldTel tien dagen bij de boeking op
- 12KernpuntEén maand is geen vast aantal dagen
- 13VoorbeeldBepaal dagen en uren in geschikte eenheden
- 14UitdagingNeem de laatste middag van de maand mee
- 15UitlegTel verjaardagen die daadwerkelijk zijn geweest
- 16TipLees relatieve datums als verschuivende grenzen
- 17UitdagingCombineer een deadline met een maandselectie
- 18SamenvattingControleer type, kalenderregel en grenspunten
5Geef orders een label en bouw het eindrapport
17 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieGeef elke order een bruikbaar label
- 2UitlegKies de eerste ware voorwaarde
- 3VoorbeeldVolg de exacte grens
- 4KernpuntELSE kan ook een onbekend bedrag opvangen
- 5UitdagingHerstel een verborgen kleine klasse
- 6TipGeef compatibele resultaten terug
- 7VoorbeeldZet één statuswaarde om
- 8UitdagingWaarom mist WHEN NULL de rij?
- 9VoorbeeldSorteer prioriteit op volgnummer
- 10KernpuntEen indicator kan bekende en onbekende gevallen samenvoegen
- 11VoorbeeldBegin het rapport met bekende invoer
- 12VoorbeeldBereken eerst het nettobedrag
- 13VoorbeeldVoeg datums toe met een afzonderlijke regel voor ontbrekende waarden
- 14UitdagingControleer een tweede rij aan de hand van beide regels
- 15VerbandZet de datumexpressies om naar PostgreSQL
- 16UitdagingFilter op het bedrag dat het rapport daadwerkelijk toont
- 17SamenvattingControleer het rapport als een reeks expliciete keuzes
SQL CASE en functies: oefenvragen
Set 1: Bereken bedragen en verwerk ontbrekende gegevens10 Oefenvragen
Vraag 1 van 10
units en unit_cost. Welke SELECT-lijst geeft hun product terug met de kolomkop extended_cost?Toon antwoordVerberg antwoord
units * unit_cost vermenigvuldigt de waarden uit elke rij en AS extended_cost geeft die uitvoer een naam. Een komma vóór de naam vraagt om een afzonderlijke kolom, die deze tabel niet heeft. Enkele aanhalingstekens zouden van unit_cost een tekstliteral maken in plaats van een verwijzing naar de kostenkolom.Vraag 2 van 10
lines bevat alleen units en price. Een query moet in SQLite en PostgreSQL werken. Hoe moet de query rijen met een product boven 90 behouden en het grootste product eerst sorteren?Toon antwoordVerberg antwoord
units * price in WHERE omdat PostgreSQL in die fase geen nieuwe SELECT-alias kan gebruiken. ORDER BY komt logisch na SELECT en kan de alias dus met DESC sorteren. SQLite kan de alias in WHERE accepteren, maar die versie voldoet niet aan de eis dat de query in beide databases werkt.Vraag 3 van 10
SELECT 14 + 5 * 3; terug in SQLite?Toon antwoordVerberg antwoord
5 * 3 als 15 en telt daar 14 bij op om 29 te krijgen. Het resultaat 57 ontstaat als je eerst 14 en 5 optelt. Die volgorde vereist haakjes rond 14 + 5; de getoonde expressie heeft die niet.Vraag 4 van 10
old_count en new_count gehele getallen met de waarden 60 en 69. Wat is het resultaat van (new_count - old_count) / old_count * 100?Toon antwoordVerberg antwoord
9 / 60 is een gehele deling, die vóór vermenigvuldiging met 100 de uitkomst 0 oplevert. Het bedoelde percentage is 15, maar de expressie verliest eerst het deel achter de komma. Met (new_count - old_count) * 100.0 / old_count blijft de benodigde decimale berekening behouden.Vraag 5 van 10
units = 5 en discount_pct = 12, met price = 18.0. Welk resultaat levert ROUND(units * price * (1 - discount_pct / 100), 2) op?Toon antwoordVerberg antwoord
12 / 100 gebruikt twee gehele getallen, dus SQLite kapt de uitkomst af naar 0. De vermenigvuldigingsfactor wordt 1 en ROUND ontvangt het volledige bedrag, 5 * 18.0, met als resultaat 90,0. Voor het bedrag na korting van 79,2 is een decimale operand binnen die deling nodig; achteraf afronden kan het verloren deel achter de komma niet herstellen.Vraag 6 van 10
CAST('27boxes' AS INTEGER)?Toon antwoordVerberg antwoord
Vraag 7 van 10
delivery_date?Toon antwoordVerberg antwoord
IS NULL test rechtstreeks of een waarde ontbreekt en geeft een duidelijke TRUE of FALSE terug. Gelijkheid met NULL levert zelfs voor een ontbrekende leverdatum UNKNOWN op, zodat WHERE zulke rijen niet zou behouden. Lege tekst is een geregistreerde tekenreeks in SQLite en PostgreSQL, niet de markering voor een onbekende datum.Vraag 8 van 10
region-waarden: 'East', 'West', NULL en 'North'. Hoeveel rijen voldoen aan WHERE NOT (region = 'East')?Toon antwoordVerberg antwoord
Vraag 9 van 10
'unlisted' worden weergegeven in SQLite. Welke expressie doet dit en behoudt geregistreerde nummers?Toon antwoordVerberg antwoord
COALESCE(phone, '', 'unlisted') laat lege tekst ongemoeid en kiest die zelfs als vervangingswaarde voordat het label wordt bereikt.Vraag 10 van 10
sales en visits. Een percentage moet een deel achter de komma behouden en NULL blijven als visits nul is. Het mag geen percentage nul verzinnen. Welke expressie past?Toon antwoordVerberg antwoord
Set 2: Schoon tekst op en werk met kalenderwaarden10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
LOWER(TRIM(' RAE@Mail.COM ')) terug in SQLite?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
first_name = 'Mira', middle_name = NULL en last_name = 'Shah'. Wat geven first_name || ' ' || middle_name || ' ' || last_name en CONCAT_WS(' ', first_name, middle_name, last_name) in die volgorde terug?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
SUBSTR('Seattle', 3, 3) terug in SQLite?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
email NULL of tekst zonder @ bevatten. Geef voor tekst met @ alles na de eerste @ terug en anders NULL. Welke expressie past?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
date('2027-04-31')?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
d de waarde '2027-08-19'. Wat zijn de resultaten van strftime('%m', d) = 8 en CAST(strftime('%m', d) AS INTEGER) = 8, in die volgorde?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
event_date in PostgreSQL omvat meerdere jaren. Een rapport geeft datums weer als MM/DD/YYYY en moet de chronologische volgorde behouden. Hoe moet het de kolom selecteren en sorteren?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
d in SQLite is '2027-04-24'. Wat geeft date(d, '+10 days') terug?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Set 3: Deel rijen in categorieën in en onderzoek rapportlogica10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
score = 75: CASE WHEN score < 60 THEN 'review' WHEN score < 80 THEN 'ready' ELSE 'strong' END?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
CASE WHEN amount < 500 THEN 'regular' WHEN amount < 100 THEN 'small' ELSE 'large' END nooit 'small' terug voor bedragen die niet NULL zijn?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
balance kan NULL zijn. De vereiste labels zijn 'unknown' bij een ontbrekende waarde, 'credit' onder 0, 'settled' bij 0 en 'due' boven 0. Welke CASE voldoet aan alle regels?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
state-waarde 'H' betekent vastgehouden en 'R' betekent vrijgegeven. Wat geeft CASE state WHEN 'H' THEN 'held' WHEN 'R' THEN 'released' ELSE 'other' END terug voor 'R'?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
'urgent', 'normal' en 'deferred' in die volgorde sorteren, met alle andere prioriteiten en NULL-prioriteiten achteraan. Welke ORDER BY-expressie past?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
qty = 4, price = 15.0, discount_pct = NULL en shipped_date = NULL. Een ontbrekende korting betekent dat er geen korting is. Welk paar komt uit ROUND(qty * price * (1 - COALESCE(discount_pct, 0) / 100.0), 2) en CASE WHEN shipped_date IS NULL THEN 'open' ELSE 'sent' END?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
LOWER(TRIM(customer)) AS name en date(due_date, '+7 days') AS reminder_date. De oorspronkelijke customer is ' IVAN ' en due_date is '2027-09-26'. Welk uitvoerpaar moet een steekproefcontrole opleveren?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
x-waarden 2, 7, NULL en 11. Wat zijn de aantallen rijen voor respectievelijk WHERE x NOT IN (2, NULL) en WHERE x <> 2 OR x IS NULL?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
'1998-12-18'. Wat is de leeftijd in voltooide jaren op '2027-12-17' en waarom kan het aftrekken van de twee jaartallen verkeerd zijn?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
rating in PostgreSQL kan NULL zijn. Een weergavekolom moet de beoordeling als tekst of als 'unrated' tonen. Welke expressie past?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Set 4: Controleer volledige rapporten en lastige grenzen10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
email = 'nora@research.org'. Welk resultaat levert SUBSTR(email, INSTR(email, '@')) op?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
COALESCE(NULL, '', 'backup') terug in SQLite?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
qty, NUMERIC price en het gehele getal discount_pct. Een ontbrekende korting betekent dat er geen korting is. Een rapport moet afgeronde nettototalen boven 75 behouden en van hoog naar laag sorteren. Welke volledige query past?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
reading in PostgreSQL is DOUBLE PRECISION. Hoe kan een rapport die op twee decimalen afronden zonder een fout in de functiesignatuur?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
'2027-01-31' de expressies date(d, '+1 month') in SQLite 3.46+, date(d, '+1 month', 'floor') in SQLite en DATE '2027-01-31' + INTERVAL '1 month' in PostgreSQL. Welke kalenderdatums zijn in die volgorde het resultaat?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
stock in PostgreSQL kan NULL zijn. Vereiste numerieke indicator: NULL voor onbekende voorraad, 1 voor voorraad onder 5 en anders 0. Welke expressie past?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
'2027-05-08 10:15:00' tot '2027-05-08 13:45:00'. Wat geeft (unixepoch(end_time) - unixepoch(start_time)) / 3600.0 terug?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
qty = 6, price = 8.0, discount_pct = 25, besteld op '2027-07-10' en verzonden op '2027-07-12'. Het nettobedrag gebruikt ROUND(qty * price * (1 - COALESCE(discount_pct, 0) / 100.0), 2). Een CASE geeft NULL-verzending het label 'open', verstreken dagen <= 2 het label 'fast' en anders 'standard'. Welk nettobedrag en label zijn het resultaat?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
d. Hoe kan het voor elke maand het kwartaal berekenen?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
(qty 3, price 22.0, discount_pct NULL), B (qty 4, price 20.0, discount_pct 25) en C (qty 2, price 40.0, discount_pct 10). Een ontbrekende korting betekent dat er geen korting is. De tabel berekent ROUND(qty * price * (1 - COALESCE(discount_pct, 0) / 100.0), 2) AS net, behoudt net > 60 met de volledige expressie in WHERE en sorteert op net DESC. Wat is de rijvolgorde?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Kom je niet uit je eigen opgave? Huiswerkhulp
Kernbegrippen
A
Aangepast sorteervolgnummer
B
Berekende kolom
quantity * unit_price AS line_total tonen, ook als de tabel geen kolom line_total heeft.C
CASE-expressie met voorwaarden
CASE WHEN total < 50 THEN 'small' ELSE 'large' END kiest een label op basis van het bedrag in de rij.CEIL
CEIL(4.1) geeft 5 omdat vier onder de invoer ligt en vijf het volgende gehele getal is.COALESCE
COALESCE(mobile_phone, home_phone, 'no phone') gebruikt het huistelefoonnummer als het mobiele nummer ontbreekt.Concatenatie
first_name || ' ' || last_name voegt een spatie in tussen de twee geregistreerde naamdelen.D
DATE
DATE '2026-03-14' markeert 14 maart 2026 expliciet als een datumwaarde in PostgreSQL.Deeltekenreeks
SUBSTR('Boston', 1, 3) geeft 'Bos' terug en neemt drie tekens vanaf de eerste positie.Driewaardige logica
FALSE AND UNKNOWN is FALSE, maar TRUE AND UNKNOWN blijft UNKNOWN omdat de tweede eis onbeslist is.Drijvendekommagetal
0.1 + 0.2 = 0.3 onwaar zijn omdat de opgeslagen benaderingen niet tot dezelfde waarde optellen.E
Eenvoudige CASE-expressie
CASE status WHEN 'S' THEN 'Shipped' ELSE 'Other' END zet een opgeslagen statuscode om.ELSE-vervangingswaarde
ELSE 'large' terechtkomen, tenzij een eerdere tak expliciet total IS NULL test.Expliciete typeconversie
CAST(quantity AS REAL) / 4 verandert de operand in SQLite voordat de deling een deel achter de komma kan verliezen.Expressie
quantity * unit_price een expressie die voor elke rij het regelbedrag oplevert.EXTRACT
EXTRACT(MONTH FROM DATE '2026-03-14') in PostgreSQL geeft de numerieke maandwaarde 3 terug.F
FLOOR
FLOOR(-4.1) gelijk aan -5, dus het verschilt van alleen het deel achter de komma afkappen.Functienesting
ROUND(COALESCE(amount, 0), 2) wordt de vervangingswaarde bepaald voordat de afrondingsfunctie haar invoer ontvangt.G
Gegevenstype
'42' en het gehele getal 42 kunnen er in een overzicht hetzelfde uitzien, maar zich in SQL anders gedragen.Gehele deling
7 / 2 levert 3 op; als je van de tweede operand 2.0 maakt, blijft het deel achter de komma behouden en ontstaat 3,5.Getal als tekst
'10', '100' en '9' verschijnen in die oplopende tekstvolgorde, die verschilt van de numerieke volgorde.Grenswaarde
total < 50 onwaar; als je de test verandert in total <= 50, wordt deze waar.H
Halfopen bereik
ordered_at >= '2026-03-01' AND ordered_at < '2026-04-01' omvat alle tijdstempels van maart.I
Impliciete typeconversie
'Order #' || 42, wat het label 'Order #42' oplevert.INSTR
INSTR('ana@example.com', '@') geeft 4, terwijl een tekenreeks zonder @ nul oplevert.IS NULL
WHERE phone IS NULL haalt klanten zonder geregistreerd telefoonnummer op zonder een waarde met gelijkheid met NULL te vergelijken.ISO-datumnotatie
'2026-03-14' heeft voorloopnullen en wordt in datumvolgorde vóór '2026-11-02' gesorteerd.J
Jaar-maandaanduiding
'2026-03' houdt maart 2026 in een rapportweergave gescheiden van maart 2025.Juliaans dagnummer
julianday(end_date) - julianday(start_date) in plaats van ISO-datumtekenreeksen rechtstreeks af te trekken.K
Kolomalias
AS line_total en kan erop sorteren met ORDER BY line_total.L
Leeftijd in voltooide jaren
LENGTH
LENGTH(' Bo ') geeft 4 omdat beide spaties aan de randen meetellen, evenals de twee letters.Literal
first_name || ' ' || last_name is een tekstliteral die door de query wordt geleverd.Logische verwerkingsvolgorde
M
Modulo
135 % 60 de 15 minuten die na twee volledige uren overblijven.N
NULL
salary + bonus onbekend, ook al is het salaris van de werknemer geregistreerd.NULL-veilige vergelijking
NULL IS NOT DISTINCT FROM NULL is TRUE in PostgreSQL en in SQLite vanaf versie 3.39.NULLIF
NULLIF(visits, 0) behoudt positieve bezoekersaantallen maar zet nul om in een ontbrekende deler voor een percentage.Numerieke indicator
CASE WHEN discount_pct > 0 THEN 1 ELSE 0 END kent nul toe aan zowel ontbrekende als niet-positieve kortingen.O
Omzetting naar hoofdletters of kleine letters
LOWER(TRIM(email)) maakt een opgeschoond ASCII-e-mailadres consistent voor een vergelijking zonder verschil in hoofdletters.Operatorprioriteit
10 + 3 * 2, dus het resultaat is 16 in plaats van 26.Opmaakpatroon
'%m/%d/%Y' voor een Amerikaans datumlabel; TO_CHAR in PostgreSQL gebruikt 'MM/DD/YYYY'.Opvullen
LPAD('42', 5, '0') in PostgreSQL geeft '00042' terug en maakt een korte code vijf tekens lang.P
Plaatsaanduiding
NULLIF(phone, '') zet een lege telefoontekenreeks om in NULL voordat een weergavelabel wordt gegeven.R
Rapportagequery
REPLACE
REPLACE('555-0100', '-', '') verwijdert het koppelteken en toont '5550100' zonder de tabel te wijzigen.ROUND
ROUND((price - cost) / price * 100, 1) om een marge op één decimaal weer te geven.S
Scalaire functie
UPPER(city) in SELECT gebruikt, verandert de weergegeven stadstekst voor elke klant die de query teruggeeft.Sorteerregels (collation)
'Boston' = 'boston' waar maken, terwijl dit standaard in SQLite niet zo is.Steekproefcontrole
LIMIT 5 toevoegt tijdens het bouwen van het rapport, kun je een ontbrekende spatie of een fout door gehele deling gemakkelijker vinden.strftime
strftime('%m', '2026-03-14') geeft '03' terug; vergelijk dit met tekst of converteer het vóór numeriek gebruik.T
Tekenpositie
'ana@example.com' staat op positie 4, dus het domein begint op positie 5.Tekenreeks
' New York ' bevat spaties aan de randen en twee spaties binnenin die de lengte beïnvloeden.Tijdsinterval
INTERVAL '1 month' bij een DATE in PostgreSQL optelt, krijg je een tijdstempel volgens de regel voor het einde van de maand.TIMESTAMP
'2026-03-31 14:05:00' is later dan middernacht aan het begin van 31 maart.TRIM
TRIM(' New York ') blijven de twee spaties tussen de woorden in de teruggegeven tekst staan.Typeaffiniteit
U
Unixtijd
3600.0 om uren met een deel achter de komma in een tijdsduur te behouden.UNKNOWN
bonus = NULL is UNKNOWN en kan dus geen ontbrekende bonus in een WHERE-filter vinden.UTC
V
Vervangingswaarde
W
WHEN-tak
< 200 eerst zet, kan een latere tak < 50 mogelijk nooit worden gekozen.- 1Relationele databases
- 2SQL SELECT
- 3SQL CASE en functies
- 4SQL GROUP BY
- 5SQL-joins
- 6SQL CREATE TABLE
Over deze les
Door StudeliFout melden
Maak je eigen Studiemateriaal
Maak van je aantekeningen, slides en documenten Leermodules, Oefenvragen, Flashcards en 6 andere tools.