SQL – deel 2

Matthijs van Leeuwen
matthijs.vanleeuwen@cs.kuleuven.be

2012 - 2013




              Slides grotendeels door: Katrien Verbert
inhoud deze les

•   views
•   geneste queries
•   transacties
•   permissies
•   algemene restricties
•   triggers

• herhaling: relationele calculus
    – vooral domeincalculus




                                    2
VIEWS
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
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
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
verwijderen van view

• DROP VIEW (cf. gewone tabel)
  – voorbeeld:


        DROP VIEW       WORKS_ON1;




  – geen verwijdering van tupels




                                     7
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
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
wijzigen van view

• view is afgeleid uit andere relaties
•  wijziging moet doorgegeven worden aan andere relaties

• niet altijd mogelijk op eenduidige manier!




                                                       10
wijzigen van view

• View  1 basisrelatie:
   – aanpassing aan view  aanpassing aan basisrelatie


• View  join van meerdere basisrelaties:
   – welke relatie(s) aanpassen?




                                                         11
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
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
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
GENESTE QUERIES
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
ALL

• vergelijking met verzameling waarden
• >, <, >=, <=, =, <>

          SELECT    Lname, Fname
          FROM      EMPLOYEE
          WHERE     Salary > ALL
                           (SELECT   Salary
                           FROM      EMPLOYEE
                           WHERE     Dno=5) 




                                                17
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
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
TRANSACTIES
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
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
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
PERMISSIES
permissies geven

• met GRANT kun je gebruikers rechten geven



        GRANT   <rechten>
        ON      <schema, tabel, tabel(attribuutlijst)>
        TO      <gebruiker> ;




                                                         25
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
REVOKE

• met REVOKE kun je rechten weer ontnemen



           REVOKE   INSERT, DELETE
           ON       EMPLOYEE, DEPARTMENT
           FROM     UserX;




                                            27
ASSERTIONS
ter herinnering

• restricties op tabellen
• restricties op attribuutwaarden




                                    29
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
referentiële integriteit

•   Dno in EMPLOYEE verwijst altijd naar een bestaand
    Dnumber in DEPARTMENT



             foreign key                    primary key
32
referentiële integriteit

•   Dno in EMPLOYEE verwijst altijd naar een bestaand
    dnumber in DEPARTMENT



             foreign key                    primary key



                       6                6
                       6
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
algemene restricties specificeren
• andere restricties dan sleutel-, entiteits- en referentiële
  restricties opgeven: ASSERTION

• algemene vorm:

            CREATE ASSERTION <name> CHECK <cond>




                                                                35
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
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
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
• 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
andere mogelijkheden

• CREATE TRIGGER

• hierbij wordt de te nemen actie opgegeven wanneer
  niet aan de voorwaarde is voldaan




                                                      40
TRIGGERS
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
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
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
samengevat

• SQL ..
• alles wat je altijd al met gegevensbanken wilde doen?




                                                          45
VRAGEN?



          46
relationele calculus
       herhaling




                       47
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
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
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
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’
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
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
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
Quantoren in SQL

•                         EXISTS
• 
  – bestaat niet:
  – gebruik not (  x ):   NOT EXISTS




                                        55
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
• 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
• 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
– 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
• 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
VRAGEN?



          61

20130305 GB les 5

  • 1.
    SQL – deel2 Matthijs van Leeuwen matthijs.vanleeuwen@cs.kuleuven.be 2012 - 2013 Slides grotendeels door: Katrien Verbert
  • 2.
    inhoud deze les • views • geneste queries • transacties • permissies • algemene restricties • triggers • herhaling: relationele calculus – vooral domeincalculus 2
  • 3.
  • 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 eenview • 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 voorimplementatie 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 querymodification – 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
  • 15.
  • 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 metverzameling 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
  • 20.
  • 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 • metROLLBACK 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.
  • 25.
    permissies geven • metGRANT 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 REVOKEkun je rechten weer ontnemen REVOKE INSERT, DELETE ON EMPLOYEE, DEPARTMENT FROM UserX; 27
  • 28.
  • 29.
    ter herinnering • restrictiesop tabellen • restricties op attribuutwaarden 29
  • 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
  • 32.
  • 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 vanwerknemer <= 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 ookbij – 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 • CREATETRIGGER • hierbij wordt de te nemen actie opgegeven wanneer niet aan de voorwaarde is voldaan 40
  • 41.
  • 42.
    triggers • een triggerbestaat 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
  • 45.
    samengevat • SQL .. •alles wat je altijd al met gegevensbanken wilde doen? 45
  • 46.
  • 47.
  • 48.
    relationele calculus • vragenstellen 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 universelequantoren • (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 universelequantoren • (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
  • 61.