SQL

SQL (Fundamentos) — MySQL / MariaDB

Base necesaria para construir consultas y resolver un CRUD en aplicaciones web.

1) ¿Qué es SQL?

SQL (Structured Query Language) es el lenguaje estándar para consultar y manipular información en una base de datos relacional.

Hay distintos motores (MySQL, MariaDB, PostgreSQL, SQL Server). En la web es muy común trabajar con MySQL/MariaDB. La sintaxis base es muy parecida entre motores, pero puede haber diferencias en detalles.

Conceptos base

Idea clave: SQL se divide en dos necesidades comunes: definir la estructura de las tablas (DDL) y trabajar con los datos (DML).

2) CRUD

CRUD son las 4 operaciones básicas para manejar datos:

Regla de seguridad: Antes de ejecutar UPDATE o DELETE, prueba el WHERE con un SELECT.

3) SELECT (leer datos)

Sintaxis base:

SELECT columna1, columna2
FROM tabla;

Ejemplo:

SELECT nombre, correo
FROM usuarios;

SELECT * trae todas las columnas:

SELECT *
FROM usuarios;

WHERE (filtrar)

SELECT id, nombre, edad
FROM usuarios
WHERE activo = 1 AND edad >= 18;

LIKE para buscar texto:

SELECT id, nombre
FROM usuarios
WHERE nombre LIKE 'Al%';   -- empieza con Al

SELECT id, nombre
FROM usuarios
WHERE nombre LIKE '%art%'; -- contiene art

IN para varios valores:

SELECT id, nombre
FROM usuarios
WHERE id IN (1, 3, 7);

ORDER BY y LIMIT

SELECT id, nombre
FROM usuarios
WHERE activo = 1
ORDER BY id DESC
LIMIT 10;

AS (alias)

Sirve para renombrar columnas en el resultado (no cambia la tabla real):

SELECT nombre AS NombreCompleto, correo AS Email
FROM usuarios;

4) INSERT, UPDATE, DELETE

INSERT

INSERT INTO usuarios (nombre, correo, edad, activo)
VALUES ('Ana', 'ana@mail.com', 20, 1);

UPDATE

UPDATE usuarios
SET edad = 21
WHERE id = 5;

DELETE

DELETE FROM usuarios
WHERE id = 5;
Recomendación: en sistemas reales, a veces se usa “borrado lógico” (ej. activo = 0) en lugar de borrar físicamente.

5) CREATE TABLE (crear tablas en MySQL)

CREATE TABLE define la estructura de una tabla: columnas, tipos de dato, llaves y reglas.

CREATE TABLE usuarios (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  nombre VARCHAR(120) NOT NULL,
  correo VARCHAR(150) NOT NULL UNIQUE,
  edad TINYINT UNSIGNED,
  activo TINYINT(1) NOT NULL DEFAULT 1,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Tipos comunes en MySQL: INT, VARCHAR(n), TEXT, DECIMAL(10,2), DATE, DATETIME, TIMESTAMP, TINYINT(1).

6) ALTER TABLE (modificar tablas)

Agregar una columna:

ALTER TABLE usuarios
ADD COLUMN telefono VARCHAR(20) NULL;

Agregar una columna con valor por defecto:

ALTER TABLE usuarios
ADD COLUMN rol VARCHAR(30) NOT NULL DEFAULT 'alumno';

Modificar tipo de dato de una columna:

ALTER TABLE usuarios
MODIFY COLUMN nombre VARCHAR(180) NOT NULL;

Renombrar una columna (MySQL 8+):

ALTER TABLE usuarios
RENAME COLUMN correo TO email;

7) Ejercicios

Resuelve cada ejercicio escribiendo la consulta. Luego revisa la respuesta.

Ejercicio 1: En usuarios, muestra id, nombre y edad de usuarios con edad >= 18, ordenados por edad de mayor a menor.

SELECT id, nombre, edad
FROM usuarios
WHERE edad >= 18
ORDER BY edad DESC;

Ejercicio 2: En productos, muestra nombre y precio usando alias: Producto y PrecioMXN.

SELECT nombre AS Producto, precio AS PrecioMXN
FROM productos;

Ejercicio 3: Inserta un producto en productos con: nombre = "Mouse", precio = 199.00, stock = 15.

INSERT INTO productos (nombre, precio, stock)
VALUES ('Mouse', 199.00, 15);

Ejercicio 4: Actualiza usuarios para poner activo = 0 al registro cuyo correo sea "ana@mail.com".

UPDATE usuarios
SET activo = 0
WHERE correo = 'ana@mail.com';

Ejercicio 5: Crea una tabla llamada tareas con: id autoincrement primary key, titulo varchar(120) not null, puntos tinyint unsigned not null default 10, activo tinyint(1) default 1.

CREATE TABLE tareas (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  titulo VARCHAR(120) NOT NULL,
  puntos TINYINT UNSIGNED NOT NULL DEFAULT 10,
  activo TINYINT(1) NOT NULL DEFAULT 1
);

Ejercicio 6: A la tabla tareas, agrega una columna fecha_entrega tipo DATE que pueda ser NULL.

ALTER TABLE tareas
ADD COLUMN fecha_entrega DATE NULL;
Disciplina recomendada:
1) Primero arma el SELECT con el WHERE correcto.
2) Luego aplica ese mismo WHERE en UPDATE o DELETE.