11th Apr 2023 10 minutos de leitura Um guia detalhado para a função SQL COUNT() Tihomir Babic sql count Índice Exemplo de conjunto de dados O que é COUNT()? COUNT() e GROUP BY Usando COUNT() Com uma Expressão ou Coluna COUNT(expressão) com DISTINCT Cuidado: Usando COUNT() Com JOGO ESQUERDO COUNT() é tão fácil como um, dois, três! Você pode contar com este guia para lhe dar explicações detalhadas (apoiadas por exemplos) de todos os usos típicos da função COUNT(). COUNT() função. Conhecer a agregação de dados é um trampolim necessário em sua jornada para se tornar um mestre SQL. Isto inclui a função COUNT() - uma das funções agregadas mais frequentemente utilizadas em SQL. A agregação de dados ainda conta como conhecimento SQL de nível básico. Ter bases firmes garante que você não tenha buracos em seu conhecimento, o que torna mais fácil o aprendizado de conceitos SQL mais complexos. Você pode obter esta base e muito mais em nossa trilha de aprendizado SQL de A a Z. Seus sete cursos interativos lhe darão uma estrutura firme e tornarão seu aprendizado sistemático. Você começa com o básico de SQL, como recuperar dados e usar funções SQL padrão (que incluem COUNT() e outras funções agregadas). Uma vez que você tenha isso em mente, é muito mais fácil seguir os conceitos mais avançados que esta faixa ensina, tais como funções de janela, expressões comuns de tabela, e extensões GROUP BY. Uma vez que você aprenda tudo isso, você precisará de alguma prática para realmente dominá-lo. Para isso, há o Curso de Práticas em SQL com seus 88 exercícios interativos. Este artigo também será prático e mostrará diferentes exemplos de utilização do COUNT(). Para isso, precisamos de um conjunto de dados adequado. Exemplo de conjunto de dados Estaremos lidando com diretores e seus filmes. A primeira mesa é, sem surpresas, chamada directors. Aqui está a consulta que você mesmo pode usar para replicar esta tabela. Os dados na tabela são parecidos com os seguintes: idfirst_namelast_namedate_of_birthdate_of_deathplace_of_birthcountry_of_birth 1IngmarBergman1918-07-142007-07-30UppsalaSweden 2LynneRamsay1969-12-05NULLGlasgowScotland 3AlejandroJodorowsky1929-02-07NULLTocophillaChile 4AgnesVarda1928-05-302019-03-29BrusselsBelgium 5PedroAlmodóvar1949-09-25NULLCalzada de CalatravaSpain 6ChloéZhao1982-03-31NULLBeijingChina 7JordanPeele1979-02-21NULLNew York CityUSA 8CélineSciamma1978-11-12NULLPontoiseFrance 9Jean-LucGodard1930-12-032022-09-13ParisFrance 10StanleyKubrick1928-07-261999-03-07New York CityUSA É uma lista simples de diretores com algumas informações sobre eles. A segunda tabela é films. Você pode criar esta tabela, também, usando esta consulta. Aqui estão os dados na tabela: iddirector_idfilm_namerelease_datelanguage 17Get Out2017-01-23English 22We Need to Talk About Kevin2011-05-12English 32You Were Never Really Here2017-05-27English 45The Skin I Live In2011-05-19Spanish 57Us2019-03-08English 62Ratcatcher1999-05-13English 72Morvern Collar2002-11-01English 83El Topo1970-12-18Spanish 93The Holy Mountain1973-11-27Spanish 10NULLDog Day Afternoon1975-09-20English 11NULLThe Hater2020-03-06Polish 121Cries and Whispers1972-12-21English É uma lista de filmes conectados à tabela directors através da coluna director_id. Dois valores director_id são NULL. No contexto de nosso conjunto de dados, isso significa que há dados sobre esses filmes na tabela films. No entanto, não há um diretor correspondente na tabela directors. Em outras palavras, temos todas as informações sobre o "Dog Day Afternoon" e o "The Hater", exceto quem os dirigiu. Agora que conhecemos os dados, podemos lidar com COUNT(). O que é COUNT()? A resposta está no nome: a função COUNT() em SQL é utilizada para a contagem de filas. Ela conta as linhas no conjunto de resultados, não na tabela. Para ser mais preciso, ela contará linhas na tabela se sua tabela for um conjunto de resultados - ou seja, se você não tiver filtrado os dados de nenhuma forma. Se você filtrar os dados, COUNT() retorna o número de linhas nos dados filtrados. Aqui está um exemplo: SELECT COUNT(*) AS number_of_directors FROM directors; O asterisco (*) na função COUNT() instrui-o a contar todas as filas. Como não são aplicados filtros, o conjunto directors tabela será o resultado definido. A função COUNT() irá, portanto, retornar o número de linhas na tabela: number_of_directors 10 O número de filas é dez, o que, neste caso, também representa o número de diretores. Se o conjunto de resultados for limitado, COUNT(*) retornará um valor diferente. Por exemplo, suponha que quiséssemos mostrar o número de diretores mortos. Isto significa contar apenas os diretores que têm uma data na coluna date_of_death. Aqueles que têm valores NULL ainda estão vivos. Aqui está a pergunta: SELECT COUNT(*) AS number_of_dead_directors FROM directors WHERE date_of_death IS NOT NULL; Conseguimos o que queríamos com a filtragem de dados usando a cláusula WHERE. Aqui está o resultado: number_of_dead_directors 4 Quatro diretores não estão mais vivos. COUNT() e GROUP BY Normalmente, a função COUNT() é utilizada com a cláusula GROUP BY. Para refrescar sua memória, GROUP BY é uma cláusula que agrupa todas as filas com o mesmo valor. Normalmente, os grupos são colunas especificadas do conjunto de dados. Para mais informações, leia este artigo sobre como usar GROUP BY. Aqui está um exemplo de utilização do GROUP BY com COUNT(*): SELECT country_of_birth, COUNT(*) AS number_of_directors FROM directors GROUP BY country_of_birth ORDER BY country_of_birth; Queremos mostrar todos os países e o número de diretores nascidos neles. Selecionamos o país e usamos COUNT(*) para mostrar o número de diretores. Depois especificamos a coluna country_of_birth em GROUP BY. Cada coluna da tabela que aparece no SELECT deve aparecer também em GROUP BY. É lógico, porque você quer ver o número de diretores por país de nascimento e mostrar esses países simultaneamente. Finalmente, a saída é ordenada alfabeticamente por país usando ORDER BY country_of_birth: country_of_birthnumber_of_directors Belgium1 Chile1 China1 France2 Scotland1 Spain1 Sweden1 USA2 Há um diretor de cada país, exceto França e EUA. Se você precisar de mais alguns exemplos, aqui está o artigo que mostra como usar GROUP BY com funções agregadas SQL. Usando COUNT() Com uma Expressão ou Coluna Você não está limitado a escrever um asterisco em COUNT(). Ele também pode ser usado com uma coluna ou uma expressão, tal como a declaração CASE WHEN. A diferença é que COUNT(expression) conta apenas os valores nãoNULL da expressão. COUNT(*) contará também os valores NULL. Como exemplo, vamos tentar listar todas as línguas do filme e o número de diretores que fizeram filmes nessas línguas. Parece que temos todos os dados na tabela films. O que aconteceria se utilizássemos COUNT(*)? SELECT language, COUNT(*) AS number_of_directors FROM films GROUP BY language ORDER BY language; languagenumber_of_directors English8 Polish1 Spanish3 No total, esta saída mostra todos os 12 filmes que aparecem na tabela. Alerta de spoiler: Isto está errado! A razão? Lembre-se, COUNT(*) conta o número de linhas no conjunto de dados, incluindo NULLs. Portanto, esta saída não representa o número de diretores de forma alguma! Como contamos as linhas na tabela filmsagora é óbvio que contamos o número de filmes, não de diretores! Em outras palavras, há oito filmes em inglês, um em polonês, e três em espanhol. Esta produção não tem nada a ver com o número de diretores! Seria uma idéia melhor usar COUNT(director_id)? Deveríamos tentar: SELECT language, COUNT(director_id) AS number_of_directors FROM films GROUP BY language ORDER BY language; Selecionamos os idiomas e contamos os diretores através de seu identificador: director_id. A produção é agrupada e ordenada por idioma. languagenumber_of_directors English7 Polish0 Spanish3 A saída é diferente da anterior, portanto, vamos analisá-la. O que fizemos bem ao contar director_id é que nos livramos dos filmes com NULLs em director_id. Isto é especialmente óbvio para a língua polonesa - o número de diretores é zero. Por quê? Porque existe apenas um filme polonês e tem um NULL em director_id, portanto não é contado. Menos obviamente, um desses filmes também está 'faltando' em inglês. É o Dog Day Afternoon, porque também tem um NULL em director_id. No total, o resultado mostra dez diretores porque há dez registros na tabela films com valores não-NULL na coluna director_id. Mas se você voltar para a tabela filmsVocê poderia ver algumas identificações de diretores aparecerem várias vezes. Portanto, sim, mostramos o número de diretores, mas também incluímos todos os diretores cada vez que eles aparecem na tabela. Em outras palavras, incluímos valores duplicados. Portanto, este resultado está mais próximo do que queríamos alcançar, mas ainda não completamente correto. A contagem de identificações duplicadas de diretores inflaciona o resultado, ou seja, mostra um número irrealisticamente alto de diretores individuais. O que resolveria este problema de duplicação é usar COUNT() com DISTINCT. COUNT(expressão) com DISTINCT Agora que você aprendeu a usar COUNT() com um nome de coluna, é hora de aprender a usá-lo com DISTINCT. A cláusula DISTINCT elimina as duplicatas. Quando é usada com COUNT(expression), significa que a função contará apenas as instâncias únicas de uma coluna/expressão. Vamos usar o mesmo exemplo acima, mas com DISTINCT: SELECT language, COUNT(DISTINCT director_id) AS number_of_directors FROM films GROUP BY language ORDER BY language; Note que DISTINCT está escrito na função COUNT(). Ela vem antes da coluna que você quer contar. E aqui estão os resultados: languagenumber_of_directors English3 Polish0 Spanish2 O resultado mostra três diretores com filmes em inglês, zero em polonês, e dois em espanhol. Espere um segundo! Esse não é um resultado drasticamente diferente daquele que obtivemos quando usamos COUNT(director_id) sem DISTINCT? Aqui está o resultado anterior: languagenumber_of_directors English7 Polish0 Spanish3 Você percebe o que aconteceu aqui? Sem DISTINCT, contamos todos os valores director_id. Então a maneira correta de encontrar o número de diretores neste exemplo é usar COUNT() com DISTINCT. Cuidado: Usando COUNT() Com JOGO ESQUERDO Finalmente, vamos usar as duas mesas simultaneamente. Imagine que você quer produzir todos os diretores e a contagem de seus filmes. Você pensaria (corretamente) que precisa LEFT JOIN. Isso é um bom começo! Pode haver diretores na mesa directors que não têm nenhum filme em nosso films mesa. Como queremos mostrar a lista de todos os diretores, LEFT JOIN é a escolha certa. Para contar o número de filmes, você pode sentir a necessidade de usar COUNT(*). Aqui está a pergunta: SELECT d.id, d.first_name, d.last_name, COUNT(*) AS number_of_films FROM directors d LEFT JOIN films f ON d.id = f.director_id GROUP BY d.id, d.first_name, d.last_name ORDER BY d.id; Selecionamos as colunas necessárias e usamos COUNT(*). As duas tabelas estão unidas na coluna contendo as identificações dos diretores. A saída é agrupada pelos IDs e nomes dos diretores e ordenada pelo ID. E os resultados: idfirst_namelast_namenumber_of_films 1IngmarBergman1 2LynneRamsay4 3AlejandroJodorowsky2 4AgnesVarda1 5PedroAlmodóvar1 6ChloéZhao1 7JordanPeele2 8CélineSciamma1 9Jean-LucGodard1 10StanleyKubrick1 Parece que cada diretor tem pelo menos um filme. No total, são 15 filmes. Espere aí! Isso não parece certo! Há apenas 12 filmes na mesa films. Além disso, sabemos que não há filmes de Stanley Kubrick na mesa. Como é que a saída mostra que ele tem um? Os dados de todos os outros diretores também estão errados? Sim. Usar COUNT(*) não é a solução correta neste caso. LEFT JOIN retornará uma fila para todos os diretores, mesmo aquele que não pôde ser encontrado na tabela. films. E COUNT(*) conta todas essas filas, mesmo as que não têm filmes correspondentes. Em vez de COUNT(*), use COUNT() com o nome da coluna. Qual coluna devemos contar? A maneira mais segura é contar os identificadores únicos, que é o id da coluna da tabela. films. SELECT d.id, d.first_name, d.last_name, COUNT(f.id) AS number_of_films FROM directors d LEFT JOIN films f ON d.id = f.director_id GROUP BY d.id, d.first_name, d.last_name; A pergunta é praticamente a mesma de antes, exceto pelo uso diferente de COUNT(). E é isto que ela retorna: idfirst_namelast_namenumber_of_films 1IngmarBergman1 2LynneRamsay4 3AlejandroJodorowsky2 4AgnesVarda0 5PedroAlmodóvar1 6ChloéZhao0 7JordanPeele2 8CélineSciamma0 9Jean-LucGodard0 10StanleyKubrick0 É mais assim! Se você somar os valores, você verá que há dez filmes no total. Por que não 12? Porque dois filmes são de diretores que não existem em nosso conjunto de dados, ou seja, eles têm NULLs na coluna director_id na tabela films. Para consolidar o que você aprendeu aqui, confira mais alguns exemplos de usos de COUNT(). COUNT() é tão fácil como um, dois, três! Isso não foi difícil, foi? Estes exemplos fáceis lhe mostraram todas as variações de uso COUNT(). A função em si não é difícil de entender. Mas, como você viu, há várias maneiras de utilizá-la, e cada uma pode retornar um resultado diferente. Escolher como usar COUNT() torna-se mais fácil com a prática. O Curso de Práticas em SQL é projetado exatamente para esse fim. Você também poderia tentar estes sete exemplos da função COUNT(). Além da prática, é importante que você conheça seus dados e o que você quer alcançar com eles. Quando tudo isso estiver claro para você, COUNT() se torna realmente uma função fácil. Você pode contar com isso! Punição intencional. Tags: sql count