SQL Basis

Extra Oefeningen

  • Het Case statement wordt niet uitgelegd in het SQL Basis boek "TySQL in 10 minutes"
  • Het CASE statement kan in de SELECT meerdere uitkomsten genereren
  • Het is dé manier in SQL om 'Als / Dan-logica' toe te passen
-- Oracle / MySQL / SQL Server
SELECT	prod_id,
 CASE
  WHEN prod_price <= 5 THEN '<<'
  WHEN prod_price <= 10 THEN '=='
  ELSE '>>'
 END Waardering
FROM Products
ORDER BY Waardering;	
prod_idWaardering
BNBG01<<
BNBG02<<
BNBG03<<
RGAN01<<
BR01==
BR02==
RYL01==
RYL02==
BR03>>


  1. Selecteer alle prod_id's (OrderItems) en een kolom met een zelfbedachte waardering op basis van verkochte aantallen. (18)


  1. Geef de huidige datum en tijd (1)


  1. Geef de oudste order uit de tabel orders (1)


  1. Hoeveel dagen zitten er tussen nu en de oudste order? (1)


  1. Hoeveel (afgerond) jaren geleden is de eerste order geplaatst? (1)


  1. Oracle / MySQL: Met de modulo functie - MOD() - kan je de restwaarden opvragen na een deling. SQL Server: met de % operator kun je de restwaarden opvragen na een deling. Geef de restwaarden van 10 gedeeld door 3 (1)


  1. Hoelang geleden (jaren en dagen) is de eerste order geplaatst? (1)


  1. Hoeveel items staan er op de order 20008 (1)


  1. Wat is de totaalprijs van order 20007 (1)


  • Window Functions worden niet uitgelegd in het SQL Basis boek "TySQL in 10 minutes"
  • Oracle & MS SQL Server ondersteunen Window Functions. MySQL heeft ondersteuning voor Window Functions vanaf server versie 8
  • -- MySQL
    SELECT VERSION( );
    
  • Aggregaatfuncties vatten gegevens uit meerdere rijen samen in één resultaat
  • Met de GROUP BY-clausule kun je aggregatiefuncties toepassen op een subset van rijen
  • De aggregatiefuncties en of de GROUP BY verminderen het aantal rijen dat door de query wordt geretourneerd
  • Net als de aggregatiefuncties met de GROUP BY-clausule werken window-functies ook op een subset van rijen, maar verminderen ze niet het aantal rijen dat door de query wordt geretourneerd.

Geef per order alle prducten en de totaalprijs van de order (18)
SELECT	order_num AS OrderNummer,
	prod_id AS ProductCode,
	SUM(quantity * item_price) OVER (PARTITION BY order_num) OrderTotaal
FROM	OrderItems;	
OrderNummerProductCodeOrderTotaal
20005BR01 1648
20005BR03 1648
20006BR01 329.6
20006BR02 329.6
20006BR03 329.6
20007BR03 1696
20007BNBG01 1696
20007BNBG02 1696
20007BNBG03 1696
20007RGAN01 1696
20008RGAN01 189.6
20008BR03 189.6
20008BNBG01 189.6
20008BNBG02 189.6
20008BNBG03 189.6
20009BNBG01 1867.5
20009BNBG02 1867.5
20009BNBG03 1867.5


  1. Geef per product de leverancier en het totaalbedrag van de producten van de leverancier (9)

  1. Gebruik hier een subquerie: vraag 50 - Selecteer de klant id's en het totaalbedrag wat ze besteld hebben (4)


  1. Produceer onderstaande resultaat door een JOIN van OrderItems met Products (18)

OrderNummerProductCodeAfnameKortingsPercentage
20006BR02Minder dan 50 Stuks0.0 %
20006BR03Minder dan 50 Stuks0.0 %
20006BR01Minder dan 50 Stuks0.0 %
20008BNBG03Minder dan 50 Stuks0.0 %
20008BR03Minder dan 50 Stuks0.0 %
20008BNBG02Minder dan 50 Stuks0.0 %
20008BNBG01Minder dan 50 Stuks0.0 %
20008RGAN01Minder dan 50 Stuks0.0 %
20007BR0350 Stuks of meer-4.2 %
20005BR03100 Stuks of meer-8.3 %
20005BR01100 Stuks of meer-8.3 %
20007RGAN0150 Stuks of meer-10.0 %
20007BNBG02100 Stuks of meer-14.3 %
20007BNBG01100 Stuks of meer-14.3 %
20007BNBG03100 Stuks of meer-14.3 %
20009BNBG03250 Stuks of meer-28.7 %
20009BNBG02250 Stuks of meer-28.7 %
20009BNBG01250 Stuks of meer-28.7 %



  1. Geef in 1 tabel, met een UNION, alle namen en volledige adressen van de klanten en de leveranciers (9)


  1. Selecteer alle klant id's die geen order hebben geplaatst.
    Gebruik bij Oracle de Set Operator MINUS. Gebruik bij SQL SERVER de Set Operator EXCEPT. MySQL kent geen MINUS of EXCEPT, gebruik dan een Subquerie of een JOIN. (1)


  1. Selecteer alle klant id's die wel een order hebben geplaatst.
    Gebruik bij Oracle en SQL Server de Set Operator INTERSECT. MySQL kent geen INTERSECT, gebruik dan een Subquerie of een JOIN. (x)