SlideShare una empresa de Scribd logo
1 de 61
Descargar para leer sin conexión
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

Más contenido relacionado

Destacado

Training Schrijven voor het Web
Training Schrijven voor het WebTraining Schrijven voor het Web
Training Schrijven voor het WebSimone Levie
 
Marco del buen desempeño docente
Marco del buen desempeño docenteMarco del buen desempeño docente
Marco del buen desempeño docente0013
 
De Reis van de Heldin december 2015
De Reis van de Heldin december 2015De Reis van de Heldin december 2015
De Reis van de Heldin december 2015Peter de Kuster
 
Error messages
Error messagesError messages
Error messagesrtinkelman
 
Gfpi f-019 guia de aprendizaje 01 tda orientar fpi
Gfpi f-019 guia de aprendizaje 01 tda orientar fpiGfpi f-019 guia de aprendizaje 01 tda orientar fpi
Gfpi f-019 guia de aprendizaje 01 tda orientar fpilisbet bravo
 
Análisis situacional integral de salud final
 Análisis situacional integral de salud final Análisis situacional integral de salud final
Análisis situacional integral de salud finalEstefanía Echeverría
 
JULIOPARI - Elaborando un Plan de Negocios
JULIOPARI - Elaborando un Plan de NegociosJULIOPARI - Elaborando un Plan de Negocios
JULIOPARI - Elaborando un Plan de NegociosJulio Pari
 
1ºBACH Economía Tema 5 Oferta y demanda
1ºBACH Economía Tema 5 Oferta y demanda1ºBACH Economía Tema 5 Oferta y demanda
1ºBACH Economía Tema 5 Oferta y demandaGeohistoria23
 
Onderzoeksrapport acrs v3.0_definitief
Onderzoeksrapport acrs v3.0_definitiefOnderzoeksrapport acrs v3.0_definitief
Onderzoeksrapport acrs v3.0_definitiefrloggen
 
Como hacer un plan de negocios
Como hacer un plan de negociosComo hacer un plan de negocios
Como hacer un plan de negociosXPINNERPablo
 
Schrijven voor het web
Schrijven voor het webSchrijven voor het web
Schrijven voor het webSimone Levie
 
Evidence: Describing my kitchen. ENGLISH DOT WORKS 2. SENA.
Evidence: Describing my kitchen. ENGLISH DOT WORKS 2. SENA.Evidence: Describing my kitchen. ENGLISH DOT WORKS 2. SENA.
Evidence: Describing my kitchen. ENGLISH DOT WORKS 2. SENA... ..
 
Estrategias competitivas básicas
Estrategias competitivas básicasEstrategias competitivas básicas
Estrategias competitivas básicasLarryJimenez
 

Destacado (20)

Training Schrijven voor het Web
Training Schrijven voor het WebTraining Schrijven voor het Web
Training Schrijven voor het Web
 
Marco del buen desempeño docente
Marco del buen desempeño docenteMarco del buen desempeño docente
Marco del buen desempeño docente
 
"Protección de la salud mental luego del terremoto y tsunami del 27 de febrer...
"Protección de la salud mental luego del terremoto y tsunami del 27 de febrer..."Protección de la salud mental luego del terremoto y tsunami del 27 de febrer...
"Protección de la salud mental luego del terremoto y tsunami del 27 de febrer...
 
De Reis van de Heldin december 2015
De Reis van de Heldin december 2015De Reis van de Heldin december 2015
De Reis van de Heldin december 2015
 
Error messages
Error messagesError messages
Error messages
 
Gfpi f-019 guia de aprendizaje 01 tda orientar fpi
Gfpi f-019 guia de aprendizaje 01 tda orientar fpiGfpi f-019 guia de aprendizaje 01 tda orientar fpi
Gfpi f-019 guia de aprendizaje 01 tda orientar fpi
 
Análisis situacional integral de salud final
 Análisis situacional integral de salud final Análisis situacional integral de salud final
Análisis situacional integral de salud final
 
Geheugen verbeteren
Geheugen verbeterenGeheugen verbeteren
Geheugen verbeteren
 
JULIOPARI - Elaborando un Plan de Negocios
JULIOPARI - Elaborando un Plan de NegociosJULIOPARI - Elaborando un Plan de Negocios
JULIOPARI - Elaborando un Plan de Negocios
 
Guia para el aviso de privacidad
Guia para el aviso de privacidadGuia para el aviso de privacidad
Guia para el aviso de privacidad
 
De impact van adhd
De impact van adhdDe impact van adhd
De impact van adhd
 
PMP Sonora Saludable 2010 2015
PMP Sonora Saludable 2010   2015  PMP Sonora Saludable 2010   2015
PMP Sonora Saludable 2010 2015
 
1ºBACH Economía Tema 5 Oferta y demanda
1ºBACH Economía Tema 5 Oferta y demanda1ºBACH Economía Tema 5 Oferta y demanda
1ºBACH Economía Tema 5 Oferta y demanda
 
Tears In The Rain
Tears In The RainTears In The Rain
Tears In The Rain
 
Onderzoeksrapport acrs v3.0_definitief
Onderzoeksrapport acrs v3.0_definitiefOnderzoeksrapport acrs v3.0_definitief
Onderzoeksrapport acrs v3.0_definitief
 
Como hacer un plan de negocios
Como hacer un plan de negociosComo hacer un plan de negocios
Como hacer un plan de negocios
 
Schrijven voor het web
Schrijven voor het webSchrijven voor het web
Schrijven voor het web
 
Evidence: Describing my kitchen. ENGLISH DOT WORKS 2. SENA.
Evidence: Describing my kitchen. ENGLISH DOT WORKS 2. SENA.Evidence: Describing my kitchen. ENGLISH DOT WORKS 2. SENA.
Evidence: Describing my kitchen. ENGLISH DOT WORKS 2. SENA.
 
Estrategias competitivas básicas
Estrategias competitivas básicasEstrategias competitivas básicas
Estrategias competitivas básicas
 
Cápsula 1. estudios de mercado
Cápsula 1. estudios de mercadoCápsula 1. estudios de mercado
Cápsula 1. estudios de mercado
 

20130305 GB les 5

  • 1. SQL – deel 2 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
  • 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
  • 29. ter herinnering • restricties op 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. 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 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
  • 45. samengevat • SQL .. • alles wat je altijd al met gegevensbanken wilde doen? 45
  • 46. VRAGEN? 46
  • 47. relationele calculus herhaling 47
  • 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
  • 61. VRAGEN? 61