Saltar a contenido

Chuleta de SQL

Las sentencias más usadas, con la base de datos del instituto. Todo el SQL de esta página se ha ejecutado sobre SQLite.

Consultar

SELECT DISTINCT ciudad FROM alumnos;                              -- sin repetidos
SELECT nombre, apellido FROM alumnos WHERE ciudad = 'Cádiz';  -- filtrar
SELECT nombre FROM alumnos WHERE id_grupo IS NULL;            -- NULL
SELECT * FROM asignaturas WHERE horas BETWEEN 100 AND 160;    -- rango
SELECT nombre FROM alumnos WHERE ciudad IN ('Jerez', 'Málaga');
SELECT nombre FROM alumnos WHERE apellido LIKE 'R%';          -- patrón
SELECT nombre FROM alumnos ORDER BY apellido DESC LIMIT 3 OFFSET 1;
Cláusula Para qué Orden al escribirla
SELECT Qué columnas 1
FROM / JOIN De dónde 2
WHERE Filtrar filas 3
GROUP BY Agrupar 4
HAVING Filtrar grupos 5
ORDER BY Ordenar 6
LIMIT / OFFSET Cuántas filas 7

Operadores

Tipo Operadores
Comparación =, <> (o !=), <, <=, >, >=
Lógicos AND, OR, NOT (usa paréntesis al mezclar)
Rango y lista BETWEEN a AND b, IN (...), NOT IN (...)
Texto LIKE con % (varios caracteres) y _ (uno), \|\| para concatenar
Nulos IS NULL, IS NOT NULL (nunca = NULL)

Unir tablas

SELECT a.nombre, g.nombre FROM alumnos a JOIN grupos g ON g.id = a.id_grupo;        -- INNER
SELECT a.nombre, g.nombre FROM alumnos a LEFT JOIN grupos g ON g.id = a.id_grupo;   -- todos los alumnos
SELECT a.nombre FROM alumnos a LEFT JOIN notas n ON n.id_alumno = a.id WHERE n.id_alumno IS NULL;  -- sin pareja
SELECT ciudad FROM alumnos WHERE id_grupo = 1 UNION SELECT ciudad FROM alumnos WHERE id_grupo = 3;
SELECT ciudad FROM alumnos WHERE id_grupo = 1 INTERSECT SELECT ciudad FROM alumnos WHERE id_grupo = 3;
SELECT id_alumno FROM notas EXCEPT SELECT id_alumno FROM notas WHERE nota < 5;

Agrupar y resumir

SELECT COUNT(*), COUNT(id_grupo), COUNT(DISTINCT ciudad) FROM alumnos;
SELECT ciudad, COUNT(*) AS n FROM alumnos GROUP BY ciudad HAVING COUNT(*) >= 3 ORDER BY n DESC;
SELECT id_asignatura, ROUND(AVG(nota), 2), MIN(nota), MAX(nota), SUM(nota) FROM notas GROUP BY id_asignatura;

Subconsultas, CASE y NULL

SELECT nota FROM notas WHERE nota > (SELECT AVG(nota) FROM notas);
SELECT nombre FROM alumnos WHERE id IN (SELECT id_alumno FROM notas WHERE nota < 5);
SELECT nombre FROM alumnos a WHERE NOT EXISTS (SELECT 1 FROM notas n WHERE n.id_alumno = a.id);
SELECT nota, CASE WHEN nota >= 5 THEN 'Aprobado' ELSE 'Suspenso' END FROM notas;
SELECT COALESCE(id_profesor, 0) FROM asignaturas;

Crear, modificar y borrar datos

INSERT INTO grupos (nombre, curso) VALUES ('1DAM-C', 1);
INSERT INTO grupos (nombre, curso) VALUES ('2DAM-B', 2), ('2DAM-C', 2);
UPDATE alumnos SET ciudad = 'Cádiz' WHERE id = 2;
DELETE FROM notas WHERE convocatoria = 2 AND nota < 5;

Sin WHERE, UPDATE y DELETE afectan a TODAS las filas

Estructura

CREATE TABLE clubes (
  id     INTEGER PRIMARY KEY AUTOINCREMENT,
  nombre TEXT NOT NULL UNIQUE,
  cuota  REAL NOT NULL DEFAULT 0 CHECK (cuota >= 0),
  id_profesor INTEGER REFERENCES profesores(id) ON DELETE SET NULL
);
ALTER TABLE clubes ADD COLUMN sala TEXT;
ALTER TABLE clubes RENAME COLUMN sala TO aula;
CREATE INDEX idx_clubes_nombre ON clubes (nombre);
CREATE VIEW clubes_gratis AS SELECT nombre FROM clubes WHERE cuota = 0;
DROP VIEW clubes_gratis;
DROP INDEX idx_clubes_nombre;
DROP TABLE clubes;
Restricción Qué impone
PRIMARY KEY Identifica la fila (única y no nula)
NOT NULL No puede quedar vacía
UNIQUE No se repite
DEFAULT x Valor por defecto
CHECK (cond) Debe cumplir la condición
REFERENCES t(c) Clave foránea
ON DELETE CASCADE / SET NULL / RESTRICT Qué pasa con los hijos al borrar el padre

Transacciones

BEGIN;
UPDATE notas SET nota = nota + 1 WHERE id_alumno = 1 AND nota < 9;
ROLLBACK;     -- o COMMIT; para confirmar

Consultas avanzadas

WITH medias AS (SELECT id_alumno, AVG(nota) AS media FROM notas GROUP BY id_alumno)
SELECT * FROM medias WHERE media > 6;

SELECT id_alumno, nota,
       RANK()       OVER (ORDER BY nota DESC)                   AS posicion,
       ROW_NUMBER() OVER (PARTITION BY id_asignatura ORDER BY nota DESC) AS pos_en_asignatura,
       AVG(nota)    OVER (PARTITION BY id_asignatura)           AS media_asignatura
FROM notas;

Funciones útiles (SQLite)

Tipo Funciones
Texto UPPER, LOWER, LENGTH, SUBSTR(t, inicio, n), TRIM, REPLACE
Números ROUND(x, d), ABS, MIN/MAX (con varios valores)
Fechas date('now'), strftime('%Y', f), date(f, '+7 days')
Nulos COALESCE, IFNULL, NULLIF
Conversión CAST(x AS INTEGER)