Guía completa de SQL: Tablas, Consultas, Usuarios y Privilegios en MySQL
🔧 Crear tablas
CREATE TABLE Empleados (
ID INT NOT NULL PRIMARY KEY,
Nombre VARCHAR(50),
Apellido VARCHAR(50),
Dirección VARCHAR(100),
Ciudad VARCHAR(50),
FechaContratacion DATE
);
Relaciones entre tablas
- Relación 1:N:
FOREIGN KEY (idGrup) REFERENCES grupoMusical(idGrupo) - Relación 1:1:
empleado_id INT UNIQUE, FOREIGN KEY (empleado_id) REFERENCES Empleados(empleado_id)
➕ INSERT
INSERT INTO Clientes (Nombre, Apellido, Ciudad) VALUES ('Juan', 'Pérez', 'Madrid');
Varios registros:
INSERT INTO Clientes (Nombre, Apellido, Ciudad) VALUES ('Ana', 'García', 'Barcelona'), ('Luis', 'Martínez', 'Valencia');
❌ DELETE
DELETE FROM Clientes WHERE nombre = 'Juan';
¡Ojo! Sin WHERE se borran todos los registros: DELETE FROM Clientes;
✏️ UPDATE
UPDATE Empleados SET salario = 60000 WHERE id = 101;
Múltiples columnas:
UPDATE Empleados SET salario = 70000, departamento = 'RRHH' WHERE id = 102;
Subconsulta:
UPDATE país SET capital = 'Pekín' WHERE población = (SELECT MAX(población) FROM país);
👤 Usuarios y privilegios
-- Crear un nuevo usuario:
CREATE USER 'usuario1'@'localhost' IDENTIFIED BY 'contraseña';
-- Dar privilegios de solo lectura:
GRANT SELECT ON basedatos.* TO 'usuario1'@'localhost';
-- Dar privilegios de lectura y escritura:
GRANT SELECT, INSERT, UPDATE, DELETE ON basedatos.* TO 'usuario1'@'localhost';
-- Aplicar los cambios de privilegios:
FLUSH PRIVILEGES;
-- Ver los privilegios de un usuario:
SHOW GRANTS FOR 'usuario1'@'localhost';
🚀 Comandos básicos de SQL (para empezar)
-- Iniciar MySQL (según sistema):
mysql -u root -p
-- Mostrar bases de datos:
SHOW DATABASES;
-- Crear base de datos:
CREATE DATABASE nombreBD;
-- Usar una base de datos:
USE nombreBD;
-- Mostrar tablas:
SHOW TABLES;
-- Ver estructura de una tabla:
DESCRIBE nombreTabla;
-- Crear tabla:
CREATE TABLE nombreTabla (...);
-- Insertar datos:
INSERT INTO nombreTabla (...) VALUES (...);
-- Consultar datos:
SELECT * FROM nombreTabla;
-- Filtrar con condiciones:
SELECT * FROM nombreTabla WHERE condición;
-- Ordenar resultados:
SELECT * FROM nombreTabla ORDER BY columna ASC|DESC;
-- Agrupar resultados:
SELECT columna, COUNT(*) FROM nombreTabla GROUP BY columna;
-- Filtrar agrupaciones:
SELECT columna, COUNT(*) FROM nombreTabla GROUP BY columna HAVING COUNT(*) > 1;
-- Actualizar datos:
UPDATE nombreTabla SET columna = valor WHERE condición;
-- Eliminar datos:
DELETE FROM nombreTabla WHERE condición;
-- Borrar tabla:
DROP TABLE nombreTabla;
-- Borrar base de datos:
DROP DATABASE nombreBD;
-- Salir de MySQL:
EXIT;
-- Mostrar versión del servidor:
SELECT VERSION();
📌 Buenas prácticas y consejos
- Diseño: usa una tabla intermedia (por ejemplo, Contiene) para relaciones N:M entre Ordenador y Componente.
- Usuarios: Admin tiene todos los permisos; Empleado solo puede hacer
SELECTyDELETE. - Consultas:
INpara múltiples valoresBETWEENpara rangosGROUP BY+HAVINGpara agrupar y filtrarJOINpara combinar tablasANYoALLpara subconsultas con comparaciónLIMITpara obtener resultados concretos
💻 Ejemplo práctico: base de datos Hardware
CREATE DATABASE Hardware;
USE Hardware;
SELECT DATABASE();
SHOW TABLES;
1. Creación de tablas
CREATE TABLE Ordenador (
idOrdenador INT PRIMARY KEY,
modelo VARCHAR(50),
procesador VARCHAR(50),
memoria INT,
precio DECIMAL(10,2)
);
CREATE TABLE Componente (
idComponente INT PRIMARY KEY,
nombre VARCHAR(50),
paisFabricacion VARCHAR(50),
precio DECIMAL(10,2)
);
CREATE TABLE Contiene (
idOrdenador INT,
idComponente INT,
unidades INT,
PRIMARY KEY (idOrdenador, idComponente),
FOREIGN KEY (idOrdenador) REFERENCES Ordenador(idOrdenador),
FOREIGN KEY (idComponente) REFERENCES Componente(idComponente)
);
2. Usuarios
-- Admin con todos los permisos
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'admin123';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;
-- Empleado con permisos limitados
CREATE USER 'empleado'@'localhost' IDENTIFIED BY 'empleado123';
GRANT SELECT, DELETE ON Hardware.Ordenador TO 'empleado'@'localhost';
3. Consultas
-- Ordenadores i5 o i7 entre 500 y 1500 €
SELECT * FROM Ordenador
WHERE procesador IN ('I5', 'I7') AND precio BETWEEN 500 AND 1500;
-- Top 5 ordenadores más caros con i3 o i5
SELECT * FROM Ordenador
WHERE procesador IN ('I3', 'I5')
ORDER BY precio DESC
LIMIT 5;
-- Precio medio, máximo y mínimo de componentes (excluyendo Francia y Alemania)
SELECT paisFabricacion, AVG(precio), MAX(precio), MIN(precio)
FROM Componente
WHERE paisFabricacion NOT IN ('Francia', 'Alemania')
GROUP BY paisFabricacion;
-- Ordenador más caro con más de 16 GB de RAM
SELECT * FROM Ordenador
WHERE memoria > 16
ORDER BY precio DESC
LIMIT 1;
-- Modelo y procesador de ordenadores con algún componente de más de 2 unidades
SELECT DISTINCT modelo, procesador
FROM Ordenador o
JOIN Contiene c ON o.idOrdenador = c.idOrdenador
WHERE c.unidades > 2;
-- Unidades totales de componentes fabricados en Japón o Taiwán
SELECT c.idComponente, c.nombre, SUM(co.unidades) AS total
FROM Componente c
JOIN Contiene co ON c.idComponente = co.idComponente
WHERE paisFabricacion IN ('Japón', 'Taiwán')
GROUP BY c.idComponente, c.nombre;
-- Ordenadores con precio superior a cualquiera con procesador i7
SELECT * FROM Ordenador
WHERE precio > ANY (SELECT precio FROM Ordenador WHERE procesador = 'I7');
-- Nombre del componente y nº de ordenadores que lo contienen (si son más de 1)
SELECT c.nombre, COUNT(DISTINCT co.idOrdenador) AS cantidad
FROM Componente c
JOIN Contiene co ON c.idComponente = co.idComponente
GROUP BY c.idComponente, c.nombre
HAVING COUNT(DISTINCT co.idOrdenador) > 1;