You are on page 1of 12

Generalitat de Catalunya

Departament d’Ensenyament
Institut Obert de Catalunya

2252 CFGS Desenvolupament d'Aplicacions Multiplataforma


Mòdul 2 – Bases de dades
UF2 – Llenguatges SQL: DML i DDL
Unitat 4 – Llenguatge SQL. Consultes
Solució EXERCICIS

Preparació dels exercicis: centre hospitalari.

Executeu el guió hospital.sql que crea una base de dades per a gestionar un centre hospitalari i que
trobareu a l'aula. Dissenyeu una consulta SQL per cadascuna de les següents preguntes. Enganxeu el codi
SQL que heu utilitzat en cada cas en l'espai destinat a la resposta.

El model ER corresponent és:

I el model relacional:

Codi: I71 Exercici de Repàs Pàgina 1 de 12

Versió: 02 2252M02_RPS3_Solucio
Formació professional

AREA (numArea, nomArea)

PROVA (codProv, descr)

PLANTA (numPl, numHab)

LLIT (numPl, numLlit)
ON {numPl} REFERENCIA PLANTA

PACIENT (dni, nom, cognoms, dataAlta, numP, numL)
ON {numP,numL} REFERENCIA LLIT (numPl,numLlit)

METGE (codMetge, nom, cognoms, sou, numArea)
ON {numArea} REFERENCIA AREA

INFERMER (codInf, nom, cognoms, numArea)
ON {numArea} REFERENCIA AREA

VISITA (dniPac, codMetge, data, diagnostic)
ON {dniPac} REFERENCIA PACIENT(dni)
i {codMetge} REFERENCIA METGE

REALITZACIO (codProv, dniPac, data, resultat)
ON {codProv} REFERENCIA PROVA
i {dniPac} REFERENCIA PACIENT(dni)

Activitat 1 Consultes simples

1. Consultes simples (apartat 1.4): Obteniu un llistat de tots els metges.

SELECT codMetge, nom, cognoms, sou, numArea FROM metge;

SELECT * FROM metge;

2. Comencem amb el WHERE: Obteniu un llistat de tots els metges assignats a l'àrea 1.

SELECT * FROM metge WHERE numArea=1; 

Codi: I71 Exercici de Fòrum Pàgina 2 de 12

Versió: 02 2252M02_RPS3_Solucio
Formació professional

3. Obteniu un llistat dels pacients que es troben a la planta 2.

SELECT * FROM pacient WHERE numP=2;

4. Expressió més complexa al WHERE: Obteniu les dades del pacient al qual se li hagi assignat el llit
1 de la planta 1.

SELECT * FROM pacient WHERE numP=1 AND numL=1; 

5. Utilització d'expressions en el select: Obteniu un llistat dels metges (nom, cognoms i sou). El sou
emmagatzemat és l'anual i ha de sortir el mensual (dividit per 14 ja que hi ha dues pagues extres).

SELECT nom, cognoms, sou/14 FROM metge; 

Codi: I71 Exercici de Fòrum Pàgina 3 de 12

Versió: 02 2252M02_RPS3_Solucio
Formació professional

6. Àlies a les columnes: Obteniu un llistat dels metges (nom, cognoms i sou) mostrant el sou
mensual (dividit per 14) i definit un àlies per la columna sou.

SELECT nom, cognoms, sou/14 AS souMensual FROM metge; 

7. Ordenació de dades: Obteniu un llistat de tots els pacients (nom, cognom i dataAlta) assignats a la
planta 2 i ordenats per nom.

SELECT nom, cognoms, dataAlta FROM pacient WHERE numP=2 ORDER BY nom; 

Codi: I71 Exercici de Fòrum Pàgina 4 de 12

Versió: 02 2252M02_RPS3_Solucio
Formació professional

8. Predicat per a cadenes de caràcters i patrons: Obteniu un llistat de les pacients (totes les dades)
amb el nom començant per 'A'.

SELECT * FROM pacient WHERE nom LIKE 'A%'; 

9. Els dos caràcters fonamentals dels patrons: Obteniu un llistat dels pacients (totes les dades)
amb el nom que tingui com a segona lletra la 'a'.

SELECT * FROM pacient WHERE nom LIKE '_a%'; 

10. Altres predicats: Obteniu un llistat de les visites realitzades entre l'1 de març del 2014 i el 10 de
març del 2014 (ambdós inclosos).

SELECT * FROM visita WHERE data BETWEEN '2014­03­01' AND '2014­03­10'; 

SELECT * FROM visita WHERE data>='2014­03­01' AND data<='2014­03­10';

Codi: I71 Exercici de Fòrum Pàgina 5 de 12

Versió: 02 2252M02_RPS3_Solucio
Formació professional

11. Altres predicats: Obteniu un llistat dels metges (totes les dades) no assignats a cap àrea.

SELECT * FROM metge WHERE numArea IS NULL;

12. Altres predicats: Obteniu un llistat dels metges (totes les dades) assignats a les àrees 1, 3 o 5.

SELECT * FROM metge WHERE numArea in (1,3,5); 

SELECT * FROM metge WHERE numArea=1 OR numArea=3 OR numArea=5;

Activitat 2 Consultes complexes

1. Funcions incorporades a Mysql (apartat 2.1): Obteniu un llistat dels metges (nom, cognoms i
sou). El sou emmagatzemat és l'anual i ha de sortir el mensual arrodonit a dos decimals (dividit per
14 ja que hi ha dues pagues extres).

SELECT nom, cognoms, ROUND(sou/14,0) AS souMensual FROM metge; 

SELECT nom, cognoms, ROUND(sou/14) AS souMensual FROM metge; 

Codi: I71 Exercici de Fòrum Pàgina 6 de 12

Versió: 02 2252M02_RPS3_Solucio
Formació professional

2. Funcions incorporades a Mysql (apartat 2.1): Obteniu un llistat dels metges (nom i cognom) on
aparegui el nom complet com cognom, nom tal com surt al resultat i en majúscules.

SELECT UPPER(CONCAT(cognoms,',',nom)) AS Cognoms_Nom FROM metge;

3. Funcions incorporades a Mysql (apartat 2.1): Obteniu un llistat de les visites programades en
dilluns. La consulta ha de mostrar també que són en Dilluns o bé Monday (més fàcil).

SELECT   *,   DAYNAME(data)   AS   Dia_Setmana   FROM   visita   WHERE   DAYNAME(data)   LIKE


'Monday'; 

SELECT *, IF (DAYNAME(data) LIKE 'Monday','Dilluns', NULL) AS Dia_Setmana FROM
visita WHERE DAYNAME(data) LIKE 'Monday';

4. Funcions incorporades a Mysql (apartat 2.1): Obteniu un llistat de les visites de l'1 al 15 d'abril
de 2014 ambdós inclosos on la data ha de sortir tal com s'indica al resultat.

Codi: I71 Exercici de Fòrum Pàgina 7 de 12

Versió: 02 2252M02_RPS3_Solucio
Formació professional

SELECT   dniPac,   codMetge,   DATE_FORMAT(data,'%d/%M/%Y')     dignostic   FROM   visita


WHERE data BETWEEN '2014­04­01' AND '2014­04­15';

5. Ordenació de files (apartat 2.2): Obteniu un llistat dels pacients (cognom, nom) assignats a la
planta 2 ordenada primer per cognom i després per nom en ordre descendent.

SELECT cognoms, nom FROM pacient WHERE numP=2 ORDER BY cognoms DESC, nom DESC;

6. Excloure files repetides (apartat 2.3): Obteniu un llistat de les àrees (numArea) on hi ha infermers
assignats.

SELECT DISTINCT numArea FROM infermer;

7. Agrupament de files (apartat 2.4): Obteniu un llistat de les àrees amb la quantitat de metges a
cada àrea. Atenció que hi ha un metge que no està assignat a cap àrea.

Codi: I71 Exercici de Fòrum Pàgina 8 de 12

Versió: 02 2252M02_RPS3_Solucio
Formació professional

SELECT   numArea,   COUNT(*)   AS   QuantitatMetges   FROM   metge   WHERE   numArea   IS   NOT


NULL GROUP BY numArea;

8. Agrupament de files (apartat 2.4): Obteniu un llistat de les plantes amb la quantitat de pacients a
cada planta.

SELECT numP, COUNT(*) as QuantitatPacients FROM pacient GROUP BY numP;

9. Agrupament de files (apartat 2.4): Obteniu un llistat de les àrees on aparegui el sou màxim, el sou
mínim, el sou mitjà i la suma dels sous dels metges assignats a cada àrea. Atenció que hi ha un
metge que no està assignat a cap àrea.

SELECT   numArea,   MAX(sou)   AS   SouMax,   MIN(sou)   AS   SouMin,   ROUND(AVG(sou))   AS


SouAvg,   SUM(sou)   AS   SumSou   FROM   metge   WHERE   numArea   IS   NOT   NULL     GROUP   BY
numArea;

10. Agrupament de files (apartat 2.4): Obteniu un llistat de les plantes (número planta i nombre
pacients) on hi hagi més de 4 pacients.

SELECT numP, COUNT(*) FROM pacient GROUP BY numP HAVING COUNT(*)>4;

Codi: I71 Exercici de Fòrum Pàgina 9 de 12

Versió: 02 2252M02_RPS3_Solucio
Formació professional

11. Unió, intersecció i diferència de sentències select (apartat 2.5): Obteniu un llistat (codi, nom i
cognoms) de tot el personal de l'hospital (metges i infermers).

SELECT codMetge, nom, cognoms FROM metge 
UNION 
SELECT codInf, nom, cognoms FROM infermer;

12. Combinacions entre taules (apartat 2.6). Obteniu un llistat dels metges amb la informació de
l'àrea on pertanyen.

SELECT m.*, a.nomArea FROM metge m, area a WHERE m.numArea=a.numArea; 

SELECT m.*, a.nomArea FROM metge m JOIN area a USING (numArea);

13. Combinacions entre taules (apartat 2.6). Obteniu un llistat de les visites afegint el nom i cognoms
del pacient realitzades pel metge Carles Vila ordenada per cognoms i nom.

Codi: I71 Exercici de Fòrum Pàgina 10 de 12

Versió: 02 2252M02_RPS3_Solucio
Formació professional

SELECT p.nom, p.cognoms, v.data, v.diagnostic 
FROM pacient p, visita v, metge m 
WHERE p.dni=v.dniPac AND v.codMetge=m.codMetge 
      AND m.nom LIKE 'Carles' AND  m.cognoms LIKE 'Vila' 
ORDER BY p.cognoms, p.nom;

SELECT p.nom, p.cognoms, v.data, v.diagnostic 
FROM pacient p JOIN visita v ON (p.dni=v.dniPac) JOIN metge m USING (codMetge) 
WHERE m.nom LIKE 'Carles' AND  m.cognoms LIKE 'Vila' 
ORDER BY p.cognoms, p.nom;

14. Combinacions entre taules (apartat 2.6). Obteniu un llistat dels metges amb la informació de
l'àrea on treballen. La consulta ha de mostrar tots els metges encara que no estiguin assignats a
cap àrea.

SELECT m.*, a.nomArea 
FROM metge m LEFT JOIN area a USING (numArea); 

SELECT m.*, a.nomArea 
FROM area a RIGHT JOIN metge m  USING (numArea);

15. Subconsultes (apartat 2.7) Obteniu un llistat dels metges que cobren més que el Carles Vila.

SELECT * FROM metge WHERE sou > (SELECT sou FROM metge WHERE nom LIKE 'Carles'
AND cognoms LIKE 'Vila'); 

Codi: I71 Exercici de Fòrum Pàgina 11 de 12

Versió: 02 2252M02_RPS3_Solucio
Formació professional

16. Subconsultes (apartat 2.7) Obteniu un llistat dels metges que cobren més que la mitjana de
l'hospital.

SELECT * FROM metge WHERE sou > (SELECT AVG(sou) FROM metge); 

Codi: I71 Exercici de Fòrum Pàgina 12 de 12

Versió: 02 2252M02_RPS3_Solucio

You might also like