MySQL Básico
Aprendé a consultar y manipular bases de datos relacionales con MySQL, el motor de base de datos más usado del mundo y el que usa XAMPP.
¿Qué es MySQL?
MySQL es un sistema gestor de bases de datos relacionales (RDBMS). Organiza la información en tablas con filas y columnas. Para comunicarse con MySQL usamos SQL (Structured Query Language).
-- Consultar todos los clientes de la tienda
SELECT * FROM clientes;
SQL es el lenguaje. MySQL es el motor que lo interpreta. Es la misma diferencia que entre JavaScript (lenguaje) y el navegador (motor que lo ejecuta).
Estructura de una Base de Datos
Una base de datos organiza la información en distintos niveles:
Base de Datos
tutorial_db
Contenedor principal que agrupa las tablas
Tabla
clientes, productos...
Organiza datos en filas y columnas
Fila (Registro)
1, 'Juan Pérez', ...
Un registro individual de datos
Columna (Campo)
nombre, email, ciudad
Un atributo específico de cada registro
La base de datos que usamos
En este tutorial trabajamos con tutorial_db, una tienda online:
| Tabla | Descripción | Registros |
|---|---|---|
clientes | Clientes de la tienda | 15 |
productos | Productos disponibles | 29 |
categorias | Categorías de productos | 8 |
ordenes | Órdenes de compra | 25 |
detalle_ordenes | Productos de cada orden | 55 |
Ejemplo: tabla clientes
| id | nombre | ciudad | fecha_registro | |
|---|---|---|---|---|
| 1 | Juan Pérez | juan@mail.com | Buenos Aires | 2023-01-15 |
| 2 | Ana García | ana@mail.com | Córdoba | 2023-02-20 |
| 3 | Carlos López | carlos@mail.com | Rosario | 2023-03-10 |
SELECT — Consultar Datos
El comando más usado en SQL. Sirve para leer datos de una tabla.
Seleccionar todo
-- El asterisco significa "todas las columnas"
SELECT * FROM clientes;
Seleccionar columnas específicas
-- Solo algunas columnas (más eficiente)
SELECT nombre, ciudad FROM clientes;
Usar alias (AS)
-- Renombrar columnas en el resultado
SELECT nombre AS cliente, precio AS precio_unitario
FROM productos;
Evitá usar SELECT * en aplicaciones reales. Especificá las columnas que necesitás — es más rápido y más claro.
WHERE — Filtrar Resultados
Permite traer solo los registros que cumplen una condición.
-- Productos con precio mayor a $50
SELECT nombre, precio FROM productos WHERE precio > 50;
-- Clientes de Buenos Aires
SELECT nombre, ciudad FROM clientes WHERE ciudad = 'Buenos Aires';
-- Órdenes entregadas
SELECT * FROM ordenes WHERE estado = 'entregado';
Operadores de comparación
| Operador | Descripción | Ejemplo |
|---|---|---|
= | Igual | WHERE estado = 'enviado' |
!= / <> | Diferente | WHERE estado != 'cancelado' |
> | Mayor que | WHERE precio > 100 |
< | Menor que | WHERE stock < 10 |
BETWEEN | Entre valores | WHERE precio BETWEEN 20 AND 100 |
LIKE | Patrón de texto | WHERE nombre LIKE 'Juan%' |
IN | En una lista | WHERE ciudad IN ('Córdoba', 'Rosario') |
IS NULL | Sin valor asignado | WHERE email IS NULL |
Operadores lógicos
-- AND: ambas condiciones se cumplen
SELECT * FROM productos WHERE precio > 50 AND stock > 20;
-- OR: al menos una condición se cumple
SELECT * FROM clientes WHERE ciudad = 'Buenos Aires' OR ciudad = 'Córdoba';
-- NOT: negación
SELECT * FROM ordenes WHERE NOT estado = 'cancelado';
ORDER BY y LIMIT
-- Productos más caros primero
SELECT nombre, precio FROM productos ORDER BY precio DESC;
-- Los 5 productos más baratos
SELECT nombre, precio FROM productos ORDER BY precio ASC LIMIT 5;
Probá el Ejemplo 2: WHERE y ORDER BY
JOIN — Combinar Tablas
Las bases de datos relacionales dividen la información en múltiples tablas para evitar repetición. JOIN las une en una sola consulta.
La tabla ordenes guarda el id_cliente pero no el nombre.
Con JOIN combinamos ambas tablas para obtenerlo.
-- INNER JOIN: trae solo las filas que coinciden en ambas tablas
SELECT
o.id AS nro_orden,
c.nombre AS cliente,
o.fecha,
o.estado,
o.total
FROM ordenes o
JOIN clientes c ON o.id_cliente = c.id;
FROM ordenes o le da el alias o a la tabla. Así en vez de escribir ordenes.id escribís o.id — mucho más cómodo cuando tenés varias tablas.
JOIN con tres tablas
-- Qué productos tiene cada orden
SELECT
o.id AS orden,
c.nombre AS cliente,
p.nombre AS producto,
d.cantidad,
d.precio_unitario
FROM detalle_ordenes d
JOIN ordenes o ON d.id_orden = o.id
JOIN clientes c ON o.id_cliente = c.id
JOIN productos p ON d.id_producto = p.id
ORDER BY o.id;
Probá el Ejemplo 3: JOIN entre tablas
Funciones de Agregación
Calculan un resultado a partir de múltiples filas.
-- Contar registros
SELECT COUNT(*) FROM clientes;
SELECT COUNT(*) FROM ordenes WHERE estado = 'entregado';
-- Suma total de ventas
SELECT SUM(total) FROM ordenes;
-- Precio promedio de productos
SELECT ROUND(AVG(precio), 2) AS precio_promedio FROM productos;
-- Producto más caro y más barato
SELECT MAX(precio) AS mas_caro, MIN(precio) AS mas_barato FROM productos;
GROUP BY
Agrupa resultados y aplica funciones de agregación por grupo.
-- Cuántos productos hay por categoría
SELECT
c.nombre AS categoria,
COUNT(p.id) AS cantidad
FROM productos p
JOIN categorias c ON p.id_categoria = c.id
GROUP BY c.id, c.nombre
ORDER BY cantidad DESC;
HAVING — Filtrar grupos
-- Categorías con más de 3 productos
SELECT
c.nombre AS categoria,
COUNT(p.id) AS cantidad
FROM productos p
JOIN categorias c ON p.id_categoria = c.id
GROUP BY c.id, c.nombre
HAVING cantidad > 3
ORDER BY cantidad DESC;
WHERE filtra filas individuales antes de agrupar. HAVING filtra grupos después de aplicar GROUP BY.
Modificar Datos
INSERT — Insertar registros
INSERT INTO clientes (nombre, email, ciudad, fecha_registro)
VALUES ('Lucía Romero', 'lucia@mail.com', 'Mendoza', '2025-01-10');
No incluyas el campo id en el INSERT si es AUTO_INCREMENT. MySQL lo genera automáticamente.
UPDATE — Actualizar registros
-- Actualizar la ciudad de un cliente
UPDATE clientes SET ciudad = 'Rosario' WHERE id = 3;
-- Aumentar 10% el precio de electrónica
UPDATE productos SET precio = precio * 1.10 WHERE id_categoria = 1;
UPDATE clientes SET ciudad = 'Rosario' sin WHERE actualiza TODOS los registros. Siempre verificá tu condición.
DELETE — Eliminar registros
-- Eliminar un cliente específico
DELETE FROM clientes WHERE id = 15;
-- Eliminar órdenes canceladas
DELETE FROM ordenes WHERE estado = 'cancelado';
DELETE FROM clientes; borra TODA la tabla. Una vez ejecutado no hay vuelta atrás sin un backup.
Tipos de Datos Comunes
| Tipo | Descripción | Ejemplo en tutorial_db |
|---|---|---|
INT | Número entero | id INT AUTO_INCREMENT |
VARCHAR(n) | Texto hasta n caracteres | nombre VARCHAR(100) |
TEXT | Texto largo | descripcion TEXT |
DECIMAL(m,d) | Decimal exacto | precio DECIMAL(10,2) |
DATE | Fecha (YYYY-MM-DD) | fecha_registro DATE |
DATETIME | Fecha y hora | creado_en DATETIME |
ENUM | Valor de una lista fija | estado ENUM('pendiente','enviado'...) |
BOOLEAN | Verdadero/Falso (0/1) | activo BOOLEAN |
Conectar MySQL desde PHP
Una vez que dominás SQL, podés usarlo desde PHP para construir aplicaciones dinámicas:
<?php
// 1. Conectar a la base de datos
$conexion = mysqli_connect("localhost", "root", "", "tutorial_db");
if (!$conexion) {
die("Error: " . mysqli_connect_error());
}
// 2. Ejecutar un SELECT
$sql = "SELECT nombre, ciudad FROM clientes ORDER BY nombre";
$resultado = mysqli_query($conexion, $sql);
// 3. Recorrer los resultados
while ($fila = mysqli_fetch_assoc($resultado)) {
echo $fila['nombre'] . " — " . $fila['ciudad'] . "<br>";
}
// 4. Cerrar conexión
mysqli_close($conexion);
?>
Nunca insertes datos del usuario directamente en una query. Usá prepared statements con mysqli_prepare() para proteger tu aplicación.
Buenas Prácticas
- Siempre usá WHERE en UPDATE y DELETE: sin él afectás toda la tabla
- Nombres descriptivos en minúsculas:
fecha_registroen vez defr - PRIMARY KEY en todas las tablas: generalmente un
id INT AUTO_INCREMENT - FOREIGN KEY para relacionar tablas: garantizan integridad referencial
- Especificá columnas en SELECT: evitá
SELECT *en producción - Hacé backups regularmente:
mysqldump -u root tutorial_db > backup.sql - Usá prepared statements desde PHP: previenen SQL Injection