SQL
Filtern Sie die Ergebnisse mit WHERE und HAVING
Suche…
Syntax
- SELECT Spaltenname
FROM tabellenname
WHERE Spaltenname Operatorwert - SELECT Spaltenname, Aggregatfunktion (Spaltenname)
FROM tabellenname
GROUP BY Spaltenname
HAVING Aggregate_function (Spaltenname) Operatorwert
Die WHERE-Klausel gibt nur Zeilen zurück, die ihren Kriterien entsprechen
Steam bietet Spiele unter 10 USD auf der Shop-Seite. Irgendwo tief im Herzen ihrer Systeme gibt es wahrscheinlich eine Abfrage, die ungefähr so aussieht:
SELECT *
FROM Items
WHERE Price < 10
Verwenden Sie IN, um Zeilen mit einem in einer Liste enthaltenen Wert zurückzugeben
In diesem Beispiel wird die Autotabelle aus den Beispieldatenbanken verwendet.
SELECT *
FROM Cars
WHERE TotalCost IN (100, 200, 300)
Diese Abfrage gibt Auto Nr. 2 zurück, das 200 kostet, und Auto Nr. 3, das 100 kostet. Beachten Sie, dass dies der Verwendung mehrerer Klauseln mit OR
, z.
SELECT *
FROM Cars
WHERE TotalCost = 100 OR TotalCost = 200 OR TotalCost = 300
Verwenden Sie LIKE, um übereinstimmende Zeichenfolgen und Teilzeichenfolgen zu finden
Siehe vollständige Dokumentation zum LIKE-Operator .
In diesem Beispiel wird die Employees-Tabelle aus den Beispieldatenbanken verwendet.
SELECT *
FROM Employees
WHERE FName LIKE 'John'
Diese Abfrage gibt nur Mitarbeiter # 1 zurück, dessen Vorname genau mit 'John' übereinstimmt.
SELECT *
FROM Employees
WHERE FName like 'John%'
Durch Hinzufügen von %
können Sie nach einer Teilzeichenfolge suchen:
-
John%
- gibt jeden Mitarbeiter zurück, dessen Name mit 'John' beginnt, gefolgt von einer beliebigen Anzahl von Zeichen -
%John
- gibt jeden Mitarbeiter zurück, dessen Name mit 'John' endet, gefolgt von einer beliebigen Anzahl von Zeichen -
%John%
- gibt jeden Mitarbeiter, dessen Name "John" enthält, an eine beliebige Stelle innerhalb des Werts zurück
In diesem Fall gibt die Abfrage Mitarbeiter # 2 mit dem Namen 'John' sowie Mitarbeiter # 4 mit dem Namen 'Johnathon' zurück.
WHERE-Klausel mit NULL / NOT NULL-Werten
SELECT *
FROM Employees
WHERE ManagerId IS NULL
Diese Anweisung gibt alle Employee- Datensätze zurück, bei denen der Wert der ManagerId
Spalte NULL
.
Das Ergebnis wird sein:
Id FName LName PhoneNumber ManagerId DepartmentId
1 James Smith 1234567890 NULL 1
SELECT *
FROM Employees
WHERE ManagerId IS NOT NULL
Diese Anweisung gibt alle Employee- Datensätze zurück, bei denen der Wert der ManagerId
nicht NULL
.
Das Ergebnis wird sein:
Id FName LName PhoneNumber ManagerId DepartmentId
2 John Johnson 2468101214 1 1
3 Michael Williams 1357911131 1 2
4 Johnathon Smith 1212121212 2 1
Anmerkung: WHERE ManagerId = NULL
Abfrage gibt keine Ergebnisse zurück, wenn Sie die WHERE-Klausel in WHERE ManagerId = NULL
oder WHERE ManagerId <> NULL
.
Verwenden Sie HAVING mit Aggregatfunktionen
Im Gegensatz zur WHERE
Klausel kann HAVING
mit Aggregatfunktionen verwendet werden.
Eine Aggregatfunktion ist eine Funktion, bei der die Werte mehrerer Zeilen als Eingabe für bestimmte Kriterien gruppiert werden, um einen einzelnen Wert mit signifikanterer Bedeutung oder Messung ( Wikipedia ) zu bilden.
Häufige Aggregatfunktionen umfassen COUNT()
, SUM()
, MIN()
und MAX()
.
In diesem Beispiel wird die Autotabelle aus den Beispieldatenbanken verwendet.
SELECT CustomerId, COUNT(Id) AS [Number of Cars]
FROM Cars
GROUP BY CustomerId
HAVING COUNT(Id) > 1
Diese Abfrage gibt die CustomerId
und die Number of Cars
jedes Kunden zurück, der mehr als ein Auto hat. In diesem Fall ist der einzige Kunde, der mehr als ein Auto hat, Kunde # 1.
Die Ergebnisse werden wie folgt aussehen:
Kundennummer | Anzahl der Autos |
---|---|
1 | 2 |
Verwenden Sie ZWISCHEN, um Ergebnisse zu filtern
In den folgenden Beispielen werden die Beispieldatenbanken " Artikelverkauf und Kunden" verwendet.
Hinweis: Der Operator BETWEEN ist inklusive.
Verwenden des BETWEEN-Operators mit Zahlen:
SELECT * From ItemSales
WHERE Quantity BETWEEN 10 AND 17
Diese Abfrage gibt alle ItemSales
Datensätze zurück, deren Menge größer oder gleich 10 und kleiner oder gleich 17 ist. Die Ergebnisse sehen folgendermaßen aus:
Ich würde | Verkaufsdatum | Artikel Identifikationsnummer | Menge | Preis |
---|---|---|---|---|
1 | 2013-07-01 | 100 | 10 | 34,5 |
4 | 2013-07-23 | 100 | fünfzehn | 34,5 |
5 | 2013-07-24 | 145 | 10 | 34,5 |
Verwenden des BETWEEN-Operators mit Datumswerten:
SELECT * From ItemSales
WHERE SaleDate BETWEEN '2013-07-11' AND '2013-05-24'
Diese Abfrage gibt alle ItemSales
Datensätze mit einem SaleDate
, das größer oder gleich dem 11. Juli 2013 und weniger als dem 24. Mai 2013 ist.
Ich würde | Verkaufsdatum | Artikel Identifikationsnummer | Menge | Preis |
---|---|---|---|---|
3 | 2013-07-11 | 100 | 20 | 34,5 |
4 | 2013-07-23 | 100 | fünfzehn | 34,5 |
5 | 2013-07-24 | 145 | 10 | 34,5 |
Wenn Sie datetime-Werte anstelle von Datumsangaben vergleichen, müssen Sie die datetime-Werte möglicherweise in Datumswerte konvertieren oder 24 Stunden addieren oder subtrahieren, um die richtigen Ergebnisse zu erhalten.
Verwenden des BETWEEN-Operators mit Textwerten:
SELECT Id, FName, LName FROM Customers
WHERE LName BETWEEN 'D' AND 'L';
Live-Beispiel: SQL-Geige
Diese Abfrage gibt alle Kunden zurück, deren Name alphabetisch zwischen den Buchstaben 'D' und 'L' liegt. In diesem Fall werden Kunde Nr. 1 und Nr. 3 zurückgegeben. Kunde 2, dessen Name mit einem 'M' beginnt, wird nicht berücksichtigt.
Ich würde | FName | LName |
---|---|---|
1 | Wilhelm | Jones |
3 | Richard | Davis |
Gleichberechtigung
SELECT * FROM Employees
Diese Anweisung gibt alle Zeilen aus der Tabelle 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
Wenn Sie am Ende Ihrer SELECT
Anweisung ein WHERE
können Sie die zurückgegebenen Zeilen auf eine Bedingung beschränken. In diesem Fall, wenn es eine genaue Übereinstimmung mit dem =
-Zeichen gibt:
SELECT * FROM Employees WHERE DepartmentId = 1
Gibt nur die Zeilen zurück, bei denen die DepartmentId
gleich 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
UND UND ODER
Sie können auch mehrere Operatoren kombinieren, um komplexere WHERE
Bedingungen zu erstellen. Die folgenden Beispiele verwenden die Employees
Tabelle:
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
UND
SELECT * FROM Employees WHERE DepartmentId = 1 AND ManagerId = 1
Wird zurückkehren:
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
ODER
SELECT * FROM Employees WHERE DepartmentId = 2 OR ManagerId = 2
Wird zurückkehren:
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
Verwenden Sie HAVING, um nach mehreren Bedingungen in einer Gruppe zu suchen
Bestellungstabelle
Kundennummer | Produkt ID | Menge | Preis |
---|---|---|---|
1 | 2 | 5 | 100 |
1 | 3 | 2 | 200 |
1 | 4 | 1 | 500 |
2 | 1 | 4 | 50 |
3 | 5 | 6 | 700 |
Um nach Kunden zu suchen, die beide - ProductID 2 und 3 - bestellt haben, kann HAVING verwendet werden
select customerId
from orders
where productID in (2,3)
group by customerId
having count(distinct productID) = 2
Rückgabewert:
Kundennummer |
---|
1 |
Die Abfrage wählt nur Datensätze mit den Produkt-IDs in Fragen aus und prüft mit der HAVING-Klausel nach Gruppen mit 2 Produkt-IDs und nicht nur einer.
Eine andere Möglichkeit wäre
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
Diese Abfrage wählt nur Gruppen aus, die mindestens einen Datensatz mit der Produkt-ID 2 und mindestens einen mit der Produkt-ID 3 haben.
Wo EXISTEN
TableName
Datensätze in TableName
, deren Datensätze in TableName1
übereinstimmen.
SELECT * FROM TableName t WHERE EXISTS (
SELECT 1 FROM TableName1 t1 where t.Id = t1.Id)