SQL
Filtrar los resultados usando WHERE y HAVING.
Buscar..
Sintaxis
- SELECCIONAR nombre_columna
FROM nombre_tabla
DÓNDE nombre del operador column_name - SELECCIONAR column_name, aggregate_function (column_name)
FROM nombre_tabla
GRUPO POR nombre_columna
TENIENDO el valor del operador aggregate_function (column_name)
La cláusula WHERE solo devuelve filas que coinciden con sus criterios
Steam tiene una sección de juegos por debajo de $ 10 en la página de su tienda. En algún lugar profundo del corazón de sus sistemas, probablemente haya una consulta que se parece a algo como:
SELECT *
FROM Items
WHERE Price < 10
Utilice IN para devolver filas con un valor contenido en una lista
Este ejemplo utiliza la tabla de coches de las bases de datos de ejemplo.
SELECT *
FROM Cars
WHERE TotalCost IN (100, 200, 300)
Esta consulta devolverá el Car # 2, que cuesta 200 y el Car # 3, que cuesta 100. Tenga en cuenta que esto es equivalente a usar varias cláusulas con OR
, por ejemplo:
SELECT *
FROM Cars
WHERE TotalCost = 100 OR TotalCost = 200 OR TotalCost = 300
Usa LIKE para encontrar cadenas y subcadenas que coincidan
Ver la documentación completa en el operador LIKE .
Este ejemplo utiliza la tabla de empleados de las bases de datos de ejemplo.
SELECT *
FROM Employees
WHERE FName LIKE 'John'
Esta consulta solo devolverá al Empleado # 1 cuyo nombre coincide exactamente con 'John'.
SELECT *
FROM Employees
WHERE FName like 'John%'
Agregar %
permite buscar una subcadena:
-
John%
: devolverá a cualquier Empleado cuyo nombre comience con 'John', seguido de cualquier cantidad de caracteres -
%John
: devolverá a cualquier Empleado cuyo nombre termine con 'John', seguido por cualquier cantidad de caracteres -
%John%
: devolverá a cualquier empleado cuyo nombre contenga "John" en cualquier lugar dentro del valor
En este caso, la consulta devolverá al Empleado # 2 cuyo nombre es 'John', así como al Empleado # 4 cuyo nombre es 'Johnathon'.
Cláusula WHERE con valores NULL / NOT NULL
SELECT *
FROM Employees
WHERE ManagerId IS NULL
Esta declaración devolverá todos los registros de Empleado donde el valor de la columna ManagerId
es NULL
.
El resultado será:
Id FName LName PhoneNumber ManagerId DepartmentId
1 James Smith 1234567890 NULL 1
SELECT *
FROM Employees
WHERE ManagerId IS NOT NULL
Esta declaración devolverá todos los registros de Empleado donde el valor de ManagerId
no sea NULL
.
El resultado será:
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 misma consulta no devolverá resultados si cambia la cláusula WHERE ManagerId = NULL
a WHERE ManagerId = NULL
o WHERE ManagerId <> NULL
.
Usar HAVING con funciones agregadas
A diferencia de la cláusula WHERE
, HAVING
se puede usar con funciones agregadas.
Una función agregada es una función donde los valores de varias filas se agrupan como entrada en ciertos criterios para formar un valor único de significado o medida más significativo ( Wikipedia ).
Las funciones agregadas comunes incluyen COUNT()
, SUM()
, MIN()
y MAX()
.
Este ejemplo utiliza la tabla de coches de las bases de datos de ejemplo.
SELECT CustomerId, COUNT(Id) AS [Number of Cars]
FROM Cars
GROUP BY CustomerId
HAVING COUNT(Id) > 1
Esta consulta devolverá el Number of Cars
CustomerId
y Number of Cars
de cualquier cliente que tenga más de un auto. En este caso, el único cliente que tiene más de un automóvil es el Cliente # 1.
Los resultados se verán como:
Identificación del cliente | Numero de autos |
---|---|
1 | 2 |
Use ENTRE para filtrar los resultados
Los siguientes ejemplos utilizan las bases de datos de muestra Item Sales and Customers .
Nota: El operador BETWEEN es inclusivo.
Usando el operador BETWEEN con números:
SELECT * From ItemSales
WHERE Quantity BETWEEN 10 AND 17
Esta consulta devolverá todos los registros de ItemSales
que tienen una cantidad mayor o igual a 10 y menor o igual a 17. Los resultados se verán como:
Carné de identidad | Fecha de venta | Identificación del artículo | Cantidad | Precio |
---|---|---|---|---|
1 | 2013-07-01 | 100 | 10 | 34.5 |
4 | 2013-07-23 | 100 | 15 | 34.5 |
5 | 2013-07-24 | 145 | 10 | 34.5 |
Usando el operador BETWEEN con valores de fecha:
SELECT * From ItemSales
WHERE SaleDate BETWEEN '2013-07-11' AND '2013-05-24'
Esta consulta devolverá todos los registros de ItemSales
con una fecha de SaleDate
mayor o igual al 11 de julio de 2013 y menor o igual al 24 de mayo de 2013.
Carné de identidad | Fecha de venta | Identificación del artículo | Cantidad | Precio |
---|---|---|---|---|
3 | 2013-07-11 | 100 | 20 | 34.5 |
4 | 2013-07-23 | 100 | 15 | 34.5 |
5 | 2013-07-24 | 145 | 10 | 34.5 |
Cuando compare valores de fecha y hora en lugar de fechas, es posible que deba convertir los valores de fecha y hora en valores de fecha, o sumar o restar 24 horas para obtener los resultados correctos.
Usando el operador BETWEEN con valores de texto:
SELECT Id, FName, LName FROM Customers
WHERE LName BETWEEN 'D' AND 'L';
Ejemplo en vivo: violín de SQL
Esta consulta devolverá a todos los clientes cuyo nombre alfabéticamente se encuentre entre las letras 'D' y 'L'. En este caso, los clientes # 1 y # 3 serán devueltos. El cliente # 2, cuyo nombre comience con una 'M' no será incluido.
Carné de identidad | FName | LName |
---|---|---|
1 | William | Jones |
3 | Ricardo | Davis |
Igualdad
SELECT * FROM Employees
Esta declaración devolverá todas las filas de la tabla 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
Usar un WHERE
al final de su instrucción SELECT
permite limitar las filas devueltas a una condición. En este caso, donde hay una coincidencia exacta usando el signo =
:
SELECT * FROM Employees WHERE DepartmentId = 1
Solo devolverá las filas donde el DepartmentId
es igual 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
Y y o
También puede combinar varios operadores para crear condiciones de WHERE
más complejas. Los siguientes ejemplos utilizan la tabla 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
Y
SELECT * FROM Employees WHERE DepartmentId = 1 AND ManagerId = 1
Volverá
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
Volverá
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
Use HAVING para verificar múltiples condiciones en un grupo
Tabla de Pedidos
Identificación del cliente | Identificación de producto | Cantidad | Precio |
---|---|---|---|
1 | 2 | 5 | 100 |
1 | 3 | 2 | 200 |
1 | 4 | 1 | 500 |
2 | 1 | 4 | 50 |
3 | 5 | 6 | 700 |
Para verificar los clientes que han pedido ambos, ProductID 2 y 3, se puede usar HAVING
select customerId
from orders
where productID in (2,3)
group by customerId
having count(distinct productID) = 2
Valor de retorno:
Identificación del cliente |
---|
1 |
La consulta selecciona solo los registros con productIDs en las preguntas y con la cláusula HAVING verifica los grupos que tienen 2 productIds y no solo uno.
Otra posibilidad seria
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
Esta consulta selecciona solo grupos que tienen al menos un registro con productID 2 y al menos uno con productID 3.
Donde exista
Seleccionará registros en TableName
que tengan registros coincidentes en TableName1
.
SELECT * FROM TableName t WHERE EXISTS (
SELECT 1 FROM TableName1 t1 where t.Id = t1.Id)