💾 Lenguaje SQL

Structured Query Language - Taller Interactivo PILARES

¿Qué es SQL?

📖 Definición

SQL (Structured Query Language) es el lenguaje estándar para comunicarnos con bases de datos relacionales. Permite crear, leer, actualizar y eliminar información de forma estructurada.

💡 Dato Histórico: SQL fue creado por IBM en la década de 1970 con el nombre SEQUEL. En 1986 se convirtió en estándar ANSI y en 1987 en estándar ISO.

🎯 ¿Para qué sirve SQL?

Consultar Datos

Buscar y filtrar información específica de millones de registros

Modificar Datos

Actualizar, insertar o eliminar información en las tablas

Crear Estructuras

Diseñar bases de datos, tablas, índices y relaciones

Controlar Acceso

Gestionar permisos y seguridad de la información

🌐 Aplicaciones del SQL

🎓 ¿Por qué aprender SQL?

  1. Universal: Funciona en MySQL, PostgreSQL, SQL Server, Oracle
  2. Demandado: Una de las habilidades más solicitadas en tecnología
  3. Fácil de aprender: Sintaxis similar al inglés
  4. Poderoso: Maneja desde pequeñas hasta enormes bases de datos
  5. Bien pagado: Los profesionales SQL tienen excelentes salarios

🔑 Características Principales

  • Declarativo: Le dices QUÉ quieres, no CÓMO obtenerlo
  • Estándar: Compatible entre diferentes sistemas de bases de datos
  • Potente: Maneja operaciones complejas con pocas líneas
  • Interactivo: Resultados inmediatos de tus consultas

Grupos de Comandos SQL

📌 Importante: SQL se divide en tres grandes grupos según su función

1️⃣ DDL - Data Definition Language

Lenguaje de Definición de Datos

Comandos para crear y modificar la estructura de la base de datos

CREATE

Crear nuevas tablas, bases de datos, índices

CREATE TABLE empleados (...);

ALTER

Modificar estructura de tablas existentes

ALTER TABLE empleados ADD salario;

DROP

Eliminar tablas o bases de datos completas

DROP TABLE empleados;

TRUNCATE

Vaciar tabla (eliminar todos los registros)

TRUNCATE TABLE empleados;

2️⃣ DML - Data Manipulation Language

Lenguaje de Manipulación de Datos

Comandos para trabajar con los datos dentro de las tablas

SELECT

Consultar y recuperar datos

SELECT * FROM empleados;

INSERT

Insertar nuevos registros

INSERT INTO empleados VALUES (...);

UPDATE

Actualizar registros existentes

UPDATE empleados SET salario = 5000;

DELETE

Eliminar registros específicos

DELETE FROM empleados WHERE id = 10;

3️⃣ DCL - Data Control Language

Lenguaje de Control de Datos

Comandos para gestionar permisos y seguridad

GRANT

Otorgar permisos a usuarios

GRANT SELECT ON empleados TO usuario;

REVOKE

Revocar permisos a usuarios

REVOKE SELECT ON empleados FROM usuario;

📐 Cláusulas y Operadores Importantes

Cláusulas Principales

Cláusula Descripción Ejemplo
FROM Especifica de qué tabla obtener datos FROM empleados
WHERE Filtra registros con condiciones WHERE edad > 25
GROUP BY Agrupa registros por criterio GROUP BY departamento
HAVING Filtra grupos (después de GROUP BY) HAVING COUNT(*) > 5
ORDER BY Ordena los resultados ORDER BY nombre ASC

Operadores Lógicos

Operador Descripción Ejemplo
AND Ambas condiciones deben ser verdaderas edad > 18 AND ciudad = 'CDMX'
OR Al menos una condición debe ser verdadera edad < 18 OR edad > 65
NOT Niega una condición NOT ciudad = 'CDMX'

Operadores de Comparación

Operador Significado Ejemplo
= Igual que edad = 25
<> o != Diferente de ciudad <> 'CDMX'
> Mayor que salario > 10000
< Menor que edad < 30
>= Mayor o igual que precio >= 100
<= Menor o igual que stock <= 10
BETWEEN Entre un rango de valores edad BETWEEN 18 AND 65
LIKE Busca un patrón nombre LIKE 'A%'
IN Está en una lista de valores ciudad IN ('CDMX', 'GDL')

DDL - Lenguaje de Definición de Datos

🏗️ Objetivo: Crear y modificar la estructura de bases de datos y tablas

📊 Tipos de Datos en SQL

Numéricos

  • INT / INTEGER: Números enteros (-2,147,483,648 a 2,147,483,647)
  • SMALLINT: Enteros pequeños (-32,768 a 32,767)
  • DECIMAL(p,d) / NUMERIC(p,d): Decimales precisos. Ej: DECIMAL(10,2) → 12345678.90
  • FLOAT / DOUBLE: Decimales de punto flotante

Texto

  • CHAR(n): Cadena de longitud fija. Ej: CHAR(10) siempre ocupa 10 caracteres
  • VARCHAR(n): Cadena de longitud variable. Ej: VARCHAR(100) ocupa solo lo necesario
  • TEXT: Textos largos (hasta 65,535 caracteres)

Fecha y Hora

  • DATE: Solo fecha (YYYY-MM-DD)
  • TIME: Solo hora (HH:MM:SS)
  • DATETIME: Fecha y hora completa
  • TIMESTAMP: Marca de tiempo automática

CREATE TABLE - Crear Tablas

Sintaxis Básica

CREATE TABLE nombre_tabla ( columna1 tipo_dato restricciones, columna2 tipo_dato restricciones, ... );

Ejemplo 1: 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, matricula VARCHAR(20) UNIQUE NOT NULL, promedio DECIMAL(4,2) );

Ejemplo 2: Tabla de Productos

CREATE TABLE productos ( codigo_producto VARCHAR(20) PRIMARY KEY, nombre VARCHAR(100) NOT NULL, descripcion TEXT, precio DECIMAL(10,2) NOT NULL, stock INT DEFAULT 0, fecha_registro TIMESTAMP DEFAULT CURRENT_TIMESTAMP );

🔑 Restricciones (Constraints)

Restricción Descripción
PRIMARY KEY Identificador único de la tabla (no nulo, único)
FOREIGN KEY Relaciona con llave primaria de otra tabla
NOT NULL El campo no puede estar vacío
UNIQUE No puede haber valores duplicados
DEFAULT Valor por defecto si no se especifica
CHECK Valida que se cumpla una condición
AUTO_INCREMENT Incrementa automáticamente el valor

ALTER TABLE - Modificar Tablas

Agregar columna

ALTER TABLE estudiantes ADD telefono VARCHAR(15);

Modificar columna

ALTER TABLE estudiantes MODIFY email VARCHAR(150) NOT NULL;

Eliminar columna

ALTER TABLE estudiantes DROP COLUMN telefono;

DROP TABLE - Eliminar Tabla

DROP TABLE estudiantes; -- Eliminar solo si existe (evita errores) DROP TABLE IF EXISTS estudiantes;
⚠️ PRECAUCIÓN: DROP TABLE elimina la tabla y TODOS sus datos de forma permanente. ¡No se puede deshacer!

DML - Lenguaje de Manipulación de Datos

📝 Objetivo: Insertar, consultar, actualizar y eliminar datos

INSERT - Insertar Datos

Insertar un registro completo

INSERT INTO estudiantes (nombre, apellido, email, matricula) VALUES ('Juan', 'Pérez', 'juan@email.com', '2024001');

Insertar múltiples registros

INSERT INTO estudiantes (nombre, apellido, email, matricula) VALUES ('María', 'García', 'maria@email.com', '2024002'), ('Pedro', 'López', 'pedro@email.com', '2024003'), ('Ana', 'Martínez', 'ana@email.com', '2024004');

SELECT - Consultar Datos

Seleccionar todos los registros

SELECT * FROM estudiantes;

Seleccionar columnas específicas

SELECT nombre, apellido, email FROM estudiantes;

Filtrar con WHERE

SELECT * FROM estudiantes WHERE promedio >= 8.0;

Ordenar resultados

SELECT * FROM estudiantes ORDER BY promedio DESC;

Limitar resultados

SELECT * FROM estudiantes ORDER BY promedio DESC LIMIT 10;

UPDATE - Actualizar Datos

Actualizar un campo

UPDATE estudiantes SET promedio = 9.5 WHERE matricula = '2024001';

Actualizar múltiples campos

UPDATE estudiantes SET email = 'nuevo_email@email.com', promedio = 8.7 WHERE id_estudiante = 1;
⚠️ IMPORTANTE: Siempre usa WHERE en UPDATE, o actualizarás TODOS los registros de la tabla.

DELETE - Eliminar Datos

Eliminar un registro específico

DELETE FROM estudiantes WHERE id_estudiante = 10;

Eliminar con condición

DELETE FROM estudiantes WHERE fecha_nacimiento < '2000-01-01';
⚠️ PELIGRO: DELETE sin WHERE elimina TODOS los registros. Usa siempre una condición.

🔍 Patrones con LIKE

Patrón Significado Ejemplo
% Cualquier cantidad de caracteres nombre LIKE 'A%' → Nombres que empiezan con A
_ Un solo carácter nombre LIKE 'J__n' → Juan, John
%texto% Contiene el texto email LIKE '%@gmail.com'

Funciones en SQL

⚙️ Las funciones: Permiten realizar cálculos y operaciones sobre los datos

📊 Funciones de Agregación

Operan sobre conjuntos de filas y devuelven un único valor

COUNT()

Cuenta registros

SELECT COUNT(*) FROM estudiantes;
SUM()

Suma valores

SELECT SUM(precio) FROM productos;
AVG()

Promedio

SELECT AVG(promedio) FROM estudiantes;
MAX()

Valor máximo

SELECT MAX(salario) FROM empleados;
MIN()

Valor mínimo

SELECT MIN(edad) FROM clientes;

Ejemplo Práctico: Estadísticas de Estudiantes

SELECT COUNT(*) AS total_estudiantes, AVG(promedio) AS promedio_general, MAX(promedio) AS mejor_promedio, MIN(promedio) AS menor_promedio FROM estudiantes;

🔤 Funciones de Texto

Función Descripción Ejemplo
UPPER() Convierte a mayúsculas UPPER('hola') → 'HOLA'
LOWER() Convierte a minúsculas LOWER('HOLA') → 'hola'
LENGTH() Longitud de la cadena LENGTH('Hola') → 4
CONCAT() Concatena cadenas CONCAT('Hola', ' ', 'Mundo')
SUBSTRING() Extrae parte de una cadena SUBSTRING('Hola', 1, 2) → 'Ho'
TRIM() Elimina espacios TRIM(' Hola ') → 'Hola'

Ejemplo: Formatear Nombres

SELECT CONCAT(UPPER(nombre), ' ', UPPER(apellido)) AS nombre_completo, LENGTH(email) AS largo_email FROM estudiantes;

📅 Funciones de Fecha

Función Descripción Ejemplo
NOW() Fecha y hora actual NOW() → '2024-11-28 14:30:00'
CURDATE() Fecha actual CURDATE() → '2024-11-28'
YEAR() Extrae el año YEAR('2024-11-28') → 2024
MONTH() Extrae el mes MONTH('2024-11-28') → 11
DAY() Extrae el día DAY('2024-11-28') → 28
DATEDIFF() Diferencia entre fechas DATEDIFF('2024-12-31', '2024-01-01')

Ejemplo: Calcular Edad

SELECT nombre, fecha_nacimiento, YEAR(CURDATE()) - YEAR(fecha_nacimiento) AS edad FROM estudiantes;

GROUP BY - Agrupar Datos

GROUP BY agrupa registros que tienen valores iguales en columnas especificadas

Ejemplo: Contar estudiantes por ciudad

SELECT ciudad, COUNT(*) AS total_estudiantes, AVG(promedio) AS promedio_ciudad FROM estudiantes GROUP BY ciudad ORDER BY total_estudiantes DESC;

HAVING - Filtrar grupos

SELECT ciudad, COUNT(*) AS total FROM estudiantes GROUP BY ciudad HAVING total > 10;

💡 Diferencia: WHERE vs HAVING

  • WHERE: Filtra filas ANTES de agrupar
  • HAVING: Filtra grupos DESPUÉS de agrupar

Consultas Avanzadas

🔗 JOINS - Unir Tablas

📌 Concepto: Los JOINS permiten combinar datos de múltiples tablas relacionadas

INNER JOIN

Devuelve solo los registros que tienen coincidencias en ambas tablas

SELECT estudiantes.nombre, estudiantes.apellido, cursos.nombre_curso FROM estudiantes INNER JOIN inscripciones ON estudiantes.id = inscripciones.id_estudiante INNER JOIN cursos ON inscripciones.id_curso = cursos.id;

LEFT JOIN

Devuelve todos los registros de la tabla izquierda y los coincidentes de la derecha

SELECT estudiantes.nombre, cursos.nombre_curso FROM estudiantes LEFT JOIN inscripciones ON estudiantes.id = inscripciones.id_estudiante LEFT JOIN cursos ON inscripciones.id_curso = cursos.id;

Incluye estudiantes aunque no tengan inscripciones

RIGHT JOIN

Devuelve todos los registros de la tabla derecha y los coincidentes de la izquierda

📊 Subconsultas

Subconsulta en WHERE

SELECT nombre, promedio FROM estudiantes WHERE promedio > ( SELECT AVG(promedio) FROM estudiantes );

Estudiantes con promedio mayor al promedio general

Subconsulta con IN

SELECT nombre FROM estudiantes WHERE id IN ( SELECT id_estudiante FROM inscripciones WHERE id_curso = 101 );

Estudiantes inscritos en el curso 101

🎨 Consultas Complejas Completas

Ejemplo Real: Reporte de Ventas

SELECT c.nombre AS cliente, COUNT(p.id) AS total_pedidos, SUM(p.total) AS total_gastado, AVG(p.total) AS promedio_pedido, MAX(p.fecha) AS ultimo_pedido FROM clientes c INNER JOIN pedidos p ON c.id = p.id_cliente WHERE p.fecha >= '2024-01-01' GROUP BY c.id, c.nombre HAVING total_pedidos > 5 ORDER BY total_gastado DESC LIMIT 10;

📝 Orden de Ejecución en SQL

  1. FROM - Selecciona las tablas
  2. JOIN - Une las tablas
  3. WHERE - Filtra registros
  4. GROUP BY - Agrupa registros
  5. HAVING - Filtra grupos
  6. SELECT - Selecciona columnas
  7. ORDER BY - Ordena resultados
  8. LIMIT - Limita cantidad

Ejercicios Prácticos

🖥️ Simulador de Consultas SQL

Escribe consultas SQL y verifica si son correctas

Base de datos: TIENDA

Tabla: productos

id nombre precio stock categoria
1Laptop HP1500010Electrónica
2Mouse Logitech25050Accesorios
3Teclado Mecánico120030Accesorios
4Monitor Samsung350015Electrónica
5Webcam Logitech80025Accesorios

📝 Ejercicio 1: Consulta Básica

Tarea: Escribe una consulta que muestre el nombre y precio de todos los productos

📝 Ejercicio 2: Filtrado

Tarea: Selecciona productos con precio mayor a 1000

📝 Ejercicio 3: Funciones de Agregación

Tarea: Calcula el precio promedio de todos los productos

📝 Ejercicio 4: GROUP BY

Tarea: Cuenta cuántos productos hay por categoría

💪 Desafío Final

Escenario: Eres el administrador de base de datos de una universidad

Tarea: Crea las consultas SQL para:

  1. Crear una tabla "profesores" con: id, nombre, apellido, especialidad, salario
  2. Insertar 3 profesores
  3. Actualizar el salario de un profesor
  4. Consultar profesores con salario mayor a 20000
  5. Calcular el salario promedio

Quiz de Evaluación SQL

🎯 Objetivo: Evalúa tu conocimiento de SQL

1. ¿Qué comando se usa para crear una nueva tabla?

2. ¿Cuál es la diferencia entre DELETE y TRUNCATE?

3. ¿Qué función devuelve la fecha actual?

4. ¿Cuál es el orden correcto de ejecución?

5. ¿Qué hace la función COUNT(*)?

6. ¿Cuál es la diferencia entre WHERE y HAVING?

7. ¿Qué tipo de JOIN devuelve solo las coincidencias?

8. ¿Qué restricción asegura que no haya valores duplicados?