De presentatie wordt gedownload. Even geduld aub

De presentatie wordt gedownload. Even geduld aub

DB&SQL4- 1 Sets in een RDBS Een database bevat een set tabelschema’s (entiteitsklassen) Een tabelschema (entiteitsklasse) bevat een set attribuutnamen.

Verwante presentaties


Presentatie over: "DB&SQL4- 1 Sets in een RDBS Een database bevat een set tabelschema’s (entiteitsklassen) Een tabelschema (entiteitsklasse) bevat een set attribuutnamen."— Transcript van de presentatie:

1

2 DB&SQL4- 1 Sets in een RDBS Een database bevat een set tabelschema’s (entiteitsklassen) Een tabelschema (entiteitsklasse) bevat een set attribuutnamen met hun type Een tabel bevat een set records (entiteiten) Een record bevat een set waarden gekoppeld aan attribuutnamen Een resultaat van een query is een set records NB hoewel settheorie de basis is van het relationeel model wordt in Access niet altijd in sets gewerkt en kun je toch duplicaat records krijgen, gebruik zo nodig DISTINCT(ROW).

3 DB&SQL4- 2 Verzamelingen Het relationeel model is gebaseerd op de verzamelingenleer. Een verzameling (set) bestaat uit 0 - N (  ) elementen. Het aantal elementen: de kardinaliteit van de set. Een element kan zelf weer een set zijn. {}lege set {1,8,3}een set met 3 elementen {{2,4},{1,8}}een set met twee sets als elementen De elementen van een set zijn ongeordend {1,8,3}={8,1,3} De elementen van een set zijn uniek (vgl groep individuen) {1,8,3,3,1}= {1,8,3}

4 DB&SQL4- 3 Operaties op verzamelingen Samenvoegen van twee sets: vereniging / union A  B {1,2,5,6}  {2,6,7}= {1,2,5,6,7} Gemeenschappelijke deel van twee sets: doorsnede / intersectionA  B {1,2,5,6}  {2,6,7}= {2,6} verschil / difference van twee sets: A - B {1,2,5,6} – {2,6,7}= {1,5}

5 DB&SQL4- 4 Setoperaties op hele tabellen: UNION (opdracht in Access SQL) Verenigingentiteiten uit twee tabellen samenvoegen VB: samenvoegen van 2 ledenlijsten NaamAdresWpl NaamAdres Wpl AAAweg 1AAAAweg 1 A BBBweg 2B DDDweg 4 D CCCweg 3C union EEEweg 5 E NaamAdresWpl AAAweg 1A BBBweg 2B CCCweg 3C DDDweg 4D EEEweg 5E VVV ADO

6 DB&SQL4- 5 Setoperaties op hele tabellen: INTERSECTION niet als opdracht in Access SQL Doorsnedegemeensch. elementen uit twee tabellen VB: vergelijken van 2 ledenlijsten: wie is van beide lid? NaamAdresWpl NaamAdres Wpl AAAweg 1AAAAweg 1 A BBBweg 2B DDDweg 4 D CCCweg 3C intersection EEEweg 5 E NaamAdresWpl AAAweg 1A VVVADO

7 DB&SQL4- 6 Setoperaties op hele tabellen: DIFFERENCE niet als opdracht in Access SQL Difference/exceptverschil tussen twee tabellen VB: wie is wel van VVV maar niet van ADO lid? VVVADO NaamAdresWpl NaamAdres Wpl AAAweg 1AAAAweg 1 A BBBweg 2B DDDweg 4 D CCCweg 3C VVV-ADO EEEweg 5 E NaamAdresWpl BBBweg 2B CCCweg 3 C

8 DB&SQL4- 7 Setoperaties op groepen records Verenigingkeus tussen verschillende restricties OR b.v. geef me planten met rode OF paarse kleur Intersectiemeerdere restricties tegelijk AND b.v.Welke planten zijn van de soort bol EN bloeien in maart? Verschilpositive en negatieve restrictie (AND NOT) b.v. Welke planten zijn van de soort bol maar bloeien NIET in maart?

9 DB&SQL4- 8 Cartesisch product van tabellen Productentiteiten uit twee tabellen combineren tot een nieuwe entiteit VB alle mogelijke combinaties voor gemengd spel VNaamVLftMNaam MLft V128M1 28 V2 24M2 18 V318 product VNaamVLft Mnaam MLft V128M1 28 V224M1 28 V318M1 28 V128M2 18 V224M2 18 V318M2 18

10 DB&SQL4- 9 Joins-1 Equi joinproduct van tabellen met restrictie: alleen de rijen met een gelijke waarde voor een gelijk attribuut (gewoonlijk sleutel/verwijzende sleutel) VB: Geef paren met gelijke leeftijd: VNaamVLftMNaam MLft V128M1 28 V2 24M2 18 V318 equi-join VLft=MLft VNaam VLft Mnaam Lft V128M1 28 V318M2 18

11 DB&SQL4- 10 Joins-2 Theta join: product van 2 tabellen met restrictie: alleen rijen met ongelijke waarde voor een gelijk attribuut (, = ) VB: Geef paren waarbij de man ouder is dan de vrouw VNaamVLftMNaam MLft V128M1 28 V2 24M2 18 V318 theta join MLft > VLft VNaam VLftMnaam MLft V2 24M1 28 V3 18M1 28

12 DB&SQL4- 11 Joins-3 Inner join of kortweg join (SQL join of via restrictie) product van 2 (of meer) tabellen restrictie: rijen met gelijke waarde voor gelijke attributen Natural join (als boven + selectie velden) : inner join, maar dubbele kolom(men) maar 1 keer in resultaat tabel Left/right outer join (SQL left/right join of via restrictie) Van één tabel alle records, ook als er geen combinatie bestaat Full outer join (alleen via restricties) Self join (tabel dupliceren) Een tabel combineren met zichzelf

13 DB&SQL4- 12 Twee gerelateerde tabellen BOOKS PUBLISHERS Publisher en Book zijn aparte entiteitsklassen/ tabellen, de relatie wordt gelegd via PubID, dit is de verwijzende sleutel in BOOKS naar een Publisher in PUBLISHERS

14 DB&SQL4- 13 Jointype definieren in relatieschema of QBE Wil je, als je de relatie boek-uitgever gebruikt in een query 1. alleen de combinaties van beiden zien? 2. alle boeken, en alleen de bijbehorende uitgevers? 3. alle uitgevers, en alleen de bijbehorende boeken? Default in Access is 1, maar soms is een andere keus nuttig, dan kun je b.v. zoeken naar de uitgevers zonder boeken. Als je een relatie definieert kun je kiezen. 1 is de equi-join, 2 en 3 zijn outer joins Opties voor een relatie -1

15 DB&SQL4- 14 Twee eisen aan een veld? Wie verkoopt tofu en konbu? Eerste interpretatie: of Select s.SupplierName FROM Suppliers s, Products p WHERE s.SupplierID = p.SupplierID AND (p.ProductName = ‘tofu’ OR p.Productname = ‘konbu’); s p SupplierName SupplierID SupplierID ProductName Mayumi’s 6 6 konbu Mayumi’s 6 6 tofu NewSupp konbu Een WHERE clause geeft de restricties aan voor één record (regel) van de (combinatie)tabel. Hoe regel je de interpretatie zowel.. als.. ?

16 DB&SQL4- 15 Een tabel tweemaal raadplegen Stileren: Geef de naam van de Supplier s waarvoor geldt dat s verkoopt ‘tofu’ en s verkoopt ‘konbu’ oftewel: er is een product p1 in Products met p1.ProductName = ‘tofu’ te koop bij s (p1.SupID = s.SupID) en er is een product p2 in Products met p2.ProductName = ‘konbu’ te koop bij s (p2.SupID = s.SupID)

17 DB&SQL eisen aan 1 record via duplicaattabel (ook andere mogelijkheden) SELECT s.CompanyName FROM Suppliers s, Products p1, Products p2 WHERE s.SupplierID = p1.SupplierID AND p1.ProductName = ‘tofu’ AND s.SupplierID = p2.SupplierID AND p2.ProductName = ‘konbu’ s p1 p2 SupName SupID SupID Product SupID Product Mayumi’s 6 6 tofu 6 konbu

18 DB&SQL4- 17 Geef aantal boeken, som, gemiddelde, maximum en minimum prijs van BOOKS: SELECT COUNT(*) AS N, SUM(Price) AS Sum, AVG(Price) AS Avg, MAX(Price) AS Max, MIN(Price) AS Min FROM BOOKS NSumAvgMaxMin 15F 659,90F 43,99F 250,00F 12,00 Statistische functies

19 DB&SQL4- 18 Statistische functies per groep -1 Geef aantal boeken, totale prijs en gemiddelde prijs per PubID SELECT COUNT(*) AS N, SUM(Price) AS Sum, AVG(Price) AS Avg, PubID FROM BOOKS GROUP BY PubID NSumAvgPubID 6F 139,95F 23,331 3F 103,00F 34,332 5F 166,95F 33,393 1F 250,00F 250,004

20 DB&SQL4- 19 Stat. functies per groep - 2 Hoe duur is het duurste boek van elke uitgever? Geef naam en nummer van de uitgever en zijn hoogste prijs, sorteer op prijs SELECT p.PubName, p.PubID, Max(b.Price) AS Maximum FROM BOOKS b, PUBLISHERS p WHERE b.PubID = p.PubID GROUP BY p.PubName, p.PubID ORDER BY Max(b.Price); In ORDER BY en GROUP BY geen alias voor veldnaam (dus niet Maximum gebruiken i.p.v. Max(b.Price) In GROUP BY alle velden uit de SELECT-clause die geen stat. functie bevatten.

21 DB&SQL4- 20 Statistische functies: groepscriterium Geef de gemiddelde prijs van de boeken van die uitgever(s) waarvan we meerdere boeken hebben Stileren: Geef de PubIDs in BOOKS, met de gemiddelde prijs van hun BOOKS voor die PubID waarvoor geldt dat het aantal BOOKS > 1 Genereren: SELECT PubID, AVG(Price) FROM BOOKS GROUP BY PubID HAVING COUNT(*) > 1; Een criterium op recordniveau zet je in WHERE HAVING geeft een statistisch criterium voor een groep

22 DB&SQL4- 21 Syntax van SELECT.. SELECT (DISTINCT) attribuut|expression (AS kolomnaam),.. ->keuze van de velden in de resultaattabel FROM tabel (AS) alias,.. ->benodigde tabellen, eventueel met afkorting WHERE relatiecriteria AND zoekcriterium AND/OR.. ->met diverse vergelijkingsoperatoren (, =) GROUP BY alle niet-statistische velden in resultaattabel ->bij gebruik van stat. functies in SELECT clause HAVING statistisch criterium ->criteria voor subgroepen ORDER BY attr ->sorteren van resultaattabel

23 DB&SQL4- 22 Oefenen Geef de uitgevernamen + aantal door hen uitgegeven boeken van de uitgevers die een gemiddelde prijs onder de 25 hebben SELECT p.PubName, COUNT(b.ISBN) As Aantal FROM PUBLISHERS p, BOOKS b WHERE p.PubID = b.PubID GROUP BY p.PubID, p.PubName HAVING AVG(b.Price) < 25; Waarom zou je hier (eventueel) PubID in GROUP BY zetten?

24 DB&SQL4- 23 Subquery 1 1. Wat is de hoogste boekenprijs in de collectie? SELECT MAX(b.Price) FROM BOOKS b; 2. Wat is het duurste boek uit de collectie? ???

25 DB&SQL4- 24 Subquery 1 - vervolg Stileren: Title van BOOKS waarvoor-geldt-dat Price is de hoogste prijs in BOOKS SQL genereren: SELECT Title FROM BOOKS WHERE Price = (SELECT MAX(Price) FROM BOOKS); In de subquery (subselect) wordt opnieuw naar de tabel BOOKS gekeken om het maximum op te zoeken NIET: WHERE Price = Max(Price) want wat zou dat betekenen?

26 DB&SQL4- 25 Subquery 2 Geef me de boeken die duurder zijn dan gemiddeld Stileren: BOOKS b waarvoor geldt dat Price groter is dan de gemiddelde Price van BOOKS Genereren: SELECT ISBN, Title, Price FROM BOOKS WHERE Price > (SELECT AVG(Price) FROM BOOKS);

27 DB&SQL4- 26 Subquery 3 Wat is de langste auteursnaam in ons bestand en hoe lang is hij? Stileren: a.AuName en lengte van a.AuName van AUTHORs a waarvoor-geldt-dat de lengte van a.AuName is de maximumlengte van AuName in AUTHORS of de lengte van a.AuName is groter of gelijk aan alle waarden van AuName in AUTHORS

28 DB&SQL4- 27 Subquery 3 - SQL Genereren: SELECT AuName, Len(AuName) FROM AUTHORS WHERE Len(AuName) = (SELECT Max(Len(AuName)) FROM AUTHORS); of: SELECT AuName, Len(AuName) FROM AUTHORS WHERE Len(AuName) >= ALL (SELECT Len(AuName) FROM AUTHORS); NB naast ALL bestaat ook ANY en SOME

29 DB&SQL4- 28 IN met een subquery IN kan wordt gebruikt als meer dan een waarde kan voldoen ; zulke waarden kunnen worden opgehaald met een subselect. Geef de boeken van publishers met een naam op ‘House’ SELECT * FROM BOOKS WHERE PubID IN (SELECT p.PubID FROM PUBLISHERS p WHERE p.PubName LIKE "*House";) N.B. Alternatief in dit geval natuurlijk SELECT.. (BOOKSvelden) FROM BOOKS b, PUBLISHERS p WHERE b.PubID = p.PubID AND p.PubName LIKE "*House";

30 DB&SQL eisen aan 1 record: Via Exists EXISTS: geeft aan dat een subselect een resultaat heeft (de set niet leeg is) SELECT s.CompanyName FROM Suppliers s WHERE EXISTS (SELECT * FROM Products p WHERE s.SupplierID = p.SupplierID AND p.ProductName = 'tofu’) AND EXISTS (SELECT * FROM Products p WHERE p.SupplierID = s.SupplierID AND p.ProductName = 'konbu'); Omdat tabel s niet in de FROM- clause staat, wordt de ‘centrale’ s.SupplierID gebruikt!

31 DB&SQL4- 30 NOT EXISTS Is er een uitgever zonder boeken? Stileren: Geef de publisher p van PUBLISHERS waarvoor geldt dat er geen boek b van BOOKS bestaat dat p heeft b uitgegeven (dus PubID gelijk) SELECT * FROM PUBLISHERS p WHERE NOT EXISTS (SELECT * FROM BOOKS b WHERE p.PubID = b.PubID); (alternatief: outer join + NULL-criterium)

32 DB&SQL4- 31 Statistische eisen aan een groep Uitgevers met minder dan 3 boeken: SELECT p.PubName FROM PUBLISHERS p, BOOKS b WHERE p.PubID = b.PubID GROUP BY p.PubName HAVING COUNT(b.Title) < 3; De uitgever met de minste boeken?

33 DB&SQL4- 32 Subselect in HAVING SELECT p.PubName, COUNT(b.ISBN) FROM Publishers AS p, Books AS b WHERE p.PubID=b.PubID GROUP BY p.PubName HAVING COUNT(b.ISBN) <= ALL (SELECT COUNT(ISBN) FROM BOOKS GROUP BY PubID)

34 DB&SQL4- 33 Meer dan één Vraag: Geef me de auteurs die bij meer dan één uitgever zijn Stileren: Geef de a.AuNames in AUTHORS waarvoor geldt dat voor hun BOOKS b (relatie via BOOK/AUTHOR) geldt dat het aantal verschillende b.PubID >1

35 DB&SQL4- 34 Meer dan een? SELECT a.AuName FROM BOOKS b, [BOOK/AUTHOR] ba, AUTHORS a WHERE a.AuID = ba.AuID AND b.ISBN = ba.ISBN GROUP BY a.AuName HAVING COUNT(b.PubID) > 1; Wat gaat hier fout? Probleem: COUNT(DISTINCT..) wordt niet geaccepteerd, dus bij elk boek wordt PubID meegeteld, of hij hetzelfde of anders is dan de vorige

36 DB&SQL4- 35 Meer dan 1: dubbele tabel JOIN- Structuur: BOOKS BOOK/AUTH AUTHORS BOOK/AUTH BOOKS b1---ba1---a---ba2---b2 SELECT DISTINCT a.AuName FROM BOOKS AS b1,[BOOK/AUTHOR] AS ba1, AUTHORS AS a, [BOOK/AUTHOR] AS ba2, BOOKS AS b2 WHERE b1.ISBN = ba1.ISBN AND ba1.AuID = a.AuID AND b2.ISBN = ba2.ISBN AND ba2.AuID = a.AuID AND b1.PubID <> b2.PubID; of via EXISTS

37 DB&SQL4- 36 Meer dan x???

38 DB&SQL4- 37 Meer dan x uitgevers: via 2 queries Maak eerst een query die alle bestaande relaties AUTHOR-PUBLISHER toont, sla hem op als AUTH_PUB SELECT DISTINCT a.AuName, p.PubID FROM AUTHORS a, [BOOK/AUTHOR] ba, BOOKS b, PUBLISHER p WHERE a.AuID = ba.AuID AND ba.ISBN = b.ISBN AND b.PubID = p.PubID; Dan een query die in AUTH_PUB de juiste records selecteert: SELECT AuName FROM AUTH_PUB GROUP BY AuName HAVING COUNT(*) > 1;


Download ppt "DB&SQL4- 1 Sets in een RDBS Een database bevat een set tabelschema’s (entiteitsklassen) Een tabelschema (entiteitsklasse) bevat een set attribuutnamen."

Verwante presentaties


Ads door Google