Gegevens filteren met predicaten
De eenvoudigste SELECT-instructies met alleen SELECT- en FROM-componenten evalueren elke rij in een tabel. Met behulp van een WHERE-component definieert u voorwaarden die bepalen welke rijen worden verwerkt en mogelijk de resultatenset verminderen.
De structuur van de WHERE-component
De WHERE-component bestaat uit een of meer zoekvoorwaarden, die elk voor elke rij van de tabel moeten worden geëvalueerd als WAAR, ONWAAR of 'onbekend'. Rijen worden alleen geretourneerd wanneer de WHERE-component resulteert in TRUE. De afzonderlijke voorwaarden fungeren als filters voor de gegevens en worden 'predicaten' genoemd. Elk predicaat bevat een voorwaarde die wordt getest, meestal met behulp van de basisvergelijkingsoperators:
- = (is gelijk aan)
- <> (is niet gelijk aan)
- > (groter dan)
- >= (groter dan of gelijk aan)
- < (kleiner dan)
- <= (kleiner dan of gelijk aan)
De volgende query retourneert bijvoorbeeld alle producten met de waarde ProductCategoryID van 2:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2;
Op dezelfde manier retourneert de volgende query alle producten met een ListPrice kleiner dan 10,00:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice < 10.00;
IS NULL/IS NIET NULL
U kunt ook eenvoudig filteren om de 'onbekende' of NULL-waarden toe te staan of uit te sluiten met BEHULP van IS NULL of IS NOT NULL.
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductName IS NOT NULL;
Meerdere voorwaarden
Meerdere predicaten kunnen worden gecombineerd met de AND- en OR-operatoren en met haakjes. SQL Server verwerkt echter slechts twee voorwaarden tegelijk. Alle voorwaarden moeten WAAR zijn bij het verbinden van meerdere voorwaarden met and-operator. Wanneer u een OR-operator gebruikt om twee voorwaarden te verbinden, kan een of beide WAAR zijn voor de resultatenset.
De volgende query retourneert bijvoorbeeld het product in categorie 2 dat minder dan 10,00 kost:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2
AND ListPrice < 10.00;
AND-operators worden verwerkt vóór OR-operators, tenzij haakjes worden gebruikt. Gebruik voor aanbevolen procedures haakjes bij het gebruik van meer dan twee predicaten. De volgende query retourneert producten in categorie 2 OF 3 EN kost minder dan 10,00:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE (ProductCategoryID = 2 OR ProductCategoryID = 3)
AND (ListPrice < 10.00);
Vergelijkingsoperators
Transact-SQL bevat vergelijkingsoperatoren die de WHERE-component kunnen vereenvoudigen.
IN
De IN-operator is een snelkoppeling voor meerdere gelijkheidsvoorwaarden voor dezelfde kolom die is verbonden met OR. Er is niets mis met het gebruik van meerdere OR-voorwaarden in een query, zoals in het volgende voorbeeld:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2
OR ProductCategoryID = 3
OR ProductCategoryID = 4;
Het gebruik van IN is echter duidelijk en beknopt en de prestaties van de query worden niet beïnvloed.
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID IN (2, 3, 4);
BETWEEN
BETWEEN is een andere snelkoppeling die kan worden gebruikt bij het filteren op een boven- en ondergrens voor de waarde in plaats van twee voorwaarden te gebruiken met de AND-operator. De volgende twee query's zijn equivalent:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice >= 1.00
AND ListPrice <= 10.00;
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice BETWEEN 1.00 AND 10.00;
De operator BETWEEN maakt gebruik van inclusieve grenswaarden. Producten met een prijs van 1,00 of 10,00 worden opgenomen in de resultaten. BETWEEN is ook handig bij het opvragen van datumvelden. De volgende query bevat bijvoorbeeld alle productnamen die zijn gewijzigd tussen 1 januari 2012 en 31 december 2012:
SELECT ProductName, ModifiedDate
FROM Production.Product
WHERE ModifiedDate BETWEEN '2012-01-01' AND '2012-12-31';
ProductName
ModifiedDate
Mountainbikesokken, M
2012-01-01 00:00:00.000
HL Mountain Frame - Zilver, 42
2012-03-05 00:00:00.000
HL Mountain Frame - Zilver, 38
2012-08-29 00:00:00.000
Berg-100 zilver, 38
2012-12-31 00:00:00.000
Omdat we echter geen tijdsbereik opgeven, worden er geen resultaten geretourneerd na 2012-12-31 00:00:00.000. Als u datum en tijd nauwkeurig wilt opnemen, moet u de tijd in het predicaat opnemen:
SELECT ProductName, ListPrice, ModifiedDate
FROM Production.Product
WHERE ModifiedDate BETWEEN '2012-01-01 00:00:00.000' AND '2012-12-31 23:59:59.999';
Eenvoudige vergelijkingsoperatoren zoals Groter dan (>) en Gelijk aan (=) zijn ook nauwkeurig wanneer alleen wordt gefilterd op datum:
SELECT ProductName, ListPrice, ModifiedDate
FROM Production.Product
WHERE ModifiedDate >= '2012-01-01'
AND ModifiedDate < '2013-01-01';
ALS
De laatste vergelijkingsoperator kan alleen worden gebruikt voor tekengegevens en stelt ons in staat jokertekens en reguliere expressiepatronen te gebruiken. Met jokertekens kunnen gedeeltelijke tekenreeksen worden opgegeven. U kunt bijvoorbeeld de volgende query gebruiken om alle producten te retourneren met namen die het woord 'berg' bevatten:
SELECT Name, ListPrice
FROM SalesLT.Product
WHERE Name LIKE '%mountain%';
Het % jokerteken vertegenwoordigt een tekenreeks van 0 of meer tekens, dus de resultaten bevatten producten met het woord 'berg' overal in hun naam, zoals:
Naam
ListPrice
Mountainbikesokken, M
9,50
Mountainbikesokken, L
9,50
HL Mountain Frame - Zilver, 42
1364.0
HL Mountain Frame - Zwart, 42
1349.60
HL Mountain Frame - Zilver, 38
1364.50
Berg-100 zilver, 38
3399.99
U kunt het jokerteken _ (onderstrepingsteken) gebruiken om één teken weer te geven, zoals:
SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain Bike Socks, _';
De volgende resultaten bevatten alleen producten die beginnen met 'Mountain Bike Socks' en één teken erna:
ProductName
ListPrice
Mountainbikesokken, M
9,50
Mountainbikesokken, L
9,50
U kunt ook complexe patronen definiëren voor tekenreeksen die u wilt zoeken. De volgende query heeft bijvoorbeeld gezocht naar producten met een naam die begint met 'Mountain-', gevolgd door:
- drie tekens tussen 0 en 9
- een spatie
- elke tekenreeks
- een komma
- een spatie
- twee tekens tussen 0 en 9
SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain-[0-9][0-9][0-9] %, [0-9][0-9]';
De resultaten van deze query kunnen er ongeveer als volgt uitzien:
ProductName
ListPrice
Berg-100 zilver, 38
3399.99
Berg-100 zilver, 42
3399.99
Berg-100 zwart, 38
3399.99
Mountain-100 Black, 42
3399.99
Mountain-200 zilver, 38
2319.99
Mountain-200 zilver, 42
2319.99
Mountain-200 zwart, 38
2319.99
Mountain-200 zwart, 42
2319.99