UD06 · Consultas sobre una tabla y funciones

Resumen del tema

Consultar es la operación más frecuente en cualquier base de datos. En esta unidad aprenderás la sentencia SELECT aplicada a una sola tabla: elegir columnas (proyección), filtrar filas (selección), ordenar, eliminar duplicados, tratar los valores nulos y transformar los datos con las funciones que proporciona Oracle. En la UD07 combinaremos varias tablas y agruparemos resultados.

Todos los ejemplos se ejecutan sobre el esquema de referencia EDUGEST cargado con los scripts del proyecto, y muestran el resultado que debes obtener.

Resultados de aprendizaje y criterios de evaluación
RA3 Consulta la información almacenada en una base de datos empleando asistentes, herramientas gráficas y el lenguaje de manipulación de datos. 2 CE
  • RA3.a Se han identificado las herramientas y sentencias para realizar consultas.
  • RA3.b Se han realizado consultas simples sobre una tabla.
RA5 Desarrolla procedimientos almacenados evaluando y utilizando las sentencias del lenguaje incorporado en el sistema gestor de bases de datos. 1 CE
  • RA5.e Se ha hecho uso de las funciones proporcionadas por el sistema gestor.

Temporalización

La unidad ocupa 23 horas de aula (12 de teoría y 11 de práctica). Es la unidad con más horas del curso: aquí se adquiere la destreza con SELECT que se utilizará hasta el final del módulo.

UD06 · 23 horas de aula Teoría 12 h · Práctica 11 hDel 22/01/2027 al 23/02/2027
SesiónHorasTipoContenidoDónde
12TeoríaHerramientas y sentencia SELECT. Proyección, alias, concatenación y DISTINCT§1 y §2
21PrácticaPrimeras consultas y herramientasPráctica 6.1
32TeoríaOrdenación y selección con WHERE: comparación, LIKE y operadores lógicos§3 y §4 · laboratorio de SELECT
43PrácticaConsultas para secretaríaPráctica 6.2
52TeoríaEl valor NULL y la lógica de tres valores§5 · simulador de lógica trivalente
62PrácticaLaboratorio de valores nulosPráctica 6.3
71TeoríaLimitar el número de filas§6
83TeoríaFunciones de fila (I): texto, numéricas y de fecha§7.1 a §7.3
92TeoríaFunciones de fila (II): conversión, CASE, DECODE y expresiones regulares§7.4 a §7.6
103PrácticaFunciones para informesPráctica 6.4
111PrácticaValidar datos con SQLPráctica 6.5
121PrácticaConsultas del día a día en EduGestProyecto EduGest-6
Trabajo autónomo (fuera del horario de aula): Terminar las consultas de la práctica 6.2 que no hayan dado tiempo en el aula · Ampliaciones de las prácticas 6.3, 6.4 y 6.5

Las consultas se aprenden escribiéndolas. Antes de ejecutar cada una, predice cuántas filas devolverá y por qué; después compruébalo. Los laboratorios interactivos simulan el comportamiento de Oracle sobre los datos reales de EduGest, pero no sustituyen a un SGBD.

Objetivos de aprendizaje

Al terminar esta unidad serás capaz de:

  • Identificar las herramientas y las cláusulas de la sentencia SELECT.
  • Seleccionar columnas, calcular expresiones y usar alias.
  • Filtrar filas con operadores de comparación, lógicos, BETWEEN, IN, LIKE e IS NULL.
  • Ordenar resultados y limitar el número de filas.
  • Razonar con la lógica de tres valores que introduce NULL.
  • Usar funciones de texto, numéricas, de fecha, de conversión y condicionales de Oracle.

Prepara tu sesión para que las fechas y los números se vean como en estos apuntes. Ejecuta al conectarte:

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

El formato de presentación no cambia los datos guardados, solo cómo se muestran.


Sesión 1 2 h Teoría · Herramientas, SELECT y proyección

1. Herramientas y sentencias para consultar

Para consultar una base de datos Oracle puedes usar:

HerramientaUso
Hoja de trabajo SQL de SQL Developer o VS CodeEscribir y ejecutar consultas (Ctrl+Intro); el resultado aparece en una rejilla
Generador de consultas (Query Builder) de SQL DeveloperConstruir la consulta arrastrando tablas y marcando columnas; genera el SQL
SQLcl / SQL*PlusLínea de órdenes; ideal para scripts y para guardar evidencias con SPOOL
Pestaña Datos de una tabla en SQL DeveloperVer y filtrar el contenido sin escribir SQL

La sentencia para consultar es SELECT. Su forma general, con todas las cláusulas que verás en esta unidad y en la siguiente, es:

SELECT    [DISTINCT] columnas o expresiones      -- 5. qué columnas
FROM      tabla(s)                               -- 1. de dónde
WHERE     condición sobre las filas              -- 2. qué filas
GROUP BY  columnas de agrupación                 -- 3. cómo agrupar        (UD07)
HAVING    condición sobre los grupos             -- 4. qué grupos          (UD07)
ORDER BY  criterios de ordenación                -- 6. en qué orden
FETCH FIRST n ROWS ONLY;                         -- 7. cuántas filas

El orden en que se escribe una consulta no es el orden en que se evalúa. El SGBD procesa primero FROM, después WHERE, GROUP BY, HAVING, SELECT y finalmente ORDER BY. Por eso un alias definido en el SELECT se puede usar en ORDER BY pero no en WHERE.


2. Proyección: elegir columnas

2.1 Todas las columnas o solo algunas

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 filas

* es útil para explorar, pero en una aplicación o un informe escribe siempre las columnas que necesitas: el resultado es más claro, transfiere menos datos y no cambia si alguien añade una columna a la tabla.

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

2.2 Expresiones y alias

En el SELECT se pueden calcular expresiones. Un alias da nombre a la columna resultante; si contiene espacios o mayúsculas, va entre comillas 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 filas

2.3 Concatenación

El operador || une cadenas:

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 filas

2.4 Eliminar duplicados con DISTINCT

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

6 filas

DISTINCT se aplica a la fila completa del resultado: SELECT DISTINCT localidad, cod_grupo devuelve las combinaciones distintas de las dos columnas.

Curiosidad La tabla DUAL tiene un nombre por una razón

Según su creador, Chuck Weiss, DUAL se diseñó al principio con dos filas, para poder duplicar filas con un join. Hoy tiene una sola, pero conserva el nombre: sirve para evaluar expresiones, como SELECT SYSDATE FROM DUAL.

2.5 La tabla DUAL

DUAL es una tabla especial de Oracle con una sola fila. Sirve para evaluar expresiones que no dependen de ninguna tabla:

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

Desde Oracle 23ai la cláusula FROM es opcional en estos casos: SELECT SYSDATE; también funciona. En versiones anteriores (y en el examen, si usas 19c) escribe FROM dual.


Autoevaluación 2 preguntas
1 ¿Qué devuelve SELECT DISTINCT localidad FROM alumno?
2 En Oracle 26ai, ¿cómo se evalúa una expresión como 1+1 sin consultar ninguna tabla?

Sesión 3 2 h Teoría · Ordenación y selección

3. Ordenación: 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 filas

  • ASC (por defecto) ordena de menor a mayor y DESC de mayor a menor.
  • Con varias columnas, la segunda solo decide cuando hay empate en la primera.
  • Se puede ordenar por un alias o por una expresión.
  • En Oracle, los NULL van al final en orden ascendente y al principio en descendente. Puedes cambiarlo con NULLS FIRST o NULLS LAST.

Sin ORDER BY, el orden de las filas no está garantizado. Aunque hoy salgan ordenadas por la clave primaria, mañana pueden salir en otro orden.

Además, la ordenación de textos con tildes depende del parámetro de sesión NLS_SORT. Con el valor por defecto (BINARY), «Álex» se ordena después de «Zoe». Con ALTER SESSION SET NLS_SORT = SPANISH; se ordena como en un diccionario. Si tus resultados aparecen en otro orden que en los apuntes, revisa este parámetro.


1. FROM

Primero decide de dónde salen las filas: FROM alumno. Por eso el alias de una columna definido en el SELECT no se puede usar todavía.

2. WHERE

Descarta las filas que no cumplen la condición: WHERE nota >= 5. Aquí solo existen las columnas de la tabla.

3. SELECT

Calcula las expresiones y los alias de las columnas que se muestran: SELECT nombre, nota * 10 AS sobre_100.

4. ORDER BY

Ordena el resultado. Es la única cláusula que puede usar los alias del SELECT.

5. Límite de filas

Por último se recorta con FETCH FIRST n ROWS ONLY. En la UD07 se añadirán GROUP BY y HAVING entre el WHERE y el SELECT.

4. Selección: filtrar filas con WHERE

4.1 Operadores de comparación

OperadorSignificadoEjemplo
=Igualcod_grupo = '1DAM'
<> o !=Distintoturno <> 'M'
<, >, <=, >=Menor, mayor…nota_final >= 5
BETWEEN a AND bEntre a y b, ambos incluidoshoras BETWEEN 100 AND 160
IN (lista)Igual a alguno de la listacod_ciclo IN ('DAM', 'DAW')
LIKE patrónCoincide con un patrónapellidos LIKE 'B%'
IS NULL / IS NOT NULLEs (o no es) nulocod_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 filas

Las comparaciones de texto distinguen mayúsculas y minúsculas: localidad = 'mutxamel' no devuelve nada. Para comparar sin distinguirlas usa UPPER(localidad) = 'MUTXAMEL'.

4.2 Patrones con LIKE

ComodínSignificadoEjemploCoincide con
%Cualquier secuencia de caracteres (incluso vacía)'B%'Belda, Brotons
_Exactamente 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 filas

Para buscar un % o un _ literales se usa ESCAPE: email LIKE '%\_%' ESCAPE '\' busca correos que contengan un guion bajo.

4.3 Operadores lógicos y precedencia

NOT se evalúa antes que AND, y AND antes que OR. Usa paréntesis siempre que mezcles AND y OR.

-- Matrículas suspendidas de los módulos 2 u 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 filas

¿Qué devolvería WHERE nota_final < 5 AND id_modulo = 2 OR id_modulo = 8?

Por la precedencia, se evalúa como (nota_final < 5 AND id_modulo = 2) OR id_modulo = 8: devolvería los suspensos del módulo 2 y todas las matrículas del módulo 8, aprobadas o no. Por eso hay que poner paréntesis, o usar IN.

Laboratorio de SELECT

Construye una consulta sobre la tabla ALUMNO eligiendo columnas, condiciones y orden. Compara el resultado con el que predijiste.

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 se evalúa de izquierda a derecha: AND tiene mayor precedencia que OR. Usa paréntesis siempre que mezcles ambos.

Autoevaluación 2 preguntas
1 WHERE nombre LIKE 'M_ría' ¿qué cadenas cumplen el patrón?
2 ¿Cuál es la forma correcta de buscar las matrículas sin nota?

Sesión 5 2 h Teoría · El valor NULL
Curiosidad NULL no es cero ni «vacío»

NULL significa «valor desconocido». Por eso NULL = NULL no es verdadero, sino desconocido, y por eso SQL usa una lógica de tres valores: verdadero, falso y desconocido.

5. El valor NULL

NULL significa «valor desconocido o no aplicable». No es un cero ni una cadena vacía: es la ausencia de valor.

5.1 Lógica de tres valores

Cualquier comparación con NULL da como resultado desconocido (UNKNOWN), y WHERE solo devuelve las filas cuya condición es verdadera.

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

Consecuencias prácticas:

SELECT COUNT(*) FROM alumno WHERE cod_grupo = NULL;      -- 0 filas: ¡siempre!
SELECT COUNT(*) FROM alumno WHERE cod_grupo IS NULL;     -- 3 filas
SELECT COUNT(*) FROM alumno WHERE cod_grupo <> '1DAM';   -- 22: los 3 sin grupo NO salen
SELECT nia, nombre, apellidos
FROM   alumno
WHERE  cod_grupo IS NULL;
NIANOMBREAPELLIDOS
10451110ZoeIborra Valero
10451147LucasAgulló Cerdá
10451184IreneBelda Iborra

3 filas

Simulador de lógica de tres valores

Combina TRUE, FALSE y UNKNOWN con AND, OR y NOT, y comprueba qué filas conserva WHERE.

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

A · Tablas de verdad

B · ¿Qué filas deja pasar WHERE?

Autoevaluación 2 preguntas
1 TRUE AND UNKNOWN vale…
2 WHERE nota_final NOT IN (5, NULL) ¿qué devuelve?

5.2 Funciones para tratar los nulos

FunciónDevuelveEjemplo
NVL(expr, valor)valor si expr es nulo; si no, exprNVL(email, '(sin correo)')
NVL2(expr, si_no_nulo, si_nulo)Un valor u otro según expr sea nuloNVL2(id_tutor, 'Con tutor', 'Sin tutor')
COALESCE(e1, e2, ...)El primer valor no nulo (estándar SQL)COALESCE(email, telefono, 'sin contacto')
NULLIF(a, b)NULL si a = b; si no, aNULLIF(horas, 0) evita dividir por cero
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 filas

Cualquier operación aritmética con NULL da NULL: nota_final + 1 es NULL si no hay nota. Y en Oracle, '' es NULL. Compruébalo con SELECT NVL('', 'era nulo') FROM dual;.


Sesión 7 1 h Teoría · Limitar el número de filas

6. Limitar el número de filas

-- Las cinco mejores notas (con desempate por 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 filas

VarianteEfecto
FETCH FIRST 5 ROWS ONLYLas 5 primeras filas
FETCH FIRST 5 ROWS WITH TIESLas 5 primeras y las empatadas con la quinta
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLYFilas 11 a 20 (paginación)
FETCH FIRST 10 PERCENT ROWS ONLYEl 10 % de las filas

FETCH FIRST es SQL estándar y está en Oracle desde la versión 12c. En código antiguo verás la pseudocolumna ROWNUM (WHERE ROWNUM <= 5), que se evalúa antes del ORDER BY y produce errores si no se usa con una subconsulta. MySQL y PostgreSQL usan LIMIT 5.


Sesión 8 3 h Teoría · Funciones de fila: texto, numéricas y de fecha

7. Funciones de fila

Las funciones de fila se aplican a cada fila y devuelven un valor por fila. Forman parte de las funciones que proporciona el sistema gestor (RA5.e). Las funciones de grupo (COUNT, SUM, AVG…), que resumen varias filas, se estudian en la UD07.

7.1 Funciones de texto

FunciónResultado de ejemplo
UPPER('Bases de Datos') / LOWER(...)BASES DE DATOS / bases de datos
INITCAP('marta soler')Marta Soler
LENGTH('Oracle')6
SUBSTR('10450037', 1, 4)1045 (desde la posición 1, 4 caracteres)
INSTR('msoler@edugest.es', '@')7 (posición 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 (solo dos argumentos; mejor ||)
-- Usuario del correo del profesorado (lo que va antes 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 Funciones numéricas

FunciónResultado
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 (resto)
ABS(-3), POWER(2, 10), SQRT(81)3, 1024, 9
-- Notas redondeadas al entero, como aparecen en el boletín
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

Fíjate en la matrícula 10002: con ROUND, un 4,75 aparece como 5 en el boletín, pero el módulo está suspendido. Las decisiones (aprobar o no) se toman siempre sobre el valor real, nunca sobre el valor formateado.

7.3 Funciones de fecha

En Oracle, restar dos fechas da el número de días entre ellas, y sumar un número a una fecha añade días.

FunciónResultado
SYSDATE / SYSTIMESTAMPFecha y hora actuales del servidor
ADD_MONTHS(DATE '2026-01-31', 1)28/02/2026
MONTHS_BETWEEN(fecha1, fecha2)Meses entre dos fechas (con decimales)
EXTRACT(YEAR FROM fecha)El año (también MONTH, DAY)
TRUNC(SYSDATE)La fecha de hoy a las 00:00:00
LAST_DAY(DATE '2026-02-10')28/02/2026
NEXT_DAY(DATE '2026-10-06', 'LUNES')El lunes siguiente (el nombre depende del idioma de la sesión)
-- Edad del alumnado de 2DAW a fecha 6 de 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ón real se usaría SYSDATE en lugar de DATE '2026-10-06'. Aquí se fija la fecha para que el resultado no cambie según el día en que ejecutes la consulta. Los literales de fecha DATE 'AAAA-MM-DD' son SQL estándar y no dependen de la configuración de la sesión: úsalos siempre en lugar de cadenas como '15/09/2025'.

Comparar fechas que tienen hora. Como DATE guarda la hora, para buscar «lo del día 15» compara con un intervalo semiabierto:

SELECT * FROM matricula
WHERE  fecha_matricula >= DATE '2025-09-15'
AND    fecha_matricula <  DATE '2025-09-16';
Sesión 9 2 h Teoría · Conversión, CASE y expresiones regulares

7.4 Funciones de conversión

FunciónUsoEjemploResultado
TO_CHAR(fecha, formato)Fecha → textoTO_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 → textoTO_CHAR(1520.5, '9G990D00')1,520.50 (según NLS)
TO_DATE(texto, formato)Texto → fechaTO_DATE('15/09/2025', 'DD/MM/YYYY')fecha
TO_NUMBER(texto)Texto → númeroTO_NUMBER('42')42

Elementos de formato de fecha más usados: DD (día), MM (mes), MON/MONTH (nombre del mes), YYYY (año), HH24 (hora), MI (minutos), SS (segundos), D (día de la semana), 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 las conversiones implícitas: WHERE fecha_alta < '01/01/2015' funciona o falla según el NLS_DATE_FORMAT de cada sesión, y WHERE nia = 10450037 (sin comillas) obliga a Oracle a convertir todas las filas de la columna, lo que impide usar su índice.

7.5 Funciones condicionales: CASE y DECODE

CASE es estándar SQL y permite elegir un valor según condiciones.

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 filas

Las condiciones se evalúan en orden y se usa la primera que se cumple. Por eso basta con nota_final < 6 en la segunda rama: si fuera menor que 5, ya se habría quedado en la primera.

CASE simple (compara una expresión con valores) y su equivalente propio de 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 filas

7.6 Expresiones regulares

Oracle incluye funciones de expresiones regulares para búsquedas más potentes que LIKE: REGEXP_LIKE, REGEXP_SUBSTR, REGEXP_REPLACE, REGEXP_INSTR, REGEXP_COUNT.

-- Profesorado con DNI que empieza por 2 y termina 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. Errores frecuentes

ErrorEjemploCorrección
Comparar con = NULLWHERE email = NULLWHERE email IS NULL
Usar un alias del SELECT en el WHEREWHERE edad > 20Repite la expresión o usa una subconsulta (UD07)
Comillas dobles para textosWHERE turno = "M"Los textos van entre comillas simples; las dobles son para identificadores (ORA-00904)
Olvidar paréntesis al mezclar AND y ORa AND b OR ca AND (b OR c)
Confiar en el orden sin ORDER BY—Ordena siempre que el orden importe
Comparar fechas con textofecha > '01/09/2025'fecha > DATE '2025-09-01'
BETWEEN con fechas con horaBETWEEN DATE '2025-09-15' AND DATE '2025-09-15'Intervalo semiabierto >= y <

9. Buenas prácticas

  • Escribe las palabras reservadas en mayúsculas y alinea las cláusulas: la consulta se lee mejor.
  • Nombra explícitamente las columnas; usa * solo para explorar.
  • Usa alias claros para las expresiones calculadas.
  • Usa literales DATE 'AAAA-MM-DD' y evita las conversiones implícitas.
  • Comenta las consultas que entregues: qué pregunta responden y qué decisiones has tomado.

Repasa los términos de la UD06 Pulsa una tarjeta para girarla

10. Resumen

  • SELECT elige columnas (proyección), WHERE filtra filas (selección) y ORDER BY ordena.
  • El SGBD evalúa FROM → WHERE → SELECT → ORDER BY.
  • NULL introduce una lógica de tres valores: se compara con IS NULL y se trata con NVL, COALESCE o NVL2.
  • FETCH FIRST n ROWS ONLY limita el número de filas.
  • Oracle proporciona funciones de texto, numéricas, de fecha, de conversión y condicionales (CASE, DECODE).

11. Autoevaluación

Autoevaluación 8 preguntas
1 ¿Qué cláusula elimina filas duplicadas del resultado?
2 La tabla ALUMNO tiene 32 filas; 3 tienen cod_grupo a NULL y 7 están en 1DAM. ¿Cuántas filas devuelve WHERE cod_grupo <> '1DAM'?
3 ¿Qué patrón LIKE encuentra los grupos de primer curso (‘1DAM’, ‘1DAW’, ‘1ASIR’)?
4 ¿Por qué falla SELECT horas*2 AS doble FROM modulo WHERE doble > 300?
5 ¿Qué devuelve NVL2(email, 'Sí', 'No') para un alumno sin correo?
6 ¿Qué devuelve ROUND(4.75) y qué devuelve TRUNC(4.75)?
7 ¿Cuál es la forma más fiable de filtrar las matrículas del 15 de septiembre de 2025 si la columna es DATE?
8 En un CASE con varias ramas WHEN que se cumplen a la vez, ¿cuál se usa?

Referencias