Yourhosting

Tutorial ANSI SQL-92

Inhoud

SQL leren
DML: het opvragen van gegevens
-Selecteren
-Sorteren
-Criterium
-Criteria
-Aantal rijen limiteren in MySQL
-Aantal rijen limiteren in MSSQL
-Kolommen hernoemen met AS
-Functies in SQL
-Berekeningen in SQL
-Nog meer handige operators
-Joins (deel 1)
-Joins (deel 2)
-Subquery's
-Datum en tijd functies
DML: het invoegen van gegevens
-INSERT
-REPLACE
DML: het bewerken van gegevens
-UPDATE
-Rekenen met UPDATE
DML: het verwijderen van gegevens
-SELECT
-SELECT DISTINCT
-ORDER BY
-WHERE
-AND
-OR
-NOT
-LIMIT
-TOP
-AS
-ROUND()
-LEN()
-UCASE()
-LCASE()
-CONCAT()
-LEFT()
-RIGHT()
-REPLACE()
-INSTR()
-COUNT()
-MIN()
-MAX()
-SUM()
-AVG()
-BETWEEN
-IN
-LIKE
-NULL
-GROUP BY
-HAVING
-Cross JOIN
-INNER JOIN
-LEFT OUTER JOIN
-RIGHT OUTER JOIN
-FULL OUTER JOIN
-SELF JOIN
-IN
-EXISTS
-ALL
-ANY
-CURRENT_DATE()
-CURRENT_TIME()
-CURRENT_TIMESTAMP()
-GETDATE()
-NOW()
-DATE()
-YEAR()
-INSERT
-REPLACE
-UPDATE

SQL leren

SQL is een taal waarmee met databases wordt gecommuniceerd. Met alle databases! Daarvoor is een standaard ontwikkeld waaraan alle databaseontwikkelaars zich in principe moeten houden. Deze standaard is ANSI SQL dat staat voor American National Standardisation Institute - Structured Query Language.

ANSI SQL-92 is de huidige standaard die wordt gebruikt.

MySQL is een database type, net zoals acces, MSSQL (= SQL SERVER), DB2, PostgreSQL, Oracle, Ingress, Informix, Whatcom, Paradox etc.

Ieder databasetype behoort dus te communiceren via ANSI SQL. Dit is in principe ook zo, maar toch wijken de database types af. Dit komt doordat er bij bepaalde databases functies en commando's werken die bij andere databasetypes niet werken. Bijvoorbeeld de functie auto_increment bij MySQL. Dit is een functie van MySQL en daarmee kan via SQL (de taal) gecommuniceerd worden. Probeer je dezelfde query met auto_increment op een andere databasetype, dan werkt het niet omdat die database de hele functie niet kent. Dus kan het zijn dat de SQL waarmee je met database 1 communiceert, niet werkt voor database 2.

Voor de duidelijkheid: MySQL is geen taal, maar een databasetype die communiceert via SQL.

De taal SQL kan onderverdeeld worden in een aantal subtalen. De belangrijkste zijn :

DML: Data Manipulation Language. Dit is het gedeelte van SQL waarbij je gegevens in de database toevoegt, gegevens uit de database opvraagt, gegevens in de database bewerkt.

DDL: Data Defenition Language. Met dit gedeelte maak en bewerk je de structuur van de database en de databasetabellen.

De commando's die gebruikt worden heten query's. De gebruikte query's zijn getest op een MySQL database en een MSSQL database. In deze tutorial wordt uitsluitend het gebruik van DML uitgelegd. In een volgende tutorial komt DDL aan de orde Wink

Als je wilt zoeken in deze tutorial dan kan dat met behulp van CTRL F.

naar boven

DML: het opvragen van gegevens

Selecteren

Het opvragen van gegevens gebeurt met het SELECT commando. De meest eenvoudige SELECT query ziet er zo uit:

SELECT kolomnaam
FROM tabelnaam ;

Stel dat dit één van de tabellen uit de database is (gegevens zijn fictief. Tabel is niet genormaliseerd.).
Deze tabel noemen we leden:

id naam leeftijd woonplaats functie berichten geboren
1 Anouk 20 Jamaica Admin 1203 1985-01-05
2 Leejoo 30 Londen Admin 152 1974-07-28
3 Hans 18 Parijs Moderator 627 1984-11-05
4 Feppie 18 New York Moderator 1084 1984-09-09
5 Jim 25 Oegstgeest Moderator 565 1980-02-01
6 Flance 18 Bermuda Moderator 3255 1985-01-30
7 Donny_nl 27 Rio Moderator 834 1977-05-31
8 Jasper_van 21 Parijs Reporter 2494 1983-06-27

Als we de namen uit de tabel willen selecteren krijgen we de volgende query:

SELECT naam
FROM leden ;

We krijgen dan als resultaat:

naam
Anouk
Leejoo
Hans
Feppie
Jim
Flance
Donny_nl
Jasper_van

Als we de namen en het aantal berichten uit de tabel willen selecteren krijgen we de volgende query:

SELECT naam, berichten
FROM leden ;

We krijgen dan als resultaat:

naam berichten
Anouk 1203
Leejoo 152
Hans 627
Feppie 1084
Jim 565
Flance 3255
Donny_nl 834
Jasper_van 2494

Als we de functies uit de tabel willen selecteren krijgen we de volgende query:

SELECT functie
FROM leden ;

We krijgen dan als resultaat:

functie
Admin
Admin
Moderator
Moderator
Moderator
Moderator
Moderator
Reporter

Je ziet dat sommige functies meerdere keren voorkomen. Dat komt omdat we in de query gezet hebben dat wel alle resultaten willen. Om te voorkomen dat we dubbele resultaten krijgen gebruiken we het commando DISTINCT . De query komt er dan als volgt uit te zien:

SELECT DISTINCT functie
FROM leden ;

We krijgen dan als resultaat:

functie
Admin
Moderator
Reporter

Als je alle gegevens uit alle kolommen wilt halen kun je of alle kolommen noemen in je query, dus:

SELECT id,naam,leeftijd,woonplaats,functie,berichten,geboren
FROM leden ;

Of je maakt gebruik van de asteriks (*). De query komt er dan zo uit te zien:

SELECT *
FROM
leden ;

naar boven

Sorteren

Gegevens uit een tabel kunnen ook gesorteerd opgevraagd worden. Om te sorteren gebruiken we het commando ORDER BY . Het sorteren kan op 2 manieren; oplopend en aflopend. In het Engels is dat ascending en descending. In SQL wordt dat afgekort naar de commando's ASC en DESC
Stel dat je de namen uit de tabel wilt hebben maar dan gesorteerd op het aantal berichten met de persoon met het hoogste bericht bovenaan. De query komt er dan zo uit te zien:

SELECT naam,berichten
FROM leden
ORDER BY berichten DESC ;

Die geeft het resultaat:

naam berichten
Flance 3255
Jasper_van 2494
Anouk 1203
Feppie 1084
Donny_nl 834
Hans 627
Jim 565
Leejoo 152

Resultaten worden in principe altijd oplopend getoond. Je kunt het commando ASC dus eigenlijk weglaten. Een alternatieve query waarbij je ook bovenstaand resultaat krijgt is deze:

SELECT naam,berichten
FROM leden
ORDER BY 2 DESC ;

De 2 in deze query staat voor het tweede 'te selecteren' item in de query, oftwel de berichten.

Ook is het mogelijk om random te selecteren. Dit is niet echt ordenen, want het is random, maar het is wel een makkelijke functie. Je kunt gebruik maken van de functie RAND() om random te selecteren

SELECT naam
FROM leden
ORDER BY RAND() ;

naar boven

Criterium

Als je bepaalde rijen wilt selecteren die moeten voldoen aan 1 of meerdere voorwaarden, of juist niet moeten voldoen aan 1 of meerdere voorwoorden gebruiken we het commando WHERE. In onderstaand voorbeeld gaan we de namen selecteren van iedereen die de functie Moderator heeft. De query wordt dan:

SELECT naam,functie
FROM leden
WHERE functie = 'Moderator' ;

We krijgen dan dit resultaat:

naam functie
Hans Moderator
Feppie Moderator
Jim Moderator
Flance Moderator
Donny_nl Moderator

De basis syntax voor de query is:

SELECT kolommen
FROM tabel
WHERE criterium ;

Dit criterium is opgebouwd uit 3 onderdelen:

kolomnaam operator veldwaarde

De volgende operators kunnen in SQL gebruikt worden:

naar boven

Criteria

Als je resultaten wilt hebben die aan meerdere criteria moeten voldoen kun je gebruik maken van de commando's AND, OR en NOT .

Stel dat we alle namen willen hebben van de mensen die de leeftijd van 20 jaar of ouder hebben en niet de functie van Admin hebben. De query komt er dan zo uit te zien:

SELECT naam
FROM leden
WHERE leeftijd >= '20'
AND functie <> 'Admin' ;

De resultaten zullen dan zijn:

naam
Jim
Donny_nl
Jasper_van

Als we allen namen willen hebben van de mensen die de leeftijd hebben van 18 jaar of meer dan 1000 berichten hebben krijgen we onderstaande query:

SELECT naam
FROM leden
WHERE leeftijd = '18'
OR berichten > '1000' ;

Dit geeft de resultaten:

naam
Anouk
Hans
Feppie
Flance
Jasper_van

Je ziet dat Anouk en Jasper_van geen 18 zijn en toch worden geselecteerd. Dat komt omdat zij wel aan het tweede criterium voldoen. Ze hebben namelijk meer dan 1000 berichten.

Met NOT kun je een bewering omdraaien in de query. Stel dat we alle rijen willen hebben waar de woonplaats niet Parijs is. Een van de query's die dit resultaat oplevert is:

SELECT *
FROM
leden
WHERE NOT woonplaats = 'Parijs' ;

Dit resultaat kun je ook krijgen door deze query te gebruiken:

SELECT *
FROM
leden
WHERE woonplaats <> 'Parijs' ;

Het is maar net wat je makkelijker vind.

naar boven

Aantal rijen limiteren in MySQL

Je kunt ook het aantal rijen dat je selecteert beperken (limiteren) door gebruik te maken van het commando LIMIT . Stel dat je de naam van de persoon wilt hebben die de meeste berichten hebt. We moeten dan een query maken die sorteert op berichten en slechts 1 rij selecteert. De query komt er dan zo uit te zien:

SELECT naam
FROM leden
ORDER BY berichten DESC
LIMIT
1 ;

Totaan LIMIT 1 zul je de query moeten begrijpen, dat is allemaal behandeld. LIMIT 1 geeft aan dat de query moet stoppen na het 1e resultaat. De query ordent eerst alle rijen naar het aantal berichten aflopend, vervolgens pakt hij de 1e rij daarvan.

Stel dat we alleen de namen willen weten van de eerste 3 personen met de meeste berichten. Dan moeten we een extra parameter opgeven zodat de query weet dat er maar 3 resultaten gewenst zijn. De query komt er dan zo uit te zien:

SELECT naam
FROM leden
ORDER BY berichten DESC
LIMIT
0,3 ;

Je ziet dat er nu na LIMIT 2 getallen staan. Het eerste getal, de 0, staat voor de 1e rij. Het tellen begint in SQL bij 0. Het tweede getal is het aantal rijen dat geselecteerd moet worden. In dit geval 3 dus. Bovenstaande query geeft als resultaat:

naam
Flance
Jasper_van
Anouk

Als we alleen de namen willen weten van de personen die op 1 en op 2 na de meeste berichten hebben wordt de query als volgt:

SELECT naam
FROM leden
ORDER BY berichten DESC
LIMIT
1, 2 ;

Dit geeft als resultaat:

naam
Jasper_van
Anouk

Het gebruik van LIMIT is geen ANSI-SQL, maar een functie van MySQL. Dit zal dus waarschijnlijk niet op een ander databasetype werken.

naar boven

Aantal rijen limiteren in MSSQL

MSSQL kent het LIMIT gebeuren helaas niet. Maar kent wel een soortgelijk commando. In MSSQL kun je gebruik maken van TOP. Dit heeft echter wel z'n beperkingen omdat je niet midden in een tabel kunt selecteren zoals met LIMIT in MySQL wel. Als je de eerste 5 entries wilt hebben kun je deze query gebruiken in MSSQL:

SELECT TOP 5 naam
FROM leden ;

Dit geeft het resultaat:

naam
Anouk
Leejoo
Hans
Feppie
Jim

Om resultaten te krijgen die midden in een tabel zetten zul je een wat geavanceerdere query moeten maken. Daar ga ik nu niet op in. Dit komt later nog aan bod. Het gebruik van TOP is geen ANSI-SQL, maar een functie van MSSQL. Dit zal dus waarschijnlijk niet op een ander databasetype werken.

naar boven

Kolommen hernoemen met AS

Bij query's in scripts zie je heel vaak dat bepaalde kolommen hernoemt worden met behulp van AS. Hieronder ga ik in op vragen als: hoe werkt dat? En waarom wordt dat gebruikt?

Stel dat je een query gebruikt zoals deze:

SELECT ROUND(AVG(leeftijd),1)
FROM leden ;

Je wilt de gemiddelde leeftijd berekenen, afgerond op 1 decimaal. Je voert de query uit in je script en wilt de resultaten in een while loop binnenhalen. Maar hoe heet nu het veld dat je nodig hebt om de resultaten weer te geven? Die naam kun je zelf geven door het resultaat in de query al een naam te geven. In dit geval noemen we het veld gem, van gemiddeld. De query komt er dan zo uit te zien:

SELECT ROUND(AVG(leeftijd),1) AS gem
FROM leden ;

Het hernoemen van kolommen wordt vooral gebruikt wanneer query's lang en onoverzichtelijk worden. Als je voor jezelf duidelijke namen geeft aan resultaten werkt dat een stuk makkelijker. Later bij het gebruik van meerdere tabellen door elkaar (JOINS en subquery's) en bij functies zul je zien dat AS heel makkelijk is.

naar boven

Functies in SQL

De taal SQL kent verscheidene functies die gebruikt kunnen worden om de data in de database te manipuleren. Het aanroepen van functies in SQL lijkt op het aanroepen van functies in programmeertalen zoals C++, PHP en JavaScript. Eerst komt de functienaam, gevolgd door een haakje openen, parameters, haakje sluiten, oftewel:

functie(parameters)

Hieronder zal ik kort een paar belangrijke functies bespreken en er voorbeelden bij zetten. Een aantal functies in SQL kunnen gebruikt worden in het te selecteren gedeelte maar ook in als criterium.

Stel dat we de gemiddelde leeftijd willen weten van deze groep, afgerond op 1 decimaal. Dan kun je de functies binnen functies gebruiken en krijg je een query zoals deze:

SELECT ROUND(AVG(leeftijd),1)
FROM leden ;

Het resultaat van deze query is: 22.1

Later in deze tutorial wordt expliciet in gegaan op de functie DATE. Deze is nl. erg belangrijk en kent vele mogelijkheden.

naar boven

Berekeningen in SQL

Het is mogelijk om direct in de query berekeningen uit te voeren met waarden. Dit is echter wel beperkt tot het gebruik van 4 operators;

+ : optellen
- : aftrekken
/ : delen
* : vermenigvuldigen

Rekenen kan uiteraard alleen met getallen en niet met tekst. Stel dat we van iedereen uit de tabel de helft van het aantal berichten willen weten. De query daarvoor is:

SELECT berichten * 0.5 AS halve_berichten
FROM leden ;

Dit resulteert in:

halve_berichten
601.5
76.0
313.5
542.0
282.5
1627.5
417.0
1247.0

Stel dat we een derde willen hebben van de som van de berichten en de leeftijd afgerond op 1 decimaal. Dan zou dus de berekening zijn: (berichten + leeftijd) / 3 . In de query wordt dit dan:

SELECT ROUND(((berichten + leeftijd) / 3),1) AS cijfers
FROM leden ;

Dit geeft de resultaten:

cijfers
407.7
60.7
215.0
367.3
195.0
1091.7
287.0
838.3

Tot zover de berekeningen.

naar boven

Nog meer handige operators

naar boven

Joins (deel 1)

Het komt natuurlijk heel vaak voor dat je gegevens nodig hebt uit meer dan 1 tabel. Hiervoor zul je query's moeten maken die tabellen onderling met elkaar verbindt en hieruit de juiste gegevens selecteert. Dit doen met een zogenaamde JOIN. Er zijn heel veel type joins. Omdat niet alle join-types worden ondersteunt in alle databases behandel ik hieronder de meest voorkomende. Hieronder volgt een opsomming van een aantal joins. Die met een sterretje behandel ik in deze tutorial.

Crossjoin*, Innerjoin*, Left Outer join*, Right Outer join*, Full Outer join*, Self join*, Equi-join, Non-qui-join, Thetajoin, Naturaljoin.

We hebben gezien hoe je resultaten kunt verkrijgen door 2 tabellen te combineren. De voorbeelden die we gebruikt hebben kunnen we uitleggen met onderstaand figuur. De tabellen (de cirkels) die elkaar gedeeltelijk overlappen:

Figuur 1

Met een INNER JOIN kunnen we de resultaten uit het gedeelte M halen. Met een LEFT JOIN (leden LEFT JOIN berichten) kunnen we de resultaten verkrijgen uit het gedeelte L. De RIGHT JOIN (leden RIGHT JOIN berichten) stelt ons in staat om de resultaten uit gedeelte R te verkrijgen.

naar boven

Joins (deel 2)

Tot zover de joins. T.z.t. zal dit nog uitgebreid worden.

naar boven

Subquery's

Als je in een query het resultaat nodig hebt van een andere query kun je dit bereiken door middel van een subquery. Waar kun je een subquery in je query gebruiken?

MySQL ondersteunt subquery's vanaf MySQL versie 4.1.7. Aangezien ik deze versie niet tot m'n beschikking heb zijn alle onderstaande subquery's getest op MSSQL.

Je ziet dat je dus met subquery's heel makkelijk resultaten kunt verkrijgen die je met JOINS ook wel kunt krijgen, maar dan op een wat ingewikkeldere manier. Dit zijn slechts 3 voorbeelden want met subquery's lijken de mogelijkheden eindeloos.

naar boven

Datum en tijd functies

SQL kent verscheidene functies waarmee berekeningen kunnen worden uitgevoerd met datums en tijden. Bij iedere databasetype zijn er diverse functies die uitsluitend bij dat databasetype werken. Hieronder geef ik er een aantal die volgens de ANSI norm op ieder databasetype zou moeten werken.

De functionaliteit van het rekenen met data en tijden is eindeloos. Vooral MySQL heeft in vergelijking met andere databasetypes erg veel functies om te kunnen rekenen met data en tijden.

Hieronder staan een aantal links van websites waar de functies en berekeningen zeer uitvoerig worden besproken

MySQL:
http://dev.mysql.com/doc/mysql/en/date-and-time-functions.html

MSSQL:
http://www.databasejournal.com/features/mssql/article.php/10894_2197931_1

PostgreSQL:
http://www.postgresql.org/docs/7.4/interactive/functions-datetime.html

naar boven

DML: het invoegen van gegevens

Als we gegevens in willen voegen in een tabel kan dat met 2 commando's. Het INSERT commando en het REPLACE commando. Het laatste commando is geen ANSI SQL, deze werkt alleen op de MySQL database, maar kan erg handig zijn. Vandaar dat ik deze hier bespreek.

INSERT

Met INSERT voegen we gegevens toe in een tabel. De basis syntax is:

INSERT INTO tabel (kolommen)
VALUES ('waarden') ;

Als we de tabel leden willen uitbreiden met een nieuw lid, dan krijgen we onderstaane query:

INSERT INTO leden (id,naam,leeftijd,woonplaats,functie,berichten,geboren)
VALUES ('9','Ome Willem','45','Bestaatnietstraat','Reporter','0','1961-08-09') ;

Er is nu een rij toegevoegd in de tabel leden. Een alternatieve schrijfwijze is dit:

INSERT INTO leden
VALUES ('9','Ome Willem','45','Bestaatnietstraat','Reporter','0','1961-08-09') ;

Je ziet dat nu de kolomnamen zijn weggelaten en alleen de waarden worden beschreven. Dit kan erg riskant zijn als je een grote tabel hebt. 1 kolom vergeten bij de waarden en je kunt de query opniew doen.
Bij MySQL bestaat het commando auto_increment, wat zoveel wil zeggen dat die kolom automatisch met 1 wordt opgehoogd. Stel dat de kolom id van de tabel leden in MySQL auto_increment is. Dan wordt deze kolom dus automatisch opgehoogd met 1. De query kan dan volstaan met:

INSERT INTO leden (naam,leeftijd,woonplaats,functie,berichten,geboren)
VALUES ('Ome Willem','45','Bestaatnietstraat','Reporter','0','1961-08-09') ;

In bovenstaande query hebben we de kolomnaam id weggelaten en de waarde die deze kolom in deze rij zou moeten krijgen. Persoonlijk vind ik dit een erg handige functie van MySQL. In sommige andere databasetypes is er wel een vergelijkbare functie.
Ook is het mogelijk om meerdere rijen tegelijk in te voegen zonder daarvoor aparte query's te hoeven maken. Stel dat we 2 rijen willen toevoegen in 1 query, de query wordt dan:

INSERT INTO leden (naam,leeftijd,woonplaats,functie,berichten,geboren)
VALUES ('Ome Willem','45','Bestaatnietstraat','Reporter','0','1961-08-09'),
('Kermit','80','Sesamstraat','Moderator','0','1921-04-12') ;

Je ziet dat de volgende rij eenvoudigweg gescheiden wordt door een komma gevolgd door de gegevens van de 2e rij die ingevoegd moet worden.

naar boven

REPLACE

Het REPLACE commando in MySQL is eigenlijk hetzelfde commando als het INSERT commando met dit verschil dat REPLACE eerst, een al bestaande rij, met daarin een unieke waarde of primairy key, verwijdert zodat er geen dubbele waarde in komen. Dit commando vind ik zelf heel handig bij sessie en cookie registratie. Stel dat we in de tabel logins een wijziging hebben. Jasper_van heeft opnieuw ingelogd. De data in de tabel logins wordt dan in MySQL op deze manier bijgewerkt. De kolom id is de primairy key. We krijgen dan de query:

REPLACE INTO logins (id, datum_tijd, cookie)
VALUES ('8','2005-02-12','14:41:02') ;

Na deze query wordt eerst de rij verwijderd waarin id = 8 is. Daarna wordt er een nieuwe rij ge-insert met id = 8. Het gebruik van REPLACE is wel stukken langzamer dan INSERT, maar kan dus wel heel handig zijn.

Bij zowel INSERT als REPLACE is het niet nodig om enkele quotes te gebruiken bij waarden als die waarden (en kolomtypes) numeriek zijn. In de tabel leden zijn de kolommen id, leeftijd en berichten van het type INT en dus numeriek. De query:

INSERT INTO leden
VALUES ('9','Ome Willem','45','Bestaatnietstraat','Reporter','0','1961-08-09') ;

kan dus ook zo geschreven worden:

INSERT INTO leden
VALUES (9,'Ome Willem',45,'Bestaatnietstraat','Reporter',0,'1961-08-09') ;

waarbij de waarden van de kolommen id, leeftijd en berichten zonder quotes geschreven zijn. De ANSI standaard laat dit echter aan de programmeur zelf over. Het mag zonder quotes, het mag met quotes.

naar boven

DML: het bewerken van gegevens

UPDATE

Het bewerken van gegevens gebeurt met het commando UPDATE. Dit commando UPDATE de aangegeven kolommen in de aangegeven rijen. De basis syntax is:

UPDATE tabel
SET kolom = 'waarde', kolom2 = 'waarde2'
WHERE criteria ;

Stel dat de tabel leden willen aanpassen want Flance is verhuist, z'n functie is gewijzigd en z'n berichtenaantal is gestegen. We krijgen dan de query:

UPDATE leden
SET woonplaats = 'sexbierum', functie = 'Admin', berichten = 3391
WHERE id = 6 ;

De tabel leden waar het id nummer 6 is wordt nu geupdate. Als we het WHERE commando hadden weggelaten en dus de query hadden gekregen:

UPDATE leden
SET woonplaats = 'sexbierum', functie = 'Admin', berichten = 3391 ;

Dan was iedere rij in de tabel leden geupdate met deze gegevens. Daarom is de WHERE statement erg van belang bij het UPDATE commando. De eerste UPDATE query had ook dit kunnen zijn:

UPDATE leden
SET woonplaats = 'sexbierum', functie = 'Admin', berichten = 3391
WHERE naam = 'Flance' ;

we hebben dus het WHERE statement aangepast. Nu wordt iedere rij, waar de naam Flance is, geupdate met bovenstaande gegevens. Let er daarom op dat je zoveel mogelijk de unieke waarde of primairy key neemt als criterium voor een enkele rij UPDATE.

naar boven

Rekenen met UPDATE

Ook is het mogelijk om te rekenen binnen een UPDATE. Voorwaarde hiervoor is wel de kolom een numeriek type is zoals INT of TINYINT. Ook is het mogelijk om te rekenen met kolommen die van het type DATETIME en andere tijdsindex hebben. Stel dat we in de tabel leden de kolom berichten om een of andere reden willen ophogen met 10. Dus dat alle leden 10 extra berichten krijgen. We zullen dan de query moeten maken die de kolom update met 10:

UPDATE leden
SET berichten = berichten + 10 ;

Als je deze query uitvoert zullen alle berichten van alle leden worden opgehoogd. Je kunt hier ook criteria aan stellen net zoals in de voorbeelden hierboven.

naar boven

DML: het verwijderen van gegevens

Het verwijderen van rijen in een tabel doen we met het commando DELETE. De basis syntax is:

DELETE FROM tabel
WHERE criteria ;

dit commando verwijdert hele rijen tegelijk. Het is dus cruciaal om duidelijk aan te geven aan welke voorwaarden de criteria moeten voldoen om niet de verkeerde gegevens te verwijderen. Als we de criteria weg zouden laten en deze query uitvoeren:

DELETE FROM tabel ;

dan worden alle rijen uit die tabel verwijderd. We krijgen dan dus een legen tabel. Stel dat we uit de tabel leden de rij willen verwijderen waar de naam 'Ome Willem' is. De query wordt dan:

DELETE FROM leden
WHERE id = 9 ;

Net zoals bij het UPDATE commado maken we bij de criteria zoveel mogelijk gebruik van de unieke waarde of primairy key. Zouden we dit doen:

DELETE FROM leden
WHERE naam = 'Ome Willem' ;

dan zouden alle rijen waar de naam 'Ome Willem' is worden verwijderd. In ons voorbeeld is dat slechts 1 rij. Maar in een grote tabel met veel leden is het niet onwaarschijnlijk dat mensen dezelfde naam hebben. Vandaar dus dat het criteria zoveel mogelijk de unieke waarde of primairy key moeten zijn wanneer je 1 specifieke rij wilt verwijderen.

In MySQL kwamen we al eerder het commando LIMIT tegen. Dit commando kan ook gebruikt worden bij het verwijderen van rijen als extra zekerheid. De query zou dan worden:

DELETE FROM leden
WHERE id = 9
LIMIT 1 ;

Het is in principe niet nodig, maar voor de zekerheid kun je dit erbij plaatsen.

naar boven

-----------

Tot zo ver DML in SQL, het opvragen, invoegen, wijzigen en verwijderen van gegevens uit een database m.b.v. SQL.
Ik hoop dat jullie er wat van geleerd hebben. Mocht je fouten tegenkomen (nobody's perfect) laat me dit dan s.v.p. weten op donny at semeleer dot nl . Uiteraard zijn op- en aanmerkingen ook van harte welkom! Kijk ook eens op mijn Google Plus account.

Eén van de volgende tutorials gaat dus over DDL, de SQL die nodig is om tabelstructuren te maken en te onderhouden.

-----------

Overige SQL tutorials:

-----------

Interessante links:

-----------

Naslagwerken gebruikt voor deze tutorial:

SQL voor MySQL ontwikkelaars door Rick f. van der Lans, ISBN 978 90 12 12150 7
Basis ANSI SQL van Computrain

Websites gebruikt voor deze tutorial:

http://www.sqlteam.com
http://www.mysql.com
http://developer.mimer.se/validator/parser92/index.tml
http://www.databasejournal.com
http://www.postgresql.com
http://www.w3schools.com/sql/sql_intro.asp

-----------

Dank gaat uit naar :

M'n Uitvaartverzekering verstrekker.
En dit gezellig cafe in Rotterdam.
Bezoek ook de website van onze sponsor Conservatrix Levensverzekeringen.

-----------

Deze tutorial is gemaakt door Donny Semeleer (Donny_nl). Niets van deze tutorial mag gebruikt worden zonder schriftelijke toestemming van de maker. De gebruikte gegevens zijn fictieve gegevens. Copyright © 2005-2011 D. Semeleer. Laatst geupdate op 23 juli 2007.
Valid XHTML 1.0 Transitional Valid CSS!