• No results found

Structured Query Language (SQL)

N/A
N/A
Protected

Academic year: 2021

Share "Structured Query Language (SQL)"

Copied!
18
0
0

Bezig met laden.... (Bekijk nu de volledige tekst)

Hele tekst

(1)

Structured Query Language (SQL)

Huub de Beer

Eindhoven, 4 juni 2011

(2)

Database: in essentie

I 0 of meer tabellen

I elke tabel nul of meer kolommen (of velden)

I elke tabel nul of meeruniekerijen

I elke query werkt op tabellen

I elke query levert een nieuwe tabel op

I een lege tabel is ook een tabel

Je hebt altijd te maken met tabellen.

Die kunnen leeg zijn

(3)

Ik leer SQL en neem mee ...

I SQL is door mensen bedacht en zit logisch in elkaar

I Een oplossing zien = een oplossing begrijpen 6= begrijpen hoe je zelftot die oplossing komt

I Leren door oefenen

I Boek en de presentaties: veel voorbeelden en (nieuwe) SQL code.

I Probeer de voorbeelden uit (zeker als je ze niet begrijpt)

I Databases zijn op eckartnet te vinden

I Tijdens de presentatie gebruik ik de school database (van gisteren)

(4)

Informatie opzoeken: voer een query uit

SQL Query

SELECT veld_A, veld_B, ...

FROM tabelnaam WHERE conditie ORDER BY veld_B;

Op zijn NLs

Maak een nieuwe tabel met daarin de kolommen veld_A, veld_B, enzovoorts.

Haal de waarden uit de tabel met naam tabelnaam. Kopieer alleen die rijen die aan de conditie voldoen. Sorteer de resultaattabel op veld_B.

(5)

Informatie opzoeken: voer een query uit

SQL Query

SELECT veld_A, veld_B, ...

FROM tabelnaam WHERE conditie ORDER BY veld_B;

Op zijn NLs

Maak een nieuwe tabel met daarin de kolommen veld_A, veld_B, enzovoorts.

Haal de waarden uit de tabel met naam tabelnaam. Kopieer alleen die rijen die aan de conditie voldoen. Sorteer de resultaattabel op veld_B.

(6)

Eenvoudige queries: namen van leerlingen

Selecteer de namen van alle leerlingen

SELECT achternaam FROM leerling;

Achternamen komen vaker voor: haal de dubbelen weg

Selecteer de namen van alle leerlingen; elke naam komt maar een keer voor; sorteer op alfabet (a-z)

SELECT DISTINCT achternaam FROM leerling

ORDER BY achternaam;

DISTINCT voor een veldnaam in de SELECT clausule verwijdert dubbelen in de resultaattabel.

(7)

Eenvoudige queries: namen van leerlingen

Selecteer de namen van alle leerlingen

SELECT achternaam FROM leerling;

Achternamen komen vaker voor: haal de dubbelen weg

Selecteer de namen van alle leerlingen; elke naam komt maar een keer voor; sorteer op alfabet (a-z)

SELECT DISTINCT achternaam FROM leerling

ORDER BY achternaam;

DISTINCT voor een veldnaam in de SELECT clausule verwijdert dubbelen in de resultaattabel.

(8)

Eenvoudige queries: namen en leeftijden van leerlingen

Selecteer de namen en leeftijden van alle leerlingen van 16 jaar en ouder, gesorteerd van oud naar jong

SELECT achternaam, 2010 − YEAR(geboorte_datum) AS leeftijd FROM leerling

WHERE 2010 − YEAR(geboorte_datum) >= 16 ORDER BY leeftijd DESC;

Je kunt eenvoudige rekensommen met velden maken. Hernoem een veldnaam metAS (werkt ook met tabellen). YEAR (datum) levert het jaar van een datum op.DESC en ASC in de ORDER BY clausule sorteert

respectievelijk aflopend of oplopend.

(9)

Eenvoudige queries: samengestelde condities

Selecteer de voornaam, achternaam en woonplaats van alle leerlingen die jonger zijn dan 16 en wiens

achternaam met een V begint

SELECT voornaam, achternaam, woonplaats FROM leerling

WHERE achternaam LIKE’V%’AND 2010 −YEAR(geboorte_datum) < 16;

LIKE voor patroonherkenning: % voor 0 of meer tekens; _ voor precies een teken. De conditie is een Booleaanse expressie.

(10)

Eenvoudige queries: samengestelde condities

Selecteer alle gegevens van alle leerlingen die jonger zijn dan 16 en wiens achternaam met een ‘V’ begint of de woonplaats met een ‘e’ eindigt

SELECT ∗ FROM leerling WHERE (

achternaamLIKE’V%’OR woonplaats LIKE’%e’

) AND 2010 − YEAR(geboorte_datum) < 16;

* in deSELECT clausule betekent “alle kolommen”.Let op de haakjes!

(11)

Aggregatiefuncies: samennemen van waarden in een kolom

Naast uitspraken en berekeningen met waarden in een rij kun je ook uitspraken doen over een hele kolom. Je gebruikt dan zogenaamde aggregatiefuncties. Deze komen alleen in deSELECTenHAVING clausule voor!

I COUNT( achternaam ): tel het aantal achternamen

I COUNT( DISTINCT achternaam ): tel het aantal achternamen, neem dubbelen niet mee. DISTINCT werk op alle aggregatiefuncties.

I MAX( geboorte_datum ): geef de jongste datum (= grootste waarde).

Veld moet sorteerbaar zijn

I MIN( geboorte_datum ): geef de oudste datum (= kleinste waarde). Veld moet sorteerbaar zijn

I AVG( ll_nr ): geef de gemiddelde datum (veld moet rekenbaar zijn, niet altijd zinnig ...)

I SUM( ll_nr ): tel alle prijzen op (veld moet rekenbaar zijn)

Vooral handig bijGROUP BY

(12)

Volledige SQL query

SQL Query

SELECT veld_A, veld_B, ...

FROM tabelnaam WHERE conditie_W GROUP BY veld_G HAVING conditie_H ORDER BY veld_B;

Op zijn NLs

Maak een nieuwe tabel met daarin de kolommen veld_A, veld_B, enzovoorts.

Haal de waarden uit de tabel met naam tabelnaam. Kopieer alleen die rijen die aan de conditie_W voldoen. Groepeer de resultatenperveld_G en neem alleen die groepen op die voldoen aan conditie_H.

Sorteer de resultaattabel op veld_B.

(13)

Volledige SQL query

SQL Query

SELECT veld_A, veld_B, ...

FROM tabelnaam WHERE conditie_W GROUP BY veld_G HAVING conditie_H ORDER BY veld_B;

Op zijn NLs

Maak een nieuwe tabel met daarin de kolommen veld_A, veld_B, enzovoorts.

Haal de waarden uit de tabel met naam tabelnaam. Kopieer alleen die rijen die aan de conditie_W voldoen. Groepeer de resultatenperveld_G en neem alleen die groepen op die voldoen aan conditie_H.

Sorteer de resultaattabel op veld_B.

(14)

Eenvoudige queries: geef het aantal leerlingen per klas

Het aantal leerlingen per klas

SELECT klas_nr, COUNT(ll_nr) AS aantal FROM leerling

GROUP BY klas_nr;

Elke leerling zit in een klas (vreemde sleutel klas_nr). Tel het aantal leerlingen en geef dat aantal en het klas_nr. Groepeer per klas_nr. Het effect: tel het aantal leerlingen per groep, dus per klas(nummer)

De resultaattabel bevat rijen die over groepen gaan, niet meer over losse rijen .... (probeer dit zelf uit, zorg dat je het verschil begrijpt)

(15)

Eenvoudige queries: welke leerling(en) is het oudst?

Het aantal leerlingen per klas

SELECT ∗, MIN(geboorte_datum) FROM leerling;

Let op, er kunnen meerdere leerlingen zijn met dezelfde kleinste

geboortedatum. Er zit er maar een in de resultaattabel (onbekend welke).

BTW onderstaande oplossingwerkt niet, waarom niet?

Het aantal leerlingen per klas

SELECT ∗ FROM leerling

WHERE geboorte_datum = MIN(geboorte_datum);

Oplossing?

(16)

Eenvoudige queries: welke leerling(en) is het oudst?

Het aantal leerlingen per klas

SELECT ∗, MIN(geboorte_datum) FROM leerling;

Let op, er kunnen meerdere leerlingen zijn met dezelfde kleinste

geboortedatum. Er zit er maar een in de resultaattabel (onbekend welke).

BTW onderstaande oplossingwerkt niet, waarom niet?

Het aantal leerlingen per klas

SELECT ∗ FROM leerling

WHERE geboorte_datum = MIN(geboorte_datum);

Oplossing?

(17)

Eenvoudige queries: geef het aantal leerlingen per klas, maar alleen van die klassen die minder dan 5 leerlingen hebben

Het aantal leerlingen per klas

SELECT klas_nr, COUNT(ll_nr) AS aantal FROM leerling

GROUP BY klas_nr HAVING COUNT(ll_nr) < 5 ORDER BY aantal;

DeHAVING clausule werkt alleen op groepen (de “WHERE” van GROUP BY, als het ware). Je mag er aggregatiefuncties gebruiken. De groepen worden gesorteerd van klein naar groot (de kleinste klas staat bovenaan).

(18)

Hoe leer ik SQL?

In principe zijn de meeste queries/opgaven niet overdreven moeilijk.

I Heel veel informatie: lastig te

verwerken/onthouden/reproduceren uit het hoofd

I Oefen: probeer voorbeelden uit en maak opgaven

I Voorbeelddatabases beschikbaar: download, XAMPP, phpmyadmin, importeer en je kunt aan de gang

I Het is handig om XAMPP thuis eens te installeren

I Zorg dat je het effect van een query begrijpt

I Zorg dat je zelf een query kunt schrijven: Geen trial-and-error

Maar: de opgaven worden steeds moeilijker. Zonder goede basis ga je onzin opschrijven en dat levert niets op (ook geen punten “voor het proberen” ...)

Referenties

GERELATEERDE DOCUMENTEN

De talen Frans en/of Duits en/of Engels kunnen facultatief aangeboden worden vanaf het derde jaar gewoon lager onderwijs, op voorwaarde dat de leerlingen het Nederlands

Omdat wij als Inwoners voor Inwoners (IVI) via deze krant willen communiceren met onze doelgroep, alle inwoners van De Ronde Venen, vroegen wij ons af hoe wij toch zo veel mogelijk

Wie komt er alle jaren Daar weer uit Spanje varen. Over de grote

1 Voor het eerste gebruik 2 Tablet Start 3 Android Home scherm 3.1 Widgets en snelkoppelingen toevoegen aan uw Home scherm 3.2 Achtergrond instellen 3.3 Menu Applicaties 4 Uw

Op 15 oktober vorig jaar ging ik in Amsterdam lekker voor mezelf lopen op zoek naar de lach op de finish.. Met een rustige opbouw startte ik op vijf dertig om iets te versnellen

Het huis is dan ook niet enkel beveiligd door het slot, maar ook door het gegeven dat er zicht van derden op staat, bijvoorbeeld de buren of voorbijgangers, en omdat er altijd

method 1 uses the standard SQL SELECT command where the probability is automatically added to the results; method 2 also uses the standard SQL SELECT command but when the probability

In order to improve the usability of our tool, and to answer the second research question, we will also create a static checker that checks the intermediate representation to see if