Inleiding Databanken: oefeningen 4 Sven Casteleyn 4 Lokaal: 6G HomePage: te bereiken via
Inleiding Databanken: leerstof 4 SQL –DDL & DML: syntax en toepassingen 4 Relationeel model en relationele algebra 4 Domein & tuple calculus 4 Entity Relationship modeling 4 FA’s & Normalisatie
Relational model:overzicht
Relational model Herhaling terminologie
Relatie (tabel) Een relatie is een tabel met kolommen en rijen.
Attribuut Een attribuut is een kolom van een relatie
Tupel Een tupel is een rij van een relatie.
Domein Een domein is een verzameling van toegelaten waarden voor 1 of meerdere attributen. Voorbeelden (informeel) van domeinen voor attributen zijn “integers”, “strings”, “datum”, …
Relationele databank Een relationele databank is een collectie van relaties (tabellen)
Relational model:overzicht
Superkey Een attribuut of een verzameling van attributen die elk tuple uniek identificeert binnen een relatie.
Candidate key 4 Een superkey {K} zodanig dat geen enkele echte deelverzameling van K een superkey is. 4 Elk tuple van R wordt door de waarde van K uniek geidentificeerd (uniciteit). 4 Geen enkele echte deelverzameling van K heeft de uniciteit eigenschap.
Primary key De candidate key die gekozen werd om tuples uniek te identificeren in een relatie
Foreign key Een attribuut of een verzameling van attributen binnen een relatie die overeenkomt met een candidate key van een andere relatie.
Relational model: keys
Structured Query Language (SQL)
SQL: doel 4 Een database taal moet de gebruiker 3 zaken toelaten: - de relationele databank creeren - de relationele databank populeren - (simpele en minder simpele) queries uitvoeren 4 2 delen: - DDL voor het definieren van de databank struktuur - DML voor het opvragen en updaten van tupels
SQL: kenmerken 4 SQL bevat geen control flow commando’s. 4 SQL is een “non-procedural language”, d.w.z. dat je specificeert wat je wil, in plaats van hoe je het wil bekomen.
Algemene SQL Statement SELECT [ DISTINCT | ALL ] { * | attribuut (-expressie) [ AS new_name] [,...] } FROM relatie [alias_name] [,...] [ WHERE conditie] [ GROUPBY column_list] [ HAVING condition] [ ORDER BY column_list]
Algemene SQL Statement SELECT [ DISTINCT | ALL ] { * | attribuut (-expressie) [ AS new_name] [,...] } FROM relatie [alias_name] [,...] [ WHERE conditie] [ GROUPBY column_list] [ HAVING condition] [ ORDER BY column_list]
Algemene SQL Statement SELECT [ DISTINCT | ALL ] { * | attribuut (-expressie) [ AS new_name] [,...] } FROM relatie [alias_name] [,...] [ WHERE conditie] [ GROUPBY column_list] [ HAVING condition] [ ORDER BY column_list]
Algemene SQL Statement SELECT [ DISTINCT | ALL ] { * | attribuut (-expressie) [ AS new_name] [,...] } FROM relatie [alias_name] [,...] [ WHERE conditie] [ GROUPBY column_list] [ HAVING condition] [ ORDER BY column_list]
De basis SELECT statement 4 SELECT: specificeert welke attributen (kolommen) in het resultaat moeten verschijnen 4 FROM: specificeert de te gebruiken relatie(s) 4 WHERE: filtert de tupels in het resultaat door test van een bepaalde conditie
De basis SELECT statement: simpel voorbeeld 4 Vind naam en voornaam van alle studenten die in het derde jaar zitten
De basis SELECT statement: simpel voorbeeld 4 SELECT StudentSecondname, StudentFirstname FROM Student WHERE StudentGrade = 3 4 Vind naam en voornaam van alle studenten die in het derde jaar zitten
De basis SELECT statement: simpel voorbeeld 4 SELECT StudentSecondname, StudentFirstname FROM Student WHERE StudentGrade = 3 Relatie
De basis SELECT statement: simpel voorbeeld 4 SELECT StudentSecondname, StudentFirstname FROM Student WHERE StudentGrade = 3 Attribuut Relatie Attribuut
De basis SELECT statement: simpel voorbeeld 4 SELECT StudentSecondname, StudentFirstname FROM Student WHERE StudentGrade = 3 Conditie Attribuut Relatie Attribuut
SQL Data Manupilation Language: Specificatie
SQL: alle attributen en tupels teruggeven 4 SELECT StudentFirstname, StudentSecondname, StudentID, StudentDateOfBirth,StudentGrade FROM Student
SQL: alle attributen en tupels teruggeven 4 SELECT StudentFirstname, StudentSecondname, StudentID, StudentDateOfBirth,StudentGrade FROM Student 4 Equivalent: SELECT * FROM Student
Specifiek attribuut, alle tupels teruggeven 4 Geef alle voornamen van studenten terug 4 SELECT StudentFirstname FROM Student 4 Geef alle voor- en familienamen van studenten terug 4 SELECT StudentFirstname, StudentSecondname FROM Student
DISTINCT 4 Elimineert dubbels
DISTINCT 4 Elimineert dubbels 4 Geef alle verschillende voornamen van studenten 4 SELECT DISTINCT StudentFirstname FROM Student
Hernoemen van kolommen: AS 4 Gebruik AS om kolommen te hernoemen 4 SELECT DISTINCT StudentFirstname AS VoornamenZonderDubbels FROM Student
Tupel selectie 4 Gebruik WHERE (conditie) 4 Geef naam en voornaam van alle studenten die in het 3de jaar zitten 4 SELECT StudentSecondname, StudentFirstname FROM Student WHERE StudentGrade = 3;
Toegelaten in de WHERE clause 4 =,, =, 4 Logische operatoren: OR, AND, NOT 4 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
Range conditie: BETWEEN/ NOT BETWEEN 4 Waarden binnen een bepaald interval 4 Geef voor- en familienaam terug van alle studenten die geboren zijn in SELECT StudentFirstname, StudentDateOfBirth FROM Student WHERE StudentDateOfBirth BETWEEN # # AND # #;
Pattern matching: LIKE 4 % doet dienst al wildcard (nul of meer characters) 4 _ (underscore) stelt exact 1 character voor 4 SELECT StudentFirstname FROM Student WHERE StudentFirstname LIKE '%an%';
Testen op NULL: IS NULL / IS NOT NULL 4 NULL stelt een onbekende waarde voor in een tabel 4 Geef voornaam en studiejaar terug van alle studenten waarvan de geboortedatum gekend is 4 SELECT StudentFirstname, StudentGrade FROM Student WHERE StudentDateOfBirth IS NOT NULL
Resultaten sorteren: ORDER BY 4 ORDER BY wordt gebruikt om het resultaat van een query te sorteren 4 ORDER BY kan stijgend (ASC) of dalend (DESC)
Resultaten sorteren (ORDER BY) 4 ORDER BY wordt gebruikt om het resultaat van een query te sorteren 4 ORDER BY kan stijgend (ASC) of dalend (DESC) 4 Geef de voornamen terug van alle studenten gerangschikt per jaar (laagste jaar eerst) 4 SELECT StudentFirstname, StudentGrade FROM Student ORDER BY StudentGrade ASC
Ordenen naar meerdere kolommen 4 Geef alle voornamen van studenten gerangschikt per jaar en alfabetisch gerangschikt (per jaar)
Ordenen naar meerdere kolommen 4 Geef alle voornamen van studenten gerangschikt per jaar en alfabetisch gerangschikt (per jaar) 4 SELECT StudentFirstname, StudentGrade FROM Student ORDER BY StudentGrade, StudentFirstname
Aggregate functions (1/4) 4 COUNT: geeft het aantal waarden in een kolom terug 4 SUM: geeft de som van de waarden in een kolom terug 4 AVG: geeft het gemiddelde van de waarden in een kolom terug 4 MIN: geeft de kleinste waarde van een kolom terug 4 MAX: geeft de grootste waarde van een kolom terug
Aggregate functions (2/4) 4 Alle aggregate functions gaan over 1 kolom van een relatie, en geven 1 waarde terug 4 COUNT, MIN en MAX kunnen niet numerieke domeinen aan, SUM en AVG kunnen enkel gebruikt worden met numerieke waarden 4 Al deze functies elimineren eerst NULL waarden ( uitgezonderd COUNT (*) )
Aggregate functions (3/4) 4 Aggregate functies kunnen ENKEL gebruikt worden in de SELECT clause en de HAVING clause (zie verder) 4 SELECT StudentFirstName FROM Student WHERE MIN(StudentDateOfBirth)
Aggregate functions (4/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 4 SELECT StudentID, COUNT(StudentGrade) FROM Student
Count: voorbeeld 4 Hoeveel studenten zijn ingeschreven in het 2de jaar? 4 SELECT COUNT(StudentFirstname) FROM Student WHERE StudentGrade = 2
COUNT en DISTINCT: voorbeeld 4 Hoeveel verschillende voornamen komen voor onder de studenten? 4 SELECT COUNT(DISTINCT StudentFirstname) AS DifferentNames FROM Student
COUNT en AVG: voorbeeld 4 Vind het totaal aantal studenten en hun gemiddelde studiejaar die niet geboren zijn in SELECT COUNT(StudentFirstname) AS AantalStudenten, AVG(StudentGrade) AS GemiddeldeStudiejaar FROM Student WHERE StudentDateOfBirth NOT BETWEEN # # AND # #
MIN MAX AVG: voorbeeld 4 Geef de leeftijd van de oudste en jongste student terug 4 SELECT MIN(StudentDateOfBirth) AS Oudste, MAX(StudentDateOfBirth) AS Jongste FROM Student
Subqueries 4 Subqueries kunnen gebruikt worden in de WHERE en HAVING (zie verder) clauses 4 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
Subqueries: voorbeeld 4 Geef de voornamen van alle studenten terug die geboren zijn op dezelfde dag als de student met StudentID 1. 4 SELECT StudentFirstname FROM Student WHERE StudentDateOfBirth = (SELECT StudentDateOfBirth FROM Student WHERE StudentID = 1)
Subquery met aggregate function (1/2) 4 Geef de namen terug van alle studenten die in een hoger jaar zitten dan de gemiddelde student 4 SELECT StudentFirstname FROM Student WHERE StudentGrade > (SELECT AVG(StudentGrade) FROM Student)
Subquery met aggregate function (2/2) 4 Merk op dat we hier niet kunnen schrijven: SELECT StudentFirstname FROM Student WHERE StudentGrade > AVG(StudentGrade) 4 Aggregate functions mogen immers enkel gebruikt worden in de SELECT en HAVING clause, niet in de WHERE clause.
Subquery met aggregate function: rules (1/2) 4 ORDER BY mag niet gebruikt worden in een subquery 4 De SELECT lijst in de subquery moet bestaan uit 1 enkele attribuutnaam of expressie, behalve voor subqueries die het keyword EXISTS gebruiken (zie verder) 4 Attribuutnamen in de subquery verwijzen by default naar de tabel in de FROM clause van de subquery.
Subquery met aggregate function: rules (2/2) 4 Wanneer de subquery voorkomt als operand in een vergelijking, dan moet de subquery de rechtse operand zijn SELECT StudentFirstname FROM Student WHERE (SELECT AVG(StudentGrade) FROM Student) < StudentGrade
Nested subqueries; gebruik van IN: voorbeeld 4 Geef de voornamen terug van alle studenten die geboren zijn tussen het geboortejaar van de student met studentenummer 7 en voor 1980
Nested subqueries; gebruik van IN: voorbeeld SELECT StudentFirstname FROM Student WHERE StudentDateOfBirth IN (SELECT StudentDateOfBirth FROM Student WHERE StudentDateOfBirth BETWEEN (SELECT StudentDateOfBirth FROM Student WHERE StudentID = 7) AND # #);
Nested subqueries; gebruik van IN: opmerkingen 4 De query wordt uitgevoerd van binnen naar buiten 4 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
ANY/SOME en ALL (1/2) 4 ANY/SOME en ALL kunnen gebruikt worden in subqueries die een kolom met meerdere waarden teruggeven 4 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
ANY/SOME en ALL (2/2) 4 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 4 ANY en SOME zijn synoniemen 4 Als de subquery leeg is, dan geeft ALL true terug, ANY geeft false terug
ANY / SOME: voorbeeld 4 Geef de voornamen van alle studenten die jonger zijn (=later geboren) zijn dan ten minste 1 student uit het 2de jaar 4 SELECT StudentFirstname FROM Student WHERE StudentDateOfBirth > SOME (SELECT StudentDateOfBirth FROM Student WHERE StudentGrade = 2)
Oefeningen Databank 4 Server / host: wendy.vub.ac.be 4 Poort: Initiele databank:, bijv. ‘CasteleynSven’ 4 Login:, bijv. ‘CasteleynSven’ 4 Paswoord: database_01