4. views in SQL
• “view" = afgeleide relatie
– tupels worden niet expliciet opgeslagen
– maar worden berekend uit andere relaties
(= de definiërende tabellen van de view)
– met andere woorden:
de view is enkel virtueel en wordt (in principe) niet
gematerialiseerd
– kan met SELECT gebruikt worden als iedere
andere tabel!
4
5. specificeren van een view
• syntax
CREATE VIEW <viewname> [ < lijst van attribuutnamen> ]
AS <query>
V1
CREATE VIEW WORKS_ON1
AS SELECT Fname, Lname, Pname, Hours
FROM EMPLOYEE, PROJECT, WORKS_ON
WHERE Ssn = Essn AND Pno = Pnumber ;
CREATE VIEW DEPT_INFO(Dept_name,No_of_emps,Total_sal)
AS SELECT Dname, COUNT(*), SUM(Salary)
FROM DEPARTMENT, EMPLOYEE
WHERE Dnumber = Dno
GROUP BY Dname ;
5
6. gebruik van views
• queries op view: zoals bij gewone tabellen
SELECT Fname, Lname
FROM WORKS_ON1
WHERE Pname = ‘ProductX’ ;
• voordelen van views?
• eenvoudigere formulering van queries
• beveiligingsmechanisme
• gebruiker zicht op deel van gegevensbank geven
• vs. nieuwe tabel (cf. DEPT_INFO):
• geen redundantie
• steeds up-to-date
6
7. verwijderen van view
• DROP VIEW (cf. gewone tabel)
– voorbeeld:
DROP VIEW WORKS_ON1;
– geen verwijdering van tupels
7
8. twee benaderingen voor implementatie
1. query modification
– query op view wordt omgevormd tot query op
onderliggende tabellen;
– nadeel: kan tot complexe en tijdsintensieve queries leiden
2. view materialization
– tijdelijke creatie van de afgeleide (view) tabel wanneer ze
voor het eerst in een query gebruikt wordt;
– vereist ‘incremental update’: aanpassing van de
afgeleide tabel wanneer basistabellen gewijzigd worden;
– afgeleide tabel wordt automatisch verwijderd als ze een
tijd niet meer gebruikt wordt
8
9. voorbeeld van query modification
– de query QV1 op view WORKS_ON1
SELECT Fname, Lname
FROM WORKS_ON1
WHERE Pname = ‘ProductX’ ;
– wordt omgevormd tot
SELECT Fname, Lname
FROM EMPLOYEE, PROJECT, WORKS_ON
WHERE Ssn = Essn AND Pno = Pnumber
AND Pname = ‘ProductX’ ;
9
10. wijzigen van view
• view is afgeleid uit andere relaties
• wijziging moet doorgegeven worden aan andere relaties
• niet altijd mogelijk op eenduidige manier!
10
11. wijzigen van view
• View 1 basisrelatie:
– aanpassing aan view aanpassing aan basisrelatie
• View join van meerdere basisrelaties:
– welke relatie(s) aanpassen?
11
12. voorbeeld
• Wijzig PNAME van John Smith in WORKS_ON1 van 'ProductX'
naar 'ProductY’
UPDATE WORKS_ON1
SET Pname = 'ProductY'
WHERE Lname = 'Smith' AND Fname = 'John'
AND Pname = 'ProductX’ ;
• Hoe de wijziging van productnaam doorgeven aan basisrelaties?
– Is het project van naam veranderd?
– Of werkt John Smith nu aan een ander project, nl. ProductY
i.p.v. ProductX ?
12
13. UPDATE PROJECT
SET Pname = 'ProductY'
WHERE Pname = 'ProductX’ ;
UPDATE WORKS_ON
SET Pno = (SELECT Pnumber FROM PROJECT
WHERE Name = 'ProductY')
WHERE Essn = (SELECT Ssn FROM EMPLOYEE
WHERE Lname = 'Smith' AND Fname = 'John')
AND
Pno IN (SELECT Pnumber FROM PROJECT
WHERE Pname = 'ProductX') ;
sommige aanpassingen zijn zinloos:
UPDATE DEPT_INFO
SET TOTAL_SAL=100000
WHERE DNAME='Research’ ;
13
14. wijzigen van views: algemeen
• een view afgeleid uit 1 tabel kan aangepast worden als
de view een primaire sleutel of kandidaatsleutel van die
tabel bevat ( te wijzigen tupel is eenduidig bepaald)
• een view afgeleid uit meerdere tabellen is meestal niet
aanpasbaar
– indien meerdere aanpassingen mogelijk zijn, moet er een
procedure zijn om hieruit te kiezen, b.v.:
• gebruiker vragen een keuze te maken
• DBMS meest waarschijnlijke laten kiezen
• resultaten van aggregaatfuncties kunnen niet
aangepast worden
14
16. waarde IN verzameling ?
SELECT DISTINCT Pnumber
FROM PROJECT
WHERE Pnumber IN
(SELECT Pnumber
FROM PROJECT, DEPARTMENT, EMPLOYEE
WHERE Dnum=Dnumber AND …)
OR
Pnumber IN
(SELECT Pnumber
FROM …
WHERE …) ;
SELECT DISTINCT Essn
FROM WORKS_ON
WHERE (Pno,Hours) IN
(SELECT Pno,Hours
FROM WORKS_ON
WHERE Essn=`123456789’)
16
17. ALL
• vergelijking met verzameling waarden
• >, <, >=, <=, =, <>
SELECT Lname, Fname
FROM EMPLOYEE
WHERE Salary > ALL
(SELECT Salary
FROM EMPLOYEE
WHERE Dno=5)
17
18. gecorreleerde geneste queries
• geneste query is gecorreleerd als binnenste SELECT
afhankelijk is van buitenste
• de binnenste SELECT query moet voor iedere waarde
van de buitenste worden uitgevoerd
SELECT E.Lname, E.Fname
FROM EMPLOYEE AS E
WHERE E.Ssn IN
(SELECT Essn
FROM DEPENDENT AS D
WHERE E.Fname = D.Dependent_name
AND E.Sex = D.Sex)
18
19. EXISTS
SELECT Lname, Fname
FROM EMPLOYEE
WHERE EXISTS
(SELECT *
FROM DEPENDENT
WHERE Ssn=Essn)
SELECT Lname, Fname
FROM EMPLOYEE
WHERE NOT EXISTS
(SELECT *
FROM DEPENDENT
WHERE Ssn=Essn)
19
21. transacties: atomaire eenheden
• standaard is iedere statement in SQL een transactie
• wordt automatisch permanent gemaakt
• multi-statement transacties moet je zelf expliciet maken
• later veel meer over transacties, bij herstel (recovery)
21
22. START .. COMMIT
• met START begin je een transactie
• pas bij COMMIT wordt deze definitief gemaakt
START;
UPDATE ACCOUNT
SET Balance = 0
WHERE AccNumber = `123456789’ ;
UPDATE ACCOUNT
SET Balance = 100000
WHERE AccNumber = `987654321’;
COMMIT;
22
23. of ROLLBACK
• met ROLLBACK wordt huidige transactie ongedaan
gemaakt
START;
UPDATE ACCOUNT
SET Balance = 0
WHERE AccNumber = `123456789’ ;
UPDATE ACCOUNT
SET Balance = 10000
WHERE AccNumber = `987654321’;
ROLLBACK;
23
25. permissies geven
• met GRANT kun je gebruikers rechten geven
GRANT <rechten>
ON <schema, tabel, tabel(attribuutlijst)>
TO <gebruiker> ;
25
26. GRANT voorbeelden
GRANT INSERT, DELETE
ON EMPLOYEE, DEPARTMENT
TO UserX;
GRANT SELECT
ON EMPLOYEE, DEPARTMENT
TO UserY
WITH GRANT OPTION;
GRANT UPDATE
ON EMPLOYEE(Salary)
TO UserZ;
26
27. REVOKE
• met REVOKE kun je rechten weer ontnemen
REVOKE INSERT, DELETE
ON EMPLOYEE, DEPARTMENT
FROM UserX;
27
30. restricties op tabellen
• primaire sleutel: PRIMARY KEY <attrlist>
• alternatieve sleutel: UNIQUE <attrlist>
worden nagekeken bij toevoegen of wijzigen van tupels
• verwijssleutel: FOREIGN KEY <attrlist> REFERENCES <table><attrlist>
wordt nagekeken bij toevoegen of wijzigen van tupels in tabel
wordt nagekeken bij verwijderen of wijzigen van tupels in verwijzende tabel
30
31. referentiële integriteit
• Dno in EMPLOYEE verwijst altijd naar een bestaand
Dnumber in DEPARTMENT
foreign key primary key
33. referentiële integriteit
• Dno in EMPLOYEE verwijst altijd naar een bestaand
dnumber in DEPARTMENT
foreign key primary key
6 6
6
34. restricties op attribuut
• NOT NULL (automatisch voor primaire sleutels)
• DEFAULT <value>
• CHECK (voorwaarde)
Dnumber INT NOT NULL CHECK (Dnumber > 0 AND Dnumber < 21);
worden nagekeken bij toevoegen of wijzigen van attribuutwaarden
34
35. algemene restricties specificeren
• andere restricties dan sleutel-, entiteits- en referentiële
restricties opgeven: ASSERTION
• algemene vorm:
CREATE ASSERTION <name> CHECK <cond>
35
36. voorbeeld
– salaris van werknemer <= salaris van manager van dept.
waarvoor werknemer werkt
CREATE ASSERTION SALARY_CONSTRAINT
CHECK ( NOT EXISTS
( SELECT *
FROM EMPLOYEE E, EMPLOYEE M,
DEPARTMENT D
WHERE E.Salary > M.Salary
AND E.Dno = D.Dnumber
AND D.Mgr_ssn = M.Ssn) ) ;
36
37. werking
• bij creatie van een ASSERTION, wordt gecontroleerd of eraan voldaan is
• elke latere wijziging in de gegevensbank:
– slechts toegelaten indien aan de ASSERTION voldaan is
– dit kan veel extra werk vereisen!
• Voorbeeld: er moeten minstens drie werknemers per afdeling zijn.
CREATE ASSERTION NIET_MINDER_DAN_3 AS
CHECK (NOT EXISTS (SELECT e1.DNO
FROM (SELECT DISTINCT DNO FROM EMPLOYEE e1
WHERE 3 > (SELECT COUNT(*)
FROM EMPLOYEE e2
WHERE e2.DNO = e1.DNO)));
37
38. CHECK-clausule
• kan ook bij
– attribuut - definitie
– CREATE DOMAIN gebruikt worden
• domeinrestricties
• voorbeeld:
– departementsnummer kan slechts een gehele waarde tussen 1
en 20 zijn:
DNUMBER INT NOT NULL CHECK (DNUMBER > 0 AND
DNUMBER < 21);
CREATE DOMAIN D_NUM AS INTEGER
CHECK (D_NUM > 0 AND D_NUM < 21) ;
38
39. • CHECK
– wordt slechts gecontroleerd bij toevoegen of aanpassen van tupels,
slaat op attributen of tupels
– kan dus efficiënter geïmplementeerd worden
• ASSERTION
– is meer algemeen
39
40. andere mogelijkheden
• CREATE TRIGGER
• hierbij wordt de te nemen actie opgegeven wanneer
niet aan de voorwaarde is voldaan
40
42. triggers
• een trigger bestaat uit 3 delen:
• een event (bv. update van een attribuut)
• een voorwaarde (bv. een query die nagekeken wordt)
• een actie (delete, update, insert)
• syntax
CREATE TRIGGER <name>
{ BEFORE | AFTER } <event> ON <table>
FOR EACH ROW
WHEN (<cond>)
<action>
42
43. voorbeeld
CREATE TRIGGER TotalSal1
AFTER INSERT ON EMPLOYEE
FOR EACH ROW
WHEN (NEW.Dno IS NOT NULL)
UPDATE DEPARTMENT
SET Total_sal = Total_sal + NEW.Salary
WHERE Dno = NEW.Dno
43
44. elementen van triggers
• timing van uitvoering van de actie
– before
– after
– instead of
• actie kan verwijzen naar oude of nieuwe toestand van
de gegevensbank
• conditie wordt gespecificeerd in WHEN clausule
44
48. relationele calculus
• vragen stellen d.m.v. omschrijving van de
resultaatverzameling
– relationele algebra beschrijft operaties om tot het resultaat te
komen ( b.v. projecteer, ...) proceduraal
– relationele calculus beschrijft condities waaraan het resultaat
moet voldoen declaratief
• omschrijving wordt gegeven in predikatenlogica
• relationele calculus omvat
– tupelcalculus: maakt gebruik van tupelvariabelen
– domeincalculus: domeinvariabelen stellen een
attribuutwaarde voor
Waarop lijkt SQL het meest?
48
49. tupelcalculus
{ t1.A1, t2.A2, ..., tn.An | COND(t1, t2,... tn, tn+1,..., tn+m) }
– ti : tupelvariabele (niet noodzakelijk verschillend)
– Ai: attribuutnaam, horende bij de relatie ti
– COND: een voorwaarde (of “well formed formula” - WFF)
– ti links van "|" = alle variabelen die vrij voorkomen (niet gebonden
door of ) in de COND
49
50. voorbeeld
• Q_0
– Geef de geboortedatum en het adres van de werknemer (of de
werknemers) met naam ‘John Smith’
t.Fname = ‘John’
{ t.Bdate, t.Address | EMPLOYEE(t) andand
t.Lname = ‘Smith’ }
t.Fname = ‘John’ and t.Lname = ‘Smith’ }
50
51. existentiële quantor:
• Q_1
– Geef naam en adres van alle werknemers die voor het
'Research' departement werken
{ t.Fname, t.Lname, t.Address | EMPLOYEE(t)
AND (d) (DEPARTMENT(d)
AND d.Dname = 'Research’
AND d.Number = t.Dno) }
existentiële quantor: moet waar zijn voor tenminste één tuple
we vragen werknemers op waarvoor er een gerelateerd tupel
in de departement tabel bestaat met als naam ‘Research’
52. gebruik van universele quantoren
• (x) (P(x))
– waar als P(x) waar is voor elke x van het universum
– bv. (x) (x.color = “Rood”)
– betekent dat alles wat bestaat rood is
• logische implicatie
– (x) (Boot(x) (x.color = “Rood”))
– (x) IF Boot(x) THEN (x.color = “Rood”)
– Als x een boot is, dan moet de kleur rood zijn
52
53. gebruik van universele quantoren
• (x) (Boot(x) (x.color = ‘Rood’))
• (x) (Boot(x) x.color = ‘Rood’)
– X is geen boot: conditie is waar
– X is een boot: x.color=‘Rood’ moet waar zijn
53
54. voorbeeld universele quantor
• Q_6
– Geef de namen van alle werknemers zonder personen ten
laste:
{e.Fname, e.Lname |
EMPLOYEE(e) AND
( (d) ( NOT (DEPENDENT(d)) OR NOT (e.Ssn = d.Essn) ) ) }
54
55. Quantoren in SQL
• EXISTS
•
– bestaat niet:
– gebruik not ( x ): NOT EXISTS
55
56. domein relationele calculus
– Analoog aan tupelcalculus, maar variabelen verwijzen naar een
attribuutwaarde i.p.v. een heel tupel
– Vorm van query:
{ x1, ..., xn | COND (x1, x2, ..., xn+m ) }
– Voorbeeld:
• { v f | EMPLOYEE ( v, m, f, s, b, a, g, w, c, d ) }
– COND = atomen + connectoren + quantoren
• is een WWF (well formed formule)
• net als bij tupelcalculus
• atoom = R(x1,...,xn) of "xi xj" of "xi c"} met R een relatienaam,
{ <, >, =, } en c een constante
56
57. • Q_0
– Geef geboortedatum en adres van werknemer John B. Smith
{ u v | ( q) ( r) ( s) ( t) ( w) ( x) ( y) ( z)
( EMPLOYEE ( qrstuvwxyz )
AND q = 'John' AND r = 'B' AND s = 'Smith’ ) }
– praktisch worden alleen de variabelen gequantificeerd die
in een voorwaarde voorkomen:
{ u v | ( q) ( r) ( s)
( EMPLOYEE ( qrstuvwxyz )
AND q = 'John' AND r = 'B' AND s = 'Smith’ ) }
– Nog kortere vorm (constanten direct ingevuld) :
{ u v | (EMPLOYEE('John', 'B', 'Smith', t, u, v, w, x, y, z ) }
57
58. • Q_1
– Geef naam en adres van alle werknemers die voor
departement 'Research' werken:
{q s v | ( z) ( l) ( m) ( EMPLOYEE( qrstuvwxyz ) AND
( DEPARTMENT( lmno )
AND l = 'Research' AND m = z) ) }
58
59. – Q_2
• Geef voor elk project in Stafford nummer, nummer van
controlerend dept. en de managers familienaam,
geboortedatum en adres:
{i k s u v | ( j) ( m) ( n) ( t)
( PROJECT ( h i j k ) AND
EMPLOYEE ( q r s t u v w x y z )
AND DEPARTMENT ( l m n o )
AND k = m AND n = t AND j = 'Stafford' ) }
59
60. • Q_6
• Geef de namen van alle werknemers zonder personen ten laste:
{q s | ( t ) (EMPLOYEE ( q r s t u v w x y z )
AND ( NOT ( l ) (DEPENDENT ( l m n o p )
AND t = l ) ) ) }
{q s | ( t ) ( EMPLOYEE ( q r s t u v w x y z )
AND ( ( l ) ( NOT ( DEPENDENT ( l m n o p ) )
OR NOT t = l ) ) ) ) }
60