UD06 · Consultes sobre una taula i funcions

Resum del tema

Consultar és l’operació més freqüent en qualsevol base de dades. En esta unitat aprendràs la sentència SELECT aplicada a una sola taula: triar columnes (projecció), filtrar files (selecció), ordenar, eliminar duplicats, tractar els valors nuls i transformar les dades amb les funcions que proporciona Oracle. A la UD07 combinarem diverses taules i agruparem resultats.

Tots els exemples s’executen sobre l’esquema de referència EDUGEST carregat amb els scripts del projecte, i mostren el resultat que has d’obtindre.

Resultats d'aprenentatge i criteris d'avaluació
RA3 Consulta la informació emmagatzemada en una base de dades emprant assistents, eines gràfiques i el llenguatge de manipulació de dades. 2 CE
  • RA3.a S'han identificat les eines i sentències per a realitzar consultes.
  • RA3.b S'han realitzat consultes simples sobre una taula.
RA5 Desenvolupa procediments emmagatzemats avaluant i utilitzant les sentències del llenguatge incorporat en el sistema gestor de bases de dades. 1 CE
  • RA5.e S'ha fet ús de les funcions proporcionades pel sistema gestor.

Temporalització

La unitat ocupa 23 hores d’aula (12 de teoria i 11 de pràctica). És la unitat amb més hores del curs: ací s’adquirix la destresa amb SELECT que s’utilitzarà fins al final del mòdul.

UD06 · 23 hores d'aula Teoria 12 h · Pràctica 11 hDel 22/01/2027 al 23/02/2027
SessióHoresTipusContingutOn
12TeoriaEines i sentència SELECT. Projecció, àlies, concatenació i DISTINCT§1 i §2
21PràcticaPrimeres consultes i einesPràctica 6.1
32TeoriaOrdenació i selecció amb WHERE: comparació, LIKE i operadors lògics§3 i §4 · laboratori de SELECT
43PràcticaConsultes per a secretariaPràctica 6.2
52TeoriaEl valor NULL i la lògica de tres valors§5 · simulador de lògica trivalent
62PràcticaLaboratori de valors nulsPràctica 6.3
71TeoriaLimitar el nombre de files§6
83TeoriaFuncions de fila (I): text, numèriques i de data§7.1 a §7.3
92TeoriaFuncions de fila (II): conversió, CASE, DECODE i expressions regulars§7.4 a §7.6
103PràcticaFuncions per a informesPràctica 6.4
111PràcticaValidar dades amb SQLPràctica 6.5
121PràcticaConsultes del dia a dia en EduGestProjecte EduGest-6
Treball autònom (fora de l'horari d'aula): Acabar les consultes de la pràctica 6.2 que no hagen donat temps a l’aula · Ampliacions de les pràctiques 6.3, 6.4 i 6.5

Les consultes s’aprenen escrivint-les. Abans d’executar cadascuna, prediu quantes files tornarà i per què; després comprova-ho. Els laboratoris interactius simulen el comportament d’Oracle sobre les dades reals d’EduGest, però no substituïxen un SGBD.

Objectius d’aprenentatge

En acabar esta unitat seràs capaç de:

  • Identificar les eines i les clàusules de la sentència SELECT.
  • Seleccionar columnes, calcular expressions i usar àlies.
  • Filtrar files amb operadors de comparació, lògics, BETWEEN, IN, LIKE i IS NULL.
  • Ordenar resultats i limitar el nombre de files.
  • Raonar amb la lògica de tres valors que introduïx NULL.
  • Usar funcions de text, numèriques, de data, de conversió i condicionals d’Oracle.

Prepara la teua sessió perquè les dates i els números es vegen com en estos apunts. Executa en connectar-te:

ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/YYYY';
ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,';

El format de presentació no canvia les dades guardades, només com es mostren.


Sessió 1 2 h Teoria · Eines, SELECT i projecció

1. Eines i sentències per a consultar

Per a consultar una base de dades Oracle pots usar:

EinaÚs
Full de treball SQL de SQL Developer o VS CodeEscriure i executar consultes (Ctrl+Intro); el resultat apareix en una graella
Generador de consultes (Query Builder) de SQL DeveloperConstruir la consulta arrossegant taules i marcant columnes; genera l’SQL
SQLcl / SQL*PlusLínia d’ordres; ideal per a scripts i per a guardar evidències amb SPOOL
Pestanya Dades d’una taula en SQL DeveloperVeure i filtrar el contingut sense escriure SQL

La sentència per a consultar és SELECT. La seua forma general, amb totes les clàusules que veuràs en esta unitat i en la següent, és:

SELECT    [DISTINCT] columnes o expressions     -- 5. quines columnes
FROM      taula(es)                              -- 1. d'on
WHERE     condició sobre les files               -- 2. quines files
GROUP BY  columnes d'agrupació                   -- 3. com agrupar          (UD07)
HAVING    condició sobre els grups               -- 4. quins grups          (UD07)
ORDER BY  criteris d'ordenació                   -- 6. en quin ordre
FETCH FIRST n ROWS ONLY;                         -- 7. quantes files

L’ordre en què s’escriu una consulta no és l’ordre en què s’avalua. El SGBD processa primer FROM, després WHERE, GROUP BY, HAVING, SELECT i finalment ORDER BY. Per això un àlies definit en el SELECT es pot usar en ORDER BY però no en WHERE.


2. Projecció: triar columnes

2.1 Totes les columnes o només algunes

SELECT * FROM ciclo;
COD_CICLONOMBREGRADOHORAS_TOTALES
DAMDesarrollo de Aplicaciones MultiplataformaSUPERIOR2000
DAWDesarrollo de Aplicaciones WebSUPERIOR2000
ASIRAdministración de Sistemas Informáticos en RedSUPERIOR2000
SMRSistemas Microinformáticos y RedesMEDIO2000

4 files

* és útil per a explorar, però en una aplicació o un informe escriu sempre les columnes que necessites: el resultat és més clar, transferix menys dades i no canvia si algú afig una columna a la taula.

SELECT codigo, nombre, horas
FROM   modulo
WHERE  cod_ciclo = 'DAM';

2.2 Expressions i àlies

En el SELECT es poden calcular expressions. Un àlies dóna nom a la columna resultant; si conté espais o majúscules, va entre cometes dobles.

SELECT codigo,
       nombre,
       horas,
       horas / 32            AS horas_semana,
       ROUND(horas / 32, 1)  AS "Horas/semana"
FROM   modulo
WHERE  cod_ciclo = 'DAW' AND curso = 2;
CODIGONOMBREHORASHORAS_SEMANAHoras/semana
0612Desarrollo web en entorno cliente1404.3754.4
0613Desarrollo web en entorno servidor16055
0614Despliegue de aplicaciones web802.52.5
0615Diseño de interfaces web1203.753.8

4 files

2.3 Concatenació

L’operador || unix cadenes:

SELECT apellidos || ', ' || nombre AS alumno, localidad
FROM   alumno
WHERE  cod_grupo = '2DAW'
ORDER  BY alumno;
ALUMNOLOCALIDAD
Amorós Guillem, SaraMutxamel
Carbonell Soriano, ElenaEl Campello
Planelles Marco, SofíaElche
Sala Brotons, MateoAlicante
Verdú Castelló, NicolásAlicante

5 files

2.4 Eliminar duplicats amb DISTINCT

SELECT DISTINCT localidad FROM alumno ORDER BY localidad;
LOCALIDAD
Alicante
El Campello
Elche
Mutxamel
San Vicente del Raspeig
Sant Joan d’Alacant

6 files

DISTINCT s’aplica a la fila completa del resultat: SELECT DISTINCT localidad, cod_grupo torna les combinacions distintes de les dues columnes.

Curiositat La taula DUAL té un nom per una raó

Segons el seu creador, Chuck Weiss, DUAL es va dissenyar al principi amb dues files, per a poder duplicar files amb un join. Hui en té una sola, però conserva el nom: servix per a avaluar expressions, com SELECT SYSDATE FROM DUAL.

2.5 La taula DUAL

DUAL és una taula especial d’Oracle amb una sola fila. Servix per a avaluar expressions que no depenen de cap taula:

SELECT SYSDATE, 7 * 24 AS horas_semana, UPPER('edugest') FROM dual;

Des d’Oracle 23ai la clàusula FROM és opcional en estos casos: SELECT SYSDATE; també funciona. En versions anteriors (i en l’examen, si uses 19c) escriu FROM dual.


Autoavaluació 2 preguntes
1 Què torna SELECT DISTINCT localidad FROM alumno?
2 En Oracle 26ai, com s’avalua una expressió com 1+1 sense consultar cap taula?

Sessió 3 2 h Teoria · Ordenació i selecció

3. Ordenació: ORDER BY

SELECT codigo, nombre, cod_ciclo, horas
FROM   modulo
WHERE  horas > 150
ORDER  BY horas DESC, codigo;
CODIGONOMBRECOD_CICLOHORAS
0485ProgramaciónDAM256
0485ProgramaciónDAW256
0369Implantación de sistemas operativosASIR224
0370Planificación y administración de redesASIR192
0372Gestión de bases de datosASIR160
0483Sistemas informáticosDAM160
0483Sistemas informáticosDAW160
0484Bases de datosDAM160
0484Bases de datosDAW160
0613Desarrollo web en entorno servidorDAW160

10 files

  • ASC (per defecte) ordena de menor a major i DESC de major a menor.
  • Amb diverses columnes, la segona només decidix quan hi ha empat en la primera.
  • Es pot ordenar per un àlies o per una expressió.
  • En Oracle, els NULL van al final en ordre ascendent i al principi en descendent. Pots canviar-ho amb NULLS FIRST o NULLS LAST.

Sense ORDER BY, l’ordre de les files no està garantit. Encara que hui isquen ordenades per la clau primària, demà poden eixir en un altre ordre.

A més, l’ordenació de textos amb accents depén del paràmetre de sessió NLS_SORT. Amb el valor per defecte (BINARY), «Álex» s’ordena després de «Zoe». Amb ALTER SESSION SET NLS_SORT = SPANISH; s’ordena com en un diccionari. Si els teus resultats apareixen en un altre ordre que en els apunts, revisa este paràmetre.


1. FROM

Primer decidix d’on ixen les files: FROM alumno. Per això l’àlies d’una columna definit en el SELECT no es pot usar encara.

2. WHERE

Descarta les files que no complixen la condició: WHERE nota >= 5. Ací només existixen les columnes de la taula.

3. SELECT

Calcula les expressions i els àlies de les columnes que es mostren: SELECT nombre, nota * 10 AS sobre_100.

4. ORDER BY

Ordena el resultat. És l’única clàusula que pot usar els àlies del SELECT.

5. Límit de files

Finalment es retalla amb FETCH FIRST n ROWS ONLY. A la UD07 s’afegiran GROUP BY i HAVING entre el WHERE i el SELECT.

4. Selecció: filtrar files amb WHERE

4.1 Operadors de comparació

OperadorSignificatExemple
=Igualcod_grupo = '1DAM'
<> o !=Distintturno <> 'M'
<, >, <=, >=Menor, major…nota_final >= 5
BETWEEN a AND bEntre a i b, tots dos inclososhoras BETWEEN 100 AND 160
IN (lista)Igual a algun de la llistacod_ciclo IN ('DAM', 'DAW')
LIKE patrónCoincidix amb un patróapellidos LIKE 'B%'
IS NULL / IS NOT NULLÉs (o no és) nulcod_grupo IS NULL
SELECT nombre, apellidos, localidad
FROM   alumno
WHERE  localidad = 'Mutxamel'
ORDER  BY apellidos;
NOMBREAPELLIDOSLOCALIDAD
MartinaAlemany VidalMutxamel
SaraAmorós GuillemMutxamel
IreneBelda IborraMutxamel
HugoBrotons IborraMutxamel
ÁlexTomás VidalMutxamel
AlbaTorregrosa PlanellesMutxamel

6 files

Les comparacions de text distingeixen majúscules i minúscules: localidad = 'mutxamel' no torna res. Per a comparar sense distingir-les usa UPPER(localidad) = 'MUTXAMEL'.

4.2 Patrons amb LIKE

ComodíSignificatExempleCoincidix amb
%Qualsevol seqüència de caràcters (inclús buida)'B%'Belda, Brotons
_Exactament un caràcter'_DAM'1DAM, 2DAM
SELECT nombre, apellidos
FROM   alumno
WHERE  apellidos LIKE 'B%'
ORDER  BY apellidos;
NOMBREAPELLIDOS
IreneBelda Iborra
LucíaBelda Quiles
HugoBrotons Iborra
AndreaBrotons Soriano

4 files

Per a buscar un % o un _ literals s’usa ESCAPE: email LIKE '%\_%' ESCAPE '\' busca correus que continguen un guió baix.

4.3 Operadors lògics i precedència

NOT s’avalua abans que AND, i AND abans que OR. Usa parèntesis sempre que barreges AND i OR.

-- Matrícules suspeses dels mòduls 2 o 8
SELECT id_matricula, id_alumno, nota_final
FROM   matricula
WHERE  nota_final < 5
AND    id_modulo IN (2, 8)
ORDER  BY id_matricula;
ID_MATRICULAID_ALUMNONOTA_FINAL
1000214.75
1000724.75
1003884

3 files

Què tornaria WHERE nota_final < 5 AND id_modulo = 2 OR id_modulo = 8?

Per la precedència, s’avalua com (nota_final < 5 AND id_modulo = 2) OR id_modulo = 8: tornaria els suspensos del mòdul 2 i totes les matrícules del mòdul 8, aprovades o no. Per això cal posar parèntesis, o usar IN.

Laboratori de SELECT

Construïx una consulta sobre la taula ALUMNO triant columnes, condicions i ordre. Compara el resultat amb el que vas predir.

Interactivo Laboratorio de SELECT Tabla ALUMNO de EduGest (32 filas) · simulación didáctica, no es un SGBD

1 · SELECT (columnas)

2 · WHERE (hasta tres condiciones)

3 · ORDER BY y FETCH FIRST

WHERE a OR b AND c no s’avalua d’esquerra a dreta: AND té major precedència que OR. Usa parèntesis sempre que barreges ambdós.

Autoavaluació 2 preguntes
1 WHERE nombre LIKE 'M_ría' quines cadenes complixen el patró?
2 Quina és la forma correcta de buscar les matrícules sense nota?

Sessió 5 2 h Teoria · El valor NULL
Curiositat NULL no és zero ni «buit»

NULL significa «valor desconegut». Per això NULL = NULL no és vertader, sinó desconegut, i per això SQL usa una lògica de tres valors: vertader, fals i desconegut.

5. El valor NULL

NULL significa «valor desconegut o no aplicable». No és un zero ni una cadena buida: és l’absència de valor.

5.1 Lògica de tres valors

Qualsevol comparació amb NULL dóna com a resultat desconegut (UNKNOWN), i WHERE només torna les files la condició de les quals és vertadera.

ABA AND BA OR BNOT A
VVVVF
VFFVF
V??VF
F?F?V
?????

Conseqüències pràctiques:

SELECT COUNT(*) FROM alumno WHERE cod_grupo = NULL;      -- 0 files: sempre!
SELECT COUNT(*) FROM alumno WHERE cod_grupo IS NULL;     -- 3 files
SELECT COUNT(*) FROM alumno WHERE cod_grupo <> '1DAM';   -- 22: els 3 sense grup NO ixen
SELECT nia, nombre, apellidos
FROM   alumno
WHERE  cod_grupo IS NULL;
NIANOMBREAPELLIDOS
10451110ZoeIborra Valero
10451147LucasAgulló Cerdá
10451184IreneBelda Iborra

3 files

Simulador de lògica de tres valors

Combina TRUE, FALSE i UNKNOWN amb AND, OR i NOT, i comprova quines files conserva WHERE.

Interactivo Lógica de tres valores TRUE · FALSE · UNKNOWN (NULL)

A · Tablas de verdad

B · ¿Qué filas deja pasar WHERE?

Autoavaluació 2 preguntes
1 TRUE AND UNKNOWN val…
2 WHERE nota_final NOT IN (5, NULL) què torna?

5.2 Funcions per a tractar els nuls

FuncióTornaExemple
NVL(expr, valor)valor si expr és nul; si no, exprNVL(email, '(sin correo)')
NVL2(expr, si_no_nulo, si_nulo)Un valor o un altre segons expr siga nulNVL2(id_tutor, 'Con tutor', 'Sin tutor')
COALESCE(e1, e2, ...)El primer valor no nul (estàndard SQL)COALESCE(email, telefono, 'sin contacto')
NULLIF(a, b)NULL si a = b; si no, aNULLIF(horas, 0) evita dividir per zero
SELECT id_alumno, nombre, NVL(email, '(sin correo)') AS email
FROM   alumno
WHERE  email IS NULL OR telefono IS NULL
ORDER  BY id_alumno;
ID_ALUMNONOMBREEMAIL
4Paulapaulaferri4@alu.edugest.es
8Iván(sin correo)
10Nereanereacerda10@alu.edugest.es
16Juliajuliaespi16@alu.edugest.es
19Alba(sin correo)
22Sofíasofiaplanelles22@alu.edugest.es
28Pablopabloamoros28@alu.edugest.es
30Zoe(sin correo)

8 files

Qualsevol operació aritmètica amb NULL dóna NULL: nota_final + 1 és NULL si no hi ha nota. I en Oracle, '' és NULL. Comprova-ho amb SELECT NVL('', 'era nulo') FROM dual;.


Sessió 7 1 h Teoria · Limitar el nombre de files

6. Limitar el nombre de files

-- Les cinc millors notes (amb desempat per id_matricula)
SELECT id_matricula, id_alumno, id_modulo, nota_final
FROM   matricula
WHERE  nota_final IS NOT NULL
ORDER  BY nota_final DESC, id_matricula
FETCH FIRST 5 ROWS ONLY;
ID_MATRICULAID_ALUMNOID_MODULONOTA_FINAL
10143292410
100459109.75
1013227239.75
10020459.5
100481089.25

5 files

VariantEfecte
FETCH FIRST 5 ROWS ONLYLes 5 primeres files
FETCH FIRST 5 ROWS WITH TIESLes 5 primeres i les empatades amb la cinquena
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLYFiles 11 a 20 (paginació)
FETCH FIRST 10 PERCENT ROWS ONLYEl 10 % de les files

FETCH FIRST és SQL estàndard i està en Oracle des de la versió 12c. En codi antic veuràs la pseudocolumna ROWNUM (WHERE ROWNUM <= 5), que s’avalua abans de l’ORDER BY i produïx errors si no s’usa amb una subconsulta. MySQL i PostgreSQL usen LIMIT 5.


Sessió 8 3 h Teoria · Funcions de fila: text, numèriques i de data

7. Funcions de fila

Les funcions de fila s’apliquen a cada fila i tornen un valor per fila. Formen part de les funcions que proporciona el sistema gestor (RA5.e). Les funcions de grup (COUNT, SUM, AVG…), que resumixen diverses files, s’estudien a la UD07.

7.1 Funcions de text

FuncióResultat d’exemple
UPPER('Bases de Datos') / LOWER(...)BASES DE DATOS / bases de datos
INITCAP('marta soler')Marta Soler
LENGTH('Oracle')6
SUBSTR('10450037', 1, 4)1045 (des de la posició 1, 4 caràcters)
INSTR('msoler@edugest.es', '@')7 (posició de la primera @)
TRIM(' hola '), LTRIM, RTRIMhola
LPAD('7', 3, '0') / RPAD('7', 3, '*')007 / 7**
REPLACE('1DAM', 'DAM', 'DAW')1DAW
CONCAT('a', 'b')ab (només dos arguments; millor ||)
-- Usuari del correu del professorat (allò que va abans de la @)
SELECT nombre, email, SUBSTR(email, 1, INSTR(email, '@') - 1) AS usuario
FROM   profesor
WHERE  id_departamento = 2;
NOMBREEMAILUSUARIO
Carmencortiz@edugest.escortiz
Sergiosramos@edugest.essramos
SELECT UPPER(apellidos) || ', ' || nombre AS alumno, LENGTH(nombre) AS letras
FROM   alumno
WHERE  cod_grupo = '1ASIR'
ORDER  BY apellidos;
ALUMNOLETRAS
AMORÓS CARBONELL, Pablo5
IBORRA TORREGROSA, Diego5
PASCUAL BROTONS, Aitana6
TOMÁS GUILLEM, Víctor6
TOMÁS VIDAL, Álex4

7.2 Funcions numèriques

FuncióResultat
ROUND(7.256, 2) / ROUND(7.5)7.26 / 8
TRUNC(7.256, 1) / TRUNC(7.9)7.2 / 7
CEIL(4.1) / FLOOR(4.9)5 / 4
MOD(17, 5)2 (resta)
ABS(-3), POWER(2, 10), SQRT(81)3, 1024, 9
-- Notes arredonides a l'enter, com apareixen al butlletí
SELECT id_matricula, nota_final, ROUND(nota_final) AS nota_boletin, TRUNC(nota_final) AS nota_truncada
FROM   matricula
WHERE  id_alumno = 1
ORDER  BY id_matricula;
ID_MATRICULANOTA_FINALNOTA_BOLETINNOTA_TRUNCADA
100018.7598
100024.7554
100037.2577
100044.7554
100056.7576

Fixa’t en la matrícula 10002: amb ROUND, un 4,75 apareix com a 5 en el butlletí, però el mòdul està suspés. Les decisions (aprovar o no) es prenen sempre sobre el valor real, mai sobre el valor formatat.

7.3 Funcions de data

En Oracle, restar dues dates dóna el nombre de dies entre elles, i sumar un número a una data afig dies.

FuncióResultat
SYSDATE / SYSTIMESTAMPData i hora actuals del servidor
ADD_MONTHS(DATE '2026-01-31', 1)28/02/2026
MONTHS_BETWEEN(fecha1, fecha2)Mesos entre dues dates (amb decimals)
EXTRACT(YEAR FROM fecha)L’any (també MONTH, DAY)
TRUNC(SYSDATE)La data d’hui a les 00:00:00
LAST_DAY(DATE '2026-02-10')28/02/2026
NEXT_DAY(DATE '2026-10-06', 'LUNES')El dilluns següent (el nom depén de l’idioma de la sessió)
-- Edat de l'alumnat de 2DAW a data 6 d'octubre de 2026
SELECT id_alumno, nombre, fecha_nacimiento,
       TRUNC(MONTHS_BETWEEN(DATE '2026-10-06', fecha_nacimiento) / 12) AS edad
FROM   alumno
WHERE  cod_grupo = '2DAW'
ORDER  BY fecha_nacimiento;
ID_ALUMNONOMBREFECHA_NACIMIENTOEDAD
23Sara07/08/200026
20Mateo09/04/200323
22Sofía13/07/200422
24Nicolás11/05/200521
21Elena21/06/200521

En una aplicació real s’usaria SYSDATE en lloc de DATE '2026-10-06'. Ací es fixa la data perquè el resultat no canvie segons el dia en què executes la consulta. Els literals de data DATE 'AAAA-MM-DD' són SQL estàndard i no depenen de la configuració de la sessió: usa’ls sempre en lloc de cadenes com '15/09/2025'.

Comparar dates que tenen hora. Com que DATE guarda l’hora, per a buscar «el del dia 15» compara amb un interval semiobert:

SELECT * FROM matricula
WHERE  fecha_matricula >= DATE '2025-09-15'
AND    fecha_matricula <  DATE '2025-09-16';
Sessió 9 2 h Teoria · Conversió, CASE i expressions regulars

7.4 Funcions de conversió

FuncióÚsExempleResultat
TO_CHAR(fecha, formato)Data → textTO_CHAR(DATE '2026-10-06', 'DD/MM/YYYY')06/10/2026
TO_CHAR(DATE '2026-10-06', 'fmDay, DD "de" Month', 'NLS_DATE_LANGUAGE=SPANISH')Martes, 6 de Octubre
TO_CHAR(número, formato)Número → textTO_CHAR(1520.5, '9G990D00')1,520.50 (segons NLS)
TO_DATE(texto, formato)Text → dataTO_DATE('15/09/2025', 'DD/MM/YYYY')data
TO_NUMBER(texto)Text → númeroTO_NUMBER('42')42

Elements de format de data més usats: DD (dia), MM (mes), MON/MONTH (nom del mes), YYYY (any), HH24 (hora), MI (minuts), SS (segons), D (dia de la setmana), Q (trimestre).

SELECT nombre, apellidos,
       TO_CHAR(fecha_alta, 'DD/MM/YYYY') AS alta,
       EXTRACT(YEAR FROM DATE '2026-10-06') - EXTRACT(YEAR FROM fecha_alta) AS cursos_aprox
FROM   profesor
WHERE  fecha_alta < DATE '2015-01-01'
ORDER  BY fecha_alta;
NOMBREAPELLIDOSALTACURSOS_APROX
MartaSoler Ivars01/09/200917
CarmenOrtiz Llorca01/09/201016
JavierPastor Gil01/09/201214

Evita les conversions implícites: WHERE fecha_alta < '01/01/2015' funciona o falla segons el NLS_DATE_FORMAT de cada sessió, i WHERE nia = 10450037 (sense cometes) obliga Oracle a convertir totes les files de la columna, la qual cosa impedix usar el seu índex.

7.5 Funcions condicionals: CASE i DECODE

CASE és estàndard SQL i permet triar un valor segons condicions.

SELECT id_matricula, id_modulo, nota_final,
       CASE
           WHEN nota_final IS NULL THEN 'Sin calificar'
           WHEN nota_final < 5     THEN 'Insuficiente'
           WHEN nota_final < 6     THEN 'Suficiente'
           WHEN nota_final < 7     THEN 'Bien'
           WHEN nota_final < 9     THEN 'Notable'
           ELSE                         'Sobresaliente'
       END AS calificacion
FROM   matricula
WHERE  id_alumno = 1
ORDER  BY id_modulo;
ID_MATRICULAID_MODULONOTA_FINALCALIFICACION
1000118.75Notable
1000224.75Insuficiente
1000337.25Notable
1000444.75Insuficiente
1000556.75Bien

5 files

Les condicions s’avaluen en ordre i s’usa la primera que es complix. Per això basta amb nota_final < 6 en la segona branca: si fora menor que 5, ja s’hauria quedat en la primera.

CASE simple (compara una expressió amb valors) i el seu equivalent propi d’Oracle, DECODE:

SELECT cod_grupo,
       CASE turno WHEN 'M' THEN 'Mañana' WHEN 'T' THEN 'Tarde' END AS turno,
       DECODE(turno, 'M', 'Mañana', 'T', 'Tarde', 'Desconocido') AS turno_decode
FROM   grupo
ORDER  BY cod_grupo;
COD_GRUPOTURNOTURNO_DECODE
1ASIRMañanaMañana
1DAMMañanaMañana
1DAWTardeTarde
2ASIRMañanaMañana
2DAMMañanaMañana
2DAWTardeTarde

6 files

7.6 Expressions regulars

Oracle inclou funcions d’expressions regulars per a cerques més potents que LIKE: REGEXP_LIKE, REGEXP_SUBSTR, REGEXP_REPLACE, REGEXP_INSTR, REGEXP_COUNT.

-- Professorat amb DNI que comença per 2 i acaba en C o E
SELECT nombre, dni FROM profesor WHERE REGEXP_LIKE(dni, '^2[0-9]{7}[CE]$') ORDER BY nombre;
NOMBREDNI
Carmen21369874E
Marta21456789C

8. Errors freqüents

ErrorExempleCorrecció
Comparar amb = NULLWHERE email = NULLWHERE email IS NULL
Usar un àlies del SELECT en el WHEREWHERE edad > 20Repetix l’expressió o usa una subconsulta (UD07)
Cometes dobles per a textosWHERE turno = "M"Els textos van entre cometes simples; les dobles són per a identificadors (ORA-00904)
Oblidar parèntesis en barrejar AND i ORa AND b OR ca AND (b OR c)
Confiar en l’ordre sense ORDER BY—Ordena sempre que l’ordre importe
Comparar dates amb textfecha > '01/09/2025'fecha > DATE '2025-09-01'
BETWEEN amb dates amb horaBETWEEN DATE '2025-09-15' AND DATE '2025-09-15'Interval semiobert >= i <

9. Bones pràctiques

  • Escriu les paraules reservades en majúscules i alinea les clàusules: la consulta es llig millor.
  • Anomena explícitament les columnes; usa * només per a explorar.
  • Usa àlies clars per a les expressions calculades.
  • Usa literals DATE 'AAAA-MM-DD' i evita les conversions implícites.
  • Comenta les consultes que lliures: quina pregunta responen i quines decisions has pres.

Repassa els termes de la UD06 Prem una targeta per a girar-la

10. Resum

  • SELECT tria columnes (projecció), WHERE filtra files (selecció) i ORDER BY ordena.
  • El SGBD avalua FROM → WHERE → SELECT → ORDER BY.
  • NULL introduïx una lògica de tres valors: es compara amb IS NULL i es tracta amb NVL, COALESCE o NVL2.
  • FETCH FIRST n ROWS ONLY limita el nombre de files.
  • Oracle proporciona funcions de text, numèriques, de data, de conversió i condicionals (CASE, DECODE).

11. Autoavaluació

Autoavaluació 8 preguntes
1 Quina clàusula elimina files duplicades del resultat?
2 La taula ALUMNO té 32 files; 3 tenen cod_grupo a NULL i 7 estan en 1DAM. Quantes files torna WHERE cod_grupo <> '1DAM'?
3 Quin patró LIKE troba els grups de primer curs (‘1DAM’, ‘1DAW’, ‘1ASIR’)?
4 Per què falla SELECT horas*2 AS doble FROM modulo WHERE doble > 300?
5 Què torna NVL2(email, 'Sí', 'No') per a un alumne sense correu?
6 Què torna ROUND(4.75) i què torna TRUNC(4.75)?
7 Quina és la forma més fiable de filtrar les matrícules del 15 de setembre de 2025 si la columna és DATE?
8 En un CASE amb diverses branques WHEN que es complixen alhora, quina s’usa?

Referències