SELECT
FROM
JOIN ... ON
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT
-- Basis
SELECT kolom1, kolom2, kolom3 FROM tabelnaam
Je kan ook een kolom gebruiken om een berekening te maken.
Je kan een nieuwe kolom maken met AS. Gebruik enkele quotes of backticks bij meerdere woorden. */
SELECT Productnaam, PrijsPerEenheid, PrijsPerEenheid * 1.33 AS ‘Nieuwe prijs’
FROM tblProducten
Om zaken te concateneren, gebruik je CONCAT()
-- CONCAT(string1, string2)
SELECT CONCAT("€ ", PrijsPerEenheid * 1.33) AS 'Nieuwe Verkoopprijs'
# Dit wordt € 23.727200
Via de WHERE-clausule kan je bepalen welke rijen er getoond worden, welke rijen er aan bepaalde voorwaarden moeten voldoen.
SELECT naam, straat, postnr
FROM tblKlanten
WHERE saldo > 100
SELECT naam, gemeente, soort
FROM tblKlanten
WHERE Soort = 'P' OR SOORT = 'R'
SELECT naam, opmerking
FROM tblKlanten
WHERE opmerking IS NOT NULL # NULL != ""
In de WHERE-clausule kunnen meerdere operatoren gebruikt worden. Vaak kan hetzelfde bereikt worden met meerdere operatoren.
Vergelijkingsoperatoren | =, <, >, <=, >=, <> of !=, <=> |
Wiskundige operatoren | +, -, *, / of % |
Booleaanse voorwaarden | AND, OR, NOT, XOR |
*<=> is een gelijk aan die ook true returnt bij NULL <=> NULL |
IN-operator met een opsomming of subquery ≈ Meerdere OR statements
IN("A","B","C")
IN(SELECT Naam From ...)
BETWEEN (buitenwaarden inbegrepen) ≈ Meerdere OR statements OPGELET: DATA STAAT STANDAARD OP 00:00:00, dus bij de laatste datum in de BETWEEN neemt hij niets na 00:00:00
BETWEEN "2017-01-01" AND "2017-05-01"
LIKE
LIKE "%a_"
/*
% = wild character
_ = single character
*/
REGEXP
REGEXP'[0-9]*[a-z][A-Z]' # zie verder
MATCH
MATCH title AGAINST "T-SQL"
-- ???
NULL
EntryDate is NULL
Category is NOT NULL
EXISTS
EXISTS (SELECT * FROM ...)
NOT EXISTS (SELECT * FROM ...)
Zie samenvatting Hoofdlettergevoelig zoeken:
-- Producten met kleine c, kleine y of grote B
WHERE Productnaam REGEXP BINARY '[cyB]'
Met ORDER BY kun je de volgorde vd rijen aanpasen. Standaard is dit ASC (oplopend). Je kan dit ook DESC (oplopend) sorteren door dit mee te geven.
ORDER BY Productnaam # A --> Z
ORDER BY Saldo DESC # Hoog --> Laag
ORDER BY Familienaam, Voornaam # Eerst op familienaam, dan op voornaam
Met limit beperk je hoeveel rijen er getoond worden
LIMIT 5
SELECT DISTINCT Gemeente
FROM tblKlanten
ORDER BY Gemeente;
Aggregaties functies zijn functies voor wiskundige berekeningen op één of meerdere cijfers.
werken op een enkelvoudig element in (meestal een string) Daarnaast kan je ook nog je eigen functies maken als developer.
Volgende aggregaties zijn mogelijk: AVG(), COUNT(), FIRST, LAST(), LAST(), MAX(), MIN(), SUM()
SELECT COUNT(klantnummer) AS 'Aantal klanten' FROM tblKlanten ...
SELECT SUM(saldo) AS 'Totaal klantensaldo' FROM tblKlanten ...
SELECT AVG(saldo) AS 'Gemiddeld klantensaldo' FROM tblKlanten ...
SELECT MAX(saldo) AS 'Grootste klantensaldo' FROM tblKlanten ...
SELECT MIN(saldo) AS 'Kleinste klantensaldo' FROM tblKlanten ...
SELECT MAX(saldo) - MIN(saldo) as 'VerschilSaldo FROM tblKlanten ...
Scalar functies werken in op een enkelvoudige elementen zoals een string, datum.
Overzicht Scalar functies op string types LEFT - RIGHT - SUBTRING - LTRIM - RTRIM - UPPER - LOWER zijn scalar functies op string types
SELECT UPPER(Voornaam) FROM tblKlanten;
# Dit wordt "KAREL"
SELECT LOWER (Voornaam) FROM tblKlanten;
# Dit wordt "karel"
SELECT LEFT(Voornaam, 3) FROM tblKlanten
# Dit wordt "Kar"
SELECT RIGHT(Voornaam, 3) FROM tblKlanten
# Dit wordt "rel"
LTRIM() en RTRIM() verwijderen spaties (links/rechts)
CURRENT_DATE() - NOW() - TIMESTAMPDIFF() - DATEDIFF() - WEEK() zijn scalar functies op datum types Rekenen met datums: DATE_ADD, DATEDIFF, TIMESTAMPDIFF
SELECT DATE_ADD(Vervaldatum, INTERVAL 1 DAY) FROM tblOrders;
SELECT "2016-10-12" + INTERVAL 1 DAY; # Geeft geen fout weer bij verkeerde datum!
SELECT DAYNAME(Vervaldatum) ... # Returnt Monday / Tuesday / ...
SELECT DAYOFWEEK(Vervaldatum) # Returnt 1 - 7 (Opgelet! Zondag = 1)
ORDER BY FIELD(DAYNAME(Indienst),'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday' , 'Saturday', 'Sunday')
ROUND - PI - POWER - ISNULL zijn scalar functies op numerieke types
NULL is helemaal niets en dus niet te verwarren met een ledige string
IFNULL(expr1, expr2)
# = controlestructuur.
# Geeft expr2 terug als de waarde van expr1 NULL is
ISNULL(expr1)
# Geeft 0 terug als expr1 NULL is en dus 1 in het ander geval.
# Handig om bijvoorbeeld NULL naar 0 om te zetten bij sorteren
Het kan nodig zijn om voor weergave een datatype aan te passen. Gebruik hiervoor CAST()
CAST('2017-01-01' AS DATE)
Met een GROUP BY clausule groepeer je rijen op basis van overeenkomsten tussen rijen. GROUP BY krijgt hiervoor één of meerdere kolommen aangeboden waarop je groepering wenst.
Om groepering weer te geven herhaal je alle opgesomde kolommen in de GROUP BY ook in het SELECT statement.
SELECT Gemeente, SUM(Saldo) # Aggregatie functie SUM()
FROM tblKlanten
GROUP BY Gemeente
ORDER BY Gemeente
-- Gemeente - SUM(saldo)
# Brugge - 80
# Gent - 10
# Kortrijk - 20
SELECT YEAR(Orderdatum) as 'JAARTAL' , FORMAT(AVG(DATEDIFF(leverdatum, orderdatum)),0) as "LEVERTERMIJN"
FROM tblOrders
GROUP BY YEAR(Orderdatum);
-- JAARTAL - LEVERTERMIJN
# 2003 - 10
# 2004 - 9
# 2005 - 9
# 2006 - 8
In plaats van WHERE kan je ook HAVING gebruiken. Het verschil is dat met HAVING eerst alle data wort opgehaald met een eerste query en nadien de filtering gebeurd met een tweede instructie.
Wanneer is dit noodzakelijk? Een HAVING laat toe om een voorwaarde met een aggregatie functie op te nemen in zijn groepering.
# Werkt niet!
WHERE SUM(InBestelling) > 10
GROUP BY Productnummer
# Werkt wel
GROUP BY Productnummer
HAVING SUM(InBestelling) > 10
De SELECT expressie kan opgebouwd worden met controle structuren. Dit kunnen zowel conditionele IF(), IFNULL() als lus structiren zijn (CASE).
CASE is vooral handig wanneer de data onbegrijpbaar is voor de gebruiker en je dit wil vervangen door een meningsvolle weergave.
SELECT
CASE GESLACHT
WHEN '1' THEN 'Vrouw'
WHEN '2' THEN 'Man'
ELSE '?'
END AS `Man/Vrouw`,
Familienaam
FROM tblWerknemers
ORDER BY FIELD(`Man/Vrouw`,'Man','Vrouw','?'), Familienaam;
IF() kan je gebruiken als er slechts 2 keuzes zijn.
SELECT
Familienaam, Voornaam,
IF(auto = 0, "HEEFT GEEN AUTO", "HEEFT WEL EEN AUTO") AS "Firmawagen?"
FROM tblWerknemers;
Zie samenvatting voor info over tabellen en relaties, soorten joins...
Een subquery komt altijd tussen haakjes vooafgegaan door een andere aanroepende tabelexpressie. Het keyword is meestal IN, NOT IN, WHERE EXISTS of WHERE NOT EXISTS, maar kan ook een WHERE zijn.
-- Producten waarvan de voorraadwaarde > laagste brutoloon
SELECT Nederlandsenaam, (PrijsPerEenheid * Voorraad) as `Voorraadwaarde`
FROM tblproducten
WHERE (prijspereenheid * voorraad) > (SELECT min(brutowedde) from tblwerknemers);
-- Klanten met toevallig dezelfde naam als een werknemer
SELECT Naam, Gemeente, Postnr, Straat
FROM tblklanten
WHERE Naam IN(SELECT Familienaam FROM tblWerknemers WHERE Familienaam = Naam);
-- Werknemers die nooit een bestelling opmaakten
SELECT concat(Voornaam, " ", Familienaam) as `Volledige naam`
FROM tblwerknemers
WHERE WerknemerID NOT IN(SELECT DISTINCT WerknemerID FROM tblorders);
-- Klanten die nog niets hebben besteld
SELECT Naam
FROM tblklanten
WHERE NOT EXISTS (SELECT * FROM tblOrders WHERE tblOrders.Klantnummer = tblklanten.Klantnummer)
SELECT
k.naam AS klantnaam,
w.familienaam as werknemernaam,
p.nederlandsenaam,
o.orderdatum as 'besteld op',
i.hoeveelheid AS aantal
FROM tblWerknemers AS w
JOIN tblOrders AS o ON w.werknemerID = o.werknemerID
JOIN tblKlanten AS k ON k.klantnummer = o.klantnummer
JOIN tblOrderinformatie AS i ON i.orderID = o.orderid
JOIN tblProducten AS p ON i.Productnummer = p.productnummer
ON zorgt voor een perfecte vertaling van de relatie door de twee kolommen van de relatie op te halen en aan elkaar gelijk te stellen
CREATE VIEW `vwNaam` AS
/* SELECT STATEMENT (MET JOINS ETC) KOMT HIER */