
Views
Introductie
Met een common table expression (CTE) kun je binnen een query een andere query vanuit een naam gebruiken.
- Een CTE is alleen binnen de query bruikbaar waar je het aanmaakt.
- Het is dus niet vanuit andere queries bruikbaar.
Als je een query wilt hergebruiken binnen meerdere queries, dan kun je met views werken.
We gaan dit stap voor stap bekijken vanuit een voorbeeld.
1. Voorbeeld views
We gaan met een vraagstuk aan de slag.
Hier gaan we uiteindelijk een view bij gebruiken.
We bouwen het stap voor stap op.
- Eerst kijken we naar een voorbeeld met een common table expression.
- Daarna herschrijven we het met een view.
1.1. Vraagstelling

- In tabel
movieshebben we details van een film.- Bijvoorbeeld het jaar, en de score.
- We willen een overzicht van alle films.
- Met daaraan toegevoegd:
- De gemiddelde score van alle films uit het jaar waarop een film uitkwam.
- Met daaraan toegevoegd:
Hiermee kunnen we zien of een film beter/slechter was dan de gemiddelde film uit dat jaar.
1.2. Oplossing met CTE
Met een common table expression lossen we dit probleem op:
- Met de CTE berekenen we met
GROUP BYenAVG()de gemiddelde score per jaar. - Dit voegen we met een
LEFT JOINtoe aan details van films.
WITH year_details AS (
SELECT
year,
AVG(rank) AS avg_rank_by_year
FROM
movies
GROUP BY
year
)
SELECT
m.*,
year_details.avg_rank_by_year
FROM
movies AS m
LEFT JOIN year_details ON m.year = year_details.year;
| id | name | year | rank | avg_rank_by_year |
|---|---|---|---|---|
| 10920 | Aliens | 1986 | 8.2 | 8.2 |
| 17173 | Animal House | 1978 | 7.5 | 7.5 |
| 18979 | Apollo 13 | 1995 | 7.5 | 7.9 |
| ... | ... | ... | ... | ... |
1.3. Een view aanmaken
Nu gaan we een view maken maken.
- Een view is een query die je opslaat en elders kunt gebruiken.
- Vanuit al je andere queries.
- In tegenstelling tot een CTE:
- Die is alleen bruikbaar binnen de query waar je het aanmaakt.
- Je kunt er informatie uit opvragen, net als uit een tabel.
- Een view slaat zelf geen data op zoals een tabel dat doet.
- Het bewaart alleen de query.
We maken een view aan.
Later leggen we de syntax uit.
Als we deze query uitvoeren wordt de view met naam year_details aangemaakt.
We kunnen nu data uit de view opvragen:
| year | avg_rank_by_year |
|---|---|
| 1989 | 6.949999999999999 |
| 1991 | 7.8 |
| 1977 | 8.8 |
| ... | ... |
Je ziet dat hetzelfde werkt als bij data opvragen uit een tabel.
1.4. Oplossing met CTE
We passen de view nu toe om ons vraagstuk op te lossen:
SELECT
m.*,
year_details.avg_rank_by_year
FROM
movies AS m
LEFT JOIN year_details ON m.year = year_details.year
| id | name | year | rank | avg_rank_by_year |
|---|---|---|---|---|
| 10920 | Aliens | 1986 | 8.2 | 8.2 |
| 17173 | Animal House | 1978 | 7.5 | 7.5 |
| 18979 | Apollo 13 | 1995 | 7.5 | 7.9 |
| ... | ... | ... | ... | ... |
Je ziet dat dit hetzelfde resultaat geeft als de oplossing met CTE.
Maar dat dit nu een stuk compacter en beter leesbaar is.
2. View syntax
We hebben een voorbeeld van een view bekeken.
Daarin kun je de volgende syntax herkennen:
Je doet hiermee het volgende:
- Je maakt een view aan met
CREATEenAS.- Daarbij geef je de view een naam.
- Met deze naam kun je de query van de view elders oproepen.
- Daarbij geef je de view een naam.
- Je geeft een query op die onder deze naam uitgevoerd moet worden.
3. View of CTE
Onderstaande punten geven inzicht wanneer je een view of CTE gebruikt:
- Ad-hoc queries die je maar eenmalig uitvoert: gebruik een CTE.
- Herhaaldelijk hergebruikte queries: gebruik een view.
- Gebruikers beperkte toegang geven tot data: view.
- Zo kun je bijvoorbeeld een deel van een tabel afschermen voor bepaalde gebruikers.
Samenvatting
- Een view geeft een query een naam.
- Met de naam is de query vervolgens elders te gebruiken.
- In alle andere queries.
- Voorbeeld:
- Een view maakt je code beter leesbaar, en kan gebruikt worden om toegang af te schermen.