SQL

54
SQL – deel 1 Katrien Verbert en Joris Klerkx [email protected] [email protected]

description

 

Transcript of SQL

Page 1: SQL

SQL – deel 1

Katrien Verbert en Joris Klerkx [email protected] [email protected]

Page 2: SQL

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

2

Page 3: SQL

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

3

de meeste implementaties van SQL verschillen in meer of mindere mate van de standaard

Page 4: SQL

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

4

Page 5: SQL

terminologie

•  relationeel model

–  schema –  relatie –  tupel –  attribuut

•  SQL

–  schema –  tabel –  rij –  kolom

5

Page 6: SQL

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 ;

6

Page 7: SQL

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

7

Page 8: SQL

creatie van een tabel

•  naam •  voor alle attributen:

–  naam + SQL-gegevenstype + restricties

•  restricties

CREATE TABLE  [ <schema name >. ] <table name> 

     ( { <column name> <column type> [<aAribute constraint>] }  

      {<table constraint>} *) 

8

Page 9: SQL
Page 10: SQL

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)

10

Page 11: SQL

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‘

11

Page 12: SQL

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

12

Page 13: SQL

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’

13

Page 14: SQL

in verschillende implementaties

•  namen kunnen verschillen •  soms nog meer variaties in types

•  voorbeeld: –  http://en.wikipedia.org/wiki/

Comparison_of_relational_database_management_systems

14

Page 15: SQL

CREATE DOMAIN  SSN_TYPE AS CHAR(9) ;

definitie van type van een attribuut

•  ofwel rechtstreeks •  ofwel via definitie van domein

15

Page 16: SQL

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

16

Page 17: SQL
Page 18: SQL

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); 

18

Page 19: SQL

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,….

19

Page 20: SQL
Page 21: SQL

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> 

21

Page 22: SQL

–  <drop behaviour> = •  CASCADE | RESTRICT

–  <default option> = •  DROP DEFAULT | SET DEFAULT <value>

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> }

22

Page 23: SQL

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 ;

23

Page 24: SQL

•  Basisvorm van een vraag (query):

•  vgl. met relationele algebra: –  SELECT projectie –  FROM carthesisch product –  WHERE selectie

opvragingen (queries) in SQL

SELECT <aAributen lijst>       FROM     <tabellen lijst>      WHERE  <condiVes> ;

24

Page 25: SQL

In relaVonele algebra:  

πBdate,Address (σ Fname = 'John'  AND  Minit = ‘John’  AND  Lname = 

‘Smith’ (EMPLOYEE) ) 

voorbeeld

•  Q_0: geef de geboortedatum en het adres van werknemer John B. Smith

Bdate Address ---------- ------------------------ 1965-01-09 731 Fondren, Houston, TX

SELECT   Bdate, Address FROM       EMPLOYEE WHERE   Fname='John' AND Minit='B' AND Lname='Smith’ ;

Page 26: SQL

•  Q1B: geef naam en adres van alle werknemers die voor het "research" departement werken

•  vergelijk met uitdrukking in tupel relationele calculus

SELECT   E.Fname, E.Lname, E.Address FROM   EMPLOYEE  E, DEPARTMENT  D WHERE   D.Dname = 'Research' AND D.Dnumber = E.Dno ;

26

{ t.Fname, t.Lname, t.Address | EMPLOYEE(t)                      AND (∃d) (DEPARTMENT(d)                                    AND d.Dname = 'Research’                                   AND d.Number = t.Dno) } 

Page 27: SQL

 geef namen van projecten die gecontroleerd worden door departement 5 

27

 select  ? 

 from   ?  where ? 

Page 28: SQL

28

 select  ? 

 from   ?  where ? 

 SELECT pname FROM project WHERE dnum=5; 

 geef social security numbers van werknemers die werken aan projecten die gecontroleerd worden door departement 5 

Page 29: SQL

 geef voornaam en familienaam van werknemers die werken aan projecten die gecontroleerd worden door departement 5 

29

 select  ? 

 from   ?  where ? 

 SELECT pname, essn FROM project, works_on 

 WHERE dnum=5 and pno=pnumber; 

Page 30: SQL

30

SELECT pname, fname, lname  

FROM project, works_on, employee  WHERE dnum=5 and pno=pnumber and essn=ssn; 

SELECT pname, essn 

FROM project, works_on WHERE dnum=5 and pno=pnumber; 

SELECT pname 

FROM project WHERE dnum=5; 

Page 31: SQL

SELECT   Pnumber, Dnum, Lname, Address, Bdate FROM   PROJECT, DEPARTMENT, EMPLOYEE WHERE   Dnum = Dnumber  AND  Mgr_ssn = Ssn           AND  PlocaVon = 'Stafford’ ; 

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

resultaat:

Pnumber Dnum Lname Address Bdate ------- ---- ------- ----------------------- ---------- 10 4 Wallace 291 Berry, Bellaire, TX 1941-06-20 30 4 Wallace 291 Berry, Bellaire, TX 1941-06-20

Page 32: SQL

SELECT   Fname, EMPLOYEE.Name, Address FROM   EMPLOYEE, DEPARTMENT WHERE   DEPARTMENT.Name = 'Research'           AND DEPARTMENT.Dnumber = EMPLOYEE.Dnumber ;

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>

Page 33: SQL

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 ;

33

Page 34: SQL

aliasen –  Q 8: for each employee, retrieve the employee’s first and last

name and the last name of his or her immediate supervisor

–  Definitie: - onmiddellijk na de naam van de relatie - na sleutelwoord AS

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 ; 

34

Page 35: SQL

SELECT   Ssn FROM   EMPLOYEE ;

SELECT   Ssn, Dname FROM   EMPLOYEE, DEPARTMENT ;

weglaten van WHERE en van attributenlijst

•  WHERE kan weggelaten worden: geen selectie

carthesisch product

35

Page 36: SQL

SELECT   * FROM   EMPLOYEE WHERE     Dno = 5 ;

SELECT   * FROM   EMPLOYEE, DEPARTMENT WHERE   Dname = 'Research' AND Dno = Dnumber ;

SELECT   * FROM   EMPLOYEE, DEPARTMENT ;

weglaten van WHERE en van attributenlijst

•  Alle attributen selecteren (met *) : geen projectie

36

Page 37: SQL

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

37

Page 38: SQL

SELECT   ALL Salary FROM       EMPLOYEE ;

SELECT   DISTINCT Salary FROM       EMPLOYEE ;

Salary ------ 30000 40000 25000 43000 38000 25000 25000 55000

Salary ------ 30000 40000 25000 43000 38000 55000

•  Vermijden van dubbels: SELECT DISTINCT

SELECT  Salary FROM   EMPLOYEE ;

equivalent met

38

Page 39: SQL

(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') ;

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

Page 40: SQL

operaties die slaan op multisets

•  sleutelwoord ALL na de operator: –  UNION ALL –  EXCEPT ALL –  INTERSECT ALL

R  A 

a2 a1 

a2 a3 

V  A 

a3 a2 

S  A 

a2 a1 

a4 a5 

W  A 

a2 a1 

T  A 

a1 a1 

a2 a2 a2 a3 a4 a5 

T ← R UNION ALL S

V ← R EXCEPT ALL S

W ← R INTERSECT ALL S

Page 41: SQL

SELECT   Fname,Lname FROM   EMPLOYEE WHERE   Address LIKE  '%Houston,TX%’ ; 

SELECT   Fname,Lname FROM   EMPLOYEE WHERE   Bdate LIKE  '_ _5_ _ _ _ _ _ _’ ;

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

Q12A: Geef de naam van alle werknemers die in de jaren 1950 geboren zijn

Page 42: SQL

SELECT   Fname, Lname,  1.1 * Salary AS Increased_sal FROM   EMPLOYEE,  WORKS_ON,  PROJECT WHERE   Ssn = Essn  AND  Pno = Pnumber            AND  Pname = 'ProductX’ ;

rekenkundige operatoren: +, -, *, /

•  kunnen gebruikt worden op numerieke waarden

•  Q13: Geef het salaris van elke werknemer die werkt aan project ‘ProductX’, verhoogd met 10 %

42

Page 43: SQL

andere operatoren

•  strings –  concatenatie | |

•  datum, tijd, tijdsstempel: –  verhogen of verlagen met een interval –  verschil tussen data, tijden: → een interval

de salaris-voorwaarde is equivalent met ((Salary >= 30 000) AND (Salary <= 40 000))

SELECT   * FROM   EMPLOYEE WHERE   (Salary BETWEEN 30 000 AND 40 000) AND  Dno = 5 ;

•  BETWEEN: –  Q14: Geef alle werknemers van departement 5 met een

salaris tussen 30 000 en 40 000 EUR

43

Page 44: SQL

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 ; 

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

•  default ordening is stijgend (ASC) •  dalende orde (DESC) moet steeds expliciet vermeld worden:

ORDER BY Dname DESC, Lname ASC, Fname ASC

Page 45: SQL

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

45

Page 46: SQL

•  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 ;

46

Page 47: SQL

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

47

Page 48: SQL

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') ; 

voorbeeld

–  Q 4A: geef alle projecten waarbij Smith betrokken is als manager van het controlerend departement of waaraan hij meewerkt

48

Page 49: SQL

SELECT     DISTINCT Essn FROM   WORKS_ON WHERE   (Pno, Hours) IN  (SELECT   Pno, Hours                              FROM   WORKS_ON                              WHERE     Ssn = '123456789') ; 

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

49

Page 50: SQL

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 ; 

•  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?

Page 51: SQL

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

51

Page 52: SQL

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

voorbeeld

•  bepaal de namen van alle werknemers waarvan het salaris groter is dan de salarissen van alle werknemers van departement 5

52

Page 53: SQL

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) ;

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

53

Page 54: SQL

VRAGEN?

[email protected]

54