- Leren
- Informatica & ICT
- Programmeren
- De basis van SQL
- Relationele databases
Relationele databases: het relationele model
BeginnerLes 1 van 6 in SQL: de basis
Wat je leert
- Beschrijf waarom organisaties gedeelde gegevens in relationele databases bewaren, wat een databasemanagementsysteem doet en hoe SQL wordt gebruikt om ermee te werken.
- Leg uit waarom organisaties databases gebruikenMaak onderscheid tussen gegevens, een database en een databasemanagementsysteem en leg uit wat een relationele database beter doet dan een gedeelde spreadsheet of losse bestanden.
- Herken databasesystemen en de rol van SQLNoem veelgebruikte relationele databasesystemen, beschrijf hoe toepassingen ermee verbinden en leg uit wat SQL is en hoe de instructies zijn ingedeeld.
- Leg uit waarom organisaties databases gebruiken
- Gebruik de begrippen tabel, rij en kolom om gegevens correct te lezen en leg uit aan welke regels een relationele tabel voldoet.
- Beschrijf de onderdelen van een tabelHerken tabellen, rijen, kolommen en waarden in voorbeeldgegevens en koppel de dagelijkse woorden aan hun formele relationele namen.
- Leg uit aan welke regels een relationele tabel voldoetPas de regels van het relationele model voor rijen, kolommen en waarden toe en herken waar SQL-tabellen en spreadsheets zich anders gedragen.
- Beschrijf de onderdelen van een tabel
- Koppel elke kolom aan een geschikt gegevenstype, voorkom veelgemaakte typefouten met geld, codes en datums en werk correct met NULL.
- Herken de belangrijkste SQL-gegevenstypenHerken de gebruikelijke typen voor getallen, tekst, datums en Booleaanse waarden, lees hun instellingen voor grootte en precisie en weet waarin databasesystemen verschillen.
- Kies een gegevenstype voor gegevens uit de praktijkKies geschikte typen voor geld, hoeveelheden, codes, datums en namen door te vragen hoe de waarden worden gebruikt, en voorkom de fouten die verkeerde typen veroorzaken.
- Werk correct met NULLLeg uit wat NULL betekent, maak onderscheid tussen NULL, nul en lege tekst en voorspel hoe NULL zich gedraagt in vergelijkingen, berekeningen en integriteitsregels.
- Herken de belangrijkste SQL-gegevenstypen
- Gebruik primaire sleutels om elke rij te identificeren en refererende sleutels om tabellen te koppelen, en herken de een-op-veelrelaties, een-op-eenrelaties en veel-op-veelrelaties die ze vormen.
- Herken kandidaatsleutels en de primaire sleutelBepaal welke kolommen of kolomcombinaties elke rij uniek identificeren en leg uit aan welke regels een primaire sleutel moet voldoen.
- Kies tussen natuurlijke sleutels en surrogaatsleutelsVergelijk identificatiewaarden uit de praktijk met door het systeem gegenereerde waarden, beoordeel welke goede primaire sleutels zijn en bescherm natuurlijke identificatiewaarden met uniciteitsregels.
- Koppel tabellen met refererende sleutelsLeg uit hoe een refererende sleutel verwijst naar een rij in een andere tabel, wat referentiële integriteit beschermt en wat er gebeurt als rijen waarnaar wordt verwezen veranderen of worden verwijderd.
- Herken een-op-veelrelaties, een-op-eenrelaties en veel-op-veelrelatiesBepaal hoeveel rijen aan elke kant van een koppeling met elkaar verbonden kunnen zijn en laat zien hoe refererende sleutels en koppeltabellen elk soort relatie weergeven.
- Herken kandidaatsleutels en de primaire sleutel
- Lees een schema als tabeldefinities of als diagram en gebruik het met voorbeeldgegevens om te achterhalen waar gegevens zijn opgeslagen en hoe tabellen zijn gekoppeld.
- Lees een schema en de bijbehorende tabeldefinitiesMaak onderscheid tussen een schema en de gegevens die het beschrijft, lees schemanotatie en CREATE TABLE-instructies en interpreteer de integriteitsregels die ze declareren.
- Lees een schemadiagramInterpreteer de vakken, sleutelaanduidingen, verbindingslijnen en kraaienpootsymbolen van een schemadiagram en beschrijf elke weergegeven relatie in woorden.
- Beantwoord vragen met behulp van een schema en voorbeeldgegevensZoek op waar elk gegeven is opgeslagen, volg sleutels met de hand tussen tabellen en gebruik de integriteitsregels van het schema om te bepalen welke gegevens zijn toegestaan.
- Lees een schema en de bijbehorende tabeldefinities
Relationele databases: uitleg
1Wat een database doet
Een winkel kan beginnen met een spreadsheet, maar gedeelde gegevens roepen al snel lastigere vragen op: welke klantgegevens zijn actueel, wie mag ze wijzigen en wat gebeurt er als een betaling halverwege stopt? Een databasesysteem brengt deze vragen samen. Maak onderscheid tussen de opgeslagen feiten en de software die ze beheert en bekijk vervolgens hoe toepassingen SQL gebruiken om gegevens op te vragen en wijzigingen aan te brengen. Dezelfde ideeën ondersteunen een kleine telefoonapp en het rapportagesysteem van een groot bedrijf.
1.1 Gedeelde gegevens en betrouwbare wijzigingen
Een klantnaam, een besteldatum en een prijs zijn gegevens: vastgelegde feiten. Een database is een geordende verzameling samenhangende gegevens. Een databasemanagementsysteem, of DBMS, is de software die die verzameling opslaat en beheert. PostgreSQL is een DBMS; de database store van een winkel is één verzameling die het beheert.
Sla elk gegeven op waar het hoort
Stel dat een spreadsheet het telefoonnummer van Maria Garcia bij alle 14 verkopen aan haar herhaalt. Als haar telefoonnummer verandert, zijn 14 aanpassingen nodig. Eén overgeslagen cel leidt tot tegenstrijdige gegevens. In een relationele database bevat customers Maria's gegevens één keer, onder customer_id 1. Elke verkoop legt die identificatiewaarde vast. Als je haar telefoonnummer in één klantrij bijwerkt, leveren latere zoekopdrachten één actueel nummer op.
Een relationele database ordent gegevens in tabellen. “Relationeel” komt van relatie, de wiskundige naam voor een tabel. E. F. Codd introduceerde het model in 1970. De centrale scheiding is nuttig: gebruikers beschrijven via tabellen en waarden welke gegevens ze willen; het DBMS regelt hoe die gegevens op schijf worden gevonden.
Regels en gedeelde toegang
Een tabel heeft benoemde kolommen, gegevenstypen en integriteitsregels. Een integriteitsregel is een regel die het DBMS controleert, zoals “een bestelling moet naar een bestaande klant verwijzen”. Deze controles beschermen gedeelde gegevens wanneer meerdere toepassingen dezelfde database gebruiken. De handhaving van typen verschilt: PostgreSQL weigert tekst zoals 'twelve' in een numerieke prijskolom, terwijl gewone SQLite-tabellen flexibele typen hebben.
Een DBMS beheert ook gelijktijdige gebruikers, rechten, back-ups en herstel. Twee medewerkers kunnen met gedeelde gegevens werken zonder afzonderlijke kopieën van een spreadsheet uit te wisselen. Rechten kunnen een rapportagegebruiker verkoopgegevens laten lezen en tegelijk beperken wie ze mag wijzigen. Een proces voor back-ups en herstel helpt gegevens na een storing terug te zetten.
Houd een groep wijzigingen bij elkaar
Een transactie behandelt meerdere wijzigingen als één geheel: alle worden opgeslagen of geen ervan. Om € 200 tussen rekeningen over te boeken, moet het bedrag van de betaalrekening worden afgetrokken en bij de spaarrekening worden opgeteld. Als een storing de overboeking onderbreekt voordat die is voltooid, kan het DBMS de onvoltooide transactie terugdraaien. Als alleen de afschrijving wordt opgeslagen, blijft een onjuist saldo over.
Een spreadsheet blijft nuttig voor kleine berekeningen en flexibele indelingen. Een database biedt een vastgelegde structuur voor gedeelde gegevens en regels. Een Excel-werkblad heeft een vaste limiet van 1.048.576 rijen; databases beheren regelmatig veel grotere verzamelingen, afhankelijk van opslag, hardware en productlimieten.
Verschillende gegevens en verschillende taken
Gestructureerde gegevens passen in benoemde kolommen die alle rijen delen. Semigestructureerde gegevens, zoals JSON-documenten, kunnen in verschillende records verschillende velden hebben. Ongestructureerde gegevens, zoals audio of vrije e-mailteksten, missen die vaste tabelindeling. Organisaties combineren relationele databases vaak met documentopslag, sleutel-waardeopslag of bestandsopslag.
Ook de werklast is van belang. Een transactioneel systeem, ook OLTP genoemd, registreert dagelijkse gebeurtenissen via veel kleine lees- en schrijfbewerkingen: een bestelling, een betaling, een adreswijziging. Een analytisch systeem, of OLAP, leest veel opgeslagen records om vragen te beantwoorden zoals “Hoe verschilde de maandelijkse verkoop per regio?” Beide kunnen relationele tabellen en sleutels gebruiken.
Belangrijkste punten
- Een database bevat samenhangende gegevens; een DBMS beheert die.
- Relationele gegevens zijn geordend in tabellen, met regels die het DBMS controleert.
- Een transactie slaat een groep wijzigingen samen op of draait die samen terug.
- Gedeelde klantgegevens kunnen op één plaats worden bijgewerkt en via een identificatiewaarde worden gevonden.
- Transactioneel werk registreert gebeurtenissen; analytisch werk vat opgeslagen gegevens samen.
1.2 SQL, databaseproducten en toepassingen
SQL, afkorting van Structured Query Language, is een taal. PostgreSQL, MySQL, SQLite, Microsoft SQL Server en Oracle Database zijn producten die deze taal gebruiken. SQL Server is één DBMS, geen andere naam voor SQL zelf.
Hoe een toepassing de gegevens bereikt
In een client-serversysteem beheert een serverprogramma de database. Een client, zoals een website, rapportagetool of query-editor, stuurt verzoeken naar die server. PostgreSQL, MySQL, SQL Server en Oracle werken meestal op deze manier. Met tools zoals psql, pgAdmin, DBeaver en SQL Server Management Studio kunnen mensen databases inspecteren en verzoeken versturen.
Een ingebedde engine draait binnen een toepassing. SQLite gebruikt een bibliotheek en een gewoon databasebestand, zoals store.db, zonder aparte databaseserver. Het komt veel voor in telefoons, browsers en desktopapps. Bij een beheerde clouddienst, zoals Azure SQL Database, Amazon RDS of Google Cloud SQL, beheert een aanbieder de databaseservers. “Beheerd” beschrijft wie de dienst beheert; het vervangt tabellen en sleutels niet door een ander model.
Eén DBMS-installatie kan meerdere databases beheren, zoals store en payroll. Een verbinding selecteert de te gebruiken database, afhankelijk van de rechten.
Geef aan welk resultaat je wilt
SQL is declaratief: het beschrijft het gewenste resultaat, terwijl het DBMS kiest hoe het dat verkrijgt. Lees deze instructie:
SELECT first_name, city
FROM customers
WHERE state = 'TX';
De instructie vraagt om voornamen en woonplaatsen uit klantrijen waarvan de staat TX is. Ze zegt niets over welke schijfpagina eerst moet worden gelezen. Trefwoorden in hoofdletters maken de instructie gemakkelijker te overzien; select en SELECT betekenen hetzelfde. Een puntkomma beëindigt normaal gesproken een instructie.
Herken de taak van de instructie
| Groep | Doel | Voorbeelden |
|---|---|---|
| Gegevensdefinitie, DDL | Structuur definiëren of wijzigen | CREATE TABLE, ALTER TABLE, DROP TABLE |
| Gegevensmanipulatie, DML | Rijen lezen of wijzigen | SELECT, INSERT, UPDATE, DELETE |
| Gegevensbeheer, DCL | Rechten beheren | GRANT, REVOKE |
| Transactiebeheer | Een transactie vastleggen of terugdraaien | COMMIT, ROLLBACK |
Sommige boeken plaatsen SELECT in een aparte groep voor gegevensopvraagtaal. Het nuttige onderscheid is de werkelijke taak van de instructie: een kolom toevoegen verandert de structuur; een klant toevoegen verandert de gegevens.
SQL werd in 1986 een ANSI-standaard en is internationaal gestandaardiseerd als ISO/IEC 9075. Producten voegen hun eigen dialecten toe. Een limiet van tien rijen schrijf je als LIMIT 10 in SQLite, PostgreSQL en MySQL, TOP 10 in SQL Server of FETCH FIRST 10 ROWS ONLY in standaard-SQL en Oracle.
Lees tekst en andere databaseobjecten
Tekstliterals gebruiken enkele aanhalingstekens: 'TX'. Standaard-SQL gebruikt dubbele aanhalingstekens voor identificatoren, zoals kolomnamen. Een apostrof binnen tekst wordt verdubbeld: 'O''Brien' stelt O'Brien voor.
Een view is een opgeslagen query die als een tabel wordt gebruikt; een gewone view heeft zelf geen opgeslagen rijen. Een index is een opzoekstructuur die kan helpen om snel rijen te vinden. De meeste systemen maken automatisch een index op primaire sleutels. Opgeslagen procedures en functies zijn opgeslagen code die je met hun naam kunt uitvoeren.
Belangrijkste punten
- SQL beschrijft een gewenst resultaat; het DBMS kiest hoe het dat verkrijgt.
- Client-serversystemen ontvangen verzoeken via een server; SQLite is ingebed in een toepassing.
- DDL wijzigt de structuur, terwijl DML rijen leest of wijzigt.
- Enkele aanhalingstekens markeren tekst; een apostrof binnen tekst wordt verdubbeld.
- Een view slaat een query op; een index ondersteunt sneller opzoeken.
- SQL-dialecten delen de relationele ideeën maar verschillen in een deel van de syntaxis.
2Lees een tabel correct
Een tabel geeft elk soort record een duidelijke vorm: rijen beschrijven afzonderlijke zaken en kolommen beschrijven hun eigenschappen. Lees de structuur voordat je een waarde interpreteert. Maak vervolgens onderscheid tussen de logische regels van de tabel en de indeling van een spreadsheet: de positie identificeert een record niet, een lijst telefoonnummers is meer dan één waarde en een totaalrij heeft een andere betekenis dan een verkoop. Deze verschillen maken het latere werk met sleutels en schema's veel eenvoudiger.
2.1 Rijen, kolommen en waarden
Een tabel slaat gegevens op over één soort zaken. Elke rij in customers beschrijft één klant; elke kolom bevat één eigenschap. Op hun snijpunt staat een waarde.
Lees één record van links naar rechts
Hier zijn enkele klantkolommen:
customer_id | first_name | last_name | city | state | zip_code |
|---|---|---|---|---|---|
| 1 | Maria | Garcia | Austin | TX | 78701 |
| 2 | James | Wilson | Denver | CO | 80202 |
| 3 | Aisha | Johnson | Boston | MA | 02108 |
| 4 | Wei | Chen | Seattle | WA | 98101 |
Zoek customer_id 4 en lees dan city: Wei woont in Seattle. Om te vinden wie in Denver woont, lees je de naam in de rij van Denver: James Wilson. Een naastgelegen rij beschrijft een andere klant.
De volledige tabel heeft acht kolommen: customer_id, first_name, last_name, email, phone, city, state en zip_code. Het telefoonnummer van James is NULL: de waarde ontbreekt, maar zijn rij heeft nog steeds de kolom voor het telefoonnummer.
Koppel de begrippen
| Dagelijks woord | Formeel relationeel woord | Ander veelgebruikt woord |
|---|---|---|
| Tabel | Relatie | - |
| Rij | Tupel | Record |
| Kolom | Attribuut | Veld |
Een tupel is een hele rij, niet één cel. Een attribuut benoemt een eigenschap die alle rijen delen. “Record 4” kan een identificatiewaarde of een positie in de weergave betekenen; controleer welke, want posities kunnen veranderen.
Tel de onderdelen
De graad telt kolommen; de tabelkardinaliteit telt rijen. De volledige tabel heeft graad 8 en kardinaliteit 4. De weergave hierboven toont zes kolommen zonder de graad van de tabel te veranderen.
Als je een klant toevoegt, stijgt de kardinaliteit naar 5; de graad blijft 8. Als je birth_date toevoegt, stijgt de graad naar 9 en krijgt elke rij een plaats voor die waarde, ook als die ontbreekt. Een nieuwe klant voegt een rij toe, geen kolom.
Relatiekardinaliteit, zoals een-op-veel, beschrijft toegestane koppelingen in plaats van het aantal rijen van een tabel.
Lees gekwalificeerde namen
Kolomnamen zijn uniek binnen een tabel. orders.customer_id en customers.customer_id onderscheiden gelijknamige kolommen in verschillende tabellen: de punt scheidt tabel- en kolomnamen.
snake_case gebruikt woorden in kleine letters, gescheiden door underscores, zoals in zip_code. Namen met spaties moeten in SQL tussen aanhalingstekens staan. Tabelnamen in het enkelvoud of meervoud kunnen beide werken; gebruik een consequente afspraak.
Belangrijkste punten
- Een rij beschrijft één exemplaar; een kolom beschrijft één eigenschap.
- Relatie, tupel en attribuut betekenen tabel, rij en kolom.
- De graad telt kolommen; de tabelkardinaliteit telt rijen.
- Een met de tabelnaam gekwalificeerde naam geeft aan bij welke tabel een kolom hoort.
2.2 De regels achter het raster
Een relationele tabel heeft een logische structuur die verder gaat dan haar rechthoekige uiterlijk. In het formele model is ze een verzameling rijen. Verzamelingen bevatten geen dubbele elementen en hebben geen volgorde. Kolommen worden herkend aan hun naam, dus als je een kolom in een weergave verplaatst, verandert het gegeven dat ze vertegenwoordigt niet.
Identiteit komt niet voort uit positie
Een DBMS kan rijen in een andere volgorde teruggeven na wijzigingen, verwijderingen of een verandering in de manier waarop het de opslag leest. “De derde rij” is geen blijvende manier om een klant te identificeren. customer_id 3 identificeert Aisha nog steeds wanneer haar rij als eerste verschijnt. Een query die een bepaalde volgorde nodig heeft, vraagt daar met ORDER BY om.
SQL-tabellen verschillen van formele relaties: zonder primaire sleutel of een andere geschikte uniciteitsregel kunnen ze identieke rijen bevatten. Twee kopieën van ('Coffee mug', 12.50) bieden in die kolommen geen onderscheidende waarde. Een primaire sleutel geeft elke rij een unieke identificatiewaarde en voorkomt volledig dubbele rijen.
Eén kolom, één domein
Een domein is de verzameling waarden die in een kolom zijn toegestaan. Een hoeveelheid heeft een type voor gehele getallen en kan ook een regel nodig hebben die bepaalt dat ze positief moet zijn. Een staatcode is tekst, maar niet elke tekstwaarde is een geldige staatcode. Gegevenstypen en integriteitsregels beschrijven de toegestane waarden aan het DBMS.
Alle rijen delen dezelfde kolommen. Eén bestelling kan niet alleen voor zichzelf een extra kolom voor een cadeaubericht krijgen. De tabel kan voor elke bestelling een kolom gift_note hebben, met NULL waar geen bericht is vastgelegd. Optionele gegevens hebben nog steeds een vaste plaats.
Houd afzonderlijke waarden gescheiden
Een atomaire waarde is één waarde voor het doel van de kolom. Een telefooncel met “512-555-0147, 512-555-0199” bevat een lijst van twee nummers. Het wordt lastig om slechts één nummer te vinden, te controleren of te verwijderen. Een tabel customer_phones kan elk telefoonnummer een eigen rij geven, waarbij customer_id aangeeft van wie het nummer is.
Atomair betekent niet dat elke tekstwaarde in de kleinste stukjes moet worden opgesplitst. Een stadsnaam kan uit meerdere woorden bestaan en toch één stadswaarde blijven. De vraag is of de cel één gegeven van het soort bevat dat de kolom vertegenwoordigt, of een verzameling die afzonderlijk moet worden verwerkt.
Bekijk een export uit een spreadsheet kritisch
Een werkblad met verkopen kan halverwege een herhaalde kop bevatten, onderaan een rij met het label “TOTAAL” en een prijs die is geschreven als “12,50 (aanbieding)”. Dit zijn nuttige indelingskeuzes voor een persoon, maar ze mengen verschillende soorten inhoud in dezelfde kolommen.
Om het als een relationele tabel te lezen:
- Beschouw de kolomnamen als kop, niet als verkooprecords.
- Laat elke gegevensrij over één verkoop gaan; bereken het totaal op basis van die rijen.
- Sla de numerieke prijs apart van een aanbiedingsaanduiding op.
- Geef elke verkoop een sleutel zodat de rij kan worden geïdentificeerd.
Een totaalrij tussen verkopen kan als een nieuwe verkoop worden geteld of opnieuw bij het totaal worden opgeteld. Een aanduiding in een numerieke prijs verhindert gewone numerieke bewerkingen.
Logische tabellen en fysieke opslag
Een tabel is de logische weergave voor de gebruiker. Het DBMS kan de gegevens opslaan in bestanden, pagina's en indexen die zijn ingericht voor efficiënte toegang. Gegevensonafhankelijkheid betekent dat wijzigingen in die fysieke indeling de tabelnamen, kolombetekenissen of verzoeken van toepassingen niet hoeven te veranderen.
Belangrijkste punten
- Een formele relatie heeft unieke rijen zonder volgorde; SQL heeft integriteitsregels nodig om dubbele rijen te voorkomen.
- Een rijvolgorde moet je opvragen met
ORDER BY. - Het domein van een kolom beschrijft de toegestane waarden.
- Elke cel bevat één waarde voor het doel van de kolom.
- Elke rij heeft dezelfde kolommen, inclusief plaatsen voor ontbrekende waarden.
3Kies typen en interpreteer ontbrekende gegevens
Het type van een kolom beïnvloedt wat je kunt opslaan, hoe waarden worden gesorteerd en welke berekeningen zinvol zijn. Cijfers kunnen een aantal of een code beschrijven; die toepassingen vragen om verschillende typen. Geld moet exact worden opgeslagen, terwijl metingen vaak benaderende waarden kunnen gebruiken. Ontbrekende gegevens vereisen een eigen behandeling als NULL. Leer deze keuzes samen met de belangrijke productverschillen, vooral de flexibele opslag van SQLite en de manier waarop SQL omgaat met onbekende vergelijkingsresultaten.
3.1 De belangrijkste SQL-gegevenstypen
Een gegevenstype vertelt een DBMS wat voor soort waarde een kolom bevat en hoe het daarmee moet werken. Getallen optellen, tekst vergelijken en datums ordenen zijn verschillende bewerkingen. Een vertrouwde typenaam kan zich ook verschillend gedragen in verschillende databaseproducten.
Getallen: geheel, exact en benaderend
| Soort | Veelgebruikte typen | Geschikte toepassing |
|---|---|---|
| Gehele getallen | INTEGER, SMALLINT, BIGINT | Tellingen, hoeveelheden en identificatiewaarden als gehele getallen |
| Exacte decimalen | DECIMAL(p, s), NUMERIC(p, s) | Geld en andere exacte decimale bedragen |
| Benaderende getallen | REAL, FLOAT, DOUBLE PRECISION | Metingen waarbij afrondingsverschillen acceptabel zijn |
In PostgreSQL, MySQL en SQL Server loopt INTEGER van −2.147.483.648 tot 2.147.483.647. BIGINT reikt tot 9.223.372.036.854.775.807; de opslag voor gehele getallen van SQLite kan dat bereik ook halen.
Bij decimalen is precisie het totale aantal cijfers en schaal het aantal achter de komma. DECIMAL(8, 2) laat zes cijfers voor de komma over: het maximum is 999999,99. De prijs 12,50 past; 1234567,00 niet. PostgreSQL, MySQL, SQL Server en Oracle bieden exacte decimale opslag. SQLite accepteert deze declaratie maar dwingt de precisie of schaal niet af en kan breuken opslaan als binaire drijvendekommagetallen.
Drijvendekommaweergave benadert veel decimale breuken. Met dubbele precisie levert het optellen van 0,1 en 0,2 de uitkomst 0,30000000000000004 op. SQLite behandelt deze decimale literals als drijvendekommagetallen. PostgreSQL behandelt decimale literals zonder expliciet type als exact numeriek, zodat dezelfde geschreven berekening daar exact kan zijn; expliciete waarden met dubbele precisie laten de benadering zien.
Tekst, datums en indicatoren
CHAR(n) is tekst met een vaste lengte; PostgreSQL en SQL Server vullen kortere waarden aan met spaties. VARCHAR(n) staat wisselende lengtes tot een limiet toe. SQLite negeert beide lengte-instellingen en vult niet aan. TEXT bevat lange tekst in SQLite, PostgreSQL en MySQL. SQL Server gebruikt hiervoor VARCHAR(MAX) of NVARCHAR(MAX); het oudere type TEXT is verouderd.
Een DATE bevat een kalenderdatum, een TIME een tijdstip en standaard-SQL TIMESTAMP een datum en tijd. Schrijf datums in de volgorde jaar-maand-dag, zoals '2026-03-02', om verwarring tussen 2 maart en 3 februari te voorkomen. Datums met een datumtype hebben een interne opslagnotatie; de toepassing kiest de weergavenotatie. SQLite heeft geen specifiek datumtype en slaat gewoonlijk ISO-datumtekst op. SQL Server gebruikt DATETIME2 voor datum en tijd: zijn TIMESTAMP betekent ROWVERSION, een binaire versieteller.
Een BOOLEAN stelt TRUE of FALSE voor, of NULL als de waarde ontbreekt. PostgreSQL heeft een Booleaans type; SQL Server gebruikt BIT, MySQL behandelt BOOLEAN als een klein geheel getal en SQLite slaat de indicatoren op als 1 en 0. Binaire typen zoals BLOB of BYTEA van PostgreSQL slaan bytes op, waaronder kleine afbeeldingen. Grotere bestanden worden vaak apart opgeslagen, met een pad of URL in een tabel.
Typeaffiniteit van SQLite
In gewone SQLite-tabellen is een gedeclareerd type een voorkeur die typeaffiniteit heet. Een kolom INTEGER zet '42' om naar het getal 42, maar kan 'abc' als tekst behouden. Een SQLite-tabel STRICT weigert tekst die niet kan worden omgezet naar een geldig geheel getal.
Belangrijkste punten
- Gegevenstypen voor gehele getallen bevatten gehele getallen; exacte decimalen en drijvendekommagetallen dienen verschillende doelen.
- Precisie telt alle cijfers; schaal telt de cijfers achter de komma.
- ISO-datumtekst gebruikt de volgorde jaar-maand-dag.
- Tekstlengtes, opslag van Booleaanse waarden en datumtypen verschillen per dialect.
- SQLite-typeaffiniteit is flexibel;
STRICT-tabellen dwingen hun ondersteunde typen af. TIMESTAMPvan SQL Server is een rijversie, geen datum en tijd.
3.2 Kies een type op basis van de functie van de waarde
Begin bij wat een waarde betekent en hoe die wordt gebruikt. Een ZIP-code bevat cijfers, maar niemand telt ZIP-codes op om een betekenisvol totaal te krijgen. Een hoeveelheid bevat ook cijfers en hoeveelheden optellen is wel nuttig. Alleen het uiterlijk is een slechte leidraad voor de typekeuze.
Stel vijf vragen
- Wat zijn gebruikelijke waarden en welke extreme waarden moeten passen?
- Worden de waarden gebruikt om te rekenen?
- Moeten ze exact zijn of is een benadering acceptabel?
- Hoe moeten ze worden gesorteerd en vergeleken?
- Welke grootte past bij realistische toekomstige waarden?
Geld en metingen
Geld vereist exacte waarden. In PostgreSQL, MySQL en SQL Server kan een prijs DECIMAL(8, 2) gebruiken. Drie artikelen van € 12,50 kosten precies € 37,50. Binaire drijvendekommaopslag kan na herhaald optellen kleine fouten achterlaten, waardoor exacte vergelijkingen onbetrouwbaar worden. In SQLite levert de declaratie DECIMAL geen exacte decimale opslag op; gebruik gehele centen voor exacte bedragen, zodat € 12,50 wordt opgeslagen als 1250.
Een meting zoals gewicht kan REAL gebruiken als kleine afrondingsverschillen acceptabel zijn. Kies de eenheid als onderdeel van de betekenis van de kolom: weight_lb laat in de naam zien dat het om ponden gaat. Een numeriek type alleen legt die eenheid niet vast.
Ook de valuta moet duidelijk zijn. Als een tabel verschillende valuta's bevat, voeg dan currency_code toe, met bijvoorbeeld USD, EUR of JPY. Het aantal decimalen verschilt per valuta en bedragen in verschillende valuta's moeten worden omgerekend voordat je ze kunt optellen.
Codes en namen zijn tekst
Gebruik tekst voor ZIP-codes, telefoonnummers, rekeningnummers en voorraadcodes. De ZIP-code van Boston '02108' verliest de eerste nul als je die omzet naar een geheel getal. VARCHAR(10) kan ook ZIP+4 bevatten, zoals '02108-1234'. Telefoonnummers kunnen een plusteken, spaties en koppeltekens bevatten. Deze tekens maken deel uit van de schrijfwijze van een identificatiewaarde, het zijn geen rekentekens.
Laat ruimte voor echte namen en adressen. “Christopher Montgomery” heeft 22 tekens, dus VARCHAR(10) is te kort. PostgreSQL en SQL Server weigeren de naam; MySQL weigert die in de strikte modus en kan die anders afkappen. SQLite slaat de naam op omdat gedeclareerde tekstlengtes worden genegeerd. Een ruim veld met variabele lengte voorkomt dat gewone namen worden geweigerd, zonder voor elke rij de maximale lengte te reserveren.
Sorteren onthult een verkeerde keuze
Bij het sorteren van tekst worden tekens vergeleken. Getallen die als tekst zijn opgeslagen, kunnen in de volgorde '1', '10', '2', '25', '3' verschijnen. Een numerieke kolom sorteert die waarden numeriek. Als je voor elk veld tekst kiest, verschuif je het controle- en conversiewerk naar latere berekeningen.
Datums hebben een vergelijkbare valkuil. Datumtekst in Amerikaanse notatie plaatst '12/01/2025' na '03/02/2026' in tekstvolgorde, hoewel december 2025 eerder is. Gebruik een datumtype, of in SQLite consequent opgemaakte ISO-tekst, zodat de kalendervolgorde behouden blijft.
Bekijk de typen van een product samen
Een product kan product_id INTEGER, sku VARCHAR(20), name VARCHAR(100), price DECIMAL(8, 2), weight_lb REAL, in_stock BOOLEAN en added_on DATE gebruiken. Elk type volgt uit een functie: identificatie, opslag van een code, een naam, exact geld, een meting, een indicator of een datum. Sla voor SQLite de prijs op als gehele centen en de datum als ISO-tekst.
Belangrijkste punten
- Kies typen op basis van betekenis, rekengebruik, nauwkeurigheid, volgorde en realistische grootte.
- Sla codes op als tekst om voorloopnullen en leestekens te behouden.
- Gebruik een exact decimaal type voor geld waar dat wordt ondersteund en gehele centen in SQLite.
- Een numeriek bedrag heeft een valuta nodig en een meting een eenheid.
- Opslag als tekst levert tekstvolgorde op, ook als alle tekens cijfers zijn.
3.3 NULL en onbekende resultaten
NULL markeert een ontbrekende waarde. Het verschilt van nul, lege tekst '' en de tekst 'NULL'. Een bekende korting van 0 betekent geen korting; een korting die NULL is, betekent dat het bedrag niet is vastgelegd. Een kolom die NULL toestaat, laat ontbrekende gegevens toe, terwijl NOT NULL een waarde vereist.
Ontbrekend heeft meer dan één betekenis
Van James Wilson is geen telefoonnummer vastgelegd. Bestelling 102 heeft geen verzenddatum omdat die nog niet is verzonden. Bij een bedrijf als klant is een achternaam mogelijk niet van toepassing. Alle gevallen kunnen met NULL worden weergegeven, maar NULL legt niet vast welke reden geldt. Een gegevenswoordenboek moet de betekenis per kolom vermelden.
Lege tekst is een aanwezige tekstwaarde in PostgreSQL en SQLite. Oracle behandelt lege tekst momenteel als NULL. Querytools kunnen beide weergeven als een cel die leeg lijkt, dus alleen aan het uiterlijk kun je ze niet onderscheiden.
Vergelijkingen kunnen onbekend zijn
SQL-vergelijkingen hebben drie mogelijke resultaten: TRUE, FALSE en UNKNOWN. Een vergelijking met NULL, waaronder NULL = NULL, is UNKNOWN. Van twee ontbrekende gegevens is niet bekend of ze dezelfde waarde hebben.
Een WHERE-clausule behoudt alleen resultaten die TRUE zijn. Lees deze voorwaarden:
phone IS NULLvindt ontbrekende telefoonnummers.phone IS NOT NULLvindt vastgelegde telefoonnummers.phone = NULLlevert UNKNOWN op en vindt geen rijen.
Het ontkennen van een vergelijking levert een ontbrekende waarde niet alsnog op. Voeg Daniel Brown, van wie de staat NULL is, toe aan de vier klanten van de winkel. De voorwaarde state <> 'TX' behoudt CO, MA en WA: drie rijen. Daniel valt af omdat de vergelijking van zijn staat UNKNOWN is. Om ook ontbrekende staten mee te nemen, is de voorwaarde state <> 'TX' OR state IS NULL.
Combineer voorwaarden zorgvuldig
Denk bij UNKNOWN aan “kan TRUE of FALSE zijn”. Een resultaat staat pas vast als beide mogelijkheden dezelfde uitkomst geven.
| Expressie | Resultaat | Reden |
|---|---|---|
| TRUE AND UNKNOWN | UNKNOWN | Het tweede deel bepaalt of beide waar zijn. |
| FALSE AND UNKNOWN | FALSE | Eén onwaar deel maakt AND al onwaar. |
| TRUE OR UNKNOWN | TRUE | Eén waar deel maakt OR al waar. |
| FALSE OR UNKNOWN | UNKNOWN | Het tweede deel bepaalt OR. |
| NOT UNKNOWN | UNKNOWN | Ontkenning kan het ontbrekende gegeven niet aanvullen. |
Berekeningen en samenvattingen
Gewone rekenkundige bewerkingen met NULL geven NULL: 5 + NULL is NULL. Een regelprijs vermenigvuldigd met een ontbrekende hoeveelheid ontbreekt ook, die is geen nul. Tekst samenvoegen met || en NULL geeft NULL in PostgreSQL en SQLite; bij concatenatie behandelt Oracle NULL als lege tekst.
Aggregatiefuncties slaan NULL-invoer meestal over. Bij vijf klanten, onder wie James en Daniel zonder telefoonnummer, telt COUNT(*) alle vijf rijen. COUNT(phone) telt de drie vastgelegde telefoonnummers. Het gemiddelde van 4, NULL en 2 is 3, omdat de twee bekende getallen door twee worden gedeeld; als je NULL als nul behandelt, krijg je ten onrechte 2.
Gebruik NOT NULL voor gegevens die aanwezig moeten zijn, zoals een besteldatum. Dit dwingt geen positief getal of niet-lege tekst af: dat zijn aparte regels. Primaire sleutels vereisen een identificatie die niet NULL is; gewone SQLite-tabellen hebben een historische uitzondering voor sommige declaraties van primaire sleutels, dus expliciet NOT NULL is daar van belang.
Belangrijkste punten
- NULL markeert ontbrekende informatie; 0 en lege tekst hebben een andere betekenis.
- Test ontbrekende waarden met
IS NULLofIS NOT NULL. - Vergelijkingen met NULL leveren UNKNOWN op;
WHEREbehoudt alleen TRUE. - Bij AND, OR en NOT moet je rekening houden met UNKNOWN.
- Gewone rekenkundige bewerkingen met NULL leveren NULL op.
COUNT(*)telt rijen;COUNT(column)telt vermeldingen die niet NULL zijn.- Documenteer waarom NULL in elke kolom is toegestaan.
4Identificeer en koppel records
Sleutels beantwoorden twee verschillende vragen: “Welke rij is dit?” en “Naar welke gerelateerde rij verwijst deze?” Een primaire sleutel geeft een tabel een belangrijkste identificatie, terwijl een refererende sleutel een verwijzing bevat. Toets mogelijke identificatiewaarden aan toekomstige gegevens, niet alleen aan een klein voorbeeld. Lees vervolgens koppelingen in beide richtingen, ook of een koppeling optioneel is. Samengestelde sleutels en koppeltabellen breiden dezelfde ideeën uit naar records die door combinaties worden geïdentificeerd en naar veel-op-veelrelaties.
4.1 Kandidaatsleutels en primaire sleutels
Een sleutel identificeert een rij via haar waarden. Namen kunnen vaker voorkomen; klantidentificatiewaarden onderscheiden records zodat je ze kunt lezen, wijzigen of koppelen.
Toets uniciteit en minimaliteit
Een supersleutel is een kolom of combinatie die een rij uniek identificeert. Een kandidaatsleutel is een minimale supersleutel: als je een kolom verwijdert, vervalt die garantie. Kies één kandidaat als primaire sleutel; de andere zijn alternatieve sleutels.
Stel dat employee_id, ssn en email elk verplicht en uniek zijn. Elk is een kandidaatsleutel. (employee_id, department) is een supersleutel maar geen kandidaatsleutel: employee_id alleen identificeert de medewerker al. Een achternaam die vaker voorkomt, doorstaat de uniciteitstest niet.
| Term | Test |
|---|---|
| Supersleutel | Identificeert de combinatie een rij? |
| Kandidaatsleutel | Is de sleutel uniek zonder overbodige kolom? |
| Primaire sleutel | Welke kandidaat is de belangrijkste identificatie? |
| Alternatieve sleutel | Welke andere kandidaat blijft beschikbaar? |
Vier klanten met verschillende achternamen bewijzen niet dat er een sleutel is: een vijfde kan dezelfde naam hebben. Uniciteit moet gelden voor alle toegestane toekomstige gegevens. Een herhaling weerlegt een voorgestelde sleutel; een voorbeeld zonder herhalingen heeft nog steeds een ondersteunende bedrijfsregel nodig.
Lees de declaratie
Een tabel heeft maximaal één primaire sleutel. De waarden zijn uniek en de kolommen mogen geen NULL zijn. Stabiele waarden voorkomen herhaalde wijzigingen van verwijzingen. Zoek naar PRIMARY KEY: noch de naam noch de positie van een kolom declareert die als sleutel.
Als klant 1 bestaat, wordt een andere klant met sleutel 1 geweigerd. Een weggelaten sleutel heeft een standaardwaarde of gegenereerde waarde nodig. INTEGER PRIMARY KEY van SQLite genereert een geheel getal als de waarde wordt weggelaten of als NULL wordt opgegeven. Sommige andere declaraties van primaire sleutels in gewone SQLite-tabellen staan om historische redenen NULL toe; expliciet NOT NULL, een STRICT-tabel of de vorm met een gehele primaire sleutel sluit die mogelijkheid uit.
Lees een samengestelde sleutel
In enrollments(student_id, course_id, term, grade) kan een student meerdere cursussen volgen en er één in een andere periode opnieuw volgen. (student_id, course_id, term) identificeert één inschrijving: één samengestelde primaire sleutel, geen drie afzonderlijke primaire sleutels.
Afzonderlijke onderdelen mogen worden herhaald; de volledige combinatie niet. De meeste DBMS'en maken een index op de primaire sleutel om gegevens op te zoeken, maar de sleutel garandeert geen volgorde in queryresultaten.
Belangrijkste punten
- Een kandidaatsleutel is een minimale supersleutel.
- Eén kandidaat is de primaire sleutel; de andere zijn alternatieve sleutels.
- De uniciteit van een sleutel moet gelden voor toegestane toekomstige gegevens.
- Een primaire sleutel is uniek, bevat geen NULL en kan meerdere kolommen omvatten.
- De declaratie bepaalt de sleutel, niet de naam of positie.
4.2 Natuurlijke en gegenereerde identificatiewaarden
Een natuurlijke sleutel komt uit gegevens uit de echte wereld, zoals het VIN van een voertuig, het ISBN van een boekuitgave of een staatcode. Een surrogaatsleutel bestaat alleen om een rij te identificeren, vaak als een gegenereerd geheel getal of een UUID.
Kies een identificatiewaarde die meegaat
Kies bij voorkeur waarden die uniek, aanwezig, stabiel, compact en veilig om te delen zijn. Namen komen vaker voor; telefoonnummers en e-mailadressen veranderen of worden gedeeld. Social Security-nummers zijn gevoelig en voor sommige klanten niet beschikbaar; als je ze in verwijzende tabellen gebruikt, verspreid je die informatie.
Met een gegenereerde customer_id behoudt Maria identificatiewaarde 1 wanneer haar contactgegevens veranderen. Een natuurlijke state_code, zoals TX, kan goed werken omdat die compact, gestandaardiseerd en nuttig in adresgegevens is.
Bescherm bedrijfsidentificaties afzonderlijk
Dezelfde persoon kan zich twee keer registreren en twee surrogaatsleutels krijgen. De identificatiewaarden onderscheiden rijen; ze sporen geen dubbele personen op.
Als een e-mailadres elk account moet identificeren, gebruik dan NOT NULL UNIQUE. Alleen UNIQUE staat meerdere NULL-waarden toe in PostgreSQL, SQLite en MySQL. SQL Server staat normaal gesproken één NULL toe bij een uniciteitsregel voor één kolom. Aanwezigheid en uniciteit zijn aparte regels.
Het verplichte, unieke e-mailadres is een alternatieve sleutel. Als het verandert, blijft het klantnummer als surrogaatsleutel in bestaande bestellingen ongewijzigd. Als een primaire sleutel waarnaar wordt verwezen verandert, moeten de verwijzingen vanuit de kindtabel ook consistent blijven.
Herken de syntaxis voor gegenereerde sleutels
| Systeem | Veelgebruikte vorm voor gegenereerde gehele getallen |
|---|---|
| Standaard-SQL, PostgreSQL, Oracle | GENERATED ALWAYS AS IDENTITY |
| MySQL | AUTO_INCREMENT |
| SQL Server | IDENTITY(1,1) |
| SQLite | INTEGER PRIMARY KEY |
PostgreSQL heeft ook de oudere vorm SERIAL. Verwijderingen, mislukte invoegingen en geannuleerd werk kunnen gaten achterlaten. Identificatiewaarden 1, 2 en 4 duiden drie rijen aan, geen vier. Hernummeren om gaten te sluiten kan verwijzingen verbreken.
Herken UUID's
Een UUID is een identificatiewaarde van 128 bits, meestal geschreven als 36 tekens met koppeltekens: 7c9e6679-7425-40de-944b-e07fc1f90ae7. Computers kunnen ze onafhankelijk genereren met een zeer klein risico op dubbele waarden, wat nuttig is wanneer records van verschillende plaatsen worden samengevoegd.
UUID's nemen meer ruimte in en zijn moeilijker te lezen dan kleine gehele getallen. Kies op basis van hoe records worden gemaakt en waarnaar wordt verwezen. Beide soorten sleutels zijn labels: hun maximale waarde is geen aantal rijen en hun volgorde hoeft niet het tijdstip van gebeurtenissen weer te geven.
Belangrijkste punten
- Natuurlijke sleutels komen van identificatiewaarden uit de echte wereld; surrogaatsleutels bestaan om rijen te identificeren.
- Kies bij voorkeur primaire sleutels die stabiel, compact, aanwezig en veilig om te delen zijn.
- Een surrogaatsleutel voorkomt geen dubbele records van zaken uit de echte wereld.
NOT NULL UNIQUEkan een verplichte alternatieve identificatiewaarde beschermen.- Gaten in gegenereerde identificatiewaarden zijn normaal; het zijn labels, geen aantallen.
- UUID's maken onafhankelijke generatie van identificatiewaarden mogelijk met een zeer klein risico op dubbele waarden.
4.3 Refererende sleutels en geldige verwijzingen
Een refererende sleutel is een kolom of groep kolommen die verwijst naar een primaire sleutel of een andere geschikte unieke sleutel. De tabel met de verwijzing is de kindtabel; de tabel waarnaar wordt verwezen is de oudertabel. Een refererende sleutel die niet NULL is, moet overeenkomen met een bestaande sleutel in de oudertabel wanneer de integriteitsregel wordt gehandhaafd.
Volg een waarde tussen tabellen
order_id | customer_id | order_date | shipped_date |
|---|---|---|---|
| 101 | 1 | 2026-03-02 | 2026-03-04 |
| 102 | 2 | 2026-03-05 | NULL |
| 103 | 1 | 2026-03-09 | 2026-03-10 |
orders.customer_id verwijst naar customers.customer_id. Bestelling 102 wijst naar klant 2, James Wilson. Bestellingen 101 en 103 wijzen allebei naar klant 1, Maria Garcia. Herhaling is toegestaan in de refererende sleutel; de sleutel waarnaar in de oudertabel wordt verwezen, is uniek.
Deze regel is referentiële integriteit. Een bestelling voor klant 99 wordt geweigerd als klant 99 niet bestaat. Anders zou het een verweesde rij zijn: een rij in de kindtabel zonder overeenkomende rij in de oudertabel. Een naam alleen maakt geen integriteitsregel. Een refererende sleutel met de naam placed_by kan nog steeds naar customer_id verwijzen; de gedeclareerde verwijzing maakt de koppeling, met overeenkomende typen voor de sleutelkolommen.
Optioneel of verplicht
Een coupon_id die NULL toestaat, kan NULL zijn wanneer een bestelling geen kortingsbon heeft. Een customer_id die als NOT NULL is gedeclareerd, vereist dat elke bestelling een klantverwijzing heeft, en de refererende sleutel vereist dat die klant bestaat. Deze twee integriteitsregels werken samen: de ene vereist een waarde en de andere controleert de verwijzing.
Refererende sleutels hoeven niet naar een andere tabel te verwijzen. In employees(employee_id, name, manager_id) kan manager_id verwijzen naar employee_id in dezelfde tabel. De verwijzing naar een leidinggevende kan voor de algemeen directeur NULL zijn.
Een wijziging in de oudertabel vereist een regel
| Actie | Effect wanneer een rij in de oudertabel waarnaar wordt verwezen, wordt verwijderd |
|---|---|
NO ACTION of RESTRICT | Weigert de verwijdering zolang verwijzingen bestaan, afhankelijk van het controlemoment van de integriteitsregel |
CASCADE | Verwijdert ook de verwijzende rijen in de kindtabel |
SET NULL | Behoudt de rijen in de kindtabel en wist hun verwijzing; de kolom moet NULL toestaan |
Bij de standaardactie kan klant 1 niet worden verwijderd zolang bestellingen 101 en 103 nog naar haar verwijzen. Cascadering van een bestelling naar haar regels kan zinvol zijn omdat die regels bij die bestelling horen. ON UPDATE geeft het overeenkomstige gedrag aan wanneer een sleutel in de oudertabel verandert. Cascadering betekent niet dat het verwijderen van een rij in de kindtabel de bijbehorende rij in de oudertabel verwijdert.
Samengestelde verwijzingen en handhaving
Als een orderregel wordt geïdentificeerd door (order_id, product_id), heeft een verzending die naar die regel verwijst beide kolommen nodig. De combinatie moet overeenkomen met een bestaande regel. Afzonderlijk een overeenkomst voor een bestelling en een product vinden is onvoldoende: dat product kan nooit in die bestelling zijn voorgekomen. Een verplichte samengestelde verwijzing declareert al haar kolommen als NOT NULL.
PostgreSQL, SQL Server, Oracle en de gebruikelijke InnoDB-engine van MySQL handhaven gedeclareerde refererende sleutels. Schakel in SQLite voor elke verbinding de handhaving van refererende sleutels in met PRAGMA foreign_keys = ON; en controleer of die is ingeschakeld voordat je erop vertrouwt. Een gedeclareerde maar uitgeschakelde integriteitsregel kan de rijen niet beschermen. Refererende sleutels combineren ook niet zelf queryresultaten; een query moet de koppeling expliciet volgen, meestal via een join.
Belangrijkste punten
- Een refererende sleutelwaarde die niet NULL is, moet overeenkomen met een bestaande sleutel waarnaar wordt verwezen.
- Refererende sleutelwaarden kunnen worden herhaald; sleutelwaarden in de oudertabel zijn uniek.
NOT NULLmaakt de koppeling verplicht.- Referentiële acties bepalen wat er met rijen in de kindtabel gebeurt wanneer een rij in de oudertabel verandert.
- Een samengestelde verwijzing moet overeenkomen met de volledige sleutelcombinatie in de oudertabel.
- In SQLite moet de handhaving van refererende sleutels voor elke verbinding worden ingeschakeld.
4.4 Lees de omvang van relaties in beide richtingen
Om een relatie te bepalen, stel je twee vragen: “Hoeveel rijen daar kunnen aan één rij hier worden gekoppeld?” en vervolgens de omgekeerde vraag. Neem zowel het minimum als het maximum mee. De huidige voorbeeldgegevens laten zien wat er is gebeurd; de integriteitsregels beschrijven wat is toegestaan.
Eén klant, veel bestellingen
Een klant kan nul of meer bestellingen plaatsen. Elke bestelling in de winkel hoort bij precies één klant omdat orders.customer_id een refererende sleutel is die niet NULL is. Dit is een-op-veel. De refererende sleutel hoort in orders, de veel-kant: elke bestelling slaat één klantverwijzing op.
Maria heeft bestellingen 101 en 103; James heeft bestelling 102. Aisha en Wei hebben er geen. Dat zij niet in orders voorkomen, is geldig. Een refererende sleutel vereist voor elke rij in de kindtabel een rij in de oudertabel, maar vereist niet dat elke rij in de oudertabel een rij in de kindtabel heeft.
Een-op-een vereist ook uniciteit
Laat in user_profiles(user_id, bio, photo_url) de user_id zowel de primaire sleutel als een refererende sleutel naar users zijn. Elk profiel verwijst naar één gebruiker en een gebruiker kan maximaal één profiel hebben omdat de profielsleutel niet herhaald kan worden. Het is mogelijk dat een gebruiker nog geen profiel heeft.
Een refererende sleutel zonder uniciteit zou meerdere profielen voor dezelfde gebruiker toestaan en zo een-op-veel opleveren. De uniciteitsregel verandert het maximum. Zulke aparte profieltabellen kunnen optionele of gevoelige gegevens apart van het hoofdrecord van de gebruiker bewaren.
Veel-op-veel gebruikt een tabel met paren
Een bestelling kan meerdere producten bevatten en een product kan in meerdere bestellingen voorkomen. Een koppeltabel, ook wel verbindingstabel of associatieve tabel genoemd, legt elk paar vast:
order_id | product_id | quantity | unit_price |
|---|---|---|---|
| 101 | 11 | 2 | 12,50 |
| 101 | 12 | 1 | 8,99 |
| 102 | 13 | 1 | 34,00 |
| 103 | 11 | 4 | 12,50 |
order_id verwijst naar orders; product_id verwijst naar products. De samengestelde primaire sleutel (order_id, product_id) staat hetzelfde product in verschillende bestellingen toe, maar voorkomt dat hetzelfde paar twee keer voorkomt. Twee een-op-veelkoppelingen vormen samen de veel-op-veelrelatie.
quantity en unit_price horen bij het paar. Ze beschrijven hoeveel van dat product in die bestelling is verkocht en welke prijs toen in rekening is gebracht. Een actuele productprijs kan later veranderen; die mag het historische bedrag niet overschrijven.
Voor bestelling 101 zijn de twee regelbedragen twee mokken van € 12,50, samen € 25,00, en één oplader van € 8,99. Samen kosten ze € 33,99. De hoeveelheid geeft aan hoeveel mokken zijn gekocht; twee dubbele mokregels opslaan zou in strijd zijn met de gekozen sleutel van deze tabel.
Vermijd lijsten en vaste plaatsen
Een cel product_ids met “11,12” verbergt meerdere verwijzingen binnen één tekstwaarde. Kolommen zoals product1, product2 en product3 leggen een vaste grens op en laten ongebruikte plaatsen over. Een koppeltabel voegt een rij toe voor elk extra paar en laat het DBMS elke verwijzing afzonderlijk controleren.
Een zelfverwijzende relatie gebruikt hetzelfde patroon binnen één tabel: veel medewerkers kunnen via manager_id naar dezelfde leidinggevende verwijzen. De leidinggevende is ook een medewerkersrij. Lees elke koppeling als een rol, zodat de identiteit van de medewerker en de verwijzing naar de leidinggevende gescheiden blijven.
Belangrijkste punten
- Lees het toegestane minimum en maximum in elke richting.
- Bij een-op-veel staat de refererende sleutel aan de veel-kant.
- Een unieke refererende sleutel beperkt een relatie tot maximaal één rij in de kindtabel per rij in de oudertabel.
- Een koppeltabel geeft veel-op-veelkoppelingen weer met rijen van paren.
- Gegevens zoals hoeveelheid en verkoopprijs kunnen bij een paar horen.
- Een zelfverwijzing koppelt rollen binnen één tabel.
5Lees een schema en volg de koppelingen
Een schema legt de structuur vast die tabellen hun betekenis geeft: kolomtypen, identificatiewaarden, verwijzingen en integriteitsregels. Een diagram maakt die koppelingen zichtbaar, terwijl een tabeldefinitie de regels precies vastlegt. Gebruik beide vormen om het pad van een vraag naar het antwoord te vinden en gebruik vervolgens de werkelijke rijen voor de waarden. Houd structuur en huidige gegevens gescheiden: als je weet dat bestellingen naar klanten verwijzen, weet je nog niet welke klanten vandaag bestellingen hebben geplaatst.
5.1 Structuur, huidige gegevens en integriteitsregels
Een schema beschrijft tabellen, kolommen, gegevenstypen en integriteitsregels. Een databasetoestand bestaat uit de gegevens die op een bepaald moment zijn opgeslagen. Een bestelling toevoegen verandert de databasetoestand; een nieuwe kolom toevoegen verandert het schema. Het schema vertelt wat kan worden opgeslagen, terwijl de rijen vertellen wat nu is opgeslagen.
Lees een korte beschrijving
customers(customer_id, first_name, last_name, email, phone, city, state, zip_code) geeft een tabel en haar kolommen weer. In notities worden primaire sleutels soms onderstreept of met PK aangeduid en verwijzingen met FK. Zo geeft orders(order_id PK, customer_id FK → customers, order_date, shipped_date) de belangrijkste sleutel en de klantkoppeling aan.
Lees een volledige tabeldefinitie
CREATE TABLE orders (
order_id INTEGER PRIMARY KEY,
customer_id INTEGER NOT NULL REFERENCES customers (customer_id),
order_date DATE NOT NULL,
shipped_date DATE
);
Lees één kolom tegelijk. order_id is de primaire sleutel als geheel getal. customer_id is verplicht en moet naar een klant verwijzen. order_date is verplicht. shipped_date mag NULL zijn. Deze definitie geeft de toegestane structuur, geen lijst van bestaande bestellingen.
Integriteitsregels beantwoorden verschillende vragen:
| Integriteitsregel | Wat de regel controleert |
|---|---|
PRIMARY KEY | Een unieke identificatie van een rij, eventueel samengesteld |
NOT NULL | Een waarde is aanwezig |
UNIQUE | Herhaalde waarden die niet NULL zijn, zijn verboden; de behandeling van NULL verschilt |
REFERENCES | Een verwijzing komt overeen met een sleutel in de oudertabel |
CHECK | Een voorwaarde mag niet FALSE zijn |
DEFAULT | Levert een waarde als er geen wordt opgegeven |
Een standaardwaarde vervangt geen opgegeven ongeldige waarde. Als status de regel DEFAULT 'pending' heeft, levert het weglaten van de status 'pending' op; een opgegeven waarde moet nog steeds aan de andere regels van de kolom voldoen.
Combineer regels voor een orderregel
CREATE TABLE order_items (
order_id INTEGER NOT NULL REFERENCES orders (order_id),
product_id INTEGER NOT NULL REFERENCES products (product_id),
quantity INTEGER NOT NULL CHECK (quantity > 0),
unit_price DECIMAL(8, 2) NOT NULL,
PRIMARY KEY (order_id, product_id)
);
De primaire sleutel onderaan gebruikt twee kolommen. Een tweede regel voor dezelfde bestelling en hetzelfde product wordt geweigerd. Hoeveelheid 0 wordt door de controle geweigerd. Een ontbrekende hoeveelheid voldoet niet aan NOT NULL: de controle alleen zou NULL toestaan omdat NULL > 0 UNKNOWN is, niet FALSE. Expliciet NOT NULL op beide sleuteldelen voorkomt ook de historische uitzondering van SQLite voor samengestelde sleutels die NULL toestaan. Gebruik in SQLite gehele centen voor een exacte unit_price; de decimale declaratie alleen biedt geen exacte opslag.
Zoek het schema en de betekenissen
In de SQLite-opdrachtregel toont .schema orders de definitie; in psql van PostgreSQL beschrijft \d orders die. INFORMATION_SCHEMA-views tonen structurele metadata in PostgreSQL, MySQL en SQL Server. SQLite vermeldt objecten in sqlite_schema en grafische tools tonen tabellen en kolommen in een boomstructuur.
“Schema” is ook de naam voor een naamruimte binnen systemen zoals PostgreSQL en SQL Server. sales.orders betekent de tabel orders in het schema sales. Een gegevenswoordenboek geeft betekenissen die de structuur niet kan uitdrukken, zoals de valuta van een prijs of de vraag of een ontbrekende verzenddatum “niet verzonden” betekent. Om rijen te zien, leest een query zoals SELECT * FROM orders; de huidige databasetoestand.
Belangrijkste punten
- Een schema is de structuur; een databasetoestand bestaat uit de gegevens op één moment.
- Lees het type van een kolom samen met al haar integriteitsregels.
- Een verplicht positief getal heeft zowel
NOT NULLals een controle op een positieve waarde nodig. - Een samengestelde primaire sleutel wordt over de volledige combinatie gedeclareerd.
- Een gegevenswoordenboek legt betekenissen en eenheden vast die niet in het schema staan.
5.2 Lees de uiteinden van een schemalijn
Een schemadiagram tekent elke tabel als een vak. De titel noemt de tabel; de inhoud vermeldt kolommen en vaak typen. PK markeert primaire sleutels en FK markeert refererende sleutels. Relatielijnen tonen welke refererende sleutel naar welke sleutel in de oudertabel verwijst.
Bepaal eerst het soort lijn
Sommige diagrammen gebruiken een pijl van een refererende sleutel naar de sleutel waarnaar die verwijst. Een pijl van orders.customer_id naar customers.customer_id beschrijft de richting van de verwijzing. Andere tools gebruiken symbolen aan de uiteinden om te beschrijven hoeveel rijen kunnen worden gekoppeld. Controleer de legenda van het diagram: een pijlrichting en de omvang van een relatie geven verschillende informatie.
Lees kraaienpootsymbolen
In kraaienpootnotatie betekent een streepje één, een cirkel nul en een poot met drie vertakkingen veel. Elk lijnuiteinde geeft een minimum en maximum aan. Het symbool dat het dichtst bij de tabel staat, geeft het maximum; het andere geeft het minimum.
| Symbolen aan het uiteinde | Toegestaan aantal rijen aan dat uiteinde |
|---|---|
| Streepje en streepje | Precies één |
| Cirkel en streepje | Nul of één |
| Streepje en kraaienpoot | Eén of meer |
| Cirkel en kraaienpoot | Nul of meer |
Als je vanuit één tabel leest, kijk je naar de symbolen naast de andere tabel. Die symbolen beschrijven hoeveel rijen daar bij je ene startrij kunnen passen.
Doorloop klanten en bestellingen
De lijn van de winkel heeft symbolen voor precies één naast customers en symbolen voor nul of meer naast orders.
- Begin met één klant. Kijk naar het uiteinde bij bestellingen: de klant kan nul of meer bestellingen hebben.
- Begin met één bestelling. Kijk naar het uiteinde bij klanten: de bestelling hoort bij precies één klant.
- Controleer de definitie: de refererende sleutel die niet NULL is, staat in
orders, dus dat is de veel-kant en elke bestelling heeft een geldige klant nodig.
De kraaienpoot staat naast de tabel met de herhaalde refererende sleutel. Als je vanuit diezelfde tabel naar het nabije uiteinde kijkt, draai je de betekenis om. Een klantverwijzing die NULL toestaat, zou het uiteinde bij klanten veranderen naar nul of één; dat zou niet elke klant tot één bestelling beperken.
Herken een koppeltabel
De winkel heeft een-op-veelkoppelingen van orders naar order_items en van products naar order_items. Beide veel-uiteinden komen samen bij order_items. De twee refererende sleutels vormen de primaire sleutel. Door deze structuur kan een bestelling meerdere producten bevatten en kan een product in meerdere bestellingen voorkomen.
Het diagram beschrijft toegestane koppelingen, niet de huidige aantallen. Het staat toe dat Maria meerdere bestellingen heeft en Aisha geen. Om te weten hoeveel ieder er werkelijk heeft, lees je de rijen. Een minimum van één van ouder naar kind kan een aanvullende bedrijfsregel uitdrukken; een refererende sleutel op zichzelf vereist niet dat een rij in de oudertabel rijen in de kindtabel heeft.
Herken verwante diagramstijlen
Een entiteit-relatiediagram dat tijdens het ontwerp wordt gemaakt, kan bedrijfsentiteiten tonen voordat tabellen bestaan. Diagrammen in Chen-notatie gebruiken ovalen voor attributen en ruiten voor relaties. Een schemadiagram toont de werkelijke tabellen en hun gedeclareerde sleutels. Beide helpen om structuur over te brengen, maar hun symbolen moet je volgens hun eigen legenda lezen.
Belangrijkste punten
- Een schemadiagram toont tabellen en gedeclareerde koppelingen met sleutels.
- Lees aan elk lijnuiteinde het minimum en maximum met behulp van de legenda.
- Het andere uiteinde beschrijft de rijen die aan één startrij zijn gekoppeld.
- Het veel-uiteinde van een een-op-veelkoppeling bevat de herhaalde refererende sleutel.
- Twee veel-uiteinden die bij een tabel samenkomen, kunnen een koppeltabel aanduiden.
- Een diagram geeft toegestane koppelingen; rijen geven werkelijke aantallen.
5.3 Vind gegevens door sleutels te volgen
Zoek elk gevraagd gegeven en volg de sleutels die het met het startrecord verbinden. Namen kunnen vaker voorkomen of veranderen; zoek in plaats daarvan overeenkomende sleutelwaarden.
Vind de klant van een bestelling
“Waar woont de klant die bestelling 102 heeft geplaatst?” volgt dit pad:
- Zoek bestelling 102 op via
orders.order_id. - Lees de bijbehorende
customer_id: 2. - Zoek klant 2 op via
customers.customer_id. - Lees
customers.city: Denver.
Bestelnummer 102 is niet de klantidentificatie. SQL-joins maken deze koppelingen op basis van sleutels automatisch; weergaveposities verbinden de records niet.
Vind producten en een historisch totaal
Bestelling 101 heeft deze rijen in order_items. Volg elke product_id naar products voor de naam:
product_id | quantity | unit_price | Productnaam |
|---|---|---|---|
| 11 | 2 | 12,50 | Koffiemok |
| 12 | 1 | 8,99 | Telefoonoplader |
Gebruik de vastgelegde regelprijs voor het in rekening gebrachte bedrag:
- Twee mokken van € 12,50 kosten € 25,00.
- Eén oplader van € 8,99 kost € 8,99.
- Totaal: € 33,99.
De huidige productprijs kan de kosten van een oude bestelling onjuist weergeven. Bestelling 102 bevat één lamp van € 34,00; bestelling 103 bevat vier mokken van € 12,50, samen € 50,00.
Interpreteer ontbrekende waarden en regels
De verzenddatum van bestelling 102 is NULL, hier gedocumenteerd als “niet verzonden”. Test die met IS NULL, niet met een vergelijking op gelijkheid aan NULL.
Lees elke relevante integriteitsregel wanneer je een wijziging beoordeelt:
- Een regel voor bestelling 104 wordt geweigerd als die bestelling niet bestaat.
- Een andere regel met sleutel (
101,11) wordt geweigerd omdat het paar bestaat. - Hoeveelheid 0 wordt geweigerd door de controle op een positieve hoeveelheid.
- Het standaardgedrag van de refererende sleutel blokkeert het verwijderen van product 11 zolang regels ernaar verwijzen.
Een ongebruikte sleutel maakt een rij niet geldig als de bijbehorende verwijzing ontbreekt.
Bepaal de nieuwe rijen
Als een terugkerende klant twee verschillende bestaande producten koopt, voegt dat één rij toe aan orders en twee rijen aan order_items. De klant en producten bestaan al. Een nieuw product aanbieden voegt één rij toe aan products, zonder dat daarvoor een bestelling nodig is.
Belangrijkste punten
- Zoek elk gevraagd gegeven voordat je het sleutelpad volgt.
- Koppel refererende sleutelwaarden aan de sleutels waarnaar ze verwijzen, niet aan namen of rijposities.
- Gebruik de prijs van de verkoopregel voor historische bestellingstotalen.
- Controleer elke toepasselijke integriteitsregel wanneer je een voorgestelde wijziging beoordeelt.
- Een nieuwe gebeurtenis voegt rijen toe aan de tabellen waarvoor ze gegevens oplevert.
Relationele databases: voorbeelden
1Van gedeelde records naar databaseverzoeken
12 stappen
- 1IntroductieWie beheert gedeelde gegevens?
De verkoop-, klantenservice- en managementteams van een winkel gebruiken dezelfde klantrecords. Een database bevat zulke gedeelde gegevens, en software die een DBMS heet beheert ze.
Volg hoe een databasesysteem deze gegevens deelt, wijzigingen consistent houdt (de taak van een transactie) en verzoeken van toepassingen beantwoordt.
- 2UitlegMaak onderscheid tussen verzameling en software
Gegevens zijn vastgelegde feiten. Een database is een geordende verzameling samenhangende gegevens; een DBMS is de software die deze beheert.
De klanten en bestellingen van de winkel zijn gegevens. PostgreSQL slaat ze op, controleert regels en beantwoordt verzoeken.
- 3VoorbeeldWerk één telefoonnummer bij
Maria's telefoonnummer staat bij 14 verkopen in een spreadsheet. Een vergeten aanpassing leidt tot tegenstrijdige kopieën.
Sla haar telefoonnummer één keer op onder
customer_id1 en laat verkopen naar haar verwijzen. Een telefoonwijziging vereist dan één aanpassing; elke verkoop behoudt zijn eigen gegevens. - 4AnalogieHoud twee wijzigingen bij elkaar
Een overboeking trekt geld van de betaalrekening af en telt het bij de spaarrekening op. Als alleen de afschrijving wordt opgeslagen, blijven onjuiste saldi over.
Een transactie slaat beide wijzigingen samen op of draait ze beide terug, ook als ze verschillende rijen of tabellen betreffen.
- 5UitdagingKies de bescherming
Een reservering verlaagt het aantal beschikbare plaatsen, maar het opslaan van de betalingsregistratie mislukt. De twee wijzigingen horen bij één transactie. Wat moet overblijven nadat die transactie is teruggedraaid?
---reveal---
Geen van beide wijzigingen mag overblijven. Door de verlaging van het aantal plaatsen terug te draaien, wordt de eerdere beschikbaarheid hersteld en wordt geen betalingsregistratie van die mislukte transactie opgeslagen. Als alleen de wijziging van het aantal plaatsen behouden blijft, is de reservering onvolledig.
- 6VerbandHerken de werklast
Een bestelling plaatsen is transactioneel werk: enkele snelle lees- en schrijfbewerkingen. De maandelijkse verkoop per regio vergelijken is analytisch werk: veel historische records samenvatten.
Een verkoopdatabase kan beide activiteiten ondersteunen.
- 7UitlegVolg het verzoek van de toepassing
Clients sturen verzoeken naar een databaseserver, zoals bij PostgreSQL of SQL Server. SQLite draait als bibliotheek binnen de toepassing, zonder aparte server.
Een aanbieder van een beheerde clouddienst beheert servers voor zijn gebruikers; tabellen en verzoeken blijven van toepassing.
- 8VoorbeeldLees een declaratief verzoek
SELECT first_name, city FROM customers WHERE state = 'TX';vraagt twee kolommen op van klanten in TX.SQL is declaratief: het beschrijft het resultaat en laat de stappen om het op te halen over aan het DBMS. SQL is de taal; PostgreSQL is één product dat deze interpreteert.
- 9TipLees wat de instructie doet
ALTER TABLEwijzigt de structuur;INSERTvoegt een rij toe;GRANTbeheert rechten;COMMITlegt een transactie vast.Tekst gebruikt enkele aanhalingstekens:
'TX'. Verdubbel een apostrof binnen de tekst:'O''Brien'. Een puntkomma beëindigt normaal gesproken een instructie. - 10UitdagingKies structuur of gegevens
Een winkel voegt een kolom
delivery_notetoe en vult die vervolgens voor één bestelling in. Zijn beide wijzigingen aan rijen?---reveal---
Het toevoegen van de kolom verandert de structuur: gegevensdefinitie. Het invullen ervan verandert opgeslagen gegevens: gegevensmanipulatie.
- 11UitdagingBreng de onderdelen samen
Een website stuurt SQL naar een PostgreSQL-server om een aankoop vast te leggen. Een manager leest later een gewone verkoopview. Bevat de view nog een opgeslagen kopie van al die aankooprijen?
---reveal---
Nee. Een gewone view slaat een query op die de onderliggende gegevens leest; de view slaat zelf geen afzonderlijke resultaatrijen op. PostgreSQL blijft het DBMS dat de aankooprecords beheert, terwijl de website en rapportagetool clients zijn.
- 12SamenvattingEen gedeelde verzameling met duidelijke verantwoordelijkheden
Een database bevat gegevens; een DBMS beheert opslag, regels, toegang en herstel. Transacties houden wijzigingen bij elkaar.
SQL-verzoeken gaan over structuur, rijen, rechten of transactiebeheer. Bepaal de taak voordat je de details leest.
2Lees de betekenis achter een tabel
10 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieBegin met wat een rij voorstelt
- 2VoorbeeldZoek de woonplaats van een klant
- 3UitlegGebruik de formele namen
- 4UitdagingVoorspel twee soorten toevoegingen
- 5KernpuntIdentificeer records zonder posities
- 6AnalogieBewaar één waarde voor elke eigenschap
- 7UitlegKoppel een type aan zijn domein
- 8UitdagingInterpreteer een export uit een spreadsheet
- 9UitdagingControleer een nieuw record en de waarden
- 10SamenvattingLees de structuur vóór de waarden
3Kies opslag en redeneer met NULL
15 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieTwee keuzes voor elke kolom
- 2UitlegMaak onderscheid tussen numerieke typen
- 3TipLet op productverschillen
- 4UitdagingControleer een decimaal bereik
- 5VerbandHerken datums en indicatoren
- 6UitlegKies op basis van het doel van de waarde
- 7VoorbeeldSla geld exact op
- 8UitdagingCorrigeer een code en een hoeveelheid
- 9UitlegLees wat ontbreekt
- 10VoorbeeldVolg een onbekende vergelijking
- 11KernpuntGebruik de test op ontbrekende waarden
- 12UitdagingCombineer bekend en onbekend
- 13VoorbeeldTel wat aanwezig is
- 14UitdagingControleer de interpretatie van een rapport
- 15SamenvattingLaat de betekenis de opslag bepalen
4Maak betrouwbare koppelingen met sleutels
18 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieIdentificatie komt vóór een koppeling
- 2UitlegToets uniciteit en minimaliteit
- 3UitdagingToets een toekomstige inschrijving
- 4TipDeclareer één primaire sleutel
- 5UitlegKies een stabiel label
- 6KernpuntBehoud een aparte bedrijfsregel
- 7UitdagingLees een gat zonder te hernummeren
- 8VoorbeeldVolg de verwijzing van een bestelling
- 9UitlegVerplichte en optionele verwijzingen
- 10UitdagingLees een verwijderregel
- 11VerbandControleer de volledige verwijzing
- 12UitlegLees een-op-veel in beide richtingen
- 13VoorbeeldBeperk een koppeling tot één
- 14VoorbeeldGeef elk productpaar weer
- 15KernpuntSla een gegeven over het paar op
- 16UitdagingKies een koppeling voor een nieuwe situatie
- 17UitdagingCombineer identificatie en verwijzingen
- 18SamenvattingSleutels vervullen samen verschillende taken
5Lees een schema om een vraag te beantwoorden
14 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieScheid de kaart van de records
- 2VoorbeeldLees een definitie van bestellingen
- 3KernpuntCombineer een controle met een verplichte waarde
- 4UitdagingDeel twee wijzigingen in
- 5TipZoek de volledige regels
- 6UitlegLees de legenda van een diagram
- 7VoorbeeldBegin met één rij en kijk naar de overkant
- 8UitdagingVoorspel een optionele koppeling
- 9VerbandHerken een tabel met paren
- 10VoorbeeldVolg bestelling 102 naar de woonplaats
- 11VoorbeeldBereken op basis van de verkoopregels
- 12UitdagingBeoordeel een voorgestelde regel
- 13UitdagingVerbind gegevens, regels en betekenis
- 14SamenvattingGebruik elke bron voor haar eigen informatie
Relationele databases: oefenvragen
Set 1: Lees records, typen en eenvoudige koppelingen10 Oefenvragen
Vraag 1 van 10
Toon antwoordVerberg antwoord
Vraag 2 van 10
DECIMAL(7, 2)?Toon antwoordVerberg antwoord
Vraag 3 van 10
Toon antwoordVerberg antwoord
Vraag 4 van 10
Toon antwoordVerberg antwoord
Vraag 5 van 10
badge_number aanwezig en uniek is. Afdelingen komen vaker voor. Waarom is (badge_number, afdeling) een supersleutel maar geen kandidaatsleutel?Toon antwoordVerberg antwoord
badge_number over, dus het paar is niet minimaal. Herhaalde afdelingen doen geen afbreuk aan de uniciteit van het paar; de overbodige kolom maakt het geen kandidaatsleutel.Vraag 6 van 10
Toon antwoordVerberg antwoord
0047 als 47-A als labels. Een geheel getal verliest de voorloopnullen en kan de letter en het koppelteken niet weergeven. Kies een type op basis van het doel van de waarde.Vraag 7 van 10
WHERE region <> 'NE'?Toon antwoordVerberg antwoord
Vraag 8 van 10
event_id naar Events die niet NULL is. Evenementen 12 en 19 bestaan. Twee tickets verwijzen al naar evenement 12. Wat gebeurt er met een derde ticket dat naar evenement 12 verwijst?Toon antwoordVerberg antwoord
Vraag 9 van 10
Toon antwoordVerberg antwoord
Vraag 10 van 10
quantity INTEGER CHECK (quantity > 0) en status TEXT DEFAULT 'new'. Geen van beide kolommen heeft NOT NULL. Een nieuwe rij geeft hoeveelheid NULL op en laat status weg. Wat wordt opgeslagen?Toon antwoordVerberg antwoord
Set 2: Pas regels toe in een kleine database10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
open_jobs en een index op jobs.job_id. Wat is de rol van elk?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
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
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
VARCHAR(4). Een rij geeft de tekst “Winter” op. Wat doet SQLite?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
account_id 14. Accounts heeft account 14 in Phoenix en account 620 in Tulsa. De account_id van de bestelling verwijst naar Accounts.account_id. Waar bevindt het account van bestelling 620 zich?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: Kies typen en volg gekoppelde records10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
delay_days en status 'urgent'. Wat is het resultaat van (delay_days > 2) OR (status = 'urgent') en behoudt WHERE de rij?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
tracking_note als nieuwe kolom voor elke levering. Welke eigenschap verandert direct?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
member_id als primaire sleutel. Een e-mailadres moet aanwezig zijn en maximaal één account identificeren. Welke aanvullende declaratie dwingt beide e-mailregels af in PostgreSQL?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
Profiles.user_id is zowel de primaire sleutel als een refererende sleutel naar Users.user_id. Geen enkele regel vereist dat een gebruiker een profiel heeft. Wat staat dit toe?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
warehouse_id, item_id) met de rijen (4, 7) en (5, 9). Reservations heeft een verplichte, gehandhaafde samengestelde refererende sleutel naar StockRows. Is een reservering voor (4, 9) toegestaan?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Set 4: Lees integriteitsregels en leg gevolgen uit10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
order_id, product_id) en beide delen zijn refererende sleutels. Wat laat dit zien tussen bestellingen en producten?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
person_id als locker_id is verplicht en afzonderlijk uniek. De primaire sleutel is person_id. Hoe moet locker_id worden ingedeeld?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
DECIMAL(8, 2). Welke aanvullende informatie is nodig om een opgeslagen prijs van 45,00 als een bedrag uit de praktijk te interpreteren?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
DECIMAL(6, 2) en label VARCHAR(3). Rijen geven bedrag 1234567,89 en label “Zomers” op. Wat dwingen alleen die declaraties af?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 5: Los vraagstukken over ontbrekende gegevens en samenhangende integriteitsregels op10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
batch_id, page_no). Het paar (18, 4) bestaat. Batch- en paginanummers mogen afzonderlijk worden herhaald. Welke voorgestelde rij wordt specifiek geweigerd omdat die deze sleutel dupliceert?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
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
Orders.customer_id een refererende sleutel naar Customers die niet NULL is en geen uniciteitsregel heeft. Het is toegestaan dat klanten geen bestellingen hebben. Als je UNIQUE toevoegt aan Orders.customer_id, blijven de andere regels ongewijzigd. Hoe verandert de relatie?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
WHERE NOT (city = 'Miami') OR city IS NULL?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
a INTEGER NOT NULL, b INTEGER NOT NULL, PRIMARY KEY (a, b) en q INTEGER NOT NULL CHECK (q > 0). Er bestaan geen rijen. Welke voorgestelde rij voldoet aan al deze integriteitsregels?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
project_id die NULL toestaat en ON DELETE SET NULL gebruikt. Notitie 4 verwijst naar taak 7 via een gehandhaafde refererende sleutel met ON DELETE CASCADE. Na het verwijderen van project 31 wordt taak 7 verwijderd. Wat blijft er over van taak 9 en notitie 4?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Kom je niet uit je eigen opgave? Huiswerkhulp
Kernbegrippen
A
Alternatieve sleutel
account_id een alternatieve sleutel blijven.Analytische werklast (OLAP)
Atomaire waarde
B
Bedrag in gehele centen
Booleaans gegevenstype
in_stock legt vast of een artikel beschikbaar is; de exacte opslagvorm verschilt per DBMS.C
Cascadering
CHECK-integriteitsregel
NOT NULL samen met CHECK (quantity > 0) om beide regels af te dekken.Client-serversysteem
D
Database
Databasemanagementsysteem (DBMS)
Databaseschema
Databasetoestand
Domein
Driewaardige logica
Drijvendekommatype
E
Een-op-eenrelatie
user_id gebruiken als zowel primaire sleutel als refererende sleutel, zodat een tweede profiel voor één gebruiker wordt voorkomen.Een-op-veelrelatie
Entiteit-relatiediagram
Exact decimaal gegevenstype
DECIMAL(8, 2) is gedeclareerd, slaat exacte bedragen in euro's en centen binnen het bereik op.G
Gegenereerde identificatiewaarde
INTEGER PRIMARY KEY van SQLite levert een geheel getal wanneer een nieuwe rij de identificatiewaarde weglaat.Gegevens
Gegevensdefinitietaal (DDL)
Gegevensmanipulatietaal (DML)
Gegevensonafhankelijkheid
Gegevenstype voor gehele getallen
Gegevenswoordenboek
shipped_date die NULL is betekent dat er niet is verzonden of dat een datum verloren is gegaan.Gestructureerde gegevens
Graad
I
Index
Ingebedde database-engine
Integriteitsregel (constraint)
IS NULL
IS NULL is de SQL-test die waar teruggeeft wanneer een vermelding ontbreekt, zodat zulke rijen zonder een gelijkheidsvergelijking kunnen worden gevonden.phone IS NULL vindt klanten van wie het telefoonnummer niet is vastgelegd.ISO-datumnotatie
2026-03-02.J
Join
orders.customer_id aan customers.customer_id om de juiste woonplaats te vinden.K
Kandidaatsleutel
employee_id de primaire sleutel wordt.Kolom (attribuut of veld)
city bevat voor elk klantrecord een stadswaarde, of NULL wanneer dat is toegestaan.Koppeltabel
order_items koppelt een bestelling aan een product en legt de hoeveelheid en de in rekening gebrachte stukprijs vast.Kraaienpootnotatie
N
Natuurlijke sleutel
state_code van twee letters gebruiken als leesbare primaire sleutel in adresrecords.NOT NULL
NOT NULL is een integriteitsregel die vereist dat een kolomvermelding aanwezig is en NULL weigert, zonder zelf te controleren op een positieve waarde of niet-lege tekst.NULL
Numerieke code
02108 heeft tekstopslag nodig om de eerste nul te behouden wanneer de waarde wordt teruggelezen.O
Optionele relatie
coupon_id NULL houden terwijl andere bestellingen naar bestaande kortingsbonnen verwijzen.Orderregel
Ouder- en kindtabellen
P
Precisie
DECIMAL(p, s) is p, het totale aantal beschikbare cijfers voor het gehele deel en het deel achter de komma van een waarde.DECIMAL(8, 2) laten acht cijfers in totaal ruimte voor zes vóór en twee achter de komma.Primaire sleutel
customer_id als primaire sleutel, zodat bestellingen naar één specifieke klant kunnen verwijzen.R
Referentiële actie
ON DELETE SET NULL behoudt rijen in de kindtabel maar verwijdert hun verwijzing naar de oudertabel, dus die verwijzing moet NULL toestaan.Referentiële integriteit
Refererende sleutel
customer_id 1 bevatten en elk naar hetzelfde unieke klantrecord verwijzen.Regelbedrag
Relatiekardinaliteit
Relationele database
Rij (tupel of record)
S
Samengestelde sleutel
Schaal
DECIMAL(p, s) is s, het aantal cijfers achter de komma, dat de precisie van het decimale deel bepaalt.Schemadiagram
orders.customer_id met de klantsleutel en maakt zo de verwijzing van bestellingen naar klanten zichtbaar.Sleutelpad
customer_id naar een klantrij en lees je de woonplaats van die rij.SQL
SQL-dialect
LIMIT 10 voor een resultaatlimiet, terwijl SQL Server meestal TOP 10 gebruikt.Standaardwaarde
DEFAULT 'pending' legt pending vast wanneer de nieuwe rij geen status opgeeft.Supersleutel
employee_id uniek is, identificeert de combinatie met afdeling de medewerker nog steeds, maar voegt ze een extra kolom toe.Surrogaatsleutel
customer_id blijft gelijk wanneer de klant een e-mailadres, telefoonnummer of achternaam wijzigt.T
Tabel (relatie)
Tabelkardinaliteit
Teksttype
MUG-11-BLU hoort in tekstopslag omdat het een label is, geen hoeveelheid.Transactie
Transactionele werklast (OLTP)
Typeaffiniteit
abc als tekst behouden wanneer conversie naar een geheel getal mislukt.U
UNKNOWN
state <> 'TX' is UNKNOWN voor een klant van wie de staat NULL is, dus WHERE laat die rij weg.UUID
V
Valutacode
Veel-op-veelrelatie
Verweesde rij
View
Z
Zelfverwijzende relatie
manager_id van een medewerker wijst naar een andere medewerkersrij, met NULL voor iemand die geen leidinggevende heeft.- 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.