Sondervick College – Veldhoven Hoofdstuk 9 Relationele databases en SQL Inleiding SQL: basis twee...
-
Upload
evelien-cools -
Category
Documents
-
view
224 -
download
5
Transcript of Sondervick College – Veldhoven Hoofdstuk 9 Relationele databases en SQL Inleiding SQL: basis twee...
Sondervick College – Veldhoven
Hoofdstuk 9
Relationele databasesen
SQL
Inleiding
SQL: basis
twee tabellen
functies
oefeningen
subqueries
exists
Database Gegevensbank = verzameling van gegegevens
DBMSDatabase Management systeem
Relationeel model Een manier om een database te organiseren, nl. met tabellen
Een rij in de tabel:Alle gegevens van een bepaalde kaart of record
Kolommen in de tabel:Worden ook wel velden genoemd
Een aantal DBMS’en:AccessFilemakerOracleMySQL
Sondervick College - Veldhoven
Sondervick College - Veldhoven
Taken van een databasesysteem
Het opslaan van gegevens en het mogelijk maken van wijzigingen
Het kunnen opvragen van informatie en het verwerken van informatie
Het bewaken van de integriteit (dus het voorkomen van fouten)
Sondervick College - Veldhoven
Tabel: LEERLINGENLLNR - VOORNAAM - TUSSENVOEGSEL - ACHTERNAAM - STRAAT - HUISNUMMER - POSTCODE - PLAATS - TELEFOON - GESLACHT - GEB_DATUM - KLAS
Tabel: AUTEURSAUTEURNR - VOORNAAM - VOORLETTERS - TUSSEN-VOEGSEL - ACHTERNAAM - GEB_DATUM - STERF_JAAR
Tabel: BOEKENBOEKNR - AUTNR - TITEL - RUBRIEK
Tabel: EXEMPLARENEXNR - BOEKNR - UITLEENBAAR - STATUS
De voorbeelden op de volgende dia’s hebben betrekking op de database Bibliotheek, met de volgende tabellen:
Sondervick College - Veldhoven
Er komen kolommen voor die alleen maar een nummer bevatten:
LLNR / AUTEURNR / BOEKNR / EXNR
Reden: • Een nummer is altijd uniek. Je kunt twee leerlingen met exact dezelfde naam hebben, maar de leerlingennummers verschillen altijd.
• Met een nummer kun je gemakkelijk verwijzen naar een andere tabel.
Sondervick College - Veldhoven
Basisstructuur van een eenvoudige query
Sondervick College - Veldhoven
SELECT: Achter SELECT geef je de kolommen op die je in de uitvoer wilt zien.
Zet je achter select een sterretje in plaats van kolomnamen, dan krijg je de inhoud van alle kolommen op het scherm.
FROM: Achter FROM geef je de naam van de tabel (of tabellen) waaruit deze kolommen komen.
Sondervick College - Veldhoven
SELECT VOORNAAM, TUSSENVOEGSEL, ACHTERNAAM, KLAS
FROM LEERLINGEN
ORDER BY ACHTERNAAM
Je kunt ook op twee of meer kolommen laten sorteren, door achter ORDER BY de twee kolommen op te geven.
Door de opdracht ORDER BY wordt de lijst gesorteerd.
Sondervick College - Veldhoven
SELECT VOORNAAM, TUSSENVOEGSEL, ACHTERNAAM, KLAS
FROM LEERLINGEN
ORDER BY 3 DESC
DESC betekent: Aflopend (Descending), dus van Z naar A.Als er niets vermeld wordt (of ASC = ascending) wordt oplopend gesorteerd.
Nu wordt op de 3e kolom gesorteerd (ACHTERNAAM)
Sondervick College - Veldhoven
SELECT PLAATS
FROM LEERLINGEN
Het resultaat is een lange rij van plaatsnamen.Die plaatsnamen kunnen meerdere keren voorkomen.
SELECT DISTINCT PLAATS
FROM LEERLINGEN
Door DISTINCT wordt elke plaats maar één keer afgedrukt.
Sondervick College - Veldhoven
Er kunnen voorwaarden worden gesteld aan de rijen, die moeten worden afgedrukt.
SELECT
FROMWHERE
VOORNAAM, TUSSENVOEGSEL, ACHTERNAAMLEERLINGEN
GESLACHT = "M"
Voorwaarden geef je achter het sleutelwoord: WHERE
Alleen de leerlingen, die als geslacht M hebben, worden
afgedrukt
Sondervick College - Veldhoven
Je mag wildcards gebruiken bij de voorwaarden, maar je moet dan geen = maar like als vergelijkingsoperator gebruiken.
SELECT
FROMWHERE
VOORNAAM, TUSSENVOEGSEL, ACHTERNAAMLEERLINGENVOORNAAM like "M*"
Alle leerlingen, waarvan de voornaam met een M begint, worden afgedrukt
Sondervick College - Veldhoven
%
_
< en >
<= en >=
< >
Standaard SQL: er mag alles staan (ook meer tekens)
Standaard SQL: één willekeurig teken
Kleiner dan / groter dan
Kleiner dan of gelijk aan / groter dan of gelijk aan
Niet gelijk aan
* In Access: er mag alles staan (ook meerdere tekens)
In Access: één willekeurig teken?
Sondervick College - Veldhoven
SELECT *
FROM LEERLINGEN
WHERE TELEFOON IS NULL
Dit betekent:
Er is niets ingevuld
Sondervick College - Veldhoven
Als er aan meer dan één voorwaarde moet worden voldaan gebruik je AND
SELECT *
FROM LEERLINGEN
WHERE ACHTERNAAM = "Bakker"
AND TUSSENVOEGSEL = "de"
AND VOORNAAM = "Jantine"
Alleen de gegevens van Jantine de Bakker worden afgedrukt
Sondervick College - Veldhoven
Deze OR is niet exclusief. D.w.z.: rijen die aan allebei de voorwaarden voldoen worden ook afgedrukt.
SELECT *
FROM LEERLINGEN
WHERE KLAS = "4A" OR KLAS = "4B"
Leerlingen die in klas 4A of 4B zitten worden afgedrukt, dus je krijgt een lijstje van de leerlingen van 4a en van 4b
Als aan de ene of aan de andere voorwaarde moet worden voldaan gebruik je OR
Sondervick College - Veldhoven
SUM(KOLOMNAAM)
MAX(KOLOMNAAM)
MIN(KOLOMNAAM)
AVG(KOLOMNAAM)
De gemiddelde waarde in de kolom
COUNT(KOLOMNAAM)
De kleinste waarde in de kolom
De grootste waarde in de kolom
De som van alle getallen in de kolom
Het aantal getallen of woorden in de kolom
Sondervick College - Veldhoven
We willen weten welke leerling de hoogste boete heeft betaald na het lenen van een boek
Dat doen we eerst m.b.v. twee queries, of als je de naam van de leerling ook wilt weten, zelfs drie
1: Wat is de maximale boete die betaald is?
2: Welke leerling(en) moesten die boete betalen?
Daarna laten we zien hoe het ook met één query kan m.b.v. subqueries
Sondervick College - Veldhoven
SELECT MAX (BOETE) FROM UITLENINGEN
We gaan eerst de maximale boete uitzoeken m.b.v. een query:
Dan zoeken we uit welk leerlingennummer uit de tabel UITLENINGEN bij die maximale boete hoort.
Die maximale boete blijkt 4 euro te zijn
SELECT LLNR
FROM UITLENINGEN
WHERE BOETE = 4
Deze twee queriesgaan we
combineren toteen query
Deze twee queriesgaan we
combineren totéén query
Sondervick College - Veldhoven
SELECT LLNR FROM UITLENINGEN
WHERE BOETE =
( SELECT MAX (BOETE)
FROM UITLENINGEN )
Dit is eensubquery
Nu weet je alleen het LLNR ennog niet de naam. Als je die wilt weten
moet er nog een subquery bij.Die staat op de volgende dia
Sondervick College - Veldhoven
SELECT NAAM, KLAS
FROM LEERLINGEN
WHERE LLNR IN
( SELECT LLNR
FROM UITLENING
WHERE BOETE =
( SELECT MAX(BOETE) FROM UITLENINGEN
))
Boeknr Auteurnr Titel Pub_jaar Rubriek
88 47 De woeste wandeling 1981 nederl
89 48 Jan van Gent 1968 nederl
Auteurnr Voornaam Achternaam Geb_jaar
47 Willem Frederik Hermans 1921
48 Ward HermansSondervick College - Veldhoven
We willen weten wie de auteur is van het boek met de titel: De woeste wandeling. Daarvoor moeten we twee tabellen combineren: AUTEURS en BOEKEN
Tabel Boeken:
Tabel Auteurs:
Deze nummers moeten gelijk zijn
Deze nummers moeten gelijk zijn
Sondervick College - Veldhoven
SELECT TITEL, VOORNAAM, ACHTERNAAM
FROM BOEKEN, AUTEURS
WHERE TITEL = "De woeste wandeling" AND
BOEKEN.AUTEURNR = AUTEURS. AUTEURNR
Dit noem je eenjoin
Denk bij een query met twee tabellen
altijd om de join (zie hierboven)
De query, die de naam van de auteur van het boek met de titel De woeste wandeling levert, is:
Sondervick College - Veldhoven
Met GROUP BY kun je groeperen: de rijen van een kolom worden ingedeeld in groepen, die dezelfde gegevens in een kolom hebben. Daar kun je dan een functie op toepassen, bijv. het aantal rijen tellen, of de getallen optellen.
SELECT PLAATS, COUNT(*)
FROM LEERLINGEN
GROUP BY PLAATS
Voorbeeld: geef de plaatsen, waar leerlingen wonen, met het aantal leerlingen per plaats
Het aantal perplaats wordt geteld
Sondervick College - Veldhoven
SELECT PLAATS, COUNT(*)
FROM LEERLINGEN
GROUP BY PLAATS
HAVING COUNT(*) > 5
Alleen de plaatsenwaar meer dan vijf
leerlingen wonen worden afgedrukt
Stel je bij het gebruik van GROUP BY een extra voorwaarde aan de uitkomst van de functie, dan doe je dat met HAVING
Sondervick College - Veldhoven
SELECT VOORNAAM, ACHTERNAAM
FROM LEERLINGEN
WHERE NOT EXISTS
( SELECT * FROM UITLENINGEN
Die zijn er dus niet!
Geef de leerlingen die nooit een boek geleend hebben
De query, waarin je om de boeken vraagt die de leerling heeft geleend, moet geen resultaten opleveren!
WHERE UITLENINGEN.LLNR = LEERLINGEN.LLNR)
Sondervick College - Veldhoven
Er komen nu een aantal vragen die betrekking hebben op een database waarin de administratie van rundveehouderijenwordt bijgehouden
SQL-oefeningen
Bedenk na elke opgave zelf wat de sql-query zal zijn, druk dan op PageDown of klik op de muis
Sondervick College - Veldhoven
Bedrijven
Rundvee administratie:De tabellen en velden
bedrijfsnr naam adres postc plaats tel
Koeien
koenr vader moeder gebdat bedrijfsnr
koenr jaar kgmelk vetgeh eiwitgeh
Jaarprod
Tabellen
Kolommenof Velden
Sondervick College - Veldhoven
Geef naam, adres en plaats van het bedrijf met nummer 213
Select naam,adres,plaats
SQL, de basis
From bedrijven
Where bedrijfsnr=‘213’ ;
Sondervick College - Veldhoven
Geef alle gegevens van de koeien van het bedrijf met nummer 213 gesorteerd op geboortedatumSelect *
Alle kolommen
From koeien Where bedrijfsnr=‘213’Order by gebdat ;
Sondervick College - Veldhoven
Geef een lijstje van alle plaatsen waar bedrijven zijn gevestigd (elke plaats maar één keer tonen)
Select distinct plaats
Duplicaten voorkomen
From bedrijven ;
Sondervick College - Veldhoven
Geef de nummers van de koeien die in 2002 een melkproductie hadden van meer dan 8000 kg.Select koenr
Samengestelde voorwaarde
From jaarprod Where jaar=‘2002’
and kgmelk>8000;
Sondervick College - Veldhoven
Geef naam, adres en plaats van alle bedrijven waarvan de postcode met 92 begint
Select naam, adres, plaats
Wildcards
From bedrijven Where postcode like ‘92*’ ;
Sondervick College - Veldhoven
Geef het aantal koeien dat ze op het bedrijf met nummer 213 hebben
Select count(*)
De rijen tellen
From koeien
Where bedrijfsnr=‘213’ ;
Sondervick College - Veldhoven
Geef het totaal aantal kg. melk dat in 2002 is gemolken
Select sum(kgmelk)
De som van alle getallen in een kolom
From jaarprod
Where jaar=‘2002’ ;
Sondervick College - Veldhoven
Geef een lijstje van alle bedrijfsnummers met het aantal koeien op dat bedrijf
Select bedrijfsnr, count(*)
Verdeel in groepjes en tel de aantallen daarin
From koeien
Group by bedrijfsnr;
Sondervick College - Veldhoven
Geef een lijstje van alle koe-nummers met het aantal kg. melk dat ze in totaal hebben gegevenSelect koenr, sum(kgmelk)
Groeperen
From jaarprod Group by koenr;
N.B.:achter group by en achter select altijd dezelfde kolomnamen zetten !
Sondervick College - Veldhoven
Geef een lijstje van alle moeders die meer dan 10 kinderen hebben Select moeder, count(*)
Having
From koeien Group by moeder Having count(*)>10;
Sondervick College - Veldhoven
Geef het nummer van de koe die in 2002 de grootste hoeveelheid melk gaf
Select koenr
Een subquery
from jaarprod where
Kgmelk=(select max(kgmelk) from jaarprod where jaar=‘2002’) ;
Sondervick College - Veldhoven
Geef een lijstje van de koenummers van de koeien van bedrijven die gevestigd zijn in OenkerkSelect koenr from koeien
Subquery met in
Where bedrijfsnr in (select
bedrijfsnr from bedrijven where plaats = ‘Oenkerk’) ;
Sondervick College - Veldhoven
Geef van koenr 213 de geboorte-datum en de naam en plaats van het bijbehorende bedrijfSelect gebdatum,naam,plaats
Twee tabellen gebruiken
From bedrijven, koeien Where koenr=‘213’ and bedrijven.bedrijfsnr=koeien.bedrijfsnr;
Sondervick College - Veldhoven
Geef een lijstje met de nummers en de geboorte-data van de koeien en de naam en plaats van het bedrijf van de koeien die in 2002 meer dan 8000 kg. melk gaven.Select koeien.koenr,gebdat,naam,plaats
Drie tabellen gebruiken
From bedrijven, koeien, jaarprod Where kgmelk>8000 and jaar=‘2002’ and bedrijven.bedrijfsnr=koeien.bedrijfsnrand koeien.koenr=jaarprod.koenr;
Sondervick College - Veldhoven
Geef alle bedrijfsnrs van bedrijven die geen koeien hebben die meer dan 8000 kg. melk hebben gegevenSelect distinct bedrijfsnr from koeien
Exists en not exists
Where not exists (select koenrFrom jaarprod where kgmelk>8000And jaarprod.koenr=koeien.koenr);
Einde