SQL – deel 2Katrien Verbertkatrien.verbert@cs.kuleuven.be
SQL•  vorige week: basisconcepten•  vandaag: geavanceerde concepten, demo MS Access 2010                                  ...
queries in SQL•  Basisvorm van een vraag (query):            SELECT <a$ributen lijst>                   FROM     <tabellen...
voorbeeld•  Q_0: geef de geboortedatum en het adres van   werknemer John B. Smith   SELECT       Bdate, Address    FROM   ...
•  Q1B: geef naam en adres van alle werknemers die voor   het "research" departement werken    SELECT     E.Fname, E.Lname...
geneste queries•  geneste queries   –  sommige queries vereisen ophalen van bestaande waarden en      het gebruik ervan in...
voorbeeld  –  Q 4A: geef alle projecten waarbij Smith betrokken is als     manager van het controlerend departement of waa...
 Geef namen van departementen die zich bevinden in België.                                              select  ?         ...
 SELECT dname       FROM department d, dept_loca3ons l       WHERE d.dnumber=l.dnumber and l.dloca3on=‘België’      SELECT...
CONTAINS•  CONTAINS: "... heeft als deelverzameling ... "•  vgl. met deling   –  vb: geef de naam van elke werknemer die w...
oefening: find the names of sailors who have reserved all boats                          Relationele algebraReserves      ...
oefening: find the names of sailors who have reserved all boats                          Relationele algebraReserves      ...
EXISTS functie in SQL•  controleert of verzameling leeg is of niet•  geeft TRUE indien er ten minste één element is, zonie...
NOT EXISTS•  geeft TRUE als de verzameling leeg is•  Q 6: geef de namen van de werknemers die geen   personen ten laste he...
–  Q 7: Geef de namen van de managers die tenminste één   persoon ten laste hebben           SELECT  Fname, Lname         ...
NOT EXISTS•  CONTAINS kan ook herschreven worden met NOT EXISTS•  Q 3 B herformulering:   –  geef alle werknemers waarvoor...
oefening: find the names of sailors whohave reserved all boats SELECT sname  FROM sailors s  WHERE ((SELECT bid FROM reser...
expliciete verzamelingen•  verzameling constanten :   –  vb. (1,2,3)•  zoek de social security numbers of alle werknemers ...
hernoeming van attributen en tabellenmet AS•  Q 8 A   –  geef de familienaam van elke werknemer met de familienaam      va...
joins•  JOIN operaties kunnen expliciet opgegeven worden   –  verhoogt de duidelijkheid   –  join condities gescheiden van...
voorbeeld•  Q 1 A   –  geef naam en adres van alle werknemers die voor het      “Research” departement werken  SELECT     ...
voorbeeld•  Q 8 B   –  geef de familienaam van elke werknemer met de familienaam van zijn/      haar supervisor    SELECT ...
aggregaatfuncties•  Ingebouwde functies:   –  COUNT, SUM, MAX, MIN, AVG•  voorbeeld: zoek som, maximum, minimum en   gemid...
aggregaatfuncties –  Q 20    •  zoek som, maximum, minimum, gemiddelde, van de salarissen van alle       werknemers uit he...
aggregaatfuncties•  bepaal totaal aantal werknemers       SELECT       COUNT(*)        FROM         EMPLOYEE ; •  bepaal a...
aggregaatfuncties  –  gebruik binnen WHERE (voor geneste queries):  –  voorbeeld: geef alle werknemers die minstens 2 pers...
groepering•  Groeperen van tupels : GROUP BY   –  aggregaatfuncties worden voor elke groep afzonderlijk toegepast•  voorbe...
•  geef voor elk project nr, naam en aantal mensen die   eraan werken          SELECT                Pnumber, Pname, COUNT...
•  geef voor elk project, het projectnummer, de projectnaam,   en het aantal werknemers van departement 5 die op dat   pro...
oppassen met condities•  WHERE selecteert tupels vóór groepering•  HAVING selecteert achteraf groepen•  voorbeeld:   –  ge...
•  Correcte formulering:   –  Geef voor elk departement met minstens 5 werknemers het      totaal aantal werknemers met sa...
algemene vorm van SQL-queries  SELECT              < a$ributen‐ en func3e‐lijst >   FROM                < tabellenlijst > ...
aanpassingen maken in SQL•  Toevoegen:   INSERT•  Weglaten:    DELETE•  Wijzigen:    UPDATE                            33
toevoegen•  INSERT commando•  verschillende vormen   –  zonder expliciete vermelding van attributen:       •  volgorde res...
Meerdere tupels tegelijk toevoegen•  vaak meteen na creatie van tabel, laden van resultaat   van een queryCREATE TABLE    ...
weglaten van tupels•  DELETE FROM <tabel> WHERE <conditie>  –  alle tupels die aan conditie voldoen worden weggelaten  –  ...
wijzigen van tupels•  UPDATE <tabel> SET { < attr > = < expr > , … }       WHERE <conditie>          •  selecteer te wijzi...
views in SQL•  “view" = afgeleide relatie   –  tupels worden niet expliciet opgeslagen   –  maar worden berekend uit ander...
specificeren van een view•  sytax       CREATE VIEW     <viewname> [ < lijst van attribuutnamen> ]       AS              <...
gebruik van views•  queries op view: zoals bij gewone tabellen              SELECT  Fname, Lname               FROM  WORKS...
weglaten van view•  DROP VIEW (cf. gewone tabel)   –  voorbeeld:          DROP VIEW       WORKS_ON1;    –  geen verwijderi...
implementatie van views•  twee benaderingen:   –  query modification:       •  query op view wordt omgevormd tot query op ...
voorbeeld van query modification  –  de query QV1 op view WORKS_ON1         SELECT  Fname, Lname          FROM  WORKS_ON1 ...
wijzigen van view•  view is afgeleid uit andere relaties•  ⇒ wijziging moet doorgegeven worden aan andere relaties•  niet ...
wijzigen van view•  View ← 1 basisrelatie:   –  aanpassing aan view → aanpassing aan basisrelatie•  View ← join van meerde...
voorbeeld•  Wijzig PNAME van John Smith in WORKS_ON1 van ProductX   naar ProductY’             UPDATE      WORKS_ON1      ...
UPDATE            PROJECT    SET               Pname = ProductY    WHERE             Pname = ProductX’ ;   UPDATE         ...
wijzigen van views: algemeen•  een view afgeleid uit 1 tabel kan aangepast worden als   de view een primaire sleutel of ka...
ASSERTIONS
ter herinnering•  restricties op tabellen•  restricties op attribuutwaarden                                     50
restricties op tabellen•  primaire sleutel:         PRIMARY KEY <attrlist>•  alternatieve sleutel:     UNIQUE <attrlist>  ...
referentiële integriteit•    Dno in EMPLOYEE verwijst altijd naar een bestaand     dnumber in DEPARTMENT              fore...
53
referentiële integriteit•    Dno in EMPLOYEE verwijst altijd naar een bestaand     dnumber in DEPARTMENT              fore...
restricties op attribuut•  NOT NULL (automatisch voor primaire sleutels)•  DEFAULT <value>•  CHECK (voorwaarde)Dnumber INT...
algemene restricties specificeren•  andere restricties dan sleutel-, entiteits- en referentiële   restricties opgeven: ASS...
voorbeeld–  salaris van werknemer <= salaris van manager van dept.   waarvoor werknemer werkt        CREATE ASSERTION     ...
werking•  bij creatie van een ASSERTION, wordt gecontroleerd of eraan voldaan is•  elke latere wijziging in de gegevensban...
CHECK-clausule•  kan ook bij   –  attribuut - definitie   –  CREATE DOMAIN gebruikt worden•  → domeinrestricties•  voorbee...
•  CHECK  –  wordt slechts gecontroleerd bij toevoegen of aanpassen van tupels,     slaat op attributen of tupels  –  kan ...
andere mogelijkheden•  CREATE TRIGGER•  hierbij wordt de te nemen actie opgegeven wanneer niet   aan de voorwaarde voldaan...
TRIGGERS
triggers•  een trigger bestaat uit 3 delen:   •  een event (bv. update van een attribuut)   •  een voorwaarde (bv. een que...
voorbeeld    CREATE TRIGGER TotalSal1     AFTER INSERT ON EMPLOYEE      FOR EACH ROW     WHEN (NEW.DNO IS NOT NULL)       ...
elementen van triggers•  timing van uitvoering van de actie   –  before   –  after   –  instead of•  actie kan verwijzen n...
VRAGEN?Katrien.verbert@cs.kuleuven.be                                 67
SQL deel 2
Upcoming SlideShare
Loading in...5
×

SQL deel 2

1,591

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,591
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
127
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

SQL deel 2

  1. 1. SQL – deel 2Katrien Verbertkatrien.verbert@cs.kuleuven.be
  2. 2. SQL•  vorige week: basisconcepten•  vandaag: geavanceerde concepten, demo MS Access 2010 2
  3. 3. queries in SQL•  Basisvorm van een vraag (query): SELECT <a$ributen lijst>        FROM     <tabellen lijst>       WHERE  <condi3es> ;•  vgl. met relationele algebra: –  SELECT projectie –  FROM carthesisch product –  WHERE selectie 3
  4. 4. voorbeeld•  Q_0: geef de geboortedatum en het adres van werknemer John B. Smith SELECT   Bdate, Address  FROM       EMPLOYEE  WHERE   Fname=John AND Minit=B AND Lname=Smith’ ; Bdate Address ---------- ------------------------ 1965-01-09 731 Fondren, Houston, TX
  5. 5. •  Q1B: geef naam en adres van alle werknemers die voor het "research" departement werken SELECT   E.Fname, E.Lname, E.Address  FROM   EMPLOYEE  E, DEPARTMENT  D  WHERE   D.Dname = Research AND D.Dnumber = E.Dno ; 5
  6. 6. geneste queries•  geneste queries –  sommige queries vereisen ophalen van bestaande waarden en het gebruik ervan in voorwaarden; –  dat kan dikwijls op eenvoudige wijze geformuleerd worden met geneste queries.•  IN operator in conditie : –  test of tupel ∈ verzameling –  verzameling kan zelf door SQL-query bekomen zijn •  → geneste queries 6
  7. 7. voorbeeld –  Q 4A: geef alle projecten waarbij Smith betrokken is als manager van het controlerend departement of waaraan hij meewerkt SELECT  DISTINCT Pnumber  FROM   PROJECT  WHERE   Pnumber IN      (SELECT   Pnumber                        FROM   PROJECT, DEPARTMENT, EMPLOYEE                           WHERE   Dnum = Dnumber AND Mgr_ssn = Ssn                              AND Lname = Smith)        OR            Pnumber IN      (SELECT   Pno                          FROM   WORKS_ON, EMPLOYEE                          WHERE   Essn = Ssn AND Lname = Smith) ;  7
  8. 8.  Geef namen van departementen die zich bevinden in België.   select  ?   from   ?   where ?  8
  9. 9.  SELECT dname       FROM department d, dept_loca3ons l       WHERE d.dnumber=l.dnumber and l.dloca3on=‘België’   SELECT dname       FROM department d       WHERE d.dnumber in (SELECT l.dnumber                 FROM dept_loca3ons                WHERE l.dloca3on=‘België’)  9
  10. 10. CONTAINS•  CONTAINS: "... heeft als deelverzameling ... "•  vgl. met deling –  vb: geef de naam van elke werknemer die werkt op alle projecten gecontroleerd door departement nummer 5 SELECT   Fname, Lname  FROM   EMPLOYEE  WHERE   ( ( SELECT  Pno                 FROM     WORKS_ON                 WHERE   Ssn = Essn )            CONTAINS              ( SELECT  Pnumber                 FROM      PROJECT                 WHERE   Dnum = 5) ) ;  in oorspronkelijk system R, later meestal niet  geïmplementeerd in meeste versies van SQL  10
  11. 11. oefening: find the names of sailors who have reserved all boats Relationele algebraReserves temp←πsid,bid(Reserves)/πbid(Boats) result←πsname(temp*sailors)Sailors  select  ?   from   ?   where ? Boats
  12. 12. oefening: find the names of sailors who have reserved all boats Relationele algebraReserves temp←πsid,bid(Reserves)/πbid(Boats) result←πsname(temp*sailors)  SELECT sname Sailors  FROM sailors s   WHERE ((SELECT bid       FROM reserves r       WHERE r.sid=s.sid) Boats  CONTAINS     (SELECT bid       FROM boats))      
  13. 13. EXISTS functie in SQL•  controleert of verzameling leeg is of niet•  geeft TRUE indien er ten minste één element is, zoniet FALSE –  Q 16 B: geef de naam van elke werknemer die een persoon ten laste heeft met dezelfde voornaam als de werknemer SELECT   E.Fname,  E.Lname  FROM   EMPLOYEE AS E  WHERE  EXISTS   (SELECT  *                        FROM     DEPENDENT                        WHERE       E.Ssn = Essn                                AND      E.Fname = Dependent_name) ;  13
  14. 14. NOT EXISTS•  geeft TRUE als de verzameling leeg is•  Q 6: geef de namen van de werknemers die geen personen ten laste hebben SELECT   E.Fname, E.Lname  FROM   EMPLOYEE AS E  WHERE     NOT EXISTS  (SELECT  *                                FROM   DEPENDENT                                WHERE  E.Ssn = Essn) ;  14
  15. 15. –  Q 7: Geef de namen van de managers die tenminste één persoon ten laste hebben SELECT  Fname, Lname  FROM   EMPLOYEE   WHERE   EXISTS  ( SELECT *                      FROM      DEPENDENT                      WHERE   Ssn = Essn)                AND                 EXISTS  ( SELECT *                      FROM      DEPARTMENT                      WHERE   Ssn = Mgr_ssn) ; Kan dit ook met 1 geneste query / zonder geneste query? 15
  16. 16. NOT EXISTS•  CONTAINS kan ook herschreven worden met NOT EXISTS•  Q 3 B herformulering: –  geef alle werknemers waarvoor er geen project bestaat gecontroleerd door departement 5 waarop de werknemer niet werkt SELECT   Fname, Lname  FROM   EMPLOYEE E  WHERE    NOT EXISTS                  (SELECT   *                  FROM   WORKS_ON B                  WHERE   B.Pno IN   (SELECT   Pnumber                                   FROM   PROJECT                                   WHERE   Dnum = 5)                      AND                       NOT EXISTS  (SELECT *                                     FROM       WORKS_ON C                                               WHERE     C.Essn = E.Ssn                                                    AND          C.Pno = B.Pno) ) ; 
  17. 17. oefening: find the names of sailors whohave reserved all boats SELECT sname  FROM sailors s  WHERE ((SELECT bid FROM reserves r WHERE r.sid=s.sid)       CONTAINS        (SELECT bid FROM boats))  SELECT sname       FROM sailors s  EXISTS i.p.v. CONTAINS? Hoe met NOT WHERE NOT EXISTS ( SELECT bid          FROM boats b         WHERE NOT EXISTS ( SELECT bid               FROM reserves               WHERE r.sid=s.sid and                  b.bid = r.bid)) 
  18. 18. expliciete verzamelingen•  verzameling constanten : –  vb. (1,2,3)•  zoek de social security numbers of alle werknemers die werken op projecten nummer 1, 2 of 3 SELECT     DISTINCT Essn  FROM   WORKS_ON  WHERE   Pno IN (1,2,3) ; 18
  19. 19. hernoeming van attributen en tabellenmet AS•  Q 8 A –  geef de familienaam van elke werknemer met de familienaam van zijn/haar supervisor SELECT   E.Lname  AS  Employee_name             S.Lname  AS  Supervisor_Name  FROM   EMPLOYEE  AS  E, EMPLOYEE  AS  S  WHERE   E.Super_ssn = S.Ssn ;  19
  20. 20. joins•  JOIN operaties kunnen expliciet opgegeven worden –  verhoogt de duidelijkheid –  join condities gescheiden van selectiecondities•  FROM <tabel1> <jointype> <tabel2> ON <conditie> –  inwendige join: [ INNER ] JOIN –  uitwendig: { LEFT | RIGHT | FULL } [ OUTER ] JOIN –  natuurlijke : NATURAL JOIN 20
  21. 21. voorbeeld•  Q 1 A –  geef naam en adres van alle werknemers die voor het “Research” departement werken SELECT   Fname, Lname, Address  FROM   (EMPLOYEE JOIN DEPARTMENT ON Dno = Dnumber)  WHERE   Dname = Research’ ;SELECT   Fname, Lname, Address FROM   ( EMPLOYEE  NATURAL JOIN            ( DEPARTMENT AS  DEPT (Dname, Dno, Mssn, Msdate) ) ) WHERE   Dname = Research’ ;  21
  22. 22. voorbeeld•  Q 8 B –  geef de familienaam van elke werknemer met de familienaam van zijn/ haar supervisor SELECT   E.Lname  AS  Employee_name,             S.Lname  AS  Supervisor_name  FROM   (EMPLOYEE AS E  LEFT OUTER JOIN EMPLOYEE AS S            ON  E.Super_ssn = S.Ssn) ;  22
  23. 23. aggregaatfuncties•  Ingebouwde functies: –  COUNT, SUM, MAX, MIN, AVG•  voorbeeld: zoek som, maximum, minimum en gemiddelde van alle salarissen SELECT   SUM(Salary), MAX(Salary), MIN(Salary), AVG(Salary)  FROM   EMPLOYEE;  23
  24. 24. aggregaatfuncties –  Q 20 •  zoek som, maximum, minimum, gemiddelde, van de salarissen van alle werknemers uit het Research departement SELECT   SUM(Salary), MAX(Salary), MIN(Salary), AVG(Salary)  FROM   (EMPLOYEE JOIN DEPARTMENT ON Dno = Dnumber)  WHERE   DNAME = Research’ ;  24
  25. 25. aggregaatfuncties•  bepaal totaal aantal werknemers SELECT   COUNT(*)  FROM   EMPLOYEE ; •  bepaal aantal werknemers in departement Research’ SELECT   COUNT(*)  FROM   EMPLOYEE, DEPARTMENT  WHERE   Dno = Dnumber  AND  Dname = Research’ ;•  tel het aantal verschillende waarden voor salaris SELECT    COUNT (DISTINCT Salary)  FROM   EMPLOYEE ;  25
  26. 26. aggregaatfuncties –  gebruik binnen WHERE (voor geneste queries): –  voorbeeld: geef alle werknemers die minstens 2 personen ten laste hebben SELECT   Lname, Fname  FROM   EMPLOYEE  WHERE   ( SELECT   COUNT(*)               FROM   DEPENDENT               WHERE   Ssn = Essn ) >= 2 ; 26
  27. 27. groepering•  Groeperen van tupels : GROUP BY –  aggregaatfuncties worden voor elke groep afzonderlijk toegepast•  voorbeeld: geef voor elk departement het nummer, het aantal werknemers en het gemiddelde salaris SELECT      DNO, COUNT(*), AVG(Salary)  FROM      EMPLOYEE  GROUP BY   DNO ;  27
  28. 28. •  geef voor elk project nr, naam en aantal mensen die eraan werken SELECT     Pnumber, Pname, COUNT(*)  FROM     PROJECT, WORKS_ON  WHERE     Pnumber = Pno  GROUP BY     Pnumber, Pname ;•  .. enkel voor die projecten waar meer dan 2 mensen aan werken : met HAVING SELECT     Pnumber, Pname, COUNT(*)  FROM     PROJECT, WORKS_ON  WHERE     Pnumber = Pno  GROUP BY     Pnumber, Pname  HAVING     COUNT(*) > 2 ;  28
  29. 29. •  geef voor elk project, het projectnummer, de projectnaam, en het aantal werknemers van departement 5 die op dat project werken SELECT     Pnumber, Pname, COUNT(*)  FROM     PROJECT, WORKS_ON, EMPLOYEE  WHERE     Pnumber = Pno                           AND  Ssn = Essn        AND  Dno = 5  GROUP BY  Pnumber, Pname ;  29
  30. 30. oppassen met condities•  WHERE selecteert tupels vóór groepering•  HAVING selecteert achteraf groepen•  voorbeeld: –  geef voor elk departement met minstens 5 werknemers, de naam van het departement, het totaal aantal werknemers met salaris > 40 000 in dat departement –  Foute formulering: (wat is er fout aan?) SELECT     Dname, COUNT(*)  FROM     DEPARTMENT, EMPLOYEE  WHERE     Dnumber = Dno AND Salary > 40 000  GROUP BY     Dname  HAVING     COUNT(*) > 5 ;
  31. 31. •  Correcte formulering: –  Geef voor elk departement met minstens 5 werknemers het totaal aantal werknemers met salaris > 40 000 in dat departement SELECT     Dname, COUNT(*)  FROM     DEPARTMENT, EMPLOYEE  WHERE     Dnumber = Dno AND Salary > 40 000              AND  Dno IN  (SELECT       Dno                              FROM            EMPLOYEE                              GROUP BY    Dno                              HAVING    COUNT(*) > 5)  GROUP BY   Dname ;  31
  32. 32. algemene vorm van SQL-queries SELECT     < a$ributen‐ en func3e‐lijst >  FROM     < tabellenlijst >  [ WHERE     < voorwaarde > ]  [ GROUP BY   < groeperingsa$ributen > ]  [ HAVING     < groepvoorwaarde > ]  [ ORDER BY   < a$ributenlijst > ] ; –  SELECT: op te halen attributen / functies –  FROM: benodigde tabellen –  WHERE: voorwaarden op tupels –  GROUP BY: groepering (voor aggregaatfuncties) –  HAVING: voorwaarden op gevormde groepen –  ORDER: volgorde voor tonen van resultaat 32
  33. 33. aanpassingen maken in SQL•  Toevoegen: INSERT•  Weglaten: DELETE•  Wijzigen: UPDATE 33
  34. 34. toevoegen•  INSERT commando•  verschillende vormen –  zonder expliciete vermelding van attributen: •  volgorde respecteren –  met expliciete vermelding van attributen: •  nulls en defaults kunnen weggelaten worden INSERT INTO   EMPLOYEE  VALUES     (Richard, K, Marini, 653298653,                ‘1962‐12‐30, 98 Oak Forest, Katy, TX,                M, 37000, 987654321, 4) ;  INSERT INTO   EMPLOYEE (Fname, Lname, Ssn)  VALUES      (Richard, Marini, 653298653) ;  34
  35. 35. Meerdere tupels tegelijk toevoegen•  vaak meteen na creatie van tabel, laden van resultaat van een queryCREATE TABLE     DEPTS_INFO    ( Dept_name     VARCHAR(15),      No_of_emps     INTEGER,        Total_sal       INTEGER ); INSERT INTO              DEPTS_INFO (Dept_name,No_of_emps,Total_sal)   SELECT     Dname, COUNT(*), SUM(Salary)      FROM     ( DEPARTMENT JOIN EMPLOYEE ON          Dnumber = Dno )       GROUP BY   Dname ; In dit voorbeeld niet zon goed idee redundantie + mogelijk verlies van integriteit beter : view definiëren (zie later) 35
  36. 36. weglaten van tupels•  DELETE FROM <tabel> WHERE <conditie> –  alle tupels die aan conditie voldoen worden weggelaten –  geen WHERE deel: alle tupels weg •  ! tabel verdwijnt niet, wordt enkel leeg •  tabel kan weggelaten worden met DROP TABLE DELETE FROM   EMPLOYEE  WHERE     Lname =‘Brown ; DELETE FROM   EMPLOYEE  WHERE     Ssn =‘123456789 ; DELETE FROM   EMPLOYEE  WHERE     Dno IN   (SELECT   Dnumber                            FROM       DEPARTMENT                            WHERE    Dname = Research) ; DELETE FROM   EMPLOYEE ; 36
  37. 37. wijzigen van tupels•  UPDATE <tabel> SET { < attr > = < expr > , … } WHERE <conditie> •  selecteer te wijzigen tupels met WHERE-conditie •  ken voor die tupels nieuwe waarden aan attributen toe: in SET deel UPDATE   PROJECT  SET            Ploca3on = Bellaire, Dnum = 5  WHERE   Pnumber = 10 ;  UPDATE   EMPLOYEE  SET     Salary = Salary * 1.1  WHERE   Dno IN   (SELECT   Dnumber                      FROM   DEPARTMENT                      WHERE   Dname = Research) ; 37
  38. 38. views in SQL•  “view" = afgeleide relatie –  tupels worden niet expliciet opgeslagen –  maar worden berekend uit andere relaties (= de definiërende tabellen van de view) 38
  39. 39. specificeren van een view•  sytax 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 ; 39
  40. 40. gebruik van views•  queries op view: zoals bij gewone tabellen SELECT  Fname, Lname  FROM  WORKS_ON1  WHERE  Pname = ‘ProductX’ ; •  Voordelen van views? •  eenvoudiger formulering van queries •  beveiligingsmechanisme •  gebruiker zicht op deel van gegevensbank geven •  vs. nieuwe tabel (cf. DEPT_INFO): •  geen redundantie •  steeds up-to-date 40
  41. 41. weglaten van view•  DROP VIEW (cf. gewone tabel) –  voorbeeld: DROP VIEW  WORKS_ON1;  –  geen verwijdering van tupels 41
  42. 42. implementatie van views•  twee benaderingen: –  query modification: •  query op view wordt omgevormd tot query op onderliggende tabellen; •  nadeel: kan tot complexe en tijdsintensieve queries leiden –  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 weggelaten als ze een tijd niet meer gebruikt wordt 42
  43. 43. 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’ ;  43
  44. 44. wijzigen van view•  view is afgeleid uit andere relaties•  ⇒ wijziging moet doorgegeven worden aan andere relaties•  niet steeds mogelijk op eenduidige manier! 44
  45. 45. wijzigen van view•  View ← 1 basisrelatie: –  aanpassing aan view → aanpassing aan basisrelatie•  View ← join van meerdere basisrelaties: –  welke relaties aanpassen? 45
  46. 46. 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 ? 46
  47. 47. 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’ ; 47
  48. 48. 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 48
  49. 49. ASSERTIONS
  50. 50. ter herinnering•  restricties op tabellen•  restricties op attribuutwaarden 50
  51. 51. 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 51
  52. 52. referentiële integriteit•  Dno in EMPLOYEE verwijst altijd naar een bestaand dnumber in DEPARTMENT foreign key primary key
  53. 53. 53
  54. 54. referentiële integriteit•  Dno in EMPLOYEE verwijst altijd naar een bestaand dnumber in DEPARTMENT foreign key primary key 6 6 6
  55. 55. 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 55
  56. 56. algemene restricties specificeren•  andere restricties dan sleutel-, entiteits- en referentiële restricties opgeven: ASSERTION•  algemene vorm: CREATE ASSERTION <name> CHECK <cond>  56
  57. 57. 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) ) ; 57
  58. 58. 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)));  58
  59. 59. 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) ;  59
  60. 60. •  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 60
  61. 61. andere mogelijkheden•  CREATE TRIGGER•  hierbij wordt de te nemen actie opgegeven wanneer niet aan de voorwaarde voldaan is 61
  62. 62. TRIGGERS
  63. 63. triggers•  een trigger bestaat uit 3 delen: •  een event (bv. update van een attribuut) •  een voorwaarde (bv. een query die nagekeken wordt) •  een actie (bv. delete, update, insert)•  syntax CREATE TRIGGER <name>  { BEFORE | AFTER } <event> ON <table>   FOR EACH ROW  WHEN (<cond>)   <ac3on>  63
  64. 64. 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  64
  65. 65. 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 65
  66. 66. VRAGEN?Katrien.verbert@cs.kuleuven.be 67
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×