You are on page 1of 33

Introducción a SQL y bases de datos relacionales

Ejemplos de consultas multitabla

1
Ignacio Despujol Zabala
Objetivos
Al final de este vídeo serás capaz de:
• Realizar consultas multi tabla complejas
Estructura base de datos de ejemplo
Total por cada orden
SELECT OrderID, SUM(Total) AS Ordertotal FROM
(SELECT O.OrderDetailID,O.OrderID, O.Quantity*P.Price AS Total
FROM OrderDetails O
INNER JOIN Products P
ON P.ProductID=O.ProductID
) AS Orderdetailswithprice
GROUP BY OrderID
Total por cada orden

https://www.w3schools.com/sql/trysql.asp?filename=trysql_asc
Total por línea de orden con cliente
SELECT OD.OrderDetailID, O.OrderID, C.CustomerName, OD.Quantity*P.Price AS Total
FROM OrderDetails OD
LEFT JOIN Products P
ON P.ProductID=OD.ProductID
LEFT JOIN Orders O
ON OD.OrderID=O.OrderID
LEFT JOIN Customers C
ON O.CustomerID=C.CustomerID
Total por línea de orden con cliente

https://www.w3schools.com/sql/trysql.asp?filename=trysql_asc
5 suministradores que más negocio generan
SELECT
SupplierName, Country, ROUND(SUM(Total)) AS Suppliertotal FROM
(SELECT S.SupplierName, S.Country,O.Quantity*P.Price AS Total
FROM OrderDetails O
LEFT JOIN Products P
ON P.ProductID=O.ProductID
LEFT JOIN Suppliers S
ON P.SupplierID=S.SupplierID
) AS Orderdetailswithprice
GROUP BY SupplierName
ORDER BY Suppliertotal DESC
LIMIT 5
5 suministradores que más negocio generan

https://www.w3schools.com/sql/trysql.asp?filename=trysql_asc
Número de productos por grupo de precios
SELECT GrupoPrecio, COUNT(Grupoprecio) AS Numero_de_Productos FROM
(SELECT *,
CASE
WHEN Price <= 10 THEN 'Grupo 1’
WHEN Price > 10 AND Price <= 50 THEN 'Grupo 2’
WHEN Price > 50 AND Price <= 100 THEN 'Grupo 3’
WHEN Price > 100 AND Price <= 200 THEN 'Grupo 4’
ELSE 'Grupo 5’
END AS GrupoPrecio
FROM Products
) as congrupos
GROUP BY GrupoPrecio;
https://www.w3schools.com/sql/trysql.asp?filename=trysql_asc
Número de productos por grupo de precios

https://www.w3schools.com/sql/trysql.asp?filename=trysql_asc
Total por categoría para mayo de 1997
SELECT
Categoryname, ROUND(SUM(Total)) AS Categorytotal
FROM
(SELECT
O.OrderDate, C.CategoryName, OD.Quantity*P.Price AS Total
FROM OrderDetails OD
LEFT JOIN Products P
ON P.ProductID=OD.ProductID
LEFT JOIN Categories C
ON P.CategoryID=C.CategoryID
LEFT JOIN Orders O
ON OD.OrderID=O.OrderID
WHERE MONTH(OrderDate)=5 AND YEAR(OrderDate)=1997
) AS OrderDetailwithPrice
GROUP BY Categoryname
Total por categoría para mayo de 1997

https://www.w3schools.com/sql/trymysql.asp?filename=trysql_func_mysql_month
Resumen
Ahora puedes:
• Realizar consultas multi tabla complejas
Atribución
La fuentes de las imágenes son:

• Título: By alaa kaddour - https://www.character-count.info, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=99420428


• Transparencia 8: Arbeck, CC BY 3.0 <https://creativecommons.org/licenses/by/3.0>, via Wikimedia Commons
https://commons.wikimedia.org/wiki/File:SQL_Joins.svg

15
Introducción a SQL y bases de datos relacionales

Ataques de inyección SQL

16
Ignacio Despujol Zabala
Objetivos
Al final de este vídeo serás capaz de:
• Reconocer cómo se puede realizar un ataque de inyección SQL
• Describir algunas medidas a tomar para evitarlos
• Poner un ejemplo de las consecuencias
Ataque de inyección SQL
• Se realiza contra aplicaciones web que trabajan con una base de datos
• Consiste en utilizar un formulario de la web que use la base de datos y
añadir código SQL al final de la respuesta que se envía a ese formulario
• Es una de las técnicas de hacking más utilizadas
• Puede incluso borrar una base de datos
Cómo se ejecuta un ataque
Un formulario web recibe un parámetro "nombreUsuario" que contiene el nombre de usuario a
consultar y lo pasa al siguiente código SQL:

consulta := "SELECT * FROM usuarios WHERE nombre = '" + nombreUsuario + "’; "

Uso normal
SELECT * FROM usuarios WHERE nombre = 'Pepe’;

Entrada mal intencionada


‘ OR ''='

Consulta generada
SELECT * FROM usuarios WHERE nombre = ‘’ OR ''='’;

Se vuelcan todos los datos de la tabla (también se puede usar Pepe OR 1=1 )
https://es.wikipedia.org/wiki/Inyecci%C3%B3n_SQL
Cómo se ejecuta un ataque
Un formulario web recibe un parámetro "nombreUsuario" que contiene el nombre de usuario a
consultar y lo pasa al siguiente código SQL:
consulta := "SELECT * FROM usuarios WHERE nombre = '" + nombreUsuario + "’; "

Uso normal
SELECT * FROM usuarios WHERE nombre = 'Pepe’;

Entrada mal intencionada


Alicia'; DROP TABLE usuarios; SELECT * FROM datos WHERE nombre LIKE ‘%

Consulta generada
SELECT * FROM usuarios WHERE nombre = 'Alicia'; DROP TABLE usuarios; SELECT * FROM datos WHERE nombre LIKE ‘% ’;

Cualquier dato de la base de datos puede quedar disponible para ser leído o modificado por un
usuario malintencionado.

https://es.wikipedia.org/wiki/Inyecci%C3%B3n_SQL
Como evitar un ataque de inyección SQL
• Asegurándonos por programa de que el campo suministrado por el
formulario web no puede contener ningún carácter peligroso
• Usando parámetros SQL que se añaden de forma controlada a la
consulta cuando se ejecuta
• Guardando encriptados en la base de datos los campos sensibles y
usando hashes
Ejemplo

https://www.eoi.es/blogs/ciberseguridad/2016/04/18/sql-injection-objetivo-sony/
Resumen
Ahora puedes:
• Reconocer cómo se puede realizar un ataque de inyección SQL
• Describir algunas medidas a tomar para evitarlos
• Poner un ejemplo de las consecuencias
Atribución
La fuentes de las imágenes son:

• Título: By alaa kaddour - https://www.character-count.info, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=99420428


• Transparencias 4 en adelante: Derivado de Arbeck, CC BY 3.0 <https://creativecommons.org/licenses/by/3.0>, via Wikimedia Commons
https://commons.wikimedia.org/wiki/File:SQL_Joins.svg

24
Introducción a SQL y bases de datos relacionales

Clientes SQL

25
Ignacio Despujol Zabala
Objetivos
Al final de este vídeo conocerás:
• Diversos clientes para acceder a distintas bases de datos con SQL
HeidiSQL

• Para MariaDB, MySQL, MS SQL, PostgreSQL y SQLite


• Gratis y OpenSource

https://www.heidisql.com/
phpMyAdmin

• Para MariaDB, MySQL


• Interfaz web

https://www.phpmyadmin.net/
Oracle SQL Developer

https://www.oracle.com/es/database/technologies/appdev/sqldeveloper-landing.html
Librerías para PHP

https://www-w3schools-com.translate.goog/Php/php_mysql_connect.asp?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=es
Librerías para Python DB-API

https://www-tutorialspoint-com.translate.goog/python/python_database_access.htm?_x_tr_sl=auto&_x_tr_tl=es&_x_tr_hl=es
Resumen

Ahora conoces diversos clientes para acceder a bases de datos usando SQL
Atribución
La fuentes de las imágenes son:

• Título: By alaa kaddour - https://www.character-count.info, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=99420428

33

You might also like