- Operaciones de Consola MySQL
Para interactuar con un servidor MySQL desde la línea de comandos, se utilizan varios comandos esenciales:
- Iniciar sesión:
mysql -h <dirección_ip> -u <nombre_usuario> -p <contraseña>
- Cambiar contraseña de un usuario existente:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'nueva_contraseña';
- Salir de la sesión:
exit
- Iniciar el servicio MySQL (en Windows):
net start mysql
- Detener el servicio MySQL (en Windows):
net stop mysql
- Herramientas Cliente para MySQL
Además de la línea de comandos, existen herramientas gráficas que facilitan la administración y consulta de bases de datos MySQL:
- MySQL Workbench
- Navicat
- Comandos SQL Fundamentales
3.1. Gestión de Conexiones y Usaurios
- Establecer una nueva conexión (ej. en Workbench):
Nombre de Conexión:Un nombre descriptivo para identificar la conexión.Método:TCP/IP estándar.Hostname:La dirección del servidor MySQL (ej. 127.0.0.1 para local).Puerto:El puerto por defecto es 3306.
- Crear un nuevo usuario:
CREATE USER 'nombre_usuario'@'direccion_host' IDENTIFIED BY 'contraseña_segura';
- Otorgar permisos a un usuario:
GRANT ALL PRIVILEGES ON *.* TO 'nombre_usuario'@'%';
El carácter % indica que el usuario puede conectarse desde cualquier dirección IP.
3.2. Operaciones con Bases de Datos
- Crear una base de datos:
CREATE {DATABASE|SCHEMA} [IF NOT EXISTS] nombre_base_datos CHARACTER SET charset_name;
- Seleccionar una base de datos activa:
USE nombre_base_datos;
- Mostrar todas las bases de datos disponibles:
SHOW DATABASES;
- Ver la definición de creación de una base de datos:
SHOW CREATE DATABASE nombre_base_datos;
- Consultar la ruta de almacenamiento de los datos:
SHOW VARIABLES LIKE '%datadir%';
- Modificar el conjunto de caracteres de una base de datos:
ALTER DATABASE nombre_base_datos CHARACTER SET = nuevo_charset;
(Si se omite nombre_base_datos, se modifica la base de datos actual).
- Eliminar una base de datos:
DROP DATABASE [IF EXISTS] nombre_base_datos;
3.3. Gestión de Tablas
- Crear una tabla básica:
CREATE TABLE inventario (id_producto INT, nombre_producto VARCHAR(50));
- Crear una tabla con comentarios para las columnas:
CREATE TABLE articulos (
id_articulo INT,
nombre VARCHAR(100) COMMENT 'Nombre del artículo',
precio DECIMAL(10,2) COMMENT 'Precio unitario'
);
- Duplicar la estructura de una tabla existente:
CREATE TABLE copias_articulos LIKE articulos;
- Listar todas las tablas en la base de datos actual:
SHOW TABLES;
- Describir la estructura de una tabla:
DESCRIBE nombre_tabla; -- O DESC nombre_tabla;
- Ver la información completa de las columnas de una tabla (incluye comentarios):
SHOW FULL COLUMNS FROM nombre_tabla;
- Eliminar una tabla:
DROP TABLE [IF EXISTS] nombre_tabla;
- Renombrar una tabla:
ALTER TABLE nombre_anterior RENAME TO nombre_nuevo;
RENAME TABLE nombre_anterior TO nombre_nuevo;
- Añadir una nueva columna a una tabla:
ALTER TABLE inventario ADD stock INT NOT NULL DEFAULT 0;
ALTER TABLE inventario ADD (fecha_alta DATE, descripcion TEXT);
- Modificar las propiedades de una columna existente:
ALTER TABLE inventario MODIFY nombre_producto VARCHAR(150) NOT NULL;
- Cambiar el nombre y propiedades de una columna:
ALTER TABLE inventario CHANGE COLUMN stock cantidad_disponible INT DEFAULT 10;
- Eliminar una columna de una tabla:
ALTER TABLE inventario DROP COLUMN descripcion;
- Establecer una columna como clave primaria:
ALTER TABLE articulos ADD PRIMARY KEY(id_articulo);
3.4. Manipulación de Datos (DML)
- Insertar filas en una tabla:
CREATE TABLE usuarios (
id_usuario INT,
nombre VARCHAR(50),
edad INT,
genero CHAR(1),
ciudad VARCHAR(100)
);
INSERT INTO usuarios (id_usuario, nombre, genero) VALUES (1, 'Ana Pérez', 'F');
INSERT INTO usuarios VALUES (2, 'Carlos Ruiz', 25, 'M', 'Madrid');
INSERT INTO usuarios (id_usuario, nombre, edad) VALUES
(3, 'Marta Gómez', 30),
(4, 'Pedro Sanz', 22);
- Actualizar datos existentes:
INSERT INTO articulos VALUES (1, 'Teclado USB', 25.00), (2, 'Ratón Óptico', 15.00), (3, 'Monitor 24"', 150.00);
ALTER TABLE articulos ADD PRIMARY KEY(id_articulo);
UPDATE articulos SET precio = 27.50 WHERE id_articulo = 1;
UPDATE articulos SET nombre = 'Monitor LED 27"', precio = 180.00 WHERE id_articulo = 3;
- Eliminar filas de una tabla:
DELETE FROM usuarios WHERE id_usuario = 4;
- Eliminar todas las filas de una tabla (reinicia AUTO_INCREMENT):
TRUNCATE TABLE usuarios;
3.5. Consultas Básicas y Avanzadas (DQL)
- Consultar todas las columnas de una tabla:
SELECT * FROM articulos;
- Consultar columnas específicas:
SELECT nombre_producto, precio FROM inventario;
- Usar alias para tablas y columnas:
SELECT i.nombre_producto AS articulo, i.precio FROM inventario i;
- Eliminar filas duplicadas de los resultados:
SELECT DISTINCT ciudad FROM usuarios;
- Consultar con condiciones (cláusula WHERE):
SELECT * FROM articulos WHERE precio > 100;
- Limitar el número de resultados:
SELECT * FROM usuarios ORDER BY edad DESC LIMIT 5; -- Los primeros 5 resultados
SELECT * FROM usuarios ORDER BY edad ASC LIMIT 1, 1; -- El segundo resultado (índice 1, 1 fila)
SELECT * FROM usuarios ORDER BY edad DESC LIMIT 2, 3; -- 3 resultados a partir del tercero (índice 2)
3.6. Operaciones Aritméticas en Consultas
- Realizar cálculos directamente en la consulta:
SELECT id_articulo, precio, precio * 1.21 AS precio_con_iva FROM articulos;
3.7. Operadores de Comparación
Comunes: =, >, <, <=, >=, <> (o != para "diferente de").
- Rangos:
SELECT * FROM articulos WHERE precio BETWEEN 10 AND 50;
- Inclusión en un conjunto:
SELECT * FROM usuarios WHERE ciudad IN ('Madrid', 'Barcelona');
- Búsqueda de patrones (comodines % y _):
SELECT * FROM usuarios WHERE nombre LIKE '%ez%'; -- Nombres que contengan 'ez'
- Verificar valores nulos:
SELECT * FROM usuarios WHERE edad IS NULL;
3.8. Ordenación de Resultados (ORDER BY)
- Ordenar por una columna (ascendente por defecto):
SELECT nombre, edad FROM usuarios ORDER BY edad ASC;
- Ordenar de forma descendente:
SELECT nombre, edad FROM usuarios ORDER BY edad DESC;
- Ordenación combinada (primero por una columna, luego por otra):
SELECT * FROM usuarios ORDER BY ciudad ASC, edad DESC;
3.9. Funciones de Agregación
Se utilizan para realizar cálculos sobre un conjunto de filas:
COUNT(columna): Cuenta el número de filas no nulas en una columna.
SELECT COUNT(edad) FROM usuarios;
MAX(columna): Devuelve el valor máximo de una columna.
SELECT MAX(precio) FROM articulos;
MIN(columna): Devuelve el valor mínimo de una columna.
SELECT MIN(precio) FROM articulos;
SUM(columna): Calcula la suma de los valores de una columna numérica.
SELECT SUM(precio) FROM articulos WHERE id_articulo > 1;
AVG(columna): Calcula el promedio de los valores de una columna numérica.
SELECT AVG(edad) FROM usuarios WHERE genero = 'F';
3.10. Consultas Agrupadas (GROUP BY y HAVING)
Agrupa filas que tienen los mismos valores en columnas especificadas, permitiendo aplicar funciones de agregación a cada grupo.
- Agrupar por una columna y aplicar agregación:
SELECT genero, COUNT(id_usuario) AS total_usuarios FROM usuarios GROUP BY genero;
- Filtrar grupos con HAVING: Ejemplo: Obtener el género y el recuento de usuarios para aquellos géneros con más de 2 usuarios.
SELECT
genero, COUNT(id_usuario) AS total_usuarios
FROM
usuarios
GROUP BY genero
HAVING COUNT(id_usuario) > 2;
La cláusula WHERE filtra filas *antes* de la agrupación, mientras que HAVING filtra grupos *después* de la agrupación.
3.11. Limitación de Resultados (LIMIT y OFFSET)
Controla el número de filas retornadas por una consulta.
- Mostrar los primeros N resultados:
SELECT * FROM articulos LIMIT 5;
- Mostrar N resultados a partir de una posición inicial (offset):
SELECT * FROM usuarios LIMIT 10 OFFSET 3; -- Muestra 10 filas, empezando desde la 4ª (índice 3)
SELECT * FROM usuarios LIMIT 3, 10; -- Muestra 10 filas, empezando desde la 4ª (índice 3)
- Orden Lógico de Ejecución de Sentencias SQL
Aunque escribimos las sentencias en un orden, el motor de MySQL las procesa lógicamante en una secuencia específica:
-
FROM: Determina las tablas de origen, creando una "tabla virtual 1". -
WHERE: Filtra las filas de la "tabla virtual 1", produciendo la "tabla virtual 2". -
GROUP BY: Agrupa las filas de la "tabla virtual 2", generando la "tabla virtual 3". -
HAVING: Filtra los grupos de la "tabla virtual 3", resultando en la "tabla virtual 4". -
SELECT: Proyecta las columnas seleccionadas y realiza cálculos sobre la "tabla virtual 4", creando la "tabla virtual 5". -
DISTINCT: Elimina filas duplicadas de la "tabla virtual 5", dando lugar a la "tabla virtual 6". -
ORDER BY: Ordena las filas de la "tabla virtual 6", formando la "tabla virtual 7". -
LIMIT: Limita el número de filas de la "tabla virtual 7", produciendo el resultdao final. -
Restricciones (Constraints) SQL
Las restricciones aplican reglas a los datos de una tabla para garantizar su exactitud, validez e integridad.
5.1. Clave Primaria (PRIMARY KEY)
- Definición: Una columna o conjunto de columnas que identifica de forma única cada fila en una tabla.
- Características: Los valores deben ser únicos y no pueden ser nulos. Una tabla solo puede tener una clave primaria.
- Creación al definir la tabla:
CREATE TABLE productos (
id_producto INT PRIMARY KEY,
nombre VARCHAR(100),
categoria VARCHAR(50)
);
- Añadir a una tabla existente:
ALTER TABLE productos ADD PRIMARY KEY(id_producto);
- Clave primaria auto-incremental:
CREATE TABLE pedidos (
id_pedido INT PRIMARY KEY AUTO_INCREMENT,
fecha DATE,
id_cliente INT
);
INSERT INTO pedidos (fecha, id_cliente) VALUES ('2023-10-26', 101); -- id_pedido se asigna automáticamente
CREATE TABLE facturas (
id_factura INT PRIMARY KEY AUTO_INCREMENT,
monto DECIMAL(10,2)
) AUTO_INCREMENT = 1000; -- El primer id_factura será 1000
DELETE elimina filas y el contador AUTO_INCREMENT continúa desde el último valor. TRUNCATE TABLE resetea el contador AUTO_INCREMENT y elimina todas las filas.
5.2. Restricción NOT NULL
- Características: Garantiza que una columna no pueda contener valores nulos.
CREATE TABLE clientes (
id_cliente INT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
email VARCHAR(100)
);
5.3. Restricción UNIQUE
- Características: Asegura que todos los valores en una columna sean diferentes. Permite múltiples valores NULL.
CREATE TABLE empleados (
id_empleado INT PRIMARY KEY,
dni VARCHAR(20) UNIQUE,
nombre VARCHAR(100)
);
- Diferencia con PRIMARY KEY: La clave primaria es única y no nula; la restricción UNIQUE es única pero puede permitir nulos (aunque el estándar SQL dice que solo uno, MySQL permite varios). Una tabla solo puede tener una clave primaria, pero varias restricciones UNIQUE.
5.4. Valor por Defecto (DEFAULT)
- Definición: Asigna un valor predefinido a una columna si no se especifica uno durante la inserción.
CREATE TABLE tareas (
id_tarea INT PRIMARY KEY AUTO_INCREMENT,
descripcion TEXT,
estado VARCHAR(20) DEFAULT 'pendiente'
);
- Estructuras de Múltiples Tablas
El uso de múltiples tablas mejora la organización de los datos, la eficiencia, la coherencia y la escalabilidad del sistema.
6.1. Clave Foránea (FOREIGN KEY)
- Definición: Una columna (o conjunto de columnas) en una tabla que establece un enlace a la clave primaria de otra tabla. La tabla con la clave foránea es la "tabla hija" o "referenciante"; la tabla a la que apunta la clave foránea es la "tabla padre" o "referenciada".
- Función: Mantiene la integridad referencial entre tablas, asegurando que las relaciones entre los datos sean válidas.
- Creación al definir la tabla:
CREATE TABLE departamentos (
id_departamento INT PRIMARY KEY,
nombre_departamento VARCHAR(50)
);
CREATE TABLE empleados_dep (
id_empleado INT PRIMARY KEY,
nombre VARCHAR(100),
id_departamento INT,
CONSTRAINT fk_departamento
FOREIGN KEY (id_departamento)
REFERENCES departamentos(id_departamento)
);
- Añadir a una tabla existente:
ALTER TABLE empleados_dep
ADD CONSTRAINT fk_departamento_existente
FOREIGN KEY (id_departamento)
REFERENCES departamentos(id_departamento);
Para crear una clave foránea, la tabla padre y su clave primaria deben existir. Para insertar datos, primero se insertan en la tabla padre.
- Eliminar una clave foránea:
ALTER TABLE empleados_dep DROP FOREIGN KEY fk_departamento;
Para eliminar una tabla que es padre, primero se deben eliminar las claves foráneas que la referencian o las tablas hijas.
6.2. Consultas Multi-Tabla (JOINs)
Combinan filas de dos o más tablas basándose en una columna relacionada entre ellas.
-
**INNER JOIN (Unión Interna):**Retorna solo las filas cuando hay una coincidencia en ambas tablas según la condición especificada.
- Sintaxis implícita (antigua):
SELECT e.nombre, d.nombre_departamento FROM empleados_dep e, departamentos d WHERE e.id_departamento = d.id_departamento; -
Sintaxis explícita (preferida):
SELECT e.nombre, d.nombre_departamento
FROM empleados_dep e
INNER JOIN departamentos d ON e.id_departamento = d.id_departamento;
- **OUTER JOIN (Unión Externa):**Retorna todas las filas de una de las tablas, y las filas coincidentes de la otra. Si no hay coincidencia, devuelve NULL para las columnas de la tabla sin coincidencia.
- **LEFT JOIN (o LEFT OUTER JOIN):**Retorna todas las filas de la tabla izquierda, y las filas coincidentes de la derecha. Si no hay coincidencia a la derecha, NULL.
```
SELECT d.nombre_departamento, e.nombre
FROM departamentos d
LEFT JOIN empleados_dep e ON d.id_departamento = e.id_departamento;
```
- **RIGHT JOIN (o RIGHT OUTER JOIN):**Retorna todas las filas de la tabla derecha, y las filas coincidentes de la izquierda. Si no hay coincidencia a la izquierda, NULL.
6.3. Subconsultas (Subqueries)
Una consulta anidada dentro de otra consulta SQL. La subconsulta se ejecuta primero y su resultado es utilizado por la consulta externa.
-
**Subconsultas en la cláusula FROM (tablas derivadas):**El resultado de una subconsulta se trata como una tabla temporal.
Ejemplo: Contar el número de empleados masculinos por departamento.
SELECT d.nombre_departamento, COUNT(temp_e.id_empleado) AS total_hombres FROM departamentos d INNER JOIN (SELECT id_empleado, id_departamento FROM empleados_dep WHERE genero = 'M') AS temp_e ON d.id_departamento = temp_e.id_departamento GROUP BY d.nombre_departamento; -
**Subconsultas con IN/NOT IN:**El resultado de la subconsulta es una lista de valores para filtrar en la cláusula WHERE.
SELECT nombre FROM empleados_dep WHERE id_departamento IN (SELECT id_departamento FROM departamentos WHERE nombre_departamento = 'Ventas'); -
**Subconsultas escalares (en la cláusula WHERE o SELECT):**La subconsulta devuelve un único valor (una fila, una columna) que se utiliza en una comparación.
SELECT nombre, precio FROM articulos WHERE precio > (SELECT AVG(precio) FROM articulos);