AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 182420
Accepted
Jules Lamur
Jules Lamur
Asked: 2017-08-02 15:00:38 +0800 CST2017-08-02 15:00:38 +0800 CST 2017-08-02 15:00:38 +0800 CST

O `COUNT` descarta duplicatas?

  • 772

Meu professor me ensinou esta instrução SQL:

SELECT COUNT(length) FROM product

retornará 2com o seguinte conjunto de dados:

product
|id | length | code |
|-------------------|
| 1 |    11  | X00  |
| 2 |    11  | C02  |
| 3 |    40  | A31  |

Ela justificou dizendo que COUNTnão conta duplicatas. Eu discordei. Depois de tentar muitos DBMS, nunca encontrei um que tenha esse comportamento. Esse SGBD existe?

dbms
  • 6 6 respostas
  • 12774 Views

6 respostas

  • Voted
  1. mustaccio
    2017-08-02T17:09:48+08:002017-08-02T17:09:48+08:00

    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 a COUNT(<constant expression>), como COUNT(1).

    Muitos bancos de dados suportam COUNT(DISTINCT <expression>), que retornará o número de valores exclusivos de <expression>.

    • 48
  2. Best Answer
    Vadim Pushtaev
    2017-08-03T04:57:46+08:002017-08-03T04:57:46+08:00

    COUNTconta duplicatas em todos os DBMS que conheço, mas.

    Existe alguma razão para um professor ensinar esse comportamento

    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 productjá contém apenas duas linhas, daí os COUNTretornos correspondentes 2, não 3.


    Por exemplo, em Rel DBMS, usando a relação dada na pergunta e a sintaxe do Tutorial D :

    SUMMARIZE product {length} BY {}: {c := COUNT()}
    

    dá:

    Resultado Rel

    • 39
  3. Lennart - Slava Ukraini
    2017-08-03T05:27:03+08:002017-08-03T05:27:03+08:00

    Se seu professor está falando sobre SQL, a afirmação está errada. COUNT(x)retornará o número de linhas em que x IS NOT NULLincluindo 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ê especifique COUNT(distinct x). Exemplo:

    with t(x,y) as ( values (null,null),(null,1),(1,null),(1,1) )
    
    select count(*) from t
    4
    
    select count(1) from t
    4
    
    select count(distinct 1) from t
    1
    
    select count(x) from t
    2
    
    select count(distinct x) from t
    1
    

    COUNT(distinct *)é AFAIK inválido.

    Como uma nota lateral, NULL apresenta algum comportamento não intuitivo. Como um exemplo:

    SELECT SUM(x) + SUM(y),  SUM(x + y) FROM T
    4, 2
    

    ou seja:

    SUM(x)+SUM(y) <> SUM(x+y)
    

    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:

    STUDENTS = Relation(["StudentId", "Name"]
                        , [{"StudentId":'S1', "Name":'Anne'},
                           {"StudentId":'S2', "Name":'Anne'},
                           {"StudentId":'S3', "Name":'Cindy'},
                         ])
    
    SELECT COUNT(NAME) FROM STUDENTS
    

    corresponde a:

    COUNT(STUDENTS.project(['Name']))
    

    ou seja

    COUNT( Relation(["Name"]
                   , [{"Name":'Anne'},
                      {"Name":'Cindy'},
                    ]) )
    

    que retornaria 2 .

    • 14
  4. Daniel Björk
    2017-08-03T05:06:15+08:002017-08-03T05:06:15+08:00

    É assim que funciona no MS SQL Server

    COUNT(*) retorna o número de itens em um grupo. Isso inclui valores NULL e duplicatas.

    COUNT(ALL expressão) avalia a expressão para cada linha em um grupo e retorna o número de valores não nulos.

    COUNT(expressão DISTINCT) avalia a expressão para cada linha em um grupo e retorna o número de valores exclusivos e não nulos.

    • 4
  5. Terje
    2017-08-03T03:25:51+08:002017-08-03T03:25:51+08:00

    Se a mesa fosse assim,

    |   product         |
    |id | length | code |
    |-------------------|
    | 1 |    11  | X00  |
    | 2 |    11  | C02  |
    | 3 |  null  | A31  |
    

    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.

    • 2
  6. dasda
    2017-08-05T06:24:14+08:002017-08-05T06:24:14+08:00

    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.

    • -7

relate perguntas

  • 3NF requer 2NF?

  • Qual é a diferença entre o uso de restrições de cobertura e sobreposição no DBMS?

  • Como descartar a tabela com todas as referências a esta tabela

  • Qual é a melhor maneira de armazenar muitos dados criptografados pelo usuário?

  • Fazendo a projeção primeiro e depois a seleção?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve