Structured Query Language

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

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

Structured Query Language (SQL)

Introductie (relationele) databases

Les S-02: Meer geavanceerde SQL-instructies

Data Manipulation Language

SQL Aantekeningen 3. Maarten de Rijke 22 mei 2003

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

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

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

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

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

Query SQL Boekje. Fredrik Hamer

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

11. Het selecteren van gegevens deel II

Les 2 Eenvoudige queries

SQL & Relationele datamodellen in interactieve media

oefeningen TOP2000 antwoorden

Datamodelleren en databases 2011

Computerclub Volwassenen, Jeugd en Informatica vzw

oefeningen eredivisie antwoorden

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

databases & SQL - antwoorden

Zelftest SQL Workshop

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

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

ISO SQL: Structured Query Language

SQL opgaven. Relationele model: Opgaven:

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

Zelftest SQL Workshop

Relationele databases

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

Les 11 : Basis SQL (deel2).

[TOETS SQL INLEIDING]

ISO Query By Example

SQL datadefinitietaal

SQL.

Gekoppelde tabellen: de JOIN

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

Databases - Inleiding

Hoofdstuk: 1 Principes van databases

Databases SQL - meerdere tabellen

Gebruikers Handleiding

SQL. Datamodellering 2008

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

EXIN Databases en SQL Foundation

Databases en SQL Foundation (DBSQLF.NL)

Miniles gegevensbanken bevragen met SQL

SQL: oefenen queries

Data Manipulatie. Query Talen. / Informatica

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

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

Les S-01: De basisbeginselen van SQL

Data Definition Language

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

Les S-01: De basisbeginselen van SQL

Puzzelen met SQL: Fileleed

Technische nota AbiFire Rapporten maken via ODBC

Antwoorden Informatica Hoofdstuk 7

Workshop SQL. Woensdag 16 mei 2018

Informatie & Databases

Databank - Gevorderden 1

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

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

Effective EDGE for Professionals Outlook 2010 Steps Guide

Data Warehouse Script Generator Doel

COMPUTERWOORDEN.NL SQL - basis

Guido Geurts Mark Bernaerts

Relationele database. Het relationele model

ADVANCED DATABASES Syllabus versie 2.0

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

Access voor Beginners - Hoofdstuk 7

Toelichting Validatieregels DBC GGZ RG12

7. Het selecteren van gegevens

SQL & Datamodelleren

Technische nota AbiFire5 Rapporten maken via ODBC

SQL / Systeemanalyse

Excel Controller. Handleiding Excel Controller Wizard

Databases gebruiken. Databases gebruiken

9 H. Flits Zwanenveld Nijmegen Jeugd1 10 L. Willemsen Kasteel 4 Wychen Jeugd1 12 M.E.P. Graag Broerdijk 234 Nijmegen Heren 12/8/89 19/8/89 36

Inhoudsopgave. Theorie Praktijk Gegevens uit Database halen DML commando s... 14

Antwoorden door een scholier 1990 woorden 3 maart keer beoordeeld. Informatica INFORMATICA HOOFDSTUK 4

EUROPEES COMPUTER RIJBEWIJS / INTERNATIONAAL COMPUTER RIJBEWIJS ADVANCED DATABASE

8. De invoer van gegevens

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

Zelftest DB2 for z/os basiscursus

Koppeling met een database

Digitaal Staatsexamen VWO 2010

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

Elfde-Liniestraat Hasselt Schooljaar TINFO POKER GAME Oracle Scripts

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

Inhoud Basiscursus. Access 2010 NL-NL

TECHNISCHE UNIVERSITEIT EINDHOVEN. Faculteit Wiskunde en Informatica

FileMaker 13. Naslaggegevens voor SQL

Spoedcursus SQL met MS-Access

Transcriptie:

Structured Query Language SQL = internationale standaardtaal. Origineel IBM. SQL92 (SQL2), SQL99 (SQL3), SQL:2003, SQL:2007 en SQL:2008. Vele dialecten. In wat volgt beperken we ons tot wat tot de kern behoort. Waar mogelijk zullen we beperkingen en uitbreidingen van dialecten aangeven.

Wat is SQL? SQL kan structuren creëren, wijzigen en verwijderen = datadefinitie. SQL kan data toevoegen, wijzigen en verwijderen = manipulatie. SQL kan gegevens opvragen en weergeven = vraagtaal. SQL is géén programmeertaal. Belangrijkste commando's mbv voorbeeld: wagens.fdb.

SELECT syntax SELECT column FROM tablename; SELECT column1, column2, column3 FROM tablename; SELECT * FROM tablename; SELECT * FROM wagen; SELECT nummerplaat FROM wagen; SELECT kleur, eigenaar FROM wagen; SELECT NUMMERPLAAT FROM WAGEN; select nummerplaat from wagen; SeLECt nummerplaat FROM wagen; select NUMMERPLAAT from WAGEN; SELECT kleur, eigenaar eigenaar FROM wagen ; -- neem veld kleur en -- van tabel wagen

Filters SELECT column FROM tablename WHERE rule; SELECT nummerplaat FROM wagen WHERE kleur='rood'; Nummerplaat 611 AAA enkele aanhalingstekens SELECT nummerplaat FROM wagen WHERE kleur='rood'; Nummerplaat hoofdlettergevoelig SELECT nummerplaat, kleur FROM wagen WHERE kleur='rood'; Nummerplaat Kleur 611 AAA Rood velden in where kunnen wel of niet voorkomen in select

Eenvoudige vergelijkingsoperatoren = WHERE kleur='rood' kleur gelijk aan Rood!= WHERE kleur!='rood' kleur een andere kleur dan Rood <> WHERE kleur='rood' hetzelfde als!= > WHERE prijs>10000 prijs groter dan 10000 >= WHERE prijs>=10000 prijs groter dan of = aan 10000 < WHERE prijs<10000 prijs kleiner dan 10000 <= WHERE prijs<=10000 prijs kleiner dan of = aan 10000 select * from wagen where prijs<10000; select * from wagen where prijs<'10000'; select * from wagen where prijs< 10000 ; -- goed -- goed -- fout SELECT * FROM chauffeur WHERE geboortedatum='11 Jan 80'; SELECT * FROM chauffeur WHERE geboortedatum='11-jan-80'; SELECT * FROM chauffeur WHERE geboortedatum='11 Jan 1980'; SELECT * FROM chauffeur WHERE geboortedatum='11-jan-1980'; SELECT * FROM chauffeur WHERE geboortedatum='01-11-80'; SELECT * FROM chauffeur WHERE geboortedatum='01/11/1980'; SELECT * FROM chauffeur WHERE geboortedatum='11.01.80';...

Meer geavanceerde operatoren SELECT * FROM wagen WHERE prijs BETWEEN 13000 AND 22000; SELECT * FROM chauffeur WHERE geboortedatum BETWEEN '23 Mar 1981' AND '23 Apr 1981'; SELECT * FROM wagen WHERE eigenaar IS NULL; SELECT * FROM wagen WHERE eigenaar IS NOT NULL; naam LIKE 'Tom Peeters' naam LIKE 'Tom P_eters' naam LIKE ' Peeters' naam LIKE '% Peeters' naam LIKE '% P%' naam LIKE 'Tom %' naam LIKE '%' geeft enkel Tom Peeters geeft Tom Peeters en Tom Pieters geeft Tom Peeters, Jan Peeters,.. geeft Tom Peeters, Marc Peeters,. geeft Tom Peeters, Elke Panda,... geeft Tom Peeters, Tom Jansen,... geeft alle namen behalve NULL SELECT merk FROM wagen WHERE merk LIKE 'F%';

Logische operatoren SELECT * FROM wagen WHERE kleur='blauw' AND nummerplaat LIKE '%5%'; 155BDE Mercedes Blauw 22000 Tom Peeters C04BF5 Smart Blauw 13000 SELECT * FROM wagen WHERE kleur='blauw' AND (nummerplaat LIKE '%5%' OR nummerplaat LIKE '%1%'); 111BBB Skoda Blauw 11000 Jan Peeters 155BDE Mercedes Blauw 22000 Tom Peeters C04BF5 Smart Blauw 13000 SELECT * FROM wagen WHERE NOT (kleur='blauw' AND (nummerplaat LIKE '%5%' OR nummerplaat LIKE '%1%')); SELECT * FROM wagen WHERE NOT kleur='blauw' AND (nummerplaat LIKE '%5%' OR nummerplaat LIKE '%1%'); SELECT * FROM wagen WHERE kleur!='blauw' AND (nummerplaat LIKE '%5%' OR nummerplaat LIKE '%1%'); SELECT * FROM wagen WHERE kleur='blauw' AND nummerplaat LIKE '%5%' OR nummerplaat LIKE '%1%'; haakjes zijn vaak noodzakelijk volgorde operatoren: NOT, AND, OR

Distinct SELECT kleur FROM wagen; geeft alle kleuren maar blauw wel drie keer SELECT DISTINCT kleur FROM wagen; Blauw Groen Rood SELECT DISTINCT kleur, merk FROM wagen; Blauw Mercedes Blauw Skoda Blauw Smart Groen Fiat Rood Ford

IN SELECT * FROM wagen WHERE merk='skoda' OR merk='smart'; = SELECT * FROM wagen WHERE merk IN ('Skoda','Smart');

CONTAINING SELECT * FROM wagen WHERE merk LIKE '%od%'; = SELECT * FROM wagen WHERE merk CONTAINING 'od';

Sorteren, rangschikken gegevens SELECT merk FROM wagen ORDER BY merk; SELECT merk FROM wagen ORDER BY merk ASC; SELECT merk FROM wagen ORDER BY merk DESC; SELECT * FROM wagen ORDER BY kleur ASC, merk DESC; C04 BF5 Smart Blauw 13000 111 BBB Skoda Blauw 11000 Jan Peeters 155 BDE Mercedes Blauw 22000 Tom Peeters 555 GHT Fiat Groen 6000 Tom Jansen 611 AAA Ford Rood 12000 Jan Peeters

Aggregaatsfuncties SELECT AVG(prijs) FROM wagen; AVG 12800 SELECT AVG(prijs) FROM wagen WHERE kleur='blauw'; AVG 15333 SELECT SUM(prijs) FROM wagen WHERE kleur='blauw'; SUM 46000 SELECT MAX(prijs), MIN(prijs) FROM wagen; MAX / MIN 22000 / 6000 SELECT COUNT(prijs) FROM wagen; COUNT 5 SELECT COUNT(kleur) FROM wagen; SELECT COUNT(eigenaar) FROM wagen; COUNT 4 SELECT COUNT(*) FROM wagen; COUNT 5 levert altijd totaal aantal rijen, onafgezien van NULL waarden SELECT COUNT(DISTINCT kleur) FROM wagen; COUNT 3 SELECT COUNT(DISTINCT eigenaar) FROM wagen; COUNT 3 levert altijd het aantal unieke veldwaarden (zonder NULL waarden)

De GROUP BY clausule Je wenst de maximale prijs van auto's per kleur te bepalen. Hoe? SELECT kleur, MAX(prijs) FROM wagen; geeft fout SELECT kleur, MAX(prijs) FROM wagen GROUP BY kleur; Kleur MAX Rood 12000 Blauw 22000 Groen 6000 de geselecteerde kolommen zonder aggregaatsfunctie in GROUP BY SELECT MAX(prijs) FROM wagen GROUP BY kleur; werkt ook

De HAVING clausule Welke eigenaars hebben meer dan één wagen? SELECT eigenaar FROM wagen WHERE COUNT(eigenaar)>1; geeft fout: "cannot use an aggregate function in a WHERE clause, use HAVING instead" SELECT eigenaar FROM wagen GROUP BY eigenaar HAVING COUNT(eigenaar)>1; SELECT eigenaar, COUNT(eigenaar) FROM wagen GROUP BY eigenaar HAVING COUNT(eigenaar)>1; zijn beiden ok Eigenaar COUNT Jan Peeters 2

Gegevens uit meerdere tabellen Gegevens uit meerdere tabellen: deze tabellen in FROM clause vermelden, SELECT nummerplaat,naam,geboortedatum FROM wagen, chauffeur; levert foutief resultaat op omdat SQL niet weet hoe de twee tabellen te koppelen we kunnen dat met een WHERE clause oplossen Belangrijke opmerking: Indien sommige van de tabellen in de query gelijke veldnamen bevatten, kan steeds naar het correcte veld verwezen worden door de veldnaam te laten voorafgaan door de tabelnaam en een punt. SELECT wagen.nummerplaat, chauffeur.naam, chauffeur.geboortedatum FROM wagen, chauffeur; is net hetzelfde als de query hierboven

Traditionele JOIN We moeten geen product van twee tabellen hebben maar een join. Op de traditionele manier werd dat als volgt gedaan: SELECT nummerplaat,naam,geboortedatum FROM wagen,chauffeur WHERE eigenaar=naam; Nummerplaat Naam Geboortedatum 611 AAA Jan Peeters 11.01.1980 111 BBB Jan Peeters 11.01.1980 155 BDE Tom Peeters 23.03.1981 555 GHT Tom Jansen 03.12.1986 de belangrijkste kritiek op SQL is dat het veel te eenvoudig is om een product (ook wel cartesische join genoemd) te maken van 2 tabellen de vermenging van echte where calusules met de join-where leidt vaak tot fouten daarom werd de moderne join ingevoerd we raden het gebruik van de traditionele join ten stelligste af

Moderne JOIN We gebruiken JOIN (of INNER JOIN, wat precies hetzelfde is) samen met het ON keyword. SELECT nummerplaat,naam,geboortedatum FROM wagen JOIN chauffeur ON eigenaar=naam; SELECT nummerplaat,naam,geboortedatum FROM wagen INNER JOIN chauffeur ON eigenaar=naam;

Outer JOIN Bij de JOIN of INNER JOIN worden enkel die rijen weergegeven die effectief in de twee gekoppelde tabellen voorkomen. Soms wil men ook de rijen weergeven die slechts in één van de twee tabellen voorkomen: men noemt dat een OUTER JOIN. We gebruiken daartoe LEFT OUTER JOIN en RIGHT OUTER JOIN (meestal afgekort tot LEFT JOIN en RIGHT JOIN). SELECT nummerplaat,naam,geboortedatum FROM wagen LEFT JOIN chauffeur ON eigenaar=naam; SELECT nummerplaat,naam,geboortedatum FROM wagen LEFT OUTER JOIN chauffeur ON eigenaar=naam; Nummerplaat Naam Geboortedatum 611 AAA Jan Peeters 11.01.1980 111 BBB Jan Peeters 11.01.1980 155 BDE Tom Peeters 23.03.1981 555 GHT Tom Jansen 03.12.1986 C04 BF5 SELECT nummerplaat,naam,geboortedatum FROM chauffeur RIGHT JOIN wagen ON naam=eigenaar; SELECT nummerplaat,naam,geboortedatum FROM chauffeur RIGHT OUTER JOIN wagen ON naam=eigenaar;

FULL OUTER JOIN Soms kan het ook nuttig om alle rijen weer te geven, dus behalve degene die effectief gekoppeld kunnen worden, ook deze die niet gekopped kunnen worden onafgezien of ze voorkomen in de linker of rechtertabel. Daartoe gebruiken we FULL OUTER JOIN, kortweg FULL JOIN. SELECT nummerplaat,naam,geboortedatum FROM wagen FULL JOIN chauffeur ON eigenaar=naam; SELECT nummerplaat,naam,geboortedatum FROM wagen FULL OUTER JOIN chauffeur ON eigenaar=naam; Nummerplaat Naam Geboortedatum 611 AAA Jan Peeters 11.01.1980 111 BBB Jan Peeters 11.01.1980 155 BDE Tom Peeters 23.03.1981 555 GHT Tom Jansen 03.12.1986 C04 BF5 David Davidse 13.06.1983

Aliassen Het schrijven van SQL kan vereenvoudigd worden door gebruik te maken van aliassen, wat vooral bij joins erg interessant kan zijn. SELECT wagen.eigenaar FROM wagen WHERE wagen.kleur='rood'; is hetzelfde als: SELECT c.eigenaar FROM wagen c WHERE c.kleur='rood'; of nog Eigenaar Jan Peeters SELECT c.eigenaar renner FROM wagen c WHERE c.kleur='rood'; Renner Jan Peeters

Self joins Self-joins of equijoins zijn joins waarbij we dezelfde tabel meer dan één keer willen gebruiken, maar elke keer met een ander doel. We willen bijvoorbeeld weten welke chauffeurs met een wagen rijden die dezelfde kleur heeft als Tom Peeters. SELECT kleur FROM wagen WHERE eigenaar='tom Peeters'; Kleur Blauw SELECT eigenaar FROM wagen WHERE kleur='blauw' AND eigenaar!='tom Peeters' AND eigenaar IS NOT NULL; Eigenaar Jan Peeters kan in één keer met: SELECT b.eigenaar FROM wagen a JOIN wagen b ON a.kleur=b.kleur WHERE a.eigenaar='tom Peeters' AND a.eigenaar<>b.eigenaar AND b.eigenaar IS NOT NULL;

VIEWS Een VIEW kan gecreëerd worden in een database, en elke VIEW representeert één enkele SQL query. eens aangemaakt: te gebruiken als een echte tabel (voor opvragingen) inhoud altijd identiek aan het resultaat dat zou bekomen worden door de achterliggende query uit te voeren SELECT COUNT(*)FROM chauffeur; SELECT COUNT(*) FROM wagen; CREATE VIEW cnt1 (chauffeurs) AS SELECT COUNT(*)FROM chauffeur; CREATE VIEW cnt2 (wagens) AS SELECT COUNT(*) FROM wagen; SELECT chauffeurs,wagens FROM cnt1,cnt2; Kleur Blauw DROP VIEW cnt DROP VIEW cnt2;

SUBQUERIES Eén select kan ingenest worden in een ander. We noemen ze subqueries. Ze kunnen vaak gebruikt worden in plaats van een self-join of view. We willen bijvoorbeeld weten wie in de database jonger is dan Jan Peeters. SELECT geboortedatum FROM chauffeur WHERE naam='jan Peeters'; SELECT naam FROM chauffeur WHERE geboortedatum>'11 Jan 1980'; kan in één keer met: SELECT naam FROM chauffeur WHERE geboortedatum > (SELECT geboortedatum FROM chauffeur WHERE naam='jan Peeters'); Naam Tom Peeters Tom Jansen probleem wanneer meer dan één chauffeur met de naam Jan Peeters

ANY en ALL Met ANY en ALL kan ook gewerkt worden met subqueries die meer dan één rij afleveren als resultaat. met ANY moet er minimaal één rij voldoen met ALL moeten alle rijen voldoen SELECT * FROM wagen WHERE kleur = ANY (SELECT kleur FROM wagen WHERE eigenaar='jan Peeters'); Nummerplaat Merk Kleur Prijs Eigenaar 611 AAA Ford Rood 12000 Jan Peeters 111 BBB Skoda Blauw 11000 Jan Peeters 155 BDE Mercedes Blauw 22000 Tom Peeters C04 BF5 Smart Blauw 13000 SELECT * FROM wagen WHERE prijs > ALL (SELECT prijs FROM wagen WHERE eigenaar='jan Peeters'); Nummerplaat Merk Kleur Prijs Eigenaar 155 BDE Mercedes Blauw 22000 Tom Peeters C04 BF5 Smart Blauw 13000

IN en NOT IN voor subqueries IN kan ook met subqueries. Bijvoorbeeld: alle wagens met een kleur zoals één van de wagens van Jan Peeters. SELECT * FROM wagen WHERE kleur IN (SELECT kleur FROM wagen WHERE eigenaar='jan Peeters'); Nummerplaat Merk Kleur Prijs Eigenaar 611 AAA Ford Rood 12000 Jan Peeters 111 BBB Skoda Blauw 11000 Jan Peeters 155 BDE Mercedes Blauw 22000 Tom Peeters C04 BF5 Smart Blauw 13000 SELECT * FROM wagen WHERE kleur NOT IN (SELECT kleur FROM wagen WHERE eigenaar='jan Peeters'); Nummerplaat Merk Kleur Prijs Eigenaar 555 GHT Fiat Groen 6000 Tom Jansen

EXISTS De EXISTS operator levert waar op als de subquery waarop hij wordt toegepast minstens één rij geeft, en onwaar als de subquery geen rij geeft. NOT EXISTS doet het tegenovergestelde. SELECT kleur FROM wagen a WHERE NOT EXISTS (SELECT kleur FROM wagen b WHERE a.kleur = b.kleur AND a.nummerplaat <> b.nummerplaat); Kleur Rood Groen SELECT DISTINCT eigenaar FROM wagen a WHERE EXISTS (SELECT eigenaar FROM wagen b WHERE a.eigenaar = b.eigenaar AND a.nummerplaat <> b.nummerplaat); Eigenaar Jan Peeters

UNION UNION wordt gebruikt om twee queries samen te voegen kan alleen als deze queries even veel kolommen van zelfde type tellen We willen bvb alle chauffeurs met het aantal wagens dat ze bezitten. SELECT naam,count(*) FROM chauffeur JOIN wagen ON naam=eigenaar GROUP BY naam; levert alle chauffeurs die minimum één wagen hebben SELECT naam,0 FROM chauffeur WHERE naam NOT IN (SELECT eigenaar FROM wagen WHERE eigenaar IS NOT NULL); levert de chauffeurs zonder wagen SELECT naam,count(*) FROM chauffeur JOIN wagen ON naam=eigenaar GROUP BY naam UNION SELECT naam,0 FROM chauffeur WHERE naam NOT IN (SELECT eigenaar FROM wagen WHERE eigenaar IS NOT NULL); Naam David Davidse 0 Jan Peeters 2 Tom Jansen 1 Tom Peeters 1 COUNT