SQL
Filtra i risultati usando WHERE e HAVING
Ricerca…
Sintassi
- SELEZIONA nome_colonna
FROM nome_tabella
WHERE nome_operatore valore dell'operatore - SELECT column_name, aggregate_function (column_name)
FROM nome_tabella
GROUP BY nome_colonna
Valore operatore HAVING aggregate_function (column_name)
La clausola WHERE restituisce solo le righe che corrispondono ai suoi criteri
Steam ha un gioco sotto la sezione $ 10 della loro pagina del negozio. Da qualche parte nel profondo dei loro sistemi, c'è probabilmente una query che assomiglia a qualcosa:
SELECT *
FROM Items
WHERE Price < 10
Utilizzare IN per restituire righe con un valore contenuto in un elenco
Questo esempio utilizza la tabella Car dai database di esempio.
SELECT *
FROM Cars
WHERE TotalCost IN (100, 200, 300)
Questa query restituirà Car # 2 che costa 200 e Car # 3 che costa 100. Si noti che questo è equivalente all'utilizzo di più clausole con OR
, ad esempio:
SELECT *
FROM Cars
WHERE TotalCost = 100 OR TotalCost = 200 OR TotalCost = 300
Usa LIKE per trovare stringhe e sottostringhe corrispondenti
Vedi la documentazione completa sull'operatore LIKE .
Questo esempio utilizza la tabella Impiegati dai database di esempio.
SELECT *
FROM Employees
WHERE FName LIKE 'John'
Questa query restituirà solo Employee # 1 il cui nome di battesimo corrisponde esattamente a "John".
SELECT *
FROM Employees
WHERE FName like 'John%'
L'aggiunta di %
ti consente di cercare una sottostringa:
-
John%
- restituirà qualsiasi Dipendente il cui nome inizia con "John", seguito da qualsiasi quantità di caratteri -
%John
- restituirà qualsiasi Dipendente il cui nome termina con "John", preceduto da qualsiasi quantità di caratteri -
%John%
- restituirà qualsiasi Dipendente il cui nome contenga "John" in qualsiasi punto all'interno del valore
In questo caso, la query restituirà Employee # 2 il cui nome è 'John' così come Employee # 4 il cui nome è 'Johnathon'.
Clausola WHERE con valori NULL / NOT NULL
SELECT *
FROM Employees
WHERE ManagerId IS NULL
Questa istruzione restituirà tutti i record Employee in cui il valore della colonna ManagerId
è NULL
.
Il risultato sarà:
Id FName LName PhoneNumber ManagerId DepartmentId
1 James Smith 1234567890 NULL 1
SELECT *
FROM Employees
WHERE ManagerId IS NOT NULL
Questa istruzione restituirà tutti i record Employee in cui il valore di ManagerId
non è NULL
.
Il risultato sarà:
Id FName LName PhoneNumber ManagerId DepartmentId
2 John Johnson 2468101214 1 1
3 Michael Williams 1357911131 1 2
4 Johnathon Smith 1212121212 2 1
Nota: la stessa query non restituirà risultati se si modifica la clausola WHERE ManagerId = NULL
in WHERE ManagerId = NULL
o WHERE ManagerId <> NULL
.
Utilizzare HAVING con le funzioni aggregate
A differenza della clausola WHERE
, HAVING
può essere utilizzato con funzioni aggregate.
Una funzione aggregata è una funzione in cui i valori di più righe sono raggruppati come input su determinati criteri per formare un singolo valore di significato o misura più significativo ( Wikipedia ).
Le funzioni di aggregazione comuni includono COUNT()
, SUM()
, MIN()
e MAX()
.
Questo esempio utilizza la tabella Car dai database di esempio.
SELECT CustomerId, COUNT(Id) AS [Number of Cars]
FROM Cars
GROUP BY CustomerId
HAVING COUNT(Id) > 1
Questa query restituirà il conteggio CustomerId
e Number of Cars
di qualsiasi cliente che abbia più di un'auto. In questo caso, l'unico cliente che ha più di un'auto è il Cliente n. 1.
I risultati saranno simili a:
Identificativo del cliente | Numero di auto |
---|---|
1 | 2 |
Utilizzare TRA per filtrare i risultati
Negli esempi seguenti vengono utilizzati i database di esempio Item Sales and Customers .
Nota: l'operatore BETWEEN è incluso.
Utilizzando l'operatore BETWEEN con i numeri:
SELECT * From ItemSales
WHERE Quantity BETWEEN 10 AND 17
Questa query restituirà tutti i record ItemSales
che hanno una quantità maggiore o uguale a 10 e minore o uguale a 17. I risultati saranno simili a:
Id | Data di vendita | Numero identificativo dell'oggetto | Quantità | Prezzo |
---|---|---|---|---|
1 | 2013/07/01 | 100 | 10 | 34.5 |
4 | 2013/07/23 | 100 | 15 | 34.5 |
5 | 2013/07/24 | 145 | 10 | 34.5 |
Utilizzo dell'operatore BETWEEN con i valori di data:
SELECT * From ItemSales
WHERE SaleDate BETWEEN '2013-07-11' AND '2013-05-24'
Questa query restituirà tutti i record ItemSales
con un SaleDate
maggiore o uguale all'11 luglio 2013 e inferiore o uguale al 24 maggio 2013.
Id | Data di vendita | Numero identificativo dell'oggetto | Quantità | Prezzo |
---|---|---|---|---|
3 | 2013/07/11 | 100 | 20 | 34.5 |
4 | 2013/07/23 | 100 | 15 | 34.5 |
5 | 2013/07/24 | 145 | 10 | 34.5 |
Quando si confrontano i valori datetime anziché le date, potrebbe essere necessario convertire i valori datetime in valori data o aggiungere o sottrarre 24 ore per ottenere i risultati corretti.
Utilizzo dell'operatore BETWEEN con valori di testo:
SELECT Id, FName, LName FROM Customers
WHERE LName BETWEEN 'D' AND 'L';
Esempio dal vivo: violino SQL
Questa query restituirà tutti i clienti il cui nome cade alfabeticamente tra le lettere "D" e "L". In questo caso, i clienti n. 1 e n. 3 verranno restituiti. Il cliente n. 2, il cui nome inizia con una "M" non sarà incluso.
Id | FName | LName |
---|---|---|
1 | William | Jones |
3 | Richard | Davis |
Uguaglianza
SELECT * FROM Employees
Questa dichiarazione restituirà tutte le righe dalla tabella 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
L'utilizzo di un WHERE
alla fine SELECT
consente di limitare le righe restituite a una condizione. In questo caso, dove c'è una corrispondenza esatta usando il segno =
:
SELECT * FROM Employees WHERE DepartmentId = 1
Restituirà solo le righe in cui DepartmentId
è uguale a 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
AND e OR
Puoi anche combinare più operatori per creare condizioni WHERE
più complesse. Gli esempi seguenti utilizzano la tabella 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
E
SELECT * FROM Employees WHERE DepartmentId = 1 AND ManagerId = 1
Tornerà:
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
O
SELECT * FROM Employees WHERE DepartmentId = 2 OR ManagerId = 2
Tornerà:
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
Utilizzare HAVING per verificare più condizioni in un gruppo
Tabella degli ordini
Identificativo del cliente | Codice prodotto | Quantità | Prezzo |
---|---|---|---|
1 | 2 | 5 | 100 |
1 | 3 | 2 | 200 |
1 | 4 | 1 | 500 |
2 | 1 | 4 | 50 |
3 | 5 | 6 | 700 |
Per verificare i clienti che hanno ordinato entrambi - ProductID 2 e 3, è possibile utilizzare HAVING
select customerId
from orders
where productID in (2,3)
group by customerId
having count(distinct productID) = 2
Valore di ritorno:
identificativo del cliente |
---|
1 |
La query seleziona solo i record con ID prodotto nelle domande e con la clausola HAVING controlla se i gruppi hanno 2 ID prodotto e non solo uno.
Un'altra possibilità sarebbe
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
Questa query seleziona solo i gruppi che hanno almeno un record con ID prodotto 2 e almeno uno con ID prodotto 3.
Dove ESISTE
Selezionerà i record in TableName
con i record corrispondenti in TableName1
.
SELECT * FROM TableName t WHERE EXISTS (
SELECT 1 FROM TableName1 t1 where t.Id = t1.Id)