Guido Geurts Mark Bernaerts

Vergelijkbare documenten
Oefeningen Hoofdstuk 1 : Select

SQL is opgebouwd rond een basisinstructie waaraan één of meerdere componenten worden toegevoegd.

12. Meer dan één tabel gebruiken en sub-queries

SQL datadefinitietaal

DBMS. DataBase Management System. Op dit moment gebruiken bijna alle DBMS'en het relationele model. Deze worden RDBMS'en genoemd.

1. Geef code en omschrijving van alle cursussen die precies vier dagen duren.

SQL Aantekeningen 3. Maarten de Rijke 22 mei 2003

Toon TITEL, JAAR en PLATVORM van GAMES die voor het jaar 2000 uitkwamen op Nintendo 64

DBMS SQL. Relationele databases. Sleutels. DataBase Management System. Inleiding relationele databases. bestaan uit tabellen.

SQL manipulatietaal. We kunnen er data mee toevoegen, wijzigen en verwijderen uit een database.

Query SQL Boekje. Fredrik Hamer

1. Inleiding Inleiding SQL Inleiding Database, databaseserver en databasetaal Het relationele model...

Databases - Inleiding

Structured Query Language (SQL)

Les S-02: Meer geavanceerde SQL-instructies

Structured Query Language

Introductie (relationele) databases

Inhoud. Voorwoord Belangrijkste kenmerken van dit boek De opzet van dit boek Over de auteur Woord van dank

Data Definition Language

11. Het selecteren van gegevens deel II

6. Het maken van een database

Data Manipulation Language

Databank - Basis 1. Inhoud. Computervaardigheden en Programmatie. Hoofdstuk 4 Databank - Basis. Terminologie. Navigeren door een Venster

Inleiding Databases en Data Base Management Systems Tabellen Wat is SQL?... 5

Databases en SQL Foundation (DBSQLF.NL)

Hoofdstuk: 1 Principes van databases

SQL STATEMENTS. Deze kolom kan grote stukken tekst aan en is bedoeld om tekst erin de plaatsen. Geheel getal, bijvoorbeeld 8, 63, 835 NUMERIC

Inhoud. Voorwoord 1 Belangrijkste kenmerken van dit boek 1 De opzet van dit boek 1 Over de auteurs 2 Woord van dank 2

Computervaardigheden. Universiteit Antwerpen. Computervaardigheden en Programmatie. Grafieken en Rapporten 1. Inhoud. Anatomie van een databank

Les 2 Eenvoudige queries

Sparse columns in SQL server 2008

[TOETS SQL INLEIDING]

ISO SQL: Structured Query Language

Informatie & Databases

SQL: query taal met. woorden. ISO SQL: Structured Query Language. de SQL basis query structuur. voorbeeld: doel: intuitieve query taal

Elfde-Liniestraat Hasselt Schooljaar TINFO POKER GAME Oracle Scripts

Les S-01: De basisbeginselen van SQL

EXIN Databases en SQL Foundation

SQL & Datamodelleren

SQL.

7. Het selecteren van gegevens

SQL & Relationele datamodellen in interactieve media

SQL en XML. XML schema s & DMO. Entiteitsklasse en attribuut. SQL en XML. Datamodellering Schema een ruim begrip (zie Møller, p.

Relationele databases

Databanken - les 2.

Puzzelen met SQL 38. De Muzieklijst, deel 2 PUZZELEN MET SQL

Les S-01: De basisbeginselen van SQL

Databanken - les 2.

6.8 Lijsten: oefeningen

hoofdstuk 9 referentiële integriteit waarborgen overige constraints 9.1 Referentiële integriteit relationele databases 9.1

F. TRUYEN - Informatiekunde QBE. MS Access

= > >= < <= BETWEEN IS NULL IS NOT NULL

Zelftest DB2 for z/os basiscursus

Het omzetten van een ER-diagram naar SQL

Zelftest SQL Workshop

Spiekboekje Excel Query SQL

Integriteitsbewaking bij een relationele database

DATABASEBEHEER IN EXCEL

DATAMODEL SQL. Middelbare School. Versie 1.0 Datum 30 oktober 2010 Auteur Mark Nuyens, studentnummer: Groep TDI 1

Inhoud Basiscursus. Access 2010 NL-NL

8. De invoer van gegevens

oefeningen TOP2000 antwoorden

Zelftest SQL Workshop

Zelftest Oracle basiscursus

ExpertHandboek Business Intelligence met Power BI in Excel Wim de Groot

II. ZELFGEDEFINIEERDE FUNCTIES

Les 11 : Basis SQL (deel2).

SQL / Systeemanalyse

EXIN Databases en SQL Foundation

Zelftest SQL. Document: n0453test.fm 19/04/2012. ABIS Training & Consulting P.O. Box 220 B-3000 Leuven Belgium

Data Warehouse Script Generator Doel

Miniles gegevensbanken bevragen met SQL

Informatie verwerking en databases RDBMS en tabellen... 8 SQL SELECT... 8 SQL WHERE SQL INSERT SQL UPDATE SQL DELETE...

Leren Programmeren met Visual Basic 6.0 Les 3+4. Hoofdstuk 4 : De Selectie

We moeten de accommodaties selecteren die 3 sterren hebben, en in land met ID 10 zitten.

Info-books. Toegepaste Informatica. Handleiding. Deel 40c : Gegevensbeheer en algoritmen in Access. HA40c. Jos Gils Erik Goossens

voorbeeldexamen I-Tracks Databases and SQL Foundation Voorbeeldexamen DBSQLF Uitgave juni 2006

Databases gebruiken. Databases gebruiken

Technische nota AbiFire Rapporten maken via ODBC

Datamodelleren en databases 2011

SQL. Datamodellering 2008

SQL. Wat is SQL? Geschiedenis SQL SQL DMO Datamodellering 2008

Puzzelen met SQL: Fileleed

2 Specificatie In deze tabel staat voor welk crebotraject de leereenheid is gemaakt Crebotraject code: 95311

Technische nota AbiFire5 Rapporten maken via ODBC

Deel 1: Arduino kennismaking. Wat is een microcontroller, structuur van een programma, syntax,

Macro s. 4.2 Een macro maken

COMPUTERWOORDEN.NL SQL - basis

oefeningen eredivisie antwoorden

Les 15 : updaten van gegevens in de database (deel2).

Variabelen en statements in ActionScript

2 Specificatie In deze tabel staat voor welk crebotraject de leereenheid is gemaakt Crebotraject code: 95311

Een topprogrammeur in het OO programmeren is Graig Larman. Hij bedacht de volgende zin:

7.8 Lijsten oefeningen

Systeemontwikkeling, Hoofdstuk 4, Tabellen maken in MS Access 2010

1. * Database worden vaak gebruikt in Client-Server architectuur.

Gegevens invullen in HOOFDLETTERS en LEESBAAR, aub. Belgische Olympiades in de Informatica (duur : maximum 1u15 )

Transcriptie:

Inhoud. OPVRAGEN VAN GEGEVENS UIT DE DATABANK...6 BASIS SQL QUERY BLOK...7 Syntax SELECT - statement:...7 Selectie van alle kolommen uit een tabel...8 Selecteren van bepaalde kolommen...8 Bewerkingen uitvoeren op kolommen...8 Wijzigen van de kolomnamen...10 Samenvoegen van kolommen...10 Beperken van dubbele rijen in de resultaatset...11 Sorteren van kolommen...12 Rijen beperken met de WHERE- clausule...14 Vergelijkings operatoren... 14 Logische vergelijkingsoperatoren :... 14 Sql operatoren :... 14 Logische operatoren :... 14 Negatie logische operatoren :...15 Negatie SQL operatoren... 15 Enkele voorbeelden op de WHERE - optie...15 Toepassen van meerder criteria...17 SINGLE ROW FUNCTIONS...19 GEBRUIK VAN SINGLE ROW FUNCTIONS...20 Eigenschappen van functies...20 Syntax van een Single Row Function...20 Algemeen overzicht van beschikbare functies...20 Karakter functies (character functions)... 21 Numerieke functies (number functions)... 22 Datum functies (date functions)... 22 WEERGEVEN VAN GEGEVENS UIT MEERDERE TABELLEN...23 WAT IS EEN JOIN?...24 Soorten join-methoden...24 Cartesiaans product...24 Simple Join Query...25 Equijoin... 26 Tabel Alias... 27 Non - Equijoin... 28 Outer join... 28 Self join... 29 GROUP FUNCTIONS (GROEP FUNKTIES)...31 ALGEMEEN OVERZICHT VAN DE GROEP FUNKTIES...32 Funkties...32 GROUP BY - optie...34 Ongeldige sql's bij gebruik van groep-functies...36 HAVING - optie...38 SUBQUERIES...40 Vormingscentrum Tongeren 2

SUBQUERIES...41 CREATE TABLE...43 ALGEMEEN...44 DATATYPES...45 VOORBEELDEN :...46 Voorbeeld 1 : Create table...46 Voorbeeld 2 : Create table, met not null constraint...48 Voorbeeld 3 : Create table, met not null -en primary key - constraint,...48 Voorbeeld 4 : Create table, check - constraint,...49 Voorbeeld 5 : Create table, default - constraint,...49 Voorbeeld 6 : Create table, foreign-key - constraint,...50 Voorbeeld 7 : Create table, unique - constraint,...50 ALTER TABLE...51 Voorbeeld 1: ALTER TABLE, toevoegen van een bepaalde constraint...51 Voorbeeld 2: ALTER TABLE, toevoegen van een kolom...52 Voorbeeld 3: ALTER TABLE, verwijderen van een constraint...52 DROP TABLE...53 INDEXEN...54 ALGEMEEN...54 WANNEER?...54 CREATE INDEX...55 VERWIJDEREN VAN EEN INDEX...55 BIJLAGE 1 : STRUCTUUR VAN DE TABELLEN...56 1. HET MEDEWERKERS BESTAND : MDW...56 2. HET AFDELINGS BESTAND : AFD...56 3. HET CURSUSSEN BESTAND : CRS...56 4. HET UITVOERINGS BESTAND : UITV...56 5. HET INSCHRIJVINGS BESTAND : INSCHR...56 BIJLAGE 2 : INHOUD VAN DE TABELLEN...58 TABEL MEDEWERKERS : MDW...58 TABEL AFDELING : AFD...58 TABEL CURSUSSEN : CRS...59 TABEL UITVOERINGEN : UITV...59 TABEL INSCHRIJVINGEN : INSCHR...60 UNIEKE VOLGNUMMERS...61 ALGEMEEN...62 CREATIE VAN EEN SEQUENCE...63 GEBRUIK VAN EEN SEQUENCE...63 VERWIJDEREN VAN EEN SEQUENCE...64 VIEWS...65 ALGEMEEN...66 WAT IS EEN VIEW...66 CREATIE VAN EEN VIEW...66 Oracle...66 Interbase...67 OPVRAGEN VAN GEGEVENS...67 UITVOEREN VAN DML - STATEMENTS OP EEN VIEW...67 CHECK OPTION...68 VERWIJDEREN VAN EEN VIEW...69 Vormingscentrum Tongeren 3

TRIGGERS...70 ALGEMEEN...71 CREATIE VAN EEN TRIGGER...71 Oracle :...71 Interbase :...72 Voorbeeld van een trigger :...72 VERWIJDEREN VAN TRIGGER...73 OEFENINGEN HOOFDSTUK 1 : SELECT...73 OEFENINGEN HOOFDSTUK 3 : JOINS...84 OEFENINGEN HOOFDSTUK 4 : GROUP FUNCTIONS...91 OEFENINGEN HOOFDSTUK 5 : SUB QUERIES...94 Vormingscentrum Tongeren 4

Overzicht van de cursus De cursus is bedoeld als inleiding tot SQL. De SQL-instructies besproken in deze cursus zijn in hoofdzaak ANSI-SQL instrukties. Indien hiervan afgeweken wordt, zal het uitdrukkelijk vermeld worden. De cursus wordt opgedeeld in een aantal afzonderlijke lessen, waarbij er bij elke les een reeks van oefeningen is voorzien. In de bijlagen van deze cursus staan de gebruikte tabellen samen met hun inhoud afgebeeld, teneinde een gemeenschappijk resultaat te bekomen bij de oefeningen. Onderaan volgt een overzicht van de lessen die in deze cursus gegeven worden. Overzicht : Les 1 : Opvragen van gegevens uit de databank Les 2 : Single row funkties Les 3 : Weergevens van gegevens uit meerdere tabellen Les 4 : Group functies Les 5: Subqueries Les 6 : Create table Gebruik van basis SQL (Structured Query Language) voor het ophalen van gegevens uit een databank Gebruik van functies om bepaalde inhoud (gegevens uit de tabel) te manipuleren Opvragen van gegevens uit verschillende tabellen door gebruik te maken van een aantal methoden. Uitvoeren van bepaalde zoals gemidelde bereken, en het groeperen van gegevens Geavanceerde select-statement Het maken van een tabel met behulp van SQL Vormingscentrum Tongeren 5

1 Opvragen van gegevens uit de databank Doelstellingen: Opvragen van gegevens uit de databank. Eventueel met bepaalde beperking op aantal rijen en kolommen die weergegeven worden. Op het einde van de les moet men in staat zijn om : Een select-statement schrijven om de databank te ondervragen Bewerkingen uitvoeren Een kolom van naam veranderen Kolommen samenvoegen Rijen sorteren met ORDER BY Zoekcriteria invoeren met behulp van de WHERE clausule Vormingscentrum Tongeren 6

Basis SQL query blok Een SELECT wordt gebruikt om gegevens uit de databank te halen. Syntax SELECT - statement: SELECT [DISTINCT] {*, KOLOM [ALIAS], } FROM TABEL [WHERE CONDITIE(S)] [ORDER BY {KOLOM, UITDRUKKING} [ASC DESC]] Verklaring syntax: SELECT DISTINCT selekteer alle kolommen ALIAS FROM TABEL WHERE CONDITIE ORDER BY kolommen ASC DESC lijst van kolommen (ten minste één) enkel unieke rijen worden werrgegeven, geen duplicaten geeft de kolom een andere naam geeft de tabel(len) aan die de kolom(men) bevat beperkt het aantal rijen tot het aantal die aan de voorwaarde voldoen voorwaarde bepaald de sorteervolgorde van de geselecteerde sortering van de kolom is in stijgende orde sortering van de kolom is in dalende orde In zijn meest eenvoudige vorm bestaat een SELECT-statement uit: select clausule, dewelke de kolommen bepaald from clausule dewelke de tabel bepaald Vormingscentrum Tongeren 7

Selectie van alle kolommen uit een tabel Voorbeeld : Selecteer alle gegevens uit de tabel medewerkers (MDW) select * from mdw Selecteren van bepaalde kolommen. Het is mogelijk om slechts een deel van de kolommen van een tabel weer te geven door deze kolommen op te sommen in de select clausule. De kolommen moeten gescheiden worden door een comma. Voorbeeld : Selecteer naam, functie en geboortedatum uit de tabel van medewerkers select naam,functie,gbdatum from mdw Bewerkingen uitvoeren op kolommen In bepaalde omstandigheden is het wenselijk de manier waarop de gegevens worden weergeven te wijzigen, bewerkingen op uit te voeren of 'What-if' -scenario's te bekijken. Dit wordt mogelijk gemaakt door wiskundige uitdrukkingen Overzicht van de mogelijke bewerkingen : Operator Beschrijving + som - verschil * vermenigvuldiging / deling () haakjes om voorrangsregels toe te passen Vormingscentrum Tongeren 8

Wiskundige operatoren mogen gebruikt worden in eender welke SQL-clausule, behalve in de "FROM" clausule. Voorbeeld : Voorbeeld : Selecteer naam, jaarsalaris uit de tabel van de medewerkers select naam,maandsal * 12 from mdw Opmerking : Let op dat het veld 'maandsal * 12 ' nu als kolomnaam voorkomt. Selecteer naam, jaarsalaris uit de tabel van de medewerkers. Bij het jaarsalaris van elk moet een vast bedrag van 100 begevoegd worden. select naam,(maandsal * 12) + 100 from mdw Vormingscentrum Tongeren 9

Wijzigen van de kolomnamen Wanneer de resultaten van een bepaalde query afgebeeld worden, staat er een kolomnaam boven. Wanneer er nu wiskundige uitdrukkingen in staan kan dit tot gevolg hebben dat deze kolomnaam zeer lang wordt en /of weinig tot geen betekenis heeft. Zie resultaat van bovenstaand voorbeeld. De wiskundige uitdrukking verschijnt hier als kolomnaam. Door gebruik te maken van een alias is het mogelijk om een kolomnaam een naam te geven. Voorbeeld : Selecteer naam, functie en geboortedatum uit de tabel van medewerkers Selecteer naam, jaarsalaris uit de tabel van de medewerkers. Bij het jaarsalaris van elk moet een vast bedrag van 100 begevoegd worden. select naam,(maandsal * 12) + 100 as jaar_salaris from mdw Het resultaat is nu dat de kolom die het totale jaar salaris berekent, niet meer de naam 'maandsal*12+100' heeft, maar wel 'jaar_salaris' Samenvoegen van kolommen Het select - statement biedt eveneens de mogelijkheid om twee of meerder kolommen met elkaar samen te voegen met behulp van de concatinatie-operator (11). Op sommige databanken kan dit ook gewoon het + - teken zijn. Voorbeeld : Selecteer naam en functie van medewerkers select naam functie from mdw Vormingscentrum Tongeren 10

Het resultaat zal zal dat de inhoud van beide kolommen tegen elkaar geplakt wordt. Om de leesbaarheid te bevorderen kan er gebruik gemaakt worden van een bepaald leesteken, bijvoorbeeld een comma. Het select-statement ziet er dan als volgt uit : select naam ', ' functie from mdw Het toegevoegde teken of tekenreeks moet steeds tussen enkele aanhalingstekens staan. Beperken van dubbele rijen in de resultaatset. Tenzij het anderzijds gespecifieerd wordt, zal een SQL-statement steeds alle rijen weergeven die aan de gestelde voorwaarden voldoen. Voorbeeld : select functie from mdw Dit geeft het volgende resultaat: TRAINER VERKOPER VERKOPER MANAGER VERKOPER MANAGER MANAGER TRAINER DIRECTEUR VERKOPER TRAINER BOEKHOUDER TRAINER BOEKHOUDER Vormingscentrum Tongeren 11

Merk op dat in het resultaat meerdere keren een bepaalde functie voorkomt. Om dit probleem op te lossen kan er gebruik gemaakt worden van het DISTINCT - keyword, waarbij alle rijen die meerdere keren voorkopmen slect één keer zullen voorkomen in het resultaat. Wanneer men alle unieke functies uit de tabel van de medewerkers wenst te weten dan wordt de query als volgt : select distinct functie from mdw Resultaat : BOEKHOUDER DIRECTEUR MANAGER TRAINER VERKOPER Opmerking : 1. Het woord DISTINCT moet direct volgen op het woord SELECT 2. Wanneer DISTINCT gebruikt wordt heeft dit gevolg voor ALLE kolommen uit het select-statement Sorteren van kolommen De volgorde waarin de query de rijen weergeeft is niet gedefinieerd. De ORDER BY - clausule kan hier gebruikt worden om de rijen te sorteren. Indien de ORDER BY gebruikt wordt, moet deze altijd als laatste lijn in de SQL staan. De default -waarde voor de ORDER BY is Ascending (stijgend) Voorbeeld : Selecteer naam, functie en maandsal uit de tabel medewerkers en sorteer volgens naam. Vormingscentrum Tongeren 12

select naam,functie..,maandsal from mdw order by naam In bovenstaand voorbeeld wordt er een kolomnaam gebruikt omaan te geven op welke kolom er moet worden gesorteerd. Wanneer er voor een bepaalde kolom een alias gebruikt werd, dan mag ook deze alies gebruikt worden in de ORDER BY. Let wel: Indien er een bewerking uitgevoerd wordt op een bepaalde kolom zoals in onderstaande voorbeeld, zonder gebruikt te maken van een alias, dan kan er geen kolomnaam gebruikt worden om de sortering aan te geven. In dit geval moet er gebruikt gemaakt worden van een kolomnummer. Voorbeeld : select naam,functie..,maandsal * 12 from mdw order by 3 Dit sorteert de resultaatset volgens de derde kolom Vormingscentrum Tongeren 13

Rijen beperken met de WHERE- clausule Het aantel rijen wat een query teruggeeft kan beperkt worden door gebruikt te maken van de WHERE- optie op te nemen in de sql. Met andere woorden, er zullen enkel rijen weergegeven worden die voldoen aan de gestelde voorwaarde in de WHERE-optie Indien de WHERE -optie gebruikt wordt moet die direct volgen op de FROM - clausule. Vergelijkings operatoren. Logische vergelijkingsoperatoren : Operator Beschrijving = Gelijk aan > Groter dan >= Groter dan of gelijk aan < Kleiner dan <= Kleiner dan of gelijk aan Sql operatoren : Operator Between and In Like Is null Beschrijving Tussen twee waarden (inclusief) lijst Volgens een bepaald patroon Heeft een null-waarde Logische operatoren : Operator AND OR NOT Beschrijving Als beide voorwaarden waar zijn, dan is het resultaat ook waar Als een van beide voorwaarden voldaan is, dan is het resultaat ook waar Geeft de tegengestelde conditie Vormingscentrum Tongeren 14

Negatie logische operatoren : Operator Beschrijving!= Niet gelijk aan <> Niet gelijk aan NOT kolomnaam = Niet gelijk aan NOT kolomnaam > Niet groter dan Negatie SQL operatoren Operator Beschrijving NOT BETWEEN AND Niet tussen twee waarden NOT IN Niet in de lijst NOT LIKE Niet volgens een bepaald patroon IS NOT NULL Heeft geen null-waarde Opmerking : Wanneer een kolom t.o.v een NULL waarde moet vergeleken worden, gebruik dan steeds IS (NOT) NULL. Volgende instructie "= NULL" geeft steeds een foutief of beter een onwaar resultaat. Enkele voorbeelden op de WHERE - optie Select Naam,functie from mdw where naam = 'Smit'; Deze query geeft geen resultaat terug, omdat 'Smit' in de tabel :medewerkers met hoofdletters ingevuld staat, met andere woorden, er is dus vershil tussen hoofdletters en kleine letters. Selecteer iedereen die geboren is tussen 1950 en 1960 uit de tabel medewerkers. Hiervoor wordt de 'BETWEEN' operator gebruikt omdat er een bepaald bereik aangegeven wordt tussen een minimum en een maximum waarde. Select Naam,functie from mdw where gbdatum between '01/01/1950' and '01/01/1960' Vormingscentrum Tongeren 15

Selecteer de mensen uit afdeling 10 en 30 uit de tabel medewerkers. In dit geval kan het best een IN - operator gebruikt worden omdat het gaat over een set (een vooraf aantal gekende mogelijkheden) Select Naam,functie from mdw where afd in (10, 30) In bepaalde omstandigheden moet er gezocht worden naar een gegeven of een groep van gegvens waarvan de juiste inhoud niet op voorhand geweten is. Bijvoorbeeld je weet dat een bepaalde persoon 'JANSEN' noemt, maar bent niet zeker van de schrijfwijze. Om dit probleem op te lossen wordt er gebruik gemaakt van de LIKEoperator. Select Naam,functie from mdw where naam like 'JAN%' De SQL zal de tabel van de medewerkers gaan aflopen en zoeken naar alle namen die beginnen met 'JAN'. Hetzelfde kan worden toegepast indien alle namen gegevens moeten worden waar de letter 'A' in voorkomt. Select Naam,functie from mdw where naam like '%A%' Vormingscentrum Tongeren 16

De 'IS NULL' - operator wordt dan weer gebruikt voor het controleren op velden binnen een tabel die geen waarde hebben of beter waar er geen inhoud beschikbaar is. Aangezien er geen inhoud is kan de '=' - operator niet gebruikt worden omdat de NULL - waarde noch gelijk noch niet-gelijk is aan eender welke waarde. Volgende voorbeeld geeft de juiste syntax voor het opvragen van de zogenaamde NULL-velden uit een tabel. Select Naam,functie from mdw where comm is null Toepassen van meerder criteria In veel gevallen is het niet mogelijk om enkel met de 'WHERE' de gevraagde gegevens op te vragen uit de tabel. Vandaar dat er nog een tweetal andere opties zijn die in samen met de 'WHERE' kunnen gebruikt worden om complexere zoekopdrachten te kunnen uitvoeren. Deze twee opties zijn 'AND' en 'OR'. Voorbeeld : Selecteer naam, funtie en afdeling uit de medewerkerstabel waar de afdeling = 30 en het salaris kleiner is dan 1500. Select Naam,functie,afd from mdw where afd = 30 and maandsal < 1500 Vormingscentrum Tongeren 17

Let op, dit is totaal iets anders dan de volgende query : Select Naam,functie,afd from mdw where afd = 30 or maandsal < 1500 Vormingscentrum Tongeren 18

2 Single row functions Doelstellingen: Verklaren en het leren gebruiken van de verschillende types van functies die er beschikbaar zijn in SQL. Op het einde van de les moet men in staat zijn om : De verschillende typen van functies te verklaren Bepalen wanneer functies te gebruiken Functies toepassen in Select-statements Verklaren van omvormingsfuncties en hoe ze te gebruiken Vormingscentrum Tongeren 19

Gebruik van Single Row Functions Single row functions worden gebruikt om gegevens te bewerken. De functies hebben één of meerdere parameters en geven voor elke rij in de query een resultaat. Eigenschappen van functies Ze zijn van toepassing op elke rij van de query Ze geven een resultaat per rij Ze kunnen een waarde teruggeven die van een ander type is dan het type van de gerefereerde kolom Er kunnen éénof meerdere argumenten meegegeven worden Functies kunnen gebruikt worden in de SELECT, WHERE en ORDER BY optie. Syntax van een Single Row Function function_name (column expression, [arg1, arg2, ]) Verklaring syntax: FUNCTION_NAME COLUMN EXPRESSION ARG1, ARG2 naam van de functie naam van de kolom uit een tabel een bepaalde string of wijskundige uitdrukking argumenten Algemeen overzicht van beschikbare functies. 1. Karater functies (character function) 2. Numerieke functies (number functions) 3. Datum functies (date functions) 4. Omvormingsfuncties (Conversion functions) Vormingscentrum Tongeren 20

Opmerking : Het aantal functies en of de syntax ervan kan verschillen van databank tot databank. Vandaar dat er in de besprekingen verderop de meest gangbare functies besproken zullen worden. Het is aan de gebruiker van een databank om zich te verdiepen in de specifieke functies ervan. Karakter functies (character functions) Deze functies hebben als input een gegeven van het type karater en geven het resultaat terug in de vorm van een numeriek of een karater-type. Overzicht Operator lower upper initcap (bij ORACLE) concat (bij ORACLE) substr(column(m[,n]) (bij ORACLE) substring (column,from m, for n) (bij INTERBASE) length (column) (bij ORACLE) Beschrijving Zet alle karaters om in kleine letter zet alle karaters om in hoofdletters zet de eerste letter om in een hoofdletter de rest in kleine letters (voeg twee waarden samen) geeft een deel van de karaterstring-string terug Geeft het aantal karaters in de waarde Voorbeeld : Selecteer select from mdw lower(naam) Vormingscentrum Tongeren 21

Numerieke functies (number functions) Deze functies hebben als input een numeriek gegevenen geven tevens een numeriek resultaat. Overzicht Operator round(column expression[, n]) (bij ORACLE) trunc(column expression[, n]) (bij ORACLE) mod(m, n) Beschrijving Afronden van een getal tot op n-decimalen Afronden van een getal geeft de modulus van beide getallen Datum functies (date functions) Aangezien een databank een datum gaat opslaan als een getal is het mogelijk om hierop een reeks van bewerkingen te doen Overzicht Bewerking Resultaat Omschrijving datum + nummer datum Telt een aantal (nummer) dagen bij een datum (datum) datum - nummer datum Vermindert de datum met een aantal dagen (nummer) datum - datum aantal dagen Maakt het verschil tussen twee data en geeft het resultaat terug als het aantal dagen verschil tussen beiden datum + nummer/24 datum telt een aantal uren bij een bepaalde datum Voorbeeld : select from mdw gbdatum + 10 Vormingscentrum Tongeren 22

3 Weergeven van gegevens uit meerdere tabellen Doelstellingen: Het opvragen van gegevens uit meer dan één tabel, gebruikt makend van een aantal methoden. Op het einde van de les moet men in staat zijn om : Een select - statement schrijven om gegevens uit meer dan één tabel te gaan lezen outer-joins maken een tabel verbinden aan zichzelf Vormingscentrum Tongeren 23

Wat is een join?. Een join wordt gebruikt om gegevens uit meer dan één tabel te ondervragen. Hierbij worden rijen van verschillende tabellen samengevoegd op basis van gemeenschappelijke gegevens, meestal sleutelvelden. Soorten join-methoden 1 Equijoins 2 Non-equijoins 3 Outer joins 4 Self joins Cartesiaans product Een cartesiaans product is het gevolg van een slecht gemaakte join (verbinding), of een join die volledig werd weggelaten. In zo'n situatie worden alle combinaties van de rijen van beide tabellen weergeven. m.a.w Alle rijen van de eerste tabel worden verbonden met alle rijen van de tweede tabel. Voorbeeld : select naam,functie from mdw,afd Dit geeft als resultaat dat er 56 rijen worden weergegeven. (14 *4 = 56) Vormingscentrum Tongeren 24

Simple Join Query Om gegevens uit twee of meerdere tabellen weer te geven is het voldoende om een 'simple join' te schrijven in de WHERE-optie van de SQL. Syntax : select tabel.kolom, tabel.kolom, from tabel1, tabel2 where tabel1.kolom1 = tabel2.kolom Verklaring syntax : tabel.kolom: geeft de naam van de tabel en de kolom vanwaar de gegevens moeten gelezen worden tabel1.kolom = tabel2.kolom: is de voorwaarde die de verbinding (join) tussen beide tabellen maakt. Enkele richtlijnen: Wanneer een select-statement geschreven wordt, laat dan de kolomnaam voorafgaan door de naam van de tabel. Dit komt de overzichtelijkheid en duidelijkheid ten goede. Indien eenzelfde kolomnaam voorkomt in beide tabellen, dan moet de kolomnaam voorafgegaan worden door de naam van de tabel. Het aantal condities om te verbinden s in de meeste gevallen afhankelijk van het aantal tabellen die verbonden worden. Stel dat je twee tabellen gaat verbinden, dan is er minsten één WHEREoptie nodig om dit te doen. Idem voor wanneer er drie tabellen verbonden worden, dan zijn er twee voorwaarden nodig. Dit is geldig zolang het niet gaat om een samengestelde sleutel, want dan zijn er meerdere voorwaarden nodig. Vormingscentrum Tongeren 25

Equijoin De equijoin is een verbinding tussen tabellen die worden verbonden op basis van dezelfde waarden (niet noodzakelijk dezelfde kolomnaam). Voorbeeld: Ik wil weten in welke afdeling de medewerkers tewerkgesteld zijn. select mdw.naam,afd.naam from mdw,afd where mdw.afd = afd.anr Resultaat : SMIT ALDERS DE WAARD JANSEN MARTENS BLAAK CLERCKX SCHOTTEN DE KONING DEN DRAAIER ADAMS JANSEN SPIJKER MOLENAAR OPLEIDINGEN VERKOOP VERKOOP OPLEIDINGEN VERKOOP VERKOOP HOOFDKANTOOR OPLEIDINGEN HOOFDKANTOOR VERKOOP OPLEIDINGEN VERKOOP OPLEIDINGEN HOOFDKANTOOR Ook hier kunnen er meerder voorwaarden gesteld worden. select mdw.naam,afd.naam from mdw,afd where mdw.afd = afd.anr and afd.naam = 'VERKOOP' Vormingscentrum Tongeren 26

geeft als resultaat : ALDERS DE WAARD MARTENS BLAAK DEN DRAAIER JANSEN VERKOOP VERKOOP VERKOOP VERKOOP VERKOOP VERKOOP Tabel Alias Net als bij de kolom-alias kan er ook aan een tabel een alias gegevens worden. Dit is zeer praktisch in het geval dat de tabelnaam nogal lang is. Eenmaal dat een alias gemaakt is, moet die verderop in het SQL-statement gebruikt worden. Voorbeeld: Ik wil weten in welke afdeling de medewerkers tewerkgesteld zijn. select m.naam,a.naam from mdw m,afd a where m.afd = a.anr Vormingscentrum Tongeren 27

Non - Equijoin Een 'non-equijoin' verbinding tussen twee tabellen doet zich voor als er uit tabel1 geen enkele kolom een gelijke waarde heeft in een kolom van tabel2. Er moet dus een relatie gelegt worden niet op basis van '='. Outer join Indien een bepaalde rij niet voldoet aan de gestelde eisen, dan heeft dit tot gevolg dat deze rij niet zal verschijnen in de resultaat. Voorbeeld : select u.begindatum,c.omschrijving,m.naam from crs c,uitv u,mdw m where u.cursus = c.code and u.docent = m.mnr order by 1 Wanneer dit uitgevoerd wordt krijgen we het volgende resultaat. 16/04/90 Introductie SQL en SQL*plus SPIJKER 10/08/90 ORACLE voor Applicatiegebruikers JANSEN 8/10/90 Introductie SQL en SQL*plus SMIT 17/12/90 Applicatiebouw met SQL*Forms JANSEN 17/12/90 Introductie SQL en SQL*plus SMIT 4/02/91 Bouwen met SQL*ReportWriter SMIT 5/02/91 Applicatiebouw met SQL*Forms ADAMS 11/09/91 Bouwen met SQL*Menu SCHOTTEN 27/09/91 ORACLE voor Applicatiegebruikers SPIJKER 24/02/92 Relationeel Systeemontwerp SCHOTTEN Vormingscentrum Tongeren 28

In de tabel 'uitv' zijn er nog cursussen die geen docent hebben. Deze worden worden terecht niet weergegeven in het resultaat. Stel dat ik toch de cursussen wil zien, ook al is er nog geen docent voor. Dan kan dit gebeuren door het leggen van een 'outer-join'. Opmerking : Het angeen van een outer-join' kan verschillen van databank tot databank. Het onderstaande voorbeeld is van toepassing op een ORACLE-databank Hier wordt er "(+)" toegevoegd aan het veld, waarvan er geen waarden beschikbaar zijn. select u.begindatum,c.omschrijving,m.naam from crs c,uitv u,mdw m where u.cursus = c.code and u.docent(+) = m.mnr order by 1 Self join De laatste in de rij is de 'self-join'. Een self-join is het verbinden van een bepaalde tabel aan zichzelf, waarbij er gebruik gemaakt wordt van een tabel - alias, zodoende te simuleren dat er twee tabellen zijn. Dit laat toe om rijen van een tabel te verbinden met rijen binnen deze zelfde tabel. Vormingscentrum Tongeren 29

Voorbeeld : Geef mij de naam van de medewerker en de naam van zijn chef. Om dit op te lossen moeten we werken binnen dezelfde tabel aangezien een chef ook opgenomen is in de tabel van de medewerkers select werk.naam as werknemer,chef.naam as chef from mdw werk,mdw chef where werk.chef = chef.mnr Resultaat : werknemer SMIT ALDERS DE WAARD JANSEN MARTENS BLAAK CLERCKX SCHOTTEN DEN DRAAIER ADAMS JANSEN SPIJKER MOLENAAR chef SPIJKER BLAAK BLAAK DE KONING BLAAK DE KONING DE KONING JANSEN BLAAK SCHOTTEN BLAAK JANSEN CLERCKX Vormingscentrum Tongeren 30

4 Group functions (Groep funkties) Doelstellingen: De nadruk wordt nu geplaatst op het ondervragen van allerhande informatie zoals het bepalen van gemiddelden, minimum en maximum Op het einde van de les moet men in staat zijn om : Herkennen van groep funkties Toepassing van groep funkties GROUP BY toepassen HAVING toepassen Vormingscentrum Tongeren 31

Algemeen overzicht van de groep funkties In tegenstelling to 'singel row functions' zijn group funkties aktief op een aantal rijen en geven dus een resultaat per groep. Groep functies komen voor in zowel de SELECT als de HAVING -opties. Funkties AVG (gemiddelde) COUNT (aantal) MAX (maximum) MIN (minimum) SUM (som) Opmerking : Bij sommige databanken zijn er meerdere functies ter beschikking. Controleer de handleiding van de gebruikte databank voor de functies die er ter beschikking zijn. Voorbeeld : Selecteer de eerste en de laaste naam (volgens alfabet) uit de tabel medewerkers select min(naam),max(naam) from mdw Resultaat : ADAMS SPIJKER Vormingscentrum Tongeren 32

Voorbeeld : Geeft het gemiddelde, maximum, minimum en de som van alle slaraissen uit de tabel medewerkers select avg(maandsal), max(maandsal), min(maandsal),sum(maandsal) from mdw COUNT : De count funktie heeft twee formaten: count(*) en count(uitdrukking). Count(*) geeft het aantal rijen van een tabel, inclusief de dubbels en de rijen met null-waarden. Voorbeeld : select count(*) from mdw Resultaat : 14 Voorbeeld : select count(comm) from mdw Resultaat : 4 (geeft enkel het aantal kolommen waarcomm niet NULL is) Vormingscentrum Tongeren 33

GROUP BY - optie Deze clausule wordt gebruikt om de rijen in een tabel op te splitsen in kleinere groepen, en vervolgens kan hierop een group-funktie toegepast worden om samanvattende informatie te bepalen. Syntax : SELECT COLOMN, GROUP_FUNCTION FROM TABLE [WHERE CONDITION] [GROUP BY GROUP_BY_expression] [ORDER BY COLUMN] Voorbeeld : select chef,count(*) as aantal from mdw group by chef Resultaat : 1 7566 2 7698 5 7782 1 7788 1 7839 3 7902 1 Vormingscentrum Tongeren 34

Opmerking : In de group - by clausule worden de functie count(*) niet opgegeven, in tegenstelling tot de kolom 'chef'. Wanneer er groep-functies gebruikt worden, moeten deze niet opgenomen worden in het select-statement. Indien er in de select wel kolommen moeten weergegeven worden, waar er geen groep-functie op wordt toegepast, dan moet die kolom worden opgenomen in de 'group-by' optie. 'zie kolom chef'. Voorbeeld : Geef de verschillende functies en het totale salaris binnen elke functie. select functie,sum(maandsal) as bedrag from mdw group by functie Resultaat : BOEKHOUDER 2.100,00 DIRECTEUR 5.000,00 MANAGER 8.275,00 TRAINER 7.900,00 VERKOPER 5.600,00 Vormingscentrum Tongeren 35

Ongeldige sql's bij gebruik van groep-functies Wanneer er in een select-statement een group-functie gebruikt wordt, moet er een group-by optie opgenomen worden. In deze group-by optie moeten de kolommen staan waar er geen groeo-functie op toegepast is. Tracht hetvolgende voorbeeld uit te voeren : select chef,count(functie) from mdw Dit geeft steeds een foutmelding. De beschrijving van de foutmelding zal in functie zijn van de databank waarmee gewerkt wordt, maar het zal er op neer komen dat er een GROUP-BY clausule nodig is. Oplossing : select chef,count(functie) from mdw group by chef Voorbeeld : Geef de functie en het gemiddelde maandsalaris van de verschillende medewerkers waarvan het geimddelde maandsalaris groter is dan 2000. Indien je volgende sql uitvoert geeft dit een foutlmelding Vormingscentrum Tongeren 36

select functie,avg(maandsal) from mdw where avg(maandsal) > 2000 group by functie De WHERE-optie kan dus niet gebruikt worden om groupen te beperken. Om bovenstaand probleem opte lossen moet er gebruik gemaakt wordn van de HAVING-optie. (zie verderop in de cursus) select functie,avg(maandsal) from mdw group by functie having avg(maandsal) > 2000 Vormingscentrum Tongeren 37

HAVING - optie De HAVING-optie wordt gebruikt voor het beperken van groepen, zoals de WHERE - optie gebruikt wordt om rijen te beperken. m.a.w Enkel rijen die voldoen aan de 'having' - voorwaarde zullen worden weergegeven in het resultaat. (cfr where) Voorbeeld : Geef de functie en het gemiddelde maandsalaris van de verschillende medewerkers waarvan het geimddelde maandsalaris groter is dan 1500 en waarvan de functie niet directeur is. select functie,avg(maandsal) from mdw where functie!= 'DIRECTEUR' group by functie having avg(maandsal) > 1500 Resultaat : MANAGER 2.758,33 TRAINER 1.975,00 In onderstaand voorbeeld zijn er geen groep-functies opgenomen in de select lijst, maar toch zijn er 'group by' en 'having' clausules opgenomen. In die geval is er een functie opgenomen in de 'having' -clausule, zodat er ook een 'group by ' - clausule moet opgenomen worden. Voorbeeld : Vormingscentrum Tongeren 38

Geef de naam en de functie van alle medewerkers die minder dan 1000 maandsal hebben. select naam,functie from mdw group by naam, functie having min(maandsal) < 1000 Resultaat : JANSEN SMIT BOEKHOUDER TRAINER Vormingscentrum Tongeren 39

5 Subqueries Doelstellingen: Geavanceerde mogelijkheden van de 'SELECT' onderzoeken. Op het einde van de les moet men in staat zijn om : Schrijven van geneste queries om gegevens gaan op te vragen gebaseerd op onbekende criteria gebruik van subqueries gegevens sorteren met behulp van subqueries Vormingscentrum Tongeren 40

Subqueries Een subquery is een SELECT welke deel uitmaakt van een clausule van een ander SELECT - statement. Subqueries worden vooral gebruikt voor het schrijven van een select-statement om gegevens te gaan opvragen op basis van condities die vooraf niet gekend zijn. Syntax : SELECT FROM WHERE SELECT_LIST TABLE EXPR. OPERATOR (SELECT SELECT_LIST FROM TABLE) Andere namen voor dit soort van query zijn o.a. : nested-select; sub-select; inner select. Een subquerie gaat steeds uitvoeren van binnen naar buiten. De querie in het diepste niveau wordt als eerste uitgevoerd. De output van deze query wordt als input (voorwaarden voor de conditie) gebruikt voor de volgende query enz Enkele richtlijnen : Zet een subquery steeds tussen ronde haken Plaats de subquery na de vergelijkingsoperator Plaats nooit en order by in een subquery. Er is slecht één ORDER BY geldig per volledig SQL-statement, en moet dus bezet worden in de buitenste select. Vormingscentrum Tongeren 41

Voorbeeld : Geef de naam en het maandsalaris van alle werknemers uit de tabel medewerkers die dezelfde functie hebben als MARTENS select naam,maandsal from mdw where functie = (select functie from mdw where naam = 'MARTENS') Resultaat : ALDERS 1.600,00 DE WAARD 1.250,00 MARTENS 1.250,00 DEN DRAAIER 1.500,00 Opmerking : Indien de subquery meer dan één rij teruggeeft als resultaat, dan moet de IN-operator gebruikt worden in plaats van '=' - operator. Vormingscentrum Tongeren 42

6 Create table Doelstellingen: Creatie van tabellen Op het einde van de les moet men in staat zijn om : Een tabel te maken Leggen van bepaalde constraints Maken van indexen Vormingscentrum Tongeren 43

Algemeen Een tabel wordt gemaakt door het uitvoeren van het CREATE TABLE instructie. Dit is slecht één van de vele data defenition language (DDL) instructies. DDL instructies zijn een subset van de SQL commando's, die gebruikt worden om een tabel te maken, te wijzigen of te verwijderen. Indien deze instructies uitgevoerd worden zijn ze onmiddelijk geldig, met andere woorden ze kunnen niet ongedaan gemaakt worden door een 'rollback' uit te voeren. Dit in tegenstelling tot DML (Data Manipulation Language) die wel ongedaan gemaakt kunnen worden door een 'rollback' uit te voeren. Om een CREATE TABLE uit te voeren moet de gebruiker hier de nodige rechten voor hebben. Deze rechten dienen gegeven te worden door de databank beheerder (DBA : Database Administrator). Syntax : CREATE TABLE [schema.]table ( column datatype [column constraint], [table_constraint) schema table column datatype column_constraint table_constraint Een schema is een verzameling van objecten. Schema - objecten zijn logische structuren die rechtstreeks refereren naar data in de tabellen. Voorbeelden van schema objecten zijn tabellen, views, sequences, stored procedures, indxen naam van de tabel naam van de kolom is het datatype van de kolom samen met de lengte (indien nodig). Voorbeeld een datumveld heeft geen lengte. een integriteitsvoorwaarde die van toepassing is op de kolom. Een voorbeld hiervan kan zijn dat een kolom geen NULL-waarde mag bevatten (denk aan de sleutel) een integriteitsvoorwaarde die van toepassing is op de gehele tabel. Enkele richtlijnen in verband met naamgeving : - Tabel - en kolomnamen moeten beginnen met een letter - Namen mogen niet dubbel voorkomen - Namen mogen geen gereserveerde namen zijn van de databank. Vormingscentrum Tongeren 44

Datatypes Datatype zijn sterk afhankelijk van de gebruikte databank. Voor de specificaties van all beschikbare datatypen van een bepaalde databank wordt verwezen naar de handleiding van de database in kwestie. Onderaan volgen enkel voorbeelden van datatypen van verschillende databanken: databank datatype beschrijving oracle varchar2(size) Alphanumerisch veld met variabele lengte char(size) Alphanumerisch veld met vaste langte (maximaal 255 karakters) number(p,s) Numerisch veld date datum veld long veld van variabele lengte (tot 2GB voor versie 7) raw; long raw veld gebruikt voor het opslaan van binaire data (vb foto's) interbase BLOB Binary Large Object CHAR(n) n characters 1 to 32767 bytes DATE DECIMAL Numerisch veld (precision, scale) DOUBLE PRECISION NUMERIC SMALLINT VARCHAR Vormingscentrum Tongeren 45

Voorbeelden : Voorbeeld 1 : Create table Maak een tabel met volgende gegevens: Naam : Project Velden : projectnummer, projectomschrijving en budget Voor Interbase : CREATE TABLE project ( projectnummer numeric(6),projectomschrijving varchar(50),budget numeric(6)) Voor Oracle : CREATE TABLE project ( projectnummer number(6),projectomschrijving varchar2(50),budget number(6)) Voor Paradox : CREATE TABLE project ( projectnummer numeric(6),projectomschrijving char(50),budget numeric(6)) Wanneer deze instructie doorgegeven wordt aan de databank zal er een tabel gemaakt worden. Door het opvragen van de meta-data (beschrijving van tabellen en dergelijke, zie verder) kan er gecontroleerd worden of de creatie van de tabel goed is verlopen. SHOW TABLE project PROJECTNUMMER PROJECTOMSCHRIJVING BUGET INTEGER Nullable VARCHAR(50) Nullable INTEGER Nullable Vormingscentrum Tongeren 46

Bij het opvragen van deze gegevens valt op dat de databank bijkomende regels (constraints ) heeft gespecifieerd. nl. 'Nullable' of met andere woorden: De inhoud van de velden mag NULL worden. Om te vermijden dat steeds alle velden de inhoud NULL mogen hebben, moeten er afwel bij creatie van de tabel ofwel nadien constraints gezet worden op de betreffende kolommen. Constraint: Een constraint kan gezien worden als een regel waaraan de gegevens moeten voldoen voor ze opgenomen worden in de tabel. Onderstaande tabel geeft een overzicht van een aantal mogelijke constraints die kunnen geplaatst worden op een tabel. Constraint Omschrijving NOT NULL De gegevens in deze kolom mogen NIET NULL zijn, met andere woorden er moet een gegevens in komen. UNIQUE Legt op dat de kolom of combinatie van kolommen ukiek moeten zijn CHECK Geeft bepaalde condities ( voorwaarden ) aan waaraan gegevens moeten voldoen voor ze opgenomen worden in de tabel. PRIMARY KEY FOREIGN KEY Geeft het unieke deel aan Maakt de relatie tussen twee tabellen. ( Referentiele integriteit ) Vormingscentrum Tongeren 47

Voorbeeld 2 : Create table, met not null constraint Maak een tabel met volgende gegevens: Naam : Project Velden : projectnummer, projectomschrijving en budget. Het veld projectnummer mag niet null zijn. Voor Interbase : CREATE TABLE project ( projectnummer numeric(6) NOT NULL,projectomschrijving varchar(50),budget numeric(6)) De tabel project bevat nu de regel dat het veld projectnummer in geen enkel geval de inhoud NULL mag krijgen. Voorbeeld 3 : Create table, met not null -en primary key - constraint, Maak een tabel met volgende gegevens: Naam : Project Velden : projectnummer, projectomschrijving en budget. Het veld projectnummer mag niet null zijn en moet sleutelveld zijn. Opmerking : Wanneer er een bepaald veld als sleutelveld, of als deel van de sleutel aangegeven wordt, dan moet dit NOT NULL zijn. Voor Interbase : CREATE TABLE project ( projectnummer numeric(6) NOT NULL,projectomschrijving varchar(50),budget numeric(6),primary key (projectnummer)) De tabel project bevat nu de regel dat het veld projectnummer in geen enkel geval de inhoud NULL mag krijgen. En het veld projectnummer is sleutel, wat inhoud dat dit veld uniek moet zijn van inhoud. Vormingscentrum Tongeren 48

Voorbeeld 4 : Create table, check - constraint, Maak een tabel met volgende gegevens: Naam : Project Velden : projectnummer, projectomschrijving en budget. Er moet een regel zijn die dat het budget niet groter mag worden dan 1000. Om deze regel af te dwingen wordt er gebruik gemaakt van een CHECK - constraint. Opmerking: Door gebruik te maken van check-constraints gebeurt de validatie van gegevens op de databank, en niet meer in het programma zelf. Voor Interbase : CREATE TABLE project ( projectnummer numeric(6) NOT NULL,projectomschrijving varchar(50),budget numeric(6) CHECK(BUDGET<=1000) ) Voorbeeld 5 : Create table, default - constraint, Maak een tabel met volgende gegevens: Naam : Project Velden : projectnummer, projectomschrijving en budget. Er moet een regel gemaakt worden die zegt dat er bij elke rij die toegevoegd wordt in de tabel, het veld 'BUDGET' de waarde 0 moet krijgen. Om deze regel af te dwingen wordt er gebruik gemaakt van een DEFAULT - constraint. Voor Interbase : CREATE TABLE project ( projectnummer numeric(6) NOT NULL,projectomschrijving varchar(50),budget numeric(6) DEFAULT 0) Vormingscentrum Tongeren 49

Voorbeeld 6 : Create table, foreign-key - constraint, Een foreign key -constraint kan pas geplaatst worden tussen twee tabellen, op velden van hetzelfde type. Deze regel controleert dat de elementen eerst moeten voorkomen in de gerefereerde tabel (in dit geval tabel project6) vervolgens in de tabel waarop de foreign-constraint gezet is (tabel projectmedewerker). Creatie van de tabellen : CREATE TABLE project6 ( projectnummer numeric(6) NOT NULL,projectomschrijving varchar(50),budget numeric(6),primary key (projectnummer)) CREATE TABLE projectmedewerker ( projectnummer numeric(6) NOT NULL,medewerkernummer numeric(6) NOT NULL,uren numeric(6), primary key (projectnummer, medewerkernummer), foreign key (projectnummer) references project6(projectnummer)) Voorbeeld 7 : Create table, unique - constraint, Als laatste behandelen we nog de UNIQUE- constraint. De unique - constraint kan geplaatst worden op kolommen die uniek moeten zijn indien ze niet tot de sleutel behoren. Stel dat we in de projecttabel de regel zouden opleggen dat elk budget uniek moet zijn. Voor Interbase : CREATE TABLE project7 ( projectnummer numeric(6) NOT NULL,projectomschrijving varchar(50),budget numeric(6) NOT NULL UNIQUE) Ook hier weer opletten op het feit dat wanneer er een UNIQUE - constraint gezet wordt op een bepaalde kolom, dat deze kolom ook de NOT-NULL - constraint moet hebben. Vormingscentrum Tongeren 50

Alter Table In de praktijk is het niet ondenkbaar dat er na een bepaalde tijd uitbreidingen moeten gedaan worden op een bepaalde tabel. Niet alleen uitbreidingen van velden, maar ook wijzigingen van bepaalde kolommen binnen een bepaalde tabel zijn mogelijk. Denk maar aan het aanpassen van een bepaalde check-constraint enz.. Al deze wijzigingen worden gedaan met behulp van het ALTER TABLE - commando. Hier geldt ook weer het feit dat het ALTER TABLE commando sterk afhankelijk is van de gebruikte database. Enkele voorbeelden: Voorbeeld 1: ALTER TABLE, toevoegen van een bepaalde constraint Voor Interbase : CREATE TABLE project8 ( projectnummer numeric(6) NOT NULL,projectomschrijving varchar(50),budget numeric(6)) Deze CREATE TABLE maakt de tabel project8 aan, zonder constraints. Met behulp van de ALTER TABLE kunnen nu de ontbrekende constraints gezet worden. ALTER TABLE project8 ADD CONSTRAINT PK_PNBR PRIMARY KEY(projectnummer) Op een gelijkaardige manier kunnen constraints terug weggenomen worden. ALTER TABLE project8 DROP CONSTRAINT PK_PNBR Vormingscentrum Tongeren 51

Voorbeeld 2: ALTER TABLE, toevoegen van een kolom Voor de bestaande tabel project, moet er om een bepaalde reden een kolom toegevoegd worden. Dit kan gedaan worden met een ALTER TABLE. Voor Interbase : CREATE TABLE project8 ( projectnummer numeric(6) NOT NULL,projectomschrijving varchar(50),budget numeric(6)) ALTER TABLE project8 ADD begindatum date Deze laaste instructie zorgt ervoor dat de tabel project8 eenextra veld krijgt namelijk het veld begindatum. Naast het toevoegen en of veranderen van bepaalde constraints is het ook mogelijk om constraints te verwijderen. Ook hier moet de opmerking gemaakt worden dat de mogelijkheden afhangen van de gebruikte databank. Zo is het in Interbase mogelijk om rechtstreeks een kolom te verwijderen uit een tabel, wat dan in Oracle niet mogelijk is. Ook hier wordt verwezen naar de handleiding voor de specificaties van het ALTER TABEL commando. Voorbeeld 3: ALTER TABLE, verwijderen van een constraint Stel dater op tabel project8, veld budget een check gezet wordt die bepaald dat het budget nooit groter mag worden dan 1000. CREATE TABLE project8 ( projectnummer numeric(6) NOT NULL,projectomschrijving varchar(50),budget numeric(6)) ALTER TABLE project8 ADD CONSTRAINT ch_budget CHECK (BUDGET <= 1000) ALTER TABLE project8 DROP CONSTRAINT ch_budget Vormingscentrum Tongeren 52

Drop Table Naast het maken van een tabel via het CREATE TABLE commando is er ook een commando voorzin om een tabel terug te verwijderen. Het verwijderen van een tabel houdt in dat de tabel( de beschrijving) samen met de gegevens erin worden verwijderd van de schijf. Samen met het verwijderen van de tabel gaan ook de constraints en triggers, op voorwaarde dat ze bestaan weggedaan worden. Het commando dat gebruikt wordt om een tabel definitief te verwijderen is DROP TABLE. Let hierbij goed op want dit is een DDL-statement. m.a.w. dit kan niet ongedaan gemaakt worden met een rollback uit te voeren. Voorbeeld: DROP TABLE PROJECT DROP TABLE PROJECTMEDEWERKER Vormingscentrum Tongeren 53

Indexen Algemeen Een index is een database-object wat het ophalen van gegevens kan versnellen. De bedoeling hierbij is het aantal input-output operaties te verminderen om aldusdanig snelheid te winnen. In principe zijn indexen onafhankelijk van de tabel die ze indexeren, of m.a.w ze kunnen gemaakt of gedropped worden op eender wellk moment zonder effect te hebben op de tabel of andere indexen. Er kunnen een tweetal soorten van indexen gemaakt worden. Een type is de 'unique index'. Deze index wordt automatisch door de databank gemaakt wanneer bij een tabel gemaakt wordt, waarin een kolom de constraint van PRIMARY KEY of UNIQUE krijgt. Een tweede soort is de niet-unieke index die bekomen wordt door bijvoorbeeld het leggen van een FOREIGN KEY, om de bij een join de opzoeksnelheid te verhogen. Wanneer? Meer is niet altijd beter. Bij elk DML-commando (Data Manipulation Language) moeten de indexen bijgewerkt worden. Dit vraagt de nodige tijd.dushoe meer indexen er gezet worden op een bepaalde tabel, des te meer tijd heeft de server nodig om al deze indexen te gaan bijwerken. Enkele richtlijnen: Wel een index gebruiken : De kolom wordt zeer dikwijls gebruikt in een WHERE -clausule, of in een join. De kolom bevat zeer uiteenlopende waarden De kolom bevat een groot aantal NULL-waarden De tabel is zeer groot en de meeste queries gaan ongeveer 10 tot 15 procent van de gegevens ophalen. Geen index gebruiken: De tabel is vrij klein De kolom worden zelden tot nooit gebruikt in een where of een join Niet gebruiken op tabellen die zeer dikwijls ge-update worden Vormingscentrum Tongeren 54

Create Index CREATE INDEX index ON table (kolom [,kolom] ) Voorbeeld: Maak een index op de tabel PROJECT op het veld budget CREATE INDEX IX_PR8_BUDGET ON PROJECT8 (BUDGET) Verwijderen van een index Het is niet mogelijk om een index te wijzigen. Om een index te wijzigen moet deze eerst weggedaan worden en vervolgens opnieuw gemaakt om de nieuwe kolom of kolommen. Een index wordt weggedaan door het statement DROP INDEX uit te voeren. Voorbeeld : CREATE INDEX IX_PR8_BUDGET Vormingscentrum Tongeren 55

Bijlage 1 : Structuur van de tabellen 1. Het medewerkers bestand : MDW MNR : Medewerkernummer : integer NAAM : Naam : CHAR(12) VOORL : Voorletter, initialen : CHAR(5) FUNCTIE : Functie in het bedrijf : CHAR(10) CHEF : Wie is zijn chef? : Integer GBDATUM : Geboorte datum : Date MAANDSAL : Maand Salaris : Integer COMM : Commissie : Integer AFD : In welke afdeling werkt ie : Integer 2. Het afdelings bestand : AFD ANR : Afdelings nummer : Integer NAAM : Naam afdeling : CHAR(20) LOCATIE : Waar ligt deze afdeling? : CHAR(20) HOOFD : Wie is hoofd v/deze afd : Integer 3. Het cursussen bestand : CRS CODE : ID Van een cursus : CHAR(4) OMSCHRIJVING: no comment : CHAR(50) TYPE : Wat voor een cursus : CHAR(3) LENGTE : Hoelang duurt ze : Integer 4. Het uitvoerings bestand : UITV CURSUS : Welke cursus : CHAR(4) BEGINDATUM : Wanneer begonnnen : Date DOCENT : Wie geeft er de cursus : Integer LOCATIE : Waar gebeurt de cursus : CHAR(20) 5. Het inschrijvings bestand : INSCHR CURSIST : Wie doet er mee? : Integer CURSUS : aan welke cursus? : CHAR(4) BEGINDATUM : van welke begindatum? : Date EVALUATIE : Hoe was de cursus : Integer Vormingscentrum Tongeren 56

Vormingscentrum Tongeren 57

Bijlage 2 : Inhoud van de tabellen Tabel medewerkers : MDW MNR NAAM VOORL FUNCTIE CHEF GBDATUM MAANDSAL COMM AFD 7369 SMIT N TRAINER 7902 17/12/65 800 20 7499 ALDERS JAM VERKOPER 7698 20/02/61 1.600 300 30 7521 DE WAARD TF VERKOPER 7698 22/02/62 1.250 500 30 7566 JANSEN JM MANAGER 7839 2/04/67 2.975 20 7654 MARTENS P VERKOPER 7698 28/09/56 1.250 1.400 30 7698 BLAAK R MANAGER 7839 1/11/63 2.850 30 7782 CLERCKX AB MANAGER 7839 9/06/65 2.450 10 7788 SCHOTTEN SCJ TRAINER 7566 26/11/59 3.000 20 7839 DE KONING CC DIRECTEUR 17/11/52 5.000 10 7844 DEN DRAAIER JJ VERKOPER 7698 28/09/68 1.500 0 30 7876 ADAMS AA TRAINER 7788 30/12/66 1.100 20 7900 JANSEN R BOEKHOUDER 7698 3/12/69 800 30 7902 SPIJKER MG TRAINER 7566 13/02/59 1.300 20 7934 MOLENAAR TJA BOEKHOUDER 7782 23/01/62 1.300 10 Tabel afdeling : AFD ANR NAAM LOCATIE HOOFD 10 HOOFDKANTOOR LEIDEN 7782 20 OPLEIDINGEN DEMEERN 7566 30 VERKOOP UTRECHT 7698 40 PERSONEELSZAKEN GRONINGEN 7839

Tabel cursussen : CRS CODE OMSCHRIJVING TYPE LENGTE CGE Systeemgeneratie met ORACLE CASE DSG 4 CSO Systeemontwerp met ORACLE CASE DSG 5 ERM Datamodellering met ERM DSG 3 FOR Applicatiebouw met SQL*Forms BLD 4 OAG ORACLE voor Applicatiegebruikers ALG 1 PMT Procesmodelleringstechnieken DSG 1 RSO Relationeel Systeemontwerp DSG 2 S02 Introductie SQL en SQL*plus ALG 4 SMU Bouwen met SQL*Menu BLD 1 SRW Bouwen met SQL*ReportWriter BLD 2 Tabel uitvoeringen : UITV CURSUS BEGINDATUM ³ DOCENT LOCATIE CSO 17/02/92 DE MEERN ERM 13/01/92 FOR 17/12/90 7566 MAASTRICHT FOR 5/02/91 7876 DE MEERN OAG 10/08/90 7566 UTRECHT OAG 27/09/91 7902 DE MEERN RSO 24/02/92 7788 UTRECHT S02 16/04/90 7902 DE MEERN S02 8/10/90 7369 MAASTRICHT S02 17/12/90 7369 DE MEERN SMU 11/09/91 7788 DE MEERN SRW 4/02/91 7369 DE MEERN SRW 18/09/91 MAASTRICHT Vormingscentrum Tongeren 59

Tabel inschrijvingen : INSCHR CURSIST CURSUS BEGINDATUM ³ EVALUATIE 7499 FOR 17/12/90 2 7499 S02 16/04/90 4 7499 SMU 11/09/91 7499 SRW 1/02/91 5 7521 OAG 10/12/90 4 7566 FOR 5/02/91 3 7566 SMU 11/09/91 7698 FOR 5/02/91 5 7698 S02 16/04/90 4 7698 S02 17/12/90 7782 FOR 17/12/90 5 7788 FOR 17/12/90 5 7788 FOR 5/02/91 4 7788 S02 8/10/90 7839 FOR 17/12/90 4 7839 S02 8/10/90 3 7844 OAG 27/09/91 5 7876 FOR 17/12/90 5 7876 S02 16/04/90 2 7876 SMU 11/09/91 7900 OAG 10/08/90 4 7900 SRW 4/02/91 4 7902 OAG 10/08/90 5 7902 S02 8/10/90 4 7902 S02 17/12/90 7934 S02 16/04/90 5 Vormingscentrum Tongeren 60

8 Unieke volgnummers Doelstellingen: Maken van unieke volgnummers voor kolommen van een tabel. Op het einde van de les moet men in staat zijn om : Het gebruik van unieke volgnummers verklaren Gebruiken van unieke volgnummers

Algemeen Vele applicatie's moeten beschikken over een uniek volgnummer die dan als sleutel gebruikt kan worden. Dit kan ofwel ingebouwd worden in de applicatie zelf ofwel kan er gebruik gemaakt worden van een object van de databank. De benamingen van deze objecten verschillen van databank tot databank. Onderstaande tabel geeft een kort overzicht. Overzicht : Databank Benaming ORACLE SEQUENCE INTERBASE GENERATOR ACCESS AUTOINCREMENT Voor de verdere bespreking zal de term "sequence" gebruikt worden. Een sequence generator kan gebruikt worden voor het automatisch genereren van unieke nummers voor rijen in tabellen. Een sequence is een databank-object kan gedeeld kan worden door meerdere gebruikers. Een typisch gebruik van een sequence is het maken van een primary-key waarde, die uniek moet zijn voor elke rij van de tabel. De sequence wordt automatisch met één verhoogd door de databank zelf. Dit kan gebeuren, afhankelijk van databank tot databank, door een interne routine (oracle) ofwel door een bepaalde routine aan te roepen (interbase). Dit kan tijdbesparend werken omdat er op deze manier geen applicatie-code moet geschreven worden om de volgnummers te bepalen. Een sequence is tevens onafhankelijk van een tabel zodat één bepaalde sequence door verschillende tabellen gebruikt kan worden. Vormingscentrum Tongeren 62

Creatie van een sequence Voor Oracle : CREATE SEQUENCE sequence [INCREMENT BY n] [START WITH n] [{MAXVALUE n NOMAXVALUE}] [{MINVALUE n NOMINVALUE}] [{CYCLE NOCYCLE] [{CACHE n NOCACHE }] Voor Interbase : CREATE GENERATOR name SET GENERATOR name to 1 (geeft de startwaarde 1) Gebruik van een sequence Oracle : INSERT INTO TABEL_TEST (VOLGNUMMER, NAAM) VALUES (SEQUENCE_NAAM.NEXTVAL, 'NAAM_VAN_IEMAND') Interbase : INSERT INTO TABEL_TEST (VOLGNUMMER, NAAM) VALUES (GEN_ID(GENERATOR_NAAM,VERHOGING_VAN), 'NAAM_VAN_IEMAND') Bij Interbase is het mogelijk om de volgnummer met een bepaald getal te laten stijgen (verhoging_met). Eenmaal een nummer gegeneerd wordt is dit opgebruikt. Dit wil zeggen dat deze nummer niet meer gebruikt kan worden. Ook het ROLLBACK-statement heeft hier geen invloed op. Opmerking : Een sequence geeft unieke nummers. Deze zijn niet noodzakelijke opeenvolgend! Vormingscentrum Tongeren 63

Verwijderen van een sequence Oracle : DROP SEQUENCE sequence Interbase : Interbase kent geen drop generator commando. Om bij Interbase een generator te verwijderen wordt er gebruik gemaakt van een delete - commando : DELETE FROM RDB$GENERATORS WHERE RDB$GENERATOR_NAME = 'GENERATOR_NAME' Vormingscentrum Tongeren 64

9 Views Op het einde van de les moet men in staat zijn om : Het begrip view te verklaren Views maken Views wijzigen Views verwijderen Vormingscentrum Tongeren 65

Algemeen Wat is een view Een view is een logische tabel gebaseerd op een andere tabel of op een andere view. Een view op zich bevat geen data, maar kan best vergeleken worden met een venster waardoor gegevens van tabellen kunnen bekeken of gewijzigd worden. Een view wordt in de databank opgeslaan als een SELECT-statement in de data dictionary. Voordelen van views - beperken van de toegang tot de databank omdat de view slechts een deel van de gegevens gaat tonen van de tabellen in de databank. - Gebruikers toelaten om eenvoudige selekties te maken om resultaten te bekomen van complexe selekties. Bijvoorbeeld, een view kan een gebruiker helpen om informatie op te vragen uit meerdere tabellen zonder te weten hoe hij/zij een join moet opbouwen. - Een view kan gebruikt worden voor het ophalen van gegevens uit meerdere tabellen. Creatie van een view Oracle create [or replace] [force noforce] view view [(alias[, alias] )] as subquery [with check option [constraint constraint]] [with read only] force maakt de view aan, ongeacht of de tabel bestaat of niet noforce maakt de view enkel aan indien de tabel bestaat ( = standaardinstelling) view naam van de view alias alias voor de kolommen uit de view subquery de volledige select with check option specifieert dat enkel rijen die zichtbaar zijn met de view mogen toegevoegd of ge-update worden constraint is de naam die gegeven wordt aan de check option constraint with read only zorgt ervoor dat er geen DML -statements uitgevoerd kunnen worden op deze view Vormingscentrum Tongeren 66

Interbase CREATE VIEW name [( view_col [, view_col...)] AS <select> [WITH CHECK OPTION]; Voorbeeld : CREATE VIEW PHONE_LIST AS SELECT EMP_NO,FIRST_NAME,LAST_NAME,LOCATION,PHONE_NO FROM EMPLOYEE,DEPARTMENT WHERE EMPLOYEE.DEPT_NO = DEPARTMENT.DEPT_NO; Opmerking : In een view mag er nooit 'ORDER BY' staan. Opvragen van gegevens Opvragen van gegevens uit de view gebeurt op dezelfde manier als opvragen van gegevens uit een tabel. voorbeeld : select * from phone_list Uitvoeren van DML - statements op een view Het is mogelijk om DML - statements uit te voeren met een view op voorwaarde - een join - voorwaarde - group -function - een group by optie - een distinct commando - kolommen bekomen door bewerking : voorbeeld : salaris * 12 Vormingscentrum Tongeren 67

De nieuwe elementen worden dus direct aangepast of toegevoegd in de onderliggende tabellen van de view. Dit wil dus zeggen dat wanneer er van die onderliggende tabellen een aantal velden NOT NULL zijn, dan moeten die dus ook in de view opgenomen worden. Check option Indien er met een view een DML - statement uitgevoerd wordt is het noodzakelijk dat de aangepaste gegevens ook nog te zien zijn door deze view. Om ervoor te zorgen dat dit steeds zo is kan er een CHECK OPTION CONSTRAINT meegegeven worden. Voorbeeld : (voor interbase) Create view view_test01 as select * from employee where job_code = 'Sales' with check option EMP_NO FIRST_NAME LAST_NAME PHONE_EXT HIRE_DATE DEPT_NO JOB_CODE JOB_GRADE JOB_COUNTRY SALARY FULL_NAME ====== ========== ========= ========= =========== ======= ======== ========= =========== ====== ================= 34 Janet Baldwin 2 21-MAR-1991 110 Sales 3 USA 61637.81 Baldwin, Janet 36 Roger Reeves 6 25-APR-1991 120 Sales 3 England 33620.62 Reeves, Roger Stel nu dat we het veld jobgrade willen aanpassen van 3 naar 5 update view_test01 set job_code = 'Test' where emp_no = 34 Wanneer we dit uitvoeren geeft de databank volgende foutmelding : "Operation violates CHECK constraint INTEG_30 on view or table EMPLOYEE" Geen enkele rij werd aangepast omdat de job_code zou aangepast worden. Op deze manier zou de view deze medewerker niet meer zien. De view was trouwens specifiek gemaakt om alle medewerkers met 'job_grade = 'Sales'' te zien. Oracle gaat hier nog een stapje verder. Hier is het mogelijk om te specifiëren om geen DML - statements toe te laten op een view. Dit gebeurt door de constraint 'WITH READ ONLY' mee te geven tijdens de creatie van de view. Vormingscentrum Tongeren 68

Verwijderen van een view Door het commando DROP VIEW view_name uit te voeren wordt de view verwijderd van de databank. Het verwijderen heeft geen enkele invloed op de onderliggende tabellen van de view Vormingscentrum Tongeren 69

10 Triggers Op het einde van de les moet men in staat zijn om : Het begrip trigger te verklaren Weten wanneer een trigger te gebruiken Maken van een trigger Verwijderen van een trigger Vormingscentrum Tongeren 70

Algemeen Een trigger is een op zichzelf bestaande routine die afhankelijk is van een bepaalde tabel of view. Deze routine gaat een aktie ondernemen indien er op die tabel een DML - statement wordt uitgevoerd. Een trigger wordt nooit direct aangeroepen, maarwordt als het ware afgevuurd door de databank op het moment dat er op die tabel een INSERT, UPDATE of DELETE gedaan wordt. Voordelen van triggers : - Invoercontrole doen, m.a.w controleren of er door de gebruiker geldige waarden worden toegvoegd in de kolommen. - Verminderen van onderhoud op bestaande programmatuur omdat wijzigingen aan een trigger automatisch geldig is voor alle programma's. Deze moeten dus niet gehercompileerd worden. - Er kan een automatische logging gedaan worden op de tabel. Creatie van een trigger Oracle : (Deze syntax is geldig voor row-triggers. Er bestaan ook nog statement trigger, maar daarop wordt niet verder ingegaan) CREATE OR REPLACE TRIGGER TRIGGER_NAME TIMING EVENT [OR] ON TABLE_NAME FOR EACH ROW [WHEN RESTRICTION CONDITION] { PL/SQL - BLOCK} trigger_name: timing: event: table_name: pl/sql - block: naam van de trigger geeft de tijd aan wanneer de trigger reageert in verhouding tot de trigger event BEFORE AFTER geeft het type DML-statement aan dewelke de trigger doet afvuren. naam van de tabel code die uitgevoerd word door de trigger Vormingscentrum Tongeren 71

Interbase : CREATE TRIGGER NAME FOR { TABLE VIEW} [ACTIVE INACTIVE] {BEFORE AFTER} {DELETE INSERT UPDATE} [POSITION NUMBER] AS < TRIGGER_BODY> Voorbeeld van een trigger : Oracle : create or replace trigger audit_emp after delete or insert or update on employee for each row begin if deleting then update audit_table set del = del +1 where user_name = user and table_name = user and colomn_name is null; elsif inserting then update audit_table set ins = ins +1 where user_name = user and table_name = 'EMPLOYEE' and colomn_name is null; elsif updating ('salary') then update audit_table set upd = upd +1 where user_name = user and table_name = 'EMPLOYEE' and colomn_name = 'salary'; else /* hier gaat het over een algemene update */ update audit_table set upd = upd +1 where user_name = user and table_name = 'EMPLOYEE' and colomn_name is null'; endif; end; Vormingscentrum Tongeren 72

Interbase : create trigger save_salary_change for Employee after update as begin if (old.salary <> new.salary) then insert into Salary_History (emp_no, change_date, update_id, old_salary, percent_change) values ( old.emp_no, 'now', user, old.salary, (new.salary - old.salary) * 100 / old.salary ); end Opmerking: Voor de code in de 'trigger-body', de gebruikte commando's tussen 'begin' en 'end' van de trigger wordt verwezen naar de handleiding van de gebruikte databank. Verwijderen van trigger Door het commando DROP TRIGGER trigger_naam uit te voeren wordt de trigger verwijderd van de databank. Oefeningen Hoofdstuk 1 : Select 1. Geef de naam en functie van alle medewerkers die verkoper zijn. ALDERS VERKOPER DE WAARD VERKOPER MARTENS VERKOPER DEN DRAAIER VERKOPER 2. Geef de naam en functie van de medewerkers die geen boekhouder zijn. SMIT ALDERS DE WAARD JANSEN MARTENS TRAINER VERKOPER VERKOPER MANAGER VERKOPER Vormingscentrum Tongeren 73

BLAAK MANAGER CLERCKX MANAGER SCHOTTEN TRAINER DE KONING DIRECTEUR DEN DRAAIER VERKOPER ADAMS TRAINER SPIJKER TRAINER 3. Geef naam, functie en maansalaris van alle medewerkers die minder dan 3000 verdienen, en geen manager zijn. SMIT TRAINER 800 ALDERS VERKOPER 1600 DE WAARD VERKOPER 1250 MARTENS VERKOPER 1250 DEN DRAAIER VERKOPER 1500 ADAMS TRAINER 1100 JANSEN BOEKHOUDER 800 MOLENAAR BOEKHOUDER 1300 Vormingscentrum Tongeren 74

4. Welke medewerkers verdienen minder dan 2500 SMIT 800 ALDERS 1600 DE WAARD 1250 MARTENS 1250 CLERCKX 2450 DEN DRAAIER 1500 ADAMS 1100 JANSEN 800 MOLENAAR 1300 5. Van welke afdeling is medewerker 7698 de baas? 30 6. Geef het nummer en de naam van de medewerkers 7369 SMIT 7499 ALDERS 7521 DE WAARD 7566 JANSEN 7654 MARTENS 7698 BLAAK 7782 CLERCKX 7788 SCHOTTEN 7839 DE KONING 7844 DEN DRAAIER 7876 ADAMS 7900 JANSEN 7902 SPIJKER 7934 MOLENAAR 7. Geef de verschillende functies van de medewerkers BOEKHOUDER DIRECTEUR MANAGER TRAINER VERKOPER Vormingscentrum Tongeren 75

8. Geef de nummer en de naam van elke cursus CGE CSO ERM FOR OAG PMT RSO S02 SMU SRW Systeemgeneratie met ORACLE CASE Systeemontwerp met ORACLE CASE Datamodellering met ERM Applicatiebouw met SQL*Forms ORACLE voor Applicatiegebruikers Procesmodelleringstechnieken Relationeel Systeemontwerp Introductie SQL en SQL*plus Bouwen met SQL*Menu Bouwen met SQL*ReportWriter 9. In welke locaties zijn er afdelingen gevestigd DE MEERN GRONINGEN LEIDEN UTRECHT 10. Geef de nummer en de naam van elke medewerker die trainer is 7369 SMIT 7788 SCHOTTEN 7876 ADAMS 7902 SPIJKER 11. Geef de naam, functie en het salaris van elke medewerker die in afdeling 30 werkt en meer dan 2500 verdient. BLAAK MANAGER 2850 12. In welke locatie is de afdeling die door medewerker 7566 geleid wordt gevestigd DE MEERN Vormingscentrum Tongeren 76

13. Geef de namen van de medewerkers die in afdeling 10 of 20 werken SMIT 20 JANSEN 20 CLERCKX 10 SCHOTTEN 20 DE KONING 10 ADAMS 20 SPIJKER 20 MOLENAAR 10 14. Geef van elke medewerker de naam en het jaarsalaris!! SMIT 9600 ALDERS 19200 DE WAARD 15000 JANSEN 35700 MARTENS 15000 BLAAK 34200 CLERCKX 29400 SCHOTTEN 36000 DE KONING 60000 DEN DRAAIER 18000 ADAMS 13200 JANSEN 9600 SPIJKER 36000 MOLENAAR 15600 15. Geef de namen van de medewerkers wiens naam eindigt op N JANSEN SCHOTTEN JANSEN Vormingscentrum Tongeren 77

16. Geef de namen en het salaris van de medewerkers van groot naar klein gesorteerd op salaris. DE KONING 5000 SPIJKER 3000 SCHOTTEN 3000 JANSEN 2975 BLAAK 2850 CLERCKX 2450 ALDERS 1600 DEN DRAAIER 1500 MOLENAAR 1300 MARTENS 1250 DE WAARD 1250 ADAMS 1100 JANSEN 800 SMIT 800 17. Geef de namen en het salaris van alle medewerkers die tussen de 1000 en 3000 verdienen, maar niet gelijk is aan 2850, noch aan 1600. De resultaten worden in dalend salaris getoond SCHOTTEN 3000 SPIJKER 3000 JANSEN 2975 CLERCKX 2450 DEN DRAAIER 1500 MOLENAAR 1300 DE WAARD 1250 MARTENS 1250 ADAMS 1100 Vormingscentrum Tongeren 78

18. Geef de namen en het salaris van de medewerkers, naam alfabetisch gesorteerd en salaris van groot naar klein. ADAMS 1100 ALDERS 1600 BLAAK 2850 CLERCKX 2450 DE KONING 5000 DE WAARD 1250 DEN DRAAIER 1500 JANSEN 2975 JANSEN 800 MARTENS 1250 MOLENAAR 1300 SCHOTTEN 3000 SMIT 800 SPIJKER 3000 19. Geef de namen van alle medewerkers waarin een dubbele E voorkomt. NIKS, NOPPES, NIEMAND... 20. Geef een lijst waarop de naam van de medewerker staat, zijn huidig salaris en zijn toekomstig salaris als elke medewerker een opslag van 10% zou krijgen. Zorg voor fatsoenlijke namen in het getoonde resultaat. SMIT 800 880 ALDERS 1600 1760 DE WAARD 1250 1375 JANSEN 2975 3272.5 MARTENS 1250 1375 BLAAK 2850 3135 CLERCKX 2450 2695 SCHOTTEN 3000 3300 DE KONING 5000 5500 DEN DRAAIER 1500 1650 ADAMS 1100 1210 JANSEN 800 880 SPIJKER 3000 3300 MOLENAAR 1300 1430 Vormingscentrum Tongeren 79

21. Geef de cursus en de begindata van de inschrijvingen weer, als alle cursussen 1 week later beginnen. FOR 24/12/90 S02 23/04/90 SMU 18/09/91 SRW 8/02/91 OAG 17/08/90 FOR 12/02/91 SMU 18/09/91 FOR 12/02/91 S02 23/04/90 S02 24/12/90 FOR 24/12/90 FOR 24/12/90 FOR 12/02/91 S02 15/10/90 FOR 24/12/90 S02 15/10/90 OAG 4/10/91 FOR 24/12/90 S02 23/04/90 SMU 18/09/91 OAG 17/08/90 SRW 11/02/91 OAG 17/08/90 S02 15/10/90 S02 24/12/90 S02 23/04/90 22. Hoeveel dagen zijn er tussen vandaag en de geboortedatum van de werknemers. SMIT N 12788 ALDERS JAM 14549 DE WAARD TF 14182 JANSEN JM 12317 MARTENS P 16155 BLAAK R 13565 CLERCKX AB 12979 SCHOTTEN SCJ 15001 DE KONING CC 17566 DEN DRAAIER JJ 11772 ADAMS AA 12410 JANSEN R 11341 SPIJKER MG 15287 MOLENAAR TJA 14212 Vormingscentrum Tongeren 80

Oefeningen Hoofdstuk 2 : Single row functies 1. Geef een overzicht van all medewerkers als volgt : SMIT N is TRAINER ALDERS JAM is VERKOPER DE WAARD TF is VERKOPER JANSEN JM is MANAGER MARTENS P is VERKOPER BLAAK R is MANAGER CLERCKX AB is MANAGER SCHOTTEN SCJ is TRAINER DE KONING CC is DIRECTEUR DEN DRAAIER JJ is VERKOPER ADAMS AA is TRAINER JANSEN R is BOEKHOUDER SPIJKER MG is TRAINER MOLENAAR TJA is BOEKHOUDER 2. Geef de namen van de medewerkers in kleine letters : smit alders de waard jansen martens blaak clerckx schotten de koning den draaier adams jansen spijker molenaar Vormingscentrum Tongeren 81

3. Geef de namen van de medewerkers in hoofdletter SMIT ALDERS DE WAARD JANSEN MARTENS BLAAK CLERCKX SCHOTTEN DE KONING DEN DRAAIER ADAMS JANSEN SPIJKER MOLENAAR 4. Geef de namen van de medewerkers zodat de eerste letter een hoofdletter is en de rest kleine letters : Smit Alders De waard Jansen Martens Blaak Clerckx Schotten De koning Den draaier Adams Jansen Spijker Molenaar Vormingscentrum Tongeren 82

5. Schrijf de sql die het volgende als resultaat geeft : SMIT heeft als functie TRAINER ALDERS heeft als functie VERKOPER DE WAARD heeft als functie VERKOPER JANSEN heeft als functie MANAGER MARTENS heeft als functie VERKOPER BLAAK heeft als functie MANAGER CLERCKX heeft als functie MANAGER SCHOTTEN heeft als functie TRAINER DE KONING heeft als functie DIRECTEUR DEN DRAAIER heeft als functie VERKOPER ADAMS heeft als functie TRAINER JANSEN heeft als functie BOEKHOUDER SPIJKER heeft als functie TRAINER MOLENAAR heeft als functie BOEKHOUDER Vormingscentrum Tongeren 83

Oefeningen Hoofdstuk 3 : Joins 1. Geef van elke medewerker het nummer en de naam van de afdeling waarvoor hij/zij werkt, gesorteerd op de afdelingsnummer. CLERCKX 10 HOOFDKANTOOR DE KONING 10 HOOFDKANTOOR MOLENAAR 10 HOOFDKANTOOR JANSEN 20 OPLEIDINGEN SCHOTTEN 20 OPLEIDINGEN ADAMS 20 OPLEIDINGEN SPIJKER 20 OPLEIDINGEN SMIT 20 OPLEIDINGEN MARTENS 30 VERKOOP BLAAK 30 VERKOOP DE WAARD 30 VERKOOP ALDERS 30 VERKOOP DEN DRAAIER 30 VERKOOP JANSEN 30 VERKOOP 2. Geef het nummer van elke medewerker die in de afdeling HOOFDKANTOOR werkt 7782 7839 7934 3. Geef de namen van de medewerkers die in dezelfde afdeling werken als ALDERS ALDERS BLAAK DE WAARD DEN DRAAIER JANSEN MARTENS Vormingscentrum Tongeren 84

4. Geef de namen van de medewerkers die in dezelfde plaats een cursus gaan volgen als waar hun afdeling gevestigd is ADAMS DE WAARD JANSEN JANSEN SCHOTTEN SPIJKER AA TF JM R SCJ MG 5. Geef het nummer van elke medewerker gevolgd door de naam van zijn of haar baas 7369 SPIJKER 7499 BLAAK 7521 BLAAK 7566 DE KONING 7654 BLAAK 7698 DE KONING 7782 DE KONING 7788 JANSEN 7839 7844 BLAAK 7876 SCHOTTEN 7900 BLAAK 7902 JANSEN 7934 CLERCKX 6. Geef de namen van de medewerkers die een cursus gevolgd hebben die hun baas ook gevolgd heeft. ALDERS CLERCKX SCHOTTEN ADAMS 7. Geef de namen en cursus-code van de docenten die cursussen S02, OAG of ERM doceren. JANSEN OAG SMIT S02 SPIJKER OAG SPIJKER S02 8. Welke medewerkers verdienen meer dan hun baas? SCHOTTEN SPIJKER 9. Geef van alle inschrijvingen de naam van de cursist, de naam van de leraar en de naam van de cursus Vormingscentrum Tongeren 85

FOR 17/12/90 ADAMS JANSEN Applicatiebouw met SQL*Forms FOR 17/12/90 DE KONING JANSEN Applicatiebouw met SQL*Forms FOR 17/12/90 SCHOTTEN JANSEN Applicatiebouw met SQL*Forms FOR 17/12/90 CLERCKX JANSEN Applicatiebouw met SQL*Forms FOR 17/12/90 ALDERS JANSEN Applicatiebouw met SQL*Forms FOR 5/02/91 SCHOTTEN ADAMS Applicatiebouw met SQL*Forms FOR 5/02/91 JANSEN ADAMS Applicatiebouw met SQL*Forms FOR 5/02/91 BLAAK ADAMS Applicatiebouw met SQL*Forms OAG 10/08/90 SPIJKER JANSEN ORACLE voor Applicatiegebruikers OAG 10/08/90 JANSEN JANSEN ORACLE voor Applicatiegebruikers OAG 10/08/90 DE WAARD JANSEN ORACLE voor Applicatiegebruikers OAG 27/09/91 DEN DRAAIER SPIJKER ORACLE voor Applicatiegebruikers S02 16/04/90 BLAAK SPIJKER Introductie SQL en SQL*plus S02 16/04/90 ALDERS SPIJKER Introductie SQL en SQL*plus S02 16/04/90 ADAMS SPIJKER Introductie SQL en SQL*plus S02 16/04/90 MOLENAAR SPIJKER Introductie SQL en SQL*plus S02 8/10/90 SCHOTTEN SMIT Introductie SQL en SQL*plus S02 8/10/90 DE KONING SMIT Introductie SQL en SQL*plus S02 8/10/90 SPIJKER SMIT Introductie SQL en SQL*plus S02 17/12/90 BLAAK SMIT Introductie SQL en SQL*plus S02 17/12/90 SPIJKER SMIT Introductie SQL en SQL*plus SMU 11/09/91 JANSEN SCHOTTEN Bouwen met SQL*Menu SMU 11/09/91 ADAMS SCHOTTEN Bouwen met SQL*Menu SMU 11/09/91 ALDERS SCHOTTEN Bouwen met SQL*Menu SRW 1/02/91 ALDERS Bouwen met SQL*ReportWriter SRW 4/02/91 JANSEN SMIT Bouwen met SQL*ReportWriter 10. Geef de namen van de cursussen waarvan de docent niet gekend is Systeemontwerp met ORACLE CASE Datamodellering met ERM Bouwen met SQL* ReportWriter Vormingscentrum Tongeren 86

11. Geef de namen van de medewerkers van de afdeling verkoop, wiens commissie niet gekend is BLAAK JANSEN 12. Geef de begindata en de namen van alle cursussen samen met de docent die deze cursussen eventueel doceren 17/02/92 Systeemontwerp met ORACLE CASE 13/01/92 Datamodellering met ERM 17/12/90 Applicatiebouw met SQL*Forms JANSEN 5/02/91 Applicatiebouw met SQL*Forms ADAMS 10/08/90 ORACLE voor Applicatiegebruikers JANSEN 27/09/91 ORACLE voor Applicatiegebruikers SPIJKER 24/02/92 Relationeel Systeemontwerp SCHOTTEN 16/04/90 Introductie SQL en SQL*plus SPIJKER 8/10/90 Introductie SQL en SQL*plus SMIT 17/12/90 Introductie SQL en SQL*plus SMIT 11/09/91 Bouwen met SQL*Menu SCHOTTEN 4/02/91 Bouwen met SQL*ReportWriter SMIT 18/09/91 Bouwen met SQL*ReportWriter 13. Geef de namen van alle medewerkers en de namen van hun eventuele chefs SMIT SPIJKER ALDERS BLAAK DE WAARD BLAAK JANSEN DE KONING MARTENS BLAAK BLAAK DE KONING CLERCKX DE KONING SCHOTTEN JANSEN DE KONING DEN DRAAIER BLAAK ADAMS SCHOTTEN JANSEN BLAAK SPIJKER JANSEN MOLENAAR CLERCKX Vormingscentrum Tongeren 87

14. Geef de namen van alle afdelingen en hun eventuele hoofden HOOFDKANTOOR OPLEIDINGEN VERKOOP PERSONEELSZAKEN CLERCKX JANSEN BLAAK DE KONING 15. Geef de namen van de afdelingen die een medewerker in dienst hebben die meer dan 2900 verdient HOOFDKANTOOR OPLEIDINGEN 16. Geef de namen van de afdelingen die medewerker 7566 als baas hebben en minstens één medewerker in dienst hebben die meer dan 2500 verdient OPLEIDINGEN 17. Geef de namen van de medewerkers die zich voor cursus S02 ingeschreven hebben en tot een afdeling behoren die in Leiden of Utrecht gevestigd is. ALDERS BLAAK R CLERCKX DE KONING DE WAARD DEN DRAAIER JJ JANSEN MARTENS MOLENAAR JAM AB CC TF R P TJA 18. Geef het nummer en de naam van elke medewerker die zich tenminste in één cursus heeft ingeschreven waar ook medewerker 7499 zich heeft ingeschreven. 7566 JANSEN 7698 BLAAK 7782 CLERCKX 7788 SCHOTTEN 7839 DE KONING 7876 ADAMS 7934 MOLENAAR 19. Geef de naam van elke medewerker die in de afdeling verkoop of opleiding werkt, geef ook de naam van de afdeling. JANSEN SMIT SCHOTTEN ADAMS SPIJKER OPLEIDINGEN OPLEIDINGEN OPLEIDINGEN OPLEIDINGEN OPLEIDINGEN Vormingscentrum Tongeren 88

DE WAARD VERKOOP MARTENS VERKOOP ALDERS VERKOOP DEN DRAAIER VERKOOP JANSEN VERKOOP BLAAK VERKOOP 20. Geef de naam van elke afdeling waar een medewerker werkt die Trainer is en minder dan 2000 verdient. OPLEIDINGEN 21. Geef de naam en het salaris van eke medewerker die net zoveel verdient als De WAARD DE WAARD 1250 MARTENS 1250 22. Geef de namen van de medewerkers die minstens één cursus gevolgd hebben die hun baas ook gevolgd heeft. ADAMS ALDERS BLAAK R CLERCKX JANSEN SCHOTTEN AA JAM AB JM SCJ Vormingscentrum Tongeren 89

23. Geef de naam van elke medewerker die niet in een afdeling werkt die in Leiden is gevestigd SMIT ALDERS DE WAARD JANSEN MARTENS BLAAK SCHOTTEN DEN DRAAIER ADAMS JANSEN SPIJKER 24. Geef de naam van elke cursus die langer dan 3 dagen duurt en minstens door één medewerker gevolgd is. Applicatiebouw met SQL*Forms Introductie SQL en SQL*plus Vormingscentrum Tongeren 90

Oefeningen Hoofdstuk 4 : Group functions 1. Op welke datum is voor het laatst een cursus gepland 24/02/92 2. Geef het aantal medewerkers per afdeling 10 3 20 5 30 6 40 0 3. Geef het aantal medewerkers voor alle afdelingen behalve de afdeling 40 10 3 20 5 30 6 4. Geef per afdeling de naam, het max en het min salaris HOOFDKANTOOR 5000 1300 OPLEIDINGEN 3000 800 PERSONEELSZAKEN VERKOOP 2850 800 5. Geef per afdeling en per functie het aantal medewerkers en het gemiddelde salaris 10 BOEKHOUDER 1 1300 10 DIRECTEUR 1 5000 10 MANAGER 1 2450 20 MANAGER 1 2975 20 TRAINER 4 1975 30 BOEKHOUDER 1 800 30 MANAGER 1 2850 30 VERKOPER 4 1400 6. Geef per afdeling het gemiddelde salaris voor die afdelingen waar meer dan 4 medewerkers werken. 20 2175 5 30 1541,66666666667 6 Vormingscentrum Tongeren 91

7. Hoe lang duurt een cursus gemiddeld? 2,7 8. Gemiddelde salaris van alle medewerkers per afdeling HOOFDKANTOOR 2916,66666666667 OPLEIDINGEN 2175 PERSONEELSZAKEN VERKOOP 1541,66666666667 9. Aantal medewerkers per afdeling waar in hun afdelingsnaam OO staat HOOFDKANTOOR 3 VERKOOP 6 10. Geef het aantal cursussen waarvoor elke medewerker zich heeft ingeschreven, gesorteerd op aantal 7521 DE WAARD TF 1 7782 CLERCKX AB 1 7934 MOLENAAR TJA 1 7844 DEN DRAAIER JJ 1 7900 JANSEN R 2 7566 JANSEN JM 2 7839 DE KONING CC 2 7902 SPIJKER MG 3 7788 SCHOTTEN SCJ 3 7876 ADAMS AA 3 7698 BLAAK R 3 7499 ALDERS JAM 4 Vormingscentrum Tongeren 92

11. Hoe heten de drie hoogst betaalde medewerkers? DE KONING 1 SCHOTTEN 3 SPIJKER 3 12. Wat zijn de namen en de salarissen van de vijf laagst betaalde medewerkers? Dalend gesorteerd op salaris ADAMS 1100 3 DE WAARD 1250 5 JANSEN 800 2 MARTENS 1250 5 SMIT 800 2 13. Hoe heten de 2 meest verdienende verkopers? ALDERS 1 DEN DRAAIER 2 14. Hoeveel verschillende bazen zijn er (baas= manager, directeur) 4 Vormingscentrum Tongeren 93

Oefeningen Hoofdstuk 5 : Sub queries 1. Geef de naam en het salaris van elke medewerker die meer verdient dan BLAAK JANSEN 2975 SCHOTTEN 3000 DE KONING 5000 SPIJKER 3000 2. Geef de namen van de medewerkers die in dezelfde afdeling werken als ALDERS ALDERS DE WAARD MARTENS BLAAK DEN DRAAIER JANSEN 3. Geef de namen van de medewerkers die in dezelfde plaats een cursus gaan volgen als waar een afdeling is gevestigd ADAMS ALDERS BLAAK R DE WAARD DEN DRAAIER JJ JANSEN JANSEN MOLENAAR SCHOTTEN SPIJKER AA JAM TF JM R TJA SCJ MG Vormingscentrum Tongeren 94

4. Geef de naam en de tijdsduur van de cursussen die langer duren dan die met de korste tijdsduur Systeemgeneratie met ORACLE CASE 4 Systeemontwerp met ORACLE CASE 5 Datamodellering met ERM 3 Applicatiebouw met SQL*Forms 4 Relationeel Systeemontwerp 2 Introductie SQL en SQL*plus 4 Bouwen met SQL*ReportWriter 2 5. Geef naam, nummer en afdelingsnummer van de medewerkers die in de verkoop werken ALDERS 7499 30 DE WAARD 7521 30 MARTENS 7654 30 BLAAK 7698 30 DEN DRAAIER 7844 30 JANSEN 7900 30 6. Geef de namen van de medewerkers die een cursus gevolgd hebben die door SMIT gedoceerd werd BLAAK DE KONING JANSEN SCHOTTEN SPIJKER 7. Geef de namen van de medwerkers die niet in een Leidense afdeling werken SMIT ALDERS DE WAARD JANSEN MARTENS BLAAK R SCHOTTEN DEN DRAAIER JJ ADAMS JANSEN SPIJKER N JAM TF JM P SCJ AA R MG 8. Geef de namen van de medewerkers die alle cursussen gevolgd hebben NIEMAND 9. Geef de naam en het salaris van elke medewerker die meer verdient dan Jansen Jm Vormingscentrum Tongeren 95

SCHOTTEN 3000 DE KONING 5000 SPIJKER 3000 10. Geef de namen van de medewerkers die zich op minstens één cursus ingeschreven hebben waar ook jansen zich heeft ingeschreven. ADAMS ALDERS BLAAK CLERCKX DE KONING DE WAARD DEN DRAAIER JANSEN MARTENS MOLENAAR SCHOTTEN SMIT SPIJKER 11. Geef de namen van de cursussen die door alle medewerkers gevolgd zijn GEEN ENKELE 12. Geef de naam en het salaris van de medewerker die het meest verdient DE KONING 5000 Vormingscentrum Tongeren 96

13. Geef per afdeling de naam van de afdeling en de naam van de medewerker(s) die het meest verdient HOOFDKANTOOR DE KONING OPLEIDINGEN SCHOTTEN OPLEIDINGEN SPIJKER VERKOOP BLAAK 14. Geef de namen van de medewerkers die een hoger salaris hebben dan het gemiddelde salaris JANSEN BLAAK CLERCKX SCHOTTEN DE KONING SPIJKER 15. Geef de namen van de medewerkers die een hoger salaris hebben dan het gemiddelde salaris van hun afdeling ALDERS 1600 JANSEN 2975 BLAAK 2850 SCHOTTEN 3000 DE KONING 5000 SPIJKER 3000 16. Hoe luiden de namen van de medewerkers die minder dan het gemiddelde salaris verdienen? SMIT ALDERS DE WAARD MARTENS DEN DRAAIER ADAMS JANSEN MOLENAAR Vormingscentrum Tongeren 97

17. Wat is het gemiddelde salaris van de medewerkers die in dezelfde afdeling werken als Den Draaier? 1541,66666666667 18. Hoeveel medewerkers verdienen minder dan het gemiddelde salaris plus 200? 8 19. Hoe heten de medewerkers die onder jansen JM werken SCHOTTEN SPIJKER 20. Hoe heet de baas van Smit SPIJKER Vormingscentrum Tongeren 98