En la universidad, mi profesor me enseñó este año que esta declaración SQL:
SELECT COUNT(length) FROM product
regresará 2
con el siguiente conjunto de datos:
| product |
|id | length | code |
|-------------------|
| 1 | 11 | X00 |
| 2 | 11 | C02 |
| 3 | 40 | A31 |
Ella lo justificó diciendo que COUNT
no cuenta duplicados.
Le dije a mi profesor que pensaba que había cometido un error. Ella me respondió que algunos DBMS pueden o no contar duplicados.
Después de probar muchos DBMS, nunca he encontrado uno que tenga este comportamiento.
¿Existe este DBMS?
¿Hay alguna razón para que un profesor enseñe este comportamiento? ¿Y sin siquiera mencionar que otros DBMS pueden comportarse de manera diferente?
Para su información, el soporte del curso está disponible aquí (en francés) . La diapositiva en cuestión se encuentra en la esquina inferior izquierda en la página 10.
Respuestas:
COUNT
cuenta duplicados en todos los DBMS que conozco, pero.Sí, hay una razón En la teoría relacional original (que subyace a todos los DBMS relacionales modernos) la relación es un conjunto en sentido matemático de esta palabra. Eso significa que ninguna relación puede contener duplicados, incluidas todas las relaciones de transición, no solo sus "tablas".
Siguiendo este principio, puede decir que
SELECT length FROM product
ya contiene solo dos filas, por lo tanto , losCOUNT
retornos correspondientes2
no3
.Por ejemplo, en Rel DBMS, usando la relación dada en la pregunta y la sintaxis del Tutorial D :
da:
fuente
COUNT
comporta de manera diferente a las implementaciones de SQL.O tu profesor cometió un error o entendiste mal lo que dijo. En el contexto de los DBMS relacionales, implementados por varios proveedores, la función agregada
COUNT(<expression>)
devuelve el número de valores no NULL del<expression>
conjunto de resultados (o un grupo).Hay un caso especial de
COUNT(*)
, que devuelve el número de filas en el conjunto de resultados o grupo, no el número de valores de nada. Esto es equivalente aCOUNT(<constant expression>)
, comoCOUNT(1)
.Muchas bases de datos son compatibles
COUNT(DISTINCT <expression>)
, lo que devolverá el número de valores únicos de<expression>
.fuente
Si su profesor está hablando de SQL, la afirmación es incorrecta.
COUNT(x)
devolverá el número de filas donde xIS NOT NULL
incluyendo duplicados.COUNT(*) or COUNT([constant])
es un caso especial que contará las filas, incluso aquellas donde está cada columnaNULL
. Sin embargo, los duplicados siempre se cuentan, a menos que usted especifiqueCOUNT(distinct x)
. Ejemplo:COUNT(distinct *)
es inválido AFAIK.Como nota al margen, NULL introduce un comportamiento poco intuitivo. Como ejemplo:
es decir:
Si él / ella está hablando de un sistema relacional como se describe, por ejemplo, en el libro Bases de datos, tipos y modelo relacional: El tercer manifiesto de CJ Date y Hugh Darwen, sería una afirmación correcta.
Digamos que tenemos la relación:
corresponde a:
es decir
que devolvería 2 .
fuente
Así es como funciona en MS SQL Server
fuente
Si la mesa se hubiera visto así,
puede esperar que la consulta devuelva 2, al menos en Oracle DB, ya que no se cuentan los valores nulos. Sin embargo, los duplicados se cuentan muy bien.
fuente
tal vez ella quiere decir en conjunto con único, pero Count cuenta DUPLICADOS. Hay algunos maestros que no conocen sus cosas, no se preocupe, solo informe a sus compañeros de clase / amigos para que cuando pasen a un nivel superior de db y la vida real no lo olviden, mejor aún, envíe un mensaje anónimo a su maestro pidiéndole que no entiende algunas de las funciones sql y quiere una demostración, haga que su maestra encuentre una forma para que la clase sugiera qué insertar incluyen duplicados (no los datos sean grandes) y cuando usa el recuento de funciones, la tiene. Algunas personas se darán cuenta, también cuando dice otras bases de datos, haga que su amiga le pregunte cuáles, luego la atrape dos veces y diga que probó todas esas bases de datos y que no funcionan como ella dijo y que el conteo recoge duplicados.
fuente