🏠 Inicio 🌍 Página Principal 🐍 Python Básico 🖥️ Tkinter 🌐 HTML 🎨 CSS ⚡ JavaScript 🗃️ SQL

¿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.

💡
Conceptos Clave

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.

SQL
-- 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)

SQL
-- 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.

SQL
-- 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.

SQL
-- 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).

SQL
-- 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

EJERCICIO 1 Sistema de Turnos Médicos

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.
SQL — Solución
-- 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

PROPUESTO 1 Sistema tienda online

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).
PROPUESTO 2 Estadísticas de Blog

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).