SQL
Filter resultaten met WHERE en HAVING
Zoeken…
Syntaxis
- SELECT kolomnaam
VAN tafel_naam
WAAR operatorwaarde kolomnaam - SELECT kolomnaam, aggregaatfunctie (kolomnaam)
VAN tafel_naam
GROEPEN op kolomnaam
HEEFT operatorwaarde aggregate_function (kolomnaam)
De clausule WHERE retourneert alleen rijen die overeenkomen met de criteria
Steam heeft een spellen onder $ 10 sectie van hun winkelpagina. Ergens diep in het hart van hun systemen is er waarschijnlijk een vraag die er ongeveer zo uitziet:
SELECT *
FROM Items
WHERE Price < 10
Gebruik IN om rijen te retourneren met een waarde in een lijst
In dit voorbeeld wordt de autotabel uit de voorbeelddatabases gebruikt.
SELECT *
FROM Cars
WHERE TotalCost IN (100, 200, 300)
Deze zoekopdracht retourneert Auto # 2 die 200 kost en Auto # 3 die 100 kost. Merk op dat dit overeenkomt met het gebruik van meerdere clausules met OR
, bijvoorbeeld:
SELECT *
FROM Cars
WHERE TotalCost = 100 OR TotalCost = 200 OR TotalCost = 300
Gebruik LIKE om overeenkomende tekenreeksen en substrings te vinden
Zie volledige documentatie over LIKE-operator .
In dit voorbeeld wordt de tabel Werknemers uit de voorbeelddatabases gebruikt.
SELECT *
FROM Employees
WHERE FName LIKE 'John'
Deze zoekopdracht retourneert alleen werknemer # 1 waarvan de voornaam exact overeenkomt met 'John'.
SELECT *
FROM Employees
WHERE FName like 'John%'
Door %
toe te voegen, kunt u zoeken naar een substring:
-
John%
- geeft elke werknemer terug wiens naam begint met 'John', gevolgd door een willekeurig aantal tekens -
%John
- retourneert elke werknemer wiens naam eindigt op 'John', gevolgd door een willekeurig aantal tekens -
%John%
- retourneert elke werknemer wiens naam 'John' bevat ergens binnen de waarde
In dit geval retourneert de zoekopdracht werknemer # 2 met de naam 'John', evenals werknemer # 4 met de naam 'Johnathon'.
WAAR clausule met NULL / NIET NULL waarden
SELECT *
FROM Employees
WHERE ManagerId IS NULL
Deze verklaring retourneert alle werknemersrecords waarvan de waarde van de kolom ManagerId
NULL
.
Het resultaat zal zijn:
Id FName LName PhoneNumber ManagerId DepartmentId
1 James Smith 1234567890 NULL 1
SELECT *
FROM Employees
WHERE ManagerId IS NOT NULL
Deze verklaring retourneert alle werknemersrecords waarvan de waarde van de ManagerId
niet NULL
.
Het resultaat zal zijn:
Id FName LName PhoneNumber ManagerId DepartmentId
2 John Johnson 2468101214 1 1
3 Michael Williams 1357911131 1 2
4 Johnathon Smith 1212121212 2 1
Opmerking: dezelfde zoekopdracht retourneert geen resultaten als u de clausule WHERE ManagerId = NULL
in WHERE ManagerId = NULL
of WHERE ManagerId <> NULL
.
Gebruik HEBBEN met verzamelfuncties
In tegenstelling tot de WHERE
component kan HAVING
worden gebruikt met geaggregeerde functies.
Een aggregatiefunctie is een functie waarbij de waarden van meerdere rijen worden gegroepeerd als invoer op bepaalde criteria om een enkele waarde met een significantere betekenis of meting te vormen ( Wikipedia ).
Veelgebruikte aggregatiefuncties zijn COUNT()
, SUM()
, MIN()
en MAX()
.
In dit voorbeeld wordt de autotabel uit de voorbeelddatabases gebruikt.
SELECT CustomerId, COUNT(Id) AS [Number of Cars]
FROM Cars
GROUP BY CustomerId
HAVING COUNT(Id) > 1
Deze zoekopdracht retourneert het aantal CustomerId
Number of Cars
en Number of Cars
van elke klant die meer dan één auto heeft. In dit geval is klant # 1 de enige klant die meer dan één auto heeft.
De resultaten zien er als volgt uit:
Klanten ID | Aantal auto's |
---|---|
1 | 2 |
Gebruik TUSSEN om resultaten te filteren
De volgende voorbeelden gebruiken de voorbeelddatabases Artikelverkoop en Klanten .
Opmerking: de operator TUSSEN is inclusief.
De operator BETWEEN met Numbers gebruiken:
SELECT * From ItemSales
WHERE Quantity BETWEEN 10 AND 17
Deze query retourneert alle ItemSales
records met een hoeveelheid groter dan of gelijk aan 10 en kleiner dan of gelijk aan 17. De resultaten zien er als volgt uit:
ID kaart | Verkoopdatum | Item ID | Aantal stuks | Prijs |
---|---|---|---|---|
1 | 2013/07/01 | 100 | 10 | 34.5 |
4 | 2013/07/23 | 100 | 15 | 34.5 |
5 | 2013/07/24 | 145 | 10 | 34.5 |
De operator BETWEEN met datumwaarden gebruiken:
SELECT * From ItemSales
WHERE SaleDate BETWEEN '2013-07-11' AND '2013-05-24'
Deze zoekopdracht retourneert alle ItemSales
records met een SaleDate
die groter is dan of gelijk is aan 11 juli 2013 en kleiner is dan of gelijk is aan 24 mei 2013.
ID kaart | Verkoopdatum | Item ID | Aantal stuks | Prijs |
---|---|---|---|---|
3 | 2013/07/11 | 100 | 20 | 34.5 |
4 | 2013/07/23 | 100 | 15 | 34.5 |
5 | 2013/07/24 | 145 | 10 | 34.5 |
Bij het vergelijken van datetime-waarden in plaats van datums, moet u mogelijk de datetime-waarden omzetten in datumwaarden of 24 uur optellen of aftrekken om de juiste resultaten te krijgen.
De operator BETWEEN met tekstwaarden gebruiken:
SELECT Id, FName, LName FROM Customers
WHERE LName BETWEEN 'D' AND 'L';
Live voorbeeld: SQL fiddle
Deze zoekopdracht retourneert alle klanten waarvan de naam alfabetisch tussen de letters 'D' en 'L' valt. In dit geval worden klant # 1 en # 3 geretourneerd. Klant # 2, wiens naam begint met een 'M' wordt niet opgenomen.
ID kaart | FName | lname |
---|---|---|
1 | William | Jones |
3 | Richard | Davis |
Gelijkheid
SELECT * FROM Employees
Deze verklaring retourneert alle rijen uit de tabel Employees
.
Id FName LName PhoneNumber ManagerId DepartmentId Salary Hire_date CreatedDate ModifiedDate
1 James Smith 1234567890 NULL 1 1000 01-01-2002 01-01-2002 01-01-2002
2 John Johnson 2468101214 1 1 400 23-03-2005 23-03-2005 01-01-2002
3 Michael Williams 1357911131 1 2 600 12-05-2009 12-05-2009 NULL
4 Johnathon Smith 1212121212 2 1 500 24-07-2016 24-07-2016 01-01-2002
Met behulp van een WHERE
aan het einde van uw SELECT
instructie kunt u de geretourneerde rijen beperken tot een voorwaarde. In dit geval, wanneer er een exacte overeenkomst is met het =
-teken:
SELECT * FROM Employees WHERE DepartmentId = 1
Retourneert alleen de rijen waarbij het DepartmentId
gelijk is aan 1
:
Id FName LName PhoneNumber ManagerId DepartmentId Salary Hire_date CreatedDate ModifiedDate
1 James Smith 1234567890 NULL 1 1000 01-01-2002 01-01-2002 01-01-2002
2 John Johnson 2468101214 1 1 400 23-03-2005 23-03-2005 01-01-2002
4 Johnathon Smith 1212121212 2 1 500 24-07-2016 24-07-2016 01-01-2002
EN en OF
Je kunt ook verschillende operators combineren om complexere WHERE
voorwaarden te creëren. De volgende voorbeelden gebruiken de tabel Employees
:
Id FName LName PhoneNumber ManagerId DepartmentId Salary Hire_date CreatedDate ModifiedDate
1 James Smith 1234567890 NULL 1 1000 01-01-2002 01-01-2002 01-01-2002
2 John Johnson 2468101214 1 1 400 23-03-2005 23-03-2005 01-01-2002
3 Michael Williams 1357911131 1 2 600 12-05-2009 12-05-2009 NULL
4 Johnathon Smith 1212121212 2 1 500 24-07-2016 24-07-2016 01-01-2002
EN
SELECT * FROM Employees WHERE DepartmentId = 1 AND ManagerId = 1
Zal terugkomen:
Id FName LName PhoneNumber ManagerId DepartmentId Salary Hire_date CreatedDate ModifiedDate
2 John Johnson 2468101214 1 1 400 23-03-2005 23-03-2005 01-01-2002
OF
SELECT * FROM Employees WHERE DepartmentId = 2 OR ManagerId = 2
Zal terugkomen:
Id FName LName PhoneNumber ManagerId DepartmentId Salary Hire_date CreatedDate ModifiedDate
3 Michael Williams 1357911131 1 2 600 12-05-2009 12-05-2009 NULL
4 Johnathon Smith 1212121212 2 1 500 24-07-2016 24-07-2016 01-01-2002
Gebruik HEBBEN om te controleren op meerdere voorwaarden in een groep
Orderentabel
Klanten ID | Product-ID | Aantal stuks | Prijs |
---|---|---|---|
1 | 2 | 5 | 100 |
1 | 3 | 2 | 200 |
1 | 4 | 1 | 500 |
2 | 1 | 4 | 50 |
3 | 5 | 6 | 700 |
Om te controleren op klanten die beide hebben besteld - ProductID 2 en 3, kan HAVING worden gebruikt
select customerId
from orders
where productID in (2,3)
group by customerId
having count(distinct productID) = 2
Winstwaarde:
Klanten ID |
---|
1 |
De query selecteert alleen records met de product-ID's in vragen en met de clausules HAVING voor groepen met 2 product-ID's en niet slechts één.
Een andere mogelijkheid zou zijn
select customerId
from orders
group by customerId
having sum(case when productID = 2 then 1 else 0 end) > 0
and sum(case when productID = 3 then 1 else 0 end) > 0
Deze query selecteert alleen groepen met ten minste één record met productID 2 en ten minste één met productID 3.
Waar BESTAAT
Selecteert records in TableName
die overeenkomende records hebben in TableName1
.
SELECT * FROM TableName t WHERE EXISTS (
SELECT 1 FROM TableName1 t1 where t.Id = t1.Id)