Capítulos
Ejercicios

ico SQL SQL
La persistencia del dato

Luis Felipe Ramírez Varela
https://luis.ramirez.cl
luis@ramirez.cl
luisfel

en construcción

Objetivo del capítulo:
Comprender el propósito y estructura general del lenguaje SQL, su utilidad para trabajar con bases de datos y cómo se organiza este manual.

 

Objetivo del capítulo:
Aprender a crear nuevas tablas en una base de datos, definiendo sus columnas, tipos de datos y restricciones.

 

Ejemplo:
CREATE TABLE `productos` (
  `id` int(6) NOT NULL,
  `nombre` varchar(50) NOT NULL DEFAULT '',
  `codigo` varchar(12) NOT NULL DEFAULT '',
  `categoria` varchar(20) NOT NULL DEFAULT '',
  `frase_promocional` varchar(250) NOT NULL DEFAULT '',
  `descripcion` text NOT NULL,
  `colores` set('rojo','verde','azul','negro') NOT NULL DEFAULT '',
  `precio` float NOT NULL DEFAULT '0',
  `disponibilidad` enum('1','0') NOT NULL DEFAULT '1',
  `promocion` enum('1','0') NOT NULL DEFAULT '0',
  `fecha` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Indices de la tabla `productos`
--
ALTER TABLE `productos`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `codigo` (`codigo`);

--
-- AUTO_INCREMENT de las tablas volcadas
--

--
-- AUTO_INCREMENT de la tabla `productos`
--
ALTER TABLE `productos`
  MODIFY `id` int(6) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=19;
COMMIT;

Objetivo del capítulo:
Conocer cómo insertar nuevos registros en una tabla, usando distintos formatos y técnicas para agregar datos.

Resumen:
INSERT INTO <tabla> (<campo/s>) VALUES (<valor/es>);
Ejemplo:
INSERT INTO `productos` (`id`, `nombre`, `codigo`, `categoria`, `frase_promocional`, `descripcion`, `colores`, `precio`, `disponibilidad`, `promocion`, `fecha`) 
VALUES (NULL, 'nombre', 'codigo', 'categoria', 'frase promociona', 'descripcio', 'rojo,verde', '12345678', '1', '1', NOW());
Ejemplo:
INSERT INTO `productos`  VALUES (NULL, 'nombre2', 'codigo2', 'categoria2', 'frase promociona2', 'descripcio2', 'rojo,verde', '123456782', '1', '1', NOW());
Ejemplo:
INSERT INTO `productos` (`id`, `nombre`, `codigo`, `categoria`, `frase_promocional`, `descripcion`, `colores`, `precio`, `disponibilidad`, `promocion`, `fecha`) VALUES
(1, 'Rayita Vertical', 'LFR100001RFL', 'verticales', 'La mejor rayita para las paredes vacías', 'Ponga una hermosa Rayita Vertical en cualquier sector de su casa!\r\n\r\nVivamus in velit ut metus porttitor lacinia. In porttitor suscipit tortor. Aliquam sit amet est eget velit venenatis consequat. Morbi convallis fermentum nunc. Vestibulum hendrerit. Donec congue velit vel ligula. Morbi nulla nisi, tincidunt at, volutpat aliquam, hendrerit nullam.', 'rojo,verde,azul', 1254, '1', '1', '2025-08-04 21:36:07'),
(2, 'Rayitas Superflex', '579000000975', 'curvas', 'Rayitas Curvas Super Flexibles', 'Únicas en el mercado, permiten envolver, retener y anidar sus objetos, sin ahorcarlos en el proceso. Vienen en dos tamaños, grande Superflex y pequeño Superflex.', 'rojo,verde,azul', 5000, '1', '0', '2025-08-04 21:36:07'),
(3, 'Rayita Horizontales Ommm', 'RPQ300003QPR', 'horizontales', 'El descanso hecho Rayita', 'Descanse y apoye todo cuanto desee en estas útiles, prácticas y ayudadoras Rayitas', 'rojo,azul,negro', 1500, '1', '0', '2025-08-04 21:36:07'),
(4, 'Rayitas Diagonales Woderflin', 'MPD100000DPM', 'diagonales', 'Ambiente sus espacios', 'La mejor opción del mercado: resistentes, diligentes y de gran aguante', 'rojo,negro', 2000, '1', '0', '2025-08-04 21:36:07'),
(5, 'Rayitas Curvas OH-QiDA2', 'MLDI0000IDLM', 'curvas', 'El riesgo y la emoción en Rayitas', 'Toda una revolución en Rayitas, se aconseja discreción al adquirirlas', 'negro', 1750, '1', '0', '2025-08-04 21:36:07'),
(6, 'Rayitas Punteadas Pare-Siga', 'FLMN0000NMLF', 'punteadas', 'Ideal para sus procesos productivos', 'Nada mejor en la aplicación de la misericordia laboral, optimiza a sus trabajadores', 'rojo,verde', 6000, '1', '0', '2025-08-04 21:36:07'),
(7, 'Rayitas Oblicuas Oli', 'PDDI0000IDDP', 'oblicuas', '"Lo" díscolo en Rayitas', 'El poder de la contradicción misma en Rayitas', 'rojo,verde,azul,negro', 3000, '1', '0', '2008-06-06 01:59:12'),
(8, 'Rayitas Verticales Akastoy', 'KGBAY00YABGK', 'verticales', 'Contención al mejor precio', 'Contención, apoyo y seguridad, son algunas virtudes de estas amables y robustas Rayitas, no se arrepentirá', 'rojo,negro', 2500, '1', '0', '2025-08-04 21:36:07'),
(9, 'Rayitas Horizontales ZZzzz', 'AHH000000HHA', 'horizontales', 'Su sueño hecho realidad', 'Consiga el sociego y el reposo que tanto busca en los más cómodos atributos', 'azul', 5480, '1', '0', '2008-06-06 01:59:48'),
(10, 'Rayitas Oblicuas Yupi', 'VRL000000LRV', 'oblicuas', 'Vaya de arriba para abajo sin complicaciones', 'Disfrute y regocíjese de los altos y bajos que tiene la vida, libérse de la rutina', 'rojo,verde,azul,negro', 3640, '1', '0', '2025-08-04 21:36:07'),
(11, 'Rayitas Diagonales PAY', 'UHF000000FHU', 'diagonales', 'Direccionales y Multifuncionales', 'No se puede perder esta oportunidad, con Rayitas Diagonales no perderá el rumbo', 'rojo,verde,azul', 1000, '1', '0', '2008-06-06 02:00:09'),
(12, 'Rayitas Punteadas AKsiAKno', 'PLOP0000POLP', 'punteadas', 'La maravillosa posibilidad de elegir', 'Con Rayitas Punteadas "AKsiAKno" se hace acreedor del reconfortante privilegio de la decisión, soporta indecisiones arbitrarias, ¿qué está esperando!', 'rojo,verde,azul,negro', 1245, '1', '0', '2025-08-04 21:36:07'),
(13, 'Rayitas Verticales Nostah', 'JLQD0000DQLJ', 'verticales', 'Ciérrele la puerta a los avatares', 'Póngale fin a los Turururus y avatares en su oficina, ¡qué ley de Murphy! Con Rayitas "Nostah" volverá la paz al su templo de la productividad', 'rojo,verde,azul,negro', 4750, '1', '0', '2025-08-04 21:36:07'),
(14, 'Rayitas Curvas Pegalawelta', 'OLP000000LPO', 'curvas', 'Haga un alto en el camino', 'Con Rayitas Curvas "Pegalawelta" podrá darse el lujo de indicar a sus congéneres la dirección de sus acciones, ¡no se la pierda!', 'rojo,verde,negro', 4251, '1', '0', '2025-08-04 21:36:07'),
(15, 'Rayitas Oblicuas PHP', 'LFLF0000FLFL', 'oblicuas', 'Descubre el programador que hay en ti', 'Déjate seducir por el poder de un lenguaje sublime e ilegible pero re-útil —dicen— de exportación', 'rojo,verde,negro', 2354, '1', '0', '2025-08-04 21:36:07'),
(16, 'Rayitas Horizontales OK', 'INBOX00XOBNI', 'horizontales', 'Haga suyas la leyes de Causa e Efecto', 'Incorpore ancestrales tecnologías con estas Rayitas "OK", asienta y disienta con total holgura, total, ¡no se aceptan devoluciones!', 'verde,azul', 6540, '1', '0', '2025-08-04 21:36:07'),
(17, 'Rayitas Diagonales CHUEK', 'DWE21234DES', 'diagonales', 'Un monumento inquietante', 'Haciendo gala de nuestra cultura, ponemos a vuestra disposición esta bella Rayita "CHUEK", ni proactiva, ni reactiva, sino que todo lo contrario, ¡consúltenos!', 'rojo,azul', 3500, '1', '0', '2025-08-04 21:36:07');

Objetivo del capítulo:
Entender cómo recuperar datos desde una o más tablas mediante consultas SELECT, aplicando filtros, ordenamientos y alias.

Resumen:
SELECT <campo/s> FROM <tabla> [WHERE] [GROUP BY] [ORDER BY] [LIMIT]

SELECT

Ejemplo:
SELECT nombre, codigo, precio FROM productos
Ejemplo:
SELECT * FROM productos

WHERE

Operadores de comparación
Operador Nombre
= Igual
<> Distinto
< Menor que
> Mayor que
<= Menor o igual
>= Mayor o igual
Ejemplo:
SELECT * FROM `productos` WHERE  id = 14
Operadores lógicos
Operador Título
AND Y
OR O
LIKE Parecido a
NOT No es
IN Está en
BETWEEN Entre medio de
IS NULL As nulo
Ejemplo:
SELECT * FROM productos WHERE categoria="horizontales" AND precio < 2000
Ejemplo:
SELECT * FROM `productos` WHERE id < 14 AND id > 2
Ejemplo:
SELECT * FROM `productos` WHERE id < 14 or codigo LIKE "%lfr%"
Ejemplo:
SELECT * FROM `productos` WHERE codigo LIKE "%lfr%"
Ejemplo:
SELECT * FROM `productos` WHERE id IN(1,3,4,5,7,9);

GROUP BY

Ejemplo:
SELECT categoria FROM productos GROUP BY categoria;

ORDER BY

Ejemplo:
SELECT * FROM productos ORDER BY nombre
Ejemplo:
SELECT * FROM productos WHERE categoria ="oblicuas" ORDER BY id DESC LIMIT 2

LIMIT

Ejemplo:
SELECT * FROM productos ORDER BY precio LIMIT 3
Ejemplo:
SELECT * FROM productos ORDER BY precio LIMIT 6,3

AS

Ejemplo:
SELECT t1.name, t2.salary FROM employee AS t1, info AS t2   WHERE
t1.name = t2.name;
Ejemplo:
SELECT productos.nombre AS estito, lacat.categoria FROM `productos`
LEFT JOIN categorias AS lacat ON productos.categoria_id=lacat.id

Objetivo del capítulo:
Aprender a modificar registros existentes en una tabla mediante la instrucción UPDATE, controlando el alcance con condiciones.

Resumen:
UPDATE <tabla> SET campo1=valor1, campo2=valor2 [WHERE]
Ejemplo:
UPDATE productos SET precio=1000
Ejemplo:
UPDATE productos SET precio=2000 WHERE id=2
Ejemplo:
 UPDATE productos SET precio=3000 WHERE id > 6
Ejemplo:
UPDATE productos SET precio=5000 WHERE categoria ="horizontales"
Ejemplo:
UPDATE productos SET precio=5000, nombre="estito" WHERE categoria ="horizontales"

Objetivo del capítulo:
Saber cómo eliminar uno o varios registros de una tabla con DELETE, aplicando condiciones para evitar errores.

Resumen:
DELETE FROM <tabla>  [WHERE];
Ejemplo:
DELETE FROM productos WHERE nombre="nombre3"

Objetivo del capítulo:
Comprender cómo combinar datos de varias tablas usando JOIN, explorando los distintos tipos y su utilidad en consultas complejas.

LEFT JOIN

Ejemplo:
SELECT productos.nombre, productos.codigo, categorias.categoria FROM `productos`
LEFT JOIN categorias ON productos.categoria_id=categorias.id
Ejemplo:
SELECT productos.nombre, productos.codigo, categorias.categoria FROM `productos`
LEFT JOIN categorias ON productos.categoria_id=categorias.id GROUP BY productos.categoria_id

RIGHT JOIN

Ejemplo:
SELECT c.nombre, p.producto
FROM clientes c
RIGHT JOIN pedidos p ON c.id = p.cliente_id;

Objetivo del capítulo:
Aprender a utilizar subconsultas (consultas dentro de otras consultas) para resolver problemas complejos o hacer filtros avanzados.

¿Qué es una subconsulta?

Una subconsulta es una instrucción SELECT que aparece dentro de otra instrucción SQL. Las subconsultas se usan para devolver valores que luego se utilizan como condición o datos en la consulta principal.

Tipos de subconsultas

En la cláusula WHERE

Permiten comparar un valor contra un conjunto de resultados.

Ejemplo:
SELECT nombre FROM productos
WHERE precio > (SELECT AVG(precio) FROM productos);

En la cláusula FROM

Permiten generar una tabla derivada temporal para consultar sobre ella.

Ejemplo:
SELECT categoria, promedio FROM (
  SELECT categoria, AVG(precio) AS promedio
  FROM productos
  GROUP BY categoria
) AS resumen;

En la cláusula SELECT

Permiten calcular un valor para cada fila o para todas.

Ejemplo:
SELECT nombre, (SELECT AVG(precio) FROM productos) AS precio_promedio
FROM productos;

Nota:
Las subconsultas pueden ser correlacionadas, es decir, depender de cada fila de la consulta principal.

Nota:
El rendimiento de subconsultas complejas puede ser inferior al de JOINs bien diseñados.

Objetivo del capítulo:
Explorar las funciones incorporadas en SQL (agregadas, de texto, de fecha y matemáticas) y cómo aplicarlas en consultas.

DISTINCT

Ejemplo:
SELECT DISTINCT categoria FROM productos;

CONCAT()

Ejemplo:
SELECT nombres, apellidos, CONCAT(apellidos,', ',nombres) as nombre_completo FROM clientes WHERE 1

COUNT()

Ejemplo:
SELECT *, COUNT(id) AS cantidad FROM `productos` GROUP BY categoria_id

COUNT(DISTINCT)

Ejemplo:
SELECT COUNT(DISTINCT categoria) AS categorias_unicas FROM productos;

MAX()

Ejemplo:
SELECT categoria, MAX(precio) AS precio_maximo FROM productos GROUP BY categoria;

MIN()

Ejemplo:
SELECT categoria, MIN(precio) AS precio_minimo FROM productos GROUP BY categoria;

AVG()

Ejemplo:
SELECT AVG(precio) AS precio_promedio FROM productos;

SUM()

Ejemplo:
SELECT categorias.categoria, SUM(precio) as suma FROM `productos` LEFT JOIN categorias ON productos.categoria_id=categorias.id GROUP BY categoria_id ORDER BY precio ASC

YEAR()

Ejemplo:
SELECT * FROM productos WHERE YEAR(fecha) = "2020"

MONTH()

Ejemplo:
SELECT * FROM productos WHERE MONTH(fecha) = "06"
Ejemplo:
SELECT * FROM uf WHERE year(fecha)=2020 AND month(fecha)=10

REPLACE()

Ejemplo:
UPDATE productos SET categoria_id=REPLACE(categoria_id,"verticales",1);

REVERSE()

Ejemplo:
SELECT nombre, reverse(nombre) AS alverre FROM productos;

IF()

Ejemplo:
IF(condition, value_if_true, value_if_false)
Ejemplo:
SELECT nombre, codigo, precio, if(precio > 5000,"revisar","está bien") AS estado FROM productos

Truncate

Ejemplo:
TRUNCATE TABLE `productos`

Objetivo del capítulo:
Entender qué son las vistas en SQL, para qué sirven y cómo se crean.

¿Qué es una vista?

Una vista es una consulta guardada con nombre, que puede usarse como si fuera una tabla. No almacena datos por sí misma, sino que representa una consulta que se ejecuta cada vez que se accede a la vista.

Beneficios de usar vistas

  • Seguridad: limitar el acceso a ciertos campos o filas.
  • Reutilización: evitar repetir consultas complejas.
  • Claridad: mostrar solo los datos necesarios para un contexto.

Ejemplo básico

Ejemplo:
CREATE VIEW productos_publicos AS
SELECT nombre, precio FROM productos WHERE promocion = '1';

Luego puedes consultar:

Consulta:
SELECT * FROM productos_publicos;

Vista con JOIN

Ejemplo:
CREATE VIEW productos_con_categoria AS
SELECT p.nombre, c.categoria
FROM productos p
LEFT JOIN categorias c ON p.categoria_id = c.id;

Consideraciones

  • Algunas bases de datos permiten vistas actualizables.
  • Para modificar una vista:
Modificar:
CREATE OR REPLACE VIEW productos_publicos AS ...
  • Para eliminarla:
Eliminar:
DROP VIEW productos_publicos;

Bibliografía

Webliografía