Na universidade, meu professor me ensinou este ano que 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 disse ao meu professor que achava que ela havia cometido um erro. Ela me respondeu que alguns DBMS podem ou não contar duplicados.
Depois de experimentar muitos DBMS, nunca encontrei um que tivesse esse comportamento.
Este DBMS existe?
Existe alguma razão para um professor ensinar esse comportamento? E sem mencionar que outros DBMS podem se comportar de maneira diferente?
Para sua informação, o suporte ao curso está disponível aqui (em francês) . O slide em questão está no canto inferior esquerdo na página 10.
Respostas:
COUNT
conta duplicatas em todos os DBMS que eu conheço, mas.Sim, há uma razão. Na teoria relacional original (que subjaz a todos os SGBDs relacionais modernos), a relação é um conjunto no sentido matemático dessa palavra. Isso significa que nenhuma relação pode conter duplicatas, incluindo todas as relações de transição, não apenas suas "tabelas".
Seguindo esse princípio, você pode dizer que
SELECT length FROM product
já contém apenas duas linhas, portantoCOUNT
retornos correspondentes2
, não3
.Por exemplo, no DBMS de Rel , usando a relação fornecida na pergunta e na sintaxe do Tutorial D :
dá:
fonte
COUNT
se comporta de maneira diferente das implementações SQL.Seu professor cometeu um erro ou você não entendeu o que ela disse. No contexto de DBMSes 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 em 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 nada. Isso é equivalente aCOUNT(<constant expression>)
, comoCOUNT(1)
.Muitos bancos de dados apoiar
COUNT(DISTINCT <expression>)
, que irá retornar o número de valores exclusivos de<expression>
.fonte
Se o seu professor estiver 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 estáNULL
. No entanto, duplicatas são sempre contadas, a menos que você especifiqueCOUNT(distinct x)
. Exemplo:COUNT(distinct *)
AFAIK inválido.Como uma observação lateral, o NULL apresenta um comportamento não intuitivo. Como um exemplo:
ou seja:
Se ele estiver falando de um sistema relacional, como descrito, por exemplo, no livro Bancos de dados, Tipos e Modelo Relacional: O Terceiro Manifesto, de CJ Date e Hugh Darwen - seria uma afirmação correta.
Diga que temos a relação:
corresponde a:
ie
que retornaria 2 .
fonte
É assim que funciona no MS SQL Server
fonte
Se a mesa estivesse assim,
você pode esperar que a consulta retorne 2, pelo menos no banco de dados Oracle, pois os nulos não são contados. No entanto, duplicatas são contadas muito bem.
fonte
talvez ela queira dizer em conjunto com o exclusivo, mas o Count COUNT DUPLICATES. Existem alguns professores que não sabem as coisas deles, não se preocupe, basta informar seus colegas de classe / amigos para que, quando eles passarem a um nível mais alto de vida e na vida real, eles não esqueçam, melhor ainda, enviar uma mensagem anônima ao seu professor pedindo que ela não compreenda algumas das funções sql e queira uma demonstração, peça à sua professora uma maneira de a turma sugerir o que inserir: incluir duplicatas (não possui dados grandes) e, quando ela usa a contagem de funções, você a recebe. Algumas pessoas vão buscá-lo. Além disso, quando ela disser outros bancos de dados, peça a seu amigo que pergunte quais, em seguida, faça um duplo laço com ela e diga que você tentou todos esses bancos de dados e eles não funcionam como ela disse e essa contagem pega duplicatas.
fonte