6. SQL

In dit hoofdstuk leert u eenvoudige SQL (Structured Query Language) queries te maken en te gebruiken. Mocht u hier meer over willen weten dan kunt u overwegen een training SQL Basis te volgen.

Het onderstaande is slechts bedoeld om u een idee te geven van wat SQL is, zodat we er in het volgende hoofdstuk gebruik van kunnen maken. Met name de INSERT en SELECT commando's zijn belangrijk!

6.1. CREATE

Als u in het vorige hoofdstuk het SQL script dat de tabellen in de database aanmaakte bestudeerd heeft, zult u waarschijnlijk CREATE commando's gezien hebben. Met CREATE kunt u nieuwe tabellen aanmaken binnen de database. De structuur van CREATE is als volgt:

CREATE tabelnaam (
  kolomnaam  datatype  [integriteitsregel],
  [...  ...  [...], ]
  PRIMARY KEY (kolomnaam)
) [tabelspecificatie]

Opmerking: de bovenstaande notatie zijn alle woorden in hoofdletters zogenaamde key words, alles wat tussen [ en ] staat is optioneel. De hele regel die tussen [ en ] staat mag meerdere malen herhaald worden.

Een ingevuld voorbeeld ziet er zo uit:
CREATE TABLE `personen` (
  `id` int(11) NOT NULL auto_increment,
  `naam` varchar(50) collate latin1_general_ci NOT NULL,
  `email` varchar(100) collate latin1_general_ci default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
Er wordt hier een tabel personen aangemaakt met 3 kolommen: id, naam en email. Verder wordt de kolom id als primary key aangemerkt, en krijgt deze de eigenschap auto_increment mee, hetgeen wil zeggen dat de waarde altijd met 1 opgehoogd wordt ten opzichte van de vorige, waardoor er nooit dubbele waarden ontstaan.

6.2. INSERT

Het INSERT commando wordt gebruikt om in een tabel rijen toe te voegen. We kunnen hiermee bijvoorbeeld alvast wat bezoekers met reacties in de database zetten. We kunnen het ook in ons verwerk.php script opnemen om informatie uit het formulier naar de database te sturen.

De structuur is als volgt:

INSERT INTO personen
  [(kolomnaam,
    ...)]
  VALUES (
    veldwaarde [,
    veldwaarde,
    ...]
  )

Een voorbeeld hiervan is:

INSERT INTO personen
  (naam,
   email)
  VALUES (
    'Piet Jansen',
    'piet@email.nl'
  )

Opdracht 6.1.

  1. In deze opdracht wordt ervan uitgegaan dat de tabellen personen en reacties aangemaakt zijn. Kijk eventueel in het vorige hoofdstuk om te lezen hoe dit moet.
  2. Open http://localhost/phpmyadmin/, en ga naar de tabel reacties.
  3. Kies rechts voor het tabblad SQL (sql).
  4. Plak in het venster dat verschijnt het bovenstaande voorbeeldscript.
  5. Druk op Go (of start) om de query tegen de database reacties te draaien (zoals dat heet).
  6. Het resultaat is dat Piet Jansen in de tabel personen ingevoegd wordt.
  7. Voeg zelf 4 andere (fictieve) personen toe door de waarden in de query te veranderen en deze opnieuw te draaien.
  8. Voer ook onderstaand script uit
    INSERT INTO reacties
      (persoon_id,
       reactie,
       datum)
      VALUES (
        '1',
        'dit is piets reactie!',
        '2007-12-01 15:00:00'
      )
    
  9. Voeg zelf zes reacties toe, en koppel ze aan de personen die je net aanmaakte door persoon_id aan te passen (Als het goed is bestaan persoon_id 1 t/m 4), er zijn dan dus twee personen met twee reacties (of ꨮ persoon met drie).
  10. We hebben nu in de tabel personen 4 rijen en in de tabel reacties 6 rijen.
  11. Controleer dit door in het tabblad Structuur (structuur) te kijken.

6.3. DELETE

Verwijderen uit de database is erg eenvoudig, maar ook gevaarlijk. Voor je het weet gooi je een hele tabel leeg! Let dus goed op als je het DELETE commando gebruikt! Het DELETE commando ziet er zo uit:
DELETE FROM tabelnaam
[WHERE voorwaarde [...]]
Het weglaten van het WHERE gedeelte zorgt voor het legen van de hele tabel. De WHERE restrictie zou er uit kunnen zien als: WHERE id = 5.

Opdracht 6.2.

  1. Open wederom het tabblad SQL in PhpMyAdmin
  2. Maak zelf een query die 1 rij uit de tabel reacties verwijdert, maak gebruik van het zojuist genoemde voorbeeld.
  3. Voer deze query uit.
  4. We hebben nu in de tabel personen 4 rijen en in de tabel reacties 5 rijen.
  5. Controleer dit weer door in het tabblad Structuur te kijken.

6.4. UPDATE

Het kan gebeuren dat er iets veranderd moet worden in de database gegevens. Het is natuurlijk mogelijk een rij te verwijderen en de aangepaste rij weer toe te voegen. Maar het kan makkelijker met het UPDATE commando. De structuur (of syntax) hiervan is:
UPDATE tabelnaam
SET kolomnaam = nieuwewaarde [, ... = ... [, ...]]
[WHERE voorwaarde [...]]

Het weglaten van de WHERE restrictie zorgt er in dit geval voor dat ૬e rijen in de tabel aangepast worden! Verder is het mogelijk meerdere kolommen tegelijk aan te passen. Zo kunnen bijvoorbeeld naam en email adres in de tabel personen tegelijk aangepast worden.

Een query om bijvoorbeeld Piet in Klaas te veranderen (in het onrealistische geval dat Piet zijn naam in Klaas veranderd) ziet er zo uit:

UPDATE personen
SET naam = 'Klaas Jansen', email = 'klaas@email.nl'
WHERE id = 1

6.5. SELECT

SELECT is waarschijnlijk de meest gebruikte query, de functie van dit commando is het bevragen van de data, de data kan er niet mee veranderd of verwijderd worden. De meest eenvoudige structuur is:
SELECT kolomnaam [, kolomnaam [,...]]
FROM tabelnaam
[WHERE voorwaarde [...]]
Hier zorgt het weglaten WHERE restrictie voor het teruggeven van ૬e rijen. Als we bijvoorbeeld alle e-mailadressen van mensen met de naam Klaas Jansen willen krijgen voeren we de volgende query uit:
SELECT email
FROM personen
WHERE naam = 'Klaas Jansen'
Het uitvoeren van deze query levert een scherm op vergelijkbaar met het volgende:

select

6.5.1. JOINS

Het komt vaak voor dat we data uit meerdere tabellen willen combineren. Het voert te ver om hier een volledige uitleg te geven over hoe zogeheten joins exact werken, maar met behulp van joins is dit mogelijk. Hieronder volgt een eenvoudig voorbeeld waarmee alle reacties met daarbij de naam en e-mailadres van de auteur.
SELECT personen.naam, personen.email, reacties.reactie, reacties.datum
FROM personen, reacties
WHERE reacties.persoon_id = personen.id

Opdracht 6.3.

  1. Als het goed is weet u inmiddels hoe u een query uit moet voeren, kijk eventueel bij eerdere opdrachten
  2. Voer bovenstaande query uit
  3. Bekijk het resultaat
  4. Als één persoon meerdere berichten heeft geschreven komt deze ook meerdere keren voor in het resultaat, dit terwijl de naam en het e-mailadres maar één keer in de tabel personen staan!