Meu professor me ensinou esta instrução SQL:
SELECT COUNT(length) FROM product
retornará 2
com o seguinte conjunto de dados:
product
|id | length | code |
|-------------------|
| 1 | 11 | X00 |
| 2 | 11 | C02 |
| 3 | 40 | A31 |
Ela justificou dizendo que COUNT
não conta duplicatas. Eu discordei. Depois de tentar muitos DBMS, nunca encontrei um que tenha esse comportamento. Esse SGBD existe?
Ou seu professor cometeu um erro ou você não entendeu o que ela disse. No contexto de DBMSs relacionais, conforme implementado por vários fornecedores, a função agregada
COUNT(<expression>)
retorna o número de valores não NULL<expression>
no conjunto de resultados (ou um grupo).Há um caso especial de
COUNT(*)
, que retorna o número de linhas no conjunto ou grupo de resultados, não o número de valores de qualquer coisa. Isso é equivalente aCOUNT(<constant expression>)
, comoCOUNT(1)
.Muitos bancos de dados suportam
COUNT(DISTINCT <expression>)
, que retornará o número de valores exclusivos de<expression>
.COUNT
conta duplicatas em todos os DBMS que conheço, mas.Sim, há uma razão. Na teoria relacional original (que está subjacente a todos os SGBDs relacionais modernos) a relação é um conjunto no sentido matemático desta palavra. Isso significa que nenhuma relação pode conter duplicatas, incluindo todas as relações de transição, não apenas suas “tabelas”.
Seguindo este princípio pode-se dizer que
SELECT length FROM product
já contém apenas duas linhas, daí osCOUNT
retornos correspondentes2
, não3
.Por exemplo, em Rel DBMS, usando a relação dada na pergunta e a sintaxe do Tutorial D :
dá:
Se seu professor está falando sobre SQL, a afirmação está errada.
COUNT(x)
retornará o número de linhas em que xIS NOT NULL
incluindo duplicatas.COUNT(*) or COUNT([constant])
é um caso especial que contará as linhas, mesmo aquelas em que cada coluna éNULL
. No entanto, duplicatas são sempre contadas, a menos que você especifiqueCOUNT(distinct x)
. Exemplo:COUNT(distinct *)
é AFAIK inválido.Como uma nota lateral, NULL apresenta algum comportamento não intuitivo. Como um exemplo:
ou seja:
Se ele estiver falando sobre um sistema relacional como descrito, por exemplo, no livro Databases, Types, and the Relational Model: The Third Manifesto de CJ Date e Hugh Darwen - seria uma afirmação correta.
Digamos que temos a relação:
corresponde a:
ou seja
que retornaria 2 .
É assim que funciona no MS SQL Server
Se a mesa fosse assim,
você pode esperar que a consulta retorne 2, pelo menos no Oracle DB, pois os nulos não são contados. No entanto, as duplicatas são contadas muito bem.
talvez ela queira dizer em conjunto com único, mas Count conta DUPLICATAS. Existem alguns professores que não sabem o que fazem, não se preocupe apenas informe seus colegas/amigos para que quando eles passarem para o db mais alto e a vida real eles não esqueçam, melhor ainda enviar uma mensagem anônima para sua professora perguntando a ela que eles não entenda algumas das funções sql e queira uma demonstração, peça para sua professora sugerir uma forma de a turma sugerir o que inserir incluir duplicatas (não ter os dados muito grandes) e quando ela usar a função count, você entendeu. Algumas pessoas vão pegar nele, também quando ela disser outros bancos de dados, peça ao seu amigo que pergunte quais, em seguida, faça uma armadilha dupla e diga que você tentou todos esses bancos de dados e eles não funcionam como ela disse e essa contagem pega duplicatas.