1.1. Data Manipulation Language Statements (Transact-SQL)
Data Manipulation Language (DML) is een vocabulaire dat wordt gebruikt om gegevens op te halen en ermee te werken in SQL Server. Gebruik deze instructies om gegevens toe te voegen, aan te passen, op te vragen of te verwijderen uit een SQL Server-database.
De volgende lijst bevat de DML-instructies die SQL Server gebruikt.
- BULK INSERT (Transact-SQL)
- DELETE (Transact-SQL)
- INSERT (Transact-SQL)
- MERGE (Transact-SQL)
- READTEXT (Transact-SQL)
- SELECT (Transact-SQL)
- UPDATE (Transact-SQL)
- UPDATETEXT (Transact-SQL)
- WRITETEXT (Transact-SQL)
De volgende tabel bevat de clausules die worden gebruikt in meerdere DML-instructies of clausules.
Clausule | Kan in deze uitdrukkingen worden gebruikt |
---|---|
FROM (Transact-SQL) | DELETE, SELECT, UPDATE |
Hints (Transact-SQL) | DELETE, INSERT, SELECT, UPDATE |
OPTION Clause (Transact-SQL) | DELETE, SELECT, UPDATE |
OUTPUT Clause (Transact-SQL) | DELETE, INSERT, MERGE, UPDATE |
Search Condition (Transact-SQL) | DELETE, MERGE, SELECT, UPDATE |
Table Value Constructor (Transact-SQL) | FROM, INSERT, MERGE |
TOP (Transact-SQL) | DELETE, INSERT, MERGE, SELECT, UPDATE |
WHERE (Transact-SQL) | DELETE, SELECT, UPDATE |
WITH common_table_expression (Transact-SQL) | DELETE, INSERT, MERGE, SELECT, UPDATE |
1.1.1. SELECT Clausule
Logische volgorde van uitvoeren van het SQL commando SELECT.
5 | SELECT | De SQL SELECT-clausule specificeert de velden, constanten en uitdrukkingen die in de queryresultaten moeten worden weergegeven. |
1 | FROM | De FROM-clausule specificeert een of meer tabellen met de gegevens waaruit de query ophaalt. |
2 | WHERE | De WHERE-clausule geeft de voorwaarden voor join en filter aan die bepalen welke rijen de query retourneert. JOIN-bewerkingen in de WHERE-clausule werken hetzelfde als JOIN-bewerkingen in de FROM-clausule. |
3 | GROUP BY | De GROUP BY-clausule specificeert een of meer kolommen die worden gebruikt om rijen te groeperen die door de query worden geretourneerd. Kolommen waarnaar wordt verwezen in de lijst met SQL SELECT-instructies, met uitzondering van aggregate-expressies, moeten worden opgenomen in de GROUP BY-clausule. U kunt niet groeperen op Memo-, General– of Blob-velden. |
4 | HAVING | De HAVING-clausule specificeert voorwaarden die de groepen bepalen die in de query zijn opgenomen. Als de SQL SELECT-instructie geen aggregatiefuncties bevat, kunt u een SQL SELECT-instructie gebruiken die een HAVING-clausule bevat zonder een GROUP BY-clausule. |
6 | ORDER BY | De ORDER BY-clausule specificeert een of meer items die worden gebruikt om de uiteindelijke set met queryresultaten te sorteren en de volgorde voor het sorteren van de resultaten. |
<SELECT statement> ::=
[WITH <common_table_expression> [,...n]]
<query_expression>
[ ORDER BY { order_by_expression | column_position [ ASC | DESC ] }
[ ,...n ] ]
[ <FOR Clause>]
[ OPTION ( <query_hint> [ ,...n ] ) ]
<query_expression> ::=
{ <query_specification> | ( <query_expression> ) }
[ { UNION [ ALL ] | EXCEPT | INTERSECT }
<query_specification> | ( <query_expression> ) [...n ] ]
<query_specification> ::=
SELECT [ ALL | DISTINCT ]
[TOP ( expression ) [PERCENT] [ WITH TIES ] ]
< select_list >
[ INTO new_table ]
[ FROM { <table_source> } [ ,...n ] ]
[ WHERE <search_condition> ]
[ <GROUP BY> ]
[ HAVING < search_condition > ]
1.1.1.2. Samenvoeg functies
AVG | Retourneert het gemiddelde van de waarden in een groep. Null-waarden worden genegeerd.AVG ( [ ALL | DISTINCT ] expression ) |
COUNT | Retourneert het aantal items in een groep. COUNT retourneert altijd een int-gegevenstypewaarde.COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } ) |
MAX | Retourneert de maximale waarde in de uitdrukking. Kan worden gevolgd door de OVER-clausule.MAX ( [ ALL | DISTINCT ] expression ) |
MIN | Retourneert de minimumwaarde in de uitdrukking. Kan worden gevolgd door de OVER-clausule.MIN ( [ ALL | DISTINCT ] expression ) |
SUM | Retourneert de som van alle waarden, of alleen de DISTINCT-waarden, in de uitdrukking. SUM kan alleen worden gebruikt met numerieke kolommen. Null-waarden worden genegeerd.SUM ( [ ALL | DISTINCT ] expression ) |
1.1.1.3. Filter functies
DISTINCT | Deze functie kan niet worden gebruikt om waarden naar een cel of kolom op een werkblad te retourneren; in plaats daarvan nest je de functie DISTINCT in een formule om een lijst met verschillende waarden te krijgen die kunnen worden doorgegeven aan een andere functie en vervolgens kunnen worden geteld, opgeteld of gebruikt voor andere bewerkingen. DISTINCT werkt op de hele rij, niet op een specifieke kolom. Als u de unieke namen wilt hebben, selecteert u alleen die kolom DISTINCT(<column>) |
1.1.1.3. String functies
CONCAT | Retourneert een tekenreeks die het resultaat is van het samenvoegen van twee of meer tekenreekswaarden. |
LTRIM | Retourneert een tekenuitdrukking nadat het voorloopspaties heeft verwijderd. |
RTRIM | Retourneert een tekenreeks na het afkappen van alle volgspaties. |
1.1.1.4. Logische operatoren
ALL | Vergelijkt een scalaire waarde met een set waarden met één kolom.scalar_expression { = | <> | != | > | >= | !> | < | <= | !< } ALL ( subquery ) |
AND | Combineert twee Booleaanse uitdrukkingen en retourneert WAAR als beide uitdrukkingen WAAR zijn. Als in een instructie meer dan één logische operator wordt gebruikt, worden de AND-operators eerst geëvalueerd. U kunt de volgorde van evaluatie wijzigen door haakjes te gebruiken.boolean_expression AND boolean_expression |
ANY | Vergelijkt een scalaire waarde met een set waarden met één kolom. Zie voor meer informatie SOME | ANY (Transact-SQL). |
BETWEEN | Specificeert een bereik om te testen.test_expression [ NOT ] BETWEEN begin_expression AND end_expression |
EXISTS | Specificeert een subquery om te testen op het bestaan van rijen.EXISTS subquery |
IN | Bepaalt of een opgegeven waarde overeenkomt met een waarde in een subquery of een lijst.test_expression [ NOT ] IN |
LIKE | Bepaalt of een specifieke tekenreeks overeenkomt met een opgegeven patroon. Een patroon kan gewone tekens en jokertekens bevatten. Tijdens het matchen van patronen moeten reguliere tekens exact overeenkomen met de tekens die in de tekenreeks zijn opgegeven. Jokertekens kunnen echter worden vergeleken met willekeurige fragmenten van de tekenreeks. Het gebruik van jokertekens maakt de operator LIKE flexibeler dan het gebruik van de = en! = Stringvergelijkingsoperatoren. Als een van de argumenten niet van het gegevenstype tekenreeks is, converteert de SQL Server Database Engine deze naar het gegevenstype tekenreeks, indien mogelijk.match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ] |
NOT | Ontkent een Booleaanse invoer.[ NOT ] boolean_expression |
OR | Combineert twee voorwaarden. Als er meer dan één logische operator in een instructie wordt gebruikt, worden OF-operators geëvalueerd na EN-operators. U kunt de volgorde van evaluatie echter wijzigen door haakjes te gebruiken.boolean_expression OR boolean_expression |
SOME | Vergelijkt een scalaire waarde met een set waarden met één kolom. SOME en ANY zijn gelijkwaardig.scalar_expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } |
1.1.1.5. String Operatoren
Jokerteken | Omschrijving | Voorbeeld |
---|---|---|
% | Elke reeks van nul of meer tekens. | WHERE title LIKE ‘%computer%’ vindt alle boektitels met het woord ‘computer’ ergens in de boektitel |
_ (underscore) | Elk willekeurig teken. | WHERE au_fname LIKE ‘_ean’ vindt alle voornamen van vier letters die eindigen op ean (Dean, Sean, enzovoort). |
[ ] | Elk enkel teken binnen het opgegeven bereik ([a-f]) of set ([abcdef]). | WHERE au_lname LIKE ‘[C-P]arsen’ vindt de achternaam van de auteur die eindigt op arsen en begint met een willekeurig teken tussen C en P, bijvoorbeeld Carsen, Larsen, Karsen, enzovoort. Bij het zoeken naar bereik kunnen de tekens in het bereik variëren, afhankelijk van de sorteerregels van de sortering. |
[^] | Elk enkel teken dat niet binnen het opgegeven bereik ([^ a-f]) of set ([^ abcdef]) valt. | WHERE au_lname LIKE ‘de[^l]%’ alle achternamen van de auteur die beginnen met de en waarbij de volgende letter niet l is. |
1.1.2. JOIN Clausule
Join-voorwaarden kunnen worden gespecificeerd in de FROM- of WHERE-clausule; het wordt aanbevolen om ze op te geven in de FROM-component. WHERE- en HAVING-clausules kunnen ook zoekvoorwaarden bevatten om de rijen die zijn geselecteerd op basis van de join-voorwaarden verder te filteren.
Joins kunnen worden gecategoriseerd als:
- Inner Joins (de typische join-bewerking, die een vergelijkingsoperator zoals = of <> gebruikt). Deze omvatten equi-joins en natuurlijke joins.
Inner joins gebruiken een vergelijkingsoperator om rijen uit twee tabellen te matchen op basis van de waarden in gemeenschappelijke kolommen uit elke tabel. Bijvoorbeeld het ophalen van alle rijen waarin het studentidentificatienummer hetzelfde is in zowel de studententabel als de cursustabel. - Outer Joins. Outer joins kunnen een linker, rechter of volledige outer join zijn.
Outer joins worden gespecificeerd met een van de volgende sets sleutelwoorden wanneer ze worden gespecificeerd in de FROM-component:- LEFT JOIN of LEFT OUTER JOIN – De resultatenset van een linksbuitenkoppeling omvat alle rijen van de linkertabel die zijn opgegeven in de clausule LEFT OUTER, niet alleen die waarin de samengevoegde kolommen overeenkomen. Als een rij in de linkertabel geen overeenkomende rijen in de rechtertabel heeft, bevat de bijbehorende resultaatsetrij null-waarden voor alle geselecteerde lijstkolommen die uit de rechtertabel komen.
- RIGHT JOIN of RIGHT OUTER JOIN – Een rechter buitenste verbinding is het omgekeerde van een linker buitenste verbinding. Alle rijen uit de rechtertabel worden geretourneerd. Null-waarden worden geretourneerd voor de linkertabel telkens wanneer een rechtertabelrij geen overeenkomende rij in de linkertabel heeft.
- FULL JOIN of FULL OUTER JOIN – Een volledige outer join retourneert alle rijen in zowel de linker- als de rechtertabel. Elke keer dat een rij geen overeenkomst heeft in de andere tabel, bevatten de selectielijstkolommen uit de andere tabel null-waarden. Als er een overeenkomst is tussen de tabellen, bevat de volledige resultaatsetrij gegevenswaarden uit de basistabellen.
- Cross Joins. Cross joins retourneren alle rijen van de linkertabel. Elke rij uit de linker tafel wordt gecombineerd met alle rijen uit de rechter tafel. Dwarsverbindingen worden ook wel Cartesiaanse producten genoemd.

1.1.4. WHERE Clausule
1.1.4.1. Samengestelde WHERE clausules
SQL-WHERE-clausules kunnen meer voorwaarden omvatten door de operators AND, OR, IN en NOT IN te gebruiken. We kunnen bijvoorbeeld het volgende schrijven als we alle rijen in ARTIKEL willen vinden die een Afdeling met de naam Watersport en een Inkoper met de naam Najma Barends bevatten:
SELECT *
FROM ARTIKEL
WHERE Afdeling = 'Watersport'
AND Inkoper = 'Najma Barends';
Artikelnummer | Artikelomschrijving | Afdeling | Inkoper |
101100 | Duikmasker, small, helder | Watersport | Najma Barends |
101200 | Duikmasker, medium, helder | Watersport | Najma Barends |
We kunnen op een soortgelijke manier alle rijen in ARTIKEL vinden voor de afdelingen Camping of Klimmen door het volgende te schrijven:
SELECT *
FROM ARTIKEL
WHERE Afdeling = 'Camping' OR Afdeling = 'Klimmen';
Artikelnummer | Artikelomschrijving | Afdeling | Inkoper |
201000 | Halvekoepeltent | Camping | Charlotte Laan |
202000 | Grondzeil halvekoepeltent | Camping | Charlotte Laan |
301000 | Lichtgewicht klimharnas | Klimmen | Johan Martens |
302000 | Karabijnsluiting, ovaal | Klimmen | Johan Martens |
Het is ook mogelijk drie of meer OR– en AND-voorwaarden te combineren, maar het is in dergelijke gevallen makkelijker de operators IN and NOT IN te gebruiken. Stel dat we alle rijen in ARTIKEL willen vinden voor de inkopers Najma Barends, Charlotte Laan en Johan Martens. We kunnen een WHERE-clausule met twee OR’s opstellen, maar het is makkelijker het sleutelwoord IN als volgt te gebruiken.
SELECT *
FROM ARTIKEL
WHERE Inkoper IN ('Najma Barends', 'Charlotte Laan', 'Johan Martens');
Artikelnummer | Artikelomschrijving | Afdeling | Inkoper |
101100 | Duikmasker, small, helder | Watersport | Najma Barends |
101200 | Duikmasker, medium, helder | Watersport | Najma Barends |
201000 | Halvekoepeltent | Camping | Charlotte Laan |
202000 | Grondzeil halvekoepeltent | Camping | Charlotte Laan |
301000 | Lichtgewicht klimharnas | Klimmen | Johan Martens |
302000 | Karabijnsluiting, ovaal | Klimmen | Johan Martens |
We kunnen op een soortgelijke manier het volgende schrijven als we alle rijen van ARTIKEL willen vinden waarin de verkoper iemand anders is dan Najma Barends, Charlotte Laan en Johan Martens.
SELECT *
FROM ARTIKEL
WHERE Inkoper NOT IN ('Najma Barends', 'Charlotte Laan', 'Johan Martens');
Artikelnummer | Artikelomschrijving | Afdeling | Inkoper |
100100 | Standaard SCUBA, geel | Watersport | Peter Jansen |
100200 | Standaard SCUBA, magenta | Watersport | Peter Jansen |
1.1.4.2. Bereik in WHERE-clausules
Met het sleutelwoord BETWEEN kan voor een SQL-WHERE-clausule een bereik voor gegevenswaarden gespecificeerd worden.
SELECT *
FROM BESTELLING_ITEM
WHERE Totaalprijs BETWEEN 100 and 200;
Bestellingnummer | Artikelnummer | Aantal | Stukprijs | Totaalprijs |
2000 | 101100 | 4 | 500.000 | 2.000.000 |
3000 | 101100 | 2 | 500.000 | 1.000.000 |
2000 | 101200 | 2 | 500.000 | 1.000.000 |
1000 | 202000 | 1 | 1.300.000 | 1.300.000 |
Merk op dat beide uitersten van het bereik, 100 en 200 wel in de resulterende tabel zijn opgenomen. Het vorige SQL-statement is gelijkwaardig met:
SELECT *
FROM BESTELLING_ITEM
WHERE Totaalprijs >= 100 and Totaalprijs <= 200;
1.1.4.3. Wildcards in WHERE-clausules
Het sleutelwoord LIKE kan in WHERE-clausules worden gebruikt om kolomwaarden te vinden, waarvan een deel wordt opgegeven. Stel dat we rijen in de tabel ARTIKEL willen vinden voor alle inkopers met de voornaam Pete. We vinden deze rijen door het sleutelwoord LIKE als volgt te gebruiken met de wildcard %:
SELECT *
FROM ARTIKEL
WHERE Inkoper LIKE 'Pete%';
Artikelnummer | Artikelomschrijving | Afdeling | Inkoper |
100100 | Standaard SCUBA, geel | Watersport | Peter Jansen |
100200 | Standaard SCUBA, magenta | Watersport | Peter Jansen |
Het procentteken (%) is een wildcard (of joker) die een willekeurige reeks tekens representeert. De string ‘Pete%‘ geeft dus een willekeurige reeks tekens weer die met de letters Pete begint.
Stel dat we de rijen in ARTIKEL willen vinden waarin het woord Tent ergens in de Artikelomschrijving voorkomt. Het woord Tent zou aan het begin, ergens in het midden of aan het eind van de beschrijving kunnen staan. We moeten daarom als volgt een jokerteken aan beide uiteinden van de LIKE-zinsnede gebruiken:
SELECT *
FROM ARTIKEL
WHERE Artikelomschrijving LIKE '%Tent%';
Artikelnummer | Artikelomschrijving | Afdeling | Inkoper |
201000 | Halvekoepeltent | Camping | Charlotte Laan |
202000 | Grondzeil halvekoepeltent | Camping | Charlotte Laan |
We moeten soms ook op een specifieke plaats in de kolom naar een bepaalde waarde zoeken. Stel dat Artikelnummer-waarden zo zijn gecodeerd dat een 2 op de derde positie van rechts een bepaalde betekenis heeft – bijvoorbeeld dat et product een variant is van een ander product. Stel dat we om wat voor reden dan ook alle Artikelnummers moeten vinden die een 2 bevatten op de derde positie van rechts. Om het gewenste overzicht te maken, moeten we underscores (_) gebruiken. Het volgende SQL-statement zal alle rijen in ARTIKEL vinden met de waarde 2 in de derde positie van rechts:
SELECT *
FROM ARTIKEL
WHERE Artikelnummer LIKE '%2___';
Artikelnummer | Artikelomschrijving | Afdeling | Inkoper |
202000 | Grondzeil halvekoepeltent | Camping | Charlotte Laan |
302000 | Karabijnsluiting, ovaal | Klimmen | Johan Martens |
De SQL HAVING-clausule wordt gebruikt om de uitvoer van een SQL-instructie voorwaardelijk te beperken door een statistische SQL-functie die wordt gebruikt in uw SELECT-lijst met kolommen.
U kunt geen criteria opgeven in een SQL WHERE-clausule voor een kolom in de SELECT-lijst waarvoor de statistische SQL-functie wordt gebruikt.
De volgende SQL-instructie genereert bijvoorbeeld een fout:
SELECT Employee, SUM (Hours)
FROM EmployeeHours
WHERE SUM (Hours) > 24
GROUP BY Employee
De SQL HAVING-clausule wordt gebruikt om precies dit te doen, om een voorwaarde op te geven voor een verzamelfunctie die in uw query wordt gebruikt:
SELECT Employee, SUM (Hours)
FROM EmployeeHours
GROUP BY Employee
HAVING SUM (Hours) > 24
De bovenstaande SQL-instructie selecteert alle werknemers en de som van hun respectieve uren, zolang deze som groter is dan 24. Het resultaat van de SQL HAVING-clausule is hieronder te zien: * Bron http: //www.sql-tutorial.net/SQL-HAVING.asp.
1.1.5. GROUP BY Clausule
Rijen kun je in SQL groeperen op basis van gemeenschappelijke waarden door het sleutelwoord GROUP BY te gebruiken. Als je bijvoorbeeld GROUP BY Afdeling opgeeft in een SELECT-statement op de tabel ARTIKEL, dan zal het DBMS alle rijen eerst op Afdeling sorteren en alle rijen die dezelfde waarde bevatten daarna combineren tot een groep van die Afdeling. Er zullen zoveel groepen ontstaan als er unieke waarden zijn voor die Afdeling.
SELECT Afdeling, COUNT(*) AS AantalArtikelenPerAfdeling
FROM ARTIKEL
GROUP BY Afdeling;
Afdeling | AantalArtikelenPerAfdeling |
Camping | 2 |
Klimmen | 2 |
Watersport | 4 |
Het DBMS verkrijgt het resultaat door de rijen eerst op Afdeling te sorteren en dan het aantal rijen te tellen dat dezelfde waarde heeft voor Afdeling. Een ander voorbeeld het het gebruikt GROUP BY is:
SELECT Artikelnummer, AVG (Totaalprijs) AS GemiddeldeTP
FROM BESTELLING_ITEM
GROUP BY Artikelnummer;
Artikelnummer | GemiddeldeTP |
100200 | 300.000.000 |
101100 | 150.000.000 |
101200 | 75.000.000 |
201000 | 300.000.000 |
202000 | 130.000.000 |
De rijen zijn hier gesorteerd en gegroepeerd op Artikelnummer. De gemiddelde Totaalprijs is berekend voor elke groep Artikelnummer-items. Er kunnen meer kolommen worden opgenomen in een GROUP BY-expressie. Het volgend SQL-statement groepeert de rijen bijvoorbeeld eerst op de waarde van de Afdeling en dan op die van Inkoper. Het statement telt daarna het aantal rijen voor elke combinatie van Afdeling en Inkoper.
SELECT Afdeling, Inkoper, COUNT(*) AS AantalArtikelenPerAfdelingPerInkoper
FROM ARTIKEL
GROUP BY Afdeling,Inkoper;
Afdeling | Inkoper | AantalArtikelenPerAfdelingPerInkoper |
Camping | Charlotte Laan | 2 |
Klimmen | Johan Martens | 2 |
Watersport | Najma Barends | 2 |
Watersport | Peter Jansen | 2 |
Je kunt natuurlijk ook WHERE– en ORDER BY-clausules gebruiken met SELECT-statements.
SELECT Afdeling, COUNT(*) AS AantalArtikelenNiet30200PerAfdelingPerInkoper
FROM ARTIKEL
WHERE Artikelnummer <> 30200
GROUP BY Afdeling
ORDER BY COUNT(*);
Afdeling | AantalArtikelenNiet30200PerAfdelingPerInkoper |
Camping | 2 |
Klimmen | 2 |
Watersport | 4 |