Consultes b脿siques
Llic猫ncia: CC BY-NC-SA 4.0
(Reconeixement - NoComercial - CompartirIgual) 馃叚
Introducci贸
Una vegada s'ha definit un model de dades en una base de dades 茅s possible
realitzar consultes per manipular les dades emmagatzemades, com consultar
dades, insertar-ne de noves, modificar-les o eliminar-les.
Totes aquestes operacions es realitzen mitjan莽ant el Llenguatge de Manipulaci贸 de Dades (DML),
un subllenguatge de SQL.
Aquest material es centrar脿 a estudiar com realitzar consultes sobre una base de dades.
DML
El Llenguatge de Manipulaci贸 de Dades (DML o Data Definition Language) 茅s un
subllenguatge de SQL que permet manipular les dades de una base de dades.
Les accions que es permeten s贸n:
SELECT: Permet consultar les dades de la base de dades.
INSERT: Permet inserir noves dades a la base de dades.
UPDATE: Permet modificar dades existents.
DELETE: Permet elmininar dades.
Documentaci贸
Documentaci贸 oficial sobre DML:
SELECT
La sent猫ncia SELECT permet consultar dades existents en una base de dades.
T茅 el seg眉ent format:
SELECT
[ALL | DISTINCT | DISTINCTROW]
column_expr [[AS] alias] [, column2_expr [[AS] alias2] ...]
FROM table
[WHERE condition]
[ORDER BY {col_name} [ASC | DESC], ...]
[GROUP BY {col_name} [ASC | DESC], ... [WITH ROLLUP]]
[HAVING aggregate_condition]
SELECT: Indica que volem consultar les dades de una base de dades.
[ALL | DISTINCT | DISTINCTROW]: Par脿metre opcional.
ALL: Valor per defecte si no s'especifica. Retorna totes les files, incloses aquelles que siguen iguals.
DISTINCT: Retorna les files sense duplicats.
DISTINCTROW: Sin貌nim de DISTINCT.
-
column_expr [, column2_expr ...]: S'indiquen les columnes que es volen recuperar en la consulta.
Si es volen recuperar totes les columnes d'una taula es pot utilitzar un asterisc *.
-
[[AS] alias]: Opcionalment, es pot indicar un 脿lies a una columna o expresi贸, que es mostrar脿 en el resultat.
La paraula clau AS 茅s opcional.
-
FROM database.table: Indica la taula sobre la qual volem fer la consulta.
El par脿metre database 茅s opcional si la base de dades s'ha especificat pr猫viament amb USE.
-
WHERE condition: S'utilitza per filtrar els resultats en base a una condici贸.
ORDER BY: S'utilitza per ordenar els registres obtinguts en la consulta.
ASC: Indica que s'ordenaran els valors de manera ascendent. Valor per defecte.
DESC: Indica que s'ordenaran els valors de manera descendent.
GROUP BY: S'utilitza per agrupar els registres obtinguts en la consulta.
HAVING aggregate_condition: S'utilitza per filtrar els resultats obtinguts a partir d'una conduci贸 que utilitza
una funci贸 d'agregaci贸.
Documentaci贸
Documentaci贸 oficial sobre consultes:
L'ordre en el qual el SGBD realitza les consultes 茅s:
FROM
La paraula clau FROM especifica la taula o taules sobre les quals es recuperen
les dades. De moment, sols s'utilitzar脿 una 煤nica taula.
Exemple
En aquest material s'utilitzar脿 la Base de Dades Institut en els exemples.
Consultem les dades dels cicles formatius:
SELECT nom, sigles, nivell
FROM cicle_formatiu;
+------------------------------------------------+--------+----------+
| nom | sigles | nivell |
+------------------------------------------------+--------+----------+
| Sistemes Microinform脿tics en Xarxa | SMX | mitja |
| Administraci贸 de Sistemes Inform脿tics en Xarxa | ASIX | superior |
| Desenvolupament d'Aplicacions Multiplataforma | DAM | superior |
| Desenvolupament d'Aplicacions Web | DAW | superior |
+------------------------------------------------+--------+----------+
Consultem tots els registres i columnes de les fam铆lies professionals:
SELECT * FROM familia_professional;
+------------+-----------------------------+
| id_familia | nom |
+------------+-----------------------------+
| 1 | Inform脿tica i comunicacions |
+------------+-----------------------------+
WHERE
La paraula clau WHERE s'utilitza especificar una condici贸 a les dades que
es recuperen.
Les condicions poden incloure operacions num猫riques i alfab猫tiques, on es poden utilitzar constants o expressions aritm猫tiques, valors nuls, ...
!!! docs Documentaci贸 oficial sobre funcions:
- MariaDB: https://mariadb.com/kb/en/built-in-functions/
- MySQL 8.0: https://dev.mysql.com/doc/refman/8.0/en/built-in-function-reference.html
Comparadors
Dins de la cl脿usula WHERE es poden definir condicions, les quals utilitzen operadors de comparaci贸.
Algunes dels operadors m茅s comuns s贸n:
A = B: Comprova si dos valors s贸n iguals.
A != B o A <> B: Comprova si dos valors s贸n diferents.
A < B: Comprova si un element 茅s m茅s xicotet que l'altre.
A <= B: Comprova si un element 茅s m茅s xicotet o igual que l'altre.
A > B: Comprova si un element 茅s m茅s gran que l'altre.
A >= B: Comprova si un element 茅s m茅s gran o igual que l'altre.
A IN (B, C, ...): Comprova si un element forma part d'un conjunt de valors.
A NOT IN (B, C, ...): Comprova si un element no forma part d'un conjunt de valors.
A BETWEEN B AND C: Comprova si un element est脿 entre dos valors.
A NOT BETWEEN B AND C: Comprova si un element no est脿 entre dos valors.
Documentaci贸
Documentaci贸 oficial sobre comparadors:
Exemple
-
Consultem els m貌duls professionals amb m茅s de 200 hores:
SELECT *
FROM modul_professional
WHERE hores > 200;
+----------+--------------------------------------------+--------+-------+------+
| id_modul | nom | sigles | hores | ects |
+----------+--------------------------------------------+--------+-------+------+
| 0221 | Muntatge i Manteniment d'Equips | MME | 224 | 5 |
| 0223 | Aplicacions Ofim脿tiques | AOF | 224 | 5 |
| 0225 | Xarxes Locals | XAR | 224 | 5 |
| 0231 | Formaci贸 en Centres de Treball | FCT | 380 | 22 |
| 0369 | Implantaci贸 de Sistemes Operatius en Xarxa | ISO | 224 | 15 |
| 0382 | Formaci贸 en Centres de Treball | FCT | 400 | 22 |
| 0485 | Programaci贸 | PRG | 256 | 14 |
| 0495 | Formaci贸 en Centres de Treball | FCT | 400 | 22 |
| 0619 | Formaci贸 en Centres de Treball | FCT | 400 | 22 |
+----------+--------------------------------------------+--------+-------+------+
-
Consultem els m貌duls professionals amb exactament 9 cr猫dits.
SELECT *
FROM modul_professional
WHERE ects = 9;
+----------+--------------------------------------+--------+-------+------+
| id_modul | nom | sigles | hores | ects |
+----------+--------------------------------------+--------+-------+------+
| 0486 | Acc茅s a Dades | ADB | 120 | 9 |
| 0488 | Desenvolupament d'Interf铆cies | DIU | 120 | 9 |
| 0612 | Desenvolupament Web en Entorn Client | DFT | 140 | 9 |
| 0615 | Disseny d'Interf铆cies Web | DIW | 120 | 9 |
+----------+--------------------------------------+--------+-------+------+
-
Consultem els m貌duls professionals amb cr猫dits entre 10 i 20.
SELECT *
FROM modul_professional
WHERE ects BETWEEN 10 and 20;
+----------+--------------------------------------------+--------+-------+------+
| id_modul | nom | sigles | hores | ects |
+----------+--------------------------------------------+--------+-------+------+
| 0369 | Implantaci贸 de Sistemes Operatius en Xarxa | ISO | 224 | 15 |
| 0370 | Planificaci贸 i administraci贸 de xarxes | PAX | 192 | 12 |
| 0372 | Gesti贸 de Base de Dades | GBD | 160 | 11 |
| 0483 | Sistemes Inform脿tics | SI | 160 | 10 |
| 0484 | Bases de Dades | DBA | 160 | 12 |
| 0485 | Programaci贸 | PRG | 256 | 14 |
| 0613 | Desenvolupament Web en Entorn Servidor | DBK | 160 | 12 |
+----------+--------------------------------------------+--------+-------+------+
-
Consultem les persones el qual el seu nom 茅s Marta o Pau.
SELECT dni, nom, cognoms
FROM persona
WHERE nom IN ("Marta", "Pau");
+-----------+-------+---------+
| dni | nom | cognoms |
+-----------+-------+---------+
| 32409818N | Marta | Sanchis |
| 55739745G | Marta | Catal脿 |
| 56294859J | Marta | Ferrer |
| 71299956W | Pau | Mart铆 |
| 92384756F | Pau | Peris |
| 92743788Z | Pau | Ivars |
+-----------+-------+---------+
Operacions i funcions aritm猫tiques
Les operacions aritm猫tiques es poden utilitzar en qualsevol lloc dins de la sent猫ncia SELECT.
Normalment s'utilitzen en la cl脿usula SELECT o WHERE.
Documentaci贸
Documentaci贸 oficial sobre operacions i funcions aritm猫tiques:
Les operacions aritm猫tiques m茅s utilitzades s贸n:
+: Suma
-: Resta
*: Multiplicaci贸
/: Divisi贸
DIV: Divisi贸 entera
% o MOD: M貌dul o residu
Tamb茅 es pot fer 煤s de funcions aritm猫tiques integrades en el SGBD.
Les m茅s comunes s贸n:
-
POW(A, B): Pot猫ncia (\(A^B\))
!!! example "Exemple"
SELECT POW(10, 2); --> 100
-
LOG([A, ]B): Logartime (\(\log_A B\)). Si A no s'especifica, s'utilitza el logaritme natural (\(\ln{B}\)).
!!! example "Exemple"
SELECT LOG(10, 100); --> 2
-
PI(): Retorna el valor de el n煤mero pi (\(\pi\): 3,141593..).
!!! example "Exemple"
SELECT PI(); --> 3.141593
-
ABS(A): Valor absolut (sempre positiu).
!!! example "Exemple"
SELECT ABS(10); --> 10
SELECT ABS(-10); --> 10
-
ROUND(A, D): Arredoneix el n煤mero A al nombre de decimals D especificat.
!!! example "Exemple"
SELECT ROUND(10.25, 1); --> 10.3
SELECT ROUND(10.25, 0); --> 10
-
CEIL(A): Arredoneix el n煤mero A a l'al莽a.
!!! example "Exemple"
SELECT CEIL(10.25); --> 11
-
FLOOR(A): Arredoneix el n煤mero A a la baixa.
!!! example "Exemple"
SELECT FLOOR(10.25); --> 10
Exemple
- Consultem la r脿tio d'hores que necessites per aconseguir un cr猫dit en els m貌duls professionals.
Nota
S'ha definit l'脿lias ratio a la columna del resultat hores / etcs.
L'脿lias sols pot ser utulitzar en les cl脿usules ORDER BY, GROUP BY i HAVING
(https://stackoverflow.com/questions/942571/using-column-alias-in-where-clause-of-mysql-query-produces-an-error).
SELECT hores / ects AS ratio, sigles, nom
FROM modul_professional
WHERE (hores / ects) <= 12;
+---------+--------+-------------------------------------------------------------+
| ratio | sigles | nom |
+---------+--------+-------------------------------------------------------------+
| 12.0000 | SGBD | Administraci贸 de sistemes gestors de bases de dades |
| 8.0000 | PRJ | Projecte d'Administraci贸 de Sistemes Inform脿tics en Xarxa |
| 12.0000 | PSP | Programaci贸 de Serveis i Processos |
| 8.0000 | PRJ | Projecte de Desenvolupament d'Aplicacions Multiplataforma |
| 8.0000 | PRJ | Projecte de Desenvolupament d'Aplicacions Web |
+---------+--------+-------------------------------------------------------------+
Operacions i funcions amb cadenes de car脿cters
De la mateixa manera que es poden realitzar operacions aritm猫tiques,
tamb茅 es permeten operacions per processar i transformar les cadenes de car脿cters.
Documentaci贸
Documentaci贸 oficial sobre operacions amb cadenes de car脿cters:
Algunes de les funcions m茅s comuns s贸n:
LEFT(string, N): Retorna el prefix (part esquerra) de longitud N de la cadena de car脿cters.
RIGHT(string, N): Retorna el sufix (part dreta) de longitud N de la cadena de car脿cters.
CONCAT(string, ...): Retorna la concatenaci贸 de les cadenes de car脿cters especificades.
LOWER(string): Retorna la cadena de car脿cters en min煤scula.
UPPER(string): Retorna la cadena de car脿cters en maj煤scula.
Exemple
- Consultem les inicials, el nom, el cognom i la data de naixement de les persones nascudes abans del 1990.
SELECT CONCAT(LEFT(nom, 1), ".", LEFT(cognoms, 1), ".") AS inicials, nom, cognoms, data_naixement
FROM persona
WHERE data_naixement < "1990-01-01";
+----------+--------+----------+----------------+
| inicials | nom | cognoms | data_naixement |
+----------+--------+----------+----------------+
| M.S. | Mar | S谩nchez | 1984-11-10 |
| 脪.P. | 脪scar | Peris | 1975-01-15 |
| M.F. | Maria | Femenia | 1974-12-04 |
| P.P. | Pau | Peris | 1982-03-19 |
+----------+--------+----------+----------------+
A m茅s, existeix la comparaci贸 LIKE, que permet comprovar si una cadena de car脿cters
segueix un patr贸 definit:
%: Representa qualsevol cadena de car脿cters, de longitud variable. Pot ser la cadena buida.
_: Representa un 煤nic car脿cter.
Documentaci贸
Documentaci贸 oficial sobre LIKE:
Exemple
- Consultem les persones les quals el seu nom t茅 una "e" en segona posici贸.
SELECT *
FROM persona
WHERE nom LIKE "_e%";
+--------+------------+
| nom | cognoms |
+--------+------------+
| Sergi | Mart铆nez |
| Gemma | Femenia |
| Teresa | Mas |
| Helena | Montserrat |
| Helena | Benlloch |
| Teresa | Ginestar |
+--------+------------+
Operacions i funcions amb dates i hores
Tamb茅 existeixen operacions i funcions per extraure informaci贸 o manipular les dates o el temps.
Documentaci贸
Documentaci贸 oficial sobre operacions sobre dates i hores:
Les operacions m茅s comunes s贸n:
NOW(): Retorna un object DATETIME amb el dia i l'hora actual.
-
YEAR(), MONTH() i DAY(): Extrau l'any, mes i dia d'una data respectivament.
!!! example "Exemple"
SELECT YEAR("1707-04-25"); --> 1707
SELECT MONTH("1707-04-25"); --> 4
SELECT DAY("1707-04-25"); --> 25
-
HOUR(), MINUTE() i SECOND(): Extrau l'hora, el minut i els segons d'una hora respectivament.
!!! example "Exemple"
SELECT HOUR("23:59:00"); --> 23
SELECT MINUTE("23:59:00"); --> 59
SELECT SECOND("23:59:00"); --> 0
-
DATE_FORMAT(D, format): Retorna la data en el format especificat.
!!! info "Informaci贸"
El tipus de dades DATE sempre t茅 el format YYYY-MM-DD.
!!! docs "Documentaci贸"
- MYSQL 8.0: https://dev.mysql.com/doc/refman/8.0/en/datetime.html
Exemple
SELECT DATE_FORMAT("1707-04-25", "%d/%m/%Y"); --> "25/04/1707"
-
STR_TO_DATE(string, format): Retorna un objecte DATE a partir d'una cadena de car脿cters en el format especificat.
!!! example "Exemple"
SELECT STR_TO_DATE("25/04/1707", "%d/%m/%Y"); --> "1707-04-25"
Operadors l貌gics
Els operadors l貌gics s'utilitzen per modificar el resultat boole脿 d'una condici贸
o combinar-ne diverses.
Els principals operadors l貌gics s贸n:
-
NOT expr o ! expr: Nega una expresi贸. TRUE passa a ser FALSE i viceversa.
!!! note "Nota"
- `TRUE` es representa com un 1.
- `FALSE` es representa com un 0.
-
AND o &&: S'evalua a TRUE si les dues condicions es compleixen.
!!! info "Taula AND"
| A |
B |
A AND B |
| 0 |
0 |
0 |
| 0 |
1 |
0 |
| 1 |
0 |
0 |
| 1 |
1 |
1 |
-
OR o ||: S'evalua a TRUE si qualsevol de les dues condicions es compleix.
!!! info "Taula OR"
| A |
B |
A OR B |
| 0 |
0 |
0 |
| 0 |
1 |
1 |
| 1 |
0 |
1 |
| 1 |
1 |
1 |
-
XOR: S'evalua a TRUE si qualsevol de les dues condicions es compleix,
per貌 no cap de les dues o les dues a la vegada.
!!! info "Taula XOR"
| A |
B |
A XOR B |
| 0 |
0 |
0 |
| 0 |
1 |
1 |
| 1 |
0 |
1 |
| 1 |
1 |
0 |
Exemple
- Consulta les persones que el seu dni acaba en J i han nascut en el 2000 o anys posteriors.
SELECT dni, nom, cognoms, data_naixement
FROM persona
WHERE RIGHT(dni, 1) = "J" AND YEAR(data_naixement) >= 2000;
+-----------+------+---------+----------------+
| dni | nom | cognoms | data_naixement |
+-----------+------+---------+----------------+
| 58224076J | Rosa | Peris | 2000-10-21 |
+-----------+------+---------+----------------+
Registres duplicats (ALL | DISTINCT)
Les consultes poden retornar registres duplicats i podem especificar el comportament de la consulta en les seg眉ents opcions:
ALL: Comportament per defecte. La consulta pot retornar files duplicades.
DISTINCT: La consulta elimina les files duplicades del resultat.
ORDER BY
La cl脿usula ORDER BY permet especificar l'ordre dels resultats obtinguts en una consulta.
Per defecte, no s'aplica cap ordre en concret a la consuta.
En aquesta cl脿usula s'especifica un o m茅s criteris d'ordenaci贸.
Primer, s'ordena per el primer atribut especificat. Si hi ha un "empat", s'ordena pel seg眉ent, i aix铆 succecivament.
Es pot especificar el "sentit" de la ordenaci贸:
ASC: Ordena les dades de manera ascendent.
DESC: Ordena les dades de manera descendent.
Exemple
-
Es consulta la informaci贸 dels m貌duls professionals amb menys de 100 hores.
Els resultats s'han ordenat per nombre d'hores primer. En cas d'empat, pel nombre de cr猫dits descendentment.
Per 煤ltim, s'han orrdenat per l'ID del m貌dul.
SELECT *
FROM modul_professional
WHERE hores < 100
ORDER BY hores ASC, ects DESC, id_modul ASC;
+----------+-------------------------------------------------------------+--------+-------+------+
| id_modul | nom | sigles | hores | ects |
+----------+-------------------------------------------------------------+--------+-------+------+
| 0379 | Projecte d'Administraci贸 de Sistemes Inform脿tics en Xarxa | PRJ | 40 | 5 |
| 0492 | Projecte de Desenvolupament d'Aplicacions Multiplataforma | PRJ | 40 | 5 |
| 0616 | Projecte de Desenvolupament d'Aplicacions Web | PRJ | 40 | 5 |
| 0377 | Administraci贸 de sistemes gestors de bases de dades | SGBD | 60 | 5 |
| 0490 | Programaci贸 de Serveis i Processos | PSP | 60 | 5 |
| 0230 | Empresa i Iniciativa Emprenedora | EIE | 60 | 4 |
| 0381 | Empresa i Iniciativa Emprenedora | EIE | 60 | 4 |
| 0494 | Empresa i Iniciativa Emprenedora | EIE | 60 | 4 |
| 0618 | Empresa i Iniciativa Emprenedora | EIE | 60 | 4 |
| 0614 | Desplegament d鈥橝plicacions Web | DPL | 80 | 5 |
| 0228 | Aplicacions Web | AW | 88 | 5 |
| 0373 | Llenguatge de marques i sistemes de gesti贸 d'informaci贸 | LLM | 96 | 7 |
| 0371 | Fonaments de maquinari | FHW | 96 | 6 |
| 0487 | Entorns de Desenvolupament | IDE | 96 | 6 |
| CV0003 | Angl茅s T猫cnic I-S | ATI | 96 | 6 |
| CV0004 | Angl茅s T猫cnic II-S | ATI | 96 | 6 |
| 0229 | Formaci贸 i Orientaci贸 Laboral | FOL | 96 | 5 |
| 0380 | Formaci贸 i Orientaci贸 Laboral | FOL | 96 | 5 |
| 0493 | Formaci贸 i Orientaci贸 Laboral | FOL | 96 | 5 |
| 0617 | Formaci贸 i Orientaci贸 Laboral | FOL | 96 | 5 |
+----------+-------------------------------------------------------------+--------+-------+------+
Funcions d'agregaci贸
Les funci贸ns d'agregaci贸 s'utilitzen per realitzar operacions i fer c脿lculs a partir de m煤ltiples registres.
Aquestes funcions poden ser utilitzades amb la cl脿usula GROUP BY.
Les funcions d'agregaci贸 m茅s comunes s贸n:
-
COUNT(A): Compta el nombre de registres de la columna A.
!!! example "Exemple"
SELECT COUNT(nia) nombre_estudiants
FROM estudiant;
+-------------------+
| nombre_estudiants |
+-------------------+
| 40 |
+-------------------+
-
MIN(A): Retorna el valor m铆nim dels registres de la columna A.
!!! example "Exemple"
SELECT MIN(YEAR(data_naixement))
FROM persona;
+---------------------------+
| MIN(YEAR(data_naixement)) |
+---------------------------+
| 1974 |
+---------------------------+
-
MAX(A): Retorna el valor m脿xim dels registres de la columna A.
!!! example "Exemple"
SELECT MAX(YEAR(data_naixement))
FROM persona;
+---------------------------+
| MAX(YEAR(data_naixement)) |
+---------------------------+
| 2002 |
+---------------------------+
-
SUM(A): Retorna la suma dels valors dels registres de la columna A.
!!! example "Exemple"
SELECT SUM(hores)
FROM modul_professional;
+------------+
| sum(hores) |
+------------+
| 6806 |
+------------+
-
AVG(A): Retorna la mitjana aritm猫tica dels valors dels registres de la columna A.
!!! example "Exemple"
SELECT ROUND(AVG(hores), 2)
FROM modul_professional;
+---------------------+
| ROUND(AVG(hores),2) |
+---------------------+
| 141.79 |
+---------------------+
-
DISTINCT(A): Retorna els valors no repetits dels registres de la columna A.
!!! example "Exemple"
SELECT DISTINCT(hores)
FROM modul_professional
ORDER BY hores;
+-------+
| hores |
+-------+
| 40 |
| 60 |
| 80 |
| 88 |
| 96 |
| 100 |
| 110 |
| 120 |
| 128 |
| 140 |
| 160 |
| 176 |
| 192 |
| 224 |
| 256 |
| 380 |
| 400 |
+-------+
馃搶 Aquest document pot quedar desactualitzat despr茅s d鈥檌mprimir-lo. Pots consultar la versi贸 m茅s recent
a la p脿gina web.
馃尶 Abans d鈥檌mprimir aquest document, considera si 茅s realment necessari. Redueix el consum de paper i ajuda a protegir el nostre entorn.