SQL
Filtrera resultat med WHERE och HAVING
Sök…
Syntax
- VÄLJ kolumnnamn
FRÅN tabellnamn
VAR kolumnnamn operatörens värde - SELECT column_name, aggregate_function (column_name)
FRÅN tabellnamn
GROUP BY column_name
HAR aggregat_funktion (kolumnnamn) operatörsvärde
WHERE-klausulen returnerar bara rader som matchar dess kriterier
Steam har ett spel under $ 10 på deras butiksida. Någonstans djupt i hjärtat av deras system finns det förmodligen en fråga som ser ut som:
SELECT *
FROM Items
WHERE Price < 10
Använd IN för att returnera rader med ett värde som finns i en lista
I det här exemplet används biltabellen från exempeldatabaserna.
SELECT *
FROM Cars
WHERE TotalCost IN (100, 200, 300)
Denna fråga returnerar bil nr 2 som kostar 200 och bil # 3 som kostar 100. Observera att detta motsvarar användning av flera klausuler med OR
, t.ex.
SELECT *
FROM Cars
WHERE TotalCost = 100 OR TotalCost = 200 OR TotalCost = 300
Använd LIKE för att hitta matchande strängar och underlag
Se fullständig dokumentation om LIKE operatör .
I det här exemplet används medarbetartabellen från exempeldatabaserna.
SELECT *
FROM Employees
WHERE FName LIKE 'John'
Denna fråga returnerar endast anställd nr 1 vars förnamn matchar 'John' exakt.
SELECT *
FROM Employees
WHERE FName like 'John%'
Genom att lägga till %
kan du söka efter en substring:
-
John%
- returnerar alla anställda vars namn börjar med 'John', följt av valfritt antal tecken -
%John
- kommer att returnera alla anställda vars namn slutar med 'John', fortsätter med alla tecken -
%John%
- kommer att returnera alla anställda vars namn innehåller 'John' var som helst inom värdet
I detta fall kommer frågan att returnera anställd # 2 vars namn är 'John' samt anställd # 4 vars namn är 'Johnathon'.
VAR-klausul med NULL / NOT NULL-värden
SELECT *
FROM Employees
WHERE ManagerId IS NULL
Detta uttalande kommer att returnera alla anställda poster där värdet på kolumnen ManagerId
är NULL
.
Resultatet blir:
Id FName LName PhoneNumber ManagerId DepartmentId
1 James Smith 1234567890 NULL 1
SELECT *
FROM Employees
WHERE ManagerId IS NOT NULL
Detta uttalande kommer att returnera alla anställda poster där värdet på ManagerId
inte är NULL
.
Resultatet blir:
Id FName LName PhoneNumber ManagerId DepartmentId
2 John Johnson 2468101214 1 1
3 Michael Williams 1357911131 1 2
4 Johnathon Smith 1212121212 2 1
Obs: Samma fråga returnerar inte resultat om du ändrar WHERE-klausulen till WHERE ManagerId = NULL
eller WHERE ManagerId <> NULL
.
Använd HAVING med samlade funktioner
Till skillnad från WHERE
klausulen kan HAVING
användas med aggregerade funktioner.
En aggregerad funktion är en funktion där värdena för flera rader grupperas tillsammans som inmatning på vissa kriterier för att bilda ett enda värde med mer betydande betydelse eller mätning ( Wikipedia ).
Vanliga aggregerade funktioner inkluderar COUNT()
, SUM()
, MIN()
och MAX()
.
I det här exemplet används biltabellen från exempeldatabaserna.
SELECT CustomerId, COUNT(Id) AS [Number of Cars]
FROM Cars
GROUP BY CustomerId
HAVING COUNT(Id) > 1
Denna fråga returnerar CustomerId
och Number of Cars
för alla kunder som har mer än en bil. I det här fallet är den enda kunden som har mer än en bil kund nr 1.
Resultaten kommer att se ut som:
Kundnummer | Antal bilar |
---|---|
1 | 2 |
Använd MELLAN för att filtrera resultat
Följande exempel använder exempeldatabaser för artikelförsäljning och kunder .
Obs: Operatören MELLAN är inklusive.
Använda BETWEEN-operatören med siffror:
SELECT * From ItemSales
WHERE Quantity BETWEEN 10 AND 17
Denna fråga returnerar alla ItemSales
poster som har en kvantitet som är större eller lika med 10 och mindre än eller lika med 17. Resultaten kommer att se ut:
Id | SaleDate | Artikelnummer | Kvantitet | Pris |
---|---|---|---|---|
1 | 2013/07/01 | 100 | 10 | 34,5 |
4 | 2013/07/23 | 100 | 15 | 34,5 |
5 | 2013/07/24 | 145 | 10 | 34,5 |
Använda BETWEEN-operatören med datumvärden:
SELECT * From ItemSales
WHERE SaleDate BETWEEN '2013-07-11' AND '2013-05-24'
Denna fråga returnerar alla ItemSales
poster med en SaleDate
som är större än eller lika med 11 juli 2013 och mindre än eller lika med 24 maj 2013.
Id | SaleDate | Artikelnummer | Kvantitet | Pris |
---|---|---|---|---|
3 | 2013/07/11 | 100 | 20 | 34,5 |
4 | 2013/07/23 | 100 | 15 | 34,5 |
5 | 2013/07/24 | 145 | 10 | 34,5 |
När du jämför jämförelsevärden istället för datum, kan du behöva konvertera datatvärdena till ett datumvärde eller lägga till eller subtrahera 24 timmar för att få rätt resultat.
Använda BETWEEN-operatören med textvärden:
SELECT Id, FName, LName FROM Customers
WHERE LName BETWEEN 'D' AND 'L';
Live-exempel: SQL-fiol
Denna fråga returnerar alla kunder vars namn alfabetiskt faller mellan bokstäverna 'D' och 'L'. I detta fall kommer kund nr 1 och nr 3 att returneras. Kund nr 2, vars namn börjar med en 'M' kommer inte att inkluderas.
Id | fNAME | LNAME |
---|---|---|
1 | William | Jones |
3 | Richard | Davis |
Jämlikhet
SELECT * FROM Employees
Detta uttalande returnerar alla rader från tabellen 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
Om du använder en WHERE
i slutet av ditt SELECT
uttalande kan du begränsa de returnerade raderna till ett villkor. I det här fallet, där det finns en exakt matchning med hjälp av =
-tecknet:
SELECT * FROM Employees WHERE DepartmentId = 1
Kommer bara att returnera raderna där DepartmentId
är lika med 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
OCH och ELLER
Du kan också kombinera flera operatörer tillsammans för att skapa mer komplexa WHERE
förhållanden. Följande exempel använder tabellen 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
OCH
SELECT * FROM Employees WHERE DepartmentId = 1 AND ManagerId = 1
Kommer att återvända:
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
ELLER
SELECT * FROM Employees WHERE DepartmentId = 2 OR ManagerId = 2
Kommer att återvända:
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
Använd HAVING för att kontrollera om det finns flera villkor i en grupp
Beställningstabell
Kundnummer | Serienummer | Kvantitet | Pris |
---|---|---|---|
1 | 2 | 5 | 100 |
1 | 3 | 2 | 200 |
1 | 4 | 1 | 500 |
2 | 1 | 4 | 50 |
3 | 5 | 6 | 700 |
För att söka efter kunder som har beställt båda - ProductID 2 och 3, kan HAVING användas
select customerId
from orders
where productID in (2,3)
group by customerId
having count(distinct productID) = 2
Returvärde:
Kundnummer |
---|
1 |
Frågan väljer endast poster med produkt-ID: erna i frågor och med HAVING-klausulskontroller för grupper med två produkt-ID och inte bara en.
En annan möjlighet skulle vara
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
Denna fråga väljer endast grupper som har minst en post med produktID 2 och minst en med produktID 3.
Var existerar
Väljer poster i TableName
som har poster som matchar i TableName1
.
SELECT * FROM TableName t WHERE EXISTS (
SELECT 1 FROM TableName1 t1 where t.Id = t1.Id)