2011-05-26 21 views
5

Entiendo cómo cuenta (*) en SQL cuando se dirige a una tabla, pero ¿cómo funciona en las combinaciones internas?COUNT (*) en SQL

p. Ej.

SELECT branch, staffNo, Count(*) 
FROM Staff s, Properties p 
WHERE s.staffNo = p.staffNo 
GROUP BY s.staffNo, p.staffNo 

personal contiene staffNo staffName

propiedades contiene datos de gestión de propiedad (es decir, que el personal gestiona el cual la propiedad)

Esto devuelve el número de propiedades administradas por el personal, pero ¿cómo funciona el recuento? Como en ¿cómo sabe qué contar?

+0

Detalle: no es una unión externa. Es una unión ** interna ** (implícita). –

Respuesta

7

Es una función agregada - como tal es administrada por su grupo por cláusula - cada fila corresponderá a una agrupación única (es decir, staffNo) y Count (*) devolverá la cantidad de registros en la unión que coincidan con esa agrupación.

Así, por ejemplo:

SELECT branch, grade, Count(*) 
FROM Staff s, Properties p 
WHERE s.staffNo = p.staffNo 
GROUP BY branch, grade 

le devolverá el número de miembros del personal de un grado determinado en cada rama.

SELECT branch, Count(*) 
FROM Staff s, Properties p 
WHERE s.staffNo = p.staffNo 
GROUP BY branch 

devolvería el número total de miembros del personal en cada rama

SELECT grade, Count(*) 
FROM Staff s, Properties p 
WHERE s.staffNo = p.staffNo 
GROUP BY grade 

devolvería el número total de personal en cada grado

+1

bien, arráncame - presiono enviar sin terminar mi respuesta – BonyT

+0

+1 - ¡Buena edición! – JNK

+0

@BonyT - sin preocupaciones, eliminé DV y agregué UV para la edición – JNK

0

Cuenta el número de filas para cada StaffNo distinto en el producto cartesiano.

Además, debe agrupar por Branch, StaffNo.

1

count (*) simplemente cuenta el número de filas de la consulta o el group by.

En su consulta, se imprimirá el número de filas por staffNo. (Es redundante tener s.staffNo, p.staffNo; cualquiera será suficiente).

3

Su consulta no es válida.

Tiene un nombre de columna ambiguo staffno.

Usted está seleccionando branch pero no está agrupando por él - prepárese para un error de sintaxis (todo menos MySQL) o ramas aleatorias para ser seleccionadas por usted (MySQL).

Creo que lo que quiere saber, sin embargo, es que devolverá un recuento para cada "conjunto" de los campos agrupados, por lo que para cada combinación de s.staffno, p.staffno cuántas filas pertenecen a ese conjunto.

+1

@martin - ¡Vaya! Corregido, gracias! – JNK

2

La función de agregado (si se trata de count(), sum(), avg(), etc.) se calcula en las filas en cada grupo: que grupo, entonces se colapsa/resume/agregados a una sola fila de acuerdo con la lista de selección se define en la consulta.

El modelo conceptual para la ejecución de una consulta select es la siguiente:.

  1. Calcular el producto cartesiano de todas las referencias tablas en la cláusula (como si se está realizando una full join
  2. Aplicar la unión criterios.
  3. filtro de acuerdo con los criterios definidos en la cláusula where.
  4. partitition en grupos, en base a los criterios definidos en la cláusula group by.
  5. Reduce cada grupo a una sola fila, calculando los valores de cada función agregada en las filas de ese grupo.
  6. filtro de acuerdo con los criterios definidos en la having clause
  7. Ordenar de acuerdo con los criterios definidos en la cláusula order by

Este modelo conceptual omite tratar con cualquier compute o compute...by cláusulas.

Esto no es realmente como nada sino un motor SQL muy ingenuo podría ejecutar una consulta, pero los resultados deberían ser idénticos a los que obtendría [eventualmente] si lo hiciera de esta manera.