Download de presentatie
De presentatie wordt gedownload. Even geduld aub
GepubliceerdGustaaf Veenstra Laatst gewijzigd meer dan 10 jaar geleden
1
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl SQL 4 : 1. Meer met gerelateerde tabellen 2. Data toevoegen, wijzigen, verwijderen 3. ‘Normalisatie’ en ‘Referentiele integriteit’
2
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl 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
3
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl 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
4
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl 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
5
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl 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 1fiets100120 2brood11,05 5boek3036
6
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl SELECT DISTINCT SELECT DISTINCT categorie FROM product categorie vervoer voedsel boek
7
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl statistieken 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 6 118880002.05 boek 3 20,704010
8
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl Gekoppelde tabellen
9
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl Relatie tussen product en producent
10
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl 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 …………
11
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl JOIN = SELECT tabel1.*, tabel2.Nm FROM tabel1 LEFT JOIN tabel2 ON tabel1.tabel2ID = tabel2.ID t1.ID t1.Nmt1.t2IDt2.IDt2.Nm 1 aaa11een 2 gghg11een 3 uoig22twee
12
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl Drie soorten koppelingen LEFT JOIN RIGHT JOIN INNER JOIN En nog een vierde FULL JOIN ( bonuspunt voor Paul )
13
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl 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
14
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl 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
15
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl 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
16
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl 90% 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
17
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl 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, producent.naam
18
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl 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 )
19
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl 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.
20
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl Many-to-many bestelling product Een aparte tabel met bestellingID-productID paren
21
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl 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
22
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl 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 301-9-2003Bos 46-12-2003Graaf
23
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl Welke klanten hebben iets besteld van producent X? Uit welke categorieën doet klant X zijn bestellingen ?
24
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl 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
25
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl Tot zover het samenvoegen van tabellen (JOIN)
26
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl Subquery SELECT in een SELECT Twee manier om een subquery te gebruiken In een selectie criterium In een berekende kolom NB: het is altijd mogelijk en vaak zelfs beter om hetzelfde met een JOIN te bereiken.
27
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl 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
28
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl 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
29
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl bonus vraag Waarom is het eigenlijk niet toegestaan om onderstaande querie te maken SELECT * FROM (SELECT * FROM klant)
30
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl En dan nu: data manipuleren INSERT UPDATE DELETE
31
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl 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
32
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl 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
33
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl DELETE Verwijder klant 1 DELETE * FROM klant WHERE ID = 1 DELETE * FROM tabel WHERE criterium
34
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl 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?
35
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl 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?
36
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl 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?
37
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl Referentiele integriteit
38
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl 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.
39
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl 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’
40
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl ‘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
41
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl Integriteit waarborgen = functionaliteit afschermen 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 bugs.
42
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl Methodes om referentiele integriteit te waarborgen 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. PHP: Dataobjecten: alle queries moeten via een dataobject. Het object is zo geprogrammeerd dat de database integer blijft.
43
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl TOETS Wat kan je verwachten
44
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - j.meuwese@interactievemedia.hva.nl - http://oege.ie.hva.nl/~meuwj/ - http://hva.jochem.nl TOETS Begrippen omschrijven SQL queries maken Selecties in gewone taal bedenken Niveau voor een V : alle ‘*’ opdrachten uit “readerSQL.doc”
Verwante presentaties
© 2024 SlidePlayer.nl Inc.
All rights reserved.