¡El poder de los datos!

1

¡El poder de los datos!

Introducción a las bases de datos relacionales

2

Buenas prácticas de bases de datos con SQL

3

Tipos de datos en SQL

4

¿Cómo crear una base de datos en SQL?

5

Práctica: Tu primera consulta en bases de datos

6

Historia y Evolución de SQL

7

Práctica: Creación de Tablas en SQL (CREATE TABLE)

Manipulación de Datos

8

Insertando Datos con SQL (INSERT)

9

Consultas y Selecciones en SQL (SELECT)

10

Práctica: SELECT en SQL

11

Actualización de Datos con SQL (UPDATE)

12

Eliminación de Datos con SQL (DELETE)

13

Práctica: CRUD con SQL

Manipulación Avanzada de Datos

14

Instalación de MySQL Server y MySQL Workbench

15

¿Qué es la cláusula WHERE de SQL?

16

Filtrar y Ordenar Datos en SQL (LIKE)

17

Práctica: Filtrar Datos con WHERE en SQL

18

Cláusulas de Comparación Textual en SQL (AND, NULL, IN, NOT)

19

Funciones de Aritmética Básica en SQL (COUNT, SUM, AVG)

20

Funciones de Aritmética Básica en SQL (MIN, MAX)

Agrupación de Datos

21

Agrupación de Datos en SQL: GROUP BY, HAVING y CASE para Análisis Avanzado

22

Práctica: Agrupamiento y Ordenamiento de Datos

23

Tipos de JOIN en SQL

24

¿Cómo funciona INNER JOIN, LEFT JOIN, RIGHT JOIN y FULL JOIN?

25

Práctica: LEFT JOIN en SQL

Transformación de Datos

26

Vistas Materializadas en SQL: Como optimizar tus consultas y reportes.

27

Práctica: Crear Vistas Materializadas en SQL

28

Optimización de Bases de Datos con SQL: CREATE INDEX y TRIGGER

29

Vistas Materializadas y Temporales en SQL

30

Expresiones de Tablas Comunes (CTE) en SQL

Procedimientos Almacenados

31

Procedimientos Almacenados en SQL

32

Procedimientos Almacenados en SQL: Gestión de Variables y Manejo de Excepciones

Administración de Base de Datos

33

Respaldos y Restauración de Bases de Datos

34

Seguridad en Bases de Datos SQL

Análisis de Datos Avanzados

35

Potenciando los Datos en la Nube: Data Science, Big Data, ML e AI

36

SQL para Análisis de Datos: Primeros pasos con Power BI

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

No se trata de lo que quieres comprar, sino de quién quieres ser. Invierte en tu educación con el precio especial

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

11 Días
21 Hrs
17 Min
59 Seg

¿Cómo funciona INNER JOIN, LEFT JOIN, RIGHT JOIN y FULL JOIN?

24/36
Recursos

Aportes 26

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

FULL OUTER JOIN no esta soportado en MySQL, se puede obtener un comportamiento igual usando `left join` junto con `right join` y la palabra reservada `union` ``` SELECT p.id, p.nombre, m.id, m.nombre FROM productos p LEFT JOIN marcas m on p.marca\_id = m.id UNION SELECT p.id, p.nombre, m.id, m.nombre FROM productos p RIGHT JOIN marcas m on p.marca\_id = m.id; ```
```js -- Crear Tabla B (Marcas) CREATE TABLE marcas ( id INT PRIMARY KEY, nombre VARCHAR(50) ); -- Insertar registros en Tabla B INSERT INTO marcas (id, nombre) VALUES (1, 'Dell'), (2, 'Apple'), (3, 'Samsung'); -- Crear Tabla A (Productos) CREATE TABLE productos( id INT PRIMARY KEY, nombre varchar(50), marca_id INT, precio decimal(10,2), FOREIGN KEY (marca_id) REFERENCES marcas(id) ); -- Insertar registros en Tabla A INSERT INTO productos (id, nombre, marca_id, precio) VALUES (1, 'Laptop', 1, 1200.00), (2, 'Smartphone', 2, 800.00), (3, 'Tablet', 1, 400.00); SELECT p.id,p.nombre, m.id,m.nombre FROM productos as p INNER JOIN marcas as m ON p.marca_id = m.id; SELECT p.id,p.nombre, m.id,m.nombre FROM productos as p cross JOIN marcas as m ; ``` \-- Crear Tabla B (Marcas) CREATE TABLE marcas ( id INT PRIMARY KEY, nombre VARCHAR(50) ); \-- Insertar registros en Tabla B INSERT INTO marcas (id, nombre) VALUES (1, 'Dell'), (2, 'Apple'), (3, 'Samsung'); \-- Crear Tabla A (Productos) CREATE TABLE productos( id INT PRIMARY KEY, nombre varchar(50), marca\_id INT, precio decimal(10,2), FOREIGN KEY (marca\_id) REFERENCES marcas(id) ); \-- Insertar registros en Tabla A INSERT INTO productos (id, nombre, marca\_id, precio) VALUES (1, 'Laptop', 1, 1200.00), (2, 'Smartphone', 2, 800.00), (3, 'Tablet', 1, 400.00); SELECT p.id,p.nombre, m.id,m.nombre FROM productos as p INNER JOIN marcas as m ON p.marca\_id = m.id; SELECT p.id,p.nombre, m.id,m.nombre FROM productos as p cross JOIN marcas as m ;
este curso es muy enredado aveces
![](https://static.platzi.com/media/user_upload/INNER%20JOIN-d711ec45-2b60-405c-b550-1d2a4745cc9e.jpg)
Gracias a que la profe no explicó me tarde una hora en resolverlo. Sufrí demasiado. Sigo insistiendo no es un curso para principiantes. LES EXPLICO: básicamente unimos las dos bases de datos con un id en común. La tabla de productos y la tabla de marcas cada una puede tener su id independiente, pero en la columna de productos donde dice marca\_id, este debe ser el mismo que el id de las marcas. De esta manera al tener en común ambas tablas estos números es que se puede dar el inner. Me demoré una hora identificando esto. Que ira. Otro aspecto a considerar: en el código "productos.marca\_id" lo que está pidiendo es que dentro del conjunto productos utilice la columna "Marca\_id". En el siguiente conjunto, dentro de la tabla marcas, está pidiendo que use la columna "Marca\_id". En conclusión: ve en ambos conjuntos utiliza lo único que tenemos en común para relacionar los datos: "Marca\_id". Una hora pa entender esto, que ella pudo explicar en 30 segundos. Cero pedagogía. ![](https://static.platzi.com/media/user_upload/image-e546f6ef-643a-49ff-9133-9a274eba9307.jpg)
Caro 👩‍💻 el error que arroja es que hace falta el ; al final para indicar el final de la instrucción La estructura seria: `SELECT P.ID, P.NOMBRE, M.ID, M.NOMBRE` `FROM PRODUCTOS P` `FULL OUTER JOIN MARCAS M ON P.MARCA_ID = M.ID;`
Les comparto aqui mi codigo `SELECT *` `FROM products` `INNER JOIN brands ON products.brand_id = brands.id;` `SELECT p.id, p.name, b.id, b.name` `FROM products AS p` `INNER JOIN brands AS b ON p.brand_id = b.id;` `SELECT p.id, p.name, b.id, b.name` `FROM products AS p` `RIGHT JOIN brands AS b ON p.brand_id = b.id;` `SELECT p.id, p.name, b.id, b.name` `FROM products AS p` `LEFT JOIN brands AS b ON p.brand_id = b.id;` `SELECT p.id, p.name, b.id, b.name` `FROM products AS p` `FULL OUTER JOIN brands AS b ON p.brand_id = b.id;` `SELECT p.id AS product_id, p.name AS product_name, b.id AS brand_id, b.name AS brand_name` `FROM products AS p` `CROSS JOIN brands AS b;`
MySQL no soporta FULL OUTER JOIN de manera nativa. Se puede lograr el efecto del FULL OUTER JOIN utilizando una combinación de LEFT JOIN y RIGHT JOIN junto con UNION. ![](https://static.platzi.com/media/user_upload/JOIN-cc2fb258-d4fb-4a39-8340-b0279f2ef1d7.jpg)
\# crear tabla marca "Brands" CREATE TABLE BRANDS ( BRAND\_ID INT PRIMARY KEY AUTO\_INCREMENT, BRAND\_NAME VARCHAR(100) NOT NULL ); \-- Insertar registros en la tabla BRANDS INSERT INTO BRANDS (BRAND\_NAME) VALUES ('Nike'), ('Adidas'), ('Puma'), ('Under Armour'), ('Reebok'); \-- Verificar los registros en la tabla BRANDS SELECT \* FROM BRANDS; \#crear tabla de productos "products" CREATE TABLE PRODUCTS ( PRODUCTSID INT PRIMARY KEY AUTO\_INCREMENT, PRODUCTS\_NAME VARCHAR(50), BRAND\_ID INT, -- Supongamos que ahora haces referencia a una tabla de marcas PRICE DECIMAL(10, 2), LOAD\_DATE TIMESTAMP DEFAULT CURRENT\_TIMESTAMP, UPDATE\_DATE TIMESTAMP DEFAULT CURRENT\_TIMESTAMP ON UPDATE CURRENT\_TIMESTAMP, -- Se actualiza automáticamente FOREIGN KEY (BRAND\_ID) REFERENCES BRANDS(BRAND\_ID) -- Clave foránea para garantizar integridad referencial de este campo con la tabla BRANDS. ); \-- Insertar registros en la tabla PRODUCTS INSERT INTO PRODUCTS (PRODUCTS\_NAME, BRAND\_ID, PRICE) VALUES ('Zapatillas Air Max', 1, 120.50), ('Camiseta Clásica', 2, 30.99), ('Botines EvoSpeed', 3, 150.00), ('Short Deportivo', 4, 25.75), ('Guantes de Entrenamiento', 5, 40.00); \-- Verificar los registros en la tabla PRODUCTS SELECT \* FROM PRODUCTS; \-- práctica de "Joins" \-- INNER JOIN: El INNER JOIN se utiliza para devolver los registros que tienen coincidencias en ambas tablas basadas en una condición, generalmente una clave foránea. \-- Esta consulta te mostrará todos los productos junto con los nombres de sus marcas. SELECT \* FROM PRODUCTS INNER JOIN BRANDS ON PRODUCTS.BRAND\_ID = BRANDS.BRAND\_ID; \-- seleccionar columnas específica SELECT PRODUCTS.PRODUCTS\_NAME, BRANDS.BRAND\_NAME, PRODUCTS.PRICE FROM PRODUCTS INNER JOIN BRANDS ON PRODUCTS.BRAND\_ID = BRANDS.BRAND\_ID; \-- Explicación línea por línea: \-- SELECT \*: Este comando selecciona todas las columnas de ambas tablas (PRODUCTS y BRANDSS). El asterisco (\*) indica que se seleccionarán todas las columnas sin necesidad de especificarlas una por una. \-- FROM PRODUCTOS: Especifica que la tabla principal de la consulta es PRODUCTS. Aquí es donde se va a buscar la información de los productos. \-- INNER JOIN MARCAS: Realiza un INNER JOIN entre la tabla PRODUCTS y BRANDS. Esto significa que solo se mostrarán los registros que tienen coincidencias en ambas tablas. \-- ON PRODUCTS.BRAND\_ID = BRAND.ID: Especifica la condición de unión. Aquí se indica que el campo BRAND\_ID de la tabla PRODUCTS debe coincidir con el campo ID de la tabla BRANDS. De esta forma, relacionas cada producto con su marca correspondiente. \-- LEFT JOIN: Retorna todas las filas de la tabla de la izquierda (en este caso, PRODUCTS) y las coincidencias de la tabla de la derecha (BRANDS). Si no hay coincidencia, se devolverán valores NULL para las columnas de la tabla de la derecha. SELECT PRODUCTS.PRODUCTS\_NAME, BRANDS.BRAND\_NAME, PRODUCTS.PRICE FROM PRODUCTS LEFT JOIN BRANDS ON PRODUCTS.BRAND\_ID = BRANDS.BRAND\_ID; \-- RIGHT JOIN: Retorna todas las filas de la tabla de la derecha (BRANDS) y las coincidencias de la tabla de la izquierda (PRODUCTS). Si no hay coincidencia, se devolverán valores NULL para las columnas de la tabla de la izquierda. SELECT PRODUCTS.PRODUCTS\_NAME, BRANDS.BRAND\_NAME, PRODUCTS.PRICE FROM PRODUCTS RIGHT JOIN BRANDS ON PRODUCTS.BRAND\_ID = BRANDS.BRAND\_ID; \-- FULL OUTER JOIN! Este tipo de unión te permitirá ver todos los registros de ambas tablas, sin importar si hay coincidencias entre ellas. Los valores que no tengan coincidencia en la otra tabla se mostrarán como NULL. \-- SELECT PRODUCTS.PRODUCTS\_NAME, BRANDS.BRAND\_NAME, PRODUCTS.PRICE \-- FROM PRODUCTS \-- FULL OUTER JOIN BRANDS ON PRODUCTS.BRAND\_ID = BRANDS.BRAND\_ID; \-- MySQL no tiene soporte directo para el FULL OUTER JOIN, pero podemos emular su comportamiento utilizando una combinación de LEFT JOIN y RIGHT JOIN con la cláusula UNION. SELECT PRODUCTS.PRODUCTS\_NAME, BRANDS.BRAND\_NAME, PRODUCTS.PRICE FROM PRODUCTS LEFT JOIN BRANDS ON PRODUCTS.BRAND\_ID = BRANDS.BRAND\_ID UNION SELECT PRODUCTS.PRODUCTS\_NAME, BRANDS.BRAND\_NAME, PRODUCTS.PRICE FROM PRODUCTS RIGHT JOIN BRANDS ON PRODUCTS.BRAND\_ID = BRANDS.BRAND\_ID; \-- El CROSS JOIN es un tipo de JOIN que devuelve el producto cartesiano de dos tablas. Esto significa que combina cada fila de la primera tabla con cada fila de la segunda tabla. Es útil cuando deseas crear todas las combinaciones posibles de registros entre dos tablas SELECT PRODUCTS.PRODUCTS\_NAME, BRANDS.BRAND\_NAME FROM PRODUCTS CROSS JOIN BRANDS;
El error que estás viendo se debe a que **MySQL no soporta directamente la cláusula** `FULL OUTER JOIN`. Sin embargo, puedes simular un `FULL OUTER JOIN` usando una combinación de `LEFT JOIN` y `RIGHT JOIN` con la cláusula `UNION`. ### Solución: Puedes utilizar la siguiente consulta para simular un `FULL OUTER JOIN`: sqlCopiar código`SELECT p.id_productos, p.nombre AS producto, m.id_marcas, m.nombre AS` marca `FROM` productos p `LEFT JOIN marcas m ON p.id_marcas =` m.id\_marcas `UNION` `SELECT p.id_productos, p.nombre AS producto, m.id_marcas, m.nombre AS` marca `FROM` productos p `RIGHT JOIN marcas m ON p.id_marcas =` m.id\_marcas; ### Explicación: 1. `LEFT JOIN`: Recupera todas las filas de la tabla `productos` y las filas coincidentes de la tabla `marcas`. Si no hay coincidencia en `marcas`, los valores de las columnas de `marcas` serán `NULL`. 2. `RIGHT JOIN`: Recupera todas las filas de la tabla `marcas` y las filas coincidentes de la tabla `productos`. Si no hay coincidencia en `productos`, los valores de las columnas de `productos` serán `NULL`. 3. `UNION`: Combina los resultados de ambos `JOIN` para simular el comportamiento de un `FULL OUTER JOIN`. Esta consulta te permitirá ver todos los productos junto con sus marcas, incluyendo aquellos casos donde puedan no coincidir (si hubiera productos sin marca o marcas sin productos).
```js SELECT P.NAME AS PRODUCT_NAME , B.NAME AS BRAND_NAME FROM PRODUCTS AS P CROSS JOIN BRANDS AS B; ```
```js CREATE DATABASE IF NOT EXISTS CROSSJOIN; USE CROSSJOIN; CREATE TABLE IF NOT EXISTS BRANDS ( ID INTEGER PRIMARY KEY NOT NULL AUTO_INCREMENT, NAME VARCHAR(80) NOT NULL ); CREATE TABLE IF NOT EXISTS PRODUCTS ( ID INTEGER PRIMARY KEY NOT NULL AUTO_INCREMENT, NAME VARCHAR(80) NOT NULL, BRAND_ID INTEGER NOT NULL, FOREIGN KEY (BRAND_ID) REFERENCES BRANDS(ID) ); INSERT INTO BRANDS (NAME) VALUES ('Apple'), ('Samsung'), ('Nike'), ('Adidas'), ('Sony'); INSERT INTO PRODUCTS (NAME, BRAND_ID) VALUES ('iPhone 14', 1), ('MacBook Pro', 1), ('Galaxy S23', 2), ('Galaxy Tab', 2), ('Air Max 90', 3), ('Air Force 1', 3), ('UltraBoost', 4), ('Yeezy Boost', 4), ('PlayStation 5', 5), ('WH-1000XM4 Headphones', 5); SELECT * FROM BRANDS; SELECT * FROM PRODUCTS; ```
`SELECT` ` t1.*, ` `t2.* ` `FROM table1 t1` `LEFT JOIN table2 t2 ON t1.id = t2.id ` `UNION ` `SELECT ` `t1.*,` `t2.* ` `FROM table1 t1 ` `RIGHT JOIN table2 t2 ON t1.id = t2.id;`
por que al ejecutar la tabla marcas y productos me las muestra sin problema. pero al querer ejecutar el INNER JOIN me dice que la tabla productos no funciona? ![](https://static.platzi.com/media/user_upload/image-4980eb70-08ea-4ebb-a89f-32d5fb65e5ea.jpg)
\#### CROSS JOIN \> Usara cada fila de la tabla de la izquierda y la combinará con cada fila de la tabla de la derecha. ```mysql SELECT productos.nombre AS Producto, clientes.nombre AS Cliente FROM productos CROSS JOIN clientes; ```
Sintaxis `CROOS JOIN` ```python SELECT empleados.nombre, departamentos.nombre AS departamento FROM empleados CROSS JOIN departamentos; ```
Cross `SELECT ` ` productos.id AS producto_id, ` ` productos.nombre AS producto_nombre, ` ` productos.precio, ` ` marcas.id AS marca_id, ` ` marcas.nombre AS marca_nombre` `FROM ` ` productos` `CROSS JOIN ` ` marcas;`
Ver todas las combinaciones de productos y vendedores, y además mostrar el precio del producto y el email del vendedor ```js SELECT productos.nombre AS producto, productos.precio, vendedores.nombre AS vendedor, vendedores.email FROM productos CROSS JOIN vendedores; ``` En este caso, el resultado incluirá cada producto con cada vendedor, mostrando el nombre del producto, su precio, el nombre del vendedor y su email. ### Explicación del resultado Si tienes 5 productos y 5 vendedores, el `CROSS JOIN` generará 25 combinaciones (5 productos \* 5 vendedores = 25 filas en el resultado).
```js SELECT * FROM PRODUCTOS INNER JOIN MARCAS ON PRODUCTOS.ID = MARCAS.ID SELECT P.ID, P.NOMBRE, M.ID, M.NOMBRE FROM PRODUCTOS P INNER JOIN MARCAS M ON P.MARCA_ID = M.ID SELECT P.ID, P.NOMBRE, M.ID, M.NOMBRE FROM PRODUCTOS P LEFT JOIN MARCAS M ON P.MARCA_ID = M.ID SELECT P.ID, P.NOMBRE, M.ID, M.NOMBRE FROM PRODUCTOS P RIGHT JOIN MARCAS M ON P.MARCA_ID = M.ID SELECT P.ID, P.NOMBRE, M.ID, M.NOMBRE FROM PRODUCTOS P FULL JOIN MARCAS M ON P.MARCA_ID = M.ID ```
Entonces para que nos enseñas errores y casi media clase en ese error si ya teniamos calor lo de los alieas. 🤦🏻‍♂️
Para el cross Join no hace falta mencionar sobre que columnas queremos hacer la relacion con ON ya que esto simplemente creara esas relaciones posibles basando en todos los registros: ```js select P.PRODUCTID, P.PRODUCTNAME, P.DESCRIPTION, B.BRANDID, B.BRANDNAME from TPRODUCTS AS P FULL OUTER JOIN TBRANDS AS B; ```
Query utilizando CROSS JOIN: `SELECT P.id_products, P.name_products, B.name_brand` `FROM PRODUCTS P` `CROSS JOIN BRAND B` Resultado: ![](https://static.platzi.com/media/user_upload/cccc-de187c41-fa27-452a-b8a4-e19002241ebe.jpg)
Query con CROSS JOIN: ```js SELECT P.id_products, P.name_products, B.name_brand FROM PRODUCTS P CROSS JOIN BRAND B ```Resultado: ```txt id_products name_products name_brand 1 Laptop DELL 2 Smartphone DELL 3 Tablet DELL 1 Laptop SAMSUNG 2 Smartphone SAMSUNG 3 Tablet SAMSUNG 1 Laptop APPLE 2 Smartphone APPLE 3 Tablet APPLE ```
Query con CROSS JOIN: ```txt SELECT P.id_products, P.name_products, B.name_brand FROM PRODUCTS P CROSS JOIN BRAND B; ```Result ado: ![](https://carbon.now.sh/?bg=rgba%280%2C0%2C0%2C1%29\&t=seti\&wt=none\&l=auto\&width=680\&ds=true\&dsyoff=20px\&dsblur=68px\&wc=true\&wa=true\&pv=56px\&ph=56px\&ln=false\&fl=1\&fm=Hack\&fs=14px\&lh=133%25\&si=false\&es=2x\&wm=false\&code=id_products%2509name_products%2509name_brand%250A1%2509%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520Laptop%2509%2520%2520%2520%2520%2520DELL%250A2%2509%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520Smartphone%2509%2520DELL%250A3%2509%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520Tablet%2509%2520%2520%2520%2520%2520DELL%250A1%2509%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520Laptop%2520%2509SAMSUNG%250A2%2509%2509%2509%2509Smartphone%2509SAMSUNG%250A3%2509%2509%2509%2509Tablet%2509%2520%2520%2520%2520SAMSUNG%250A1%2509%2520%2509%2509%2509Laptop%2509%2509APPLE%250A2%2509%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520Smartphone%2509APPLE%250A3%2509%2509%2509%2509Tablet%2509%2520%2520%2520%2520APPLE)
Al ejecutar, select P.id, P.nombre, M.id, M.name from porductos P inner join marcas M on P.marca\_id = M.id; Me sale este resultado, con check verde: ...3 row(s) returned... Pero no logro visualizar la tabla unida, que me hará falta? ![](https://static.platzi.com/media/user_upload/image-4b91889c-23e8-4454-a13e-1f6fac057cc9.jpg)