SQL - Ejemplos Sentencias
SQL - Ejemplos Sentencias
SELECT................................................................................................................................................4
WHERE...............................................................................................................................................4
UNION DE TABLAS CON WHERE Y ALIAS...........................................................................................5
Alias en campos.............................................................................................................................5
Alias en tablas................................................................................................................................5
ORDER BY...........................................................................................................................................6
Order By con union de Tablas.......................................................................................................7
FUNCIONES DE MATEMÁTICA FINANCIERA......................................................................................7
SUM – Sumar.................................................................................................................................7
COUNT - Contar.............................................................................................................................8
MAX – Valor máximo.....................................................................................................................8
MIN – Valor mínimo......................................................................................................................8
AVG – Promedio............................................................................................................................8
GROUP BY – segmentar la información y poder utilizar funciones matemáticas............................9
GROUP BY - Suma..........................................................................................................................9
GROUP BY – Suma por año y mes.................................................................................................9
GROUP BY – Máximo de ventas por año y mes..........................................................................10
GROUP BY – Mínimo de ventas por año y mes...........................................................................10
GROUP BY – Promedio de ventas por año y mes........................................................................11
GROUP BY – con WHERE..............................................................................................................11
GROUP BY – Todas las combinaciones matemáticas..................................................................12
CLÁUSA IN / NOT IN.........................................................................................................................12
NOT IN con Sub-query.................................................................................................................12
NOT IN – Sub-query + WHERE.....................................................................................................13
NOT IN – Sub-query + WHERE + ORDER BY.................................................................................14
NOT IN + Unión de Tablas............................................................................................................15
BETWEEN.........................................................................................................................................15
LIKE..................................................................................................................................................16
LIKE con Metacaracter %.............................................................................................................16
LIKE con una CONCATENACIÓN previa........................................................................................17
INNER JOIN – UNION DE TABLAS.....................................................................................................18
JOIN con operación matemática dentro de un paréntesis.........................................................18
LEFT JOIN.....................................................................................................................................19
RIGHT JOIN...................................................................................................................................19
FULL JOIN – CLÁUSALA UNION....................................................................................................20
FUNCIONES BÁSICAS EN MYSQL.....................................................................................................20
IF..................................................................................................................................................20
CASE.............................................................................................................................................21
SUBSTR.........................................................................................................................................21
SUBSTR + CASE.............................................................................................................................22
CURRENT_DATE...........................................................................................................................22
CURRENT_TIME...........................................................................................................................22
CURRENT_TIMESTAMP................................................................................................................22
DATE DIFF.....................................................................................................................................22
HAVING – CLÁUSA...........................................................................................................................23
INSERT..............................................................................................................................................24
UPDATE............................................................................................................................................25
DELETE.............................................................................................................................................26
SUBCONSULTAS...............................................................................................................................26
Ejercicios..........................................................................................................................................27
Ejercicio 1 – JOIN, CONCAT, LIKE.................................................................................................27
Ejercicio 2 – WHERE – SUBCONSULTA - LIKE...............................................................................28
Ejercicio 3 – COUNT.....................................................................................................................28
Ejercicio 4 – SUM – JOIN - BETWEEN...........................................................................................28
Ejercicio 5 – MAX - JOIN..............................................................................................................28
FUNCIONES MYSQL.........................................................................................................................29
AADDATE.....................................................................................................................................29
AES_ENCRYPT..............................................................................................................................29
AES_DECRYPT..............................................................................................................................29
LENGHT........................................................................................................................................30
DATEDIFF.....................................................................................................................................30
RUTINA ALMACENADA....................................................................................................................31
TRIGGER...........................................................................................................................................31
Ejemplo INSERT1..........................................................................................................................31
Ejemplo INSERT2..........................................................................................................................32
Ejemplo UPDATE..........................................................................................................................32
JSON.................................................................................................................................................33
INSERT dato JSON........................................................................................................................33
SELECT – búsqueda dato JSON....................................................................................................33
UPDATE – a un valor de JSON......................................................................................................33
UPDATE – eliminar un valor de JSON..........................................................................................34
EXPLAIN...........................................................................................................................................35
EJERCICIOS AVANZADOS.................................................................................................................36
Ejercicio 1 – COUNT EN SELECT – JOIN - WHERE.........................................................................36
Ejercicio 2 JOIN – GROUP BY - ODER BY - LIMIT..........................................................................36
Ejercicio 3 – JOIN – WHERE – GROUP BY – ORDER BY - LIMIT....................................................37
Ejercicio 4 – Subconsulta Encapsulada – lo mas complejo.........................................................38
SELECT
SELECT * FROM productos
WHERE Prod_Precio>0 AND (Prod_Status=0 OR (Prod_Status = 1 AND
Prod_ProvId=97))
WHERE
SELECT Ventas_Fecha, Ventas_CliId, Ventas_Total FROM ventas
WHERE Ventas_Fecha > '2018-01-03' AND Ventas_Fecha < '2018-01-10' AND
Ventas_CliId<>1
AND Ventas_Total > 1000
UNION DE TABLAS CON WHERE Y ALIAS
Alias en campos
SELECT Ventas_Fecha AS 'Fecha', Ventas_NroFactura AS 'Nro. Factura',
Ventas_CliID AS 'ID. Cliente',
Cli_RazonSocial AS 'Razón Social', Ventas_Total AS 'Total'
FROM ventas, clientes
WHERE Ventas_CliID=Cli_Id
Alias en tablas
SELECT Ventas_CliID, Cli_RazonSocial, Ventas_NroFactura, Ventas_Fecha,
VD_ProdID, prod_descripcion,
prod_color, vd_cantidad, vd_precio
FROM clientes AS c, ventas AS v, ventas_detalle AS d, productos AS P
WHERE v.Ventas_CliId=c.Cli_Id AND
d.VD_ProdId=P.Prod_Id AND
v.Ventas_Id=d.VD_VentasId
ORDER BY
SELECT * FROM clientes ORDER BY Cli_RazonSocial
Traer la lista de productos vendidos (solo su ID) sin repeticiones y con el total vendido
por cada uno
SELECT VD_ProdID AS Producto, SUM((VD_Precio * VD_Cantidad)) AS Total
FROM ventas_detalle
GROUP BY Producto
AVG – Promedio
SELECT AVG(Ventas_Total) AS 'Venta Promedio' FROM ventas
WHERE MONTH(Ventas_Fecha)=1 AND YEAR(ventas_Fecha)=2018
GROUP BY – segmentar la información y poder utilizar funciones
matemáticas
GROUP BY - Suma
SELECT Ventas_Fecha, sum(Ventas_Total) AS Total
FROM Ventas
GROUP BY Ventas_Fecha
CLÁUSA IN / NOT IN
Lista de todos los clientes que no han comprado
Se utiliza una subquery, donde la subquery irá a buscar el listado DISTINTO de clientes que
hayan tenido una venta. A su vez, se generará una consulta para identificar a TODOS los
clientes que NO se encuentren en la subquery, de esta forma, se identifican los clientes
que no han comprado. Así se podrían llamar para fidelizarlos
NOT IN con Sub-query
SELECT Cli_ID AS 'Nro. Cliente', Cli_RAzonSocial AS Nombre
FROM Clientes
WHERE Cli_Id NOT IN (SELECT DISTINCT(Ventas_CliID) AS Cliente FROM
ventas)
NOT IN – Sub-query + WHERE
LISTA de todos los clientes que NO han comprado en Febrero-2018
SELECT Cli_ID AS 'Nro. Cliente', Cli_RAzonSocial AS Nombre
FROM Clientes
WHERE Cli_Id NOT IN (SELECT DISTINCT(Ventas_CliID) AS Cliente FROM ventas
WHERE Ventas_Fecha >= '2018-02-01' AND Ventas_Fecha < '2018-03-01')
BETWEEN
SELECT Ventas_Fecha, Ventas_CliID, Ventas_Total
FROM ventas
WHERE Ventas_Fecha BETWEEN '2018-01-01' AND '2018-01-04'
LIKE
Se utiliza para buscar palabras dentro de un texto
Es importante mantener el orden de unión de tablas en el caso que queramos unir más de una. Se
ejecutará con error si no se mantiene el orden de las tablas que se van a unir.
FROM ventas
JOIN ventas_detalle ON VD_VentasId = Ventas_Id
JOIN productos ON VD_ProdId=Prod_Id
JOIN proveedores ON Prod_ProvID=Prov_ID
JOIN clientes ON Ventas_CLiID=Cli_ID
Otra diferencia, es que si ordeno desde la izquiera la tabla que busco, me traerá todos los datos de
esa tabla, incluso si no tienen datos guardados (NULL). En cambio, si se utiliza solo JOIN, solo
arrojará los datos existentes, dejará los NULL fuera
RIGHT JOIN
SELECT * FROM Alumnos
RIGHT JOIN Cursos ON Curso_AlumnoID=Alumno_Id
FULL JOIN – CLÁUSALA UNION
Es la unión entre el LEFT JOIN y el RIGHT JOIN
FULL JOIN no es soportado por el motor MySQL asi que se hará una simulación, se unirá con una
cláusala llamada UNION. La condición es que se deben unir de 2 tablas distintas
Ejemplo, si tenemos un campo estado, que arroja solo 1 y 0, el usuario no entiende qué significan
esos nros, por lo mismo, se utiliza una condición para mostrar la descripción de esos números.
SUBSTR
Divide texto dentro de una descripción. Se incorpora el largo del texto a dividir dentro de SUBSTR
SELECT Prod_Id, Prod_Descripcion, SUBSTR(Prod_Descripcion,1,10) AS Parte
FROM Productos
SUBSTR + CASE
SELECT Prod_Id, Prod_Descripcion, CASE SUBSTR(Prod_Descripcion,1,1)
CURRENT_DATE
SELECT CURRENT_DATE
CURRENT_TIME
SELECT CURRENT_TIME
CURRENT_TIMESTAMP
SELECT CURRENT_TIMESTAMP
DATE DIFF
Diferencia en día entre fechas
SELECT DATEDIFF('2018-06-01','2018-01-01') AS 'Diferencia en días'
Diferencia en días desde la fecha de hoy en comparación con la fecha en campo Ventas_Fecha
asociado al nro de Factura
SELECT DATEDIFF(CURRENT_DATE,Ventas_Fecha) AS 'Diferencia en días',
Ventas_NroFactura FROM Ventas
HAVING – CLÁUSA
Es el WHERE que se ejecuta después del GROUP BY
HAVING se utiliza para poder utilizar los Alias, con los resultados de salida y no los de entrada. Ej:
si tengo un dato de salida AS Total, ese Total lo puedo utilizar con HAVING, cosa que no podría ser
utilizado por un WHERE
SELECT YEAR(Ventas_Fecha) AS Ano, MONTH(Ventas_Fecha) AS Mes,
SUM(Ventas_Total) AS Total
FROM ventas
GROUP BY Ano, Mes
HAVING Total > 1000000
INSERT
Insertar datos en una tabla
INSERT INTO Alumnos (Alumno_Nombre) VALUES ('Pedro Narvaja')
UPDATE
Actualiza los datos de las tablas.
SUBCONSULTAS
No entendí ninguno de los 2 ejemplos xDDDD
Ejercicios
Ejercicio 1 – JOIN, CONCAT, LIKE
Traer todos los artículos que en su descripción o color o nombre de proveedor tenga el string
FERRO
SELECT Prod_ID, Prod_descripcion, Prod_color, Prov_ID, Prov_nombre
FROM proveedores
JOIN productos ON Prov_ID = Prod_ProvID
WHERE CONCAT (prod_descripcion, prod_color, prov_nombre) LIKE '%FERRO%'
Ejercicio 2 – WHERE – SUBCONSULTA - LIKE
Traer todos los artículos cuya descripción tenga el string CINTA y que tenga ventas realizadas
SELECT Prod_ID, Prod_descripcion
FROM productos
WHERE Prod_Id IN (SELECT VD_ProdId FROM ventas_detalle) AND
Prod_Descripcion LIKE '%CINTA%'
Ejercicio 3 – COUNT
Traer la cantidad de productos que se han vendido
SELECT COUNT(DISTINCT (VD_ProdID)) AS Cantidad
FROM productos
JOIN ventas_detalle ON Prod_ID = VD_ProdId
AES_ENCRYPT
Encriptación de datos, muy importante recordar cuál fue la clave se puso para encriptar los datos,
esa clave va como 2do dato dentro de la función entre ‘ ‘
SELECT Prod_Descripcion, AES_ENCRYPT(Prod_Descripcion, 'Masters del
Desarrollo') AS DescripEncrypt
FROM productos
AES_DECRYPT
Desencriptación de datos
SELECT Prod_Descripcion, AES_DECRYPT(AES_ENCRYPT(Prod_Descripcion,
'Masters del Desarrollo'),
'Masters del Desarrollo') AS Desencriptado
FROM productos
LENGHT
Visualizar el largo de una descripción
SELECT Prod_descripcion, LENGTH(prod_descripcion) AS Largo
FROM Productos
DATEDIFF
Intervalo de fechas
SELECT DATEDIFF(Ventas_Fecha, NOW()) AS Intervalo
FROM Ventas
RUTINA ALMACENADA
La llamada de Rutina se hace con un CALL si tiene parámetros la rutina, se debe incluir dentro del
paréntesis, en este ejemplo, BorroAlumno se dedicará a borrar el ID del alumno 4
CALL BorroAlumno(4);
TRIGGER
Son disparadores. Primero se debe crear el disparador asociado a la tabla donde se desea realizar
un cambio y se inserta la sentencia SQL que se desea ejecutar.
Ejemplo INSERT1
Por ejemplo, si se desea insertar nombres en la tabla Alumnos, pero queremos que los datos
INSERT sean en MAYUSCULO, sería de la siguiente manera:
BEGIN
SET NEW.Alumno_Nombre = UCASE(NEW.Alumno_Nombre);
END
NEW es para insertar
OLD es para los datos ya ingresados
Los OLD se usan en los UPDATES
UCASE es la función que cambia el nombre a MAYUSCULA
Una vez con el Trigger creado, se debe realizar la sentencia SQL de INSERT para probar el Trigger
INSERT INTO alumnos (Alumno_Id, Alumno_Nombre) VALUES (8, 'mariana')
Ejemplo INSERT2
Trigger para insertar Ventas y obligar a que si el dato sea negativo, dejarlo en positivo con un 0
BEGIN
IF NEW.Ventas_Total<0 THEN SET NEW.Ventas_Total=0;
END IF;
END
Ejemplo UPDATE
Si un Trigger está asociado a una tabla con un UPDATE eso significa que cada vez que se realice un
UPDATE ese Trigger se ejecutará, por lo tanto, hay que ser cuidadoso en cómo generar la
sentencia del Trigger.
En este ejemplo, SI un NUEVO Precio es distinto a un Precio ANTIGUO, se continua con la
sentencia del Trigeer
BEGIN
IF NEW.Prod_Precio <> OLD.Prod_Precio THEN
INSERT INTO productos_historial (PH_ProdId, PH_PrecioANT, PH_PrecioNEW,
PH_Usuario)
VALUES (NEW.Prod_Id, OLD.Prod_Precio, NEW.Prod_Precio, CURRENT_USER);
END IF;
END
JSON
INSERT dato JSON
INSERT INTO productos (Prod_descripcion, Prod_Propiedades) VALUES
('Producto con JSON', '{"propiedades": {"electrico":true,
"garantia":true, "nuevo":false, "presentaFalla":true}}')
ESTAS SON LAS TABLAS QUE TUVO QUE CONSULTAR PARA CORRER EL SELECT ANTERIOR
EXPLAIN SELECT Prod_id, Prod_descripcion, Ventas_Fecha, SUM(VD_Cantidad *
VD_Precio) AS Vendidos
FROM productos
JOIN ventas_detalle ON VD_ProdID=Prod_Id
JOIN ventas ON VD_VentasID=Ventas_ID
WHERE ventas_fecha BETWEEN '2018-01-02' AND '2018-01-07'
GROUP BY Prod_Id, Prod_descripcion, Ventas_Fecha
ORDER BY Prod_Id
VENTAS_FECHA NO ES UN INDICE, por lo tanto el Explain, indica que en Rows tuvo que ir a leer la
cantidad total de registros 7.019.
Si hacemos un índice en VENTAS_FECHA y volvemos a correr la MISMA consulta, podemos ver que
no recorrerá todos los registros:
EJERCICIOS AVANZADOS
Ejercicio 1 – COUNT EN SELECT – JOIN - WHERE
Con cuantas 'Comedias' trabajamos en la empresa?
SELECT COUNT(*) AS 'Cantidad Comedias' FROM film F
JOIN film_category FC ON FC.film_id = F.film_id
JOIN category C ON C.category_id = FC.category_id
WHERE C.name = 'Comedy'
Por qué el COUNT(*) no se pone dentro del SELECT? Porque el planteo del problema no pide una
cantidad, sino que pide el Actor, no se debe poner mas cosas que las que se solicita.
EL GROUP BY lo que hace es que agrupa los actores para que no se repitan, considerando que 1
actor puede estar asociado a más de 1 película
Y la función LIMIT lo que hace, es traer la cantidad de registros que uno determine para la
consulta. En este caso, lo que se pide en el planteo es el ACTOR con más películas, por lo tanto se
debe ingresar un 1, de esta forma la función LIMIT extrae el PRIMER actor con más películas.
Ahora, se puede poner un 10 por ejemplo para traer los 10 actores con más películas, pero no es el
fin del planteo del problema
PARA CORROBORAR QUE REALMENTE LA ACTRIZ 107 ES LA QUE TIENE MÁS PELÍCULAS:
SELECT COUNT(*) AS Peliculas, FA.actor_id
FROM film_actor FA
GROUP BY FA.actor_id
ORDER BY Peliculas DESC
Se debe encapsular un subconsulta para poder utilizar la función LIMIT, de lo contrario, dará un
error, no se puede utilizar un LIMIT dentro de una subconsulta por sintaxis.