Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese SQL 4 : 1. Meer met gerelateerde tabellen 2. Data toevoegen, wijzigen, verwijderen 3. ‘Normalisatie’ en ‘Integriteit’
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese Tot nu toe Tabel: rijen en kolommen Datatype: typologie op basis van mogelijk operaties Selecteren uit een enkele tabel ( SELECT ) Tabellen koppelen met primairy key (PK) foreign key (FK) Tabellen samenvoegen LEFT JOIN RIGHT JOIN INNER JOIN Soorten relaties Many-to-one One-to-many One-to-one Many-to-many
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese Basis datatype Type informatie in een veld Bepaalt het soort operaties dat je er op kan uitvoeren. basis datatypen die in iedere database of programmeertaal op één of andere manier worden ondersteund: Numeriek Tekst Boolean Binair Datum/tijd Lange tekst
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese Syntax van een eenvoudige SELECT SELECT ID, naam, prijs FROM product WHERE categorie = ‘boek’ ORDER BY prijs IDnaamprijs 8groentensoep2,15 7appelsap2,95 9blik tonijn3,15
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese Berekeningen in SELECT (numeriek) Selecteer de naam, prijs en prijs_plus_btw SELECT ID, naam, prijs, prijs + prijs* btw_tarief/100 AS prijs_met_btw FROM product IDNaamprijsprijs_met_btw 1fiets brood11,05 5boek3036
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese SELECT DISTINCT SELECT DISTINCT categorie FROM product = SELECT categorie FROM product GROUP BY categorie categorie vervoer voedsel boek
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese Statistieken/aggregaties SELECT categorie, COUNT(*) AS aantal, AVG(prijs) AS midPrijs, MAX(prijs) AS maxPrijs, MIN(prijs) AS minPrijs FROM product GROUP BY categorie Cat Aantal midPrijs maxPrijs minPrijs vervoer boek 3 20,704010
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese Gekoppelde tabellen
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese Relatie tussen product en producent
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese SELECT uit twee gekoppelde tabellen Selecteer alle producten en koppel daar aan de naam van de producent SELECT product.*, producent.naam AS producentNaam FROM product LEFT JOIN producent ON product.producentID = producent.ID IDnaam…producentIDproducentNaam 3tonijn6unilever 4kip6unilever 5step4joop’s fiets …………
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese Drie soorten koppelingen LEFT JOIN RIGHT JOIN INNER JOIN Oefening: Maak alle soorten joins en vergelijk de verschillen.
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese LEFT JOIN Alle rijen uit de linker tabel, ook als er geen relatie is met een rij uit de rechter tabel. SELECT product.*, producent.naam AS producentNaam FROM product LEFT JOIN producent ON product.producentID = producent.ID IDnaam…producentIDproducentNaam 3tonijn6unilever 5step4joop’s fiets 10Karel en…NULLNULL
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese RIGHT JOIN Alle rijen uit de rechter tabel, ook als er geen relatie is met een rij uit de linker tabel. SELECT product.*, producent.naam AS producentNaam FROM product RIGHT JOIN producent ON product.producentID = producent.ID IDnaam…producentIDproducentNaam 3tonijn6unilever 5step4joop’s fiets NULLNULL9Amalia
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese INNER JOIN Alleen rijen uit de beide tabel, als er een relatie is met een rij uit de andere tabel. SELECT product.*, producent.naam AS producentNaam FROM product INNER JOIN producent ON product.producentID = producent.ID IDnaam…producentIDproducentNaam 3tonijn6unilever 5step4joop’s fiets
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese % van de koppelingen: ‘LEFT JOIN’ waarvan 80% ook met INNER JOIN kan Selecteer data uit een primaire tabel en koppel data uit gerelateerde tabellen SELECT product.*, producent.naam, producent.info FROM product LEFT JOIN producent ON product.producentID = producent.ID SELECT primaire_tabel.* gerelateerdetabel.* FROM primaire_tabel LEFT JOIN gerelateerde_tabel ON primaire_tabel.FK = gerelateerde_tabel.PK
Oefening met verschillende type JOIN’s Selecteer de gegevens van alle producten en koppel daaraan de gegevens van de gerelateerde producenten. Selecteer de gegevens van alle producenten en koppel daaraan de gegevens van gerelateerde producten - Maak voor beide situaties de LEFT, RIGHT en INNER JOIN en vergelijk de verschillen Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese
Aggregaties met een JOIN Selecteer alle producenten met daarbij het aantal producten dat die producent levert. SELECT producent.ID, producent.naam product.ID, product.naam FROM producent LEFT JOIN product ON producent.ID = product.producentID SELECT producent.ID, producent.naam COUNT( product.ID ) AS aantalproducten FROM producent LEFT JOIN product ON producent.ID = product.producentID GROUP BY producent.ID
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese Verschillende soorten relaties naar kwantiteit Many-to-one ( product -geproduceerd door> producent ) One-to-many ( klant -doet> bestelling ) One-to-one ( man –isgetrouwdmet> vrouw ) Many-to-many ( bestelling –besteldproduct> product )
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese Many-to-one Product wordt_geleverd_door producent Boek is_geschreven_door auteur Bestelling door klant One-to-many producent levert product auteur schrijft boek klant doet bestelling Many-to-one In de databasetabellen: De rijen in tabel aan de many-kant van de relatie bevat een FK die verwijst naar de PK van gerelateerde rij aan de one-kant van de relatie.
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese Many-to-many bestelling product Een aparte tabel met bestellingID-productID paren
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese Many-to-many Selecteer van bestelling met ID = 1 alle producten SELECT bestelling_product.aantal, product.ID, product.naam, product.prijs FROM bestelling_product INNER JOIN product ON bestelling_product.productID = product.ID WHERE bestelling_product.bestellingID = 1 AantalproductIDnaamprijs 301Toveren…20 2 3SQL…23
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese Many-to-many van product naar bestelling Selecteer van een product alle bestellingen SELECT bestelling_product.aantal, bestelling.datum, klant.naam FROM ( bestelling_product INNER JOIN bestelling ON bestelling_product.bestellingID = bestelling.ID) INNER JOIN klant ON bestelling.klantID= klant.ID WHERE bestelling_product.productID = 1 Aantaldatumnaam Bos Graaf
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese Welke klanten hebben iets besteld van producent X? Uit welke categorieën doet klant X zijn bestellingen ?
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese Als je de relaties volgt kan je allerlei informatie uit de database selecteren Alle klanten die iets hebben besteld van producent 1 SELECT DISTINCT klant.* FROM klant INNER JOIN bestelling ON bestelling.klantID = klant.ID INNER JOIN bestelling_product ON bestelling_product.bestellingID = bestelling.ID INNER JOIN product ON product.ID = bestelling_product.productID WHERE product.producentID = 1
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese Tot zover het samenvoegen van tabellen (JOIN)
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese Subquery (hoofdstuk 11) SELECT in een SELECT Twee manier om een subquery te gebruiken In een selectie criterium In een berekende kolom NB: het is heel vaak mogelijk en vaak zelfs beter om hetzelfde met een JOIN te bereiken.
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese Subqueries in WHERE … IN Selecteer klanten die iets hebben besteld SELECT klant.* FROM klant WHERE klant.ID IN ( SELECT klantID FROM bestelling ) SELECT DISTINCT klant.* FROM klant INNER JOIN bestelling ON klant.ID = bestelling.klantID
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese Subquerie om iets te berekenen Selecteer alle producenten en daarbij het aantal producten van die producenten SELECT producent.ID, producent.naam, (SELECT COUNT(*) FROM product WHERE product.producentID = producent.ID ) AS aantalproducten FROM producent SELECT producent.ID, producent.naam, COUNT(product.ID) AS aantalproducten FROM producent LEFT JOIN product ON product.producentID = producent.ID GROUP BY producent.ID, producent.Naam
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese En dan nu: data manipuleren INSERT UPDATE DELETE
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese INSERT Voeg een klant toe aan de tabel ‘klant’ INSERT INTO klant ( voornaam, achternaam ) VALUES ( 'piet', 'jansen') INSERT INTO tabel ( kolomX, kolomY, kolomZ ) VALUES ( waardeX, waardeY, waardeZ ) NB autonumber kolommen worden automatisch ingevuld bijvoordbeeld ID velden
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese UPDATE Wijzig de vooraam van klant 1 UPDATE klant SET voornaam = ‘Gijs' WHERE ID = 1 UPDATE tabel SET kolomX = waardeX, SET kolomY = waardeY, SET kolomZ = waardeZ, WHERE ID = 1
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese DELETE Verwijder klant 1 DELETE * FROM klant WHERE ID = 1 DELETE * FROM tabel WHERE criterium
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese Veel gestelde vragen Als je bij een nieuw product de producentID moet invullen, hoe weet je dan welke producentID je moet hebben? Gewoon de naam van de producent zou toch veel gemakkelijker zijn?
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese Veel gestelde vragen Als je bij een nieuw product de categorieID moet invullen, hoe weet je dan wel categorieID je moet hebben? Gewoon de naam van de categorie zou toch veel gemakkelijker zijn?
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese Veelgestelde vragen INSERT INTO tabel ( kolomX, kolomY ) VALUES ( waardeX, waardeY ) UPDATE tabel SET kolomX = waardeX, SET kolomY = waardeY, WHERE ID = 1 DELETE * FROM tabel WHERE criterium Waarom zijn INSERT, UPDATE en DELETE zo eenvoudig in vergelijking met SELECT?
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese (referentiele) Integriteit & Normalisatie
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese Normalisatie Alle informatie is slecht één keer in de database opgeslagen. In plaats van het dubbel opslaan van informatie worden relaties (FK’s ) gebruikt om te verwijzen naar informatie. Bijvoorbeelden: Niet bij ieder boek de naam van de auteur, maar een verwijzing (FK) naar de auteur in de auteurtabel, waar zijn naam één keer staat. Niet bij iedere bestelling de adresgegevens van de klant, maar een verwijzing (FK) naar de klant in de klant-tabel, waar de adresgegevens één keer staan.
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese Oops Wat gebeurd er als je per ongeluk Je een producent verwijdert, terwijl er nog producten van de producent in de tabel ‘product’ staan? Als je bij product.producentID een producentID invult die niet bestaat? De database wordt ‘corrupt’
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese ‘Referentiele integriteit’ Om te voorkomen dat een database ‘per ongeluk’ corrupt raakt, is het mogelijk om het database managementsysteem de opdracht te geven alle relaties af te dwingen. De RDBMS geeft dan foutmelding als je iets doet wat de database zou corrumperen Dit afdwingen van de referentiele integriteit is één van de belangrijkste functies van een RDBMS
mySQL en referentiele integriteit mySQL waarborgt niet altijd de referentiele integriteit. Database Engine: myISAM: Checkt niet de FK’s Ten kost van betrouwbaarheid Betere performance (tijd en ruimte) INNODB: Checkt FK’s Ten koste van performance Grotere betrouwbaarheid Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese
Integriteit waarborgen = functionaliteit afschermen ‘Modulariteit’ De database is zo geprogrammeerd dat geen corrupte data in kunnen. De programmeur van de Logic module kan geen requests doen die de data corrupt maken. => Minder kans op fouten.
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese Verantwoordelijkheid van de datarepository 1.Opslaan en terugvinden van data 2.Waarborgen van de integriteit van de data 3.Toegangsrechten voor gebruikers
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese Methodes & technieken DBMS controleert en geen foutmeldingen als er iets gebeurd wat de database corrupt maakt. ‘TRIGGERS’ in bouwen die bij gebeurtenissen de database update. ‘STORED PROCEDURES’ ( een serie SQL queries ) die de integriteit in tak houdt. ‘TRANSACTION PROCESSING’ : bij een foutmelding worden alle voorgaande queries teruggedraaid. VIEWS kunnen toegang regelen voor gebruikers. (Ook: performance) PHP: Dataobjecten: alle queries moeten via een dataobject. Het object is zo geprogrammeerd dat de database integer blijft.
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese TOETS Wat kan je verwachten
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese TOETS Begrippen omschrijven gesloten boek SQL queries maken open boek Niveau voor een 6: alle ‘*’ opdrachten Niveau voor een 8 alle ‘**’ opdrachten.