Guía completa de SQL: Tablas, Consultas, Usuarios y Privilegios en MySQL

Informática6,73 KB

🔧 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 SELECT y DELETE.
  • Consultas:
    • IN para múltiples valores
    • BETWEEN para rangos
    • GROUP BY + HAVING para agrupar y filtrar
    • JOIN para combinar tablas
    • ANY o ALL para subconsultas con comparación
    • LIMIT para 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;

Descargar

PDF Word HTML