CHULETA DE SQL
Comandos Básicos (CRUD)
SELECT
: consulta datos
INSERT INTO
: añade registros
UPDATE
: modifica registros
DELETE
: elimina registros
CREATE TABLE
CREATE TABLE empleados (
id INT PRIMARY KEY,
nombre VARCHAR(50),
salario DECIMAL(10,2),
fecha_ingreso DATE,
departamento_id INT
);
CREATE TABLE empleados_altos
AS
SELECT id, nombre, salario
FROM empleados
WHERE salario > 3000;
SELECT
SELECT nombre FROM empleados;
SELECT * FROM empleados WHERE salario > 2000 ORDER BY salario DESC;
SELECT DISTINCT departamento_id FROM empleados;
INSERT
INSERT INTO empleados (id, nombre, salario, fecha_ingreso, departamento_id)
VALUES (1, 'Ana', 2500.00, '2022-01-10', 2);
UPDATE
UPDATE empleados
SET salario = salario + 200
WHERE departamento_id = 2;
DELETE
DELETE FROM empleados
WHERE salario < 1000;
Funciones de Agregación
COUNT(*)
, SUM(col)
, AVG(col)
, MAX(col)
, MIN(col)
SELECT AVG(salario) FROM empleados;
SELECT departamento_id, COUNT(*) FROM empleados GROUP BY departamento_id;
GROUP BY / HAVING
SELECT departamento_id, AVG(salario) AS promedio_salario
FROM empleados
GROUP BY departamento_id
HAVING AVG(salario) > 2000;
JOINS
SELECT e.nombre, d.nombre AS departamento
FROM empleados e
JOIN departamentos d ON e.departamento_id = d.id;
SELECT e.nombre, d.nombre AS departamento
FROM empleados e
LEFT JOIN departamentos d ON e.departamento_id = d.id;
Subconsultas
SELECT nombre FROM empleados
WHERE salario > (SELECT AVG(salario) FROM empleados);
SELECT * FROM empleados
WHERE departamento_id IN (SELECT id FROM departamentos WHERE sede = 'Madrid');
Vistas
CREATE VIEW empleados_altos AS
SELECT * FROM empleados WHERE salario > 3000;
SELECT * FROM empleados_altos;
Índices
CREATE INDEX idx_salario ON empleados(salario);
Transacciones
START TRANSACTION;
UPDATE empleados SET salario = salario * 1.1
WHERE departamento_id = 3;
-- COMMIT para guardar cambios
-- ROLLBACK para deshacer si hay error
COMMIT;
TRIGGERS (Disparadores)
Crear tabla de log
CREATE TABLE log_salarios (
empleado_id INT,
salario_anterior DECIMAL(10,2),
salario_nuevo DECIMAL(10,2),
fecha_cambio TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Crear trigger
DELIMITER //
CREATE TRIGGER trg_actualiza_salario
BEFORE UPDATE ON empleados
FOR EACH ROW
BEGIN
IF NEW.salario != OLD.salario THEN
INSERT INTO log_salarios (empleado_id, salario_anterior, salario_nuevo)
VALUES (OLD.id, OLD.salario, NEW.salario);
END IF;
END;
//
DELIMITER ;
Otro ejemplo: trigger AFTER INSERT
DELIMITER //
CREATE TRIGGER trg_bienvenida_empleado
AFTER INSERT ON empleados
FOR EACH ROW
BEGIN
INSERT INTO mensajes (mensaje)
VALUES (CONCAT('Bienvenido ', NEW.nombre, ' al equipo!'));
END;
//
DELIMITER ;
Comentarios
-- Esto es un comentario de una línea
/*
Esto es un comentario
de múltiples líneas
*/