71
Inleiding Databanken: oefeningen Sven Casteleyn Lokaal: 6G319 Email: [email protected] HomePage: te bereiken via http://wise.vub.ac.be/

Inleiding Databanken: oefeningen

Embed Size (px)

DESCRIPTION

Inleiding Databanken: oefeningen. Sven Casteleyn Lokaal: 6G319 Email: [email protected] HomePage: te bereiken via http://wise.vub.ac.be/. Inleiding Databanken: leerstof. SQL DDL & DML: syntax en toepassingen Relationeel model en relationele algebra Domein & tuple calculus - PowerPoint PPT Presentation

Citation preview

Page 1: Inleiding Databanken: oefeningen

Inleiding Databanken: oefeningen Sven Casteleyn Lokaal: 6G319 Email: [email protected] HomePage: te bereiken via

http://wise.vub.ac.be/

Page 2: Inleiding Databanken: oefeningen

Inleiding Databanken: leerstof

SQL– DDL & DML: syntax en toepassingen

Relationeel model en relationele algebra Domein & tuple calculus Entity Relationship modeling FA’s & Normalisatie

Page 3: Inleiding Databanken: oefeningen

Relational model:overzicht

Page 4: Inleiding Databanken: oefeningen

Relational model

Herhaling terminologie

Page 5: Inleiding Databanken: oefeningen

Relatie (tabel)

Een relatie is een tabel met kolommen en rijen.

Page 6: Inleiding Databanken: oefeningen

Attribuut

Een attribuut is een kolom van een relatie

Page 7: Inleiding Databanken: oefeningen

Tupel

Een tupel is een rij van een relatie.

Page 8: Inleiding Databanken: oefeningen

Domein

Een domein is een verzameling van toegelaten waarden voor 1 of

meerdere attributen. Voorbeelden (informeel) van domeinen voor

attributen zijn “integers”, “strings”, “datum”, …

Page 9: Inleiding Databanken: oefeningen

Relationele databank

Een relationele databank is een collectie van relaties (tabellen)

Page 10: Inleiding Databanken: oefeningen

Relational model:overzicht

Page 11: Inleiding Databanken: oefeningen

Relational model:overzichtRelatie

Page 12: Inleiding Databanken: oefeningen

Relational model:overzichtRelatie

Attributen

Page 13: Inleiding Databanken: oefeningen

Relational model:overzichtRelatie Tupel

Attributen

Page 14: Inleiding Databanken: oefeningen

Superkey

Een attribuut of een verzameling van attributen die elk tuple uniek

identificeert binnen een relatie.

Page 15: Inleiding Databanken: oefeningen

Candidate key

Een superkey {K} zodanig dat geen enkele echte deelverzameling van K een superkey is.

Elk tuple van R wordt door de waarde van K uniek geidentificeerd (uniciteit).

Geen enkele echte deelverzameling van K heeft de uniciteit eigenschap.

Page 16: Inleiding Databanken: oefeningen

Primary key

De candidate key die gekozen werd om tuples uniek te identificeren in

een relatie

Page 17: Inleiding Databanken: oefeningen

Foreign key

Een attribuut of een verzameling van attributen binnen een relatie die

overeenkomt met een candidate key van een andere relatie.

Page 18: Inleiding Databanken: oefeningen

Relational model: keys

SuperkeySuperkey

Page 19: Inleiding Databanken: oefeningen

Relational model: keys

Candidate key

SuperkeySuperkey

Candidate key

Page 20: Inleiding Databanken: oefeningen

Relational model: keysCandidate key Candidate key

SuperkeySuperkey

Primary key

Primary key Primary key

Page 21: Inleiding Databanken: oefeningen

Relational model: keysCandidate key Candidate key

SuperkeySuperkey

Primary key

Primary key Primary key

Foreign keyForeign key

Page 22: Inleiding Databanken: oefeningen

Structured Query Language (SQL)

Page 23: Inleiding Databanken: oefeningen

SQL: doel Een database taal moet de gebruiker 3 zaken toelaten:

- de relationele databank creeren- de relationele databank populeren- (simpele en minder simpele) queries uitvoeren

2 delen: - DDL voor het definieren van de databank struktuur - DML voor het opvragen en updaten van tupels

Page 24: Inleiding Databanken: oefeningen

SQL: kenmerken

SQL bevat geen control flow commando’s.

SQL is een “non-procedural language”, d.w.z. dat je specificeert wat je wil, in plaats van hoe je het wil bekomen.

Page 25: Inleiding Databanken: oefeningen

Algemene SQL Statement

SELECT [DISTINCT | ALL] {* | attribuut (-expressie) [AS new_name]

[,...] }

FROM relatie [alias_name] [, ...]

[WHERE conditie]

[GROUP BY column_list] [HAVING condition]

[ORDER BY column_list]

Page 26: Inleiding Databanken: oefeningen

Algemene SQL Statement

SELECT [DISTINCT | ALL] {* | attribuut (-expressie) [AS new_name]

[,...] }

FROM relatie [alias_name] [, ...]

[WHERE conditie]

[GROUP BY column_list] [HAVING condition]

[ORDER BY column_list]

Page 27: Inleiding Databanken: oefeningen

Algemene SQL Statement

SELECT [DISTINCT | ALL] {* | attribuut (-expressie) [AS new_name]

[,...] }

FROM relatie [alias_name] [, ...]

[WHERE conditie]

[GROUP BY column_list] [HAVING condition]

[ORDER BY column_list]

Page 28: Inleiding Databanken: oefeningen

Algemene SQL Statement

SELECT [DISTINCT | ALL] {* | attribuut (-expressie) [AS new_name]

[,...] }

FROM relatie [alias_name] [, ...]

[WHERE conditie]

[GROUP BY column_list] [HAVING condition]

[ORDER BY column_list]

Page 29: Inleiding Databanken: oefeningen

De basis SELECT statement

SELECT: specificeert welke attributen (kolommen) in het resultaat moeten verschijnen

FROM: specificeert de te gebruiken relatie(s)

WHERE: filtert de tupels in het resultaat door test van een bepaalde conditie

Page 30: Inleiding Databanken: oefeningen

De basis SELECT statement: simpel voorbeeld

Vind naam en voornaam van alle studenten die in het derde jaar zitten

Page 31: Inleiding Databanken: oefeningen

De basis SELECT statement: simpel voorbeeld SELECT StudentSecondname,

StudentFirstname FROM Student WHERE StudentGrade = 3

Vind naam en voornaam van alle studenten die in het derde jaar zitten

Page 32: Inleiding Databanken: oefeningen

De basis SELECT statement: simpel voorbeeld SELECT StudentSecondname,

StudentFirstname FROM Student WHERE StudentGrade = 3

Relatie

Page 33: Inleiding Databanken: oefeningen

De basis SELECT statement: simpel voorbeeld SELECT StudentSecondname,

StudentFirstname FROM Student WHERE StudentGrade = 3

Attribuut

Relatie

Attribuut

Page 34: Inleiding Databanken: oefeningen

De basis SELECT statement: simpel voorbeeld SELECT StudentSecondname,

StudentFirstname FROM Student WHERE StudentGrade = 3

Conditie

Attribuut

Relatie

Attribuut

Page 35: Inleiding Databanken: oefeningen

SQLData Manupilation Language:

Specificatie

Page 36: Inleiding Databanken: oefeningen

SQL: alle attributen en tupels teruggeven SELECT StudentFirstname,

StudentSecondname, StudentID, StudentDateOfBirth,StudentGradeFROM Student

Page 37: Inleiding Databanken: oefeningen

SQL: alle attributen en tupels teruggeven SELECT StudentFirstname,

StudentSecondname, StudentID, StudentDateOfBirth,StudentGradeFROM Student

Equivalent:

SELECT *FROM Student

Page 38: Inleiding Databanken: oefeningen

Specifiek attribuut, alle tupels teruggeven Geef alle voornamen van studenten terug SELECT StudentFirstname

FROM Student Geef alle voor- en familienamen van

studenten terug SELECT StudentFirstname,

StudentSecondnameFROM Student

Page 39: Inleiding Databanken: oefeningen

DISTINCT

Elimineert dubbels

Page 40: Inleiding Databanken: oefeningen

DISTINCT

Elimineert dubbels

Geef alle verschillende voornamen van studenten

SELECT DISTINCT StudentFirstname FROM Student

Page 41: Inleiding Databanken: oefeningen

Hernoemen van kolommen: AS

Gebruik AS om kolommen te hernoemen

SELECT DISTINCT StudentFirstname AS VoornamenZonderDubbelsFROM Student

Page 42: Inleiding Databanken: oefeningen

Tupel selectie

Gebruik WHERE (conditie) Geef naam en voornaam van alle studenten

die in het 3de jaar zitten SELECT StudentSecondname,

StudentFirstnameFROM StudentWHERE StudentGrade = 3;

Page 43: Inleiding Databanken: oefeningen

Toegelaten in de WHERE clause

= , < , > , <= , >= , < >

Logische operatoren: OR, AND, NOT

Volgorde van evaluatie:– van links naar rechts– subexpressies tussen haakjes eerst geevalueerd– NOT wordt vóór AND en OR geevalueerd– AND wordt geevalueerd voor OR

Page 44: Inleiding Databanken: oefeningen

Range conditie: BETWEEN/ NOT BETWEEN Waarden binnen een bepaald interval Geef voor- en familienaam terug van alle

studenten die geboren zijn in 1979 SELECT StudentFirstname,

StudentDateOfBirthFROM StudentWHERE StudentDateOfBirth BETWEEN #01-01-1979# AND #01-01-1980#;

Page 45: Inleiding Databanken: oefeningen

Pattern matching: LIKE

% doet dienst al wildcard (nul of meer characters)

_ (underscore) stelt exact 1 character voor

SELECT StudentFirstnameFROM StudentWHERE StudentFirstname LIKE '%an%';

Page 46: Inleiding Databanken: oefeningen

Testen op NULL: IS NULL / IS NOT NULL NULL stelt een onbekende waarde voor in een

tabel Geef voornaam en studiejaar terug van alle

studenten waarvan de geboortedatum gekend is SELECT StudentFirstname, StudentGrade

FROM StudentWHERE StudentDateOfBirth IS NOT NULL

Page 47: Inleiding Databanken: oefeningen

Resultaten sorteren: ORDER BY

ORDER BY wordt gebruikt om het resultaat van een query te sorteren

ORDER BY kan stijgend (ASC) of dalend (DESC)

Page 48: Inleiding Databanken: oefeningen

Resultaten sorteren (ORDER BY) ORDER BY wordt gebruikt om het resultaat van

een query te sorteren ORDER BY kan stijgend (ASC) of dalend

(DESC) Geef de voornamen terug van alle studenten

gerangschikt per jaar (laagste jaar eerst) SELECT StudentFirstname, StudentGrade

FROM StudentORDER BY StudentGrade ASC

Page 49: Inleiding Databanken: oefeningen

Ordenen naar meerdere kolommen Geef alle voornamen van studenten

gerangschikt per jaar en alfabetisch gerangschikt (per jaar)

Page 50: Inleiding Databanken: oefeningen

Ordenen naar meerdere kolommen Geef alle voornamen van studenten

gerangschikt per jaar en alfabetisch gerangschikt (per jaar)

SELECT StudentFirstname, StudentGradeFROM StudentORDER BY StudentGrade, StudentFirstname

Page 51: Inleiding Databanken: oefeningen

Aggregate functions (1/4)

COUNT: geeft het aantal waarden in een kolom terug SUM: geeft de som van de waarden in een kolom

terug AVG: geeft het gemiddelde van de waarden in een

kolom terug MIN: geeft de kleinste waarde van een kolom terug MAX: geeft de grootste waarde van een kolom terug

Page 52: Inleiding Databanken: oefeningen

Aggregate functions (2/4)

Alle aggregate functions gaan over 1 kolom van een relatie, en geven 1 waarde terug

COUNT, MIN en MAX kunnen niet numerieke domeinen aan, SUM en AVG kunnen enkel gebruikt worden met numerieke waarden

Al deze functies elimineren eerst NULL waarden ( uitgezonderd COUNT (*) )

Page 53: Inleiding Databanken: oefeningen

Aggregate functions (3/4)

Aggregate functies kunnen ENKEL gebruikt worden in de SELECT clause en de HAVING clause (zie verder)

SELECT StudentFirstNameFROM StudentWHERE MIN(StudentDateOfBirth)

Page 54: Inleiding Databanken: oefeningen

Aggregate functions (4/4)

Als een SELECT clause een aggregate function bevat en er wordt geen GROUP BY clause gebruikt, dan kan de SELECT clause geen kolom referenties bevatten tenzij die kolom in een aggregate wordt gebruikt

SELECT StudentID, COUNT(StudentGrade)FROM Student

Page 55: Inleiding Databanken: oefeningen

Count: voorbeeld

Hoeveel studenten zijn ingeschreven in het 2de jaar?

SELECT COUNT(StudentFirstname)FROM StudentWHERE StudentGrade = 2

Page 56: Inleiding Databanken: oefeningen

COUNT en DISTINCT: voorbeeld

Hoeveel verschillende voornamen komen voor onder de studenten?

SELECT COUNT(DISTINCT StudentFirstname) AS DifferentNamesFROM Student

Page 57: Inleiding Databanken: oefeningen

COUNT en AVG: voorbeeld

Vind het totaal aantal studenten en hun gemiddelde studiejaar die niet geboren zijn in 1980

SELECT COUNT(StudentFirstname) AS AantalStudenten, AVG(StudentGrade) AS GemiddeldeStudiejaarFROM StudentWHERE StudentDateOfBirth NOT BETWEEN #01-01-1980# AND #31-12-1980#

Page 58: Inleiding Databanken: oefeningen

MIN MAX AVG: voorbeeld

Geef de leeftijd van de oudste en jongste student terug

SELECT MIN(StudentDateOfBirth) AS Oudste, MAX(StudentDateOfBirth) AS JongsteFROM Student

Page 59: Inleiding Databanken: oefeningen

Subqueries

Subqueries kunnen gebruikt worden in de WHERE en HAVING (zie verder) clauses

Drie soorten:– Scalaire subquery: geeft een enkele waarde terug

– Rij subquery: geeft meerdere attributen (kolommen) terug, maar slechts 1 enkele tupel (rij)

– Table subquery: geeft een relatie (tabel) terug

Page 60: Inleiding Databanken: oefeningen

Subqueries: voorbeeld

Geef de voornamen van alle studenten terugdie geboren zijn op dezelfde dag als de student met StudentID 1.

SELECT StudentFirstnameFROM StudentWHERE StudentDateOfBirth =

(SELECT StudentDateOfBirth FROM Student WHERE StudentID = 1)

Page 61: Inleiding Databanken: oefeningen

Subquery met aggregate function (1/2)

Geef de namen terug van alle studenten die in een hoger jaar zitten dan de gemiddelde student

SELECT StudentFirstnameFROM StudentWHERE StudentGrade >

(SELECT AVG(StudentGrade) FROM Student)

Page 62: Inleiding Databanken: oefeningen

Subquery met aggregate function (2/2)

Merk op dat we hier niet kunnen schrijven:SELECT StudentFirstnameFROM StudentWHERE StudentGrade >

AVG(StudentGrade) Aggregate functions mogen immers enkel

gebruikt worden in de SELECT en HAVING clause, niet in de WHERE clause.

Page 63: Inleiding Databanken: oefeningen

Subquery met aggregate function:rules (1/2) ORDER BY mag niet gebruikt worden in een

subquery De SELECT lijst in de subquery moet bestaan

uit 1 enkele attribuutnaam of expressie, behalve voor subqueries die het keyword EXISTS gebruiken (zie verder)

Attribuutnamen in de subquery verwijzen by default naar de tabel in de FROM clause van de subquery.

Page 64: Inleiding Databanken: oefeningen

Subquery met aggregate function:rules (2/2) Wanneer de subquery voorkomt als operand in

een vergelijking, dan moet de subquery de rechtse operand zijn

SELECT StudentFirstnameFROM StudentWHERE (SELECT AVG(StudentGrade)

FROM Student) < StudentGrade

Page 65: Inleiding Databanken: oefeningen

Nested subqueries; gebruik van IN: voorbeeld Geef de voornamen terug van alle studenten

die geboren zijn tussen het geboortejaar van de student met studentenummer 7 en voor 1980

Page 66: Inleiding Databanken: oefeningen

Nested subqueries; gebruik van IN: voorbeeld

SELECT StudentFirstnameFROM StudentWHERE StudentDateOfBirth IN (SELECT StudentDateOfBirth FROM Student WHERE StudentDateOfBirth BETWEEN

(SELECT StudentDateOfBirth FROM Student WHERE StudentID = 7)

AND #01-01-1980#);

Page 67: Inleiding Databanken: oefeningen

Nested subqueries; gebruik van IN: opmerkingen De query wordt uitgevoerd van binnen naar

buiten Merk op dat we hier niet de gelijkheids

conditie kunnen gebruiken, gezien er meerdere geboortedata tussen de opgegeven tijdstippen kunnen vallen, in plaats wordt IN gebruikt

Page 68: Inleiding Databanken: oefeningen

ANY/SOME en ALL (1/2)

ANY/SOME en ALL kunnen gebruikt worden in subqueries die een kolom met meerdere waarden teruggeven

Als de subquery voorafgegaan wordt door ALL dan zal de conditie waar zijn enkel en alleen indien ze geldt voor ALLE waarden geproduceerd door de subquery

Page 69: Inleiding Databanken: oefeningen

ANY/SOME en ALL (2/2)

Als de subquery voorafgegaan wordt door SOME dan zal de conditie waar zijn enkel en alleen indien ze geldt voor een (een of meerdere) waarde geproduceerd door de subquery

ANY en SOME zijn synoniemen Als de subquery leeg is, dan geeft ALL true

terug, ANY geeft false terug

Page 70: Inleiding Databanken: oefeningen

ANY / SOME: voorbeeld

Geef de voornamen van alle studenten die jonger zijn (=later geboren) zijn dan ten minste 1 student uit het 2de jaar

SELECT StudentFirstnameFROM StudentWHERE StudentDateOfBirth > SOME

(SELECT StudentDateOfBirth FROM Student WHERE StudentGrade = 2)

Page 71: Inleiding Databanken: oefeningen

Oefeningen Databank

Server / host: wendy.vub.ac.be Poort: 5432 Initiele databank: <familienaam><naam>,

bijv. ‘CasteleynSven’ Login: <naam><voornaam>, bijv.

‘CasteleynSven’ Paswoord: database_01