SQL
Filtruj wyniki za pomocą GDZIE i POSIADANIE
Szukaj…
Składnia
- WYBIERZ nazwę_kolumny
FROM nazwa_tabeli
GDZIE wartość operatora nazwa_kolumny - WYBIERZ nazwę_kolumny, funkcja_gregatowa (nazwa_kolumny)
FROM nazwa_tabeli
GROUP BY nazwa_kolumny
POSIADAJĄC wartość operatora nazwa_funkcji (nazwa_kolumny)
Klauzula WHERE zwraca tylko wiersze spełniające jej kryteria
Steam ma gry poniżej 10 USD na stronie sklepu. Gdzieś głęboko w sercu ich systemów jest prawdopodobnie zapytanie, które wygląda mniej więcej tak:
SELECT *
FROM Items
WHERE Price < 10
Użyj IN, aby zwrócić wiersze z wartością zawartą na liście
W tym przykładzie użyto tabeli samochodów z przykładowych baz danych.
SELECT *
FROM Cars
WHERE TotalCost IN (100, 200, 300)
To zapytanie zwróci Samochód nr 2, który kosztuje 200, i Samochód nr 3, który kosztuje 100. Zauważ, że jest to równoważne z użyciem wielu klauzul z OR
, np .:
SELECT *
FROM Cars
WHERE TotalCost = 100 OR TotalCost = 200 OR TotalCost = 300
Użyj LIKE, aby znaleźć pasujące ciągi i podciągi
Zobacz pełną dokumentację operatora LIKE .
W tym przykładzie użyto tabeli pracowników z przykładowych baz danych.
SELECT *
FROM Employees
WHERE FName LIKE 'John'
To zapytanie zwróci tylko pracownika nr 1, którego imię dokładnie pasuje do „John”.
SELECT *
FROM Employees
WHERE FName like 'John%'
Dodanie %
pozwala wyszukać podciąg:
-
John%
- zwraca każdego pracownika, którego imię zaczyna się od „John”, po którym następuje dowolna liczba znaków -
%John
- zwraca każdego pracownika, którego nazwisko kończy się na „John”, poprzedzone dowolną liczbą znaków -
%John%
- zwróci każdego pracownika, którego nazwisko zawiera „John” w dowolnym miejscu w obrębie wartości
W takim przypadku zapytanie zwróci Pracownika nr 2 o nazwisku „John” oraz Pracownika nr 4 o nazwie „Johnathon”.
GDZIE klauzula z wartościami NULL / NOT NULL
SELECT *
FROM Employees
WHERE ManagerId IS NULL
Ta instrukcja zwróci wszystkie rekordy pracowników, w których wartość kolumny ManagerId
wynosi NULL
.
Wynik będzie:
Id FName LName PhoneNumber ManagerId DepartmentId
1 James Smith 1234567890 NULL 1
SELECT *
FROM Employees
WHERE ManagerId IS NOT NULL
To oświadczenie zwróci wszystkie rekordy pracowników, w przypadku których wartość identyfikatora ManagerId
nie jest równa NULL
.
Wynik będzie:
Id FName LName PhoneNumber ManagerId DepartmentId
2 John Johnson 2468101214 1 1
3 Michael Williams 1357911131 1 2
4 Johnathon Smith 1212121212 2 1
Uwaga: To samo zapytanie nie zwróci wyników, jeśli zmienisz klauzulę WHERE ManagerId = NULL
na WHERE ManagerId = NULL
lub WHERE ManagerId <> NULL
.
Użyj opcji HAVING z funkcjami agregującymi
W przeciwieństwie do klauzuli WHERE
, HAVING
może być używany z funkcjami agregującymi.
Funkcja agregująca to funkcja, w której wartości wielu wierszy są grupowane jako dane wejściowe według określonych kryteriów w celu utworzenia pojedynczej wartości o bardziej znaczącym znaczeniu lub pomiarze ( Wikipedia ).
Typowe funkcje agregujące obejmują COUNT()
, SUM()
, MIN()
i MAX()
.
W tym przykładzie użyto tabeli samochodów z przykładowych baz danych.
SELECT CustomerId, COUNT(Id) AS [Number of Cars]
FROM Cars
GROUP BY CustomerId
HAVING COUNT(Id) > 1
To zapytanie zwróci CustomerId
i Number of Cars
każdego klienta, który ma więcej niż jeden samochód. W takim przypadku jedynym klientem, który ma więcej niż jeden samochód, jest Klient nr 1.
Wyniki będą wyglądać następująco:
Identyfikator klienta | Liczba samochodów |
---|---|
1 | 2) |
Użyj MIĘDZY do filtrowania wyników
W poniższych przykładach wykorzystano przykładowe bazy danych Sprzedaż towarów i Klienci .
Uwaga: operator BETWEEN jest włączony.
Używanie operatora BETWEEN z liczbami:
SELECT * From ItemSales
WHERE Quantity BETWEEN 10 AND 17
To zapytanie zwróci wszystkie rekordy ItemSales
, których ilość jest większa lub równa 10 i mniejsza lub równa 17. Wyniki będą wyglądać następująco:
ID | Data wyprzedaży | ItemId | Ilość | Cena £ |
---|---|---|---|---|
1 | 01.07.2013 | 100 | 10 | 34,5 |
4 | 2013-07-23 | 100 | 15 | 34,5 |
5 | 2013-07-24 | 145 | 10 | 34,5 |
Używanie operatora BETWEEN z wartościami daty:
SELECT * From ItemSales
WHERE SaleDate BETWEEN '2013-07-11' AND '2013-05-24'
To zapytanie zwróci wszystkie ItemSales
rekordy z SaleDate
, która jest większa lub równa 11 lipca 2013 i mniejsza lub równa 24 maja 2013 r.
ID | Data wyprzedaży | ItemId | Ilość | Cena £ |
---|---|---|---|---|
3) | 2013-07-11 | 100 | 20 | 34,5 |
4 | 2013-07-23 | 100 | 15 | 34,5 |
5 | 2013-07-24 | 145 | 10 | 34,5 |
Porównując wartości daty i godziny zamiast dat, może być konieczne przekonwertowanie wartości daty i godziny na wartości daty lub dodanie lub odjęcie 24 godzin, aby uzyskać prawidłowe wyniki.
Używanie operatora BETWEEN z wartościami tekstowymi:
SELECT Id, FName, LName FROM Customers
WHERE LName BETWEEN 'D' AND 'L';
Przykład na żywo: skrzypce SQL
To zapytanie zwróci wszystkich klientów, których nazwa alfabetycznie mieści się między literami „D” i „L”. W takim przypadku klient nr 1 i nr 3 zostaną zwrócone. Klient nr 2, którego nazwa zaczyna się na „M”, nie zostanie uwzględniony.
ID | FName | LName |
---|---|---|
1 | William | Jones |
3) | Richard | Davis |
Równość
SELECT * FROM Employees
Ta instrukcja zwróci wszystkie wiersze z tabeli 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
Użycie WHERE
na końcu instrukcji SELECT
pozwala ograniczyć zwracane wiersze do warunku. W takim przypadku, gdy istnieje dokładne dopasowanie za pomocą znaku =
:
SELECT * FROM Employees WHERE DepartmentId = 1
Zwróci tylko wiersze, w których DepartmentId
jest równy 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
I i LUB
Możesz także połączyć kilku operatorów razem, aby stworzyć bardziej złożone WHERE
. Poniższe przykłady wykorzystują 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
I
SELECT * FROM Employees WHERE DepartmentId = 1 AND ManagerId = 1
Wróci:
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
LUB
SELECT * FROM Employees WHERE DepartmentId = 2 OR ManagerId = 2
Wróci:
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
Użyj opcji HAVING, aby sprawdzić wiele warunków w grupie
Tabela zamówień
Identyfikator klienta | ID produktu | Ilość | Cena £ |
---|---|---|---|
1 | 2) | 5 | 100 |
1 | 3) | 2) | 200 |
1 | 4 | 1 | 500 |
2) | 1 | 4 | 50 |
3) | 5 | 6 | 700 |
Aby sprawdzić klientów, którzy zamówili oba - ProductID 2 i 3, można użyć HAVING
select customerId
from orders
where productID in (2,3)
group by customerId
having count(distinct productID) = 2
Zwracana wartość:
Identyfikator klienta |
---|
1 |
Zapytanie wybiera tylko rekordy z identyfikatorami produktu w pytaniach i z klauzulą HAVING dla grup mających 2 identyfikatory produktu, a nie tylko jeden.
Inną możliwością byłoby
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
To zapytanie wybiera tylko grupy mające co najmniej jeden rekord o identyfikatorze produktu 2 i co najmniej jeden o identyfikatorze produktu 3.
Gdzie ISTNIEJE
Wybiera rekordy w TableName
które mają rekordy pasujące w TableName1
.
SELECT * FROM TableName t WHERE EXISTS (
SELECT 1 FROM TableName1 t1 where t.Id = t1.Id)