SQL básico

SQL (Structured Query Language) es el lenguaje para hablar con las bases de datos relacionales.

DDL (CREATE TABLE) define la estructura; DML (INSERT, SELECT, UPDATE, DELETE) trabaja con los datos.

SELECT … FROM … WHERE … ORDER BY … LIMIT para preguntar.

COUNT y GROUP BY para resumir; JOIN … ON para juntar tablas por sus claves.

UPDATE y DELETE, siempre con WHERE.

  • SQL (Structured Query Language) es el lenguaje para hablar con las bases de datos relacionales. Se lee casi como una frase en inglés: "selecciona el título de los carteles donde la técnica sea serigrafía". Con unas pocas instrucciones puedes crear tablas, llenarlas y, sobre todo, preguntarles cosas.
  • Se divide en dos partes:
  • Definición de datos (DDL): crear y cambiar la estructura: CREATE TABLE, ALTER TABLE, DROP TABLE. Manipulación de datos (DML): trabajar con los registros: INSERT, SELECT, UPDATE, DELETE.
  • Para practicar necesitas un SGBD. Dos opciones sin instalar servidores:
  • DB Browser for SQLite: programa gratuito para Windows, macOS y Linux. Nueva base de datos → pestaña Ejecutar SQL. SQLite Online: en el navegador, sin instalar nada.

Introducción

SQL (Structured Query Language) es el lenguaje para hablar con las bases de datos relacionales. Se lee casi como una frase en inglés: "selecciona el título de los carteles donde la técnica sea serigrafía". Con unas pocas instrucciones puedes crear tablas, llenarlas y, sobre todo, preguntarles cosas.

Se divide en dos partes:

Definición de datos (DDL): crear y cambiar la estructura: CREATE TABLE, ALTER TABLE, DROP TABLE. Manipulación de datos (DML): trabajar con los registros: INSERT, SELECT, UPDATE, DELETE.

Prepara tu laboratorio

Para practicar necesitas un SGBD. Dos opciones sin instalar servidores:

DB Browser for SQLite: programa gratuito para Windows, macOS y Linux. Nueva base de datos → pestaña Ejecutar SQL. SQLite Online: en el navegador, sin instalar nada.

Copia este script, pégalo y ejecútalo entero: crea el archivo de carteles de la lección Diseño conceptual: entidad-relación con datos inventados.

CREATE TABLE: la estructura

CREATE TABLE carteles ( id INTEGER PRIMARY KEY, titulo TEXT NOT NULL, anio INTEGER NOT NULL, tecnica TEXT, autor_id INTEGER NOT NULL REFERENCES autores(id) );

Cada campo tiene un tipo: INTEGER (entero), REAL (decimal), TEXT, fechas (en SQLite se guardan como texto AAAA-MM-DD). PRIMARY KEY: la clave primaria. NOT NULL: obligatorio. REFERENCES autores(id): clave foránea hacia la tabla autores.

INSERT: añadir registros

INSERT INTO autores (id, nombre, promocion, web) VALUES (5, 'Marta Gil', 2026, 'martagil.es');

Los textos van entre comillas simples; los números, sin comillas. Un dato desconocido se deja como NULL.

SELECT: preguntar

SELECT titulo, anio FROM carteles; -- dos columnas de todos los carteles SELECT * FROM carteles; -- todas las columnas

WHERE: filtrar

SELECT titulo FROM carteles WHERE tecnica = 'Serigrafía'; SELECT titulo FROM carteles WHERE anio >= 2025 AND tecnica = 'Digital'; SELECT titulo FROM carteles WHERE titulo LIKE '%Festival%'; -- contiene «Festival» SELECT nombre FROM autores WHERE web IS NULL; -- sin web

Operadores: =, <> (distinto), <, >, <=, >=, AND, OR, NOT, LIKE (con % como comodín), IN ('Digital', 'Risografía'), IS NULL.

JOIN: juntar tablas

Los datos están repartidos en tablas (lección Diseño conceptual: entidad-relación). JOIN los vuelve a unir usando las claves:

SELECT carteles.titulo, autores.nombre FROM carteles JOIN autores ON carteles.autor_id = autores.id WHERE carteles.tecnica = 'Serigrafía';

titulonombre Festival SurAna Ruiz Jazz en la AlamedaCarmen Vega Feria del LibroAna Ruiz

La condición ON dice qué columna de una tabla coincide con cuál de la otra: la clave foránea con la clave primaria. Con alias se escribe más corto:

UPDATE y DELETE: cambiar y borrar

UPDATE autores SET web = 'carmenvega.es' WHERE id = 3; DELETE FROM expone WHERE cartel_id = 7 AND exposicion_id = 2;

⚠️ Atención. Siempre con WHERE. UPDATE autores SET web = 'x' sin WHERE cambia todos los registros, y DELETE FROM carteles los borra todos. Antes de un UPDATE o un DELETE, haz un SELECT con el mismo WHERE para ver qué registros vas a tocar.

Practica

Con el archivo de carteles, escribe consultas para:

Los títulos de los carteles de 2024, ordenados alfabéticamente. Cuántos carteles hay de cada año. Los carteles digitales con el nombre de su autora o autor. Las exposiciones en las que está «Festival Sur». Añade un cartel tuyo e inclúyelo en la exposición «Diseño en la calle». Corrige la técnica de «Cine de Verano» a «Risografía a dos tintas».

Errores frecuentes

Comillas dobles para los textos: en SQL estándar son simples ('Digital'). Algunos gestores aceptan las dobles, pero otros las interpretan como nombres de columna. Olvidar la condición ON en un JOIN: salen todas las combinaciones posibles. UPDATE o DELETE sin WHERE. Comparar con NULL usando =: se escribe IS NULL. Mayúsculas y acentos: 'serigrafía' no es 'Serigrafía' en una comparación exacta.

Bases de datos
29

SQL básico

SQL (Structured Query Language) es el lenguaje para hablar con las bases de datos relacionales.

Código del tema: SELECT … JOIN

📘 Teoría

Introducción

SQL (Structured Query Language) es el lenguaje para hablar con las bases de datos relacionales. Se lee casi como una frase en inglés: "selecciona el título de los carteles donde la técnica sea serigrafía". Con unas pocas instrucciones puedes crear tablas, llenarlas y, sobre todo, preguntarles cosas.

Se divide en dos partes:

  • Definición de datos (DDL): crear y cambiar la estructura: CREATE TABLE, ALTER TABLE, DROP TABLE.
  • Manipulación de datos (DML): trabajar con los registros: INSERT, SELECT, UPDATE, DELETE.

Prepara tu laboratorio

Para practicar necesitas un SGBD. Dos opciones sin instalar servidores:

Copia este script, pégalo y ejecútalo entero: crea el archivo de carteles de la lección Diseño conceptual: entidad-relación con datos inventados.

CREATE TABLE: la estructura

CREATE TABLE carteles (
  id       INTEGER PRIMARY KEY,
  titulo   TEXT NOT NULL,
  anio     INTEGER NOT NULL,
  tecnica  TEXT,
  autor_id INTEGER NOT NULL REFERENCES autores(id)
);
  • Cada campo tiene un tipo: INTEGER (entero), REAL (decimal), TEXT, fechas (en SQLite se guardan como texto AAAA-MM-DD).
  • PRIMARY KEY: la clave primaria. NOT NULL: obligatorio.
  • REFERENCES autores(id): clave foránea hacia la tabla autores.

INSERT: añadir registros

1

INSERT INTO autores (id, nombre, promocion, web)
VALUES (5, 'Marta Gil', 2026, 'martagil.es');

2

Los textos van entre comillas simples; los números, sin comillas. Un dato desconocido se deja como NULL.

SELECT: preguntar

SELECT titulo, anio FROM carteles;      -- dos columnas de todos los carteles
SELECT * FROM carteles;                 -- todas las columnas

WHERE: filtrar

SELECT titulo FROM carteles WHERE tecnica = 'Serigrafía';
SELECT titulo FROM carteles WHERE anio >= 2025 AND tecnica = 'Digital';
SELECT titulo FROM carteles WHERE titulo LIKE '%Festival%';   -- contiene «Festival»
SELECT nombre FROM autores WHERE web IS NULL;                   -- sin web

Operadores: =, <> (distinto), <, >, <=, >=, AND, OR, NOT, LIKE (con % como comodín), IN ('Digital', 'Risografía'), IS NULL.

ORDER BY y LIMIT: ordenar y limitar

SELECT titulo, anio FROM carteles
WHERE anio >= 2025
ORDER BY anio DESC, titulo;
tituloanio
Café Lento2026
Feria del Libro2026
Semana del Diseño2026
Festival Sur2025
Noche de Museos2025

DESC ordena de mayor a menor (ASC, por defecto, de menor a mayor). LIMIT 3 se queda con los tres primeros.

Contar y agrupar

SELECT COUNT(*) FROM carteles;                          -- 8
SELECT tecnica, COUNT(*) AS total
FROM carteles
GROUP BY tecnica;
tecnicatotal
Digital3
Risografía1
Serigrafía3
Tipografía móvil1

Otras funciones: MIN, MAX, AVG (media), SUM.

JOIN: juntar tablas

Los datos están repartidos en tablas (lección Diseño conceptual: entidad-relación). JOIN los vuelve a unir usando las claves:

SELECT carteles.titulo, autores.nombre
FROM carteles
JOIN autores ON carteles.autor_id = autores.id
WHERE carteles.tecnica = 'Serigrafía';
titulonombre
Festival SurAna Ruiz
Jazz en la AlamedaCarmen Vega
Feria del LibroAna Ruiz

La condición ON dice qué columna de una tabla coincide con cuál de la otra: la clave foránea con la clave primaria. Con alias se escribe más corto:

SELECT a.nombre, COUNT(*) AS carteles
FROM carteles c
JOIN autores a ON c.autor_id = a.id
GROUP BY a.nombre
ORDER BY carteles DESC;

Para una relación N:M se pasa por la tabla intermedia:

SELECT c.titulo
FROM carteles c
JOIN expone e ON e.cartel_id = c.id
JOIN exposiciones x ON x.id = e.exposicion_id
WHERE x.nombre = 'Impresos';

UPDATE y DELETE: cambiar y borrar

UPDATE autores SET web = 'carmenvega.es' WHERE id = 3;
DELETE FROM expone WHERE cartel_id = 7 AND exposicion_id = 2;

⚠️ Atención. Siempre con WHERE. UPDATE autores SET web = 'x' sin WHERE cambia todos los registros, y DELETE FROM carteles los borra todos. Antes de un UPDATE o un DELETE, haz un SELECT con el mismo WHERE para ver qué registros vas a tocar.

Practica

Con el archivo de carteles, escribe consultas para:

  1. Los títulos de los carteles de 2024, ordenados alfabéticamente.
  2. Cuántos carteles hay de cada año.
  3. Los carteles digitales con el nombre de su autora o autor.
  4. Las exposiciones en las que está «Festival Sur».
  5. Añade un cartel tuyo e inclúyelo en la exposición «Diseño en la calle».
  6. Corrige la técnica de «Cine de Verano» a «Risografía a dos tintas».

Errores frecuentes

  • Comillas dobles para los textos: en SQL estándar son simples ('Digital'). Algunos gestores aceptan las dobles, pero otros las interpretan como nombres de columna.
  • Olvidar la condición ON en un JOIN: salen todas las combinaciones posibles.
  • UPDATE o DELETE sin WHERE.
  • Comparar con NULL usando =: se escribe IS NULL.
  • Mayúsculas y acentos: 'serigrafía' no es 'Serigrafía' en una comparación exacta.

¿Qué es esto?

Soy Cristian Eslava y a veces hago webs para procrastinar yo y vosotros. culTest

La hice en febrero de 2026 para facilitar el aprendizaje de mis alumnos. La idea es aprender desarrollo web practicando y que el proyecto siga creciendo con nuevos temas, tests y retos.

Está inspirada en MDN, W3Schools, CodePen, Manz y muchos otros sitios de documentación sobre desarrollo web. Quería combinar teoría útil, ejemplos ejecutables, retos y el sistema de tests que ya tenía en culTest. culTest

Si te gustó, si no te gustó o si quieres escribirme, puedes hacerlo en cristianeslava@gmail.com