Relationele Databases Hoofdstuk 10 Giel Jacobs oktober 2003
Inleiding Database = Gegevensbank= Relationeel model DBMS verzameling van gegevens Relationeel model Een goede manier om een database te organiseren DBMS DataBase Management System Gegevensbankbeheersysteem Hulpmiddel om de database te beheren Giel Jacobs oktober 2003
Structuur Eenvoudige structuur: bijv. telefoonklapper Grotere database (bijv. Schooladministratie) Structuur wordt moeilijker Bijhouden van: >gegevens van leerlingen > gegevens van docenten > klassen/ roosters/ resultaten/ absentie/ enz Giel Jacobs oktober 2003
Structuur Taak 1: Opslaan De eerste belangrijke taak Taak 2: Opvragen en verwerken De opgeslagen gegevens gebruiken om allerlei taken goed uit te kunnen voeren Taak 3: Integriteit Het systeem kan controleren of de ingevoerde gegevens aan een aantal regels voldoen Giel Jacobs oktober 2003
Relationeel model Alle gegevens worden opgeslagen in tabellen Rijen in de tabel Alle gegevens van een bepaalde kaart Kolommen in de tabel Gegevens van de velden van de systeemkaart Giel Jacobs oktober 2003
Relationeel model Kolommen Kolommen Kolommen Kolommen Kolommen Rijen Rijen Rijen Rijen Rijen Giel Jacobs oktober 2003
Relationeel model SQL Structured Query Language = Gestructureerde Vraagtaal Alle softwareprogramma’s voor relationele databases bevatten dezelfde kern van SQL. Giel Jacobs oktober 2003
Elementen in de kolommen Relationeel model Elementen in de kolommen Term “relationeel” komt uit de wiskunde > uit de verzamelingenleer. Bijv.: met zinnen als: “Leerling Jan uit klas 4B” leg je een relatie tussen leerling en klas. De elementen van de relatie (leerling en klas) geven de kolommen aan. De in te vullen gegevens komen dan in de rijen. Leerling Klas: Jan Jansen 4B Gegevens in de regels Giel Jacobs oktober 2003
Voorbeeld database Een database met informatie over de schoolbibliotheek Deze database bevat 6 tabellen Elke tabel bevat een aantal kolommen Giel Jacobs oktober 2003
Structuur Voorbeeld database Tabel: LEERLINGEN Met de kolommen: LLNR - VOORNAAM - TUSSENVOEGSEL - ACHTERNAAM - STRAAT - HUISNUMMER - POSTCODE - PLAATS - TELEFOON - GESLACHT - GEB_DATUM - KLAS Tabel: AUTEURS Met de kolommen: AUTEURNR - VOORNAAM - VOORLETTERS - TUSSENVOEGSEL - ACHTERNAAM - GEB_DATUM - STERF_JAAR Giel Jacobs oktober 2003
Structuur Voorbeeld database Tabel: BOEKEN Met de kolommen: BOEKNR - AUTNR - TITEL - RUBRIEK Tabel: EXEMPLAREN Met de kolommen: EXNR - BOEKNR - UITLEENBAAR - STATUS Er kunnen namelijk verschillende exemplaren van hetzelfde boek zijn. Giel Jacobs oktober 2003
Structuur Voorbeeld database Er komen kolommen voor die alleen maar een nummer bevatten: LLNR / AUTEURNR / BOEKNR / EXNR Reden: Makkelijker om een bepaalde rij aan te duiden. Twee leerlingen met exact dezelfde naam. Bij het stellen van complexere vragen staan de gegevens in verschillende tabellen. Giel Jacobs oktober 2003
Database management systemen Microsoft ACCES FileMaker Oracle Sybase Ingres Solid Al deze systemen: 1. Gaan uit van het relationele model 2. Hebben de mogelijkheid om SQL te gebruiken. Giel Jacobs oktober 2003
Microsoft Access & SQL Procedure voor het maken van een SQL-query: 1. Kies de tab Query’s 2. Kies Nieuw (New) in het menu – rechts. 3. Kies Ontwerpweergave (Design new) en Klik dan op OK. 4. Kies Sluiten in het venster “Tabel Toevoegen” (Add Table). 5. Klik via het menu: “Beeld” op SQL (View: SQL) 6. Klik op SQL uit het submenu. Nu krijg je een venster waarin je een query kunt typen. Giel Jacobs oktober 2003
Microsoft Access & SQL Kies de tab Query’s Giel Jacobs oktober 2003
Microsoft Access & SQL Kies daarna voor: Nieuw Giel Jacobs oktober 2003
Microsoft Access & SQL Kies dan voor: Ontwerpweergave En druk daarna op: OK Giel Jacobs oktober 2003
Kies Sluiten in de tabel Toevoegen Microsoft Access & SQL Kies Sluiten in de tabel Toevoegen Giel Jacobs oktober 2003
En kies daarna voor: SQL Microsoft Access & SQL Kies voor: Beeld En kies daarna voor: SQL Giel Jacobs oktober 2003
Microsoft Access & SQL Of kies meteen: SQL Giel Jacobs oktober 2003
Microsoft Access & SQL Dit is dan het venster waarin de query getypt kan worden Het eerste woord: SELECT; staat er al Giel Jacobs oktober 2003
Basisstructuur van een eenvoudige query Microsoft Access & SQL Basisstructuur van een eenvoudige query Giel Jacobs oktober 2003
Microsoft Access & SQL SELECT: Achter SELECT geef je de kolommen op die je in de uitvoer wilt zien. FROM: Achter FROM geef je de naam van de tabel (of tabellen) waaruit deze kolommen komen. SELECT * FROM LEERLINGEN Door het sterretje krijg je de inhoud van de volledige tabel op het scherm. Giel Jacobs oktober 2003
Microsoft Access & SQL SELECT VOORNAAM, TUSSENVOEGSEL, ACHTERNAAM, KLAS FROM LEERLINGEN Welke kolommen, maar ook de volgorde van de kolommen is van belang. Giel Jacobs oktober 2003
Microsoft Access & SQL SELECT VOORNAAM, TUSSENVOEGSEL, ACHTERNAAM, KLAS FROM LEERLINGEN ORDER BY ACHTERNAAM Door de regel: ORDER BY , wordt de lijst gesorteerd. Je zou ook op twee of meer kolommen kunnen laten sorteren, door achter ORDER BY, de twee kolommen op te geven. Giel Jacobs oktober 2003
Microsoft Access & SQL SELECT VOORNAAM, TUSSENVOEGSEL, ACHTERNAAM, KLAS FROM LEERLINGEN ORDER BY 3 desc Nu wordt op de 3e kolom gesorteerd (ACHTERNAAM) DESC betekent: Aflopend > van Z naar A. Bij Niets vermelden (of ASC vermelden) wordt oplopend gesorteerd. Giel Jacobs oktober 2003
Microsoft Access & SQL SELECT PLAATS FROM LEERLINGEN Het resultaat is een lange waslijst van plaatsnamen. Die plaatsnamen kunnen allemaal meerdere keren voorkomen. SELECT DISTINCT PLAATS FROM LEERLINGEN Door DISTINCT komt elke plaats maar 1 keer op het scherm voor. Giel Jacobs oktober 2003
Microsoft Access & SQL Dus selecteer: Uit de TABEL: LEERLINGEN Die kolommen die achter SELECT staan En alleen die rijen, die een M hebben in de kolom GESLACHT Microsoft Access & SQL Niet alleen kolommen, maar ook rijen kunnen geselecteerd worden. Hiervoor moeten voorwaarden aan de rijen worden gesteld SELECT VOORNAAM, TUSSENVOEGSEL, ACHTERNAAM FROM LEERLINGEN WHERE GESLACHT = ‘M’ Voorwaarden geef je achter het sleutelwoord: WHERE Giel Jacobs oktober 2003
Microsoft Access & SQL Controle is: Teken voor teken controleren WHERE: ACHTERNAAM = ‘Frederiks’ Of:…. WHERE: ACHTERNAAM LIKE ‘Frederi*’ * Geeft aan wat niet precies hoeft te kloppen Giel Jacobs oktober 2003
Microsoft Access & SQL LIKE operatoren: * Er mag alles staan. (ook meerdere tekens) ? Er mag alles staan, maar niet meer dan 1 teken < en > Kleiner dan... en Groter dan…. <= en >= Kleiner dan of gelijk aan / groter dan of gelijk aan <> Niet gelijk aan Giel Jacobs oktober 2003
Jantine Bakker wilt hebben Microsoft Access & SQL Maar wat nu als je Jantine Bakker wilt hebben in plaats van Jantine de Bakker ?? Samengestelde voorwaarden AND Bindt voorwaarden aan elkaar SELECT * FROM LEERLINGEN WHERE ACHTERNAAM = ‘Bakker’ AND TUSSENVOEGSEL = ‘de’ AND VOORNAAM = ‘Jantine’ Giel Jacobs oktober 2003
dat voor SQL toch een invulling Microsoft Access & SQL Dit weghalen en iets anders verzinnen SELECT * FROM LEERLINGEN WHERE ACHTERNAAM = ‘Bakker’ AND TUSSENVOEGSEL = ‘de’ AND VOORNAAM = ‘Jantine’ Vul je hier niets in, of een spatie, dan is dat voor SQL toch een invulling Giel Jacobs oktober 2003
Microsoft Access & SQL SELECT * FROM LEERLINGEN WHERE ACHTERNAAM = ‘Bakker’ AND TUSSENVOEGSEL IS NULL AND VOORNAAM = ‘Jantine’ De waarde die nu staat ingevuld is: “er is niet ingevuld” Giel Jacobs oktober 2003
Microsoft Access & SQL Dus:…. Leerlingen die in klas 4B zitten EN de leerlingen die in Utrecht wonen worden getoond. Naast AND, bestaat er nog een ander sleutelwoord Namelijk:... OR Deze OR is niet exclusief. D.w.z.: rijen die aan allebei de voorwaarden voldoen worden ook geselecteerd. SELECT * FROM LEERLINGEN WHERE PLAATS = ‘Utrecht’ OR KLAS = ‘4B’ Giel Jacobs oktober 2003
Microsoft Access & SQL Opmerking 1: In een voorwaarden van AND en OR samen, gaat AND altijd voor OR. Opmerking 2: Om verwarring te voorkomen is het plaatsen van haakjes handig. Giel Jacobs oktober 2003
Microsoft Access & SQL Voorbeeld uit boek: (blz.: 55) Jantine zoekt vriendinnen die met haar meefietsen. Liefst meisjes uit haar klas. Kan dat niet, dan meisjes uit een andere klas, als ze maar in de buurt wonen. Hoe komt dit er in SQL uit te zien????.. Giel Jacobs oktober 2003
Microsoft Access & SQL Meisje geen jongen Klas 4B of de andere keuze is allebei goed VOORNAAM, TUSSENVOEGSEL, ACHTERNAAM, HUISNR, POSTCODE, WOONPLAATS, TELEFOON SELECT Hier mag elke wille- keurige letter komen FROM LEERLINGEN Vele invul- mogelijkheden WHERE GESLACHT = ‘v’ AND ( KLAS = ‘4B’ OR ( KLAS LIKE ‘4?’ AND POSTCODE LIKE ‘3253*’ )) Giel Jacobs oktober 2003
Dit is niet hetzelfde als Microsoft Access & SQL De som van een aantal getallen in een kolom. Dit is niet hetzelfde als het aantal rijen! De grootste waarde in een kolom Functies in SQL: SUM(KOLOMNAAM) MAX(KOLOMNAAM) MIN(KOLOMNAAM) De kleinste waarde in een kolom AVG(KOLOMNAAM) De gemiddelde waarde in een kolom. Kan alleen als er getallen staan. Giel Jacobs oktober 2003
Microsoft Access & SQL Een Query binnen een Query…. SUBQUERY Voorbeeld uit boek: 1e.: Wat is de maximale boete die betaald moet worden 2e.: Welke leerlingen moeten die boete betalen? Samengevat: Welke leerlingen betalen de hoogste boete??? Giel Jacobs oktober 2003
Microsoft Access & SQL Deze twee queries gaan we combineren tot een query Deze twee queries gaan we combineren tot een query We gaan eerst de maximale boete uitzoeken SELECT MAX (BOETE) FROM UITLENINGEN Dan zoeken we uit welk LLNR uit de tabel UITLENINGEN bij die MAX(BOETE) hoort. Stel: MAX(BOETE) = 4.00 SELECT LLNR FROM UITLENINGEN WHERE BOETE = 4.00 Giel Jacobs oktober 2003
Maar nu weet ik alleen het LLNR en Microsoft Access & SQL Dit heet een SUBQUERY SELECT LLNR FROM Hoe moet je de Query met Subqueries zo uitbreiden dat i.p.v. LLNR de naam en klas van de leerlingen te zien zijn UITLENINGEN WHERE BOETE = ( SELECT MAX (BOETE) FROM UITLENINGEN ) Maar nu weet ik alleen het LLNR en nog niet de namen Giel Jacobs oktober 2003
Microsoft Access & SQL SELECT NAAM, KLAS FROM LEERLINGEN WHERE LLNR IN ( SELECT LLNR FROM UITLENING WHERE BOETE = ( SELECT MAX(BOETE) FROM UITLENINGEN ) ) Giel Jacobs oktober 2003
Microsoft Access & SQL Bedenk nu wat hiervan het resultaat zal zijn Tabellen combineren: Tabel 1 Tabel 2 Pieters Schiedam Goosens Breda Jansen Rotterdam Grieken Oosterhout van Dijk Breda Geerts Schiedam Combinatie van deze twee tabellen: SELECT * FROM Tabel 1, Tabel 2 Giel Jacobs oktober 2003
Dus niet zo maar alles (*) met elkaar combineren Microsoft Access & SQL Dus niet zo maar alles (*) met elkaar combineren Het resultaat van deze Query is: Pieters Schiedam Goosens Breda Jansens Rotterdam Goosens Breda van Dijk Breda Goosens Breda Pieters Schiedam Grieken Oosterhout Dus een combinatie van 2 tabellen met 110 en 230 rijen geeft een tabel van 110 x 230 = 25.300 rijen Jansens Rotterdam Grieken Oosterhout van Dijk Breda Grieken Oosterhout Pieters Schiedam Geerts Schiedam Jansens Rotterdam Geerts Schiedam van Dijk Breda Geerts Schiedam Dus een combinatie van 2 tabellen met elk 3 rijen geeft een tabel van 3 x 3 = 9 rijen Giel Jacobs oktober 2003
Microsoft Access & SQL Groeperen met voorwaarden: GROUP BY: Hiermee kun je de rijen van een kolom indelen in groepen, die dezelfde gegevens in een kolom hebben. Bij SELECT heb je dezelfde kolommen als achter GROUP BY gezet. Giel Jacobs oktober 2003
Microsoft Access & SQL Nu kun je aan GROUP BY een extra voorwaarde stellen! HAVING Voorbeeld in boek op Blz.: 65 Giel Jacobs oktober 2003
Microsoft Access & SQL Hier wordt de voorwaarde gesteld waaraan de groepjes die bij GROUP BY gemaakt worden, moeten voldoen SELECT AUTEURS.NAAM, BOEKEN.TITEL COUNT(EXEMPLAARNR) FROM AUTTEURS, BOEKEN, EXEMPLAREN WHERE AUTEURS.AUTEURNR = BOEKEN.BOEKNR AND EXEMPLAAR.BOEKNR = BOEKEN.BOEKNR GROUP BY BOEKEN.TITEL HAVING COUNT(EXEMPLAARNR) >= 2 Giel Jacobs oktober 2003