databases SQL
overzicht de basis filteren gevorderde query's op één tabel tabellen samenvoegen gevorderde query's op meerdere tabellen sub-query's
de basis
een tabel leerlingen lln_nr voornaam achternaam adres wpl 1 Joop Vos Bruggelaan 17 Son 2 Marleen Schippers Kerkstraat 12 Eindhoven 3 Issam Mourabit Struweel 81 Nuenen 4 Visser Brugstraat 15 5 Mieke 6 Irene Horst Domweg 21 7 Theo Stuurdreef 14a 8 Nisa Demir Hoogeind 8
de basis SELECT: FROM: resultaat: gevolgd door veldnamen die je wilt tonen (joker/wildcard) voor alle veldnamen FROM: gevolgd door tabelnaam resultaat: tabel SELECT * FROM leerlingen
voorbeeld SELECT * FROM leerlingen lln_nr voornaam achternaam adres wpl 1 Joop Vos Bruggelaan 17 Son 2 Marleen Schippers Kerkstraat 12 Eindhoven 3 Issam Mourabit Struweel 81 Nuenen 4 Visser Brugstraat 15 5 Mieke 6 Irene Horst Domweg 21 7 Theo Stuurdreef 14a 8 Nisa Demir Hoogeind 8
filteren
records filteren filteren: in SQL records filteren met: het proces waarbij gewenste elementen van ongewenste worden gescheiden in SQL records filteren met: WHERE gevolgd door Booleaanse expressie (waar/niet waar) SELECT * FROM leerlingen WHERE wpl = "Eindhoven"
voorbeeld SELECT * FROM leerlingen WHERE wpl = "Eindhoven" lln_nr voornaam achternaam adres wpl 1 Joop Vos Bruggelaan 17 Son 2 Marleen Schippers Kerkstraat 12 Eindhoven 3 Issam Mourabit Struweel 81 Nuenen 4 Visser Brugstraat 15 5 Mieke 6 Irene Horst Domweg 21 7 Theo Stuurdreef 14a 8 Nisa Demir Hoogeind 8 lln_nr voornaam achternaam adres wpl 2 Marleen Schippers Kerkstraat 12 Eindhoven 4 Joop Visser Brugstraat 15 5 Mieke 8 Nisa Demir Hoogeind 8
velden filteren filteren: in SQL velden filteren met: het proces waarbij gewenste elementen van ongewenste worden gescheiden in SQL velden filteren met: SELECT SELECT voornaam, achternaam, wpl FROM leerlingen
voorbeeld SELECT voornaam, achternaam, wpl FROM leerlingen lln_nr adres wpl 1 Joop Vos Bruggelaan 17 Son 2 Marleen Schippers Kerkstraat 12 Eindhoven 3 Issam Mourabit Struweel 81 Nuenen 4 Visser Brugstraat 15 5 Mieke 6 Irene Horst Domweg 21 7 Theo Stuurdreef 14a 8 Nisa Demir Hoogeind 8 voornaam achternaam wpl Joop Vos Son Marleen Schippers Eindhoven Issam Mourabit Nuenen Visser Mieke Irene Horst Theo Nisa Demir
records en velden filteren SELECT voornaam, achternaam, wpl FROM leerlingen WHERE wpl = "Eindhoven" lln_nr voornaam achternaam adres wpl 1 Joop Vos Bruggelaan 17 Son 2 Marleen Schippers Kerkstraat 12 Eindhoven 3 Issam Mourabit Struweel 81 Nuenen 4 Visser Brugstraat 15 5 Mieke 6 Irene Horst Domweg 21 7 Theo Stuurdreef 14a 8 Nisa Demir Hoogeind 8 voornaam achternaam wpl Joop Vos Son Marleen Schippers Eindhoven Issam Mourabit Nuenen Visser Mieke Irene Horst Theo Nisa Demir voornaam achternaam wpl Joop Vos Son Marleen Schippers Eindhoven Issam Mourabit Nuenen Visser Mieke Irene Horst Theo Nisa Demir voornaam achternaam wpl Marleen Schippers Eindhoven Joop Visser Mieke Nisa Demir
en nu tegelijk SELECT voornaam, achternaam, wpl FROM leerlingen WHERE wpl = "Eindhoven" lln_nr voornaam achternaam adres wpl 1 Joop Vos Bruggelaan 17 Son 2 Marleen Schippers Kerkstraat 12 Eindhoven 3 Issam Mourabit Struweel 81 Nuenen 4 Visser Brugstraat 15 5 Mieke 6 Irene Horst Domweg 21 7 Theo Stuurdreef 14a 8 Nisa Demir Hoogeind 8 voornaam achternaam wpl Marleen Schippers Eindhoven Joop Visser Mieke Nisa Demir
gevorderde query's op één tabel
gevorderde query's op één tabel moeilijkere record filters DISTINCT sorteren rekenfuncties COUNT groeperen filters op groepen
moeilijkere record filters andere vergelijkingsoperatoren !=, <, >, <=, >= jokers/wildcards %, _ (*, ? in sommige DBMSen) vergelijkingsoperator is LIKE samengestelde Booleaanse expressies AND, OR SELECT * FROM leerlingen WHERE (wpl != "Nuenen" OR lln_nr < 5) AND achternaam LIKE "V%"
voorbeeld SELECT * FROM leerlingen WHERE (wpl != "Eindhoven" OR lln_nr < 5) AND achternaam LIKE "V%" lln_nr voornaam achternaam adres wpl 1 Joop Vos Bruggelaan 17 Son 2 Marleen Schippers Kerkstraat 12 Eindhoven 3 Issam Mourabit Struweel 81 Nuenen 4 Visser Brugstraat 15 5 Mieke 6 Irene Horst Domweg 21 7 Theo Stuurdreef 14a 8 Nisa Demir Hoogeind 8 lln_nr voornaam achternaam adres wpl 1 Joop Vos Bruggelaan 17 Son 4 Visser Brugstraat 15 Eindhoven 7 Theo Stuurdreef 14a
DISTINCT filtert op unieke waardes in veld of groep velden altijd SELECT DISTINCT gevolgd door velden werkt altijd op alle genoemde velden SELECT DISTINCT wpl FROM leerlingen SELECT DISTINCT achternaam, wpl FROM leerlingen
voorbeeld SELECT DISTINCT wpl FROM leerlingen lln_nr voornaam achternaam adres wpl 1 Joop Vos Bruggelaan 17 Son 2 Marleen Schippers Kerkstraat 12 Eindhoven 3 Issam Mourabit Struweel 81 Nuenen 4 Visser Brugstraat 15 5 Mieke 6 Irene Horst Domweg 21 7 Theo Stuurdreef 14a 8 Nisa Demir Hoogeind 8 wpl Son Eindhoven Nuenen
voorbeeld SELECT DISTINCT achternaam, wpl FROM leerlingen lln_nr voornaam achternaam adres wpl 1 Joop Vos Bruggelaan 17 Son 2 Marleen Schippers Kerkstraat 12 Eindhoven 3 Issam Mourabit Struweel 81 Nuenen 4 Visser Brugstraat 15 5 Mieke 6 Irene Horst Domweg 21 7 Theo Stuurdreef 14a 8 Nisa Demir Hoogeind 8 achternaam wpl Vos Son Schippers Eindhoven Mourabit Nuenen Visser Horst Demir
sorteren ORDER BY gevolgd door veldnamen altijd aan eind van query ASC(ending): default oplopend: 1 309, 'a' 'z' DESC(ending) aflopend: 423 1, 'z' 'a' SELECT * FROM leerlingen ORDER BY wpl, achternaam DESC
voorbeeld SELECT * FROM leerlingen ORDER BY wpl, achternaam DESC lln_nr voornaam achternaam adres wpl 4 Joop Visser Brugstraat 15 Eindhoven 5 Mieke 2 Marleen Schippers Kerkstraat 12 8 Nisa Demir Hoogeind 8 3 Issam Mourabit Struweel 81 Nuenen 6 Irene Horst Domweg 21 1 Vos Bruggelaan 17 Son 7 Theo Stuurdreef 14a lln_nr voornaam achternaam adres wpl 1 Joop Vos Bruggelaan 17 Son 2 Marleen Schippers Kerkstraat 12 Eindhoven 3 Issam Mourabit Struweel 81 Nuenen 4 Visser Brugstraat 15 5 Mieke 6 Irene Horst Domweg 21 7 Theo Stuurdreef 14a 8 Nisa Demir Hoogeind 8 lln_nr voornaam achternaam adres wpl 2 Marleen Schippers Kerkstraat 12 Eindhoven 4 Joop Visser Brugstraat 15 5 Mieke 8 Nisa Demir Hoogeind 8 3 Issam Mourabit Struweel 81 Nuenen 6 Irene Horst Domweg 21 1 Vos Bruggelaan 17 Son 7 Theo Stuurdreef 14a
rekenfuncties gebruikt na SELECT MIN(imum) MAX(imum) SUM (som) AVG (average/gemiddelde) SELECT MIN(lln_nr) FROM leerlingen SELECT SUM(lln_nr) FROM leerlingen MIN(lln_nr) 1 SUM(lln_nr) 36
COUNT telt records in de resultaat tabel/groepen gebruikt na select jullie mogen altijd COUNT(*) gebruiken SELECT COUNT(*) FROM leerlingen WHERE wpl = "Eindhoven" SELECT COUNT(adres) FROM leerlingen WHERE wpl = "Eindhoven" COUNT(*) 4 COUNT(adres) 4
groeperen GROUP BY gevolgd door veldnamen na WHERE (of FROM als WHERE ontbreekt) groepeert op unieke waardes in veld of groep velden werkt altijd op alle genoemde velden COUNT werkt nu op de individuele groepen SELECT wpl, COUNT(*) FROM leerlingen GROUP BY wpl SELECT achternaam, wpl, COUNT(*) FROM leerlingen GROUP BY achternaam, wpl
voorbeeld SELECT wpl, COUNT(*) FROM leerlingen GROUP BY wpl lln_nr voornaam achternaam adres wpl 1 Joop Vos Bruggelaan 17 Son 2 Marleen Schippers Kerkstraat 12 Eindhoven 3 Issam Mourabit Struweel 81 Nuenen 4 Visser Brugstraat 15 5 Mieke 6 Irene Horst Domweg 21 7 Theo Stuurdreef 14a 8 Nisa Demir Hoogeind 8 lln_nr voornaam achternaam adres wpl COUNT(*) 1 Joop Vos Bruggelaan 17 Son 2 Marleen Schippers Kerkstraat 12 Eindhoven 4 3 Issam Mourabit Struweel 81 Nuenen lln_nr voornaam achternaam adres wpl COUNT(*) 1 Joop Vos Bruggelaan 17 Son 2 Marleen Schippers Kerkstraat 12 Eindhoven 4 3 Issam Mourabit Struweel 81 Nuenen wpl COUNT(*) Son 2 Eindhoven 4 Nuenen
voorbeeld SELECT achternaam, wpl, COUNT(*) FROM leerlingen GROUP BY achternaam, wpl lln_nr voornaam achternaam adres wpl 1 Joop Vos Bruggelaan 17 Son 2 Marleen Schippers Kerkstraat 12 Eindhoven 3 Issam Mourabit Struweel 81 Nuenen 4 Visser Brugstraat 15 5 Mieke 6 Irene Horst Domweg 21 7 Theo Stuurdreef 14a 8 Nisa Demir Hoogeind 8 lln_nr voornaam achternaam adres wpl COUNT(*) 1 Joop Vos Bruggelaan 17 Son 2 Marleen Schippers Kerkstraat 12 Eindhoven 3 Issam Mourabit Struweel 81 Nuenen 4 Visser Brugstraat 15 6 Irene Horst Domweg 21 7 Theo Stuurdreef 14a 8 Nisa Demir Hoogeind 8 lln_nr voornaam achternaam adres wpl COUNT(*) 1 Joop Vos Bruggelaan 17 Son 2 Marleen Schippers Kerkstraat 12 Eindhoven 3 Issam Mourabit Struweel 81 Nuenen 4 Visser Brugstraat 15 6 Irene Horst Domweg 21 7 Theo Stuurdreef 14a 8 Nisa Demir Hoogeind 8 achternaam wpl COUNT(*) Vos Son 1 Schippers Eindhoven Mourabit Nuenen Visser 2 Horst Demir
filters op groepen HAVING werkt hetzelfde als WHERE maar op groepen in plaats van records SELECT achternaam, wpl, COUNT(*) FROM leerlingen GROUP BY achternaam, wpl HAVING COUNT(*) = 1 AND wpl = "Eindhoven"
voorbeeld SELECT achternaam, wpl, COUNT(*) FROM leerlingen GROUP BY achternaam, wpl HAVING COUNT(*) = 1 AND wpl = "Eindhoven" lln_nr voornaam achternaam adres wpl COUNT(*) 1 Joop Vos Bruggelaan 17 Son 2 Marleen Schippers Kerkstraat 12 Eindhoven 3 Issam Mourabit Struweel 81 Nuenen 4 Visser Brugstraat 15 6 Irene Horst Domweg 21 7 Theo Stuurdreef 14a 8 Nisa Demir Hoogeind 8 lln_nr voornaam achternaam adres wpl COUNT(*) 1 Joop Vos Bruggelaan 17 Son 2 Marleen Schippers Kerkstraat 12 Eindhoven 3 Issam Mourabit Struweel 81 Nuenen 4 Visser Brugstraat 15 6 Irene Horst Domweg 21 7 Theo Stuurdreef 14a 8 Nisa Demir Hoogeind 8 lln_nr voornaam achternaam adres wpl COUNT(*) 2 Marleen Schippers Kerkstraat 12 Eindhoven 1 8 Nisa Demir Hoogeind 8 lln_nr voornaam achternaam adres wpl COUNT(*) 2 Marleen Schippers Kerkstraat 12 Eindhoven 1 8 Nisa Demir Hoogeind 8 achternaam wpl COUNT(*) Schippers Eindhoven 1 Demir
kan ook anders SELECT achternaam, wpl, COUNT(*) FROM leerlingen GROUP BY achternaam, wpl HAVING COUNT(*) = 1 AND wpl = "Eindhoven" SELECT achternaam, wpl, COUNT(*) FROM leerlingen WHERE wpl = "Eindhoven" GROUP BY achternaam, wpl HAVING COUNT(*) = 1 Het is wel belangrijk te beseffen dat de locatie van wpl = "Eindhoven" hier niet uitmaakt omdat wpl in de GROUP BY staat!
tabellen samenvoegen
een tabel klassen erbij klas_code mentor_id lokaal 1a tp K201 1b vp K304 1c ki K103 lln_nr voornaam achternaam adres wpl klas_code 1 Joop Vos Bruggelaan 17 Son 1a 2 Marleen Schippers Kerkstraat 12 Eindhoven 1c 3 Issam Mourabit Struweel 81 Nuenen 4 Visser Brugstraat 15 1b 5 Mieke 6 Irene Horst Domweg 21 7 Theo Stuurdreef 14a 8 Nisa Demir Hoogeind 8
tabellen samenvoegen heet join in database termen is van meerdere tabellen één nieuwe maken kan impliciet en expliciet impliciet via komma expliciet: via (INNER/OUTER/LEFT/RIGHT) JOIN SELECT * FROM leerlingen, klassen
voorbeeld SELECT * FROM leerlingen, klassen lln_nr voornaam achternaam adres wpl leerlingen.klas_code klassen. klas_code mentor lokaal 1 Joop Vos Bruggelaan 17 Son 1a tp K201 2 Marleen Schippers Kerkstraat 12 Eindhoven 1c ... 8 Nisa Demir Hoogeind 8 1b vp K304 ki K103
samenvoegen via sleutel data van tabellen zomaar bij elkaar gooien is niet zinvol leerling lijkt nu in drie klassen te zitten zinvol: tabellen samenvoegen op basis van sleutels (primair en vreemd) SELECT * FROM leerlingen, klassen WHERE leerlingen.klas_code = klassen.klas_code
voorbeeld SELECT * FROM leerlingen, klassen WHERE leerlingen.klas_code = klassen.klas_code lln_nr voornaam achternaam adres wpl leerlingen.klas_code klassen. klas_code mentor lokaal 1 Joop Vos Bruggelaan 17 Son 1a tp K201 2 Marleen Schippers Kerkstraat 12 Eindhoven 1c ... 8 Nisa Demir Hoogeind 8 1b vp K304 ki K103 lln_nr voornaam achternaam adres wpl leerlingen.klas_code klassen. klas_code mentor lokaal 1 Joop Vos Bruggelaan 17 Son 1a tp K201 2 Marleen Schippers Kerkstraat 12 Eindhoven 1c ... 8 Nisa Demir Hoogeind 8 1b vp K304 ki K103 lln_nr voornaam achternaam adres wpl leerlingen.klas_code klassen. klas_code mentor lokaal 1 Joop Vos Bruggelaan 17 Son 1a tp K201 2 Marleen Schippers Kerkstraat 12 Eindhoven 1c ki K103 3 Issam Mourabit Struweel 81 Nuenen 4 Visser Brugstraat 15 1b vp K304 5 Mieke 6 Irene Horst Domweg 21 7 Theo Stuurdreef 14a 8 Nisa Demir Hoogeind 8
gevorderde query's op meerdere tabellen
gevorderde query's op meerdere tabellen niks nieuws onder de zon resultaat van samenvoegen is één tabel daarop kun je dus alles doen zoals besproken bij theorie over query's op één tabel! SELECT lln_nr, wpl, lokaal FROM leerlingen, klassen WHERE leerlingen.klas_code = klassen.klas_code AND wpl = "Eindhoven" ORDER BY lokaal
voorbeeld SELECT lln_nr, wpl, lokaal FROM leerlingen, klassen WHERE leerlingen.klas_code = klassen.klas_code AND wpl = "Eindhoven" ORDER BY lokaal lln_nr voornaam achternaam adres wpl leerlingen.klas_code klassen. klas_code mentor lokaal 1 Joop Vos Bruggelaan 17 Son 1a tp K201 2 Marleen Schippers Kerkstraat 12 Eindhoven 1c ki K103 3 Issam Mourabit Struweel 81 Nuenen 4 Visser Brugstraat 15 1b vp K304 5 Mieke 6 Irene Horst Domweg 21 7 Theo Stuurdreef 14a 8 Nisa Demir Hoogeind 8 lln_nr wpl lokaal 2 Eindhoven K103 5 K201 4 K304 8
sub-query's
sub-query's query's in query's mogelijk bij: relevante keywords FROM WHERE relevante keywords IN EXISTS ALL ANY vaak aliassen nodig
voorbeeld bij FROM creëer een nieuwe tabel via query tabel is tijdelijk en moet een alias hebben gebruik tijdelijke tabel i.p.v. tabel uit database SELECT MAX(S) FROM (SELECT artikel, SUM(hoeveelheid) AS S FROM bestelde_artikelen GROUP BY artikel) AS R
voorbeeld bij WHERE creëer een nieuwe tabel via query tabel is tijdelijk en mag geen alias hebben heeft 1 veld en 1 record gebruik =, <, >, enz. heeft 1 veld en meerdere records gebruik IN heeft meerdere velden en records gebruik EXISTS SELECT artikel, SUM(hoeveelheid) AS S1 FROM bestelde_artikelen GROUP BY artikel HAVING S1 = (SELECT MIN(S2) FROM (SELECT artikel, SUM(hoeveelheid) AS S2 FROM bestelde_artikelen GROUP BY artikel) AS R)
sub-query keywords IN/EXISTS ALL ANY werkt hetzelfde als bij lijsten gebruiken met vergelijkingsoperatoren <= ALL kun je gebruiken i.p.v. minimum >= ALL kun je gebruiken i.p.v. maximum ANY zelfde als SOME niet veel gebruikt
IN keyword Geef een lijst met voor- en achternamen van alle klanten die iets besteld hebben. SELECT VOORNAAM, ACHTERNAAM FROM klanten WHERE klantnummer IN (SELECT DISTINCT klantnummer FROM bestelde_artikelen)
EXISTS keyword Geef een lijst met alle klantinformatie van alle klanten die iets besteld hebben. SELECT * FROM klanten WHERE EXISTS (SELECT * FROM bestelde_artikelen WHERE K.klantnummer = BA.klantnummer)
ALL keyword Geef een lijst met daarin de slechtst verkopende artikelen en de bijbehorende verkochte aantallen. SELECT artikel, SUM(hoeveelheid) AS S FROM bestelde_artikelen GROUP BY artikel HAVING S <= ALL(SELECT SUM(hoeveelheid) FROM bestelde_artikelen GROUP BY artikel)