SQL-weergaven uitgelegd: creëer, gebruik en vermijd de valkuilen, met voorbeelden

  1. Home
  2. Blog
  3. Databases en SQL

Databases en SQL

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.

8 min leestijd
SQL-views uitgelegd: creëer, gebruik en vermijd de valkuilen, met voorbeelden

Belangrijkste punten

  • 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 zoals customer_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

Werk met Stack Quora

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.

Blijf lezen

Meer handleidingen over testen, AI en moderne ontwikkeling

Genoten van dit artikel? Kies een onderwerp en ga direct naar onze nieuwste tutorials.

Kunstmatige intelligentie

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 →
DevOps

Omgevingsvariabelen 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 →
Softwareontwikkeling

API-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 →
Testautomatisering

Spotten 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 →
Softwaretesten

Codedekking 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 & SQL

DELETE 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 & SQL

SQL-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 →
Softwareontwikkeling

TypeScript-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 →
Softwareontwikkeling

Python *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 →
Softwareontwikkeling

Python 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 intelligentie

Wat 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 →
DevOps

Monitoring 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 →
DevOps

Docker-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 →
Testautomatisering

TDD 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 →
Softwareontwikkeling

Git 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 →
Softwareontwikkeling

Python 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 & SQL

SQL 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 →