B3-T3: SQL — LENGUAJE DE CONSULTA ESTRUCTURADO

Tema muy preguntado y práctico. Las consultas SELECT con JOINs, subconsultas y funciones de agregación son casi fijas. También caen preguntas sobre DDL (restricciones, ALTER TABLE), DCL (permisos), y conceptos de PL/SQL (cursores, excepciones, triggers). Practica interpretando consultas SQL — en el examen suelen presentar una consulta y preguntar qué devuelve.

CATEGORÍAS DEL LENGUAJE SQL

CategoríaSiglasSentenciasFunción
DDLData Definition LanguageCREATE, ALTER, DROP, TRUNCATEDefinir y modificar la estructura de objetos (tablas, índices, vistas)
DMLData Manipulation LanguageSELECT, INSERT, UPDATE, DELETE, MERGEConsultar y manipular datos
DCLData Control LanguageGRANT, REVOKEGestionar permisos y privilegios
TCLTransaction Control LanguageCOMMIT, ROLLBACK, SAVEPOINTGestionar transacciones
Examen: TRUNCATE es DDL (no DML) — borra todas las filas de una tabla sin generar log de transacciones individual por fila, no se puede hacer ROLLBACK (en la mayoría de SGBD), y resetea los contadores de autoincremento. DELETE es DML — borra fila a fila, genera log, permite ROLLBACK.

DDL — DEFINICIÓN DE DATOS

CREATE TABLE

Restricción (constraint)DescripciónEjemplo
PRIMARY KEYIdentifica unívocamente cada fila. NOT NULL + UNIQUE implícitosid INT PRIMARY KEY
FOREIGN KEYReferencia la PK de otra tabla. Mantiene integridad referencialFOREIGN KEY (dept_id) REFERENCES departamentos(id)
UNIQUENo permite valores duplicados (permite NULLs múltiples en algunos SGBD)email VARCHAR(100) UNIQUE
NOT NULLNo permite valores nulosnombre VARCHAR(50) NOT NULL
CHECKCondición que deben cumplir los datosCHECK (edad >= 18)
DEFAULTValor por defecto si no se especificaactivo BOOLEAN DEFAULT TRUE

ALTER TABLE

OperaciónSintaxis
Añadir columnaALTER TABLE t ADD COLUMN col tipo;
Eliminar columnaALTER TABLE t DROP COLUMN col;
Modificar tipoALTER TABLE t ALTER COLUMN col TYPE nuevo_tipo; (PostgreSQL) / MODIFY col nuevo_tipo (MySQL/Oracle)
Añadir restricciónALTER TABLE t ADD CONSTRAINT nombre CHECK (condición);
Eliminar restricciónALTER TABLE t DROP CONSTRAINT nombre;
Renombrar tablaALTER TABLE t RENAME TO nuevo_nombre;

Tipos de datos SQL más comunes

CategoríaTipoDescripción
NuméricosINTEGER / INTEntero de 4 bytes
BIGINTEntero de 8 bytes
DECIMAL(p,s) / NUMERIC(p,s)Exacto con p dígitos totales y s decimales
FLOAT / DOUBLE / REALComa flotante (aproximado)
TextoCHAR(n)Cadena de longitud fija (padding con espacios)
VARCHAR(n)Cadena de longitud variable (hasta n caracteres)
TEXT / CLOBTexto largo sin límite práctico
Fecha/HoraDATEFecha (YYYY-MM-DD)
TIMEHora (HH:MM:SS)
TIMESTAMPFecha + hora (con o sin zona horaria)
OtrosBOOLEANTRUE / FALSE (no estándar en Oracle, se usa NUMBER(1))
BLOBBinary Large Object (imágenes, archivos)

DML — CONSULTAS SELECT

Orden de ejecución lógico de una consulta

OrdenCláusulaFunción
1FROM / JOINDefine las tablas origen y los JOINs
2WHEREFiltra filas antes de agrupar
3GROUP BYAgrupa filas por columnas
4HAVINGFiltra grupos después de agrupar
5SELECTSelecciona columnas y expresiones
6DISTINCTElimina duplicados
7ORDER BYOrdena el resultado
8LIMIT / FETCHLimita el número de filas devueltas
Examen: WHERE filtra antes de agrupar (no puede usar funciones de agregación). HAVING filtra después de agrupar (puede usar funciones de agregación). Pregunta típica: "¿Cuál es la diferencia entre WHERE y HAVING?"

Tipos de JOIN

JOINResultadoFilas sin pareja
INNER JOINSolo filas con correspondencia en ambas tablasSe descartan
LEFT (OUTER) JOINTodas las filas de la tabla izquierda + las que coincidan de la derechaFilas izq. sin pareja → NULLs en columnas der.
RIGHT (OUTER) JOINTodas las filas de la tabla derecha + las que coincidan de la izquierdaFilas der. sin pareja → NULLs en columnas izq.
FULL (OUTER) JOINTodas las filas de ambas tablasNULLs donde no hay correspondencia
CROSS JOINProducto cartesiano (todas las combinaciones)No aplica (todas se combinan)
NATURAL JOININNER JOIN automático sobre columnas con el mismo nombreSe descartan
SELF JOINJoin de una tabla consigo misma (requiere alias)Según el tipo de JOIN usado

Funciones de agregación

FunciónDescripciónIgnora NULLs
COUNT(*)Cuenta todas las filas (incluyendo NULLs)No
COUNT(col)Cuenta filas donde col no es NULL
COUNT(DISTINCT col)Cuenta valores distintos no NULL
SUM(col)Suma de valores
AVG(col)Media aritmética
MAX(col)Valor máximo
MIN(col)Valor mínimo
Examen: COUNT(*) cuenta filas (incluye NULLs). COUNT(columna) cuenta solo valores no NULL. AVG ignora NULLs — la media de (10, NULL, 20) es 15, no 10.

Subconsultas

TipoUbicaciónEjemplo
Subconsulta escalarSELECT, WHERESELECT (SELECT MAX(sal) FROM emp) AS max_sal
Subconsulta de filaWHERE (con IN, ANY, ALL)WHERE dept_id IN (SELECT id FROM depts WHERE loc='Madrid')
Subconsulta correlacionadaWHERE (referencia tabla externa)WHERE sal > (SELECT AVG(sal) FROM emp e2 WHERE e2.dept=e1.dept)
Subconsulta en FROMFROM (inline view / derived table)FROM (SELECT dept, AVG(sal) media FROM emp GROUP BY dept) sub
EXISTS / NOT EXISTSWHEREWHERE EXISTS (SELECT 1 FROM pedidos WHERE cliente_id = c.id)

Operadores de conjuntos

OperadorDescripciónDuplicados
UNIONCombina resultados de dos SELECTs (mismas columnas)Elimina duplicados
UNION ALLIgual que UNION pero mantiene duplicadosMantiene
INTERSECTFilas comunes a ambos SELECTsElimina duplicados
EXCEPT / MINUSFilas del primer SELECT que no están en el segundoElimina duplicados

Funciones de ventana (window functions)

FunciónDescripciónEjemplo
ROW_NUMBER()Número secuencial único por fila en la particiónROW_NUMBER() OVER (PARTITION BY dept ORDER BY sal DESC)
RANK()Ranking con huecos (empates comparten posición, siguiente salta)1, 2, 2, 4
DENSE_RANK()Ranking sin huecos1, 2, 2, 3
NTILE(n)Divide las filas en n gruposNTILE(4) OVER (ORDER BY sal) — cuartiles
LAG(col, n)Valor de la fila n posiciones anteriorComparar con el mes anterior
LEAD(col, n)Valor de la fila n posiciones posteriorComparar con el mes siguiente
SUM/AVG/COUNT OVER()Agregaciones acumulativas o por partición sin agruparRunning total, media móvil
Examen: Las window functions se ejecutan después de WHERE, GROUP BY y HAVING. No reducen el número de filas (a diferencia de GROUP BY). La cláusula OVER() es obligatoria. PARTITION BY define grupos; ORDER BY define el orden dentro de cada grupo.

CTE (Common Table Expressions)

Las CTEs (definidas con WITH) son consultas temporales con nombre que se pueden referenciar en la consulta principal. Mejoran la legibilidad y permiten recursividad.

TipoDescripciónUso
CTE simpleWITH nombre AS (SELECT ...)Legibilidad, evitar subconsultas repetidas
CTE recursivaWITH RECURSIVE nombre AS (base UNION ALL SELECT ... FROM nombre ...)Jerarquías (organigramas, categorías), series numéricas

DML — MODIFICACIÓN DE DATOS

SentenciaSintaxisNotas
INSERTINSERT INTO t (cols) VALUES (vals);INSERT ... SELECT para insertar desde otra consulta
UPDATEUPDATE t SET col=val WHERE condición;Sin WHERE actualiza TODAS las filas
DELETEDELETE FROM t WHERE condición;Sin WHERE borra TODAS las filas (pero genera log)
MERGE (UPSERT)MERGE INTO t USING s ON (condición) WHEN MATCHED THEN UPDATE ... WHEN NOT MATCHED THEN INSERT ...Insert o update según existencia. No estándar en todos los SGBD

DCL — CONTROL DE ACCESO

SentenciaSintaxisDescripción
GRANTGRANT SELECT, INSERT ON tabla TO usuario;Otorga privilegios a un usuario o rol
REVOKEREVOKE INSERT ON tabla FROM usuario;Revoca privilegios otorgados
GRANT con delegaciónGRANT SELECT ON tabla TO usuario WITH GRANT OPTION;El usuario puede a su vez otorgar ese privilegio a otros

Privilegios típicos

PrivilegioPermite
SELECTConsultar datos de la tabla
INSERTInsertar filas
UPDATEModificar filas existentes
DELETEBorrar filas
ALL PRIVILEGESTodos los privilegios sobre el objeto
EXECUTEEjecutar procedimiento o función almacenada
CREATE TABLE / INDEX / VIEWCrear objetos en el esquema

PL/SQL — PROGRAMACIÓN EN BASE DE DATOS

Estructura de un bloque PL/SQL

SecciónPalabra claveDescripciónObligatoria
DeclaraciónDECLAREVariables, constantes, cursores, excepcionesNo
EjecuciónBEGIN ... END;Sentencias SQL y de control de flujo
ExcepcionesEXCEPTIONManejo de erroresNo

Cursores

TipoDescripciónUso
Cursor implícitoSe crea automáticamente para cada sentencia SQLINSERT, UPDATE, DELETE, SELECT INTO
Cursor explícitoDeclarado por el programador para recorrer un conjunto de resultados fila a filaProcesamiento fila a fila (OPEN → FETCH → CLOSE)
Cursor FOR loopCursor implícito con FOR que abre, itera y cierra automáticamenteForma más simple de iterar resultados
REF CURSORCursor dinámico que puede asociarse a distintas consultas en ejecuciónProcedimientos que devuelven result sets

Atributos de cursor implícito

AtributoTipoDescripción
SQL%FOUNDBOOLEANTRUE si la última sentencia afectó al menos una fila
SQL%NOTFOUNDBOOLEANTRUE si no afectó ninguna fila
SQL%ROWCOUNTNUMBERNúmero de filas afectadas
SQL%ISOPENBOOLEANSiempre FALSE para cursores implícitos (se cierran automáticamente)

Excepciones PL/SQL predefinidas

ExcepciónORA-CodeCausa
NO_DATA_FOUNDORA-01403SELECT INTO no devolvió ninguna fila
TOO_MANY_ROWSORA-01422SELECT INTO devolvió más de una fila
DUP_VAL_ON_INDEXORA-00001Inserción viola restricción UNIQUE
ZERO_DIVIDEORA-01476División por cero
VALUE_ERRORORA-06502Error de conversión o truncamiento
INVALID_CURSORORA-01001Operación ilegal con un cursor (ej. FETCH de cursor cerrado)

Triggers

AspectoOpcionesDescripción
MomentoBEFORE / AFTER / INSTEAD OFCuándo se ejecuta respecto a la operación DML
EventoINSERT / UPDATE / DELETEQué operación lo dispara
NivelFOR EACH ROW / FOR EACH STATEMENTSe ejecuta por cada fila afectada o una vez por sentencia
Referencias:NEW / :OLDValores nuevos y antiguos de la fila (solo en row-level triggers)
Examen: INSTEAD OF triggers solo se usan sobre vistas (para hacer que vistas no actualizables acepten DML). :NEW contiene los valores nuevos (INSERT/UPDATE). :OLD contiene los valores anteriores (UPDATE/DELETE). En un INSERT, :OLD es NULL; en un DELETE, :NEW es NULL.

Procedimientos y funciones

AspectoProcedimientoFunción
RetornoNo devuelve valor directamente (usa OUT params)Devuelve un valor con RETURN
Uso en SELECTNo se puede usar en una consulta SQLSí (si no tiene efectos secundarios)
LlamadaEXECUTE proc(params)SELECT func(params) FROM dual
ParámetrosIN, OUT, IN OUTIN (solo entrada)

FUNCIONES SQL COMUNES

Funciones de cadena

FunciónDescripciónEjemplo
UPPER / LOWERMayúsculas / minúsculasUPPER('hola') → 'HOLA'
LENGTH / LENLongitud de la cadenaLENGTH('abc') → 3
SUBSTRING / SUBSTRExtraer subcadenaSUBSTR('abcdef', 2, 3) → 'bcd'
TRIM / LTRIM / RTRIMEliminar espaciosTRIM(' hola ') → 'hola'
CONCAT / ||Concatenar cadenas'a' || 'b' → 'ab'
REPLACESustituir textoREPLACE('abc', 'b', 'x') → 'axc'
COALESCEPrimer valor no NULL de la listaCOALESCE(NULL, NULL, 'x') → 'x'
NVL / IFNULL / ISNULLSi NULL, devuelve valor alternativoNVL(comision, 0) (Oracle)

Funciones de fecha

FunciónSGBDDescripción
SYSDATE / NOW() / CURRENT_TIMESTAMPOracle / MySQL / EstándarFecha y hora actual
EXTRACT(part FROM date)EstándarExtraer año, mes, día, hora de una fecha
DATE_ADD / INTERVALMySQL / PostgreSQLSumar/restar intervalos a fechas
TO_DATE / TO_CHAROracleConversión entre fecha y cadena con formato


FUENTES PÚBLICAS

Este resumen ha sido elaborado íntegramente a partir de fuentes de dominio público. No se ha utilizado material con copyright de terceros ni material de preparadores.
FuenteTipoReferencia
ISO/IEC 9075 — SQL StandardEstándarISO (conceptos públicos)
PostgreSQL DocumentationDocumentación oficialpostgresql.org/docs
Oracle SQL ReferenceDocumentación oficialdocs.oracle.com
Oracle PL/SQL ReferenceDocumentación oficialdocs.oracle.com
MySQL Reference ManualDocumentación oficialdev.mysql.com/doc

¿Quieres practicar este tema con tests?

MIMIR tiene más de 5.000 preguntas verificadas, simulacros con penalización real y chat IA que resuelve tus dudas sobre este tema.

Abrir MIMIR gratis →