¿Qué es SQL?
SQL (Structured Query Language) es el lenguaje estándar para manejar Bases de Datos Relacionales. Te permite crear bases de datos, organizar estructuras en tablas y consultar datos con precisión.
Tabla: Colección de datos organizada en columnas (atributos) y filas (registros).
Primary Key (PK): Identificador único para cada fila en una tabla.
Foreign Key (FK): Referencia a la PK de otra tabla para armar una relación.
Crear y Modificar Tablas (DDL)
Data Definition Language nos permite definir la estructura de la base de datos.
-- Crear tabla de Estudiantes
CREATE TABLE Estudiantes (
id_estudiante INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(50) NOT NULL,
apellido VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
fecha_nacimiento DATE
);
-- Crear tabla de Cursos con Foreign Key
CREATE TABLE Inscripciones (
id_inscripcion INT PRIMARY KEY AUTO_INCREMENT,
id_estudiante INT,
curso VARCHAR(100),
FOREIGN KEY (id_estudiante) REFERENCES Estudiantes(id_estudiante)
);
-- Modificar una tabla (agregar columna)
ALTER TABLE Estudiantes ADD COLUMN telefono VARCHAR(20);
-- Eliminar una tabla
DROP TABLE Estudiantes; -- CUIDADO: Borra estructura y datos
Insertar, Actualizar y Borrar Datos (DML)
-- Insertar un registro nuevo
INSERT INTO Estudiantes (nombre, apellido, email)
VALUES ('Ana', 'García', 'ana@email.com');
-- Insertar múltiples registros
INSERT INTO Estudiantes (nombre, apellido, email) VALUES
('Luis', 'Martínez', 'luis@email.com'),
('Marta', 'Sosa', 'marta@email.com');
-- Actualizar registros (¡Siempre usa WHERE!)
UPDATE Estudiantes
SET email = 'ana_nueva@email.com'
WHERE id_estudiante = 1;
-- Borrar un registro (¡Siempre usa WHERE!)
DELETE FROM Estudiantes
WHERE id_estudiante = 2;
Consultas y Filtros (SELECT)
El comando más usado en SQL. Permite buscar y traer la información exacta que necesitas.
-- Traer TODAS las columnas de la tabla
SELECT * FROM Estudiantes;
-- Traer columnas específicas
SELECT nombre, apellido, email FROM Estudiantes;
-- Filtrar por condición exacta (WHERE)
SELECT * FROM Estudiantes WHERE nombre = 'Ana';
-- Operadores lógicos (AND, OR)
SELECT * FROM Estudiantes
WHERE (nombre = 'Ana' OR nombre = 'Luis') AND email IS NOT NULL;
-- Buscar patrones de texto (LIKE)
-- Ej: Todos los apellidos que terminan con "ez"
SELECT * FROM Estudiantes WHERE apellido LIKE '%ez';
-- Ordenar resultados (ORDER BY)
SELECT * FROM Estudiantes ORDER BY apellido ASC, nombre ASC;
-- Limitar cantidad de resultados (LIMIT)
SELECT * FROM Estudiantes ORDER BY id_estudiante DESC LIMIT 5;
Relacionar tablas (JOINs)
Los JOINs nos permiten combinar columnas de diferentes tablas basándose en una relación común.
-- INNER JOIN: Trae registros que tengan coincidencia en AMBAS tablas
SELECT Estudiantes.nombre, Estudiantes.apellido, Inscripciones.curso
FROM Estudiantes
INNER JOIN Inscripciones
ON Estudiantes.id_estudiante = Inscripciones.id_estudiante;
-- LEFT JOIN: Trae TODOS los estudiantes, y sus cursos si tienen.
-- Si un estudiante no tiene curso, en "curso" dirá NULL.
SELECT e.nombre, i.curso
FROM Estudiantes e
LEFT JOIN Inscripciones i
ON e.id_estudiante = i.id_estudiante;
Agregación (GROUP BY)
Permite agrupar registros y aplicar funciones matemáticas (COUNT, SUM, AVG, MAX, MIN).
-- Contar cuántos inscritos hay por cada curso
SELECT curso, COUNT(*) AS cantidad_estudiantes
FROM Inscripciones
GROUP BY curso;
-- Promedio de precio de cursos por categoría (ejemplo genérico tabla Cursos)
SELECT categoria, AVG(precio) AS precio_promedio
FROM Cursos
GROUP BY categoria;
-- GROUP BY con filtrado posterior (HAVING en vez de WHERE)
-- Solo muestra los cursos con más de 10 inscriptos
SELECT curso, COUNT(*) AS cantidad
FROM Inscripciones
GROUP BY curso
HAVING COUNT(*) > 10;
Ejercicios Resueltos
Diseña tablas para un sistema de turnos (Pacientes, Médicos, Turnos) y haz una consulta que traiga el nombre paciente, médico y fecha del turno.
- 1Creamos Pacientes y Médicos, cada uno con su PK.
- 2Creamos Turnos con dos FK apuntando a los ID de las tablas anteriores.
- 3Hacemos un doble INNER JOIN en el SELECT para recuperar los nombres reales en lugar de los IDs.
-- Creación de tablas
CREATE TABLE Pacientes (
id_paciente INT PRIMARY KEY,
nombre VARCHAR(100)
);
CREATE TABLE Medicos (
id_medico INT PRIMARY KEY,
nombre_doctor VARCHAR(100),
especialidad VARCHAR(100)
);
CREATE TABLE Turnos (
id_turno INT PRIMARY KEY,
id_paciente INT,
id_medico INT,
fecha DATETIME,
FOREIGN KEY (id_paciente) REFERENCES Pacientes(id_paciente),
FOREIGN KEY (id_medico) REFERENCES Medicos(id_medico)
);
-- Consulta Completa (traer turno, paciente y doctor)
SELECT t.fecha, p.nombre, m.nombre_doctor, m.especialidad
FROM Turnos t
INNER JOIN Pacientes p ON t.id_paciente = p.id_paciente
INNER JOIN Medicos m ON t.id_medico = m.id_medico
ORDER BY t.fecha ASC;
Ejercicios Propuestos
Diseñá la BD para una tienda online con Clientes, Productos y Ventas.
- El cliente tiene nombre, email, y dirección de envío.
- El producto tiene nombre, precio, y stock.
- La tabla Ventas debe relacionar un Cliente con un Producto y tener un campo fecha.
- Calculá: cuánto gastó cada cliente en total en la tienda (Hint: SUM y GROUP BY).
Tenés una tabla Articulos (id, titulo, visitas, autor_id) y Autores (id, nombre).
- Obtené el título del artículo con más visitas (Hint: ORDER BY y LIMIT 1).
- Obtené la suma total de visitas por autor, mostrando el nombre del autor aunque no haya publicado (Hint: LEFT JOIN).