Views
Hva er et view?
Et view er en logisk eller virtuell tabell. Denne tabellen er
resultatet av en eller flere relasjonelle operasjoner
på basistabellene. Lagres i Data Dictionary.
Basistabell:Tabell hvor innholdet lagres fysisk på
en disk av et RDBMS.
Hva kan views brukes til
- Vanlige brukere slipper å tenke på join
- Sikkerhet. Forenkler strukturen. Skjuler data for
brukere som de ikke har noe med å gjøre
- Forenkler sql-spørringer.
Slipper å skrive lange avanserte sql-setninger
- Datauavhengig. Er lik selv om det gjøres
endringer i basistabellene(omstrukturering, splitting,
kolonner lagt til eller fjernet)
- Oppdatering. Data i viewet blir oppdatert med en gang
det gjøres endringer i basistabellene.
- Dataintegritet. WITH CHECK OPTION sørger for
at ikke data blir lagt inn som strider mot WHERE-kravene.
Problemer
- I hvilken grad man kan oppdatere eller endre data i
basistabeller er sql-dialektavhengig
- Hva skjer med view når det gjøres forandringer
i basistabeller?
Hvis man har SELECT * FROM tabell, og senere
legger til en kolonne i basistabellen, blir ikke den kolonnen
med i viewet.
- Ytelse - Trenger mer ressurser
Syntax
CREATE VIEW view_navn
AS SELECT statement
FROM basis_tabell
WHERE krav
WITH CHECK OPTION;
Ikke alle views har et WHERE-krav
ORDER BY kan ikke ligge i CREATE VIEW
GROUP BY er lov
WITH CHECK OPTION gjør at brukere ikke kan legge til data
i basistabellen gjennom et view hvis WHERE-kravene ikke er innfridd.
Eksempel 1:
medlemsnr |
etternavn |
fornavn |
adresse |
postnr |
telefon |
fodt |
nivaa |
ant_aar_medlem |
1 |
Olsen |
Per |
Glitterheimen 2 |
2033 |
79 126754 |
13-07-1970 |
Videregående |
5 |
2 |
Johansen |
Elna |
Ilderhaug |
2035 |
79 129845 |
21-02-1974 |
Medium |
3 |
3 |
Nilsen |
Anders |
Jerpeveien 45 |
2196 |
79 117640 |
06-12-1975 |
Nybegynner |
1 |
CREATE VIEW telefonliste
AS SELECT fornavn, etternavn, telefon
FROM medlemsregister
WITH CHECK OPTION;
SELECT *
FROM telefonliste
ORDER BY etternavn;
fornavn |
etternavn |
telefon |
Elna |
Johansen |
79 129845 |
Anders |
Nilsen |
79 117640 |
Per |
Olsen |
79 126754 |
Eksempel 2:
student
snr |
nvn |
adr |
postnr |
tlf |
email |
fodt |
10432 |
Ola Normann |
Bleikerstredet 4 |
1454 |
68 215678 |
olanor@hiho.no |
14-09-1967 |
16129 |
Emma Dalmann |
Sommerstigen 64 |
1467 |
68 218734 |
emmadaal@hiho.no |
05-03-1973 |
18752 |
Ine Aalseth |
Bruddstykket 3 |
1489 |
68 220956 |
ineaal@hiho.no |
10-02-1975 |
kursresultat
snr |
edato |
fag |
kar |
10432 |
10-12-1991 |
Sosiologi |
2.3 |
10432 |
15-05-1992 |
Psykologi |
1.7 |
10432 |
01-06-1992 |
Praktisk pedagogikk |
1.2 |
16129 |
06-05-1994 |
Kriminologi |
4.5 |
16129 |
01-06-1995 |
Kriminologi |
3.7 |
18752 |
17-05-1996 |
Psykologi |
1.2 |
18752 |
10-06-1996 |
Allmennmedisin |
1.7 |
18752 |
13-12-1998 |
Kirurgi |
1.5 |
CREATE VIEW eksamensliste(studentnr, fag, karakter)
AS SELECT k.snr, fag, kar
FROM student s, kursresultat k
WHERE s.snr = k.snr;
SELECT *
FROM eksamensliste
ORDER BY studentnr;
eksamensliste
studentnr |
fag |
karakter |
10432 |
Sosiologi |
2.3 |
10432 |
Psykologi |
1.7 |
10432 |
Praktisk pedagogikk |
1.2 |
16129 |
Kriminologi |
3.7 |
16129 |
Kriminologi |
4.5 |
18752 |
Psykologi |
1.2 |
18752 |
Allmennmedisin |
1.7 |
18752 |
Kirurgi |
1.5 |
SELECT studentnr, MIN(karakter) AS best_resultat
FROM eksamensliste
GROUP BY studentnr
ORDER BY best_resultat;
eksamensliste
studentnr |
best_resultat |
10432 |
1.2 |
18752 |
1.2 |
16129 |
3.7 |
CREATE VIEW eksamensliste2(studentnr, beste_karakter)
AS SELECT k.snr, MIN(kar)
FROM student s, kursresultat k
WHERE s.snr = k.snr
GROUP BY k.snr;
SELECT *
FROM eksamensliste2;
eksamensliste2
studentnr |
beste_karakter |
10432 |
1.2 |
16129 |
3.7 |
18752 |
1.2 |
UPDATE, INSERT og DELETE i views
Eksempel 1:
isbn |
tittel |
forfatter |
utgitt |
sider |
51-87452-02-1 |
Jonas |
Jens Bjørnebo |
1967 |
329 |
32-65342-98-6 |
Emil i Lønneberget |
Astrid Lindgren |
1969 |
60 |
32-56342-56-0 |
Lotta på Bråkmakergaten |
Astrid Lindgren |
1971 |
103 |
65-43987-20-6 |
Døden på Oslo S |
Ingvar Ambjørnsen |
1985 |
191 |
32-76308-09-2 |
Madikken |
Astrid Lindgren |
1980 |
81 |
CREATE VIEW astrid_lindgren
AS SELECT isbn, tittel, utgitt, sider
FROM bok
WHERE forfatter = 'Astrid Lindgren';
SELECT * FROM astrid_lindgren;
isbn |
tittel |
utgitt |
sider |
32-65342-98-6 |
Emil i Lønneberget |
1969 |
60 |
32-56342-56-0 |
Lotta på Bråkmakergaten |
1971 |
103 |
32-76308-09-2 |
Madikken |
1980 |
81 |
UPDATE astrid_lindgren
SET sider = 85
WHERE isbn = '32-65342-98-6';
SELECT * FROM astrid_lindgren;
isbn |
tittel |
utgitt |
sider |
32-65342-98-6 |
Emil i Lønneberget |
1969 |
85 |
32-56342-56-0 |
Lotta på Bråkmakergaten |
1971 |
103 |
32-76308-09-2 |
Madikken |
1980 |
81 |
SELECT * FROM bok;
isbn |
tittel |
forfatter |
utgitt |
sider |
51-87452-02-1 |
Jonas |
Jens Bjørnebo |
1967 |
329 |
32-65342-98-6 |
Emil i Lønneberget |
Astrid Lindgren |
1969 |
85 |
32-56342-56-0 |
Lotta på Bråkmakergaten |
Astrid Lindgren |
1971 |
103 |
65-43987-20-6 |
Døden på Oslo S |
Ingvar Ambjørnsen |
1985 |
191 |
32-76308-09-2 |
Madikken |
Astrid Lindgren |
1980 |
81 |
INSERT INTO astrid_lindgren
VALUES('67-76341-04-2', 'Brødrene Løvehjerte', 1970, 150);
SELECT * FROM astrid_lindgren;
isbn |
tittel |
utgitt |
sider |
32-65342-98-6 |
Emil i Lønneberget |
1969 |
85 |
32-56342-56-0 |
Lotta på Bråkmakergaten |
1971 |
103 |
32-76308-09-2 |
Madikken |
1980 |
81 |
SELECT * FROM bok;
isbn |
tittel |
forfatter |
utgitt |
sider |
51-87452-02-1 |
Jonas |
Jens Bjørnebo |
1967 |
329 |
32-65342-98-6 |
Emil i Lønneberget |
Astrid Lindgren |
1969 |
85 |
32-56342-56-0 |
Lotta på Bråkmakergaten |
Astrid Lindgren |
1971 |
103 |
65-43987-20-6 |
Døden på Oslo S |
Ingvar Ambjørnsen |
1985 |
191 |
32-76308-09-2 |
Madikken |
Astrid Lindgren |
1980 |
81 |
67-76341-04-2 |
Brødrene Løvehjerte |
|
1970 |
150 |
DELETE FROM astrid_lindgren
WHERE isbn = '32-56342-56-0';
SELECT * FROM astrid_lindgren;
isbn |
tittel |
utgitt |
sider |
32-65342-98-6 |
Emil i Lønneberget |
1969 |
85 |
32-76308-09-2 |
Madikken |
1980 |
81 |
SELECT * FROM bok;
isbn |
tittel |
forfatter |
utgitt |
sider |
51-87452-02-1 |
Jonas |
Jens Bjørnebo |
1967 |
329 |
32-65342-98-6 |
Emil i Lønneberget |
Astrid Lindgren |
1969 |
85 |
65-43987-20-6 |
Døden på Oslo S |
Ingvar Ambjørnsen |
1985 |
191 |
32-76308-09-2 |
Madikken |
Astrid Lindgren |
1980 |
81 |
67-76341-04-2 |
Brødrene Løvehjerte |
|
1970 |
150 |
Eksempel 2:
isbn |
tittel |
forfatter |
utgitt |
sider |
51-87452-02-1 |
Jonas |
Jens Bjørnebo |
1967 |
329 |
32-65342-98-6 |
Emil i Lønneberget |
Astrid Lindgren |
1969 |
60 |
32-56342-56-0 |
Lotta på Bråkmakergaten |
Astrid Lindgren |
1971 |
103 |
65-43987-20-6 |
Døden på Oslo S |
Ingvar Ambjørnsen |
1985 |
191 |
32-76308-09-2 |
Madikken |
Astrid Lindgren |
1980 |
81 |
CREATE VIEW astrid_lindgren2
AS SELECT isbn, tittel, utgitt, sider
FROM bok
WHERE forfatter = 'Astrid Lindgren'
WITH CHECK OPTION;
SELECT * FROM astrid_lindgren2;
isbn |
tittel |
utgitt |
sider |
32-65342-98-6 |
Emil i Lønneberget |
1969 |
60 |
32-56342-56-0 |
Lotta på Bråkmakergaten |
1971 |
103 |
32-76308-09-2 |
Madikken |
1980 |
81 |
UPDATE astrid_lindgren2
SET sider = 85
WHERE isbn = '32-65342-98-6';
SELECT * FROM astrid_lindgren2;
isbn |
tittel |
utgitt |
sider |
32-65342-98-6 |
Emil i Lønneberget |
1969 |
85 |
32-56342-56-0 |
Lotta på Bråkmakergaten |
1971 |
103 |
32-76308-09-2 |
Madikken |
1980 |
81 |
SELECT * FROM bok;
isbn |
tittel |
forfatter |
utgitt |
sider |
51-87452-02-1 |
Jonas |
Jens Bjørnebo |
1967 |
329 |
32-65342-98-6 |
Emil i Lønneberget |
Astrid Lindgren |
1969 |
85 |
32-56342-56-0 |
Lotta på Bråkmakergaten |
Astrid Lindgren |
1971 |
103 |
65-43987-20-6 |
Døden på Oslo S |
Ingvar Ambjørnsen |
1985 |
191 |
32-76308-09-2 |
Madikken |
Astrid Lindgren |
1980 |
81 |
INSERT INTO astrid_lindgren2
VALUES('67-76341-04-2', 'Brødrene Løvehjerte', 1970, 150);
FEIL på linje 1:
ORA-01402: brudd på WITH CHECK OPTION-skranke for WHERE-ledd i utsnitt
DELETE FROM astrid_lindgren2
WHERE isbn = '32-56342-56-0';
SELECT * FROM astrid_lindgren2;
isbn |
tittel |
utgitt |
sider |
32-65342-98-6 |
Emil i Lønneberget |
1969 |
85 |
32-76308-09-2 |
Madikken |
1980 |
81 |
SELECT * FROM bok;
isbn |
tittel |
forfatter |
utgitt |
sider |
51-87452-02-1 |
Jonas |
Jens Bjørnebo |
1967 |
329 |
32-65342-98-6 |
Emil i Lønneberget |
Astrid Lindgren |
1969 |
85 |
65-43987-20-6 |
Døden på Oslo S |
Ingvar Ambjørnsen |
1985 |
191 |
32-76308-09-2 |
Madikken |
Astrid Lindgren |
1980 |
81 |