Funcions

Índex

 

Funcions

Sovint no ens interessa tant veure el detall de cada un dels registres d'una taula sinó obtenir un resum d'algunes de les característiques del conjunt, com ara el nombre de registres, els valors extrems, el valor total... Per a aquests casos disposem d'una sèrie de funcions que generen camps calculats. La fórmula general i més simple possible és:

SELECT Funció FROM "Taula"

que, aplicada sense més condicions, actua sobre la taula en conjunt.

Sobre aquesta base general podem

La fórmula global completa és doncs

SELECT Funció FROM "Taula"
WHERE Condició
GROUP BY Criteri d'agrupació
ORDER BY "Taula"."Columna"

I si no ens cal fer servir algun dels paràmetres, simplement en prescindim.

Tornarem a la base de dades sobre el personal d'una empresa, amb les taules "Departaments" i "Personal":

capturacaptura

 

COUNT()

La funció COUNT() ens informa del nombre de registres que tenen algun valor inscrit en el camp indicat. El format és

COUNT ("nom-del-camp")

Atenció a l'ús dels parèntesis!

Per exemple, podem comptar el nombre total de treballadors de l'empresa i el nombre dels que estan enquadrats en algun departament. Per a això farem el comptatge dels camps "IdP" (tots els treballadors el tenen ple) i "Personal"."IdD" (només el tenen ple els enquadrats en un "Departament"). Podem formular doncs

SELECT COUNT ("Personal"."IdP") AS "Total", COUNT ("Personal"."IdD") AS "Enquadrats"
FROM "Personal"

I aquest és el resultat:

#

 

COUNT() sobre un fragment de taula

El COUNT() no necessàriament s'ha d'aplicar a la totalitat d'una taula, sinó que es pot restringir a només una part. Per exemple, volem saber quants treballadors tenen el 2007 com "Antinguitat". Serà

SELECT COUNT( "IdP" ) AS "N"
FROM "Personal"
WHERE "Antiguitat" = '2007'

#

 

Avaluacions numèriques

Hi ha quatre funcions que avaluen els conjunts dels valors d'un camp d'una taula. Són les següents

MIN() Valor mínim
MAX() Valor màxim
SUM() Suma de tots els valors
AVG() Mitjana aritmètica de tots els valors

Com a exemple, podem aplicar-ho al camp "Antiguitat" de la taula "Personal":

SELECT MAX ( "Antiguitat" ) AS "Més nou", MIN ( "Antiguitat" ) AS "Més antic", AVG ( "Antiguitat" ) AS "Mitjana"
FROM "Personal"

I obtenim aquest resultat

#

Nota: Hem obtingut un nombre enter a “Mitjana” perquè 'Antiguitat' és un camp de nombres enters, i s'hi ha produït automàticament un arrodoniment.

 

GROUP BY

Podem agrupar els registres amb GROUP BY sobre la base del valor d'un camp. Aquest camp ha de permetre la repetició de valors, ja que si no, no hi hauria la possibilitat d'agrupació. I, en conseqüència, no pot ser la clau principal. Cal assegurar a més que l'agrupació tingui algun sentit real, és a dir, que no respongui només a una coincidència.

SELECT ... GROUP BY "nom_de_camp"

Volem saber quants membres del personal estan enquadrats, és a dir, quants tenen ple el camp IdD:

SELECT "Personal"."IdD", COUNT( "Personal"."IdD" ) AS "Enquadrats", MAX( "Personal"."Antiguitat" ) AS "Més antic"
FROM "Personal"
GROUP BY "Personal"."IdD"

que té per resultat

#

Finalment, volem saber quants empleats hi ha amb els mateixos congoms, i fem:

SELECT "Cognoms", COUNT ("Cognoms")
FROM "Personal"
GROUP BY "Cognoms"
ORDER BY "Cognoms"

#

Ara podem comprovar si realment tenim dos 'Soler Valls' o hem entrat dues vegades les dades d'una mateixa perona. La consulta de la taula sencera ens indica que, efectivament, hi ha dos 'Soler Valls', 'Joan' i 'Antoni'.

 

HAVING

HAVING és un substitut de WHERE destinat a posar condicions a GROUP BY.

SELECT "Colomna_1", "Columna_2", Columna_3"
FROM "Taula_A"
WHERE condició general
GROUP BY "Columna_X"
HAVING condició sobre la columna X
ORDER BY "Columna Y"

 

Combinació de Funcions i JOIN

Les funcions es poden aplicar a un conjunt de taules combinades.

Per exemple, abans hem presentat el nombre de treballadors de cada departament, però aquest ha quedat indicat només per un codi numèric, i això no és gaire adequat. Ara introduirem alguns refinaments:

SELECT "Departaments"."Departament", COUNT( "Personal"."IdD" ) AS "N"
FROM "Personal"
LEFT JOIN "Departaments" ON "Personal"."IdD" = "Departaments"."IdD"
WHERE "Personal"."IdD" IS NOT NULL
GROUP BY "Departament"
ORDER BY "Departament"

I el resultat és aquest:

#