Fundamentos de SQL

SQL es el lenguaje con el que le haces preguntas a una base de datos y con el que guardas y cambias sus datos. Esta guía empieza por el orden en que se procesa una sentencia SELECT y sigue, paso a paso, por las funciones y GROUP BY, las combinaciones (JOIN), las subconsultas, las funciones de ventana y las consultas jerárquicas, hasta llegar a las sentencias que cambian los datos y los confirman. Los ejemplos usan todo el tiempo las mismas tablas de empleados y departamentos, y en cada capítulo hay una escena que puedes manipular tú mismo. Las explicaciones toman Oracle como referencia y, donde SQL Server se comporta de otra manera, lo indicamos aparte. Cómo dividir y diseñar las tablas lo explica la guía Modelado de datos.

01

Bases de datos relacionales y fundamentos de SELECT

El vocabulario de las bases de datos relacionales

Una base de datos relacional guarda los datos en tablas (cuadros de filas y columnas) y enlaza unas tablas con otras mediante valores clave. La teoría llama a las mismas cosas con otros nombres, así que conviene conocer las equivalencias.

Teoría (modelo relacional)En la tablaQué es
RelaciónTablaUn conjunto de filas con la misma estructura
TuplaFilaUna instancia
AtributoColumnaUna propiedad
Grado (degree)Número de columnasCuántos atributos hay
Cardinalidad (cardinality)Número de filasCuántas tuplas hay
DominioRango de valores de la columnaEl conjunto de valores que puede tomar un atributo

Las relaciones tienen unas propiedades: no puede haber dos tuplas idénticas, no hay orden ni entre las tuplas ni entre los atributos, y todos los valores son atómicos, es decir, no se pueden dividir más.

Las claves también son de varios tipos.

ClaveCondición
SuperclaveSolo cumple la unicidad: cualquier combinación de columnas que permita distinguir las filas
Clave candidataUnicidad + minimalidad: las que podrían llegar a ser clave primaria
Clave primaria (PK)La clave candidata elegida como representante. No admite NULL ni duplicados
Clave alternativaLas claves candidatas que no se eligieron como clave primaria
Clave foránea (FK)Una columna que hace referencia a la clave primaria de otra tabla

Las reglas que mantienen los datos siempre correctos son las restricciones de integridad. Las principales son la integridad de entidad (la clave primaria no puede ser NULL ni repetirse), la integridad referencial (el valor de una clave foránea tiene que existir en la tabla a la que hace referencia o ser NULL) y la integridad de dominio (el valor de una columna tiene que estar dentro de su dominio).

Las operaciones teóricas de las bases de datos relacionales forman el álgebra relacional. Así se corresponde cada parte de SQL con su operación.

TipoOperaciónSímboloEn SQL
Operadores relacionales purosSELECT (selección)σWHERE: elige las filas que cumplen una condición
PROJECT (proyección)πLista del SELECT: elige las columnas que quieres
JOIN (combinación)⋈JOIN: une dos relaciones por un valor común
DIVISION (división)÷Deja solo las filas que tienen todos los valores del divisor (no hay una sintaxis que le corresponda directamente)
Operadores de conjuntosUnión / intersección / diferencia∪ / ∩ / −UNION / INTERSECT / MINUS (EXCEPT)
Producto cartesiano×CROSS JOIN

Los cuatro tipos de sentencias SQL

TipoComandosQué hacen
DML (manipulación)SELECT, INSERT, UPDATE, DELETE, MERGEConsultan, insertan, modifican y eliminan datos. A veces SELECT se clasifica aparte como DQL
DDL (definición)CREATE, ALTER, DROP, RENAME, TRUNCATECrean, cambian y eliminan estructuras como las tablas
DCL (control)GRANT, REVOKEConceden y revocan privilegios
TCL (control de transacciones)COMMIT, ROLLBACK, SAVEPOINTConfirman o deshacen los cambios

SELECT y WHERE

Este es el esqueleto de SELECT.

SELECT [DISTINCT] columna [AS alias], ...
FROM   tabla
WHERE  condición
ORDER BY columna [ASC | DESC];
  • DISTINCT elimina las filas duplicadas del resultado (para que cuenten como duplicadas, toda la lista del SELECT tiene que coincidir)
  • Los alias se ponen con AS y, si llevan espacios o caracteres especiales, se escriben entre comillas dobles
  • Para concatenar cadenas, Oracle usa || y SQL Server usa + (la función CONCAT existe en los dos)

Estos son los operadores que se usan en WHERE.

OperadorSignificadoCuidado
=, <>, !=, ^=, >, <, >=, <=Comparación<>, != y ^= significan todos "distinto de"
BETWEEN a AND bDe a hasta b, ambos incluidosIncluye los dos extremos. El valor menor va primero
IN (a, b, c)Igual a alguno de la listaSi la lista de NOT IN contiene un NULL, no sale ninguna fila
LIKE 'A%'Patrón% es cualquier cadena de 0 o más caracteres; _ es exactamente un carácter. Para buscar el propio %, usa ESCAPE
IS NULL / IS NOT NULL¿Es NULL?= NULL siempre da "desconocido", así que no devuelve ninguna fila

Cuando encadenas varias condiciones, hay un orden de precedencia. Según la documentación de Oracle es paréntesis → operadores de comparación → NOT → AND → OR. AND va antes que OR, así que A OR B AND C se calcula como A OR (B AND C). Si dudas, lo más seguro es poner paréntesis.

¿Por qué NOT IN (10, 20, NULL) no devuelve nada? NOT IN se interpreta como “distinto de 10 AND distinto de 20 AND distinto de NULL”, y cualquier comparación con NULL da siempre ‘desconocido’, así que la condición completa nunca puede ser verdadera. Si el resultado de una subconsulta puede incluir NULL, usa NOT EXISTS o filtra antes los NULL.

ORDER BY: el orden y el lugar de los NULL

ORDER BY ordena de forma ascendente (ASC) por defecto, y puedes ordenar por nombre de columna, por alias o por la posición en la lista del SELECT (1, 2…). Donde hay diferencias es en los NULL. Oracle trata NULL como el valor más grande, así que en orden ascendente lo pone al final; SQL Server lo trata como el más pequeño y lo pone al principio. En Oracle puedes fijar tú mismo su posición con NULLS FIRST o NULLS LAST.

El orden en que se procesa una sentencia SELECT

Una sentencia SELECT no se procesa en el orden en que está escrita. Esta es la parte que más confunde al principio, pero en cuanto conoces ese orden, preguntas como “¿por qué no puedo usar un alias en WHERE?” o “¿por qué no puedo poner SUM en WHERE?” se resuelven de golpe. Avanza los pasos en la escena de abajo.

SELECT DEPT_CODE, SUM(SALARY) AS TOTAL
▶FROM EMP
WHERE SALARY >= 260
GROUP BY DEPT_CODE
HAVING SUM(SALARY) >= 280
ORDER BY TOTAL DESC;

EMP

EMP_NONAMEDEPT_CODESALARY
101AnaD10300
102BrunoD10250
103CarlosD20400
104DanielaD20350
105EstebanNULL280
106FernandaD30260

Paso 1 — FROM

Orden de procesamiento
FROM

Avanza paso a paso. El orden en que se escribe (SELECT arriba) no es el orden en que se procesa.

FROM va primero. Trae las 6 filas de la tabla EMP. SELECT se escribe arriba del todo, pero en realidad se procesa casi al final.

En resumen: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY. El alias nace en SELECT, así que solo se puede usar después, en ORDER BY.

Si la pregunta dice… → elige esto

  • “Número de columnas / número de filas de una relación”Grado / cardinalidad
  • “Cumple a la vez la unicidad y la minimalidad”Clave candidata
  • “La clave foránea es un valor de la tabla referenciada o NULL”Integridad referencial
  • “Operación relacional que elige solo las columnas que quieres”PROJECT (π)
  • “GRANT y REVOKE”DCL
  • “BETWEEN 100 AND 200”Incluye 100 y 200
  • “Un NULL en la lista de NOT IN”0 filas en el resultado
  • “Dónde queda NULL en orden ascendente en Oracle”Al final (en SQL Server, al principio)
  • “Por qué no puedes usar un alias del SELECT en WHERE”WHERE se procesa antes que SELECT

02

Funciones, GROUP BY y HAVING

Ya sabes sacar columnas con SELECT; ahora toca transformar los valores (funciones) y agruparlos para contar (GROUP BY).

Funciones de una sola fila: un valor por cada fila

Hay dos tipos de funciones: las funciones de una sola fila, que devuelven un resultado por cada fila, y las funciones de varias filas (funciones de agregado), que juntan varias filas y devuelven un único resultado. Las de una sola fila se pueden usar en SELECT, en WHERE o en ORDER BY, y también puedes anidar una función dentro de otra.

TipoOracleSQL ServerEjemplo y resultado
CarácterLOWER, UPPERLOWER, UPPERUPPER('sql') → 'SQL'
SUBSTRSUBSTRINGSUBSTR('DATABASE', 3, 4) → 'TABA'
LENGTHLENLENGTH('SQL') → 3
LTRIM, RTRIM, TRIMLTRIM, RTRIM, TRIMTRIM(' A ') → 'A'
CONCAT, ||CONCAT, +'A' || 'B' → 'AB'
NúmeroROUND, TRUNCROUNDROUND(38.567, 1) → 38.6 / TRUNC(38.567, 1) → 38.5
CEIL, FLOORCEILING, FLOORCEIL(3.1) → 4 / FLOOR(-3.1) → -4
MOD%MOD(7, 3) → 1
FechaSYSDATEGETDATE()La fecha y la hora actuales
EXTRACTDATEPARTEXTRACT(YEAR FROM HIRE_DATE)

En Oracle, si sumas un número a una fecha, se cuenta en días: HIRE_DATE + 1 es el día siguiente y HIRE_DATE + 1/24 es una hora después. Otra cosa: Oracle trata la cadena vacía (‘’) como NULL, mientras que SQL Server distingue entre la cadena vacía y NULL.

Conversión de tipos y CASE

Hay dos formas de cambiar el tipo de dato: la conversión explícita, en la que lo cambias tú con una función (Oracle: TO_CHAR, TO_NUMBER, TO_DATE; SQL Server: CAST, CONVERT), y la conversión implícita, que la base de datos hace por su cuenta. La implícita es cómoda, pero puede convertir de una forma que no esperabas o impedir que se use un índice, así que es buena costumbre escribir la conversión de forma explícita.

Para devolver valores distintos según una condición se usa CASE. Existe el CASE simple, que compara con un valor, y el CASE de búsqueda, que usa expresiones de condición. Oracle tiene además la función DECODE, que hace lo mismo.

SELECT NAME,
       CASE WHEN SALARY >= 350 THEN 'Alto'
            WHEN SALARY >= 280 THEN 'Medio'
            ELSE 'Bajo' END AS GRADE,      -- sin ELSE, da NULL
       DECODE(DEPT_CODE, 'D10', 'Ventas', 'D20', 'Desarrollo', 'Otros') AS DEPT_NAME
FROM   EMP;

Funciones para manejar NULL

FunciónQué devuelveEjemplo
NVL(a, b) / ISNULL(a, b)b si a es NULL; si no, aNVL(BONUS, 0)
NVL2(a, b, c)b si a no es NULL; c si es NULL (Oracle)NVL2(BONUS, 'Con bono', 'Sin bono')
NULLIF(a, b)NULL si a y b son iguales; si no, aNULLIF(10, 10) → NULL
COALESCE(a, b, c, ...)El primer valor que no es NULLCOALESCE(NULL, NULL, 3) → 3

Funciones de agregado y NULL

Las funciones de agregado como COUNT, SUM, AVG, MAX y MIN juntan varias filas en un solo valor. Solo hay una regla que recordar: todas ignoran los NULL, excepto COUNT(*). Cambia de función en la escena de abajo.

EMP

NAMESALARYBONUS
Ana30050
Bruno250NULL
Carlos400NULL
Daniela35030
Esteban280NULL
Fernanda26020

COUNT(*) = 6

Cálculo
Filas usadas
6 / 6

Cambia de función. Las filas en verde entraron en el cálculo; las tachadas quedaron fuera.

COUNT(*) cuenta las filas en sí. Una fila con BONUS en NULL sigue siendo una fila, así que el resultado es 6.

Si pones DISTINCT dentro de una función de agregado, cada valor repetido se cuenta una sola vez (COUNT(DISTINCT DEPT_CODE)). Si ninguna fila cumple la condición, COUNT devuelve 0, y SUM, AVG, MAX y MIN devuelven NULL.

GROUP BY y HAVING

GROUP BY junta las filas que tienen el mismo valor y calcula el agregado de cada grupo. Una vez agrupadas, cada grupo queda en una sola línea, y de ahí salen unas reglas.

  • Toda columna de la lista del SELECT que esté fuera de una función de agregado tiene que estar también en GROUP BY
  • En GROUP BY no se usan los alias del SELECT: por el orden de procesamiento, el alias todavía no existe (Oracle 23ai, la versión más reciente, lo permite, pero los exámenes siguen la regla tradicional)
  • NULL también forma un grupo
  • GROUP BY no garantiza ningún orden: si lo necesitas, usa ORDER BY

Para poner condiciones a los grupos se usa HAVING. WHERE filtra filas antes de agrupar y HAVING filtra grupos después de agrupar. Por eso las condiciones con funciones de agregado solo se pueden poner en HAVING. Si la condición no necesita una función de agregado, conviene filtrar antes en WHERE, porque así quedan menos filas que procesar.

SELECT   DEPT_CODE, COUNT(*) AS HEADCOUNT, AVG(SALARY) AS AVG_SAL
FROM     EMP
WHERE    SALARY >= 250          -- primero filtra las filas
GROUP BY DEPT_CODE
HAVING   COUNT(*) >= 2;         -- después de agrupar, filtra los grupos

Si la pregunta dice… → elige esto

  • “SUBSTR('DATABASE', 3, 4)”'TABA'
  • “La cadena vacía en Oracle”Se trata como NULL
  • “NULL si a y b son iguales”NULLIF(a, b)
  • “El primer valor que no es NULL”COALESCE
  • “La función de agregado que cuenta los NULL”Solo COUNT(*)
  • “AVG(BONUS) frente a AVG(NVL(BONUS, 0))”Dividen entre un número de filas distinto
  • “La cláusula para una condición con funciones de agregado”HAVING
  • “Una columna que no está en GROUP BY, en el SELECT”Error si no la envuelves en una función de agregado

Solo Pro

Hasta aquí llega la parte gratuita

Los otros 5 capítulos están disponibles para suscriptores Pro. Cada uno sigue con visuales en 3D y pistas de “si la pregunta dice…”, y en el último capítulo lo pones a prueba tú mismo.

  1. 03Combinaciones (JOIN)
  2. 04Subconsultas, vistas y operadores de conjuntos
  3. 05Funciones de grupo, funciones de ventana y Top N
  4. 06Autocombinación, consultas jerárquicas, PIVOT y expresiones regulares
  5. 07Sentencias de administración: DML, TCL, DDL y DCL

Publicidad

PasslyExam

Ya leíste el concepto. Ahora ponlo a prueba con preguntas de examen

PasslyExam ofrece preguntas de práctica originales, explicaciones y simulacros completos basados en la guía oficial de cada certificación. Las explicaciones cubren por qué la opción correcta es la correcta y por qué las opciones parecidas no lo son. Regístrate y practica gratis todos los días.

Exámenes que incluyen este concepto

Más guías sobre este tema

Guías de otros temas

Ver todas las guías