🗄️ SQL (Structured Query Language) Cheatsheet Completo 🗄️
SQL es el lenguaje estándar utilizado para comunicarse con y gestionar bases de datos relacionales (RDBMS) como MySQL, PostgreSQL, Oracle, SQL Server, SQLite, entre otros. Permite almacenar, manipular, consultar y recuperar datos.
1. 🌟 Conceptos Clave
- Base de Datos (Database): Una colección organizada de datos.
- Tabla (Table): Estructura de datos que organiza la información en filas y columnas.
- Columna (Column / Field): Una categoría específica de datos dentro de una tabla (ej.
nombre,edad). Define el tipo de dato. - Fila (Row / Record): Una entrada individual de datos en una tabla.
- Clave Primaria (Primary Key - PK): Una columna (o conjunto de columnas) que identifica de forma única cada fila en una tabla. ¡No puede contener valores nulos y debe ser única!
- Clave Foránea (Foreign Key - FK): Una columna (o conjunto de columnas) en una tabla que hace referencia a la Clave Primaria de otra tabla. Establece la relación entre tablas.
- Normalización: Proceso de organizar las columnas y tablas de una base de datos para minimizar la redundancia y mejorar la integridad de los datos.
- Esquema (Schema): La estructura de una base de datos, incluyendo tablas, columnas, relaciones, índices, etc.
2. 🔤 Tipos de Datos Comunes
Los tipos de datos pueden variar ligeramente entre diferentes sistemas de gestión de bases de datos relacionales (RDBMS), pero estos son los más comunes:
- Cadenas de Texto:
VARCHAR(size): Cadena de longitud variable (ej.VARCHAR(255)).CHAR(size): Cadena de longitud fija (ej.CHAR(10)).TEXT/CLOB: Cadena de longitud muy larga.
- Números:
INT/INTEGER: Enteros.SMALLINT,BIGINT: Enteros más pequeños/grandes.DECIMAL(P, S)/NUMERIC(P, S): Número decimal exacto (P=precisión total, S=escala decimal).FLOAT,DOUBLE: Números de punto flotante (aproximados).
- Fecha y Hora:
DATE: Solo fecha (YYYY-MM-DD).TIME: Solo hora (HH:MI:SS).DATETIME/TIMESTAMP: Fecha y hora (YYYY-MM-DD HH:MI:SS).
- Booleanos:
BOOLEAN/BOOL(Algunos RDBMS usanTINYINT(1)oBIT).
- Binarios / LOBs:
BLOB/BYTEA: Datos binarios (imágenes, archivos).
3. 📝 DDL (Data Definition Language) - Definición de Estructura
Comandos para definir, modificar y eliminar la estructura de la base de datos y sus objetos.
3.1. CREATE
CREATE DATABASE: Crea una nueva base de datos.CREATE DATABASE mi_base_de_datos;CREATE TABLE: Crea una nueva tabla.CREATE TABLE Usuarios ( ID_Usuario INT PRIMARY KEY AUTO_INCREMENT, -- MySQL/SQLite -- ID_Usuario INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY, -- PostgreSQL -- ID_Usuario INT PRIMARY KEY IDENTITY(1,1), -- SQL Server Nombre VARCHAR(100) NOT NULL, Email VARCHAR(255) UNIQUE, FechaRegistro DATE DEFAULT CURRENT_DATE, -- O GETDATE() en SQL Server EsActivo BOOLEAN DEFAULT TRUE, CONSTRAINT CK_Edad CHECK (Edad >= 18) -- Constraint de verificación ); CREATE TABLE Pedidos ( ID_Pedido INT PRIMARY KEY AUTO_INCREMENT, ID_Usuario INT NOT NULL, FechaPedido DATETIME DEFAULT CURRENT_TIMESTAMP, Total DECIMAL(10, 2), CONSTRAINT FK_UsuarioPedido FOREIGN KEY (ID_Usuario) REFERENCES Usuarios(ID_Usuario) ON DELETE CASCADE -- Si el usuario se elimina, sus pedidos también ON UPDATE NO ACTION -- No hacer nada si el ID de usuario se actualiza );
3.2. ALTER
ALTER TABLE: Modifica la estructura de una tabla existente.- Añadir una columna:
ALTER TABLE Usuarios ADD COLUMN Telefono VARCHAR(20); - Eliminar una columna:
ALTER TABLE Usuarios DROP COLUMN Telefono; - Modificar tipo de columna:
ALTER TABLE Usuarios MODIFY COLUMN Nombre VARCHAR(150); -- Sintaxis varía (ej. ALTER COLUMN en SQL Server) - Añadir una clave foránea (después de crear las tablas):
ALTER TABLE Pedidos ADD CONSTRAINT FK_Pedidos_Productos FOREIGN KEY (ID_Producto) REFERENCES Productos(ID_Producto);
- Añadir una columna:
3.3. DROP
DROP DATABASE: Elimina una base de datos. ¡CUIDADO!DROP DATABASE mi_base_de_datos;DROP TABLE: Elimina una tabla. ¡CUIDADO!DROP TABLE Pedidos;
3.4. TRUNCATE
TRUNCATE TABLE: Elimina todas las filas de una tabla, pero mantiene la estructura. Es más rápido queDELETEsinWHEREy a menudo reinicia los contadores de ID. ¡No es transaccional en algunos SGBD!TRUNCATE TABLE Usuarios;
4. 🗃️ DML (Data Manipulation Language) - Manipulación de Datos
Comandos para manipular los datos dentro de las tablas.
4.1. INSERT
INSERT INTO: Añade nuevas filas a una tabla.- Valores específicos para todas las columnas:
INSERT INTO Usuarios VALUES (1, 'Ana Pérez', 'ana@example.com', '2023-01-15', TRUE); - Columnas específicas:
INSERT INTO Usuarios (Nombre, Email) VALUES ('Luis García', 'luis@example.com'); - Múltiples filas (MySQL/PostgreSQL):
INSERT INTO Productos (Nombre, Precio) VALUES ('Laptop', 1200.00), ('Mouse', 25.50), ('Teclado', 75.00); ``` * `INSERT INTO ... SELECT`: Insertar datos desde otra tabla. ```sql INSERT INTO UsuariosAntiguos (ID_Usuario, Nombre) SELECT ID_Usuario, Nombre FROM Usuarios WHERE FechaRegistro < '2022-01-01';
- Valores específicos para todas las columnas:
4.2. UPDATE
UPDATE ... SET ... WHERE: Modifica datos existentes en una o más filas. ¡Siempre usaWHEREo actualizarás todas las filas!UPDATE Usuarios SET Email = 'ana.perez@nuevo.com', EsActivo = FALSE WHERE ID_Usuario = 1; UPDATE Productos SET Precio = Precio * 1.10 -- Aumenta el precio un 10% WHERE Nombre LIKE '%Laptop%';
4.3. DELETE
DELETE FROM ... WHERE: Elimina filas de una tabla. ¡Siempre usaWHEREo eliminarás todas las filas!DELETE FROM Usuarios WHERE ID_Usuario = 2; DELETE FROM Pedidos WHERE FechaPedido < '2023-01-01';
5. 🔍 DQL (Data Query Language) - Consulta de Datos
Comandos para recuperar datos de la base de datos. SELECT es el comando más utilizado.
5.1. SELECT
- Seleccionar todas las columnas (
*):SELECT * FROM Usuarios; - Seleccionar columnas específicas:
SELECT Nombre, Email FROM Usuarios; - Alias de columna (
AS):SELECT Nombre AS NombreCompleto, Email AS CorreoElectronico FROM Usuarios; - Valores Distintos (
DISTINCT):SELECT DISTINCT Ciudad FROM Usuarios;
5.2. WHERE (Filtrado de Filas)
- Filtra filas basándose en una condición.
SELECT * FROM Productos WHERE Precio > 100 AND EsActivo = TRUE; SELECT Nombre, Email FROM Usuarios WHERE Nombre LIKE 'A%' OR Nombre LIKE 'B%'; SELECT * FROM Pedidos WHERE Total BETWEEN 50 AND 100; SELECT * FROM Usuarios WHERE ID_Usuario IN (1, 3, 5); SELECT * FROM Usuarios WHERE Telefono IS NULL; SELECT * FROM Usuarios WHERE Telefono IS NOT NULL;
5.3. ORDER BY (Ordenación de Resultados)
- Ordena las filas del resultado. Por defecto es
ASC(ascendente). UsaDESCpara descendente.SELECT Nombre, Edad FROM Usuarios ORDER BY Edad DESC, Nombre ASC;
5.4. LIMIT / OFFSET (Paginación - MySQL/PostgreSQL/SQLite)
-
Limita el número de filas devueltas y/o especifica un desplazamiento.
SELECT * FROM Productos LIMIT 10; -- Primeros 10 productos SELECT * FROM Productos LIMIT 10 OFFSET 20; -- 10 productos a partir del 20 (páginas 3)- SQL Server/Oracle: Usa
TOP(SQL Server) oROWNUM(Oracle) oFETCH NEXT ... ROWS ONLY(SQL estándar).
- SQL Server/Oracle: Usa
5.5. GROUP BY (Agrupación de Filas)
- Agrupa filas que tienen los mismos valores en columnas especificadas.
- Usado con funciones de agregación.
SELECT Categoria, COUNT(*) AS TotalProductos, AVG(Precio) AS PrecioPromedio FROM Productos GROUP BY Categoria;
5.6. HAVING (Filtrado de Grupos)
- Filtra los resultados de
GROUP BYbasándose en una condición de agregación.WHEREfiltra filas,HAVINGfiltra grupos.SELECT Categoria, COUNT(*) AS TotalProductos FROM Productos GROUP BY Categoria HAVING COUNT(*) > 5 AND AVG(Precio) < 500;
6. 🧮 Operadores Comunes en WHERE
- Comparación:
=,!=(<>),<,>,<=,>=. - Lógicos:
AND,OR,NOT. - Patrones:
LIKE(con_para un carácter,%para cero o más caracteres).'A%': Empieza por A.'%man%': Contiene ‘man’.'_a%': Segunda letra es ‘a’.
- Rangos:
BETWEEN value1 AND value2. - Listas:
IN (value1, value2, ...)/NOT IN (...). - Nulos:
IS NULL/IS NOT NULL.
7. ➕ Funciones de Agregación
Operan sobre un conjunto de filas y devuelven un único valor.
COUNT(column)/COUNT(*): Número de filas.COUNT(DISTINCT column): Número de valores únicos.
SUM(column): Suma total de una columna numérica.AVG(column): Promedio de una columna numérica.MIN(column): Valor mínimo de una columna.MAX(column): Valor máximo de una columna.
8. 🔄 JOINS (Combinación de Tablas)
Combina filas de dos o más tablas basándose en una columna relacionada.
INNER JOIN: Devuelve filas cuando hay al menos una coincidencia en ambas tablas. (La intersección).SELECT U.Nombre, P.FechaPedido, P.Total FROM Usuarios U INNER JOIN Pedidos P ON U.ID_Usuario = P.ID_Usuario;LEFT JOIN(oLEFT OUTER JOIN): Devuelve todas las filas de la tabla izquierda, y las filas coincidentes de la tabla derecha. Si no hay coincidencia, los valores de la derecha sonNULL.SELECT U.Nombre, P.ID_Pedido FROM Usuarios U LEFT JOIN Pedidos P ON U.ID_Usuario = P.ID_Usuario; -- Muestra usuarios que no han hecho pedidos (ID_Pedido será NULL)RIGHT JOIN(oRIGHT OUTER JOIN): Similar aLEFT JOIN, pero devuelve todas las filas de la tabla derecha.FULL JOIN(oFULL OUTER JOIN- no soportado en MySQL): Devuelve todas las filas cuando hay una coincidencia en cualquiera de las tablas (unión).CROSS JOIN: Produce el producto cartesiano de las tablas (cada fila de la primera con cada fila de la segunda). ¡CUIDADO!
8.1. UNION / UNION ALL
Combina los resultados de dos o más sentencias SELECT. Las columnas seleccionadas deben tener tipos de datos similares y el mismo orden.
-
UNION: Elimina filas duplicadas. -
UNION ALL: Incluye todas las filas, incluso duplicadas.SELECT Nombre FROM Clientes UNION SELECT Nombre FROM Empleados;
9. 🪆 Subconsultas (Subqueries / Nested Queries)
Una consulta SELECT dentro de otra consulta.
-- Obtener usuarios que han realizado pedidos
SELECT Nombre FROM Usuarios
WHERE ID_Usuario IN (SELECT ID_Usuario FROM Pedidos);
-- Obtener el producto más caro
SELECT Nombre, Precio FROM Productos
WHERE Precio = (SELECT MAX(Precio) FROM Productos);
-- Subconsulta en el FROM (Derived Table / CTE)
SELECT T.Nombre, T.TotalProductos
FROM (
SELECT Categoria AS Nombre, COUNT(*) AS TotalProductos
FROM Productos GROUP BY Categoria
) AS T
WHERE T.TotalProductos > 5;
10. 🔑 DCL (Data Control Language) - Control de Acceso
Comandos para gestionar permisos de usuario.
GRANT: Otorga permisos a un usuario.GRANT SELECT, INSERT ON Usuarios TO 'dev_user'@'localhost'; GRANT ALL PRIVILEGES ON mi_base_de_datos.* TO 'admin_user'@'%';REVOKE: Revoca permisos a un usuario.REVOKE DELETE ON Usuarios FROM 'dev_user'@'localhost';
11. 🔄 TCL (Transaction Control Language) - Control de Transacciones
Comandos para gestionar transacciones de base de datos. Una transacción es una secuencia de operaciones que se ejecutan como una única unidad lógica.
-
START TRANSACTION/BEGIN TRANSACTION: Inicia una nueva transacción. -
COMMIT: Guarda permanentemente los cambios realizados en la transacción. -
ROLLBACK: Deshace todos los cambios realizados en la transacción desde el últimoSTART TRANSACTIONoCOMMIT. -
SAVEPOINT: Establece un punto de guardado dentro de una transacción al que se puede revertir.START TRANSACTION; INSERT INTO Cuentas (ID_Cuenta, Saldo) VALUES (1, 1000); UPDATE Cuentas SET Saldo = Saldo - 100 WHERE ID_Cuenta = 1; -- SAVEPOINT before_transfer; -- UPDATE Cuentas SET Saldo = Saldo + 100 WHERE ID_Cuenta = 2; -- ROLLBACK TO before_transfer; COMMIT; -- Guarda los cambios de INSERT y UPDATE- Propiedades ACID: Las transacciones deben cumplir con Atomicidad, Consistencia, Aislamiento y Durabilidad.
12. ⚡ Índices (Indexes)
Mejoran la velocidad de las operaciones de recuperación de datos en una base de datos.
CREATE INDEX: Crea un índice en una columna o columnas.CREATE INDEX idx_usuarios_email ON Usuarios (Email); CREATE UNIQUE INDEX uidx_productos_nombre ON Productos (Nombre); -- Índice únicoDROP INDEX: Elimina un índice.DROP INDEX idx_usuarios_email ON Usuarios; -- Sintaxis puede variar
13. 🖼️ Vistas (Views)
Una tabla virtual basada en el conjunto de resultados de una consulta SQL.
CREATE VIEW: Crea una vista.CREATE VIEW ProductosActivos AS SELECT ID_Producto, Nombre, Precio FROM Productos WHERE EsActivo = TRUE;DROP VIEW: Elimina una vista.DROP VIEW ProductosActivos;- Uso: Se consulta como una tabla normal:
SELECT * FROM ProductosActivos;
14. 💡 Buenas Prácticas y Consejos
- Siempre usa
WHERE: Al usarUPDATEoDELETE, asegúrate de incluir una cláusulaWHEREpara evitar afectar datos no deseados. - Evita
SELECT *en Producción: Selecciona solo las columnas que realmente necesitas. Mejora el rendimiento y el uso de la red. - Usa Alias: Utiliza alias para nombres de tablas y columnas en consultas complejas para mejorar la legibilidad.
- Normalización de la Base de Datos: Diseña tu base de datos de forma normalizada para reducir la redundancia y mejorar la integridad.
- Índices para Columnas Frecuentemente Consultadas: Crea índices en las columnas utilizadas en las cláusulas
WHERE,JOINyORDER BYpara acelerar las consultas. - Prepared Statements / Parámetros Vinculados: Utiliza prepared statements en el código de tu aplicación para protegerte de la inyección SQL y mejorar el rendimiento de consultas repetidas.
- Transacciones para Operaciones Lógicas: Agrupa múltiples operaciones de DML en una transacción para asegurar la atomicidad y consistencia.
- Manejo de Nulos: Entiende cómo
NULLfunciona en SQL (no es lo mismo que 0 o una cadena vacía). UsaIS NULLoIS NOT NULL. - Consistencia de Mayúsculas/Minúsculas: Sé consistente con la capitalización de palabras clave SQL (ej.
SELECTvsselect), aunque muchos RDBMS no distinguen entre mayúsculas y minúsculas en palabras clave, es una buena práctica para la legibilidad.
Este cheatsheet te proporciona una referencia completa y concisa de SQL, cubriendo sus conceptos esenciales, comandos DDL/DML/DQL/DCL/TCL, operadores, funciones, tipos de JOINs, subconsultas, e importantes buenas prácticas para gestionar y consultar bases de datos relacionales de manera efectiva.