De presentatie wordt gedownload. Even geduld aub

De presentatie wordt gedownload. Even geduld aub

Overzicht databanken - Oefeningen

Verwante presentaties


Presentatie over: "Overzicht databanken - Oefeningen"— Transcript van de presentatie:

1 Overzicht databanken - Oefeningen
SQL - SQL Server 2000 Werken met 1 tabel : SELECT, Statistische functies, GROUP BY Werken met meerdere tabellen : JOIN, UNION, subselects, gecorreleerde subqueries Definitie van tabellen, indexen Wijzigen van tabellen : insert, update, delete Views Rechten en rollen De catalogus Triggers en stored procedures academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

2 Overzicht databanken - Oefeningen
Cursus Slides : op Dokeos Syllabus Punten Permanente evaluatie : 20% 1 gequoteerde oefening Examen Theorie : 40% Oefeningen : 40% academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

3 Overzicht databanken - Oefeningen
Voor de oefeningen en voorbeelden wordt gebruik gemaakt van Microsoft SQL Server 2000 Downloaden software “De hogeschool heeft met Signpost een overeenkomst i.v.m. het Microsoft MSDN Academic Alliance programma afgesloten. Het betreft hier het (zonder licentiekosten) ter beschikking stellen van de Microsoft server- en ontwikkelingsprogrammatuur voor studenten en docenten uit "informatica"-opleidingen. Het gebruik is uitdrukkelijk beperkt tot zuiver pedagogische toepassingen(op de hogeschool en thuis). Signpost staat in voor de distributie van de software via internet. Voor de aanbieding MSDNAA wordt per gebruiker een jaarlijkse bijdrage van € 27.50, excl. BTW gevraagd met een downloadlimiet van 12.5 Gbytes. Deze bevat o.a. SQL Server 2000, Visual Studio.Net,… Studenten registreren zich rechtstreeks bij Signpost via en betalen het bedrag rechtstreeks aan Signpost. Ook alle info kan op deze site gevonden worden.” Download de SQL Server 2000 Enterprise ande developers editie (ISO, branden op CD en installeren) Kies SQLSERVER components, klik Next Kies local computer Kies Create a new instance of SQL server, or install client tools Geef name en company in Agree de license Selecteer server and client tools Leave default checked on Kies Typical Kies use local system account Kies mixed mode en geef sa paswoord in academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

4 Overzicht databanken - Oefeningen
Hardware en Software vereisten + uitleg verschillende SQL server edities en vereisten qua OS : Installatie procedure : SQL Server Home : academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

5 Overzicht databanken - Oefeningen
SQL Server : Beheer Installatie, configuratie en beveiliging van SQL Server. Aanmaken van databanken Beheer van databanken : backup, restore, ... Gebeurt adhv Enterprise manager Client tool Is een Microsoft Management Console snap-in Toegankelijk via Programs > Microsoft SQL Server 2000 > Enterprise Manager Common Administrative Tasks Administering a SQL Server database involves: Installing, configuring, and securing SQL Server. Building databases. Tasks include allocating disk space to the database and log, transferring data into and out of the database, defining and implementing database security, creating automated jobs for repetitive tasks, and setting up replication to publish data to multiple sites. Managing ongoing activities, such as importing and exporting data, backing up and restoring the database and log, and monitoring and tuning the database. SQL Server includes tools and wizards for administering and managing the server, designing and creating databases, and querying data. It also provides online Help. SQL Server Enterprise Manager SQL Server provides an administrative client, SQL Server Enterprise Manager, which is a Microsoft Management Console (MMC) snap-in. MMC is a shared user interface for the management of Microsoft server applications. academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

6 Overzicht databanken - Oefeningen
Voor de oefening maken we gebruik van de planten database die deel uitmaakt van de SQL Server, geinstalleerd op de SQLSERVER server. Om vanop je client deze server te kunnen bekijken dien je Start Enterprise Manager In linker venster, rechtermuisklik op SQL Server Group. Selecteer New SQL Server Registration Vul de gegevens in Op eigen PC SQL Server = naam PC of localhost “Use Windows Authentication” Op school SQL Server = SQLSERVER “Use SQL Server Authentication” Login Name : studentsql paswoord : studentsql Nu is de database server beschikbaar en kan je de verschillende databanken beheren academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

7 Overzicht databanken - Oefeningen
Bevragen gegevens in SQL Server : via de Query Analyzer Programs > Microsoft SQL Server 2000 > Query Analyzer Connecteer met Op eigen PC SQL Server = naam PC of localhost Connecting using “Use Windows Authentication” Op school SQL Server = SQLSERVER SQL Server Authentication Login Name : studentsql, paswoord : studentsql In de Query Analyzer Selecteer eerste de gewenste database in de DB listbox, bvb Northwind Typ de query in Selecteer de Execute query –knop (F5) Transact SQL-help : selecteer een instructienaam en druk op SHIFT+F1 of via Programs > SQL Server 2000 > Books Online SQL Server 2000 offers several programming tools, including SQL Query Analyzer and the osql utility. SQL Query Analyzer is a Windows-based application, and osql is a utility that you can run from a command prompt. SQL Query Analyzer You can use SQL Query Analyzer to view query statements and results at the same time. You also can use it for writing, modifying, and saving Transact-SQL scripts. SQL Query Analyzer provides the following features: Customized marking of syntax elements. As you write a query, SQL Query Analyzer highlights keywords, character strings, and other language elements; you can customize how they appear. Multiple query windows, each with its own connection. Customizable views of result sets. You can view results in default result set form or in a grid so that you can manipulate them as you would a table. Graphical execution plans that describe how SQL Server executes the query. You can view the optimized plan of execution and verify your syntax. The ability to execute portions of a script. You can select portions of a script, and SQL Server will execute only those portions. academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

8 Overzicht databanken - Oefeningen
Oefeningen maken gebruik van planten database Installatie procedure : zie Dokeos academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

9 Overzicht databanken - Oefeningen
De voorbeelden in de theorie maken gebruik van de Products tabel uit de Northwind databank academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

10 SQL - standaarden en dialecten
Definitie Relationele gegevenstaal voor relationele database systemen. Niet procedurele taal Standaard : ANSI/ISO-1992 Database systemen Oracle : PL/SQL SQL Server : TRANSACT-SQL DB2 (IBM) Informix Sybase Access MySQL Relationele gegevenstaal : een taal voor het creeeren, onderhouden, beheren en bevragen van databasen Niet procedurele taal : ipv te specifieren hoe we een bepaalde taak volbrengen, specifieren we wat we willen bereiken en het DBMS beslist dan wat de beste manier is om die opdracht te volbrengen. De gebruiker hoeft de toegangspaden niet te kennen en ook niet te weten hoe de data fysisch georganiseerd is. Alle SQL statements gebruiken de query optimizer - een deel van het RDBMS – om te bepalen wat de snelste manier is om de data op te halen. De gebruiker moet zich dus enekl nog bezig houden met het resultaat dat hij wil bekomen. SQL werkt niet procedureel, in sql definieert men het gewenste resultaat (wat) en niet de te volgen procedure. (hoe). SQl is bovendien niet gebaseerd op de recordniveau, maar wel op (gegevens) verzamelingen niveau , in casu tabellen. Een stukje geschiedenis : 1970 : ibm onderzoeker E.F.Codd publiceert een artikel over “A relational model of Data for Large Shared databanks”. Wordt nu de vader van het relationeel model genoemd.De theorie was gebaseerd op wiskundige verzamelingen en ging over het opslaan en manipuleren van gegevens dmv tabelstructuren. 1974 : D.D.Chamberlain, R.F.Boyce en andere IBM collega’s definieren de Structured English Query Language (SEQUEL° 1976 ; SEQUEL/2 (Chamberlain c.s.) maar kreeg de naam SQL daar SEQUEL al bestond IBM startte vervolgens een research project ‘voor de ontwikkeling van een relationeel database systeem System/R’ en had in ‘77 een eerste prototype rdbms. 1979 : bouwde ‘relational Software Inc’ nu Oracle corporation een eerste commerciele rdbms : Oracle. 1983 : IBM gaf DB2 vrij voor MVS De standaard ANSI(American National Standard Institute)/ISO(International Standards Organization) : eerste standaard SQL1 (kende nog geen primaire sleutels en referentiele integriteit) : SQL2 - Vanaf 1995 werdSQL3 gefaseerd uitgegeven : bevat ook embedded SQL (Cobol, …) Dialecten Database servers bieden procedurele extensies en built in functies. - SQL server : transact-sql - Oracle : PL/SQL academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

11 SQL - Overzicht SQL bestaat uit 3 subtalen
Data Definition Language (DDL) : creatie van een database, en het definiëren van database objecten (tabellen, stored procedures, views,…) CREATE, ALTER, DROP Data Manipulation Language (DML) : opvragen en manipuleren van de gegevens in een database SELECT, INSERT, UPDATE, DELETE Data Control Language (DCL) : gegevensbeveiliging en authorisatie GRANT, REVOKE, DENY Bijkomende taal elementen : operatoren, functies , control of flow (dialect gebonden) SQL voorziet in een aantal taken opvragen van data Toevoegen, aanpassen, verwijderen van rijen in en tabel Creatie, wijzigen, verwijderen van database objecten Toegangscontrole tot database en database objecten Garanderen van database consistentie Eerdere database systemen hadden hier vaak verschillende talen voor. SQL verenigt al deze taken in 1 taal De SQL Command set bestaat uit Select Insert, update, delete Create, alter, drop Grant, revoke academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

12 SQL - DML Eén tabel raadplegen Meerdere tabellen raadplegen Basisvorm
SELECT clausule WHERE clausule Formatteren van rijen Statistische functies Groeperen Meerdere tabellen raadplegen academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

13 SQL - DML Eén tabel raadplegen Basisvorm Toont een lijst
SELECT clausule : specifieert de kolommen die je wenst te zien. DISTINCT zorgt ervoor dat de getoonde rijen alle uniek zijn FROM clausule : geeft aan uit welke tabel de gegevens afkomstig zijn WHERE clausule : opgave van de voorwaarden waaraan de getoonde rijen moeten voldoen ORDER BY clausule : bepaalt de volgorde waarin de rijen getoond moeten worden GROUP BY en HAVING clausule : groeperen van de gegevens SELECT [ALL | DISTINCT] {*|uitdrukking [,uitdrukking ...]} FROM tabelnaam [WHERE voorwaarde(n)] [GROUP BY kolomnaam [,kolomnaam ...] [HAVING voorwaarde(n)] [ORDER BY {kolomnaam|volgnr}{ASC|DESC}[,...] Adhv de select specifieer je welke kolommen en rijen je uit een tabel wenst te selecteren de select lijst de kolommen die je wenst te retourneren. * betekent alle kolommen. De uitdrukking kan in zijn eenvoudigste vorm een kolomnaam zijn (alfanumerisch of numerisch), maar je kan ook functies en operatoren gebruiken om complexe uitdrukkingen samen te stellen de Where clause specifieert welke rijen je wenst te retourneren. Als je voorwaarden gebruikt kan je het aantal rijen dat je wenst te retourneren beperken gebruik makend van vergelijkingsoperatoren, character strings, logische operatoren de FROM specifieert de tabel waaruit de rijen en kolommen geretourneerd worden SELECT statements zijn niet case sensitive Je mag een SQL statement op 1 lijn specifieren of op meerder lijnen. Meerdere lijnen zijn leesbaarder academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

14 SQL - DML 2. SELECT clausule : Specificatie van de kolommen
a) * : Ophalen van alle kolommen uit 1 tabel Voorbeeld : Toon alle gegevens van de producten SELECT * FROM products Adhv de select specifieer je welke kolommen en rijen je uit een tabel wenst te selecteren de select lijst de kolommen die je wenst te retourneren. * betekent alle kolommen Waarom nu niet alle kolommen uit een tabel ophalen 1. Hoe meer velden, hoe meer geheugen nodig is om de data op te slaan, hoe trager de applicatie 2. In client/server omgevingen kan het transfereren van recordset naar de applicatie tijdrovend zijn (netwerk traffic) academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

15 SQL - DML b) Ophalen van een aantal kolommen uit 1 tabel : door opgave van kolomnaam of uitdrukking Voorbeeld : Toon van alle producten het productID, de naam en eenheidsprijs SELECT productid, productname, unitprice FROM products De volgorde waarin de kolommen getoond worden is deze uit de query De kolomnamen worden gescheiden door een komma Gebruik zo weinig mogelijk de * operator!!!! Dit voorbeeld retourneert de productid, productname, unitprice kolommen van alle producten uit de tabel products. academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

16 SQL - DML 3. WHERE clausule : Specificatie van voorwaarden waaraan de getoonde rijen moeten voldoen Voorbeeld : Toon productID, naam en eenheidsprijs van de producten die behoren tot categorie 1 SELECT productid, productname, unitprice FROM products WHERE categoryid = 1 De where clause wordt gebruikt om records op te halen die aan een bepaalde voorwaarde voldoen. De data die geretourneerd wordt, wordt gefilterd Wanneer we de query beperken tot een bepaalde verzameling rijen spreekt men van een rijprojectie Bovenstaand voorbeeld haalt de productid, productname en unitprice kolommen op van de products tabel voor die producten die behoren tot category 1. (slechts 12 producten voldoen aan voorwaarde) In bovenstaand voorbeeld doorloopt de WHERE clause alle records in de tabel products en gaat na of voldaan is aan de voorwaarde categoryid=1’ Enkel de records waarvoor de test true oplevert worden in de recordset getoond. Als de zoek voorwaarde een FALSE of UNKNOWN waarde oplevert voor een record dan wordt dit record niet getoond. de rijselectie kan gecombineerd worden met kolom projecties Als je een WHERE clause opgeeft enkele quotjes rond alle charactervelden (char, nchar, varchar, nvarchar, text, datetime, smalldatetime data). Als we dit niet doen krijgen we een foutmelding. Vb voor het opvragen van products op basis van productname moet de query worden "SELECT * FROM products WHERE productname = ‘Chai’ gebruik positieve ipv negatieve zoek voorwaarden! Negatieve zoekvoorwaarden vertragen opvragen van data daar alle rijen in een tabel geevalueerd moeten worden Datetime : When you use datetime constants in queries that are executed by connections using different language settings, care must be taken to ensure the dates are acceptable for all the language settings. The same care must be taken with datetime constants in permanent objects in international databases, such as table constraints and view WHERE clauses. For more information on date formats that are interpreted the same by all language settings, see Writing International Transact-SQL Statements. academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

17 SQL - DML Gebruik van literals Voorwaarden aan rijen adhv
Numerische waarden : ... WHERE categoryID = 1 Alfanumerische waarden : ... WHERE productName = ‘Chai’ Datums : ... WHERE orderDate = ‘4/15/1998’ (15 april 1998) Voorwaarden aan rijen adhv Vergelijkingsoperatoren Wildcards Logische operatoren Een interval van specifieke waarden Een lijst van waarden Onbekende waarden Je kan haakjes gebruiken om de prioriteitsregels te doorbreken of het geheel leesbaarder te maken To search for an exact match on both date and time, use an equal sign (=). Microsoft SQL Server returns date and time values exactly matching the month, day, and year, and at the precise time of 12:00:00:000 A.M. (default). SQL Server recognizes date and time data enclosed in single quotation marks (') in these formats: Alphabetic date formats (for example, 'April 15, 1998') Numeric date formats (for example, '4/15/1998', 'April 15, 1998') Unseparated string formats (for example, ' ', 'December 12, 1998') To search for a partial date or time value, use the LIKE operator. SQL Server first converts the dates to datetime format and then to varchar. Because the standard display formats do not include seconds or milliseconds, you cannot search for them with LIKE and a matching pattern, unless you use the CONVERT function with the style parameter set to 9 or 109. For more information about searching for partial dates or times, see LIKE. When specifying dates in comparisons or for input to INSERT or UPDATE statements, use constants that are interpreted the same for all language settings: ADO, OLE DB, and ODBC applications should use the ODBC timestamp, date, and time escape clauses of: { ts 'yyyy-mm-dd hh:mm:ss[.fff] '} such as: { ts ' :02:20' } { d 'yyyy-mm-dd'} such as: { d ' ' } { t 'hh:mm:ss'} such as: { t '10:02:20'} Applications using other APIs, or Transact-SQL scripts, stored procedures, and triggers should use the unseparated numeric strings for example: yyyymmdd as Applications using other APIs, or Transact-SQL scripts stored procedures, and triggers can also use the CONVERT statement with an explicit style parameter for all conversions between the date and smalldate data types and character string data types. For example, this statement is interpreted the same for all language or date format connection settings: SELECT * FROM Northwind.dbo.Orders WHERE OrderDate = CONVERT(DATETIME, '7/19/1996', 101) academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

18 SQL - DML a) Vergelijkingsoperatoren
=, >, >=, <, <=, <> Voorbeelden Toon productID, naam, aantal in stock van de producten waarvan er minder dan 5 in stock Toon productID, naam, aantal in stock van de producten waarvan naam begint met een A select productid, productname, unitsinstock from products where unitsinstock < 5 Gebruik vergelijkingsoperatoren voor het vergelijken (ook wel relationele operatoren genoemd) van de waarden in een tabel met een bepaalde constante of uitdrukking. Je kan enkel kolommen en waarden vergelijken van een compatible data type Bij het vergelijken gelden de volgende ordeningsregels : numerieke waarden : ordening zoals in de rekenkunde strings wordt gebruik gemaakt van de ingestelde ordening van de tekenset ‘schip’ < ‘schipbreuk’ ‘Schip’ < ‘schip’ datums : vergelijking gebeurt op basis van vroeger of later Test op “where test<>’A’” zal enkel deze rijen teruggeven die in kolom test geen NULL waarde bevatten en <> A. Rijen met null waarden in kolom test worden ook niet geretourneerd. Datums in SQL Server worden opgeslaan in formaat MM/DD/YYYY. Dus testen op if date > ’01/12/2002’ betekent groter dan 12 januari 2002 select productid, productname from products where productname >= 'A' and productname < 'B' academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

19 SQL - DML b) Wildcards (zoeken naar patronen)
De operator LIKE, NOT LIKE In combinatie met wildcards: % : willekeurige tekenrij met 0 of meerdere tekens _ : 1 teken [ ] : 1 teken binnen de gespecifieerde range of verzameling [^] : elk teken niet binnen de gespecifieerde range of verzameling Voorbeeld Toon productID, naam van de producten waarbij de tekenreeks anton voorkomt in de naam SELECT productid, productname FROM products WHERE productname LIKE '%anton%' LIKE laat toe te zoeken naar een bepaald patroon. Je kan zoeken naar een stukje tekst in het begin, midden of einde van een veld. Bruikbaar als je bvb wel iets weet van een naam maar niet precies Enkele voorbeelden LIKE ‘BR%’ : elke naam die begint met BR LIKE ‘Br%’ : elke naam die begint met Br LIKE ‘%een’ : elke naam die eindigt met een LIKE ‘%en%’ : elke naam die ergens de letters en bevat LIKE ‘e%n’ : elke naam beginnend met een e en eindigend op n LIKE ‘_en’ : elke naam met 3 letters die eindigt op en LIKE ‘[CK]%’ elke naam beginnend met een C of K LIKE [S-V]ing : elk vier letter woord eindigend op in en beginnend met S, T, U of V LIKE ‘M[^c]%’ : elke naam beginnend met de letter M, die niet de letter c als tweede letter bevat OPgelet : = ‘BR%’ : elke naam BR% Verschil met Access : % wordt *, _ wordt een ? academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

20 SQL - DML c) Logische operatoren
OR, AND, NOT (volgens stijgende prioriteit) Voorbeelden SELECT productid, productname, supplierid, unitprice FROM products WHERE (productname LIKE ’T%’ OR productid = 46) AND unitprice > 16.00 SELECT productid, productname, unitprice FROM products WHERE (productname LIKE ’T%’) OR (productid = 46 AND unitprice > 16.00) AND : moet voldoen aan alle voorwaarden (Moet true opleveren, niet false of unknown) OR : moet voldoen aan 1 van de voorwaarden NOT : negatie van hetgeen volgt Je kan de verwerkingsvolgorde beinvloeden door haakjes SQL server evalueert eerst de NOT, dan de AND dan de OR Formuleer zelf de query. academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

21 SQL - DML d) Waarden in een interval BETWEEN, NOT BETWEEN Voorbeeld
Selecteer de producten (naam en eenheidsprijs) waarvan de eenheidsprijs tussen 10 en 15 euro (grenzen inbegrepen) SELECT productid, unitprice FROM products WHERE unitprice BETWEEN 10 AND 15 BETWEEN impliceert een gesloten interval. Het interval is inclusief de interval grenzen. Gebruik de BETWEEN operator ipv >= x AND <= y expressie. Als je echter op een exclusief interval wenst te zoeken moet je gebriuik maken van > x AND < y Gebruik NOT BETWEEN om te zoeken naar rijen die buiten het opgegeven interval vallen Vermijd het gebruik van BETWEEN bij date waarden want middernacht is het eindpunt voor de laatste datum waarde. Er wordt geen data voor die datum geretourneerd. Vb alle orders geplaatst tussen 1/1/00 en 2/1/00 zal enkel orders op 1/100 retourneren. Indien je ook orders wenst van 2/1/00 moet je opgeven BETWEEN ‘1/1/00’ AND ‘3/1/00’ Opmerking ivm datums : in SQL server moet je data tussen enkele quotjes (‘) zetten, in de jet database tussen #) academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

22 SQL - DML e) Lijst van waarden IN, NOT IN Voorbeeld
Geef productID, naam, supplierID van de producten die geleverd worden door de suppliers met ID 1, 3 of 5 SELECT productid, productname, supplierid FROM products WHERE supplierid in (1,3,5) de inhoud van een veld wordt vergeleken met een rij van waarden je kan de IN vergelijken met een serie van condities verbonden met een OR operator gebruik NOT IN om rijen te retourneren waarvan de waarde niet voorkomt in de lijst voorbeelden SELECT companyname, country FROM suppliers WHERE country IN (‘JAPAN’, ‘Italy’) Opgave: Geef nummer, naam en afdelingsnummer van alle werknemers, waarvan de familienaam start met een P en die in een afdeling werken beginnend met D en als 3° karakter een 1 hebben. Oplossing: SELECT NR, VNAAM, FNAAM, AFD FROM WERKNEMER WHERE FNAAM LIKE ‘P%’ AND AFD LIKE ‘D_1’ academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

23 SQL - DML f) Onbekende waarden (niet ingevulde waarden)
IS NULL, IS NOT NULL Komen voor wanneer er bij input in een bepaalde kolom geen waarde werd ingebracht en er geen defaultwaarde voor die kolom voorzien was. Een NULL waarde verschilt van 0 (numerische waarden) en blanco (character waarden) ! NULL velden worden onderling gelijk beschouwd (voor testen met DISTINCT) Als in een rekenkundige uitdrukking een NULL-veld wordt verwerkt is het resultaat ook NULL Voorbeeld Selecteer de klanten waarvan region onbekend null waarden komen voor wanneer er bij input in een bepaalde kolom geen waarde werd ingebracht en er geen defaultwaarden voor die kolom voorzien waren. Een NULL waarde verschilt van 0 (numersiche waarden) en blanco (character waarden) Je kan specifieren als een kolom null waarden mag bevatten adhv de create tabele statement IS NOT NULL : alle rijen met een waarde voor een specifieke kolom Opgave: Selecteer alle werknemers met als jobcode NULL Oplossing: SELECT NR, VNAAM, FNAAM FROM WERKNEMER WHERE CODE IS (*)NULL (*)Hier moet men schrijven IS, dus geen =, want met null is geen enkele vergelijking mogelijk. SELECT companyname, region FROM suppliers WHERE region IS NULL academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

24 SQL - DML Opmerking SELECT companyname, region FROM suppliers
WHERE region <> ‘OR’ SELECT companyname, region FROM suppliers WHERE region <> ‘OR’ OR region IS NULL Query 1 houdt geen rekening met NULL waarden.!!!!! academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

25 SQL - DML g) Oefeningen : tabel Afdeling tabel Werknemer
academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

26 SQL - DML Geef voornaam en achternaam van werknemers geboren voor 01/01/49 Geef voornaam en familienaam van werknemers met code 54, die in een willkeurige afdeling werken met uitsluiting van afdeling D11 Geef nummer, naam en afdelingsnummer van alle werknemers met salaris tussen en en niveau tussen 17 en 20 Geef nummer, naam en opleidingsniveau van alle werknemers met niveau 16, 18 of 20 Geef nummer, naam van vrouwelijke werknemers waarvan familienaam start met een ‘S’ of ‘T’ Geef nummer, naam van alle werknemers met onbekende jobcode Geef nummer, naam en afdelingsnummer van alle werknemers, waarvan de familienaam start met een P en die in een afdeling werken beginnend met D en als 3° karakter een 1 hebben. Select fnaam,vnaam from werknemer where gebdat < ’01/01/49’ Select fnaam, vnaam from werknemer where code=54 and afd <> ‘D11’ Select nr, fnaam,afd from werknemer where samaris between and and niv between 17 and 20 Select nr, fnaam,afd from werknemer where niv in (16,18,20) Select nr, fnaam from werknemer where gesl=‘V’ and fnaam like ‘[SV]%’ Select nr, fnaam from werknemer where code IS NULL Select nr, fnaam, afd from werknemer where fnaam like ‘P%’ and afd like ‘D_1’ academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

27 SQL - DML 4. Formatteren van de resultaten Sorteren data
Eliminatie van duplicaten Wijzigen van kolomnaam Berekende resultaatkolommen Commentaar /* commentaar */ -- commentaar (beperkt zich tot 1 lijn) Je kan het resultaat van een query verbeteren door te sorteren, … Deze opties wijzigen de data niet, maar verbeteren de presentatie ervan academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

28 SQL - DML a) Sorteren van de data ORDER BY clausule Voorbeeld :
Kan 1 of meerdere sorteervelden bevatten Een sorteerveld kan gespecifieerd worden via de kolomnaam, of door een volgnummer op te geven dat overeenkomt met de volgorde van het gegeven achter de SELECT clausule (startend vanaf 1) Indien meerdere sorteervelden voorkomen, gebeurt het sorteren eerst op basis van het eerste veld, bij gelijkheid op basis van het tweede,... Standaard gebeurt het sorteren in stijgende volgorde (volgens numerieke waarde, of volgens computercode bvb ASCII). Een dalende volgorde moet expliciet vermeld worden met DESC Voorbeeld : Toon een alfabetische lijst van de productnamen Het resultaat van een select statement wordt voorgesteld in een volgorde bepaald door het systeem, de records worden geretourneerd in volgorde van ingave in de database. Adhv de order by clause kan men zelf specifieren in hoe het resultaat geordend moet zijn sorteren van rijen kan in stijgende (ASC) (is de default optie) of dalende volgorde (DESC) Wanneer je ordent op 1 kenmerk komen rijen waarvoor dat kenmerk dezelfde waarde heeft, weliswaar opeenvolgend in het resultaat, maar onderling in willekeurige volgorde. Je kan zo’n groepje rijen terug ordenen adhv een extra kenmerk In het voorbeeld wordt het resultaat gesorteerd per category in stijgende volgorde en binnen een category per unit price in dalende volgorde kolommen die gebruikt worden in de ORDER BY clause moeten niet voorkomen in de select list De order by clause specifieer je als laatste in een SQL statement je kan sorteren op kolomnamen, berekende velden of uitdrukkingen. Je mag ook refereren via het volgnummer in de lijst bij een ORDER BY clause SELECT productid, productname, categoryid, unitprice FROM products ORDER BY 3, 4 DESC de rijen met NULL komen achteraan te staan (nog eens uittesten) SELECT productname FROM products ORDER BY productname (of ORDER BY 1) academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

29 SQL - DML Toon productid,naam, categoryid en eenheidsprijs van de producten gesorteerd op categoryid. Indien binnen 1 categorie producten dezelfde prijs hebben, dan dient het product met de hoogste prijs bovenaan te staan. SELECT productid, productname, categoryid, unitprice FROM products ORDER BY categoryid, unitprice DESC academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

30 SQL - DML b) Distinct/ALL
Distinct : produceert een lijst waar alle rijen uniek zijn, gelijke rijen worden uit resultaat verwijderd ALL(default) : toont alle rijen, ook duplicaten Voorbeeld Toon de leveranciers die producten leveren SELECT supplierid FROM products ORDER BY supplierid SELECT DISTINCT supplierid FROM products ORDER BY supplierid Door select kunnen gelijke rijen ontstaan. Deze zullen allemaal verschijnen, indien er zijn. Met dinstinct als positioneel sleutelwoord , onmiddellijk na de select, schakel je gelijke rijen uit. Met ALL niet (ALL is de default optie) academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

31 SQL - DML c) Gebruiken van leesbare namen voor de kolommen
Standaard : kolomtitel = naam van kolom in tabel; Berekende kolommen krijgen geen kolomnaam Via “AS” keyword kan je een kolom een andere titel geven, of door opgave van kolom, dan een spatie en vervolgens de uitdrukking Opm. Die nieuwe kolomnaam kan je enkel gebruiken in ORDER BY (niet in WHERE, HAVING, GROUP BY) Voorbeeld : Selecteer ProductID en ProductNaam van de producten en geef als kolomtitel ProductNummer en Naam Product. SELECT productid AS ProductNummer, productname AS ‘Naam Product’ FROM products Per default worden de kolomnamen zoals gedefinieerd bij creatie van een tabel gebruikt gebruik ‘ voor kolomnamen die een spatie bevatten Aliassen kan je gebruiken in de order by clause om bvb te sorteren op een berekende kolom. (kan je niet gebruiken in een where clause). Vb SELECT VNaam + " " + FNaam as 'Werknemer', Salaris*12 as 'JaarSalaris' FROM Werknemer where (salaris * 12) > 12000 order by jaarsalaris SELECT productid ProductNummer, productname ‘Naam Product’ FROM products academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

32 SQL - DML d) Berekende resultaatkolommen
Wiskundige operatoren : +,-,/,* Voorbeeld : Geef naam en inventariswaarde van de producten SELECT ProductName, Unitprice * UnitsInStock AS InventoryValue FROM Products Er bestaan een hele boel functies Convert Rtrim,… Zie help Explicitly converts an expression of one data type to another. CAST and CONVERT provide similar functionality. Syntax Using CAST: CAST(expression AS data_type) Using CONVERT: CONVERT (data_type[(length)], expression [, style]) Arguments expression ; Is any valid Microsoft® SQL Server™ expression. For more information, see Expressions. data_type : Is the target system-supplied data type. User-defined data types cannot be used. For more information about available data types, see Data Types. length : Is an optional parameter of nchar, nvarchar, char, varchar, binary, or varbinary data types. style : Is the style of date format you want when converting datetime or smalldatetime data to character data (nchar, nvarchar, char, varchar, nchar, or nvarchar data types), or the string format when converting float, real, money, or smallmoney data to character data (nchar, nvarchar, char, varchar, nchar, or nvarchar data types). In the table, the two columns on the left represent the style values for datetime or smalldatetime conversion to character data. Add 100 to a style value to get a four-place year that includes the century (yyyy). Smalldatetime slaat datum altijd op onder formaat yyyy-mm-dd uu:mm:ss. Dit is niet mooi als resultaat van een query academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

33 SQL - DML Functies String functies : left, right, len, ltrim, rtrim, substring, replace,... DateTime functies : DateAdd, DateDiff, DatePart, Day, Month, Year, ... GETDATE() : functie die huidige datum en tijd retourneert in DATETIME format van MS-SQL Server. Rekenkundige functies : round, floor, ceiling, cos, sin,... Aggregate functies : AVG, SUM,... System functies CONVERT (<data type> [(<length>)], <data to convert> [, <style>]) Voorbeeld : CONVERT(VARCHAR,getdate(),6) -> 20 jan 2004 CAST : conversie van 1 data type naar een ander CAST (<value expression> AS <data type>) Voorbeeld : PRINT CAST( AS INTEGER) -> -25 ISNULL : vervangt NULL waarde met opgegeven waarde Voorbeeld :SELECT ISNULL(unitprice, 10.00) FROM products MS-SQL Server supports a single data type, DATETIME, for use in defining columns and variables to hold composite date and time values. In fact, MS-SQL Server does not even support separate functions for retrieving the current system time or the current system date. Instead, the Transact-SQL GETDATE() function always returns both the system date and time as a DATETIME data type value. You can, however, use the CONVERT function to change the current system date-time value into a character string that contains only the current date or only the current time. As such, the CONVERT function used in conjunction with GETDATE() can be used to produce the same results as both the CURRENT_TIME and CURRENT_DATE functions. Keep in mind, however, that when used to extract a date or time from a date-time value, the CONVERT function must return a value of data type CHARACTER, not DATE or TIME (since the DATE and TIME data types are not defined on MS-SQL Server). The syntax of the CONVERT function call is CONVERT (<data type> [(<length>)], <data to convert> [, <style>]) where: <data type> is the data type you want the CONVERT function to return. <length> is the maximum number of characters (letters, symbols, numbers) in the returned value. If you omitted, the system defaults the length to 30. <data to convert> can be a literal value, expression, function call, or database object such as a column name or variable. <style> specifies scientific notation when converting FLOAT and REAL values; comma placement and decimal precision when converting MONEY and SMALLMONEY values; or the date and time format when converting DATETIME values. Style 6 betekent bvb dd mmm yy academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

34 SQL - DML CASE SELECT WHEN price IS NULL THEN 'Not yet priced'
WHEN price < 10 THEN 'Very Reasonable Title' WHEN price >= 10 and price < 20 THEN 'Coffee Table Title' ELSE 'Expensive book!' END AS "Price Category", CONVERT(varchar(20), title) AS "Shortened Title" FROM pubs.dbo.titles ORDER BY price MS-SQL Server supports a single data type, DATETIME, for use in defining columns and variables to hold composite date and time values. In fact, MS-SQL Server does not even support separate functions for retrieving the current system time or the current system date. Instead, the Transact-SQL GETDATE() function always returns both the system date and time as a DATETIME data type value. You can, however, use the CONVERT function to change the current system date-time value into a character string that contains only the current date or only the current time. As such, the CONVERT function used in conjunction with GETDATE() can be used to produce the same results as both the CURRENT_TIME and CURRENT_DATE functions. Keep in mind, however, that when used to extract a date or time from a date-time value, the CONVERT function must return a value of data type CHARACTER, not DATE or TIME (since the DATE and TIME data types are not defined on MS-SQL Server). The syntax of the CONVERT function call is CONVERT (<data type> [(<length>)], <data to convert> [, <style>]) where: <data type> is the data type you want the CONVERT function to return. <length> is the maximum number of characters (letters, symbols, numbers) in the returned value. If you omitted, the system defaults the length to 30. <data to convert> can be a literal value, expression, function call, or database object such as a column name or variable. <style> specifies scientific notation when converting FLOAT and REAL values; comma placement and decimal precision when converting MONEY and SMALLMONEY values; or the date and time format when converting DATETIME values. Style 6 betekent bvb dd mmm yy academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

35 SQL - DML Stringoperator : concatenatie
Gebruik maken van tekst (literals) SELECT STR(productid) + ‘,’ + productname AS Product FROM Products SELECT ProductName, ‘$’,Unitprice FROM Products Boven ‘$’ kolom staat geen kolomhoofding. Anders AS gebruiken academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

36 SQL - DML 5. Statistische functies (Aggregate functies)
SQL voorziet 5 standaardfuncties SUM (uitdrukking) : som AVG (uitdrukking) : gemiddelde MIN (uitdrukking) : minimum MAX (uitdrukking) : maximum COUNT (*|[DISTINCT] kolomnaam) : aantal Deze functies geven 1 antwoord per kolom (en mogen dus niet in een WHERE clause gebruikt worden) De reden voor het niet gebruik in een where clause is dat deze statisctische functies inwerken op kolomniveau en niet op rij niveau ___________________________________ Zet volgend voorbeeld op bord. Tabel ‘products’ met productID unitprice unitsInStock categoryID 3 NULL NULL NULL Wat levert dan Sum(unitprice * unitsinstock) => 10 * 1 + 5*2 + 10*1 = 30 Avg(unitsInStock) => (1+2+1)/3 Count(*) = 4 Count(catgeoryiD) = 3 Count(distinct categoryID) = 2 Min(unitprice)=5 Max(unitprice)=10 Sum(unitprice)/count(*) = avg(unitprice)? Nee ( )/4=6 <> (( )/3=8) Selecteer duurste product : SELECT TOP 1 productID from products ORDER BY unitprice DESC. Dit levert productID 1 op, maar had evengoed productID 4 kunnen opleveren. Zou 4 opleveren moest je in order by zetten ORDER BY unitprice DESC, productID desc academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

37 SQL - DML a) SUM Retourneert het totaal van NIET NULL numerieke waarden in één kolom Enkel te gebruiken met numerieke argumenten Voorbeeld : Geef de totale stock waarde SELECT SUM(UnitsInStock * UnitPrice) as inventoryvalue FROM products b) AVG Retourneert het gemiddelde van NIET NULL numerieke waarden in een kolom Enkel te gebruiken met numerieke argumenten Voorbeeld : Hoeveel producten zijn er gemiddeld in stock? Tot nu toe resulteerde elke rij van de resultaattabel met precies 1 rij uit de brontabel Soms is de gebruiker geinteresseerd in tellingen, gemiddelden, maxima, … van rijen of groepen van rijen.Vb. een manager wenst de resultaten per kwartaal te weten, uitgesplitst naar artikelsoort. Bij dit soort statische opvragingen correspondeert 1 rij van de resultaattabel meestal met meerdere rijen uit de brontabel, of soms wel met de hele brontabel De eenvoudigste statistische queries zijn deze waarbij de brontabel als 1 groep van rijen wordt beschouwd en hierover bepaalde statistische gegevens worden opgevraagd. Het resultaat is dus 1 waarde of rij van waarden. De meeste aggregate functies houden geen rekening met NULL waarden, met uitzondering van de COUNT(*). SUM : numerieke waarden kunnen opgeteld worden De verwerkingsvolgorde in bovenstaand voorbeeld :eerst wordt voor elk record de waarden unitsinstock en unitprice met mekaar vermenigvuldigd; dan wordt de som genomen van al deze resultaten om 1 waarde te produceren Je kan ook een WHERE clause toevoegen aan een statistische query Vb SELECT COUNT(*) FROM products WHERE categoryid=1 => telt aantal rijen waarvoor categoryid = 1 SELECT AVG(unitsinstock) AS AverageStock FROM products academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

38 SQL - DML c) COUNT Retourneert het aantal rijen, of een aantal waarden in een kolom COUNT(*) : telt het aantal rijen van de selectie Tel het aantal producten (= het aantal rijen) SELECT COUNT(*) AS Aantal FROM products COUNT(kolomnaam) : telt het aantal niet-lege velden in een kolom Tel het aantal NIET NULL waarden in de kolom categoryid SELECT COUNT(categoryid) AS cat_count COUNT(DISTINCT kolomnaam) : telt het aantal verschillende niet- lege velden in een kolom Tel het aantal verschillende NIET NULL categoriën in products SELECT COUNT(DISTINCT categoryid) AS cat_count academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

39 SQL - DML d) MIN en MAX retourneert de kleinste en de grootste waarde in een kolom Gelden zowel op numerieke als alfanumerieke argumenten Voorbeeld : Wat is de goedkoopste en duurste eenheidsprijs? SELECT MIN(unitprice) AS Minimum, MAX(unitprice) AS Maximum FROM products Opmerkingen : Omdat een statistische functies maar 1 antwoord oplevert, moeten ofwel alle uitdrukkingen in de SELECT clausule een statische functie bevatten, ofwel geen enkele! Statistische functies en NULL waarden : Houden geen rekening met NULL waarden. Uitzondering : COUNT(*) (telt ook rijen die null waarden bevatten) Min en Max hoeven niet alleen op numerieke kolommen. Je kan ook op tekst velden werken. String waarden hebben een volgorde volgens het ASCII woordenboek SELECT MIN(productname) from products => resultaat : Allice Mutton Datumwaarden zijn eveneens geordend academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

40 SQL - DML e) Een aantal dialecten in SQL Server
STDEV : spreiding van kolomwaarden uitgedrukt in de standaardafwijking VAR : Spreiding van kolomwaarden uitgedrukt in de variantie TOP : Selecteer de 5 goedkoopste producten Igv de 5 duurste producten sorteren op unitprice DESC SELECT TOP 5 productid, unitprice FROM products ORDER BY unitprice TOP geeft de 5 producten met de hoogste eenheidsprijs. Vraag : hoe selecteer je de 5 duurste producten? Je kan bvb ook de 30% hoogst geprijsde producten opvragen Select top 30 percent productid, … Opmerking :Het is het één of het ander. : of je benadert een tabel rij per rij, of je benadert een tabel in zijn geheel als groep. SELECT productid, COUNT(*) FROM products => je krijgt een foutmelding Opmerkingen: 1)     Indien er functies voorkomen in de select-clausule, dan moeten alle items van de SELECT-lijst, als argument van één of andere functie optreden. Deze bemerking geldt niet voor een item, dat ook in een GROUP BY voorkomt (zie verder).  Voorbeeld: Willen we in voorgaande vraag ook het afdelingsnummer afgedrukt zien, dan is volgend antwoord fout. SELECT Afd,COUNT(*),AVG(Salaris),MIN(Salaris),MAX(Salaris), COUNT(DISTINCT Code),SUM(Salaris)FROM Werknemer WHERE Afd = ‘D11’  Correctie: vermits er built-in functies in de SELECT-clausule voorkomen, moeten alle kolommen nu argument zijn van een functie. Schrijf daarom in de oplossing: MIN(Afd) of MAX(Afd)  2)     Built-in functies mogen niet voorkomen in de WHERE-clausule ook niet in de GROUP BY- clausule.  3)     Built-in functies kunnen enkel nog voorkomen in de HAVING-clausule (zie verder). ________________________________ In Vorrbeeld op bord : duurste product : select top 1 productid, unitprice from products order by unitprice desc => Levert product 1 op (had ook 4 kunnen teruggeven, bvb door in order by te zetten order by unitprice desc, productid desc) academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

41 SQL - DML 6. Groeperen : Statistische functies over meerdere groepen.
GROUP BY clausule : Indeling van tabel in groepen van rijen met gemeenschappelijke kenmerken. Per groep onstaat 1 unieke rij! Voorbeeld : Tot welke categoriën behoren de producten? Elke groep is een afzonderlijke verzameling waarop eventueel statistische functies gebruikt kunnen worden. De kolomnamen vermeld in de GROUP BY mogen nu ook samen met de statistische functies in de SELECT voorkomen. SELECT CategoryID FROM Products GROUP BY CategoryID Alternatief SELECT DISTINCT categoryID from products _____________________________________________ In voorbeeld op bord select categoryid, count(*) aantal from products group by categoryid Levert categoryID aantal NULL 1 1 2 2 1 Als we nu enkel geinteresseerd in producten waarvan meer dan 1 in stock where unitsinstock > 1 Levert : 1 1 having count(*) > 1 Levert lege verzameling academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

42 SQL - DML Voorbeelden Toon per category het aantal producten
SELECT CategoryID, COUNT(productID) AS number FROM Products GROUP BY CategoryID Toon per categorie het aantal producten, waarvan er meer dan 10 in stock SELECT CategoryID, COUNT(productID) AS number FROM Products GROUP BY CategoryID De group by zorgt voor een indeling van de tabel in groepen van rijen met gemeenschappelijke kenmerken. De group by groepeert de rijen van een tussenresultaat. Rijen worden gegroepeerd indien ze in de toepasselijke kolom (men) dezelfde waarde hebben. Er wordt 1 rij geretourneerd voor elke groep Als je de WHERE clause gebruikt worden enkel de rijen gegroepeerd die voldoen aan de voorwaarde Indien gegroepeerd wordt op een kolom met NULL waarden vormen alle NULL waarden 1 afz. groep Vb SELECT reportsto, count(country) FROM employees GROUP BY reportsto levert NULL 1;2 5;5 3 Je kan dit vermijden door de WHERE clause toe te voegen , WHERE reportsto IS NOT NULL Je kan de groepindeling nog verder verfijnen door meerdere kolommen op te nemen in group by clausule WHERE UnitsInStock > 10 academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

43 SQL - DML HAVING clausule
Selecteren of verwerpen van groepen op basis van bepaalde groepseigenschappen Voorbeelden Toon per category die meer dan 10 producten bevat, het aantal producten SELECT CategoryID, COUNT(productID) AS number FROM Products GROUP BY CategoryID HAVING COUNT(productID) > 10 Toon per category die meer dan 10 producten bevat, waarvan er meer dan 10 in stock, het aantal producten SELECT CategoryID, COUNT(productID) as number FROM Products WHERE UnitsInStock >10 GROUP BY CategoryID HAVING COUNT(productID) > 10 Met de HAVING kan je het aantal rijen van een GROUP BY inperken door het opleggen van een voorwaarde (vergelijkbaar met de WHERE op de brontabel (filtert op rijen in de basistabel), werkt de having in op de gegroepeerde tabel) Met having : selecteert of verwerpt men groepen Met where : selecteert of verwerpt rijen De eerste query geeft per category het aantal producten weer voor zover het aantal > 10 De tweede query is een Mengeling van WHERE en group by en geeft per category de gemiddelde eenheidsprijs weer voor zover het aantal rijen (of producten want uniek) in die category > 10 en de vooraad van dat product > 5, gesorteerd op avg(unitprice) SQL server biedt nog een aantal extra mogelijkheden adhv ROLLUP, CUBE operators en grouping function Opgave: 1. Geef een overzicht van de afdelingen die tenminste 2 werknemers hebben die meer dan 1000 verdienen. 2. Geef een overzicht van de afdelingen die minstens 2 werknemers hebben die pas vanaf 80 in dienst zijn. 3. Geef een overzicht van de afdelingen die meer dan 1 werknemer hebben met opleidingsniveau 20. 4. Bedenk zelf een analoge vraag voor de leeftijd. academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

44 SQL - DML Opmerkingen Verschil tussen WHERE en HAVING
WHERE : heeft betrekking op rijen HAVING : heeft betrekking op groepen Statistische functies enkel gebruiken in SELECT, HAVING, ORDER BY niet in WHERE, GROUP BY Indien er functies voorkomen in de select-clausule, dan moeten alle items van de SELECT-lijst, als argument van één of andere functie optreden met uitzondering van de items van SELECT die voorkomen in de GROUP BY!!! SELECT categoryID, MIN(unitprice) AS Minimum FROM products academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

45 SQL - DML Oefeningen Tel het aantal werknemers uit de afdeling D11 en geef het maximum, minimum en gemiddeld salaris voor deze afdeling, alsook het aantal verschillende jobcodes uit deze afdeling. Geef ook de som van alle lonen betaald in D11. Geef per afd, het afdnr en het aantal werknemers, gesorteerd volgens afdelingsnummer. Idem, maar nu gesorteerd volgens aantal werknemers. Idem maar nu wens je het aantal werknemers te kennen per afdeling en per jobcode Tel per afd het aantal mannen en vrouwen en sorteer volgens opklimmende afdeling en afdalend geslacht. Geef een overzicht van de afdelingen die tenminste 2 werknemers hebben die meer dan 1000 verdienen. Select count(*), max(salaris), min(salaris), avg(salaris),sum(salaris), count(disticnt code) From werknemer Where afd = ‘D11’ Select afd, count(*) From werknemer Group by afd Order by afd Order by count(*) desc Select afd, code, count(*) from werknemer group by afd, code (je moet hier ook groeperen op code anders krijg je een fout!) Select afd, gesl, count(*) from werknemer group by afd, gesl order by afd, gesl desc Select afd from werknemer where salaris > 1000 group by afd having count(*) >= 2 academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

46 SQL - DML Eén tabel raadplegen Meerdere tabellen raadplegen JOIN UNION
Inner join Outer join Cross join UNION Subqueries Geneste subqueries Gecorreleerde subqueries Operator EXISTS academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

47 SQL - DML Meerdere tabellen raadplegen 1) JOIN
Selecteren van kolommen uit meerdere tabellen JOIN keyword : specifieert de tabellen die samengevoegd moeten worden, en hoe ze moeten worden samengevoegd Inner join Outer join Cross join ON keyword : specifieert de JOIN voorwaarde Produceert 1 resultaatset, waarin de rijen uit die tabellen gekoppeld worden Basisvorm (ANSI JOIN (SQL-92) <-> Old style join) Voor het oplossen van bepaalde vragen moeten soms verbanden tussen tabellen gelegd worden. Een manier waarop dit kan is het maken van een join tussen tabellen. Een andere manier is het gebruik van subqueries (zie verder) Richtlijnen voor join Gebruik primaire en vreemde sleutels als join voorwaarde Als de tabel een samengestelde sleutel bevat, moet je de volledige sleutel vermelden in de ON clause Gebruik gemeenschappelijke kolommen in beide tabellen voor de join. De kolommen moeten hetzelfde datatype hebben Als de kolomnaam in beide tabellen dezelfde is moet je de kolomnaam laten voorafgaan door de tabelnaam tabel.kolom Beperk het aantal tabellen in een join. Hoe meer tabellen hoe trager SELECT uitdrukking FROM tabel JOIN tabel ON voorwaarde [JOIN tabel ON voorwaarde...] SELECT uitdrukking FROM tabel, tabel [, tabel...] WHERE voorwaarde academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

48 SQL - DML De voorbeelden maken gebruik van de Pubs database
academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

49 SQL - DML a) Inner Join Koppelen van rijen uit 1 tabel met rijen uit een andere tabel op basis van gemeenschappelijke waarden in de overeenkomstige kolommen. De relatie tussen de velden in de verschillende tabellen kan je uitdrukken a.d.h.v. = (equi-join), <,>,<>,>=,<= Samenvoegen van tabellen . Verschil tussen de ANSI JOIN (SQL-92) standard en de “old style join” (de term old style join wordt gebruikt in de SQL –92 standard) : De ansi join gebruikt join keyword om tabellen samen te voegen Scheidt de join condities (on clause) van de zoekcriteria (where clause) De ANSI SQL 92 standard werd voor het eerst geimplementeerd in SQL Server 6.5. De “old style join” (is ook de naam die in SQL-92 gebruikt wordt om naar deze syntax te verwijzen) wordt nog steeds gesupporteerd. Beide syntaxen produceren dezelfde output, hetzelfde executionplan en er is geen performantieverschil tussen beide syntaxen Een aantal DBMS zoals Oracle kennen enkel de Old style JOIN. Ook een groot aantal applicaties en voorbeelden gebruiken de old style join In de les gebruiken we de ANSI SQL standard. academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

50 SQL - DML Voorbeeld van equi-join
Geef een overzicht van de auteurs (naam, voornaam) die niet in California wonen en de boeken (titelID) die ze geschreven hebben. ANSI JOIN (SQL-92) SELECT au_lname, au_fname, title_id WHERE state <> 'CA' FROM authors JOIN titleauthor ON authors.au_id = titleauthor.au_id OF “old style join” SELECT au_lname, au_fname, title_id FROM authors, titleauthor WHERE authors.au_id = titleauthor.au_id AND state <> 'CA' De meest voorkomende vorm van een inner join is de equi join. Je mag ipv van FROM authord JOIN titleauthors ook authors INNER JOIN titleauthors gebruiken (meestal laat men het INNER keyword weg) Dit voorbeeld toont de titles die elke auteur geschreven heeft. We zijn enkel geintereseerd in de auterurs die buiten California wonen. Noch de auteurs tabel, nog de titles tabel bevatten deze informatie daar het een veel op veel relatie is. Dus er bestaat een intersectietabel titleauthor die de auteur met de titles associeert. Een boek wordt geschreven door een bepaalde auteur(titleauthor). Via de au_id kunnen we ‘oversteken’ naar de tabel authors, waar we de naam van de auteur vinden. We verbreden de tabel titleauthors door de vreemde sleutel au_id en de primaire sleutel au_id in de tabel authors. De where clause dient voor het filteren op de rijen Equijoins geven enkel die rijen terug die voldoen aan de ON conditie. Dit betekent dat als een rij in de eerste tabel niet matcht met een rij uit de tweede tabel (een auteur die niet in California woont, en die nog geen titles geschreven heeft) de rij niet zal geretourneerd worden en omgekeerd. In het voorbeeld gaan we dus voor elke auteur op zoek naar de rijen in titelathor waarvoor au_id = au_id van de betreffende rij in author. Als er een auteur is die nog geen boek geschreven heeft, komt hij niet voor in resultaat. Opgave: De tabel WERKNEMER bevat geen afdelingsnamen. Als we een lijst willen maken die alle namen, afdelingsnummers en afdelingsnamen bevat, zullen we de 2 tabellen WERKNEMER en AFDELING moeten samenvoegen, mits de afdelingsnummers overeenstemmen.  Oplossing: SELECT VNAAM, FNAAM, AFD, AFDNAAM FROM WERKNEMER INNER JOIN AFDELING ON AFD = AFDNR academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

51 SQL - DML Gebruiken van tabel aliassen (via ‘AS’ of spatie) SQL-92
“old style join” SELECT au_lname, au_fname, title_id FROM authors AS A JOIN titleauthor AS TA ON A.au_id = TA.au_id WHERE state <> 'CA' SELECT au_lname, au_fname, title_id FROM authors A, titleauthor TA WHERE A.au_id = TA.au_id AND state <> 'CA' Opmerkingen : als een kolomnaam in meerdere tabellen (gebruikt in de query) voorkomt, dan dient die steeds te worden voorafgegaan door de tabelnaam (of alias) Inner joins geven enkel die rijen terug die voldoen aan de ON conditie. Dit betekent dat als een rij in de eerste tabel niet matcht met een rij uit de tweede tabel (vb. een auteur die niet in California woont, en die nog geen boeken geschreven heeft) de rij niet zal geretourneerd worden en omgekeerd. Als je in de old style join de where clause vergeet, dan krijg je de cross join (zie verder). Verkorte notaties voor tabellen In SQL Server kan eigenlijk beide door mekaar gebruiken, het is een kwestie van eigen preferenties. Stel dat je ook au_id wenst te vermelden in de resultaatset, dan moet je bovenaan in select TA.au_id toevoegen of A.au_id. Enkel au_id geeft ene fout academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

52 SQL - DML JOIN van meer dan 2 tabellen
Voorbeeld : Geef een overzicht van de auteurs (naam, voornaam) die niet in California wonen en de boeken (titel) die ze geschreven hebben. SQL-92 : Opm : Gegevens kunnen over meer dan 2 tabellen verspreid zitten. Soms worden enkel gegevens uit 2 tabellen getoond, maar zijn toch extra tabellen nodig zijn daar geen directe koppeling tussen de 2 tabellen waaruit de informatie moet komen. SELECT au_lname, au_fname, title FROM authors A JOIN titleauthor TA ON A.au_id = TA.au_id WHERE state <> ‘CA’ JOIN titles T ON TA.title_id = T.title_id - OF “old style join” SELECT au_lname, au_fname, title FROM authors A, titleauthor TA, titles T WHERE A.au_id = TA.au_id AND TA.title_id = T.title_id AND state <> ‘CA’ Om 3 tabellen te joinen heb je 2 join condities nodig, voor 4 tabellen 3 join condities Richtlijnen bij meervoudige joins : Je moet 1 of meerdere tabellen hebben met een vreemde sleutel relatie naar elk van de tabellen die je wenst samen te voegen Je moet een JOIN clause hebben voor elke kolom die deel uitmaakt van de samengestelde sleutel Voeg een WHERE clause toe om het aantal rijen te beperken academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

53 SQL - DML Joining van een tabel met zichzelf
Toon van alle werknemers naam en voornaam, en naam en voornaam van hun manager SELECT X.Lastname, X.FirstName,Y.Lastname, Y.FirstName FROM Employees AS X JOIN Employees AS Y ON X.Reportsto = Y.EmployeeID Wordt gebruikt igv recursieve verwijzingen in een tabel.bvb tabel employee bevat employeeid + veld reportsto die eigenlijk ook weer een employeeid is. We hebben eigenlijk 2 exemplaren nodig van de tabel Employees. Een exemplaar met de employees en 1 exemplaar om de bijhorende reportsto in op te zoeken. Fysiek is er maar 1 tabel, maar op logisch niveau wordt het idee van verschillende exemplaren ondersteund. Door het geven van een alias tabelnaam aan ten minste 1 exemplaar, kun je de exemplaren van mekaar onderscheiden Voorbeeld geef voor elke bediende die rapporteert, de eigen naam en voornaam en de naam en voornaam van de bediende waaraan hij rapporteert Opgave: Selecteer de werknemers paarsgewijze als volgt: ze werken in dezelfde afdeling, maar hun jobcode verschilt minstens 5. Oplossing: SELECT X.FNAAM, X.CODE, Y.FNAAM, Y.CODE FROM WERKNEMER X, WERKNEMER Y WHERE X.AFD = Y.AFD AND X.CODE >= Y.CODE + 5 academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

54 SQL - DML b) Outer join Retourneert alle records van 1 tabel, zelfs als er geen gerelateerd record bestaat in de andere tabel. Er zijn 3 types van outer join LEFT OUTER JOIN : retourneert alle rijen van de eerst genoemde tabel in de FROM clause (SQL-92) RIGHT OUTER JOIN : retourneert alle rijen van de tweede tabel in de FROM clause (SQL-92) FULL OUTER JOIN : retourneert ook rijen uit de eerste en tweede tabel die geen corresponderende entry hebben in andere tabel (SQL-92) Equijoins geven enkel die rijen terug die voldoen aan de ON conditie. Dit betekent dat als een rij in de eerste tabel niet matcht met een rij uit de tweede tabel (een auteur die niet in California woont, en die nog geen titles geschreven hebben) de rij niet zal geretourneerd worden.Als we nu eigenlijk geinteresseerd zijn in de titles geschreven door de auteurs die niet in California leven. In het resultaat ontbraken eigenlijk 2 auteurs die inderdaad buiten California leven maar waarvan nog geen titles in de databank zijn opgenomen. De databank bevat ook 1 title waarvoor nog geen auteur bestaat in de databank. SQL server retourneert enkel unieke rijen als je de outer join gebruikt Gebruik left outer join als je alle rijen uit de eerst genoemde tabel wenst te tonen. Als je de volgorde waarin je de tabellen opgeeft in de from clause zou omdraaien dan krijg je hetzelfde resultaat als in een right outer join Gebruik right outer join als je alle rijen uit de tweede genoemde tabel wenst te tonen. Als je de volgorde waarin je de tabellen opgeeft in de from clause zou omdraaien dan krijg je hetzelfde resultaat als in een left outer join Gebruik geen null value als join conditie. 2 NULL values evalueren niet als zijnde gelijk Je kan LEFT outer join afkorten door : LEFT JOIN, right outer join door RIGHT JOIN, FULL JOIN Outer JOINS kan je tussen meerdere tabellen gebruiken, maar dan doe je er goed aan van haakjes te gebruikern In de old style join gaat met *= gebruiken voor outer join. In Oracle gaat men dit schrijven als SELECT … FROM tabel1, tabel2 WHERE tabel1.naam (+)= tabel2.naam academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

55 SQL - DML Voorbeeld left outer join
Geef een overzicht van de auteurs (naam, voornaam), die niet wonen in California, en de boeken (titel) die ze geschreven hebben. Ook de auteurs die GEEN boeken geschreven hebben dienen op de lijst voor te komen SELECT au_lname, au_fname, title FROM authors A LEFT JOIN titleauthor TA ON A.au_id = TA.au_id LEFT JOIN titles T ON TA.title_id = T.title_id WHERE state <> 'CA' Voorbeeld : retourneert alle auteurs die niet in Californie wonen en de bijhorende titles. Ook de auteurs die geen titles geschreven hebben worden vermeld (Smith en Greene) De volgorde in outer joins is belangrijk. In een equijoin geldt als A = B dan is B=A, wat niet leidt tot verschillende resultaten als je een tabel aan de linkerkant of de rechterkant opneemt. academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

56 SQL - DML Voorbeeld right outer join
Toon een lijst van de boeken, met naam en voornaam van de auteurs. Enkel de boeken geschreven door auteurs die niet in CA wonen of de boeken waarvoor de auteur niet bekend is mogen op het overzicht voorkomen. SELECT au_lname, au_fname, title FROM authors AS A JOIN titleauthor AS TA ON A.au_id = TA.au_id RIGHT JOIN titles AS T ON TA.title_id = T.title_id WHERE state <> 'CA' OR A.state IS NULL Voorbeeld : alle auteurs niet in CA die een boek geschreven hebben of boeken waarvoor geen auteur bestaan. academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

57 SQL - DML c) Cross join Het aantal rijen in de resultaattabel is gelijk aan het aantal rijen in de eerste tabel maal het aantal rijen in de tweede tabel. SQL-92 SELECT au_lname, au_fname, title_id FROM authors CROSS JOIN titleauthor “old style join” FROM authors, titleauthor Worden zelden gebruikt. Je zou het bvb kunnen gebruiken om testdata te genereren Het aantal rijen in de resultaattabel is gelijk aan het aantal rijen in de eerste tabel maal het aantal rijen in de tweede tabel. is infeite een soort join maar zonder conditie Nog een reden waarom je beter de SQL 92 standard gebruikt : Als je in de old style join de where clause vergat (wat veel beginnende programmeurs doen) krijg je het cartesisch product (een join van 23 rijen uit 3 tabellen, levert een resultaattabel van meer dan rijen). Bij de SQL 92 moet je de CROSS JOIN gebruiken) academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

58 SQL - DML 2) UNION Combineert het resultaat van 2 of meerdere queries in 1 resultaattabel Basisvorm De regels die bij een UNION gelden De resultaten van de 2 SELECT opdrachten moeten evenveel kolommen bevatten. Overeenkomstige kolommen uit beide SELECT’s moeten van hetzelfde data type zijn en beide NOT NULL toelaten of niet. Kolommen komen voor in dezelfde volgorde De kolomnamen/titels van de UNION zijn deze van de eerste SELECT Het resultaat bevat echter steeds alleen unieke rijen Aan het einde van de UNION kan je een ORDER BY toevoegen. In deze clausule mag geen kolomnaam of uitdrukking voorkomen indien kolomnamen van beide select’s verschillend. Gebruik in dat geval kolomnummers. SELECT ... FROM ... WHERE ... UNION ORDER BY ... Opmerking intersect(waar rijen in beide selects voorkomen) en except (enekel in eerste select en niet in 2de select) lijken niet te bestaan in SQL Server. Alternatief exists en not exists. Gebruik de union als de data die je wenst te retourneren op verschillende plaatsen staat en je de data niet in 1 query kan accessen. SQL Server verwijdert duplicate rijen in de resultaattabel. Als je de ALL optie gebruikt (UNION ALL) gebeurt dit niet De resulttaattabel neemt de benamingen van de kolommen over van het eerste SELECT statement, als je aliassen wenst te gebruiken dien je ze daar te definiëren Het kan zijn dat je performantieverbetering hebt als je complexe queries opbreekt in meerdere select queries en dan daarop de union query gebruikt. Opmerking MS-SQL Server supports only the UNION operator. If your DBMS does not support the INTERSECT/EXCEPT operator, you can generate the INTERSECT results table using a SELECT statement with a WHERE clause that tests for the equality of each of the corresponding columns in the two tables. For example, given tables A and B from the current example, the SELECT statement SELECT DISTINCT a.make, a.model FROM a, b WHERE a.make = b.make AND a.model = b.model will produce the same results table as (SELECT * FROM a) INTERSECT (SELECT * FROM b) Similarly, you can generate the EXCEPT results table by using a SELECT statement with a WHERE clause that excludes rows in which the composite value of the columns in the first table are the same as the composite value of the columns in a second table. For example, given tables A and B from the current example, the SELECT statement SELECT DISTINCT a.make, a.model FROM a WHERE (a.make + a.model) NOT IN (SELECT b.make + b.model FROM b) will produce the same results table as (SELECT * FROM a) EXCEPT (SELECT * FROM b) academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

59 SQL - DML Voorbeeld Geef een overzicht van alle bedienden (naam en voornaam, stad en postcode) en alle klanten (naam, stad en postcode) SELECT firstname + ‘ ‘ + lastname as name, city, postalcode FROM Employees UNION SELECT companyname, city, postalcode FROM Customers Opm. Daar kolomnamen van UNION deze zijn van de eerste select, dien je de titel ‘name’ in de 2de select niet meer te herhalen Dit voorbeeld combineert 2 resultaatverzamelingen. academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

60 SQL - DML 3) Subqueries (subvragen)
Betekent dat een selectie voorkomt als onderdeel van een andere selectie Basisvorm Waarom gebruiken? Retourneren van resultaat waarbij subquery een procesgegeven bevat Of waarbij gegevens nodig zijn uit meerdere tabellen. Kan je ook oplossen met een JOIN, maar nu worden de tabellen afzonderlijk verwerkt. De relatie tussen de rijen wordt hier bepaald door de opdrachthiërarchie. Gebruik zoveel mogelijk JOIN, ipv subqueries 3 vormen in WHERE clause Geneste subvragen Gecorreleerde subvragen Operator Exists SELECT FROM WHERE voorwaarde Bevat in het rechterlid tussen ronde haakjes een SELECT (kan in SELECT, FROM, WHERE, HAVING) Een subquery is een select statement die 1 kolom retourneert en genest wordt in een select, insert, update, delete statement of in een andere subquery. Adhv subqueries wordt de WHERE clause uitgedrukt in termen van de resultaten van een andere query A join can always be expressed as a subquery. A subquery can often, but not always, be expressed as a join. This is because joins are symmetric: you can join table A to B in either order and get the same answer. The same is not true if a subquery is involved. One difference in using a join rather than a subquery is that the join lets you show columns from more than one table in the result. Query performantie kan dezelfde zijn met een join als een subselect. Maar het verschil zit erin dat een subquery kan vereisen dat de query optimizer bijkomende stappen moet doen, zoals sortering,… Een equijoin heeft het voordeel dat beide zijden van het ON criteria moeten matchen, de volgorde is van geen belang. . In een subquery is de volgorde wel van belang.(de subquery wordt eerst uitgevoerd). Dit is de reden waarom een join vaak sneller is dan een subquery. Een join geeft aan de optimizer meer mogelijkheden om uit te kiezen. Joins laten de query optimizer toe dit op de meest efficiente manier te doen. Many Transact-SQL statements that include subqueries can be alternatively formulated as joins. Other questions can be posed only with subqueries. In Transact-SQL, there is usually no performance difference between a statement that includes a subquery and a semantically equivalent version that does not. However, in some cases where existence must be checked, a join yields better performance. Otherwise, the nested query must be processed for each result of the outer query to ensure elimination of duplicates. In such cases, a join approach would yield better results. A subquery can be used anywhere an expression is allowed. In this example a subquery is used as a column expression named MaxUnitPrice in a SELECT statement. SELECT Ord.OrderID, Ord.OrderDate, (SELECT MAX(OrdDet.UnitPrice) FROM Northwind.dbo.[Order Details] AS OrdDet WHERE Ord.OrderID = OrdDet.OrderID) AS MaxUnitPrice FROM Northwind.dbo.Orders AS Ord Overige Tabel subquery in FROM clause Scalaire subquery in SELECT clause academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

61 SQL - DML De voorbeelden werken met de Werknemers database
academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

62 SQL - DML a) Geneste subvragen Basisvorm
Outer level query = de eerste SELECT. Deze bevat de hoofdvraag. Inner level query = de SELECT in de WHERE clause (of HAVING clause). D.i. De subvraag. Deze wordt altijd eerst uitgevoerd. Ze moeten steeds tussen haakjes staan. Subvragen kunnen in meerdere niveau’s genest zijn. Subquery kan 1 waarde retourneren Of een lijst van waarden retourneren SELECT FROM WHERE voorwaarde Bevat in het rechterlid tussen ronde haakjes een SELECT Een subquery is een select statement die 1 kolom retourneert en genest wordt in een select, insert, update, delete statement of in een andere subquery. Adhv subqueries wordt de WHERE clause uitgedrukt in termen van de resultaten van een andere query A join can always be expressed as a subquery. A subquery can often, but not always, be expressed as a join. This is because joins are symmetric: you can join table A to B in either order and get the same answer. The same is not true if a subquery is involved. One difference in using a join rather than a subquery is that the join lets you show columns from more than one table in the result. Query performantie kan dezelfde zijn met een join als een subselect. Maar het verschil zit erin dat een subquery kan vereisen dat de query optimizer bijkomende stappen moet doen, zoals sortering,… Een equijoin heeft het voordeel dat beide zijden van het ON criteria moeten matchen, de volgorde is van geen belang. . In een subquery is de volgorde wel van belang.(de subquery wordt eerst uitgevoerd). Dit is de reden waarom een join vaak sneller is dan een subquery. Een join geeft aan de optimizer meer mogelijkheden om uit te kiezen. Joins laten de query optimizer toe dit op de meest efficiente manier te doen. Many Transact-SQL statements that include subqueries can be alternatively formulated as joins. Other questions can be posed only with subqueries. In Transact-SQL, there is usually no performance difference between a statement that includes a subquery and a semantically equivalent version that does not. However, in some cases where existence must be checked, a join yields better performance. Otherwise, the nested query must be processed for each result of the outer query to ensure elimination of duplicates. In such cases, a join approach would yield better results. A subquery can be used anywhere an expression is allowed. In this example a subquery is used as a column expression named MaxUnitPrice in a SELECT statement. SELECT Ord.OrderID, Ord.OrderDate, (SELECT MAX(OrdDet.UnitPrice) FROM Northwind.dbo.[Order Details] AS OrdDet WHERE Ord.OrderID = OrdDet.OrderID) AS MaxUnitPrice FROM Northwind.dbo.Orders AS Ord academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

63 SQL - DML i) Retourneren 1 waarde
Operatoren : =, >, <, <=,>=,<> Voorbeeld : Wat is de hoogste wedde? SELECT MAX(salaris) FROM werknemer Wie heeft de hoogste wedde? -> oplossen met subqueries SELECT FNaam, VNaam FROM werknemer WHERE Salaris = (SELECT MAX(salaris) FROM werknemer) Wie heeft de hoogste wedde : stel dat je wenst op te lossen met group by Select fnaam, vnaam, max(salaris) from werknemer group by fnaam, vnaam. Geeft dit het juiste resultaat? Nee je krijgt een lijn per werknemer door de group by. Er is maar 1 juiste oplossing nl door te werken met subqueries. De subquery maakt deel uit van de WHERE. Hier levert het 1 waarde op, vandaar dat dergelijke subselect kan voorkomen in het rechterlid van een vergelijkingsexpressie Een subselect MOET tussen haakjes staan Een subselect wordt altijd eerst uitgevoerd Als de geneste query meer dan 1 resultaatwaarde retourneert, krijg je een foutmelding (runtime error) (error 512 : Subquery returned more than 1 value) Voorbeeld : als we in bovenstaand voorbeeld de avg niet vermelden krijgen we deze fout SELECT titles.title_id, title, royalty FROM titles WHERE titles.royalty > = (SELECT 1.25 * royshed.royalty FROM royshed) Oefening : welke vrouw verdient het meest. Select vnaam, fnaam from werknemer where (salaris >= select max(salaris) from werknemer where geslacht=“V”) and geslacht=“V” De tabel werknemer wordt de eerste keer doorlopen om het hoogste salaris te bepalen (subvraag). Vervolgens een tweede keer (hoofdvraag), waarbij voor elke rij (elke werknemer) het salaris wordt vergeleken met het berekende maximum academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

64 SQL - DML Geef salaris van werknemers waarvan salaris groter is dan gemiddelde salaris SELECT Vnaam, Fnaam, salaris, afdnr FROM werknemer WHERE salaris > (SELECT AVG(salaris) FROM werknemer) Wie is de jongste vrouwelijke werknemer SELECT FNaam, VNaam, Gebdat FROM werknemer WHERE Gesl= 'V‘ AND Gebdat = (SELECT max(gebdat) FROM werknemer WHERE Gesl = ‘V’) academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

65 SQL - DML ii) Retourneren lijst van waarden
Operatoren IN, NOT IN, ANY, ALL IN / =ANY operator Geef naam en voornaam van de managers (kan ook met join) SELECT Vnaam, Fnaam FROM werknemer WHERE nr IN (SELECT ManagerNr FROM afdeling) Geef naam en voornaam van de werknemers die op dezelfde afdeling werken als Bruno Adams (kan je ook oplossen met JOIN) Hoe kan je eerste vraag nog oplossen : select fnaam, vnaam from afdeling join werknemer on afdeling.managernr = werknemer.nr Mag je in de tweede query ook een = gebruiken ipv IN. Ja als je zeker bent dat de subquery juist 1 resultaat teruggeeft The result of a subquery introduced with IN (or with NOT IN) is a list of zero or more values. After the subquery returns results, the outer query makes use of them. Een veld met meerdere waarden vergelijken in 1 voorwaarde met de = operator wordt opgelost door de IN operator. Op die manier kan je een verzameling van waarden vergelijken met de = operator. Je test eigenlijk op het voorkomen van een bepaalde waarde in een verzameling van waarden. Dit betekent dat elke rij in de werknemers tabel vergeleken wordt met de eerste rij uit afdeling en dan OR’en met de test van de vergelijking van de managernr met de 2de rij uit afdeling en dan OR ….Tot een rij een waarde true oplevert. Dan wordt de controle gestopt. IN of =ANY leveren dezelfde resultaten op; The < >ANY operator, however, differs from NOT IN: < >ANY means not = a, or not = b, or not = c. NOT IN means not = a, and not = b, and not = c. <>ALL means the same as NOT IN. Let join : select W1.vnaam, W2.fnaam From werknemer W1 join werknemer W2 on W1.afdnr = W2.afdnr Where W2. Vnaam = “Bruno” AND W2.Fnaam=“Adams”) SELECT FNaam, Vnaam FROM werknemer WHERE afdnr IN (SELECT afdnr FROM werknemer Where Vnaam = “Bruno” AND Fnaam=“Adams”) academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

66 SQL - DML NOT IN / <>ALL operator
Geef naam en voornaam van alle niet managers (niet oplosbaar met INNER JOIN wel met LEFT JOIN of exists (zie verder))) SELECT Vnaam, Fnaam FROM werknemer WHERE nr NOT IN (SELECT ManagerNr FROM afdeling) Dit voorbeeld selecteert alle auteurs die nog geen boek geschreven hebben. Dus waarvoor er nog geen entry bestaat in de tabel titleauthors NOT IN en <>ALL leveren hetzelfde resultaat op >ALL/>ANY >ALL means greater than every value--in other words, greater than the maximum value. For example, >ALL (1, 2, 3) means greater than 3. >ANY means greater than at least one value, that is, greater than the minimum. So >ANY (1, 2, 3) means greater than 1. For a row in a subquery with >ALL to satisfy the condition specified in the outer query, the value in the column introducing the subquery must be greater than each value in the list of values returned by the subquery. Similarly, >ANY means that for a row to satisfy the condition specified in the outer query, the value in the column that introduces the subquery must be greater than at least one of the values in the list of values returned by the subquery academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

67 SQL - DML ANY/ALL operator
Worden gebruikt in combinatie met de relationele operatoren ALL : retourneert TRUE als alle waarden geretourneerd in de subquery voldoen aan de voorwaarde ANY : retourneert TRUE als minstens 1 waarde geretourneerd in de subquery voldoet aan de voorwaarde Voorbeeld : Selecteer alle werknemers die langer werkzaam in het bedrijf, dan alle werknemers uit de afdeling C01 en die jonger zijn dan tenminste 1 werknemer uit afdeling E21. SELECT Vnaam, Fnaam FROM werknemer WHERE InDienst < ALL (SELECT InDienst FROM werknemer WHERE Afdnr = 'C01') Een veld met meerdere waarden vergelijken in 1 voorwaarde adhv relationele operatoren (<,>,<=,>=) wordt opgelost door de ALL/ANY operator in combinatie met de relationele operator ALL : retourneert TRUE als alle waarden geretourneerd in de subquery voldoen aan de voorwaarde ANY : retourneert TRUE als minstens 1 waarde uit de waarden geretourneerd in de subquery voldoet aan de voorwaarde (Opv ANY mag je ook SOME gebruiken) <>ALL levert hetzelfde resultaat op als NOT IN(<> ANY levert niet hetzelfde resultaat op als NOT IN, hoewel =ANY hetzelfde resultaat oplevert als IN. Reden :<> ALL betekent verschillend van alle rijen in de subquery;<> ANY betekent verschillend van een rij in de subquery Verschil tussen ANY en ALL : Beschouw het predikaat WHERE x < ALL (1, 2, 3, 4, 5, 6, 7, 8, 9,10) uitspraak true x < ALL(rij) 0, -1, -2, … => dus hier kleiner dan alle elementen van een set x <= ALL(rij) 1, 0, -1, -2, … => kleiner of gelijk aan alle elementen van een set x > ALL(rij) 11, 12, … => groter dan alle elementen van een set x >= ALL(rij) 10, 11, … => groter of gelijk aan alle elementen van een set x < ANY(rij) 9, 8, 7, …, 0, -1, -2, … => kleiner dan minstens 1 elementen van de set x <= ANY(rij) 10, 9, 8, 7, …, 0, -1, -2, … x > ANY(rij) 2, 3, 4, 5, …, 10, 11, 12, … => dus hier groter dan 1 of meer elementen van de set x >= ANY(rij) 1, 2, 3, … Oefening Selecteer alle werknemers die langer werkzaam in het bedrijf, dan alle werknemers uit de afdeling C01 en die jonger zijn dan tenminste 1 werknemer uit afdeling E21. Oplossing: SELECT NR, FNAAM, AFD FROM WERKNEMER WHERE INDIENST < ALL (SELECT INDIENST FROM WERKNEMER WHERE AFD = ‘C01’) AND GEBDAT > ANY (SELECT GEBDAT FROM WERKNEMER WHERE AFD = ‘E21’) AND GebDat > ANY (SELECT GebDat FROM werknemer WHERE Afdnr = ‘E21') academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

68 SQL - DML Oefeningen Welke werknemer is het langst in dienst
Welke werknemers zijn jonger dan de gemiddelde leeftijd Wie is de oudste programmeur Welke afdeling heeft het meest aantal werknemers Select fnaam, vnaam from werknemer where indienst = (select min(indienst) from werknemer) Of met de ALL wordt dit Select fnaam, vnaam from werknemer where indienst <= ALL (select indienst from werknemer) Select fnaam, vnaam from werknemer where datediff(day, gebdat, getdate()) < (select AVG(datediff(day, gebdat, getdate())) from werknemer) (opmerking avg(gebdat) mag niet, geeft een fout!!!!) Select fnaam, vnaam from werknemer join job on werknemer.jobcode = job.jobcode where omschrijving = ‘programmeur’ AND gebdat< (select gebdat from werknemer join job on werknemer.jobcode = job.jobcode where omschrijving = ‘programmeur’ Select afdeling.afdnr, afdnaam from afdeling join werknemer on afdeling.afdnr = werknemer.afdnr group by afdeling.afdnr, afdnaam having count(*) >= ALL (select count(*) from werknemer group by afdnr) academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

69 SQL - DML b) Gecorreleerde subqueries
De Inner Query hangt af van informatie van de Outer Query : De subvraag bevat een zoekconditie dat relateert naar de hoofdvraag, waardoor de subvraag van de hoofdvraag afhankelijk wordt. Voor elke rij uit hoofdvraag wordt de subvraag opnieuw uitgevoerd. De volgorde is hier dus niet van onder naar boven, maar van boven naar onder ( per rij) Gebruik joins indien mogelijk Principe SELECT FROM tabel a WHERE uitdrukking operator Vergelijken van de rijen uit 1 tabel met een voorwaarde in een andere tabel. Voor elke rij uit de top query wordt de subquery uitgevoerd. (Conceptueel vergelijkbaar met een soort loop in een programma, maar zonder de while constructie). Het resultaat van elke uitvoering van de subquery moet gecorreleerd worden met een rij uit de outer query (SELECT ... FROM tabel WHERE uitdrukking operator a.kolomnaam) academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

70 SQL - DML Voorbeeld : Geef werknemers waarvan salaris groter is dan gemiddeld salaris 0. Rij 1 in de outer query 1. Outer query geeft kolomwaarden van die rij door aan inner query SELECT Vnaam, Fnaam FROM Werknemer WHERE sal > (SELECT AVG(sal) FROM Werknemer) 2. Inner query gebruikt die waarden om inner query te evalueren Geef werknemers waarvan salaris groter is dan gemiddeld salaris van zijn afdeling 3. Inner query retourneert een waarde naar de Outer query, en de rij in de Outer query wordt al dan niet weerhouden. SELECT Vnaam, Fnaam FROM Werknemer WHERE sal > (SELECT AVG(sal) FROM Werknemer W1 4. Dit proces wordt herhaald voor de volgende rij in de outerquery W2 WHERE W1.afdnr = W2.afdnr) Vergelijken van de rijen uit 1 tabel met een voorwaarde in een andere tabel. Voor elke rij uit de top query wordt de subquery uitgevoerd. (Conceptueel vergelijkbaar met een soort loop in een programma, maar zonder de while constructie). Het resultaat van elke uitvoering van de subquery moet gecorreleerd worden met een rij uit de outer query Als je nu aan de query Geef werknemers waarvan salaris groter is dan gemiddeld salaris een extra conditie toevoegd nl van hun afdeling. Dan moet je met gecorreleerde subqueries werken. Zonder een computerr zouden we als volgt te werk gaan : we nemen de tabel werknemer, gesorteerd op afdeling. We selecteren de eerste rij uit de tabel werknemer, en dan gaan we de subquery uitvoeren, nl we berekenen het gemiddelde salaris van de werknemers van die afdeling. Daarna wordt deze procedure herhaald voor de daaropvolgende rijen. Volgorde van uitvoering per waarde in de outerquery Outer query geeft de waarde van de kolom door aan de inner query. In voorbeeld is dit afdeling van de werknemer De inner query gebruikt de waarde : in de where clause om die rijen te selecteren in de werknemers tabel waarvan de werknemers behoren tot dezelfde afdeling als de werknemer in de outerquery De inner query retourneert het resultaat naar de outer query: nl gemiddeld salaris van die werknemers uit die afd. Eigenlijk wil je afdnr van de eerste query vergelijken met afdnr van de 2de query. Opdat het DBMS het onderscheid zou kennen tussen de 2 tabellen werknemer, ken ik er alliassen aan toe. W1 en W2 en vervolgens kan ik mijn conditie toevoegen Opm : in de inner query mag je velden gebruiken uit de tabellen die voorkomen in zijn outer queries, en in de query zelf, MAAR niet van zijn inner queries (di. In de hoofdvraag mag je geen velden gebruiken uit de subvraag, maar wel omgekeerd) Terug naar stap 1 academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

71 SQL - DML Oefeningen Geef naam en voornaam van de werknemers die het hoogste salaris hebben in hun jobcode. Geef per departement de werknemer die het laatst in dienst gekomen is Geef naam en voornaam op van de mannelijke en vrouwelijke werknemer die het meeste verdienen Welke afdeling heeft het meest aantal werknemers Select vnaam, fnaam from werknemer W1 where sal >= (select max(sal) from werknemer W where W1.jobcode = W2.jobcode) Select afdnaam, vnaam, fnaam From afdeling join werknemer W1 on afdeling.afdnr = W1.afdnr Where indienst > (select max(indienst) from werknemer W where W1.afdnr = W2.afdnr) Select vnaam, fnaam, geslacht from werknemer W1 where salaris >= (select max(salaris) from werknemer W where W1.geslacht=W2.geslacht) Select afdnaam from afdeling join werknemer on afdeling.afdnr = werknemer.afdnr group by afdeling.afdnr having count(*) >= ALL (select count(*) from werknemer group by afdnr) academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

72 SQL - DML c) De operator EXISTS (NOT EXISTS)
Testen op het bestaan van iets of het niet bestaan van iets Voorbeeld Selecteer de afdelingen zonder werknemers Selecteer de afdelingen met werknemers SELECT afdnaam FROM afdeling WHERE NOT EXISTS (SELECT * FROM werknemers WHERE werknemers.afdnr = afdeling.afdnr) De gecorreleerde subselect in bovenstaand vb heeft een *. We moeten geen specifieke kolominhoud onderzoeken. Het gaat helemaal niet om rij inhoud, het enige dat telt is of de subselect minimaal 1 rij oplevert. Igv van WHERE EXISTS en subselect levert minstens 1 rij op wordt de WHERE conditie van de hoofdselect WAAR, indien nee dan ONWAAR. EXISTS betekent NOT EMPTY, NOT EXISTS betekent empty Wordt gebruikt wanneer meerdere velden in de hoofd query gecorreleerd moeten worden met de subquery. EXISTS checkt op een niet lege set. Het retourneert ofwel TRUE ofwel NOT TRUE. De conventie zegt dat men daarom in de subquery geen kolomlijst moet opgeven, maar men een * moet gebruiken. Als SQL server subqueries met een EXISTS keyword uitvoert dan: Test de outer query het bestaan van de rijen die de subquery retorneert Retourneert de subquery TRUE of FALSE gebaseerd op de voorwaarde in de query Produceert de subquery geen data Bovenstaande kan je ook doen met IN of not in. Formuleer dit nu eens met IN of NOT IN Select afdnaam from afdeling where afdnr NOT IN (select distinct afdnr from werknemer) of met een join Select DISTINCT afdnaam from afdeling join werknemer on afdeling.afdnr = werknemer.afdnr (alle afdelingen met werknemers) Zonder werknemers : left join + extra conditie where werknemernr is null academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

73 SQL - DML Nog een stapje verder
In welke afdeling komen alle jobcodes voor? SELECT afdnaam FROM afdeling WHERE NOT EXISTS (SELECT * FROM job FROM werknemer WHERE afdeling.afdnr = werknemer.afdnr AND job.jobcode = werknemer.jobcode)) (Aanwijzing : Ga uit van de formulering met dubbele ontkenning : Welke afdelingen bevatten geen enkele job die niet wordt uitgevoerd door 1 van de werknemers van die afdeling) Eigenlijk gaan we per afdeling per jobcode kijken of jobcode in die afdeling voorkomt Als er 1 jobcode bestaat die niet in de afdeling voorkomt, dan zal de afdeling niet behoren tot de resultaatset. Beginnen we de query te analyseren van onder naar boven Stel in query 3 : is leeg als die job niet in die afdeling voorkomt. Is niet leeg als job wel voorkomt in afdeling Dan in query 2 : als Query 3 leeg -> dan query 2 niet leeg; als q3 niet leeg, dan query 2 leeg Dan in Query 1 : als Query 2 leeg (dit betekent dat alle jobs voorkomen)-> dan komt afdeling voor in query; als q2 niet leeg, dan komt afd niet voor in query 1 Hoe demonstreren? Zie volgende slide, maar die is hidden, dus studenten krijgen die niet. Op bord zetten academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

74 SQL - DML Een andere mogelijke oplossing Oefening :
Welke afdelingen hebben TEN MINSTE dezelfde jobcodes als afdeling A00 SELECT afdnaam FROM afdeling JOIN werknemer ON afdeling.afdnr = werknemer.afdnr GROUP BY afdnaam HAVING COUNT(DISTINCT jobcode) = (SELECT COUNT(*) FROM job) Select afdnaam From afdeling A1 Where afdnr <> ‘A00’ AND not exits (select¨* from werknemer W1 where afdnr = ‘A00’ and not exists (select * from werknemer W2 where A1.Afdnr = W2.afdnr and W1.jobcode = W2.jobcode)) Of SELECT afdnaam FROM afdeling JOIN werknemer ON afdeling.afdnr = werknemer.afdnr WHERE jobcode IN (select jobcode from werknemer where afdnr = ‘A00’ ) GROUP BY afdnaam HAVING COUNT(DISTINCT jobcode) = (SELECT COUNT(DISTINCT jobcode) from werknemer where afdnr = ‘A00’) academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

75 SQL - DML Oefeningen : The EXISTS keyword is important because often there is no alternative, nonsubquery formulation. Although some queries formulated with EXISTS cannot be expressed any other way, all queries that use IN or a comparison operator modified by ANY or ALL can be expressed with EXISTS. Subqueries introduced with EXISTS and NOT EXISTS can be used for two set-theory operations: intersection and difference. The intersection of two sets contains all elements that belong to both of the original sets. The difference contains elements that belong only to the first of the two sets.The intersection of authors and publishers over the city column is the set of cities in which both an author and a publisher are located. USE pubs SELECT DISTINCT city FROM authors WHERE EXISTS (SELECT * FROM publishers WHERE authors.city = publishers.city) academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

76 SQL - DML Geef naam en geboortejaar van de presidenten, die ingehuldigd werden voor hun 45° jaar. Geef verkiezingsjaar, en winnaar van die verkiezingen waarbij de winnaar meer dan 80% van de stemmen behaalde in die verkiezing. Selecteer de naam van de presidenten, geboortejaar en installatiejaar van hun eerste ambtsperiode. Rangschik in volgorde van installatiejaar. Zoek die presidenten van wie het aantal huwelijken gelijk is aan het aantal ambtsperiodes als president. Geef naam, alsook dit aantal. Geef de namen en sterfdata van alle presidenten die gehuwd waren. Geef de namen en sterfdata van die presidenten die ongehuwd bleven. Geef verkiezing en naam van de winnende kandidaten die nooit president werden Geef de kandidaten die zich ten minste in dezelfde jaren als president Clinton kandidaat gesteld hebben 1.SELECT Pres_Naam, GebJaar FROM President WHERE dateAdd(year, 45,GebJaar) > (SELECT MIN(Jaar_Inhuldig) FROM Administratie WHERE Administratie.Pres_Naam = President.Pres_Naam) Of SELECT DISTINCT P.Pres_Naam, GebJaar FROM President P, Administratie A WHERE P.Pres_Naam = A. Pres_Naam AND dateAdd(year, 45,GebJaar) > Jaar_Inhuldig 2. SELECT Kandidaat, VerkiesJaar FROM Verkiezing V WHERE Win_Verlies_Index = 'W' AND Stemmen > (SELECT 0.8 * SUM(Stemmen) FROM Verkiezing WHERE Verkiezing.VerkiesJaar = V.VerkiesJaar) 3. SELECT P.Pres_Naam, GebJaar, Jaar_Inhuldig FROM President P join Administratie A on P.Pres_Naam = A.Pres_Naam WHERE Jaar_Inhuldig= (SELECT MIN(Jaar_Inhuldig) FROM Administratie WHERE Administratie.Pres_Naam = President.Pres_Naam) ORDER BY jaar_inhuldig 4. SELECT Pres_Naam, COUNT(*) FROM Administratie GROUP BY Pres_Naam HAVING COUNT (*) = (SELECT COUNT(*) FROM Pres_Huwelijk WHERE Pres_Huwelijk.Pres_Naam = Administratie.Pres_Naam) 5. SELECT Pres_Naam, Overlijden FROM President WHERE EXISTS (SELECT * FROM Pres_Huwelijk WHERE Pres_Huwelijk.Pres_Naam = President.Pres_Naam) Of SELECT DISTINCT P.Pres_Naam, Overlijden FROM President P join pres_huwelijk H on P.Pres_Naam = H.Pres_Naam Of SELECT Pres_Naam, Overlijden FROM President WHERE pres_naam IN (SELECT pres_naam FROM Pres_Huwelijk) 6. SELECT Pres_Naam, Overlijden FROM President P WHERE NOT EXISTS (SELECT * FROM Pres_Huwelijk H WHERE H.Pres_Naam = P.Pres_Naam) 7. SELECT Kandidaat FROM Verkiezing V WHERE Win_Verlies_Index = 'W' and not exists (select * from president where president.Pres_naam = verkiezing.kandidaat) of SELECT Kandidaat FROM Verkiezing V WHERE Win_Verlies_Index = 'W' and kandidaat NOT IN (select pres_naam from president) 8. Select kandidaat from verkiezing V1 wherepres_naam <> ‘Clinton’ And not exists (select * from verkiezing V2 where kandidaat = ‘Clinton’ and not exists (select * from verkiezing V3 where V1.kandidaat = V3.kandidaat and V2.verkies_jaar = V3.verkiesjaar)) academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

77 SQL - DML d) SELECT instructie met tabel subquery in FROM clause
Als resultaat van een subquery terug een tabel is, mag die ook in de FROM clause gespecifieerd worden. De tabel die de subquery oplevert krijgt een naam Voorbeeld Toon de afdelingen waarvan het leeftijdsverschil tussen de oudste en jongste werknemer groter is dan 20 jaar. select afd, minprijs, maxprijs from (select afdnr, min(gebdat), max(gebdat) from werknemer group by afdnr) as leeftijden(afd, mingebdat, maxgebdat) where datediff(year, mingebdat, maxgebdat) > 20 academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

78 SQL - DML e) SELECT instructie met scalaire subquery in SELECT clause
In SELECT clause van de SELECT instructie mogen scalaire subqueries gebruikt worden Voorbeeld Toon per afdeling de som van de salarissen select afdnr, afdnaam, (select sum(sal) from werknemer W where W.afdnr=A.afdnr) as TotaalSalaris from afdeling A Als er voor een bepaalde afdeling geen werknemerss zijn staat een null waarde in TotaalSalaris. academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

79 SQL - DML Pubs database academiejaar A.Sennesael, A. Van Achter Karine Samyn - Databanken oefeningen

80 SQL - DML academiejaar 2005-2006 A.Sennesael, A. Van Achter
Karine Samyn - Databanken oefeningen


Download ppt "Overzicht databanken - Oefeningen"

Verwante presentaties


Ads door Google