2. Desenvolupament aplicacions multiplataforma (DAM)
Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL
Tema 2 – Introducció . Integritat referencial
Objectius
1. Selecció de registres amb funcions d'agregat
Coneixements previs
• Instrucció select
• Funció d'agregat
Requisits previs
• Ordinador amb MySQL server instal·lat.
• Client MySQL server (MySQL Workbench per la representació gràfica).
• Connexió al servidor des del client
• Una base de dades creada.
Autor: Miquel Boada Pàgina 2 de 7
3. Desenvolupament aplicacions multiplataforma (DAM)
Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL
Tema 2 – Introducció . Integritat referencial
SQL - Having
Objectius....................................................................................................................................................2
Coneixements previs................................................................................................................................2
Requisits previs.........................................................................................................................................2
Introducció ...............................................................................................................................................6
Having........................................................................................................................................................6
Alies............................................................................................................................................................7
Sintaxis i exemples...................................................................................................................................7
Exemples having..................................................................................................................................7
Autor: Miquel Boada Pàgina 3 de 7
4. Desenvolupament aplicacions multiplataforma (DAM)
Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL
Tema 2 – Introducció . Integritat referencial
Per a realitzar les diferents consultes es partirà del següent model ER i la seva conversió al
model físic.
Superhero Planet
Les instruccions per a crear la base de dades , les taules i les dades es detallen a continuació.
Tenir en compte que la força i la intel·ligència es generen mitjançant un número aleatori i, per
tant, aquests valors diferiran dels valors mostrats en la taula anterior.
Autor: Miquel Boada Pàgina 4 de 7
5. Desenvolupament aplicacions multiplataforma (DAM)
Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL
Tema 2 – Introducció . Integritat referencial
create database if not exists dbheroes;
use dbheroes;
create table planet ( namep varchar(20), mass decimal(6,2) not null,
primary key(namep)
) engine=innodb;
create table superheroes (
nameh varchar(40),
planet varchar(20),
intelligence decimal(4,2) not null,
strong decimal(4,2) not null,
primary key(nameh)
) engine=innodb;
insert into planet values ("Mercury",0.06),("Venus",0.82),("Earth",1),("Mars",0.11),
("Jupiter",317.8),("Saturn",95.2),("Uranus",14.6),("Neptune",17.2);
alter table superheroe
add constraint fk_superhero_planet
foreign key (planet) references planet(namep)
on delete restrict
on update cascade;
insert into superhero values
("Superman","earth",round(rand()*100,2),round(rand()*100,2)),
("Batman","earth",round(rand()*100,2),round(rand()*100,2)),
("Spiderman","mars",round(rand()*100,2),round(rand()*100,2)),
("Thor","earth",round(rand()*100,2),round(rand()*100,2)),
("Hal Jordan","Venus",round(rand()*100,2),round(rand()*100,2)),
("Wonder Woman","earth",round(rand()*100,2),round(rand()*100,2)),
("Captain America","Venus",round(rand()*100,2),round(rand()*100,2)),
("Martian Manhunter","Mars",round(rand()*100,2),round(rand()*100,2));
Autor: Miquel Boada Pàgina 5 de 7
6. Desenvolupament aplicacions multiplataforma (DAM)
Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL
Tema 2 – Introducció . Integritat referencial
Introducció .
Quan es volen realitzar consultes del tipus:
✔ Quins anys s'ha facturat més que la facturació de l'any 2016?
✔ Quins articles s'han venut més que l'article X?
✔ ….
O consultes relacionades amb les taules del nostre exemple
✔ Quins planetes tenen més força que la força del planeta terra?
✔ Quins planetes tenen una intel·ligència superior a la mitjana de la intel·ligència?
✔ …....
És precís utilitzar la clausula «group by» amb «having» per a poder fer el filtre dels missatges.
Having.
La clausula «having» s'utilitzarà quan es vulguin filtrar les files d'una instrucció «select» segons
el resultat d'una funció d'agregat. Com es pot observar en el tipus de consulta realitzades a la
introducció (total facturació, total producte venut, total força, total intel·ligència) per a obtenir
cada un d'aquests valors cal aplicar una funció d'agregat (sum) en el nostre cas. Per resoldre la
consulta: Quins planetes tenen una intel·ligència superior a la mitjana de la intel·ligència?
es podria pensar en la consulta no vàlida:
Select planet, sum(intelligence) from superheroes
group by planet
where sum(intelligence)>(select avg(intelligence) from superheroes);
Tot i que es pot pensar que la consulta és vàlida, l'utilització de la clausula where amb una
funció d'agregat no és vàlida i és precís substituir-la per having.
Select planet, sum(intelligence) from superheroes
group by planet
having sum(intelligence)>(select avg(intelligence) from superheroes);
Quan s'utilitza la clausula having , podem combinar la condició o condicions amb funcions
d'agregat amb condicions relacionades amb consultes de la informació de les columnes que es
mostren en el select (en el nostre cas, planet).
Select planet, sum(intelligence) from superheroes
group by planet
having sum(intelligence)>(select avg(intelligence) from superheroes)
and planet like 'p%'; -- Planetes que comencin per la lletra P
Autor: Miquel Boada Pàgina 6 de 7
7. Desenvolupament aplicacions multiplataforma (DAM)
Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL
Tema 2 – Introducció . Integritat referencial
Alies
Una bona opció és associar un àlies a la columna que conté la funció d'agregat i utilitzar aquest
àlies en l'expressió del having. D'aquesta forma l'expressió queda més simple.
-- Quins planetes tenen una força mitjana superior a la mitjana de força de tots els planetes
Select planet, avg(strong) as averageStrong from superheroes
group by planet
having averageStrong>(select avg(strong) from superheroes);
Sintaxis i exemples
La clausula «having» va ubicada després de la clausula «group by».
Exemples having
-- Quins planetes tenen una intel·ligència superior a la mitjana d'intel·ligència de tots els planetes
Select planet, sum(intelligence) from superheroes
group by planet
having sum(intelligence)>(select avg(intelligence) from superheroes);
-- Quins planetes tenen una intel·ligència superior a la mitjana d'intel·ligència de tots els planetes
-- i el nom del planeta comença per la lletra P
Select planet, sum(intelligence) from superheroes
group by planet
having sum(intelligence)>(select avg(intelligence) from superheroes)
and planet like 'p%';
-- Quins planetes tenen una força mitjana superior a la mitjana de força de tots els planetes
Select planet, avg(strong) as averageStrong from superheroes
group by planet
having averageStrong>(select avg(strong) from superheroes);
Video exemple: Exemples utilització having
Autor: Miquel Boada Pàgina 7 de 7