SQL
Upcoming SlideShare
Loading in...5
×
 

SQL

on

  • 2,782 views

 

Statistics

Views

Total Views
2,782
Views on SlideShare
2,468
Embed Views
314

Actions

Likes
1
Downloads
134
Comments
1

4 Embeds 314

https://cygnus.cc.kuleuven.be 259
http://www.slideshare.net 49
https://canis-major.cc.kuleuven.be 5
https://www.linkedin.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-ShareAlike LicenseCC Attribution-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
  • Muchas gracias esta información me va ha servir de mucho.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

SQL SQL Presentation Transcript

  • SQL – deel 1 Katrien Verbert katrien.verbert@cs.kuleuven.be
  • SQL •  vandaag: basisconcepten, voorbeelden, oefeningen •  volgende week: geavanceerde concepten, extra voorbeeld 2
  • geschiedenis •  SEQUEL (Structured English Query Language) –  voor experimentele gegevensbank "System R" (IBM) •  → SQL (Structured Query Language) –  voor DB2, Oracle, INGRES/SQL, ... –  eerste commerciële versie: Oracle in 1979 3
  • standaardisatie: ANSI - ISO •  SQL1 : 1986 •  SQL2 of SQL92 : 1992 –  “levels of conformance”: entry – intemediate - full •  SQL99 : 1999 –  aanvullingen met o.a. nieuwe data types, object-georiënteerde concepten en triggers –  levels of conformance: Core SQL:1999 - Enhanced SQL:1999 de meeste implementaties van SQL verschillen in meer of mindere mate van de standaard 4
  • SQL 2003 •  ongeveer zelfde Core als SQL99 •  nieuwe object-relationele features (multiset, array types, etc.) •  XML-gerelateerde features (SQL/XML) •  meer functies (sequentiegenerator, merge) •  datawarehousing features •  verfijning van bestaande features 5
  • terminologie •  relationeel model •  SQL –  schema –  schema –  relatie –  tabel –  tupel –  rij –  attribuut –  kolom 6
  • schema •  bevat –  schema-naam –  eigenaar en –  beschrijving van elementen •  tabellen •  restricties (constraints) •  views •  domeinen •  autorisaties •  … •  creatie van schema: CREATE SCHEMA CREATE SCHEMA COMPANY   AUTHORIZATION Jsmith ; 7
  • cataloog •  = een verzameling gegevensbankschema's in een “SQL omgeving” •  de cataloog bevat één speciaal schema: INFORMATION_SCHEMA •  integriteitsrestricties kunnen opgelegd worden tussen relaties in cataloog •  schema’s binnen eenzelfde cataloog kunnen elementen delen 8
  • creatie van een tabel CREATE TABLE  [ <schema name >. ] <table name>       ( { <column name> <column type> [<aAribute constraint>] }         {<table constraint>} *)  •  naam •  voor alle attributen: –  naam + SQL-gegevenstype + restricties •  restricties 9
  • numerieke gegevenstypes en domeinen •  gehele waarden: –  INTEGER - INT –  SMALLINT •  niet gehele waarden: –  FLOAT – REAL –  DOUBLE PRECISION •  geformateerde getallen: –  DECIMAL (i, j) – DEC (i, j) – NUMERIC (i, j) met i: precisie (= totaal aantal dec.cijfers) j: schaal (= aantal cijfers na dec. punt) 11
  • karakter strings •  string met vaste lengte: –  CHAR (n) – CHARACTER (n) •  string met variabele lengte: –  VARCHAR(n) – CHAR VARYING (n) – CHARACTER VARYING (n) •  notatie van waarden: tussen apostrofs: ‘abc‘ 12
  • gegevenstypes en domeinen in SQL •  bit strings: –  met vaste lengte: BIT (n) –  met variabele lengte: BIT VARYING (n) –  notatie van waarden: B’10101’ •  logische waarden –  BOOLEAN –  mogelijke waarden: TRUE FALSE UNKNOWN 13
  • datum en tijd •  DATE –  10 posities: YYYY-MM-DD –  DATE’2004-02-23’ •  TIME –  ten minste 8 posities: HH:MM:SS –  TIME’09:12:47’ •  TIMESTAMP –  DATE en TIME en 6 posities voor fracties van seconden: –  TIMESTAMP’2004-02-23 09:12:47 648302’ 14
  • in verschillende implementaties •  namen kunnen verschillen •  soms nog meer variaties in types •  voorbeeld: –  http://en.wikipedia.org/wiki/ Comparison_of_relational_database_management_systems 15
  • definitie van type van een attribuut •  ofwel rechtstreeks •  ofwel via definitie van domein CREATE DOMAIN  SSN_TYPE AS CHAR(9) ; 16
  • definiëren van restricties op tabel •  Soorten: –  primaire sleutel: PRIMARY KEY <attrlist> –  alternatieve sleutel: UNIQUE <attrlist> –  verwijssleutel: FOREIGN KEY <attrlist> REFERENCES <table><attrlist> •  Actie bij schending van referentiële integriteit: –  bij trigger: ON DELETE / ON UPDATE –  actie: SET NULL / CASCADE / SET DEFAULT 17
  • restricties op attribuut •  NOT NULL (automatisch voor primaire sleutels) •  DEFAULT <value> •  CHECK (voorwaarde) –  kan ook samen met domein declaratie Dnumber INT NOT NULL CHECK (Dnumber > 0 AND Dnumber <  21);  19
  • specificeren van restricties •  twee mogelijkheden –  onmiddellijk bij tabel of attribuut –  met sleutelwoord ‘CONSTRAINT’ en het geven van een naam •  geeft de mogelijkheid om de restrictie later gemakkelijk aan te passen, weg te laten,…. 20
  • weglaten van tabel / schema •  Drop behaviour voor schema: –  CASCADE: •  schema + alle tabellen erin weglaten –  RESTRICT: •  schema enkel weglaten als het leeg is •  Drop behaviour voor tabel: –  CASCADE: •  alle restricties en views die aan de tabel refereren worden mee weggelaten –  RESTRICT: •  tabel enkel weglaten als er geen restricties of views naar verwijzen DROP SCHEMA  <name> <drop behaviour>  DROP TABLE      <name> <drop behaviour>  22
  • wijzigen van tabel ALTER TABLE <name>           {   ADD      <column name> <column type>    | DROP   <column name> <drop behaviour>    | ALTER  <column name> <default opVon>    | ADD  CONSTRAINT    <constraint definiVon>    | DROP  CONSTRAINT  <constraint name>  <drop  behaviour> } –  <drop behaviour> = •  CASCADE | RESTRICT –  <default option> = •  DROP DEFAULT | SET DEFAULT <value> 23
  • ALTER TABLE  COMPANY.EMPLOYEE   ADD COLUMN Job VARCHAR(12) ; ALTER TABLE  COMPANY.EMPLOYEE   DROP COLUMN Address CASCADE ; ALTER TABLE  COMPANY.DEPARTMENT   ALTER COLUMN Mgr_ssn DROP DEFAULT ; ALTER TABLE  COMPANY.DEPARTMENT   ALTER COLUMN Mgr_ssn SET DEFAULT ‘33445555’ ; ALTER TABLE  COMPANY.EMPLOYEE   DROP CONSTRAINT EMPSUPERFK CASCADE ; 24
  • opvragingen (queries) in SQL •  Basisvorm van een vraag (query): SELECT <aAributen lijst>        FROM     <tabellen lijst>       WHERE  <condiVes> ; •  vgl. met relationele algebra: –  SELECT projectie –  FROM carthesisch product –  WHERE selectie 25
  • 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 In relaVonele algebra:   πBdate,Address (σ Fname = 'John'  AND  Minit = ‘John’  AND  Lname =  ‘Smith’ (EMPLOYEE) ) 
  • •  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 ; •  vergelijk met uitdrukking in tupel relationele calculus { t.Fname, t.Lname, t.Address | EMPLOYEE(t)                       AND (∃d) (DEPARTMENT(d)                                     AND d.Dname = 'Research’                                    AND d.Number = t.Dno) }  27
  •  geef namen van projecten die gecontroleerd worden door  departement 5   select  ?   from   ?   where ?  28
  •  SELECT pname FROM project WHERE dnum=5;   geef social security numbers van werknemers die werken aan  projecten die gecontroleerd worden door departement 5   select  ?   from   ?   where ?  29
  •  SELECT pname, essn FROM project, works_on   WHERE dnum=5 and pno=pnumber;   geef voornaam en familienaam van werknemers die werken aan  projecten die gecontroleerd worden door departement 5   select  ?   from   ?   where ?  30
  • SELECT pname  FROM project  WHERE dnum=5;  SELECT pname, essn  FROM project, works_on  WHERE dnum=5 and pno=pnumber;  SELECT pname, fname, lname   FROM project, works_on, employee   WHERE dnum=5 and pno=pnumber and essn=ssn;  31
  • voorbeeld •  geef voor elk project dat als locatie Stafford heeft, het projectnummer, nummer van het departement dat het leidt, en de familienaam, adres en geboortedatum van de manager van dat departement SELECT   Pnumber, Dnum, Lname, Address, Bdate  FROM   PROJECT, DEPARTMENT, EMPLOYEE  WHERE   Dnum = Dnumber  AND  Mgr_ssn = Ssn            AND  PlocaVon = 'Stafford’ ;  Pnumber Dnum Lname Address Bdate ------- ---- resultaat: ------- ----------------------- ---------- 10 4 Wallace 291 Berry, Bellaire, TX 1941-06-20 30 4 Wallace 291 Berry, Bellaire, TX 1941-06-20
  • dubbelzinnige attribuutnamen •  Tot nog toe: steeds duidelijk bij welke relatie een attribuut behoorde •  Wat indien dit niet het geval is? vb. attributen Name en Dnumber (i.p.v. Dno) in EMPLOYEE en DEPARTMENT tabel •  Oplossing: attribuutnaam = <tabel>.<attribuut> SELECT   Fname, EMPLOYEE.Name, Address  FROM   EMPLOYEE, DEPARTMENT  WHERE   DEPARTMENT.Name = 'Research'            AND DEPARTMENT.Dnumber = EMPLOYEE.Dnumber ;
  • aliasen •  voorbeeld: –  geef voor elke werknemer de voor- en familienaam en de familienaam van zijn/haar supervisor –  2 verwijzingen naar EMPLOYEE: een voor werknemer zelf, een voor supervisor •  hoe van elkaar onderscheiden? •  "aliases": de verwijzingen krijgen aparte namen SELECT   E.Fname,  E.Lname, S.Fname, S.Lname  FROM   EMPLOYEE  AS E,   EMPLOYEE AS S  WHERE   E.Super_ssn = S.Ssn ; 34
  • aliasen –  Q 8: for each employee, retrieve the employee’s first and last name and the last name of his or her immediate supervisor SELECT   E.Fname,  E.Lname, S.Fname, S.Lname  FROM   EMPLOYEE  AS E,   EMPLOYEE AS S  WHERE   E.Super_ssn = S.Ssn ; SELECT   E.Fname,  E.Lname, S.Fname, S.Lname  FROM   EMPLOYEE  E  S  WHERE   E.Super_ssn = S.Ssn ;  –  Definitie: - onmiddellijk na de naam van de relatie - na sleutelwoord AS 35
  • weglaten van WHERE en van attributenlijst •  WHERE kan weggelaten worden: geen selectie SELECT   Ssn  FROM   EMPLOYEE ; SELECT   Ssn, Dname  FROM   EMPLOYEE, DEPARTMENT ; carthesisch product 36
  • weglaten van WHERE en van attributenlijst •  Alle attributen selecteren (met *) : geen projectie SELECT   *  FROM   EMPLOYEE  WHERE     Dno = 5 ; SELECT   *  FROM   EMPLOYEE, DEPARTMENT  WHERE   Dname = 'Research' AND Dno = Dnumber ; SELECT   *  FROM   EMPLOYEE, DEPARTMENT ; 37
  • Verschil tussen tabellen en relaties •  een relatie uit het relationeel model is een verzameling tupels en bevat dus geen dubbels •  SQL elimineert niet automatisch dubbels 38
  • SELECT  Salary  •  Vermijden van dubbels: FROM   EMPLOYEE ; SELECT DISTINCT equivalent met SELECT   ALL Salary  SELECT   DISTINCT Salary  FROM       EMPLOYEE ; FROM       EMPLOYEE ; Salary Salary ------ ------ 30000 30000 40000 40000 25000 25000 43000 43000 38000 38000 25000 55000 25000 55000 39
  • Verzameling-bewerkingen in SQL –  UNION, INTERSECT, EXCEPT (= verschil) –  relaties moeten vergelijkbaar zijn •  zelfde attribuuttypes in zelfde volgorde –  dubbels worden automatisch verwijderd –  vb: Q 4: •  geef alle projecten waarbij Smith betrokken is als manager van het controlerend departement of waaraan hij meewerkt (SELECT   DISTINCT Pnumber   FROM   PROJECT, DEPARTMENT, EMPLOYEE   WHERE   Dnum = Dnumber AND Mgr_ssn = Ssn AND Lname = 'Smith')   UNION  (SELECT   DISTINCT Pnumber   FROM   PROJECT, WORKS_ON, EMPLOYEE   WHERE   Pno = Pnumber AND Essn = Ssn AND Lname = 'Smith') ;
  • operaties die slaan op multisets •  sleutelwoord ALL na de operator: –  UNION ALL –  EXCEPT ALL –  INTERSECT ALL R  A  S  A  T  A  V  A  W  A  a1  a1  a1  a2  a1  a2  a2  a1  a3  a2  a2  a4  a2  a3  a5  a2  a2  T ← R UNION ALL S a3  a4  V ← R EXCEPT ALL S a5  W ← R INTERSECT ALL S
  • string- en rekenkundige operatoren •  Test string op patroon: LIKE –  _ : één willekeurig teken –  % : willekeurige rij tekens Q12: Geef de naam van alle werknemers die in Houston, Texas wonen SELECT   Fname,Lname  FROM   EMPLOYEE  WHERE   Address LIKE  '%Houston,TX%’ ;  Q12A: Geef de naam van alle werknemers die in de jaren 1950 geboren zijn SELECT   Fname,Lname  FROM   EMPLOYEE  WHERE   Bdate LIKE  '_ _5_ _ _ _ _ _ _’ ;
  • rekenkundige operatoren: +, -, *, / •  kunnen gebruikt worden op numerieke waarden •  Q13: Geef het salaris van elke werknemer die werkt aan project ‘ProductX’, verhoogd met 10 % SELECT   Fname, Lname,  1.1 * Salary AS Increased_sal  FROM   EMPLOYEE,  WORKS_ON,  PROJECT  WHERE   Ssn = Essn  AND  Pno = Pnumber             AND  Pname = 'ProductX’ ; 43
  • andere operatoren •  strings –  concatenatie || •  datum, tijd, tijdsstempel: –  verhogen of verlagen met een interval –  verschil tussen data, tijden: → een interval •  BETWEEN: –  Q14: Geef alle werknemers van departement 5 met een salaris tussen 30 000 en 40 000 EUR SELECT   *  FROM   EMPLOYEE  WHERE   (Salary BETWEEN 30 000 AND 40 000) AND  Dno = 5 ; de salaris-voorwaarde is equivalent met ((Salary >= 30 000) AND (Salary <= 40 000)) 44
  • ordenen van query resultaten •  ORDER BY <attributen> [ ASC | DESC ] –  Q 15: Geef een lijst van de namen van de werknemers en de namen van de projecten waarop zij werken, per departement, en in elk departement alfabetisch geordend volgens familienaam, voornaam SELECT     Dname,  Fname,  Lname,  Pname  FROM     DEPARTMENT, EMPLOYEE, WORKS_ON, PROJECT  WHERE     Dnumber = Dno  AND  Ssn = Essn        AND  Pno = Pnumber   ORDER BY     Dname, Lname, Fname ;  •  default ordening is stijgend (ASC) •  dalende orde (DESC) moet steeds expliciet vermeld worden: ORDER BY Dname DESC, Lname ASC, Fname ASC
  • null en 3-waardige logica •  3 mogelijkheden: –  waarde is niet gekend –  waarde is onbeschikbaar of niet vrij gegeven –  attribuut is niet van toepassing •  elke null waarde wordt als verschillend aanzien •  ⇒ SQL gebruikt 3-waardige logica: –  TRUE FALSE UNKNOWN 46
  • •  nagaan of een waarde null is: –  IS NULL –  IS NOT NULL •  Q 18 : retrieve the names of all employees who have no supervisors SELECT   Fname, Lname  FROM   EMPLOYEE  WHERE   Super_ssn IS NULL ; 47
  • 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 48
  • 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') ;  49
  • IN operator met tupel i.p.v. enkelvoudige waarde •  tupel moet vergelijkbaar zijn met een element van de verzameling •  vb: –  selecteer de ssn’s van alle werknemers die met dezelfde combinatie (project, aantal uren) werken op om het even welk project waarop de werknemer ssn = ‘123456789’ werkt SELECT     DISTINCT Essn  FROM   WORKS_ON  WHERE   (Pno, Hours) IN  (SELECT   Pno, Hours                               FROM   WORKS_ON                               WHERE     Ssn = '123456789') ;  50
  • •  geef de naam van elke werknemer die een persoon ten laste heeft met dezelfde voornaam en hetzelfde geslacht als de werknemer SELECT   E.Fname,  E.Lname  FROM   EMPLOYEE  AS  E  WHERE   E.Ssn IN (SELECT ESSN            FROM   DEPENDENT  AS  D             WHERE D.Essn   AND   E.Sex = D.Sex                   AND   E.Fname = D.Dependent_name) ;  Kan dit ook zonder geneste query? SELECT   E.Fname,  E.Lname  FROM   EMPLOYEE  AS  E , DEPENDENT  AS  D  WHERE   E.Ssn = D.Essn   AND   E.Sex = D.Sex            AND   E.Fname = D.Dependent_name ; 
  • andere vergelijkingsoperatoren •  >, >=, <, <=, <> •  combinatie met ANY (of SOME) –  v > ANY s : er bestaat een element e van s waarvoor v > e –  = ANY is equivalent met IN •  combinatie met ALL –  v > ALL s : voor alle elementen e van s geldt v >e 52
  • voorbeeld •  bepaal de namen van alle werknemers waarvan het salaris groter is dan de salarissen van alle werknemers van departement 5 SELECT   Lname, Fname  FROM   EMPLOYEE  WHERE   Salary > ALL  (SELECT   Salary                               FROM   EMPLOYEE                               WHERE   Dno = 5) ;  53
  • oplossen van dubbelzinnigheid in geneste queries •  verscheidene niveaus van innesteling zijn mogelijk •  indien attributen met dezelfde naam voorkomen in buitenste en binnenste query: –  een referentie verwijst dan naar de binnenste geneste query –  om naar een andere relatie te verwijzen moet de attribuutnaam gekwalificeerd worden SELECT   E.Fname,  E.Lname  FROM   EMPLOYEE  AS  E  WHERE   E.Ssn  IN ( SELECT  Essn                        FROM     DEPENDENT                        WHERE  Sex = E.Sex                                     AND  E.Fname = Dependent_name) ; 54
  • 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  55
  • 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) ;  56
  • 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) ;  57
  • –  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? 58
  • 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) ) ; 
  • 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) ; 60
  • hernoeming van attributen en tabellen met 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 ;  61
  • 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 62
  • 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’ ;  63
  • 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) ;  64
  • 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;  65
  • 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’ ;  66
  • 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 ;  67
  • 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 ; 68
  • 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 ;  69
  • •  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 ;  70
  • •  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 ;  71
  • 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 ;
  • •  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 ;  73
  • algemene vorm van SQL-queries SELECT     < aAributen‐ en funcVe‐lijst >  FROM     < tabellenlijst >  [ WHERE     < voorwaarde > ]  [ GROUP BY   < groeperingsaAributen > ]  [ HAVING     < groepvoorwaarde > ]  [ ORDER BY   < aAributenlijst > ] ; –  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 74
  • aanpassingen maken in SQL •  Toevoegen: INSERT •  Weglaten: DELETE •  Wijzigen: UPDATE 75
  • 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') ;  76
  • Meerdere tupels tegelijk toevoegen •  vaak meteen na creatie van tabel, laden van resultaat van een query CREATE 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 zo'n goed idee redundantie + mogelijk verlies van integriteit beter : view definiëren (zie later) 77
  • 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 ; 78
  • 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            PlocaVon = 'Bellaire', Dnum = 5  WHERE   Pnumber = 10 ;  UPDATE   EMPLOYEE  SET     Salary = Salary * 1.1  WHERE   Dno IN   (SELECT   Dnumber                      FROM   DEPARTMENT                      WHERE   Dname = 'Research') ; 79
  • VRAGEN? Katrien.verbert@cs.kuleuven.be 80