20130305 GB les 5

4,168 views

Published on

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
4,168
On SlideShare
0
From Embeds
0
Number of Embeds
10
Actions
Shares
0
Downloads
51
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

20130305 GB les 5

  1. 1. SQL – deel 2Matthijs van Leeuwenmatthijs.vanleeuwen@cs.kuleuven.be2012 - 2013 Slides grotendeels door: Katrien Verbert
  2. 2. inhoud deze les• views• geneste queries• transacties• permissies• algemene restricties• triggers• herhaling: relationele calculus – vooral domeincalculus 2
  3. 3. VIEWS
  4. 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. 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. 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. 7. verwijderen van view• DROP VIEW (cf. gewone tabel) – voorbeeld: DROP VIEW WORKS_ON1; – geen verwijdering van tupels 7
  8. 8. twee benaderingen voor implementatie1. query modification – query op view wordt omgevormd tot query op onderliggende tabellen; – nadeel: kan tot complexe en tijdsintensieve queries leiden2. 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. 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. 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. 11. wijzigen van view• View  1 basisrelatie: – aanpassing aan view  aanpassing aan basisrelatie• View  join van meerdere basisrelaties: – welke relatie(s) aanpassen? 11
  12. 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. 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. 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
  15. 15. GENESTE QUERIES
  16. 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. 17. ALL• vergelijking met verzameling waarden• >, <, >=, <=, =, <> SELECT  Lname, Fname FROM EMPLOYEE WHERE Salary > ALL (SELECT Salary FROM EMPLOYEE WHERE Dno=5)  17
  18. 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. 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
  20. 20. TRANSACTIES
  21. 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. 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. 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
  24. 24. PERMISSIES
  25. 25. permissies geven• met GRANT kun je gebruikers rechten geven GRANT <rechten> ON <schema, tabel, tabel(attribuutlijst)> TO <gebruiker> ; 25
  26. 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. 27. REVOKE• met REVOKE kun je rechten weer ontnemen REVOKE INSERT, DELETE ON EMPLOYEE, DEPARTMENT FROM UserX; 27
  28. 28. ASSERTIONS
  29. 29. ter herinnering• restricties op tabellen• restricties op attribuutwaarden 29
  30. 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. 31. referentiële integriteit• Dno in EMPLOYEE verwijst altijd naar een bestaand Dnumber in DEPARTMENT foreign key primary key
  32. 32. 32
  33. 33. referentiële integriteit• Dno in EMPLOYEE verwijst altijd naar een bestaand dnumber in DEPARTMENT foreign key primary key 6 6 6
  34. 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. 35. algemene restricties specificeren• andere restricties dan sleutel-, entiteits- en referentiële restricties opgeven: ASSERTION• algemene vorm: CREATE ASSERTION <name> CHECK <cond> 35
  36. 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. 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. 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. 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. 40. andere mogelijkheden• CREATE TRIGGER• hierbij wordt de te nemen actie opgegeven wanneer niet aan de voorwaarde is voldaan 40
  41. 41. TRIGGERS
  42. 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. 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. 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
  45. 45. samengevat• SQL ..• alles wat je altijd al met gegevensbanken wilde doen? 45
  46. 46. VRAGEN? 46
  47. 47. relationele calculus herhaling 47
  48. 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. 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. 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. 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 tuplewe vragen werknemers op waarvoor er een gerelateerd tupelin de departement tabel bestaat met als naam ‘Research’
  52. 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. 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. 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. 55. Quantoren in SQL•  EXISTS•  – bestaat niet: – gebruik not (  x ): NOT EXISTS 55
  56. 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. 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. 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. 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. 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
  61. 61. VRAGEN? 61

×