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)