2. Desenvolupament aplicacions multiplataforma (DAM)
Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL
Tema 3 – Consultes simples
Objectius
1. Realització de consultes en una taula
Coneixements previs
• Model Entitat-Relació.
• Model relacional.
• Transformació del model Entitat-Relació al model relacional.
• Sistemes gestors de bases de dades (SGBD).
• Creació de base de dades.
• Creació de taules.
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 15
3. Desenvolupament aplicacions multiplataforma (DAM)
Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL
Tema 3 – Consultes simples
SQL - Select
Consultes simples.....................................................................................................................................1
Objectius....................................................................................................................................................2
Coneixements previs................................................................................................................................2
Requisits previs.........................................................................................................................................2
Introducció................................................................................................................................................4
Select sintaxis............................................................................................................................................5
Consultes «simples».................................................................................................................................6
select_expr...........................................................................................................................................6
Consultes per camps. Exemples........................................................................................................6
Utilització operacions. Exemples.......................................................................................................7
Utilització funcions. Exemples...........................................................................................................7
Funcions no agregades..................................................................................................................7
Exemples funcions no agregades.............................................................................................8
Funcions agregades........................................................................................................................8
Exemples funcions agregades..................................................................................................8
Filtres....................................................................................................................................................9
Operadors en els filtres..................................................................................................................9
Operadors. Exemples................................................................................................................9
Operadors lògics...........................................................................................................................10
Operadors lògics. Exemples....................................................................................................10
Operador IN..................................................................................................................................10
Operador IN. Exemple.............................................................................................................11
Operador Like...............................................................................................................................11
Operador Like. Exemples........................................................................................................11
Precedència operadors................................................................................................................12
Valor NULL.....................................................................................................................................12
IS NULL / IS NOT NULL............................................................................................................13
IS NULL / IS NOT NULL. Exemples.....................................................................................13
Distinct...........................................................................................................................................13
Order by.............................................................................................................................................14
Order by. Exemples......................................................................................................................14
Webgrafia................................................................................................................................................15
Autor: Miquel Boada Pàgina 3 de 15
4. Desenvolupament aplicacions multiplataforma (DAM)
Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL
Tema 3 – Consultes simples
Introducció.
Un dels objectius principals de la implementació d'una base de dades és la gestió de la
informació. Per a gestionar la informació és precís poder-la localitzar de forma eficient. Cal
tenir en compte que durant el procés de normalització s'ha dividit la informació en múltiples
taules. Una de les opcions importants que s'hauran de realitzar serà la de tornar a unir
aquesta informació per a tenir una visió global o relacionada de la mateixa. Per a consultar la
informació utilitzant el llenguatge SQL (Standard Query Language) disposem de la instrucció
«select».
Per a realitzar les diferents consultes es partirà del següent model ER i la seva conversió al
model físic.
create database dbheros;
use dbheros;
create table superhero(
nameh varchar(40), planet varchar(20) ,
intelligence decimal(4,2) not null,
strong decimal(4,2) not null,
primary key(nameh)
) engine=innodb;
La informació emmagatzemada en aquesta taula serà el resultat de l'execució de les següents
instruccions.
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","earth",round(rand()*100,2),round(rand()*100,2)),
("Thor","earth",round(rand()*100,2),round(rand()*100,2)),
("Hal Jordan",NULL,round(rand()*100,2),round(rand()*100,2)),
("Wonder Woman","earth",round(rand()*100,2),round(rand()*100,2)),
("Captain America",NULL,round(rand()*100,2),round(rand()*100,2)),
("Martian Manhunter","Mars",round(rand()*100,2),round(rand()*100,2));
Autor: Miquel Boada Pàgina 4 de 15
5. Desenvolupament aplicacions multiplataforma (DAM)
Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL
Tema 3 – Consultes simples
Select sintaxis
La instrucció «select» ens permet realitzar consultes en una base de dades. Les opcions més
utilitzades d'aquesta instrucció són:
SELECT
[ALL | DISTINCT ]
[HIGH_PRIORITY]
[STRAIGHT_JOIN]
select_expr [, select_expr ...]
[FROM table_references
[WHERE where_condition]
[GROUP BY {col_name | expr | position} [ASC | DESC], ... ]
[HAVING where_condition]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]]
En essència, la instrucció select ens permet obtenir el valor associat a diferents columnes o
camps d'una o vàries taules. Les taules que es consultin no han d'estar obligatòriament en la
mateixa taula.
Autor: Miquel Boada Pàgina 5 de 15
6. Desenvolupament aplicacions multiplataforma (DAM)
Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL
Tema 3 – Consultes simples
Consultes «simples»
El format de la consulta més simple, on intervingui almenys una taula, està composat per la
sentència: Select select_expr1 [,select_expr2] … from table ;
select_expr
L'expressió «select_expr » es pot substituir per a qualsevol de les següents alternatives:
nom_camp: obtenir la informació d'un camp de la taula. Els diversos camps es separaran
mitjançant una coma. Si el nom del camp conté espais1
s'ha d'incloure entre els símbols
de ` (accent obert) o bé " (cometes dobles).
* : obtenir la informació de tots els camps de la taula
camp operació camp : resultat d'aplicar un determinat càlcul a dos camps.
funció(camp) : resultat d'aplicar una determinada funció a un camp.
Consultes per camps. Exemples
use dbheros;
-- Obtenir el nom de tots els superherois de la base de dades
select nameh from superhero;
-- Obtenir el nom i el planeta on resideixen tots els herois
select nameh, planet from superhero;
-- Obtenir el nom , la força i la intel·ligència de cada un dels superherois
select nameh, strong, intelligence
from superhero;
-- Obtenir totes les dades de tots els superherois
select * from superhero;
Si una sentència «select» és molt llarga, es recomana escriure-la utilitzant diverses línies per a
millorar la legibilitat. Cal tenir en compte que el llenguatge SQL ignora totes les tabulacions,
espais sobrers (2 o més espais seguits) i salts de línia. A mode il·lustratiu en la tercera consulta
d'exemple s'ha introduït un salt de línia tot i que en aquest cas no era necessari.
1 Per a millor comoditat és preferible no utilitzar espais en blanc en els noms dels camps.
Autor: Miquel Boada Pàgina 6 de 15
7. Desenvolupament aplicacions multiplataforma (DAM)
Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL
Tema 3 – Consultes simples
Utilització operacions. Exemples
És habitual que algunes vegades es vulgui realitzar alguna operació o càlcul entre dues dades
d'un mateix registre. Els operadors matemàtics que es disposen en el llenguatge SQL són els
habituals en la majoria dels llenguatges: + , - , / , * (multiplicació), % (mòdul).
Quan es realitza un càlcul entre 2 o més camps d'una taula podem associar un nom a aquest
càlcul. Aquest nom es podrà utilitzar posteriorment per a referenciar el càlcul i simplificar la
instrucció resultant. L'associació es farà utilitzant la paraula «AS». Si el nom que volem assignar
conté espais utilitzarem " cometes dobles o bé ` (accent obert).
-- Obtenir el nom del superheroi i la proporció entre la força i la intelligència
-- de cada un dels superherois
select nameh, strong/intelligence from superhero;
-- Obtenir el nom del superheroi i la proporció entre la força i
-- la intelligència de cada un dels superherois.
– Associar el nom "proporcio" al resultat de l'operació
select nameh, strong/intelligence as proporcio from superhero;
-- Obtenir el nom del superheroi i la proporció entre la força i la intelligència
-- de cada un dels superherois.
-- Associar el nom "proporcio força i intel·ligencia" al resultat de l'operació
select nameh, strong/intelligence as "proporcio força i intel·ligencia"
from superhero;
Utilització funcions. Exemples
De forma semblant a la d'una fulla de càlcul, podem utilitzar funcions per a realitzar càlculs o
transformacions amb els camps d'una taula. El llenguatge SQL diferencia dos tipus de
funcions:
1. Funcions no agregades
2. Funcions agregades
Funcions no agregades
Les funcions no agregades són aquelles funcions que tracten cada fila de forma individual. Si
s'aplica la funció a una consulta de 100 registres, el resultat seran 100 registres amb el valor
del camp calculat.
Autor: Miquel Boada Pàgina 7 de 15
8. Desenvolupament aplicacions multiplataforma (DAM)
Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL
Tema 3 – Consultes simples
Exemples funcions no agregades
-- Obtenir el nom del superheroi i la proporció entre la força i la intelligència de cada un dels
superherois.
-- El càlcul de la proporció ha de ser a 2 decimals.
select nameh, round(strong/intelligence,2) as proporcio from superhero;
-- Mostrar en percentatge la proporció entre la força i la intel·ligència.
select nameh, concat(round(strong/intelligence*100,2)," %")
from superhero;
Funcions agregades
Les funcions agregades són aquelles que agrupen totes les files d'una consulta obtenint un
únic resultat; el seu resultat és una única fila amb el resultat demanat. Per exemple, «sum»
(sumatori), «count» (total de files), «avg» (mitjana) són funcions agregades.
Exemples funcions agregades
-- Obtenir el total d'herois introduïts en la taula
select count(*) from superhero;
-- Obtenir la mitjana de força i d'intel·ligència de tots els herois
select avg(strong) as "mitjana força", avg(intelligence) as "mitjana intel·ligència"
from superhero;
Podeu obtenir el llistat complet d'operacions i funcions en l'URL del producte oficial:
http://dev.mysql.com/doc/refman/5.7/en/functions.html
Autor: Miquel Boada Pàgina 8 de 15
9. Desenvolupament aplicacions multiplataforma (DAM)
Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL
Tema 3 – Consultes simples
Filtres.
Quan es realitzen consultes a les taules moltes vegades es precisa obtenir la informació d'un
subconjunt del total de registres que conté la taula. Quan es dóna aquesta situació s'aplica un
filtre. L'aplicació dels filtres es realitza amb la clàusula «where» (on). Quan en els filtres es
volen referenciar valors alfanumèrics fixes, cal incloure aquest valor entre cometes simples
( 'caràcters ' ).
Operadors en els filtres
Alguns dels operadors de comparació que podem usar en els filtres de les consultes són:
v1=v2 : v1 i v2 han de tenir el mateix valor per tal que la condició sigui certa.
v1>v2 : v1 ha de ser més gran que v2 per tal que la condició sigui certa.
v1<v2 : v1 ha de ser més petit que v2 per tal que la condició sigui certa.
v1>=v2 : v1 ha de ser més gran o igual a v2 per tal que la condició sigui certa.
v1<=v2 : v1 ha de ser més petit o igual a v2 per tal que la condició sigui certa.
v1<>v22
: v1 i v2 han de tenir valors diferents per tal que la condició sigui certa.
v1 between min and max : el resultat és cert si el valor de v1 és més gran o igual a min i
més petit o igual a max.
IN (valor1[, valor2 ]...)
v1 LIKE v2
En els filtres es poden utilitzar també funcions o operacions. En aquest cas el més normal és
incloure l'operació o la funció en la clausula where.
Operadors. Exemples
-- Obtenir totes les dades de "batman"
select * from superhero where nameh='batman';
-- Obtenir totes les dades de tots els herois que el seu nom no sigui batman
select * from superhero where nameh<>'batman';
-- Obtenir el nom de tots els herois que tinguin una força superior a 20
select nameh from superhero where strong>20;
-- Total d'intel·ligència de tots els herois que tenen més força que intel·ligència
select sum(intelligence) from superhero where strong>intelligence;
-- Obtenir el nom de tots els herois que tinguin el doble o més de força que d'intel·ligència
select nameh from superhero where strong/intelligence>=2;
-- Obtenir el nom de tots els herois que tinguin una força entre 1 i 5 ambdós inclosos
select nameh from superhero where strong between 1 and 5;
2 També es pot utilitzar l'operador != .
Autor: Miquel Boada Pàgina 9 de 15
10. Desenvolupament aplicacions multiplataforma (DAM)
Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL
Tema 3 – Consultes simples
Operadors lògics
Els operadors lògics permeten enllaçar diferents condicions. Els operadors lògics més comuns
en el llenguatge SQL són:
cond1 AND cond2
cond 1 OR cond2
NOT cond13
Cal tenir en compte que en el llenguatge SQL hi ha tres valors diferents que pot prendre una
condició: TRUE, FALSE i el valor especial NULL .
La taula de veritat per a cada un dels operadors lògics és:
AND OR
NOT
TRUE FALSE NULL TRUE FALSE NULL
TRUE TRUE FALSE NULL TRUE TRUE TRUE TRUE TRUE FALSE
FALSE FALSE FALSE FALSE FALSE TRUE FALSE NULL FALSE TRUE
NULL NULL FALSE NULL NULL TRUE NULL NULL NULL NULL
El tema de valors NULL es tracta posteriorment en aquest mateix document.
Operadors lògics. Exemples
-- Obtenir tota la informació de tots els herois que tenen el planeta earth assignat i que la seva
-- força sigui superior a 50
select * from superhero where strong>50 and planet='earth';
-- Obtenir el nom dels herois que no es diguin Batman o que tinguin el planeta earth assignat
select nameh from superhero where nameh<>'Batman' or planet='earth';
-- Obtenir totes les dades de tots dels herois amb una força o intel·ligència inferior a 50
-- i que tinguin el planeta 'earth' associat
select * from superhero where (strong<50 or intelligence<50) and planet='earth';
-- Obtenir el nom de tots els herois que NO tinguin una intelligencia superior a 50
-- ni una força superior a 50
select * from superhero where NOT (strong>50 or intelligence>50);
Operador IN
L'operador IN serveix per a comprovar si un valor està dins d'una seqüència de valors.
L'operador IN equival a concatenar diferents valors amb l'operador OR. Per exemple, la
sentència select … where valor IN (v1,v2,v3) equival a select … where valor=v1 or valor=v2 or valor=v3.
3 Per a tots els operadors lògics podem utilitzar la notació equivalent al llenguatge C, tot i que en el llenguatge SQL no és l'opció més
utilitzada.
Autor: Miquel Boada Pàgina 10 de 15
11. Desenvolupament aplicacions multiplataforma (DAM)
Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL
Tema 3 – Consultes simples
Operador IN. Exemple
select * from superhero where planet IN ('Earth','Mars', 'Jupiter', 'Saturn');
Operador Like
En les consultes a bases de dades és habitual voler buscar la informació pel contingut parcial
d'una columna. Així, consultes com, tots els noms que comencen, contenen o finalitzen amb
una o vàries lletres són habituals. Quan cal realitzar consultes d'aquests tipus , l'opció més
viable és utilitzar l'operador «LIKE». Aquest operador comprova si els caràcters especificats
estan continguts en el camp.
S'utilitza el caràcter comodí % per a indicar 0 o molts caràcters. Així, per exemple, l'expressió
«ma%» està associada a totes les paraules que comencen per «ma». L'expressió %abc% està
associada a totes les paraules que contenen abc (abc) inclosa.
Tot i que és menys freqüent, podem utilitzar el caràcter '_' (guió baix) per a indicar un únic
caràcter.
Operador Like. Exemples
-- Tots els herois que el seu nom acabi amb 'man'
select * from superhero where nameh like '%man';
-- Tots els herois que tinguin una 'i' en el seu nom i assignat un planeta que començi per 'e'
select * from superhero
where nameh like '%i%' and planet like 'e%';
-- Tots els herois que el seu nom contingui les lletres 'i' i 'm' i acabi amb n
select * from superhero where nameh like '%i%m%n';
-- Tots els herois que el seu nom comenci per 'i' i tingui una longitud de 2 caràcters
select * from superhero where nameh like 'i_;
Autor: Miquel Boada Pàgina 11 de 15
12. Desenvolupament aplicacions multiplataforma (DAM)
Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL
Tema 3 – Consultes simples
Precedència operadors
Un dels aspectes importants quan es fan consulta i que cal tenir en compte és la precedència
dels operadors, o sigui; quin és l'ordre que utilitza el llenguatge per a calcular els resultats
d'una clàusula where.
Tot i que en el llenguatge hi ha molts més operadors , en aquest document es mostren aquells
que són més habituals en les consultes ordenats pel seu ordre d'execució. Es pot trobar la
llista completa d'operadors a la plana: http://dev.mysql.com/doc/refman/5.7/en/operator-
precedence.html
1. *, /, DIV, %, MOD
2. -, +
3. = (comparison), <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN
4. BETWEEN, CASE, WHEN, THEN, ELSE
5. NOT
6. AND, &&
7. OR, ||
8. = (assignment), :=
En el següent vídeo es mostra la importància de la precedència dels operadors utilitzant els
operador «AND» i «OR». Com es pot veure en el vídeo, els resultats difereixen segons com es
faci la consulta: https://youtu.be/YDp-CUgT7SE
Valor NULL
El valor «NULL» és un valor especial del llenguatge SQL que s'utilitza per a indicar que el valor
d'un camp és desconegut, o sigui; no se li pot assignar cap valor ja que no el sabem. Per
exemple, en una base de dades d'una empresa concessionàira hi ha una taula «vehicle» amb la
informació dels cotxes que té a la venta. Els camps d'aquesta taula són: {bastidor (PK),
matrícula, color, model, marca}4
. Donat que la matrícula del cotxe és desconeguda fins que es
procedeixi a la venta i matriculació del cotxe, cal permetre el valor NULL (desconegut) com a
valor vàlid de camp. Tot i que l'utilització del valor NULL és un sistema molt vàlid per a indicar
la situació «desconeguda», aquest valor té una incidència directe en les consultes i cal tenir-lo
present.
Cal tenir present que el valor NULL no és un valor sobre el qual es puguin realitzar operacions.
Si es fa una operació amb valor NULL el resultat sempre és NULL. Podeu executar aquestes
instruccions per a comprovar-ho
4 S'han posat només alguns valors a mode d'exemple.
Autor: Miquel Boada Pàgina 12 de 15
13. Desenvolupament aplicacions multiplataforma (DAM)
Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL
Tema 3 – Consultes simples
-- Operacions amb valor NULL
select 3+NULL;
select NULL/0;
select 30*NULL;
select 5%NULL;
En el nostre exemple el camp «planet» permet valor NULL.
IS NULL / IS NOT NULL
L'expressió «IS NULL» és una expressió especial que ens permet comprovar si el valor d'un
camp és conegut o desconegut, o sigui; té valor NULL. Cal tenir en compte que la sentència
select … where nomCamp=NULL no funciona ja que no hi ha dos NULL iguals! Teniu una
demostració en el següent vídeo: https://youtu.be/uxUEEtk0Dqk
De la mateixa forma que utilitzem l'operador «IS NULL» podem utilitzar l'operador «IS NOT
NULL» per a descartar els valors NULL de la nostra consulta.
Cal tenir en compte quan es combina el valor NULL amb els operadors AND o OR, ja que
poden canviar el significat de la nostra consulta. Com s'observa en les taules de veritat TRUE
AND NULL s'evalua a NULL, la qual cosa fa que no es retorni cap resultat. Per aclarir aquest
concepte podeu consultar el següent vídeo: https://youtu.be/DszlkDqnw8I
IS NULL / IS NOT NULL. Exemples
-- Obtenir tota la informació de tots els herois que tenen assignat un planeta «desconegut»
select * from superhero where planet is null;
-- Obtenir tota la informació de tots els herois que NO tenen assignat un planeta «desconegut»
select * from superhero where planet is not null;
Distinct
Quan es seleccionen columnes i s'obtenen les files associades a les mateixes hi ha la
possibilitat que es mostrin registres duplicats. Amb l'ordre «distinct» podem evitar de forma
simple aquesta duplicació de dades.
El format de la comanda és:
select distinct col1 [,col2] … from taula
És important observar com l'ordre «distinct» es pot aplicar a més d'una columna. Cal tenir
present, però , que només actua quan totes les columnes incloses en el select tenen el mateix
valor: How distinct works (video)
Autor: Miquel Boada Pàgina 13 de 15
14. Desenvolupament aplicacions multiplataforma (DAM)
Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL
Tema 3 – Consultes simples
Order by
Quan es fa una consulta es poden ordenar els resultats de forma ascendent o descendent per
un o varis camps. En el cas de combinar varis camps, l'ordre pot ser ascendent per una sèrie
de camps i descendent pels altres. Utilitzem «ASC» quan es vulgui ordenar de forma ascendent
(de més petit a més gran) i DESC quan es vulgui fer de forma descendent (de més gran a més
petit)
La instrucció que utilitzem per a ordenar els registres és «order by» i la seva sintaxis dins la
instrucció «select» és:
select columnes from taula where condició order by col1 [ASC|DESC] [,col2 [ASC|DESC]]...
Order by. Exemples
-- Obtenir tots els herois ordenats per la seva força ( de - a + )
select * from superhero order by strong; -- ordre per defecte ASC
-- Obtenir tots els herois de més a menys intel·ligents. Si tenen la mateixa intel·ligència,
-- el segon criteri és per la força. També de més a menys.
select * from superhero order by intelligence DESC, strong DESC;
-- Obtenir tots els herois que tinguin més intel·ligència que força. Ordenar els resultats per
-- la intel·ligència (primer els més intel·ligents). Si tenen la mateixa intel·ligència
-- per força (primer els més dèbils).
select * from superhero where intelligence>strong
order by intelligence DESC, strong;
Autor: Miquel Boada Pàgina 14 de 15
15. Desenvolupament aplicacions multiplataforma (DAM)
Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL
Tema 3 – Consultes simples
Webgrafia
http://dev.mysql.com/doc/refman/5.7/en/select.html
http://dev.mysql.com/doc/refman/5.7/en/working-with-null.html
http://dev.mysql.com/doc/refman/5.7/en/operator-precedence.html
Autor: Miquel Boada Pàgina 15 de 15