SQL-weergaven uitgelegd: Maak, gebruik en vermijd de valkuilen, met voorbeelden
Een weergave is een opgeslagen query die u als tabel kunt gebruiken. Ontdek hoe u er een kunt maken, waarom weergaven rapporten consistent houden, wat ze wel en niet doen voor de prestaties, en welke valkuilen ze kunnen doorbreken.
- Een view is een benoemde, opgeslagen query waaruit u, net als een tabel, kunt selecteren.
- Een normale weergave slaat geen gegevens op en toont dus altijd de huidige resultaten.
- Weergaven vereenvoudigen complexe query’s, houden de bedrijfslogica consistent en kunnen de toegang tot kolommen beperken.
- Ze maken een zoekopdracht op zichzelf niet sneller, hoewel gematerialiseerde weergaven dat wel kunnen.
Dezelfde twintigregelige rapportquery is gekopieerd naar vijf dashboards, en elke kopie is een beetje afgedreven. De een telt geannuleerde bestellingen mee, de ander niet. SQL-views lossen dit op door die logica één keer in de database te definiëren, onder een duidelijke naam.
We hebben elk hieronder voorbeeld uitgevoerd in SQLite 3.50, en de getoonde resultaten komen uit die run. Views zijn standaard SQL, maar details zoals het bijwerken via een view, gematerialiseerde views en de afhandeling van afhankelijkheid variëren per database, en daar wijzen we op.
Wat is een uitzicht?
Een weergave is een SELECT-instructie die met een naam in de database is opgeslagen. Wanneer u een query uitvoert op de weergave, voert de database die opgeslagen query uit. Het fungeert als een leestabel, maar een normale weergave bevat geen eigen kopie van de gegevens.
Denk aan een opgeslagen filter in een spreadsheet. Het filter is geen tweede kopie van het blad. Het is een manier om naar dezelfde gegevens te kijken, die altijd de nieuwste waarden weerspiegelen.
De voorbeeldtabellen
CREATE TABLE customers (
id INT PRIMARY KEY, name TEXT, city TEXT, email TEXT, credit_limit INT
);
CREATE TABLE orders (
id INT PRIMARY KEY, customer_id INT, total INT, status TEXT
);
INSERT INTO customers VALUES
(1,'Asha','Pune','asha@example.com',50000),
(2,'Ben','Delhi','ben@example.com',20000),
(3,'Chitra','Pune','chitra@example.com',80000);
INSERT INTO orders VALUES
(101,1,1200,'paid'), (102,1,800,'paid'),
(103,2,300,'pending'), (104,3,2500,'paid');
Maak een weergave
In deze weergave worden de bestellingen van elke klant samengevat. Het verbergt een join, groepering en een CASE-expressie achter één eenvoudige naam:
CREATE VIEW customer_sales AS
SELECT c.id, c.name, c.city,
COUNT(o.id) AS orders,
COALESCE(SUM(CASE WHEN o.status = 'paid' THEN o.total END), 0) AS paid_total
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.id, c.name, c.city;
Nu kan iedereen het gebruiken, zonder te weten hoe het werkt:
SELECT * FROM customer_sales ORDER BY paid_total DESC;
-- 3 | Chitra | Pune | 1 | 2500
-- 1 | Asha | Pune | 2 | 2000
-- 2 | Ben | Delhi | 1 | 0
SELECT name, paid_total FROM customer_sales WHERE city = 'Pune';
-- Asha | 2000
-- Chitra | 2500
Ben verschijnt met nul, omdat de weergave een LEFT JOIN en COALESCE gebruikt. Dit soort beslissingen, die eenmaal in het zicht zijn genomen, zijn precies wat de rapporten consistent houdt. Zie SQL NULL-waarden om uw begrip van de NULL-afhandeling op te frissen.
Uitzichten zijn altijd actueel
Omdat een normale weergave elke keer een zoekopdracht uitvoert, verschijnen er onmiddellijk nieuwe gegevens. We hebben een betaalde bestelling voor Ben toegevoegd en de weergave opnieuw opgevraagd:
INSERT INTO orders VALUES (105, 2, 900, 'paid');
SELECT name, paid_total FROM customer_sales WHERE name = 'Ben';
-- Ben | 900
Er was geen vernieuwingsstap en geen kopie om gesynchroniseerd te houden. Dit is het belangrijkste verschil met het opslaan van queryresultaten in een aparte tabel.
Kolommen verbergen
Weergaven worden vaak gebruikt om alleen de kolommen weer te geven die een persoon of toepassing nodig heeft. Hier worden e-mailadressen en kredietlimieten weggelaten:
CREATE VIEW public_customers AS
SELECT id, name, city FROM customers;
-- columns: id, name, city
In databases met machtigingen, zoals PostgreSQL, SQL Server en MySQL, kunt u een rapporterende gebruiker toegang verlenen tot de weergave, maar niet tot de onderliggende tabel. SQLite heeft geen gebruikersaccounts, dus we konden alleen de kolombeperking zelf weergeven. Beschouw een weergave als één beschermingslaag. Gevoelige gegevens hebben nog steeds een goede toegangscontrole nodig, en sommige databases bieden beveiliging op rijniveau voor het filteren van rijen op gebruiker.
Prestaties: weergaven zijn geen snelheidsboost
Een veel voorkomende mythe is dat weergaven zoekopdrachten sneller maken. Een normale weergave wordt vervangen door de definitie ervan wanneer u er een query op uitvoert, zodat de database hetzelfde werk doet alsof u de volledige query zelf had geschreven. Ons uitvoeringsplan liet zien dat de join en groepering van de weergave werden uitgevoerd als onderdeel van de query:
EXPLAIN QUERY PLAN SELECT * FROM customer_sales WHERE city = 'Pune';
-- CO-ROUTINE customer_sales
-- SCAN c ...
-- SEARCH o USING AUTOMATIC COVERING INDEX (customer_id=?) LEFT-JOIN
-- USE TEMP B-TREE FOR GROUP BY
-- SCAN customer_sales
Een weergave van een langzame query is dus nog steeds een langzame query. Snelheid is te danken aan indexen en een goed queryontwerp, zoals beschreven in SQL-queryoptimalisatie en SQL-indexen uitgelegd. Let ook op weergaven die op andere weergaven zijn gebaseerd. Dankzij de nestinglagen kun je gemakkelijk meerdere keren aan dezelfde grote tafel schuiven zonder dat je het merkt.
Gematerialiseerde opvattingen
Een gematerialiseerde weergave slaat de resultaten op, net als een tabel in de cache. Het lezen gaat snel, maar de gegevens zijn slechts zo actueel als de laatste vernieuwing.
-- PostgreSQL
CREATE MATERIALIZED VIEW daily_sales AS
SELECT order_date, SUM(total) AS revenue FROM orders GROUP BY order_date;
REFRESH MATERIALIZED VIEW daily_sales;
| Functie | Normaal zicht | Gematerialiseerde weergave |
|---|---|---|
| Slaat gegevens op | Nee | Ja |
| Versheid | Altijd actueel | Vanaf de laatste vernieuwing |
| Lees snelheid | Hetzelfde als de vraag | Snel |
| Opslagkosten | Geen | Ja |
| Goed voor | Vereenvoudiging, consistentie | Zware rapporten en dashboards |
Ondersteuning varieert. PostgreSQL en Oracle hebben gematerialiseerde weergaven, en SQL Server biedt geïndexeerde weergaven met hun eigen regels. SQLite en MySQL missen deze, dus gebruiken mensen een reguliere overzichtstabel die volgens een schema wordt vernieuwd. We hebben het PostgreSQL-voorbeeld voor dit artikel niet uitgevoerd.
Tip: Voordat u een gematerialiseerde weergave maakt, moet u bepalen hoe oud de gegevens mogen zijn. ‘Elk uur ververst’ moet acceptabel zijn voor de mensen die het rapport lezen, dus vertel het hen.
Kunt u een weergave bijwerken?
Het hangt af van de database en de weergave. Een eenvoudige weergave van een enkele tabel, zonder groepering of DISTINCT, kan vaak worden bijgewerkt in PostgreSQL, MySQL en SQL Server, en de wijziging wordt doorgevoerd in de tabel. Een weergave met joins of aggregaties kan dat doorgaans niet, omdat de database niet kan bepalen welke rij moet worden gewijzigd.
SQLite staat helemaal geen directe schrijfbewerkingen naar views toe. Onze poging mislukte:
INSERT INTO customer_sales (name) VALUES ('X');
-- cannot modify customer_sales because it is a view
Sommige databases ondersteunen INSTEAD OF triggers om een weergave beschrijfbaar te maken, en vele bieden WITH CHECK OPTION, waardoor schrijfbewerkingen worden gestopt die niet zichtbaar zouden zijn via de weergave. In de praktijk houden de meeste teams de weergaven alleen-lezen en schrijven ze naar de tabellen.
Afhankelijkheden en breuk
Een weergave is afhankelijk van de tabellen waaruit deze leest. We hebben een weergave op een tafel gemaakt en vervolgens de tabel laten vallen:
CREATE TABLE ghost AS SELECT 1 AS x;
CREATE VIEW v_ghost AS SELECT x FROM ghost;
DROP TABLE ghost;
SELECT * FROM v_ghost;
-- no such table: main.ghost
SQLite stond de verwijdering toe en faalde pas later, toen de weergave werd gebruikt. Andere databases, zoals PostgreSQL, weigeren een tabel te verwijderen waarvan een weergave afhankelijk is, tenzij u CASCADE toevoegt, waardoor de weergave ook wordt verwijderd. Hoe het ook zij, het hernoemen of verwijderen van een kolom kan de weergaven verbreken. Controleer deze dus in uw regressietests na schemawijzigingen.
Er is ook een subtiele valkuil met SELECT * in beeld. We hebben CREATE VIEW star AS SELECT * FROM customers gemaakt en vervolgens een kolom aan de tabel toegevoegd. In SQLite pakte de weergave de nieuwe kolom op. Andere databases, waaronder PostgreSQL, breiden de kolommenlijst uit wanneer de weergave wordt gemaakt, zodat er geen nieuwe kolommen verschijnen. Vermeld de kolommen dus expliciet. Het documenteert het uitzicht en gedraagt zich overal hetzelfde.
Weergaven beheren
| Taak | Gemeenschappelijke syntaxis |
|---|---|
| Creëer | CREATE VIEW-naam AS SELECT ... |
| Vervangen | CREATE OR REPLACE VIEW (PostgreSQL, MySQL, Oracle) |
| Vervangen in SQL Server | CREËER OF WIJZIG EEN AANZICHT |
| Verwijderen | DROP VIEW-naam |
| Veilig verwijderen | DROP VIEW INDIEN BESTAAT naam |
Als u een weergave verwijdert, wordt alleen de opgeslagen zoekopdracht verwijderd. In onze test had tabel customers nog steeds alle drie de rijen nadat public_customers was verwijderd. Bewaar weergavedefinities in versiebeheer samen met uw migraties, zodat wijzigingen worden beoordeeld zoals elke andere code.
Bekijk versus CTE versus tabel
| Optie | Levenslang | Slaat gegevens op | Beste voor |
|---|---|---|---|
| Bekijk | Tot het viel | Nee | Gedeelde logica die door veel query’s wordt gebruikt |
| CTE | Eén verklaring | Nee | Het organiseren van een enkele complexe query |
| Gematerialiseerde weergave | Tot het viel | Ja | Snelle aflezing van kostbare resultaten |
| Tafel | Tot het viel | Ja | De feitelijke gegevens |
Veel voorkomende fouten
- Er wordt een snelheidsboost verwacht. Een normale weergave voert elke keer een zoekopdracht uit.
SELECT *gebruiken in weergaven. Het gedrag verschilt tussen databases wanneer tabellen veranderen.- Diep genest. Weergaven die op weergaven zijn gebouwd, verbergen dure joins.
- ORDER BY gebruiken in een weergave. De volgorde is niet gegarandeerd wanneer u er een query op uitvoert, dus sorteer in de buitenste query.
- Onduidelijke namen. Een voorvoegsel zoals
v_, of een duidelijk zelfstandig naamwoord zoalscustomer_sales, helpt. - Vergeet weergaven tijdens migraties. Test ze na elke schemawijziging.
Tot slot
Views zijn een eenvoudige manier om belangrijke logica een plek in de database te geven. Gebruik ze om rapporten consistent te houden en onnodige kolommen te verbergen, niet als prestatietruc. Zoek om te beginnen een query die op verschillende plaatsen in uw code voorkomt, verander deze in een weergave met expliciete kolommen en wijs elke beller ernaar.
Veelgestelde vragen
Wat is een weergave in SQL?
Een weergave is een opgeslagen SELECT-query met een naam. U voert er query’s op uit als een tabel, en de database voert elke keer de onderliggende query uit, zodat de resultaten altijd actueel zijn.
Slaat een SQL-weergave gegevens op?
In een normale weergave worden geen gegevens opgeslagen, alleen de query. Een gerealiseerde weergave slaat wel resultaten op en moet worden vernieuwd om up-to-date te blijven.
Zijn weergaven sneller dan tabellen?
Nee. Een normale weergave doet hetzelfde werk als de onderliggende query. Gematerialiseerde weergaven kunnen het leesproces versnellen, wat ten koste gaat van opslag en versheid.
Kun je in een weergave invoegen?
Soms. Eenvoudige weergaven met één tabel kunnen vaak worden bijgewerkt in PostgreSQL, MySQL en SQL Server. Weergaven met joins of groepering zijn dat meestal niet, en SQLite staat dit niet toe.
Wat gebeurt er met een weergave als de tabel wordt verwijderd?
Het hangt af van de database. Sommigen weigeren de tabel te laten vallen terwijl een weergave ervan afhangt, terwijl anderen dit toestaan en de weergave faalt wanneer er vragen over worden gesteld.
Blijf leren
Hulp nodig met testen, WordPress of SEO?
We helpen teams betere software te leveren en hun sites te laten groeien. Vertel ons waar u mee bezig bent en wij stellen een duidelijke volgende stap voor.
Meer handleidingen over testen, AI en moderne ontwikkeling
Genoten van dit artikel? Kies een onderwerp en ga direct naar onze nieuwste tutorials.
AI-hallucinaties uitgelegd: waarom taalmodellen dingen verzinnen en hoe ze te verminderen
AI-hallucinaties uitgelegd: wat ze zijn, waarom taalmodellen ze produceren, veelvoorkomende typen, hoe je ze kunt verminderen met aarding en aanwijz…
Lees artikel →DevOpsOmgevingsvariabelen uitgelegd: .env-bestanden, geheimen en configuratie goed gedaan
Omgevingsvariabelen uitgelegd met Python-voorbeelden die we hebben uitgevoerd: ze lezen en instellen, waarom elke waarde een string is, .env-bestand…
Lees artikel →SoftwareontwikkelingAPI-snelheidsbeperking uitgelegd: algoritmen, headers en afhandeling van 429-fouten
API-snelheidsbeperking uitgelegd met een simulatie die we hebben uitgevoerd: token-bucket, vast venster, schuifvenster, 429 reacties, headers van sn…
Lees artikel →TestautomatiseringSpotten in Python: unittest.mock, patch en de fouten die tests doen liegen
Spotten in Python met unittest.mock, getest: Mock en return_value, side_effect, patchen waar een naam wordt gebruikt, spec en autospec, spotdatums e…
Lees artikel →SoftwaretestenCodedekking uitgelegd: lijn versus filiaaldekking en wat 100% werkelijk betekent
Codedekking uitgelegd met een echte dekking.py-run: dekking van lijnen, vertakkingen en condities, een rapport lezen, waarom 100% dekking nog steeds…
Lees artikel →Databases & SQLDELETE versus TRUNCATE versus DROP in SQL: verschillen, terugdraaien en wanneer elk te gebruiken
DELETE versus TRUNCATE versus DROP uitgelegd met geteste SQL: wat elk verwijdert, terugdraaien, triggers, identiteitsreset, snelheid en hoe PostgreS…
Lees artikel →Databases & SQLSQL-weergaven uitgelegd: creëer, gebruik en vermijd de valkuilen, met voorbeelden
SQL-weergaven uitgelegd met query's die we hebben uitgevoerd: een weergave maken, live resultaten, kolommen verbergen, prestaties, bijwerkbare en ge…
Lees artikel →SoftwareontwikkelingTypeScript-interface versus type: echte verschillen, getest met de compiler
TypeScript-interface versus type, gecontroleerd met de echte compiler: wat beide kunnen doen, wat slechts één kan doen, samenvoegen van declaraties,…
Lees artikel →SoftwareontwikkelingPython *args en **kwargs uitgelegd: flexibele functies met duidelijke voorbeelden
Python *args en **kwargs uitgelegd met code die we hebben uitgevoerd: in- en uitpakken, parametervolgorde, argumenten die alleen trefwoorden en posi…
Lees artikel →SoftwareontwikkelingPython Lambda-functies: syntaxis, echt gebruik en wanneer u ze niet moet gebruiken
Python lambda-functies uitgelegd met code die we hebben uitgevoerd: syntaxis, sorteren met sleutel, kaart en filter, sluitingen, de laat-bindende va…
Lees artikel →Kunstmatige intelligentieWat zijn AI-agenten? Hoe ze werken, met een eenvoudige agentloop die u kunt uitvoeren
Wat zijn AI-agenten? Een duidelijke gids voor de agentenlus, tools, geheugen en vangrails, met een kleine Python-lus die we hebben uitgevoerd, echte…
Lees artikel →DevOpsMonitoring versus waarneembaarheid: het echte verschil, met logboeken, statistieken en sporen
Monitoring versus waarneembaarheid uitgelegd: bekende en onbekende fouten, logboeken, statistieken en sporen, een walkthrough voor afrekenincidenten…
Lees artikel →DevOpsDocker-volumes versus bindingsmounts: bewaar containergegevens op de juiste manier
Docker-volumes versus bind-mounts uitgelegd: waarom containergegevens verdwijnen, benoemde volumes, bind-mounts, tmpfs, Compose-voorbeelden, back-up…
Lees artikel →TestautomatiseringTDD versus BDD: belangrijkste verschillen, één functie die op beide manieren is gebouwd en wanneer deze moet worden gebruikt
TDD versus BDD uitgelegd met één kortingsfunctie die in beide richtingen is gebouwd: rood-groen-refactor met code die we hebben uitgevoerd, gegeven-…
Lees artikel →SoftwareontwikkelingGit merge vs rebase: verschillen, voorbeelden en wanneer je wat gebruikt
Git merge vs rebase uitgelegd met echte logoutput, een vergelijkingstabel, de gouden regel van rebase en een veilige teamwerkwijze.
Lees artikel →SoftwareontwikkelingPython list comprehension: syntaxis, voorbeelden en wanneer je het vermijdt
Python list comprehension uitgelegd: syntaxis, filteren, if-else, geneste lussen, gemeten tijden en wanneer een gewone for-lus beter is.
Lees artikel →Databases & SQLSQL JOIN uitgelegd met voorbeelden (Inner, Left, Right, Full)
Begrijp SQL joins stap voor stap met voorbeeldtabellen en queries: INNER, LEFT, RIGHT, FULL, CROSS en SELF, plus veelgemaakte fouten en prestatietips.
Lees artikel →