🗄️ ¿Qué son las Consultas SQL?
Las consultas SQL (Structured Query Language) son instrucciones que envías a una base de datos para realizar operaciones como buscar información, agregar datos, modificar registros o eliminar contenido.
💡 Piénsalo así: SQL es como el “idioma” que usas para comunicarte con una base de datos. Le dices exactamente qué quieres hacer y ella te responde.
🔍 Tipos de Consultas SQL
📋 DDL - Definición de Datos (Estructura)
Comandos para crear y modificar la estructura:
CREATE
: Crear tablas, bases de datos, índicesALTER
: Modificar estructura de tablas existentesDROP
: Eliminar tablas o bases de datos completasTRUNCATE
: Vaciar todo el contenido de una tabla (más rápido que DELETE)
📊 DML - Manipulación de Datos (Contenido)
Comandos para trabajar con los datos:
INSERT
: Agregar nuevos registrosSELECT
: Buscar y mostrar informaciónUPDATE
: Modificar registros existentesDELETE
: Eliminar registros específicos
⚠️ Dato importante: Los comandos DML son los que normalmente pueden ser vulnerados en ataques de SQL Injection.
🏗️ Creando tu primera base de datos
Paso 1: Crear la base de datos
1
| CREATE DATABASE mi_empresa;
|
Paso 2: Seleccionar la base de datos
Paso 3: Crear una tabla con estructura completa
1
2
3
4
5
6
7
8
9
10
| CREATE TABLE empleados (
id INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(50) NOT NULL,
apellido VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
edad INT CHECK (edad >= 18),
salario DECIMAL(10,2),
departamento VARCHAR(30),
fecha_contratacion DATE DEFAULT CURRENT_DATE
);
|
¿Qué hace cada parte?
id INT PRIMARY KEY AUTO_INCREMENT
: ID único que se incrementa automáticamenteVARCHAR(50) NOT NULL
: Texto de máximo 50 caracteres, obligatorioUNIQUE
: No permite valores duplicadosCHECK (edad >= 18)
: Solo permite mayores de edadDECIMAL(10,2)
: Números decimales (10 dígitos total, 2 después del punto)DEFAULT CURRENT_DATE
: Usa la fecha actual por defecto
➕ INSERT: Agregando datos
Insertar un registro completo
1
2
| INSERT INTO empleados (nombre, apellido, email, edad, salario, departamento)
VALUES ('Andrés', 'Núñez', 'andres@empresa.com', 25, 3500.00, 'IT');
|
Insertar múltiples registros a la vez
1
2
3
4
5
| INSERT INTO empleados (nombre, apellido, email, edad, salario, departamento) VALUES
('María', 'González', 'maria@empresa.com', 28, 4000.00, 'Marketing'),
('Carlos', 'López', 'carlos@empresa.com', 32, 4500.00, 'Ventas'),
('Ana', 'Martínez', 'ana@empresa.com', 26, 3800.00, 'IT'),
('Pedro', 'Rodríguez', 'pedro@empresa.com', 29, 3200.00, 'Contabilidad');
|
Insertar solo algunos campos
1
2
3
| INSERT INTO empleados (nombre, apellido, email, edad)
VALUES ('Luis', 'Fernández', 'luis@empresa.com', 24);
-- salario y departamento quedarán como NULL
|
🔍 SELECT: Consultando datos
Consulta básica - Ver todo
1
| SELECT * FROM empleados;
|
Consulta específica - Columnas seleccionadas
1
| SELECT nombre, apellido, salario FROM empleados;
|
Consultas con condiciones (WHERE)
1
2
3
4
5
6
7
8
9
10
11
| -- Empleados del departamento IT
SELECT * FROM empleados WHERE departamento = 'IT';
-- Empleados con salario mayor a 3500
SELECT nombre, apellido, salario
FROM empleados
WHERE salario > 3500;
-- Empleados jóvenes con buen salario
SELECT * FROM empleados
WHERE edad < 30 AND salario >= 3500;
|
Ordenar resultados
1
2
3
4
5
6
7
8
| -- Ordenar por salario (menor a mayor)
SELECT * FROM empleados ORDER BY salario;
-- Ordenar por salario (mayor a menor)
SELECT * FROM empleados ORDER BY salario DESC;
-- Ordenar por departamento y luego por salario
SELECT * FROM empleados ORDER BY departamento, salario DESC;
|
Limitar resultados
1
2
3
4
5
6
7
8
| -- Solo los primeros 3 empleados
SELECT * FROM empleados LIMIT 3;
-- Empleados con mejor salario (top 3)
SELECT nombre, apellido, salario
FROM empleados
ORDER BY salario DESC
LIMIT 3;
|
Búsquedas con patrones
1
2
3
4
5
6
7
8
| -- Nombres que empiecen con 'A'
SELECT * FROM empleados WHERE nombre LIKE 'A%';
-- Emails que contengan 'gmail'
SELECT * FROM empleados WHERE email LIKE '%gmail%';
-- Nombres de exactamente 5 letras
SELECT * FROM empleados WHERE nombre LIKE '_____';
|
✏️ UPDATE: Modificando datos
Actualizar un campo específico
1
2
3
| UPDATE empleados
SET salario = 4000.00
WHERE id = 1;
|
Actualizar múltiples campos
1
2
3
| UPDATE empleados
SET salario = 4200.00, departamento = 'Senior IT'
WHERE nombre = 'Andrés' AND apellido = 'Núñez';
|
Aumentar salarios por departamento
1
2
3
4
| -- Aumentar 10% a empleados de IT
UPDATE empleados
SET salario = salario * 1.10
WHERE departamento = 'IT';
|
Actualización condicional múltiple
1
2
3
4
| -- Bono para empleados con más de 2 años
UPDATE empleados
SET salario = salario + 500
WHERE fecha_contratacion < '2023-01-01';
|
🗑️ DELETE: Eliminando datos
Eliminar registro específico
1
| DELETE FROM empleados WHERE id = 5;
|
Eliminar con condiciones múltiples
1
2
3
4
5
6
| -- Eliminar empleados sin departamento asignado
DELETE FROM empleados WHERE departamento IS NULL;
-- Eliminar empleados de contabilidad con salario bajo
DELETE FROM empleados
WHERE departamento = 'Contabilidad' AND salario < 3000;
|
⚠️ Cuidado con DELETE sin WHERE
1
2
3
4
5
| -- ¡ESTO ELIMINA TODOS LOS REGISTROS!
DELETE FROM empleados;
-- Mejor usar TRUNCATE para vaciar completamente
TRUNCATE TABLE empleados;
|
📊 Consultas avanzadas para principiantes
Funciones de agregación
1
2
3
4
5
6
7
8
9
10
11
| -- Contar empleados
SELECT COUNT(*) FROM empleados;
-- Salario promedio
SELECT AVG(salario) as salario_promedio FROM empleados;
-- Salario máximo y mínimo
SELECT MAX(salario) as max_salario, MIN(salario) as min_salario FROM empleados;
-- Suma total de salarios
SELECT SUM(salario) as total_salarios FROM empleados;
|
Agrupar datos
1
2
3
4
5
6
7
8
9
10
| -- Empleados por departamento
SELECT departamento, COUNT(*) as cantidad_empleados
FROM empleados
GROUP BY departamento;
-- Salario promedio por departamento
SELECT departamento, AVG(salario) as salario_promedio
FROM empleados
GROUP BY departamento
ORDER BY salario_promedio DESC;
|
Consultas con HAVING (filtrar grupos)
1
2
3
4
5
| -- Departamentos con más de 2 empleados
SELECT departamento, COUNT(*) as cantidad
FROM empleados
GROUP BY departamento
HAVING COUNT(*) > 2;
|
🛡️ Buenas prácticas de seguridad
1. Siempre usar WHERE en UPDATE y DELETE
1
2
3
4
5
| -- ✅ BIEN - Con condición específica
UPDATE empleados SET salario = 5000 WHERE id = 1;
-- ❌ MAL - Sin WHERE (afecta TODOS los registros)
UPDATE empleados SET salario = 5000;
|
2. Validar datos antes de insertar
1
2
3
4
| -- ✅ BIEN - Con validaciones
INSERT INTO empleados (nombre, email, edad)
VALUES ('Juan', 'juan@email.com', 25)
WHERE NOT EXISTS (SELECT 1 FROM empleados WHERE email = 'juan@email.com');
|
3. Usar transacciones para operaciones críticas
1
2
3
4
5
| START TRANSACTION;
UPDATE empleados SET salario = salario * 1.10 WHERE departamento = 'IT';
-- Si algo sale mal: ROLLBACK;
-- Si todo está bien: COMMIT;
COMMIT;
|
🎯 Ejercicios prácticos
Crea la tabla y datos de ejemplo, luego resuelve:
- Mostrar empleados que ganen más de 4000
- Contar cuántos empleados hay en cada departamento
- Encontrar el empleado con mayor salario
- Actualizar el departamento de ‘María González’ a ‘Recursos Humanos’
- Eliminar empleados con salario menor a 3000
Soluciones:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| -- 1. Empleados que ganen más de 4000
SELECT * FROM empleados WHERE salario > 4000;
-- 2. Empleados por departamento
SELECT departamento, COUNT(*) FROM empleados GROUP BY departamento;
-- 3. Empleado con mayor salario
SELECT * FROM empleados ORDER BY salario DESC LIMIT 1;
-- 4. Actualizar departamento de María
UPDATE empleados SET departamento = 'Recursos Humanos'
WHERE nombre = 'María' AND apellido = 'González';
-- 5. Eliminar empleados con salario bajo
DELETE FROM empleados WHERE salario < 3000;
|
📚 Próximos pasos
- Practica con MySQL o MariaDB instalado en tu sistema
- Aprende sobre JOINS para consultar múltiples tablas
- Estudia índices para optimizar consultas
- Explora funciones específicas de tu motor de base de datos
💡 Recuerda: SQL es un lenguaje potente. ¡La práctica constante es clave para dominarlo!
Andrés Nuñez - t4ifi