Fundamentos

Crear una tabla

Define columnas, tipos de datos y restricciones con CREATE TABLE. Soporta PRIMARY KEY, NOT NULL, UNIQUE, DEFAULT, AUTO_INCREMENT, CHECK(...) y FOREIGN KEY ... REFERENCES ....

crear_tabla.sql
1CREATE TABLE usuarios (
2  id INTEGER PRIMARY KEY AUTO_INCREMENT,
3  nombre VARCHAR(50) NOT NULL,
4  email VARCHAR(100) NOT NULL UNIQUE,
5  activo BOOLEAN DEFAULT TRUE,
6  creado DATETIME DEFAULT CURRENT_TIMESTAMP
7);
✓ Tabla "usuarios" creada — 5 columnas
Si un tipo no está en la lista soportada (por ejemplo ENUM, SET, UUID, BIGINT), la tabla se crea igual pero esa columna se trata internamente como TEXT.
Fundamentos

Claves foráneas (FOREIGN KEY)

Relaciona una columna con la clave de otra tabla usando REFERENCES directamente en la columna, o FOREIGN KEY (...) REFERENCES ...(...) como restricción de tabla — ambas formas son equivalentes. La columna referenciada queda indexada automáticamente: los WHERE/JOIN sobre ella responden sin recorrer la tabla completa.

crear_tabla.sql
1-- Forma inline, junto a la columna
2CREATE TABLE pedidos (
3  id INTEGER PRIMARY KEY,
4  cliente_id INTEGER REFERENCES usuarios(id)
5);
✓ Tabla "pedidos" creada — índice automático en cliente_id
crear_tabla.sql
1-- Forma equivalente, como restricción de tabla
2CREATE TABLE pedidos (
3  id INTEGER PRIMARY KEY,
4  cliente_id INTEGER,
5  FOREIGN KEY (cliente_id) REFERENCES usuarios(id)
6);
✓ Tabla "pedidos" creada — índice automático en cliente_id
PRIMARY KEY y UNIQUE también crean su índice automáticamente, y ahora sí rechazan valores duplicados al hacer INSERT — antes se aceptaban en silencio.
Fundamentos

Tipos de datos

Estos son los tipos que el motor valida y soporta de forma nativa al crear una tabla.

TipoParámetrosEjemplo
INTEGER / INTNoedad INTEGER
REAL / FLOAT / DOUBLENoprecio FLOAT
DECIMAL / NUMERIC(precisión, escala)total DECIMAL(10,2)
VARCHAR / CHAR / STRING(tamaño)nombre VARCHAR(50)
TEXTNodescripcion TEXT
BOOLEAN / BOOLNoactivo BOOLEAN
DATENonacimiento DATE
DATETIME / TIMESTAMPNocreado DATETIME
TIMENohora_apertura TIME
BLOBNoarchivo BLOB
JSONNometadata JSON
ENUM, SET, UUID y BIGINT no están en la lista validada — se aceptan sin error, pero la columna se guarda como TEXT en la práctica. También se reconocen sinónimos de otros motores: VARCHAR2, NUMBER, TINYINT, MEDIUMINT.
Fundamentos

Insertar datos

Agrega filas nuevas con INSERT INTO. Puedes especificar columnas explícitas o insertar el resultado de un SELECT.

insertar.sql
1INSERT INTO usuarios (nombre, email)
2VALUES ('Ana López', 'ana@ejemplo.com');
✓ 1 fila insertada
Fundamentos

Actualizar y borrar

UPDATE modifica filas existentes; DELETE las elimina. Ambos aceptan WHERE — sin él, afectan a toda la tabla.

actualizar.sql
1UPDATE usuarios SET activo = FALSE WHERE id = 3;
✓ 1 fila actualizada
borrar.sql
1DELETE FROM usuarios WHERE activo = FALSE;
✓ 2 filas eliminadas
Consultas

SELECT y alias

Usa AS para renombrar columnas o tablas en el resultado. Los alias de tabla (como u) se usan para calificar columnas en consultas con varias tablas.

consulta.sql
1SELECT u.nombre AS cliente, u.email
2FROM usuarios u;
clienteemail
Ana Lópezana@ejemplo.com
Consultas

Filtrar con WHERE

Combina condiciones con AND / OR, usa IN, BETWEEN, LIKE e IS NULL / IS NOT NULL.

consulta.sql
1SELECT nombre FROM usuarios
2WHERE activo = TRUE AND edad > 18;
Consultas

Ordenar y limitar

ORDER BY (con ASC/DESC) define el orden; LIMIT y OFFSET paginan resultados.

consulta.sql
1SELECT nombre, edad FROM usuarios
2ORDER BY edad DESC LIMIT 5;
Consultas

Agrupar datos

GROUP BY agrupa filas para funciones agregadas (COUNT, SUM, AVG, MIN, MAX); HAVING filtra sobre esos grupos (a diferencia de WHERE, que filtra antes de agrupar).

consulta.sql
1SELECT categoria, COUNT(*) AS total
2FROM productos
3GROUP BY categoria HAVING COUNT(*) > 2;
categoriatotal
tech5
Consultas

JOIN entre tablas

Soporta INNER, LEFT [OUTER], RIGHT [OUTER], FULL [OUTER] y CROSS JOIN.

consulta.sql
1SELECT a.id, b.nombre
2FROM pedidos a
3INNER JOIN usuarios b ON a.usuario_id = b.id;
En este motor, ON es obligatorio para todos los tipos de JOIN — incluyendo CROSS JOIN (a diferencia del SQL estándar). Si necesitas un cruce sin condición, usa la sintaxis de coma: FROM t1 a, t2 b.
Consultas

Subconsultas

Puedes usar una subconsulta escalar (que devuelve un solo valor) dentro de WHERE.

consulta.sql
1SELECT nombre FROM usuarios
2WHERE id = (SELECT MAX(usuario_id) FROM pedidos);
Las subconsultas dentro de WHERE funcionan. Usar una subconsulta directamente como tabla en el FROM (por ejemplo FROM (SELECT ...) t) todavía no está soportado.
Funciones

COALESCE (en vez de NVL)

COALESCE(valor1, valor2, ...) devuelve el primer valor que no sea nulo. Es la función estándar ANSI SQL para esto.

consulta.sql
1SELECT nombre, COALESCE(telefono, 'Sin teléfono') AS contacto
2FROM usuarios;
NVL no está soportado por JsonSQL (es específico de Oracle). Usa COALESCE, que hace exactamente lo mismo y es estándar.
Funciones

CASE WHEN

Lógica condicional dentro de una consulta — como un if/else por fila.

consulta.sql
1SELECT nombre,
2  CASE WHEN edad < 18 THEN 'Menor'
3    WHEN edad < 65 THEN 'Adulto'
4    ELSE 'Adulto mayor'
5  END AS categoria
6FROM usuarios;
Funciones

Funciones de texto

Disponibles: UPPER, LOWER, TRIM, LENGTH, CHAR_LENGTH, SUBSTRING, REPLACE, CONCAT, POSITION.

consulta.sql
1SELECT UPPER(nombre), CONCAT(nombre, ' <', email, '>') AS etiqueta
2FROM usuarios;
Funciones

Funciones numéricas

Disponibles: ROUND, FLOOR, CEIL / CEILING, ABS, MOD, POWER, SQRT, EXP, LN, LOG.

consulta.sql
1SELECT nombre, ROUND(precio, 2) AS precio_final
2FROM productos;
Fechas

Manejo de fechas

Palabras clave sin paréntesis: CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, LOCALTIME, LOCALTIMESTAMP, SYSDATE. Funciones: NOW(), DATE(expr), TIME(expr), DATEDIFF(fecha1, fecha2), DATEADD(fecha, dias), TO_CHAR(fecha, formato), TO_DATE(texto[, formato]), TO_TIMESTAMP(...).

consulta.sql
1SELECT nombre, DATEDIFF(NOW(), fecha_registro) AS dias_registrado
2FROM usuarios;
Al insertar un valor de fecha como literal, usa el formato 'YYYY-MM-DD' (o 'YYYY-MM-DD HH:MM:SS' para DATETIME) — es el que se interpreta sin ambigüedad.
EXTRACT(...) y CAST(...) pasan la validación de sintaxis pero todavía no se evalúan (devuelven null). Evítalos por ahora — usa TO_CHAR/TO_DATE para conversiones de fecha.
Casos especiales

La tabla DUMMY

Una tabla interna de una sola fila, pensada para SELECT de valores constantes sin necesitar una tabla real — el mismo papel que cumple DUAL en Oracle.

consulta.sql
1SELECT 1 AS id, 'demo' AS nombre, NOW() AS fecha
2FROM dummy;
idnombrefecha
1demo2026-07-08 09:15:00
Casos especiales

UNION / UNION ALL

Combina el resultado de dos SELECT. UNION elimina duplicados; UNION ALL los conserva (y es más rápido).

consulta.sql
1SELECT nombre FROM clientes
2UNION ALL
3SELECT nombre FROM proveedores;
Casos especiales

CTE (WITH)

Una WITH define una consulta temporal con nombre, útil para dividir consultas complejas en pasos legibles.

consulta.sql
1WITH top_productos AS (
2  SELECT nombre, precio FROM productos
3  ORDER BY precio DESC LIMIT 3
4)
5SELECT * FROM top_productos;
Transacciones

COMMIT / ROLLBACK

Por defecto, todo INSERT/UPDATE/DELETE queda pendiente de confirmación. Usa COMMIT para hacerlo definitivo, o ROLLBACK para deshacerlo.

consulta.sql
1UPDATE productos SET precio = 999 WHERE id = 1;
🟠 Cambios sin confirmar
consulta.sql
1COMMIT;
✓ Cambios confirmados
Si te arrepientes antes de hacer COMMIT, ROLLBACK; deja la tabla exactamente como estaba.