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 vs MySQL

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:

TablaDescripciónRegistros
clientesClientes de la tienda15
productosProductos disponibles29
categoriasCategorías de productos8
ordenesÓrdenes de compra25
detalle_ordenesProductos de cada orden55

Ejemplo: tabla clientes

idnombreemailciudadfecha_registro
1Juan Pérezjuan@mail.comBuenos Aires2023-01-15
2Ana Garcíaana@mail.comCórdoba2023-02-20
3Carlos Lópezcarlos@mail.comRosario2023-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;
Buena práctica

Evitá usar SELECT * en aplicaciones reales. Especificá las columnas que necesitás — es más rápido y más claro.

Probá el Ejemplo 1: SELECT básico

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

OperadorDescripciónEjemplo
=IgualWHERE estado = 'enviado'
!= / <>DiferenteWHERE estado != 'cancelado'
>Mayor queWHERE precio > 100
<Menor queWHERE stock < 10
BETWEENEntre valoresWHERE precio BETWEEN 20 AND 100
LIKEPatrón de textoWHERE nombre LIKE 'Juan%'
INEn una listaWHERE ciudad IN ('Córdoba', 'Rosario')
IS NULLSin valor asignadoWHERE 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;
Alias de tablas

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 vs HAVING

WHERE filtra filas individuales antes de agrupar. HAVING filtra grupos después de aplicar GROUP BY.

Probá el Ejemplo 4: GROUP BY y agregación

Modificar Datos

INSERT — Insertar registros

INSERT INTO clientes (nombre, email, ciudad, fecha_registro)
VALUES ('Lucía Romero', 'lucia@mail.com', 'Mendoza', '2025-01-10');
AUTO_INCREMENT

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;
Siempre usá WHERE en UPDATE

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 sin WHERE

DELETE FROM clientes; borra TODA la tabla. Una vez ejecutado no hay vuelta atrás sin un backup.

Tipos de Datos Comunes

TipoDescripciónEjemplo en tutorial_db
INTNúmero enteroid INT AUTO_INCREMENT
VARCHAR(n)Texto hasta n caracteresnombre VARCHAR(100)
TEXTTexto largodescripcion TEXT
DECIMAL(m,d)Decimal exactoprecio DECIMAL(10,2)
DATEFecha (YYYY-MM-DD)fecha_registro DATE
DATETIMEFecha y horacreado_en DATETIME
ENUMValor de una lista fijaestado ENUM('pendiente','enviado'...)
BOOLEANVerdadero/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);
?>
SQL Injection

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_registro en vez de fr
  • 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