RECURSOS DE PROGRAMACIÓN
SQL: consultas básicas
Consulta rápida de operaciones SQL frecuentes: SELECT, filtros, ordenación, agrupación, JOIN y operaciones básicas sobre datos.
FUNDAMENTOS
Qué es SQL y cómo pensar en una consulta
SQL es un lenguaje utilizado para consultar y manipular información almacenada en bases de datos relacionales. Permite seleccionar datos, filtrarlos, ordenarlos, agruparlos, combinar tablas y realizar operaciones de inserción, actualización y borrado.
Una consulta SQL básica suele responder a tres preguntas:
- ¿Qué columnas necesito?
- ¿De qué tabla proceden?
- ¿Qué condiciones deben cumplir los registros?
SELECT nombre, email
FROM clientes
WHERE activo=true;Aunque SQL está estandarizado, algunos detalles de sintaxis pueden variar entre motores como PostgreSQL, MySQL, SQL Server, Oracle o SQLite.
CONSULTA
SELECT: recuperar información
SELECTindica qué columnas queremos obtener y FROMespecifica de qué tabla proceden.
SELECT nombre, precio
FROM productos;También podemos seleccionar todas las columnas mediante *:
SELECT *
FROM productos;En consultas reales suele ser preferible indicar explícitamente las columnas necesarias. Esto hace la intención más clara y evita recuperar datos que no se van a utilizar.
RESULTADOS
DISTINCT: eliminar duplicados del resultado
DISTINCTelimina filas duplicadas del conjunto de resultados.
SELECT DISTINCT ciudad
FROM clientes;Esto no modifica los datos almacenados en la tabla. Solo afecta al resultado mostrado por la consulta.
FILTROS
WHERE: seleccionar únicamente las filas necesarias
WHEREpermite establecer condiciones para limitar las filas devueltas.
SELECT nombre, precio
FROM productos
WHERE precio > 100;| Operador | Significado | Ejemplo |
|---|---|---|
= | Igual | estado='activo' |
<>o != | Distinto | estado <> 'baja' |
> | Mayor que | precio > 100 |
>= | Mayor o igual | nota >=5 |
< | Menor que | stock < 10 |
<= | Menor o igual | edad <=65 |
CONDICIONES
AND, OR y NOT
Podemos combinar varias condiciones utilizando operadores lógicos.
AND
SELECT *
FROM productos
WHERE precio >=50 AND stock > 0;OR
SELECT *
FROM clientes
WHERE ciudad='Valencia' OR ciudad='Alicante';NOT
SELECT *
FROM usuarios
WHERE NOT activo=false;Cuando una condición mezcla ANDy OR, utilizar paréntesis ayuda a expresar claramente la lógica que queremos aplicar.
FILTROS HABITUALES
IN, BETWEEN y LIKE
IN
INpermite comprobar si un valor pertenece a una lista.
SELECT *
FROM clientes
WHERE ciudad IN ('Valencia', 'Alicante', 'Castellón');BETWEEN
SELECT *
FROM productos
WHERE precio BETWEEN 50 AND 150;LIKE
LIKEpermite buscar patrones de texto.
SELECT *
FROM clientes
WHERE nombre LIKE 'Mar%';En muchos motores, %representa cualquier secuencia de caracteres.
VALORES AUSENTES
NULL no se compara con=
NULLrepresenta ausencia de valor. No debe compararse mediante =NULL.
Para comprobar valores nulos:
SELECT *
FROM clientes
WHERE telefono IS NULL;Para seleccionar valores no nulos:
SELECT *
FROM clientes
WHERE telefono IS NOT NULL;ORDENACIÓN
ORDER BY
ORDER BYordena las filas del resultado.
SELECT nombre, precio
FROM productos
ORDER BY precio ASC;Orden descendente:
SELECT nombre, precio
FROM productos
ORDER BY precio DESC;También podemos ordenar por varias columnas:
SELECT apellido, nombre
FROM clientes
ORDER BY apellido ASC, nombre ASC;LIMITAR RESULTADOS
LIMIT y otras variantes
Algunos motores permiten limitar el número de filas mediante LIMIT.
SELECT *
FROM productos
ORDER BY precio DESC
LIMIT 10;Esta sintaxis es habitual en PostgreSQL, MySQL y SQLite. Otros motores pueden utilizar construcciones distintas, como TOPo FETCH FIRST.
LEGIBILIDAD
Alias con AS
Los alias permiten cambiar temporalmente el nombre mostrado de una columna o utilizar nombres más breves para las tablas.
SELECT nombre AS cliente, email AS correo
FROM clientes;Alias de tabla:
SELECT c.nombre, c.email
FROM clientes AS c;AGREGACIÓN
COUNT, SUM, AVG, MIN y MAX
Las funciones de agregación permiten obtener cálculos sobre conjuntos de filas.
| Función | Uso | Ejemplo |
|---|---|---|
COUNT() | Contar filas o valores | COUNT(*) |
SUM() | Sumar valores | SUM(total) |
AVG() | Calcular una media | AVG(precio) |
MIN() | Obtener el valor mínimo | MIN(precio) |
MAX() | Obtener el valor máximo | MAX(precio) |
SELECT COUNT(*) AS total_productos, AVG(precio) AS precio_medio, MIN(precio) AS precio_minimo, MAX(precio) AS precio_maximo
FROM productos;AGRUPACIÓN
GROUP BY y HAVING
GROUP BYpermite agrupar filas que comparten un mismo valor para aplicar funciones de agregación sobre cada grupo.
SELECT categoria, COUNT(*) AS cantidad
FROM productos
GROUP BY categoria;HAVINGpermite filtrar después de realizar la agrupación.
SELECT categoria, COUNT(*) AS cantidad
FROM productos
GROUP BY categoria
HAVING COUNT(*) >=5;Una forma útil de recordarlo:
WHEREfiltra filas antes de agrupar.HAVINGfiltra grupos después de agrupar.
RELACIONES
Combinar tablas con JOIN
Las bases de datos relacionales distribuyen la información entre distintas tablas. Los JOINpermiten combinar filas relacionadas.
INNER JOIN
Devuelve únicamente las filas que tienen correspondencia en ambas tablas.
SELECT pedidos.id, clientes.nombre, pedidos.total
FROM pedidos
INNER JOIN clientes ON pedidos.cliente_id=clientes.id;LEFT JOIN
Devuelve todas las filas de la tabla situada a la izquierda y, cuando exista, la información relacionada de la tabla derecha.
SELECT clientes.nombre, pedidos.id
FROM clientes
LEFT JOIN pedidos ON clientes.id=pedidos.cliente_id;Un LEFT JOINes útil, por ejemplo, para localizar clientes aunque todavía no tengan pedidos asociados.
CONSULTAS COMPUESTAS
Subconsultas
Una subconsulta es una consulta utilizada dentro de otra consulta.
Por ejemplo, podemos localizar productos cuyo precio sea superior al precio medio:
SELECT nombre, precio
FROM productos
WHERE precio > ( SELECT AVG(precio) FROM productos
);Las subconsultas pueden ser muy útiles, aunque en consultas complejas conviene revisar si un JOIN, una CTE u otra estructura expresa mejor la intención.
INSERTAR DATOS
INSERT
INSERTpermite añadir nuevas filas a una tabla.
INSERT INTO productos (nombre, precio, stock)
VALUES ('Teclado', 49.90, 12);Es recomendable indicar explícitamente las columnas en las que estamos insertando datos, especialmente cuando la tabla puede evolucionar.
MODIFICAR DATOS
UPDATE
UPDATEmodifica filas existentes.
Antes de ejecutar un UPDATE, revisa siempre la condición WHERE.Si se omite, el cambio puede aplicarse a todas las filas de la tabla.
UPDATE productos
SET precio=54.90
WHERE id=15;Una práctica útil consiste en ejecutar primero un SELECTcon el mismo WHEREpara comprobar qué filas se verán afectadas.
SELECT *
FROM productos
WHERE id=15;ELIMINAR DATOS
DELETE
DELETEelimina filas de una tabla.
La condición WHERE es crítica.Un DELETEsin WHEREpuede eliminar todas las filas.
DELETE FROM productos
WHERE id=15;Antes de borrar, conviene verificar los registros mediante un SELECTequivalente.
SEGURIDAD DE CAMBIOS
Transacciones: COMMIT y ROLLBACK
Las transacciones permiten agrupar varias operaciones para que se confirmen como una unidad. Su sintaxis exacta puede variar según el sistema gestor.
BEGIN; UPDATE cuentas
SET saldo=saldo - 100
WHERE id=1; UPDATE cuentas
SET saldo=saldo + 100
WHERE id=2; COMMIT;Si detectamos un problema antes de confirmar la transacción, podemos utilizar ROLLBACKcuando el gestor y el contexto lo permitan.
ROLLBACK;Las transacciones son especialmente importantes cuando varias operaciones deben completarse juntas para mantener la consistencia de los datos.
SEGURIDAD
No concatenar entrada del usuario en una consulta
Cuando SQL se utiliza desde una aplicación, los valores introducidos por usuarios no deberían concatenarse directamente en la consulta.
El enfoque correcto es utilizar consultas parametrizadasmediante la biblioteca o framework correspondiente.
Conceptualmente:
SELECT *
FROM usuarios
WHERE email=:email;El modo exacto de declarar parámetros depende del lenguaje, driver y motor de base de datos. Esta práctica ayuda a evitar vulnerabilidades de inyección SQL.
MODELO MENTAL
Orden habitual de una consulta SELECT
Una consulta puede combinar muchas cláusulas. Un patrón habitual de escritura es:
SELECT ...
FROM ...
JOIN ...
WHERE ...
GROUP BY ...
HAVING ...
ORDER BY ...
LIMIT ...;No todas las consultas necesitan todas estas partes. La consulta debería incluir únicamente las cláusulas necesarias para expresar el resultado que buscamos.
PRÁCTICA PROPUESTA
Ejercicio: catálogo de productos y categorías
Imagina dos tablas simplificadas:
categorias
-----------
id
nombre productos
---------
id
nombre
precio
stock
categoria_idIntenta resolver estas consultas:
- Mostrar todos los productos.
- Mostrar los productos con precio superior a 50.
- Ordenar los productos de mayor a menor precio.
- Mostrar únicamente los productos con stock disponible.
- Calcular el precio medio.
- Contar cuántos productos hay en cada categoría.
- Mostrar el nombre del producto junto al nombre de su categoría mediante un JOIN.
- Mostrar únicamente las categorías que tengan al menos tres productos.
Una posible consulta para el punto 7 sería:
SELECT p.nombre AS producto, c.nombre AS categoria
FROM productos AS p
INNER JOIN categorias AS c ON p.categoria_id=c.id;ERRORES HABITUALES
Problemas frecuentes al empezar con SQL
| Situación | Qué revisar |
|---|---|
| La consulta devuelve demasiadas filas | Revisa las condiciones de WHERE. |
| Un JOIN multiplica resultados | Comprueba que la condición ONrelaciona correctamente las claves. |
| Comparación con NULL no funciona | Utiliza IS NULLo IS NOT NULL. |
| Error con GROUP BY | Revisa qué columnas están agrupadas y cuáles utilizan funciones de agregación. |
| UPDATE modifica demasiadas filas | Comprueba el WHEREantes de ejecutar. |
| DELETE elimina datos no deseados | Verifica primero las filas con un SELECTequivalente. |
| La sintaxis funciona en un motor pero no en otro | Consulta las particularidades del gestor utilizado. |
CRITERIO PROFESIONAL
Buenas prácticas básicas
- Selecciona únicamente las columnas que realmente necesites.
- Utiliza alias cuando ayuden a mejorar la legibilidad.
- Formatea las consultas de forma consistente.
- Comprueba los filtros antes de ejecutar
UPDATEoDELETE. - Utiliza transacciones cuando varias modificaciones deban ejecutarse como una unidad.
- No construyas consultas concatenando directamente entradas de usuario.
- Comprueba las relaciones entre tablas antes de escribir un JOIN complejo.
- Utiliza nombres de tablas y columnas que describan claramente su contenido.
- Evita depender de particularidades de un motor si el proyecto necesita portabilidad.
REFERENCIA RÁPIDA
Cláusulas y operaciones frecuentes
| Objetivo | SQL |
|---|---|
| Seleccionar datos | SELECT |
| Indicar tabla | FROM |
| Filtrar filas | WHERE |
| Eliminar duplicados del resultado | DISTINCT |
| Ordenar | ORDER BY |
| Agrupar | GROUP BY |
| Filtrar grupos | HAVING |
| Combinar tablas | JOIN |
| Insertar | INSERT |
| Actualizar | UPDATE |
| Eliminar filas | DELETE |
| Contar | COUNT() |
| Sumar | SUM() |
| Media | AVG() |
| Mínimo | MIN() |
| Máximo | MAX() |
PARA AMPLIAR
Documentación de referencia
Esta guía utiliza SQL genérico siempre que es posible. Para detalles concretos, conviene consultar la documentación del sistema gestor utilizado.