Consultes avançades - COUNT, DISINCT, IFNULL - NVL
COUNT
-
La funció de grup COUNT retorna el nombre de valors NOT NULL d’una columna.
SELECT COUNT(EMPLOYEE_ID), COUNT(DEPARTMENT_ID), COUNT(COMMISSION_PCT) FROM EMPLOYEES; +--------------------+----------------------+-----------------------+ | COUNT(EMPLOYEE_ID) | COUNT(DEPARTMENT_ID) | COUNT(COMMISSION_PCT) | +--------------------+----------------------+-----------------------+ | 20 | 19 | 4 | +--------------------+----------------------+-----------------------+ -
La funció de grup
COUNT(*)retorna el nombre de files d’una taula o consulta.SELECT COUNT(*) FROM EMPLOYEES; +----------+ | COUNT(*) | +----------+ | 20 | +----------+ -
Utilitzem
COUNT(*)quan volem comptar totes les files, fins i tot les duplicades, així com les que tinguin valors NULs.
COUNT DISTINCT
La paraula DISTINCT la utilitzem per a retornar valors no duplicats.
Podem usar la paraula DISTINCT dins una funció d’agrupament, sovint COUNT(*), per a comptabilitzar només els valors no duplicats.
SELECT COUNT(*), COUNT(DISTINCT JOB_ID),
COUNT(DISTINCT DEPARTMENT_ID)
FROM EMPLOYEES;
+----------+-------------------------+-------------------------------+
| COUNT(*) | COUNT(DISTINCT JOB_ID) | COUNT(DISTINCT DEPARTMENT_ID) |
+----------+-------------------------+-------------------------------+
| 20 | 12 | 7 |
+----------+-------------------------+-------------------------------+
A la consulta anterior podem dir que:
-
tenim 20 empleats a la taula
EMPLOYEES, -
d'aquests hi ha 12 tipus de
JOB_IDdiferents -
aquests treballen en 7 departaments (
DEPARTMENT_ID) diferents
També podem usar la paraula DISTINCT dins d’altres funcions d’agrupament.
SELECT COUNT(COMMISSION_PCT) Q,
AVG(COMMISSION_PCT) AVG,
AVG(DISTINCT COMMISSION_PCT) AVG_DISTINCT
FROM EMPLOYEES;
+---+----------+--------------+
| Q | AVG | AVG_DISTINCT |
+---+----------+--------------+
| 4 | 0.212500 | 0.216667 |
+---+----------+--------------+
En aquest cas estem veient la mitjana dels diferents tipus de commissió, no de totes les comissions.
SELECT SUM(SALARY) SOUs,
SUM(DISTINCT SALARY) SOUs_DISTINCT
FROM EMPLOYEES;
+-----------+---------------+
| SOUs | SOUs_DISTINCT |
+-----------+---------------+
| 175500.00 | 152500.00 |
+-----------+---------------+
En aquest cas estem veient la mitjana dels diferents sous, no de tots els sous.
IFNULL / NVL en funcions de grup
De vegades voldrem incloure valors NO NULs en les funcions de grup.
En aquest cas podem utilitzar la funció IFNULL o NVL dins de la funció de grup.
SELECT AVG(COMMISSION_PCT),
AVG(IFNULL(COMMISSION_PCT, 0))
FROM EMPLOYEES;
+---------------------+--------------------------------+
| AVG(COMMISSION_PCT) | AVG(IFNULL(COMMISSION_PCT, 0)) |
+---------------------+--------------------------------+
| 0.212500 | 0.042500 |
+---------------------+--------------------------------+
D'aquesta manera estem obligant a comptar, dins la mitjana, els empleats que no van a comissió, com si la seva comissió fos zero.