SQL - de Lo Básico A Lo Complejo
SQL - de Lo Básico A Lo Complejo
Comentarios preliminares
Si bien es cierto que herramientas como Excel cumplen con los requerimientos
básicos para manejar datos en la mayoría de las empresas, poco ha poco, y
1. Queries
USE, SELECT, FROM
Seleccionar la librería de datos, seleccionar las columnas indicadas (incluyendo
una nueva calculada), desde la tabla de ventas.
Use datos;
SELECT clave_productos, fecha, venta, venta*1.16 AS venta_iva
FROM ventas
AND/OR
WHERE NOT
Muestra todo lo que “no es” según lo especificado.
En este caso se específica que traiga todo lo que no es pizza, además que el
ID_local sea 2
o que las ventas sean mayores a 1000.
IN
Selecciona los valores especificados entre ().
SELECT *
FROM ventas
SELECT *
FROM ventas
WHERE clave_producto IN ("pzz", "brr", "qsd")
BETWEEN
Selecciona valores dentro de un rango.
SELECT *
FROM ventas
WHERE venta BETWEEN 1000 AND 2000
LIKE
SELECT *
FROM ventas
WHERE clave_producto LIKE "%z"
SELECT *
FROM empleados
WHERE apellido REGEXP "^ez|iz|za$"
ORDER BY
SELECT *
FROM empleados
ORDER BY apellido
IS NULL
Muestra todos los resultados para cuando el domicilio de la tabla empleados es
nulo.
SELECT *
FROM empleados
IS NOT NULL
Muestra todos los valores en donde domicilio de la tabla empleados no es nulo.
SELECT *
FROM empleados
WHERE domicilio IS NOT NULL
LIMIT
Limita la cantidad de resultados a un número.
LIMIT 5,9 muestra los 9 registros siguientes luego del quinto.
SELECT *
FROM
LIMIT 5
USING
Using sirve para hacer un JOIN entre tablas cuyas columnas en común tienen el
mismo nombre.
SELECT *
FROM ventas v
JOIN local l
USING(ID_local);
UNION
SELECT Producto
FROM productos
UNION
SELECT ingredientes
FROM ingredientes;
El resultado es una sola columna con todos los productos seguido de todos
los ingredientes.
2. Subqueries
Subquery básica
Primero se corre el subquery, en este caso es un valor de 32.09. Luego busca los
valores que sean mayores a este valor y así completa el query.
UPDATE historico_ventas
SET venta= venta*1.16
WHERE ID_local=
(SELECT ID_local
FROM local
WHERE letra_zona="D");
UPDATE historico_ventas
SET venta= venta*1.16
WHERE ID_local IN
(SELECT ID_local
FROM local
WHERE letra_zona IN ("D","C"));
Subquery + IN
Muestra toda la información de la tabla empleados para cada empleado, haciendo
uso del subquery para buscar primero por valores únicos de venta_empleado.
SELECT *
FROM empleados
WHERE id_empleado IN (
SELECT *
FROM cientes
WHERE ID_cliente IN (
SELECT v.ID_cliente
FROM ventas v
JOIN producto p USING (ID_producto)
WHERE p.producto = "remates" AND Fecha_venta BETWEEN "2016-01-01" AN
ORDER BY ID_cliente ASC
JOIN vs Subquery
Un subquery no permite hacer consultas de valores nulos por lo que es necesario
hacer JOINs.
SELECT *
FROM empleados e
LEFT JOIN ventas v
ON v.venta_empleado = e.ID_empleado
WHERE v.ventas_id IS NULL
ALL
Toma en cuenta todos los datos de una columna en una consulta.
Se usa para comparar el valor de una lista contra el valor máximo de otra lista.
Por ejemplo buscar la edad de un alumno que sea mayor a ALL maestros.
Trae la edad del alumno mayor al MAX de los maestros.
Cambia dependiendo de >< por lo que puede traer el valor mayor o menor de
una lista.
Busca el valor MAX en la tabla ventas donde el ID_local sea = 2 y luego trae toda
la información en donde la venta sea mayor al valor buscado anteriormente (el
MAX).
Otro ejemplo sería el siguiente en donde se busca el valor máximo en la tabla
ventas en donde el ID_local=4 y luego trae todo lo que sea menor al valor mínimo
encontrado anteriormente.
SELECT *
FROM ventas
WHERE venta < ALL(
SELECT venta
FROM ventas
WHERE ID_local = 4);
ANY
Toma en cuenta todos los datos de una columna en una consulta para comparar lo
que haya en una tabla contra cualquier valor de otra. Por ejemplo, devolver todos
los alumnos cuya edad es mayor a la de cualquier maestro.
SELECT *
FROM ventas
WHERE ventas > ANY (
SELECT venta
FROM ventas
WHERE id_local = 2);
Queries Correlacionados
SELECT *
FROM ventas v
WHERE ventas > (
SELECT AVG(Venta)
FROM ventas
WHERE Id_local= v.id_local)
Muestra todas las ventas mayores al promedio de las ventas para cada local.
EXIST
Operador lógico que se utiliza para determinar si una subconsulta devuelve algún
resultado o no.
SELECT *
FROM empleados e
WHERE EXISTS(
SELECT venta_empleado
FROM ventas
WHERE venta_empleado = e.ID_empleado);
Muestra todos los empleados que realizaron una venta. Si se agrega un WHERE
NOT EXISTS entonces muestra los empleados que no vendieron nada.
SELECT*
FROM producto
WHERE ID_producto NOT IN (
SELECT ID_producto
FROM ventas
WHERE fecha_venta BETWEEN "2017-03-01" AND "2017-03-31");
Nótese que básicamente son dos queries aparte que se unen. El primero busca
traer todo de la tabla producto cuando el ID_producto no esté en el resultado de
otro query: ID_producto de la tabla ventas en donde la fecha esté entre el 1 y 31 de
marzo 2017. Así muestra la información de los productos que no se vendieron
durante este periodo.
SELECT
ventas_id,
venta,
(SELECT AVG(venta) FROM ventas) AS promedio_venta,
venta - (SELECT promedio_venta
FROM ventas;
SELECT*
FROM (SELECT ventas_id, venta,
(SELECT AVG(venta) FROM ventas) AS promedioventa,
venta-(SELECT promedioventa) FROM ventas AS promedio
WHERE delta >100
3. JOINS
JOIN en multiples tablas
SELECT *
FROM ventas v
JOIN local l
ON v.ID_local = l.ID_local
JOIN empleados e
ON v.venta_empleado = ID_empleado
Une la tabla ventas por medio del v.ID_local con la tabla local por medio de
l.ID_local.
Luego une también la tabla empleados por medio de v.venta_empleado y
ID_empleado
SELF JOIN
Combina registros de una misma tabla utilizando alias, lo que permite relacionar
datos entre sí
para consultas más complejas y comparaciones internas.
SELECT
e.ID_Empleado,
e.Nombre,
e.ID_Gerente
p.Nombre AS gerente
FROM empleados e
LEFT JOIN empleados p
ON e.ID_Gerente = p.ID_Empleado
CROSS JOIN
Imaginemos dos conjuntos de datos, uno llamado "A" y otro llamado "B". Estos
conjuntos de datos no tienen una columna en común para relacionarse
directamente.
El CROSS JOIN (producto cartesiano) combina cada fila de la tabla "A" con cada
fila de la tabla "B".
Es decir, cada fila de "A" se combinará con todas las filas de "B", creando un
conjunto de resultados que es el resultado de todas las posibles combinaciones
entre las filas de ambos conjuntos de datos.
JOIN NATURAL
Une tablas que cuyas columnas en común comparten el mismo nombre. Es similar
o igual a USING. No se recomienda porque es mejor ser explícito.
SELECT *
FROM ventas v
NATURAL JOIN empleados e;
4. Funciones de SQL
Funciones numéricas
https://dev.mysql.com/doc/refman/8.0/en/numeric-
functions.html
ROUND (redondear)
SELECT(2.4567,2);
SELECT TRUNCATE(2.3789,1);
SELECT FLOOR(2.3413);
SELECT ABS(-5);
SELECT RAND()*100;
SELECT TRUNCATE(RAND()*100,0);
Funciones STRING
https://dev.mysql.com/doc/refman/8.0/en/string-
functions.html
LENGTH (muestra la cantidad de caracteres incluye espacios)
SELECT RIGHT("ejemplo",3);
SELECT SUBSTRING("ejemplo",2,4);
El resultado sería: 2
Otro ejempo es el siguiente:
SELECT REPLACE("ejemplo","jemplo","xample");
SELECT NOW();
SELECT CURDATE();
SELECT CURTIME();
SELECT YEAR(NOW());
SELECT MONTH(NOW());
SELECT DAY(NOW());
SELECT MINUTE(NOW());
SELECT SECOND(NOW(9);
SELECT DAYNAME(NOW());
SELEC MONTHNAME(NOW());
El resultado sería el número de día. Lo mismo aplica para EXTRACT con MONTH o
YEAR.
SELECT *, CASE
WHEN venta > 1300 THEN "Bono grande"
WHEN venta > 1000 THEN "Bono medio"
WHEN venta > 500 THEN "Bono pequeño"
ELSE "Ponle ganas"
END AS BONO
FROM ventas;
UPDATE ingredientes
SET Ingredientes = "Pina", clave_ingrediente = "pin"
Luego hay que hacer Refresh en la sección de Schemas para poder ver la
tabla nueva.
6. Agregaciones
MAX
Trae el valor máximo de las ventas como Venta_maxima, la venta por empleado y
la fecha.
SUM
Muestra la suma de todas las ventas como total_ventas
COUNT
Muestra la cantidad de ventas. COUNT NO CUENTA LOS VALORES "NULL".
COUNT DISTINCT
AVERAGE
Muestra el monto promedio de todas las ventas.
SELECT AVG(venta)
FROM ventas;
GROUP BY
Muestra la suma de las ventas para cada local. Si no se pone el GROUP BY solo
muestra el primer valor de los ID (no sirve de nada) y lo mismo pasaría si no se
usan agregaciones, por ejemplo venta en lugar de SUM(venta).
SELECT SUM(venta),ID_local
FROM ventas
GROUP BY ID_local
HAVING
Es un filtro que se usa para sustituir a WHERE cuando se usen agregaciones en
SELECT. Se usa después de un GROUP BY.
WITH ROLLUP
Muestra las ventas totales por local desglozada por clave producto y al final la
suma para el local.
7. Atributos de columnas
Atributos de Columna
PK: primary key
NN: not null, si se marca no se permite que hayn valores null. Sirve con PK.
ZF: Zero Fill uprellena los valores con 0 si el tipo de dato es numérico.
8. Vistas
Descripción
Una vista en SQL es una consulta predefinida almacenada en la base de datos que
actúa como una tabla virtual.
Es una representación de los datos de una o más tablas que se puede utilizar y
manipular como si fuera una tabla real, pero en realidad no contiene datos físicos
en sí misma. Las vistas son creadas con una consulta SQL y se almacenan en la
base de datos para ser utilizadas posteriormente.
CREATE VIEW
Cuando se crea una columna calculada solo existe dentro de una consulta. Las
vistas permiten guardar una columna calculada en una tabla para luego poder
llamarla.
Hay que refrescar desde SCHEMA para poder ver la vista, la cual no aparece
en la sección de tablas, sino en la de Views. También se puede hacer una
consulta sencilla con SELECT ventas_empleados.
Disminuye el tráfico de la red:el servidor solo para el nombre del PA, no toda la
query.
CREATE PROCEDURE
DELIMITER $$
CREATE PROCEDURE sp_pizza()
BEGIN
SELECT*
FROM ventas
WHERE clave_producto = "pzz";
END $$
DELIMITER permite crear algo para finalizar el código. En este caso $$ esto
porque después de "pzz" hay un ; lo que confunde a SQL. Al terminar con el SP se
tiene que volver a establecer ; como el delimitador: DELIMITER ;
CALL sp_pizza()
Parámetros
Los parámetros permiten que los procedimientos almacenados sean más flexibles
y reutilizables, ya que pueden aceptar diferentes valores cada vez que son
llamados.
CALL sp_ventas_producto(NULL,1);
Si el valor del parámetro 1(productos) es NULL entonces muestra todos los valores
para el parámetro 2 especificado.
Ahora se agrega un default para el segundo parámetro:
CALL sp_ventas_producto(NULL,NULL);
En este caso cuando los parámetros son NULL, trae las ventas de todos los
productos para todos los locales.
Si se quiere que se muestre un valor por default cuando el valor de un parámetro
es NULL, se hace lo siguiente:
CALL sp_ventas_producto(NULL,NULL);
CALL actualizar_empleado("1111222","63","01234567");
Restricciones en SP
En este caso se va a especificar que las edades deben estar entre 18 y 60 años.
CALL actualizar_empleado("1111222","68","01234567");
Esta línea de código daría un error porque 68 está fuera del rango.
SIGNAL SQLSTATE es una lista con los errores de SQL y sus códigosrespectivos.
Sirve para que cuando una persona cometa el error, este
alerte. Además se incluye el SET MESSAGE_TEXT para personalizar el mensaje.
https://www.ibm.com/docs/en/i/7.4?topic=codes-listing-sqlstate-values
Cuando un usuario llama este SP, introduce un número de local, que se asigna
a IN parametro_local_id, el cual se guarda se relaciona a SELECT ID_local y se
guarda en INTO parametro_local_id.
CALL sp_ventas_local(1,0);
SET @param_local = 1;
SET @suma_ventas = 0;
SELECT @suma_ventas;
Variables en SP y DECLARE
DECLARE se utiliza para declarar variables locales dentro de un proceso
almacenado. Estas variables locales solo existen dentro del contexto del bloque
en el que se declaran, y su vida útil está limitada a la ejecución del bloque de
código. Una vez que el bloque ha terminado de ejecutarse, las variables locales se
eliminan de la memoria.
Modifica datos SQL: usados para modificar las tablas: UPDATE, INSERT,
DELETE o ALTER.
Lectura de datos SQL: usado para resumir los datos, es decir, hacer
operaciones. No modifica.
Ejemplo:
Se quiere calcular las ventas objetivos del otro año para diferentes vendedores.
Cada
uno tiene su propio ID. El monto debe ser un 10% mayor al actual.
SELECT
COUNT(*),
SUM(venta)
INTO
ventas_conteo,
ventas_total
RETURN factor_mejora;
END
11. TRIGGERS
Descripción
Son como procesos almacenados que se ejecutan automáticamente al insertar
nuevos datos, actualizar datos o eliminar datos.
Ejemplo
DELIMITER $$
DELIMITER ;
SELECT *
FROM proveedores.orden;
SHOW TRIGGERS
Muestra los TRIGGERS existentes
Ejemplo:
En este ejemplo se tiene una tabla en donde va a quedar registrado cualquier
modificación que se haga en "pago_orden".
BEGIN
UPDATE orden
SET balance = balance + NEW.cantidad
WHERE orden = New.orden;
DELIMITER ;
12. EVENT
Descripción
Es un bloque de código que se ejecuta cada cierto tiempo.Se recomienda que la
primer palabra en el
nombre del Evento haga referencia a la periocidad del mismo.
Se debe verificar que los Eventos estén activos con la siguiente línea de código:
DELIMITER $$
DO BEGIN
DELETE FROM auditoria_pagos
WHERE fecha < NOW()-INTERVAL 1 YEAR;
END $$
DELIMITER ;
SHOW EVENTS
Muestra todos los eventos
13.Transacciones y concurrencia
Descripción
Una transacción es un conjunto de órdenes que se ejecutan formando una
unidad de trabajo, en donde ninguna de ellas puede fallar.
Ejemplo:
START TRANSACTION;
COMMIT;
Concurrencia
Característica que permite que se puedan ejecutar varias sentencias a la vez en
una base de datos, llevando un orden específico para evitar que se rompa la
integridad de la misma.
STRING
Candenas de texto. Letras números, Entre otros.
INTEGER
Solo números enteros. Si se le pone un número como 3.14, solo toma el 3.
FLOAT
Decimales.
DATE
Es de la forma YYYY-MM-DD (year, month, day).
TIME
Es de la forma HH:MM:SS (hora, minuto segundo).
DATETIME
Fecha y hora. Es de la forma YYYY-MM-DD HH:MM:SS
TIMESTAMP
Fecha y tiempo. Se usa para mantener controles de cuándo se modifica un
registro. Es de
la forma YYYY-MM-DD HH:MM:SS.
YEAR
MONTH
DAY
ENUM
JSON
Descripción
Sirve para almacenar datos no estructurados. Se puede importar a SQL. La
mayoría de datos en la web están en este formato. Es posible tener una tabla y
agregarle una columna en formato JSON para incluir, por ejemplo, la
descripción del producto.
Ejemplo
En este ejemplo se agrega un nuevo producto a la tabla de productos. Se crea
una nueva fila y se asigna el nombre de producto, en este caso "Mix Pack",
clave de producto "MIX".
Para agregar la columna: se va a la tabla en Schemas, opciones, en Column
Name se hace click debajo de la última columna que aparece para poder
agregar otra y luego en Datatype se selecciona JSON.
UPDATE Productos
SET Caracteristicas = '{"dimension":[5,10,20],"productos":["pizza","burrito"],
WHERE productos_id=5;
JSON_EXTRACT
Sirve para extraer datos de JSON.
FUNCIONES JSON
UPDATE productos
SET caracteristicas = JSON_OBJECT("dimension",JSON_ARRAY(10,4,40),"pro
WHERE productos_id = 6;
JSON_SET
Permite insertar o actualizar datos en el objeto JSON.
UPDATE productos
SET caracteristicas = JSON_SET(caracteristicas,"$.cantidad",4);
JSON_REMOVE
UPDATE productos
SET caracteristicas = JSON_REMOVE(caracteristicas,"$.cantidad")
UPDATE productos
SET caracteristicas = JSON_SET(caracteristicas,"$.productos",JSON_ARR
WHERE producto_id = 6;
Normalización
Serie de reglas que se aplican a las tablas con el objetivo de asegurar
eficiencia,facilitar gestión y evitar redundancias. Hay varias reglas:
Forward engineering
Toma el modelo físico y crea las tablas. El proceso es el siguiente:
Database,Forward engineering, Stored coneection (seleccionar la conexión),
Next, Next, marcar Export MySQL Table Objects, Next, Next.
Reverse engineering
Sirve para cuando se tiene un esquema listo y se quiere convertir en un modelo.
Esta consulta agrega una nueva columna "ciudad" a la tabla "clientes", modifica la
columna "nombre" cambiando su tamaño y estableciendo un valor
predeterminado, y finalmente elimina la columna "email" de la tabla "clientes".
CHARSET y colación
Descripción
SHOW CHARTSET
Sofware que se utiliza para crear, ver o actualizar los datos entre el disco duro
y la memoria ram. El motor que se usa por default en SQL se llama InnoDB.
SHOW ENGINES
Muestra todos los SE disponibles.
ALTER TABLE
16. INDEX
Descripción
Sirve para crear una especie de catálogo. Primero se deben cargar las tablas a
SQL.Son especialmente útiles cuando se trabajo con millones de filas.
Básicamente crea tablas fantasma para tener la información disponible más
rápido. Dependen de la memoria RAM.
Ejemplo
SHOW INDEXES
Muestra los índices disponibles.
Esto muestra varios índices, no solo el que se creó. Verificar que Key_name sea
Primary y esté compuesto sobre la llave primaria.
EXPLAIN
Muestra los detalles de una consulta.
DROP INDEX
Eliminar un índice.
FULLTEXT INDEX
Indexa textos enteros como descripción de un producto, entre otros.
El siguiente código crea un usuario que solo puede acceder desde esa dirección
IP. También se puede hacer con un dominio en particular cambiando el IP por un
dominio: [email protected]
Administrative roles: DBA tiene todos los permisos. Se puede elegir un rol
predefinido o customizar uno haciendo click en la columna de la derecha.