Cuando se trabaja con bases de datos, a veces desea averiguar cuántas filas devolverá una consulta, sin devolver realmente los resultados de la consulta. O, a veces, es posible que desee averiguar cuántas filas hay en una tabla determinada.
En SQL Server, puede usar COUNT()
de T-SQL función para devolver el número de filas que se devolverían en una consulta.
Los datos
Estos son los datos que usaremos en los ejemplos de esta página:
SELECT * FROM Tasks;
Resultado:
TaskId TaskName TaskDescription TaskCode ------ ------------ --------------- -------- 1 Feed cats TBA null 2 Water dog TBA null 3 Feed garden TBA null 4 Paint carpet TBA null 5 Clean roof TBA null 6 Feed cats TBA null
Ejemplo:contar todas las filas de una tabla
Aquí hay un ejemplo del uso de COUNT()
función para devolver el número total de filas en una tabla:
SELECT COUNT(*) FROM Tasks;
Resultado:
6
Esto devuelve el número de filas en la tabla porque no proporcionamos ningún criterio para reducir los resultados.
Ejemplo:agregar criterios
Aquí hay un ejemplo de contar cuántas filas se devolverían según un criterio dado:
SELECT COUNT(*) FROM Tasks WHERE TaskName LIKE '%dog%' OR TaskName LIKE '%cat%';
Resultado:
3
Ejemplo:especifique una sola columna
Todos los ejemplos anteriores usan un asterisco para aplicar el conteo a todas las columnas. También tiene la opción de especificar una columna específica.
Ejemplo:
SELECT COUNT(TaskName) FROM Tasks;
Resultado:
6
Si bien este ejemplo devuelve el mismo resultado que obtuvimos cuando usamos el asterisco, ese no siempre será necesariamente el caso. Por ejemplo, esto es lo que sucede si especificamos una columna diferente:
SELECT COUNT(TaskCode) FROM Tasks;
Resultado:
0
En este caso obtenemos cero, porque esa columna en particular contiene valores nulos en cada fila.
Ejemplo:Distinto
Puede agregar el DISTINCT
argumento para devolver solo el número de valores únicos (no nulos).
Es posible que haya notado que cada fila en nuestro TaskDescription
columna contiene el mismo valor ("TBA"). Y el TaskName
La columna también tiene un valor duplicado ("Alimentar gatos" aparece dos veces). Esto podría causar problemas si no desea que se cuenten los duplicados.
Así es como se ve si aplicamos DISTINCT
argumento al TaskName
columna:
SELECT COUNT(DISTINCT TaskName) FROM Tasks;
Resultado:
5
Y aquí se aplica contra TaskDescription
tabla (donde todos los valores son idénticos):
SELECT COUNT(DISTINCT TaskDescription) FROM Tasks;
Resultado:
1
Ejemplo:la cláusula HAVING
También puede usar COUNT()
con el HAVING
cláusula para limitar un conjunto de resultados en función del número de filas que se devolverían.
Ejemplo:
USE Music; SELECT ar.ArtistName, COUNT(al.AlbumName) 'Album Count' FROM Artists ar INNER JOIN Albums al ON ar.ArtistId = al.ArtistId GROUP BY ar.ArtistName HAVING COUNT(al.AlbumName) > 1;
Resultado:
ArtistName Album Count ------------------------- ----------- Allan Holdsworth 2 Devin Townsend 3 Iron Maiden 5 Michael Learns to Rock 3 Tom Jones 3
Este ejemplo utiliza una base de datos diferente a los ejemplos anteriores. Devuelve solo aquellos artistas que han lanzado más de 1 álbum. Podríamos cambiar ese número cuantos álbumes queramos:
USE Music; SELECT ar.ArtistName, COUNT(al.AlbumName) 'Album Count' FROM Artists ar INNER JOIN Albums al ON ar.ArtistId = al.ArtistId GROUP BY ar.ArtistName HAVING COUNT(al.AlbumName) > 4;
Resultado:
ArtistName Album Count ------------------------- ----------- Iron Maiden 5
La función COUNT_BIG()
T-SQL también tiene un COUNT_BIG()
función que funciona exactamente como COUNT()
, excepto que COUNT()
devuelve un int tipo de datos y COUNT_BIG()
devuelve un bigint tipo de datos.
Esta función puede ser útil para vistas indexadas con consultas agrupadas. Puede encontrar si intenta crear un índice para una vista que contiene COUNT(*)
, que recibe un error como este:
Cannot create index on view "Music.dbo.AlbumsByArtist" because it uses the aggregate COUNT. Use COUNT_BIG instead.
En tales casos, alterar la vista para usar COUNT_BIG(*)
debería resolver el problema.