Índice: SQL desde Principiante hasta Experto Sección 1: Introducción a SQL 1. ¿Qué es SQL? 1.1 Historia y evolución de SQL 1.2 Bases de datos relacionales vs no relacionales 1.3 Sistemas de gestión de bases de datos (DBMS): MySQL, PostgreSQL, SQL Server y más 1.4 Instalación y configuración de un entorno SQL 2. Conceptos básicos de bases de datos 2.1 Tablas, filas y columnas 2.2 Tipos de datos en SQL 2.3 Claves primarias y foráneas 3. Primeros pasos con SQL 3.1 Creación de bases de datos 3.2 Creación de tablas 3.3 Insertar datos en tablas 3.4 Consultas básicas con SELECT Sección 2: Manipulación de Datos (DML - Data Manipulation Language) 4. Recuperar datos 4.1 Filtrar resultados con WHERE 4.2 Ordenar resultados con ORDER BY 4.3 Uso de funciones de agregación: SUM, AVG, COUNT, MAX, MIN 4.4 Agrupar datos con GROUP BY y HAVING 5. Modificar y eliminar datos 5.1 Actualizar registros con UPDATE 5.2 Eliminar registros con DELETE 5.3 Buenas prácticas al modificar datos Sección 3: Definición de Datos (DDL - Data Definition Language) 6. Gestión de esquemas y tablas 6.1 Creación y modificación de tablas (CREATE, ALTER, DROP) 6.2 Restricciones en tablas: NOT NULL, UNIQUE, CHECK, DEFAULT 6.3 Índices en SQL: creación y usos 7. Relaciones y claves 7.1 Claves foráneas y relaciones entre tablas 7.2 Integridad referencial y reglas de cascada Sección 4: Consultas Intermedias y Avanzadas 8. Joins y combinaciones de tablas 8.1 Tipos de JOIN: INNER, LEFT, RIGHT, FULL 8.2 Uso práctico de joins para análisis de datos 9. Subconsultas y consultas anidadas 9.1 Subconsultas correlacionadas 9.2 Subconsultas en WHERE, SELECT y FROM 10. Operaciones avanzadas en SQL 10.1 Unión de resultados con UNION y UNION ALL 10.2 Operaciones de conjuntos: INTERSECT, EXCEPT 11. Funciones avanzadas 11.1 Funciones de ventana (OVER, PARTITION BY) 11.2 Operaciones con fechas y tiempos 11.3 Funciones avanzadas de texto Sección 5: Optimización y Buenas Prácticas 12. Índices y rendimiento 12.1 Cómo funcionan los índices 12.2 Cuándo usar índices 12.3 Optimización de consultas con ejemplos 13. Transacciones y control de concurrencia 13.1 Conceptos de transacciones: COMMIT, ROLLBACK, SAVEPOINT 13.2 Aislamiento de transacciones y niveles (READ UNCOMMITTED, SERIALIZABLE) 14. Manejo de errores y debugging en SQL 14.1 Detectar y manejar errores comunes 14.2 Logs y herramientas de debugging Sección 6: Temas Avanzados y Casos Prácticos 15. Procedimientos almacenados, vistas y triggers 15.1 Creación de vistas 15.2 Introducción a procedimientos almacenados (CREATE PROCEDURE) 15.3 Triggers: conceptos y ejemplos 16. Seguridad en bases de datos 16.1 Gestión de usuarios y permisos 16.2 Encriptación de datos y mejores prácticas 17. SQL dinámico y programático 17.1 Uso de SQL con otros lenguajes (Python, R, etc.) 17.2 Introducción a ORMs (Object-Relational Mappers): SQLAlchemy, Django ORM Sección 7: Proyectos y Casos Prácticos 18. Análisis de datos con SQL 18.1 Tablas grandes: estrategias para manejar Big Data 18.2 Informes y visualizaciones básicas 19. Proyectos integradores 19.1 Gestión de inventarios 19.2 Análisis de ventas y clientes 19.3 Creación de un sistema de gestión para una librería Anexos A. Recursos adicionales para aprender SQL B. Comparación entre DBMS populares C. Respuestas a ejercicios prácticos D. Glosario de términos Capítulo 1: ¿Qué es SQL? 1.1 Historia y evolución de SQL SQL (Structured Query Language) es un lenguaje estándar para interactuar con bases de datos relacionales. Fue desarrollado en los años 70 por IBM y se convirtió en un estándar reconocido por ANSI en 1986. Algunos sistemas populares que implementan SQL son: MySQL (de código abierto, ideal para aplicaciones web). PostgreSQL (con características avanzadas y extensibilidad). Microsoft SQL Server (orientado a empresas). SQLite (embebido, ligero y portátil). Aplicación práctica: SQL permite realizar operaciones como: Crear bases de datos y tablas. Insertar, consultar, actualizar y eliminar datos. Gestionar la estructura de las bases de datos. 1.2 Bases de datos relacionales vs no relacionales Las bases de datos relacionales organizan la información en tablas relacionadas entre sí mediante claves. Por ejemplo: Una tabla de "Clientes". Una tabla de "Órdenes", relacionada con los clientes mediante una clave foránea. En contraste, las bases de datos no relacionales (como MongoDB) usan estructuras más flexibles, como documentos JSON. Ventajas de las bases de datos relacionales: Consistencia y normalización de datos. Facilidad para realizar consultas complejas con SQL. 1.3 Sistemas de gestión de bases de datos (DBMS) Un DBMS es un software que permite gestionar bases de datos. MySQL es uno de los más populares y es ideal para comenzar con SQL debido a su simplicidad y amplia documentación. Práctica: Configuración de MySQL 1. Instalar MySQL: Descarga desde https://www.mysql.com/. 2. Configurar un cliente: Usa MySQL Workbench o la línea de comandos (CLI) para interactuar con el servidor de MySQL. 1.4 Instalación y configuración de un entorno SQL Antes de trabajar con MySQL, configura el entorno: 1. Instalación básica o o Descarga e instala MySQL Community Server. Durante la instalación, configura una contraseña para el usuario root. 2. Acceso a MySQL o Desde MySQL Workbench o CLI, inicia sesión: bash Copiar código mysql -u root -p Ingresa tu contraseña cuando se solicite. Ejemplo práctico: Primera interacción con MySQL Crear una base de datos y una tabla simple A continuación, un ejercicio básico para entender la sintaxis y estructura de SQL. Paso 1: Crear una base de datos sql Copiar código -- Crear una nueva base de datos llamada "Libreria" CREATE DATABASE Libreria; -- Seleccionar la base de datos para usarla USE Libreria; Explicación: CREATE DATABASE: Crea una base de datos llamada "Libreria". USE: Indica que todas las operaciones siguientes se realizarán en esta base de datos. Paso 2: Crear una tabla sql Copiar código -- Crear una tabla para almacenar información de libros CREATE TABLE Libros ( ID INT AUTO_INCREMENT PRIMARY KEY, -- Identificador único para cada libro Titulo VARCHAR(255) NOT NULL, -- Título del libro, obligatorio Autor VARCHAR(255), -- Nombre del autor Precio DECIMAL(8,2) -- Precio del libro con dos decimales ); Explicación: ID: Es una clave primaria que se incrementa automáticamente con cada nuevo registro. Titulo: Almacena el título del libro y no permite valores nulos (NOT NULL). Autor: Almacena el nombre del autor. Precio: Almacena el precio, con hasta 8 dígitos y 2 decimales. Paso 3: Insertar datos en la tabla sql Copiar código -- Insertar datos en la tabla Libros INSERT INTO Libros (Titulo, Autor, Precio) VALUES ('El Quijote', 'Miguel de Cervantes', 15.99), ('Cien Años de Soledad', 'Gabriel García Márquez', 12.49), ('1984', 'George Orwell', 9.99); Paso 4: Consultar datos de la tabla sql Copiar código -- Consultar todos los registros de la tabla Libros SELECT * FROM Libros; Resultado esperado: ID Titulo 1 El Quijote Autor Precio Miguel de Cervantes 15.99 2 Cien Años de Soledad Gabriel García Márquez 12.49 3 1984 George Orwell Conclusión del capítulo 9.99 En este capítulo hemos aprendido: 1. 2. 3. 4. Qué es SQL y su importancia en bases de datos relacionales. La diferencia entre bases de datos relacionales y no relacionales. Cómo configurar MySQL para trabajar con SQL. Cómo crear, usar y realizar operaciones básicas en una base de datos. Capítulo 2: Conceptos básicos de bases de datos 2.1 Tablas, filas y columnas En una base de datos relacional: Tablas: Son como hojas de cálculo; contienen datos organizados en filas y columnas. Filas: Representan una instancia o registro único (por ejemplo, un cliente). Columnas: Representan atributos o características de las filas (por ejemplo, nombre o correo electrónico). Ejemplo: ID Nombre Correo Edad 1 Ana Pérez [email protected] 30 2 Luis Gómez [email protected] 25 2.2 Tipos de datos en SQL Al definir las columnas de una tabla, es necesario especificar su tipo de datos. Algunos de los tipos de datos más comunes en MySQL son: Enteros: o o INT: Números enteros, por ejemplo, 123. TINYINT: Números pequeños (-128 a 127). Decimales y flotantes: o DECIMAL(8,2): Números decimales con 8 dígitos totales y 2 después del punto decimal. Texto: o VARCHAR(n): Cadena de texto de hasta n caracteres. o TEXT: Texto largo. Fechas y horas: o DATE: Fecha (AAAA-MM-DD). o DATETIME: Fecha y hora (AAAA-MM-DD HH:MM:SS). Práctica: Crear una tabla con diferentes tipos de datos sql Copiar código -- Crear una tabla llamada "Clientes" CREATE TABLE Clientes ( ID INT AUTO_INCREMENT PRIMARY KEY, cada cliente Nombre VARCHAR(100) NOT NULL, -- Identificador único para -- Nombre del cliente Correo VARCHAR(255) UNIQUE, para cada cliente FechaNacimiento DATE, Saldo DECIMAL(10,2) DEFAULT 0.00 defecto ); -- Correo electrónico, único -- Fecha de nacimiento -- Saldo inicial con valor por Explicación del código: AUTO_INCREMENT: Incrementa automáticamente el valor del campo ID en cada nueva fila. NOT NULL: No permite valores vacíos en la columna. UNIQUE: Garantiza que los valores de la columna Correo no se repitan. DEFAULT: Establece un valor por defecto para la columna Saldo. 2.3 Claves primarias y foráneas Las claves son esenciales para mantener la integridad de los datos: Clave primaria (Primary Key): Identifica de forma única cada fila en una tabla. Clave foránea (Foreign Key): Relaciona una tabla con otra. Ejemplo práctico: Crear tablas relacionadas Imagina que tenemos dos tablas: Clientes y Ordenes. Cada cliente puede realizar múltiples órdenes. Paso 1: Crear la tabla Clientes sql Copiar código CREATE TABLE Clientes ( ID INT AUTO_INCREMENT PRIMARY KEY, Nombre VARCHAR(100) NOT NULL, Correo VARCHAR(255) UNIQUE, FechaNacimiento DATE, Saldo DECIMAL(10,2) DEFAULT 0.00 ); Paso 2: Crear la tabla Ordenes con una clave foránea sql Copiar código CREATE TABLE Ordenes ( ID INT AUTO_INCREMENT PRIMARY KEY, para cada orden ClienteID INT, que realizó la orden -- Identificador único -- Referencia al cliente Fecha DATETIME NOT NULL, -- Fecha de la orden Monto DECIMAL(10,2) NOT NULL, -- Monto total de la orden FOREIGN KEY (ClienteID) REFERENCES Clientes(ID) -- Relación con la tabla Clientes ); Explicación del código: ClienteID es una clave foránea que apunta al campo ID de la tabla Clientes. La instrucción FOREIGN KEY establece esta relación. Práctica completa: Insertar y consultar datos en tablas relacionadas Paso 1: Insertar datos en la tabla Clientes sql Copiar código INSERT INTO Clientes (Nombre, Correo, FechaNacimiento, Saldo) VALUES ('Ana Pérez', '[email protected]', '1993-05-15', 500.00), ('Luis Gómez', '[email protected]', '1998-11-20', 300.00); Paso 2: Insertar datos en la tabla Ordenes sql Copiar código INSERT INTO Ordenes (ClienteID, Fecha, Monto) VALUES (1, '2025-01-08 10:30:00', 120.50), (1, '2025-01-08 15:45:00', 50.00), (2, '2025-01-08 12:00:00', 80.00); Paso 3: Consultar las órdenes de un cliente específico usando un JOIN sql Copiar código -- Mostrar las órdenes realizadas por "Ana Pérez" SELECT Clientes.Nombre, Ordenes.Fecha, Ordenes.Monto FROM Clientes JOIN Ordenes ON Clientes.ID = Ordenes.ClienteID WHERE Clientes.Nombre = 'Ana Pérez'; Resultado esperado: Nombre Fecha Monto Ana Pérez 2025-01-08 10:30:00 120.50 Ana Pérez 2025-01-08 15:45:00 50.00 Conclusión del capítulo En este capítulo hemos cubierto: 1. 2. 3. 4. La estructura básica de una base de datos: tablas, filas y columnas. Cómo definir tipos de datos apropiados para cada columna. La importancia de las claves primarias y foráneas para establecer relaciones. Cómo insertar y consultar datos en tablas relacionadas. Capítulo 3: Primeros pasos con SQL Este capítulo introduce las operaciones básicas que puedes realizar con SQL, como la creación de bases de datos, tablas, y el uso de consultas simples para insertar y recuperar datos. 3.1 Creación de bases de datos En SQL, una base de datos es el contenedor principal de las tablas. Crear una base de datos en MySQL es sencillo. Ejemplo práctico: Crear una base de datos sql Copiar código -- Crear una base de datos llamada "Empresa" CREATE DATABASE Empresa; -- Seleccionar la base de datos para usarla USE Empresa; Explicación: CREATE DATABASE: Crea una nueva base de datos llamada "Empresa". USE: Indica que todas las operaciones posteriores se realizarán en esta base de datos. 3.2 Creación de tablas Las tablas son los componentes principales donde se almacenan los datos. Cada tabla tiene columnas con tipos de datos definidos. Ejemplo práctico: Crear una tabla sql Copiar código -- Crear una tabla llamada "Empleados" CREATE TABLE Empleados ( ID INT AUTO_INCREMENT PRIMARY KEY, empleado Nombre VARCHAR(100) NOT NULL, (obligatorio) Puesto VARCHAR(50), Salario DECIMAL(10,2), decimales FechaIngreso DATE ); -- Identificador único para cada -- Nombre del empleado -- Puesto del empleado -- Salario del empleado con dos -- Fecha de ingreso a la empresa Explicación: ID INT AUTO_INCREMENT PRIMARY KEY: Crea un identificador único que se incrementa automáticamente. VARCHAR(100): Permite almacenar texto de hasta 100 caracteres. DECIMAL(10,2): Almacena números con hasta 10 dígitos, de los cuales 2 están después del punto decimal. DATE: Almacena fechas en formato YYYY-MM-DD. 3.3 Insertar datos en tablas Usa el comando INSERT INTO para agregar registros a una tabla. Ejemplo práctico: Insertar datos en una tabla sql Copiar código -- Insertar registros en la tabla Empleados INSERT INTO Empleados (Nombre, Puesto, Salario, FechaIngreso) VALUES ('Ana López', 'Gerente', 5000.00, '2020-06-15'), ('Carlos Pérez', 'Analista', 3000.00, '2022-01-10'), ('Marta Gómez', 'Desarrollador', 4000.00, '2021-03-20'); Explicación: INSERT INTO: Especifica la tabla donde se insertarán los datos. Los valores entre paréntesis corresponden a las columnas de la tabla en el mismo orden. 3.4 Consultas básicas con SELECT El comando SELECT se usa para recuperar datos de una tabla. Ejemplo práctico 1: Seleccionar todos los datos sql Copiar código -- Consultar todos los registros de la tabla Empleados SELECT * FROM Empleados; Resultado esperado: ID Nombre 1 Ana López Puesto Gerente Salario FechaIngreso 5000.00 2020-06-15 ID Nombre Puesto 2 Carlos Pérez Analista Salario FechaIngreso 3000.00 2022-01-10 3 Marta Gómez Desarrollador 4000.00 2021-03-20 Ejemplo práctico 2: Filtrar datos con WHERE sql Copiar código -- Consultar empleados con salario mayor a 4000 SELECT Nombre, Puesto, Salario FROM Empleados WHERE Salario > 4000; Resultado esperado: Nombre Puesto Salario Ana López Gerente 5000.00 Explicación: WHERE Salario > 4000: Filtra las filas donde el salario sea mayor a 4000. Ejemplo práctico 3: Ordenar resultados con ORDER BY sql Copiar código -- Consultar todos los empleados ordenados por salario de mayor a menor SELECT Nombre, Puesto, Salario FROM Empleados ORDER BY Salario DESC; Resultado esperado: Nombre Ana López Puesto Gerente Salario 5000.00 Marta Gómez Desarrollador 4000.00 Carlos Pérez Analista 3000.00 Explicación: ORDER BY Salario DESC: Ordena los resultados por la columna Salario en orden descendente (DESC). Ejemplo práctico 4: Seleccionar columnas específicas sql Copiar código -- Consultar solo los nombres y puestos de los empleados SELECT Nombre, Puesto FROM Empleados; Resultado esperado: Nombre Puesto Ana López Gerente Carlos Pérez Analista Marta Gómez Desarrollador Práctica completa Ejercicio: Gestión básica de empleados 1. Crear la base de datos y tabla sql Copiar código CREATE DATABASE Empresa; USE Empresa; CREATE TABLE Empleados ( ID INT AUTO_INCREMENT PRIMARY KEY, Nombre VARCHAR(100) NOT NULL, Puesto VARCHAR(50), Salario DECIMAL(10,2), FechaIngreso DATE ); 2. Insertar registros sql Copiar código INSERT INTO Empleados (Nombre, Puesto, Salario, FechaIngreso) VALUES ('Ana López', 'Gerente', 5000.00, '2020-06-15'), ('Carlos Pérez', 'Analista', 3000.00, '2022-01-10'), ('Marta Gómez', 'Desarrollador', 4000.00, '2021-03-20'); 3. Consultar registros o Todos los empleados: sql Copiar código SELECT * FROM Empleados; o Empleados con salario mayor a 4000: sql Copiar código SELECT Nombre, Puesto, Salario FROM Empleados WHERE Salario > 4000; o Ordenados por fecha de ingreso: sql Copiar código SELECT Nombre, Puesto, FechaIngreso FROM Empleados ORDER BY FechaIngreso ASC; Conclusión del capítulo En este capítulo hemos aprendido: 1. 2. 3. 4. Cómo crear bases de datos y tablas en MySQL. Cómo insertar datos en una tabla. Cómo usar consultas básicas con SELECT para recuperar datos. Cómo aplicar filtros y ordenar los resultados de las consultas. Capítulo 4: Recuperar datos Recuperar datos es una de las operaciones más comunes en SQL. En este capítulo aprenderás a usar el comando SELECT con filtros, ordenamientos y funciones de agregación para obtener la información que necesitas. 4.1 Filtrar resultados con WHERE El comando WHERE se utiliza para filtrar filas que cumplan ciertas condiciones. Ejemplo práctico 1: Filtrar por una condición sql Copiar código -- Crear una base de datos y una tabla CREATE DATABASE Tienda; USE Tienda; CREATE TABLE Productos ( ID INT AUTO_INCREMENT PRIMARY KEY, Nombre VARCHAR(100), Categoria VARCHAR(50), Precio DECIMAL(10,2), Stock INT ); -- Insertar datos en la tabla INSERT INTO Productos (Nombre, Categoria, Precio, Stock) VALUES ('Laptop', 'Electrónica', 800.00, 10), ('Smartphone', 'Electrónica', 600.00, 20), ('Silla', 'Muebles', 150.00, 5), ('Mesa', 'Muebles', 300.00, 3); -- Consultar productos con precio mayor a 500 SELECT * FROM Productos WHERE Precio > 500; Resultado esperado: ID Nombre 1 Laptop Categoria Precio Stock Electrónica 800.00 10 2 Smartphone Electrónica 600.00 20 Ejemplo práctico 2: Filtrar por varias condiciones sql Copiar código -- Consultar productos con precio mayor a 500 y categoría "Electrónica" SELECT Nombre, Precio, Stock FROM Productos WHERE Precio > 500 AND Categoria = 'Electrónica'; Resultado esperado: Nombre Laptop Precio Stock 800.00 10 Smartphone 600.00 20 Ejemplo práctico 3: Filtrar con operadores de comparación sql Copiar código -- Consultar productos con stock entre 5 y 15 SELECT Nombre, Stock FROM Productos WHERE Stock BETWEEN 5 AND 15; Resultado esperado: Nombre Stock Laptop 10 Silla 5 4.2 Ordenar resultados con ORDER BY El comando ORDER BY organiza los resultados en un orden específico. Ejemplo práctico 1: Ordenar de menor a mayor sql Copiar código -- Consultar todos los productos ordenados por precio de menor a mayor SELECT Nombre, Precio FROM Productos ORDER BY Precio ASC; Resultado esperado: Nombre Silla Precio 150.00 Nombre Mesa Precio 300.00 Smartphone 600.00 Laptop 800.00 Ejemplo práctico 2: Ordenar de mayor a menor sql Copiar código -- Consultar productos ordenados por stock de mayor a menor SELECT Nombre, Stock FROM Productos ORDER BY Stock DESC; Resultado esperado: Nombre Stock Smartphone 20 Laptop 10 Silla 5 Mesa 3 4.3 Uso de funciones de agregación Las funciones de agregación permiten realizar cálculos sobre un conjunto de valores. Función COUNT: Contar registros sql Copiar código -- Contar cuántos productos hay en total SELECT COUNT(*) AS TotalProductos FROM Productos; Resultado esperado: TotalProductos 4 Función SUM: Sumar valores sql Copiar código -- Calcular el valor total del inventario SELECT SUM(Precio * Stock) AS ValorTotalInventario FROM Productos; Resultado esperado: ValorTotalInventario 17900.00 Función AVG: Calcular el promedio sql Copiar código -- Calcular el precio promedio de los productos SELECT AVG(Precio) AS PrecioPromedio FROM Productos; Resultado esperado: PrecioPromedio 462.50 Función MAX y MIN: Valores máximo y mínimo sql Copiar código -- Consultar el precio más alto y más bajo SELECT MAX(Precio) AS PrecioMaximo, MIN(Precio) AS PrecioMinimo FROM Productos; Resultado esperado: PrecioMaximo PrecioMinimo 800.00 150.00 4.4 Agrupar datos con GROUP BY y HAVING El comando GROUP BY agrupa filas que comparten valores en una o más columnas, y HAVING filtra grupos. Ejemplo práctico 1: Agrupar por categoría sql Copiar código -- Consultar el número de productos por categoría SELECT Categoria, COUNT(*) AS TotalProductos FROM Productos GROUP BY Categoria; Resultado esperado: Categoria TotalProductos Electrónica 2 Muebles 2 Ejemplo práctico 2: Filtrar grupos con HAVING sql Copiar código -- Consultar categorías con más de 1 producto SELECT Categoria, COUNT(*) AS TotalProductos FROM Productos GROUP BY Categoria HAVING COUNT(*) > 1; Resultado esperado: Categoria TotalProductos Electrónica 2 Muebles 2 Práctica completa: Gestión de inventario 1. Crear la base de datos y tabla sql Copiar código CREATE DATABASE Tienda; USE Tienda; CREATE TABLE Productos ( ID INT AUTO_INCREMENT PRIMARY KEY, Nombre VARCHAR(100), Categoria VARCHAR(50), Precio DECIMAL(10,2), Stock INT ); INSERT INTO Productos (Nombre, Categoria, Precio, Stock) VALUES ('Laptop', 'Electrónica', 800.00, 10), ('Smartphone', 'Electrónica', 600.00, 20), ('Silla', 'Muebles', 150.00, 5), ('Mesa', 'Muebles', 300.00, 3); 2. Consultar productos por categoría sql Copiar código SELECT Categoria, COUNT(*) AS TotalProductos FROM Productos GROUP BY Categoria; 3. Consultar el valor total del inventario sql Copiar código SELECT SUM(Precio * Stock) AS ValorTotalInventario FROM Productos; 4. Consultar productos con precio mayor a 500 ordenados por precio descendente sql Copiar código SELECT Nombre, Precio FROM Productos WHERE Precio > 500 ORDER BY Precio DESC; Conclusión del capítulo En este capítulo aprendiste: 1. 2. 3. 4. Cómo filtrar datos con WHERE. Cómo ordenar resultados con ORDER BY. Cómo usar funciones de agregación como SUM, AVG, COUNT, MAX, y MIN. Cómo agrupar datos con GROUP BY y filtrar grupos con HAVING.