Bienvenida conceptos básicos y contexto histórico de las Bases de Datos

1

Bienvenida conceptos básicos y contexto histórico de las Bases de Datos

Introducción a las bases de datos relacionales

2

Historia de las bases de datos relacionales

3

Entidades y atributos

4

Entidades de Platzi Blog

5

Relaciones

6

Múltiples muchos

7

Diagrama ER

8

Diagrama Físico: tipos de datos y constraints

9

Diagrama Físico: normalización

10

Formas normales en Bases de Datos relacionales

11

Diagrama Físico: normalizando Platziblog

RDBMS (MySQL) o cómo hacer lo anterior de manera práctica

12

¿Qué es RDB y RDBMS?

13

Instalación local de un RDBMS (Windows)

14

Instalación local de un RDBMS (Mac)

15

Instalación local de un RDBMS (Ubuntu)

16

Clientes gráficos

17

Servicios administrados

SQL hasta en la sopa

18

Historia de SQL

19

DDL create

20

CREATE VIEW y DDL ALTER

21

DDL drop

22

DML

23

¿Qué tan standard es SQL?

24

Creando Platziblog: tablas independientes

25

Creando Platziblog: tablas dependientes

26

Creando Platziblog: tablas transitivas

Consultas a una base de datos

27

¿Por qué las consultas son tan importantes?

28

Estructura básica de un Query

29

SELECT

30

FROM

31

Utilizando la sentencia FROM

32

WHERE

33

Utilizando la sentencia WHERE nulo y no nulo

34

GROUP BY

35

ORDER BY y HAVING

36

El interminable agujero de conejo (Nested queries)

37

¿Cómo convertir una pregunta en un query SQL?

38

Preguntándole a la base de datos

39

Consultando PlatziBlog

Introducción a la bases de datos NO relacionales

40

¿Qué son y cuáles son los tipos de bases de datos no relacionales?

41

Servicios administrados y jerarquía de datos

Manejo de modelos de datos en bases de datos no relacionales

42

Top level collection con Firebase

43

Creando y borrando documentos en Firestore

44

Colecciones vs subcolecciones

45

Recreando Platziblog

46

Construyendo Platziblog en Firestore

47

Proyecto final: transformando tu proyecto en una db no relacional

Bases de datos en la vida real

48

Bases de datos en la vida real

49

Big Data

50

Data warehouse

51

Data mining

52

ETL

53

Business intelligence

54

Machine Learning

55

Data Science

56

¿Por qué aprender bases de datos hoy?

Bonus

57

Bases de datos relacionales vs no relacionales

58

Elegir una base de datos

Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Utilizando la sentencia FROM

31/58
Recursos

Aportes 273

Preguntas 50

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Les dejo una pagina en donde podrán encontrar bases de datos y ejercicios de consultas para practicar sin la necesidad de ingresar los datos por si mismos 😉

https://josejuansanchez.org/bd/ejercicios-consultas-sql/index.html

comparto scrips que pueden servir.

use platziblog;

-- todos los usuarios tengan o no  un post relacionado
 select*
 from usuarios as u
 left join posts as p
 on u.id = p.usuario_id;
 
-- todos los usuarios que no han hecho post
 select*
 from usuarios as u
 left join posts as p
 on u.id = p.usuario_id
 where p.usuario_id IS NULL;

-- todos los post esten o no asociados con un usuario
 select*
 from usuarios as u
 right join posts as p
 on u.id = p.usuario_id;
 
 -- los post que no estan asociados con un usuario
 select*
 from usuarios as u
 right join posts as p
 on u.id = p.usuario_id
 where u.id is null;
 
 -- todos los usuarios que sí hayan hecho posts, con su respectivo post
  select*
 from usuarios as u
 inner join posts as p
 on u.id = p.usuario_id;
 
 -- conjunto universo UNION
  select*
 from usuarios as u
 left join posts as p
 on u.id = p.usuario_id
 UNION
  select*
 from usuarios as u
 right join posts as p
 on u.id = p.usuario_id;
 
 -- los usuarios que no hayan hecho un post, junto con los post que no tiene usuario
   select*
 from usuarios as u
 left join posts as p
 on u.id = p.usuario_id
 where p.usuario_id is NULL
 UNION
  select*
 from usuarios as u
 right join posts as p
 on u.id = p.usuario_id
 where p.usuario_id is NULL;
 

Me gustaría compartir este video a los que no les quedo claro (es increíblemente explícito): VIDEO

  1. Explicación verbal

  2. Explicación gráfica

La sentencia UNION elimina las filas repetidas.
La sentencia UNION ALL une completamente las 2 tablas.

Un código propio que hace un join entre usuarios, posts y categorias, mostrando justamente el nombre del usuario que escribió tal post y que categoría tiene ese mismos post 😊

select login, titulo, nombre_categoria from usuarios join posts on usuarios.id = posts.usuario_id join categorias on posts.categoria_id = categorias.id;

Debo admitir que me costo entender este tema de los join, me revolvia mucho, pero no hay nada que unos repasos y repeticiones de videos no lo solucionen xd y practicando claro

este profe es de lo mejor que vi en Platzi!

Perez Oso

Acá les dejo ejemplos de todos los tipos de JOIN para MySQL incluyendo la forma de algunos que no existen en MySQL pero que pueden hacerse de otra manera como el FULL OTER JOIN. Los ejemplos son con las mismas tablas del ejercicio por lo que les debe funcionar con copiar y pegar:

--JOINS
-- INNER JOIN: Muestra todos los registros de la tabla usuario y posts únicamente que tengan relación.

SELECT *
FROM usuarios AS u
INNER JOIN posts AS p
ON u.id = p.usuario_id;

--LEFT JOIN: Muestra todos los registros de la tabla usuario sin importar que no tengan --registros en la tabla posts.

SELECT *
FROM usuarios AS u
LEFT JOIN posts AS p
ON u.id = p.usuario_id;

--LEFT OUTER JOIN: Muestra unicamente los registros que de la tabla usuarios que no tienen --relación o registros en la tabla posts.

SELECT *
FROM usuarios AS u
LEFT JOIN posts AS p
ON u.id = p.usuario_id
WHERE p.id IS NULL;

--LEFT JOIN con Subquery: Muestra todos los registros de la tabla resultante de “SELECT * --FROM usuarios WHERE id = 1” (que es todos los registros de la tabla usuarios de id = 1) --tengan o no tengan relación registros en la tabla posts.

SELECT *
FROM (SELECT * FROM usuarios WHERE id = 1) AS u
LEFT JOIN posts AS p
ON u.id = p.usuario_id;



--RIGHT JOIN: Muestra todos los registros de la tabla posts, sin importar que no tengan --registros en la tabla usuarios.

SELECT *
FROM usuarios AS u
RIGHT JOIN posts AS p
ON u.id = p.usuario_id;

--RIGHT OUTER JOIN: Muestra unicamente los registros de la tabla posts, que no tengan --relación o registros en la tabla usuarios.

SELECT *
FROM usuarios AS u
LEFT JOIN posts AS p
ON u.id = p.usuario_id
WHERE p.id IS NULL;

--FULL JOIN: Funciona como un FULL JOIN en MYSQL y muestra todos los resultados de --ambas tablas usuarios y posts tengan o no tengan registros entre sí.

SELECT *
FROM usuarios AS u
LEFT JOIN posts AS p
ON u.id = p.usuario_id

UNION

SELECT *
FROM usuarios AS u
RIGHT JOIN posts AS p
ON u.id = p.usuario_id;

--Verdadera versión de FULL JOIN en oracle y postgreSQL:

SELECT *
FROM usuarios AS u
FULL JOIN posts AS p
ON u.id = p.usuario_id;

--FULL OUTER JOIN: Funciona como un FULL OUTER JOIN y muestra todos los resultados --de ambas tablas usuarios y posts que no tengan registros entre sí.

SELECT *
FROM usuarios AS u
LEFT JOIN posts AS p
ON u.id = p.usuario_id
WHERE p.id IS NULL

UNION

SELECT *
FROM usuarios AS u
RIGHT JOIN posts AS p
ON u.id = p.usuario_id
WHERE u.id IS NULL;

--Verdadera versión de FULL OUTER JOIN en oracle y postgreSQL:

SELECT *
FROM usuarios AS u
FULL OUTER JOIN posts AS p
ON u.id = p.usuario_id
WHERE u.id IS NULL or p.usuario_id IS NULL;

De otro curso de platzi, Alberto Alcocer “Beco” escribio este articulo del tema joins corto y conciso.

https://platzi.com/clases/1272-sql-mysql/11100-tipos-de-join/

Recuerden que el post huérfano no nos va a aparecer en ningún ejercicio que hagamos aquí con el profe porque cuando confugramos la base de datos de hecho la configuramos para que no puediera existir un post sin usuario por eso a la hora de hacer el INSERT y llenar la base de datos sale un error! y por ende no lo tenemos!!!

Ahora si quieren saber como hice para saltar el hueco de la clase 28 déjenme saber acá abajo en las respuestas a este aporte

Esta clase me despejo varias dudas de como funcionaba los join o como tenia que entenderlos.

INNER JOIN, es uno de los joins que mas se vaya a utilizar.
.
Alguno RDBMS no manejan el OUTER JOIN o FULL OUTER JOIN; Por lo tanto para poder realizar la misma función del dicho Join. Podemos realizar un query que traiga todo lo de la tabla A (LEFT JOIN) y unirlos (UNION) con todo lo de la Tabla B (RIGHT JOIN).
.
SELECT *
FROM usuarios
LEFT JOIN posts ON usuarios.id = posts.usuario_id
UNION
SELECT *
FROM usuarios
RIGHT JOIN posts ON usuarios.id = posts.usuario_id;

Para mi base de datos uni tres tablas, las personas veganas, con los alimentos que consumen y ejercicios que práctican, así:

Se inicia un nivel complejo de consultas pero con la explicación gráfica de la clase anterior y la explicación con scripts en ésta clase quedo muy claro el tema. Gracias.

  • Para la unión hay un tipo de JOIN que tienen algunos manejadores y otros no.
  • MySQL no maneja FULL OUTER JOIN que es el que trae la unión, por lo tanto, para traer los datos de ambos lados se hace un JOIN compuesto: LEFT JOIN + UNION + RIGHT JOIN

Las consultas utlizadas:

SELECT *
FROM alumnos a
INNER JOIN asignatura b on a.codigo_alu = b.codigo_alu;

SELECT *
FROM alumnos a
LEFT JOIN asignatura b on a.codigo_alu = b.codigo_alu;

SELECT *
FROM alumnos a
RIGHT JOIN asignatura b on a.codigo_alu = b.codigo_alu;

Hola buenas tardes !!! Dejo la captura de mi BD sobre una tienda de bicicletas y ejecutando algunas sentencias.

Creo que falto explicar el NATURAL JOIN. Igual, excelent explicacion. Mucho mejor que en la universidad!

Buenos días Comparto alguno de los Querys realizados, en el proyecto personal del curso.

Reto completado.

SELECT posts.titulo,usuarios.login,categorias.categoria 
FROM posts 
INNER JOIN usuarios ON posts.usuarios_id = usuarios.id 
INNER JOIN categorias ON posts.categorias_id = categorias.id;

Seleccione los posts que tienen asignado algun usuario y su respectiva categoria.

Para que la BD quede predeterminada o por defecto se hace lo siguiente.

  • Click derecho en la BD.

  • Click en la opción Set as Default Schema.

Excelente, ahora sabemos las distintas formas para utilizar los Join, pensaba que la forma para traer los datos sin tomar la intersección era escribiendo algo adicional al Join, pero resulta que tocaba combinarlo con el where para lograr el efecto deseado.

Con respecto a una de las consultas de mi base datos dejo la siguiente:

SELECT *
FROM articulos AS tbArti
INNER JOIN solicitudes AS tbSoli ON tbArti.Id_articulo = tbSoli.Id_articulo

Esta permite ver los artículos que se encuentran en las solicitudes y también le da un apodo a cada tabla para usarlas más fácilmente en futuras consultas.

	SELECT U.NickName, P.Titulo, count(C.Cometarios_Id) 'No.Comentarios'
	 FROM Usuarios U
	  LEFT JOIN Posts P
	   ON U.Usuarios_iD = P.Usuarios_Id
	  LEFT JOIN Cometarios C
	   ON C.posts_Id = P.posts_Id
	GROUP BY U.NickName, P.Titulo

Obtener los tipos de instrumentos de cada pieza musical.

SELECT nombre AS NOMBRE_PIEZA, nombre_tipo AS TIPO_INSTRUMENTO
FROM PIEZAS_INSTRUMENTOS
JOIN PIEZAS ON piezas_instrumentos.pieza_id = PIEZAS.ID
JOIN instrumentos ON PIEZAS_INSTRUMENTOS.INSTRUMENTO_ID = INSTRUMENTOS.ID
JOIN tiposinstrumento ON instrumentos.tipo_id = tiposinstrumento.ID;

Si solo usas JOIN para hacer consultas de bases de datos con cardinalidad de muchos a muchos ya que hay una tabla que une a otras dos.
/*

/*

SELECT	usuario_id AS id, nickname, fecha_publicacion AS fecha, estatus, nombre_categoria AS Categoria
FROM usuarios
INNER JOIN posts ON usuarios.id=posts.usuario_id
INNER JOIN categorias ON posts.categoria_id=categorias.id
WHERE	estatus = 'Activo'  AND categoria_id = 2;

![](

Yo hice esta sentencia para poder ver el autor, categoría y etiquetas de cada post:

SELECT usuarios.nickname as Autor, posts.titulo AS Título, categorias.nombre_categoria AS Categoría, etiquetas.nombre_etiqueta As Etiqueta
FROM	usuarios
	JOIN posts ON usuarios.id = posts.usuario_id
    JOIN categorias ON posts.categoria_id = categorias.id
	JOIN posts_etiquetas ON posts.id = posts_etiquetas.post_id
    JOIN etiquetas ON posts_etiquetas.etiqueta_id = etiquetas.id

Y resulta esto:

Si quieren entender mejor todo esto chequen el tema teoría de conjuntos del curso de Pensamiento Lógico. Ahí se explica más todo eso de los conjuntos en diagramas de Venn. 😄

Excelente clase profe!!
Me ha quedado claro el tema de los JOINS

lo conseguiii…

Mi petición era obtener los posts con el nickname de los usuarios que habían escrito el post y la categoría a que pertenece este post y mi código mi quedo así

SELECT nickname, titulo, categoria
FROM usuarios
	INNER JOIN 
(SELECT usuario_id, titulo, nombre as categoria
FROM posts
	RIGHT JOIN categorias ON posts.categoria_id = categorias.id) AS post ON usuarios.id = post.usuario_id
;

Algunos resultados 😉:

nickname titulo categoria
‘Lau’ ‘Ganador del premio Nobel por trabajo en genética’ ‘Ciencia’
‘Moni’ ‘Se descubre nueva partícula del modelo estandar’ ‘Ciencia’
‘Moni’ ‘Químicos descubren nanomaterial’ ‘Ciencia’
‘Lau’ ‘Se descubre la unión entre astrofísica y fisica cuántica’ ‘Ciencia’
‘Israel’ ‘Se presenta el nuevo teléfono móvil en evento’ ‘Tecnología’
‘Moni’ ‘Tenemos un nuevo auto inteligente’ ‘Tecnología’
‘Israel’ ‘Se mejora la conducción autónoma de vehículos’ ‘Tecnología’
‘Israel’ ‘Fuccia OS sacude al mundo’ ‘Tecnología’

.
.
.

Voy en la mitad de un curso de fundamentos de BD y siento que me explota la cabeza con lo que he aprendido hasta ahora… mucho más de lo que aprendí en la universidad y emocionado por lo que queda

Full Outer Join fue mi favorito!!!
SELECT * FROM usuarios
LEFT JOIN posts ON usuarios.id= posts.usuario_id
WHERE posts.usuario_id IS NULL
UNION
SELECT * FROM usuarios
RIGHT JOIN posts ON usuarios.id= posts.usuario_id
WHERE posts.usuario_id IS NULL;

FROM: Es una sentencia que nos permite ver la información separada en diferentes tablas y nos permite traerla y unirla nuevamente para presentarla como si fuera una sola tabla. Dentro del from tenemos distintas opciones para mostrar cual es la prioridad, si la tabla a o la b, o solo las que tengan en común.

SELECT *
FROM futbolistas
INNER JOIN equipos ON futbolistas.id_equipo = equipos.id_equipos
INNER JOIN nacionalidad ON futbolistas.id_nacionalidad = nacionalidad.id_nacionalidad

Con esto uní los datos de las 3 tablas.

SELECT *
FROM usuarios
LEFT JOIN post ON usuarios.id = post.usuario_id
WHERE post.usuario_id IS NULL
UNION
SELECT *
FROM usuarios
RIGHT JOIN post ON usuarios.id = post.usuario_id
WHERE post.usuario_id IS NULL;

Comparto el código de la Query que une la tabla posts con la tabla etiqueta a través de la tabla posts_etiquetas

select posts.id, posts.titulo, posts.fecha_publicacion, etiquetas.nombre_etiqueta
from posts
	left join posts_etiquetas on posts.id = posts_etiquetas.post_id
    left join etiquetas on etiquetas.id = posts_etiquetas.etiqueta_id;```

Aquí está mi proyecto haciendo un JOIN LEFT con 3 tablas y usando el SELECT para mostrar la información más relevante.

Un dato curioso es que si se utiliza la sentencia where en la tabla opuesta a la que apunta el left join o right join, se convierte automáticamente se en un inner join

Ejemplo:

	SELECT P.Titulo, C.Cometarios_Id
	 FROM Posts P	   
	  LEFT JOIN Cometarios C
	   ON C.posts_Id = P.posts_Id
	WHERE C.Cometarios_Id is not null

USE SkySolutionsCRM
SELECT invoiceRouteId AS RUTA
,[invoiceDate] AS FECHA_FACTURACION
,[invoiceID] AS FACTURA
,invoiceTotalToPayCalculated AS TOTAL_FACTURA
, [custName] AS NAME
FROM [SkySolutionsCRM].[dbo].[tblInvoices]
right JOIN customer_discount ON tblInvoices.custID=customer_discount.custID
WHERE invoiceDate='2020-01-06’
order by invoiceRouteId,[custName]

@10:27
la consulta con UNION
Solo me funciona en windows después de agregar paréntesis

(SELECT * 
FROM usuarios
	LEFT JOIN posts on usuarios.id = posts.usuario_id)
UNION
(SELECT * 
FROM usuarios
	RIGHT JOIN posts ON usuarios.id = posts.usuario_id);

venga los Windows haters! quiero a Windows como quiero a mi padre abusivo

SELECT *
FROM TABLA_LEFT
	RIGHT/LEFT JOIN TABLA_RIGHT 
	ON TABLA_LEFT.PRIMARY_KEY = TABLA_RIGHT.FOREIGN_KEY
WHERE
CONDICION;

Comparto mi consulta para saber de que categoría son es cada post

SELECT post.titulo,post.categoria_id  ,categorias.nombre_categoria,categorias.id
FROM categorias
INNER JOIN post ON  categorias.id = post.categoria_id 
;```

![Captura.PNG](https://static.platzi.com/media/user_upload/Captura-6eb68bc6-8af9-44f7-870c-cfec99527ab4.jpg)

Un comentario
en el join de diferencia simetrica se usa el posts.usuario_id dentro de la condicion where. Pero que pasa si el usuario_id tiene un valor que no existe en la tabla usuario? por ejemplo usuario_id = 400, tendria que cambiar el campo a validar dentro de la condicion where no??
seria where usuario.id is null

Left Join: Seleccione todos los registros de la Tabla A, junto con los registros de la Tabla B para los cuales se cumple la condición de unión (si es que se cumple).

Este link podría ser útil para el ejercicio que nos propone el profesor, basado en ese blogpost hice lo siguiente, traje el título de cada post y el nombre de su etiqueta, puede sonar fácil, pero como sabemos posts y etiquetas están unidos por una tabla intermedia, entonces hay que unir tres tablas, acá el código:

SELECT 
	posts.titulo as 'Título', etiquetas.nombre as 'Tag'
FROM posts
JOIN posts_etiquetas 
	ON posts.id = posts_etiquetas.post_id
JOIN etiquetas
	ON etiquetas.id = posts_etiquetas.etiqueta_id;

Primero se hace el JOIN de posts con posts_etiquetas, para obtener el id del post que está relacionado con una etiqueta, luego, se hace el siguiente JOIN con la tabla etiquetas para que las etiquetas conectadas con la tabla intermedia puedan ser mostradas.

Espero haber sido claro y también que esto sea de ayuda para alguien 😄

Este es un select de mi proyecto personal el cual consiste en crear una BD de Paises, datos de este y su comida típica, para unir varias tablas como en mi caso que uní 4 basta con repetir la sentencia left y on y los alias también son muy útiles, y en el select le podemos decir que campos queremos ver y con que nombre.

LEFT JOIN usuarios y posts

USE platzi blog;

SELECT *
FROM  usuarios
	LEFT JOIN posts ON usuarios.id = posts.usuario_id;

left join intersección

USE platziblog;

SELECT *
FROM  usuarios
	LEFT JOIN posts ON usuarios.id = posts.usuario_id
    WHERE posts.usuario_id IS NULL;

Rigth join

USE platziblog;

SELECT *
FROM  usuarios
	RIGHT JOIN posts ON usuarios.id = posts.usuario_id;

raigth join intersección

USE platziblog;

SELECT *
FROM  usuarios
	RIGHT JOIN posts ON usuarios.id = posts.usuario_id
    WHERE posts.usuario_id IS NULL;

interseccion

USE platziblog;

SELECT *
FROM  usuarios
	INNER JOIN posts ON usuarios.id = posts.usuario_id;

unión

USE platziblog;

SELECT *
FROM  usuarios
	LEFT JOIN posts ON usuarios.id = posts.usuario_id
    UNION
    select *
    FROM usuarios
    RIGHT JOIN posts ON usuarios.id = posts.usuario_id;

diferencia simetrica

USE platziblog;

SELECT *
FROM  usuarios
	LEFT JOIN posts ON usuarios.id = posts.usuario_id
    WHERE posts.usuario_id IS NULL
    UNION
    select *
    FROM usuarios
    RIGHT JOIN posts ON usuarios.id = posts.usuario_id
    WHERE posts.usuario_id IS NULL;

gran explicacion! aclaro algunas dudas y ayudara a aprovechar mejor la logica de negocio de las aplicaciones!

por si les sirve

algunos ejemplos

Esto es verdaderamente útil, es el pan de cada día de los programadores

Muestro otra de mis consultas, siguiendo este tutorial…

UNION: Une todas las tuplas distintas.
UNION ALL: Une todas las tuplas sin distinción.

Lectura del primer comando de la clase:

Selecciona todos los datos (SELECT *) de la tabla usuarios (FROM) y en la parte izquierda de la consulta añade la tabla post (LEFT JOIN) y la unimos con el iD de la tabla usuario (ON usuarios id) para que se relacione con el ID de la tabla post (= posts usuario_id).

El resultado de la sentencia son los usuarios que tienen o no post publicados.

Ejemplo de SELECT con la base de datos del profe:

FROM permite saber la información de diferentes tablas, trayéndola y uniéndola en una sola tabla. Haciendo uso de LEFT, RIGHT, INNER o diferencia, para filtrar la información según la necesidad final.

Buenas noches,
Para que nos retorne resultado al buscar el post o"huerfano" se de hacer un alter a la tabla posts permitiendo que los camposusuario_id,categoria_id sean NULL y así obtener el resultado que el profe expresa en la clase. Saludos

Recordemos que en ocasiones los datos que cargamos a partir de lo compartido por el profesor no siempre van a cargar.
La razón es simple: Cuando creamos nuestras tablas pusimos algunos constraints, si alguno de esos era not null, no podrá crearse un post sin ningún usuario asociado y saltará un error.

FUN FACT 😎

  1. escribe con minúculas aunque pueda parecer mala practica también funciona!

https://sql-playground.com/#
para hacer ejercicios

Mi ejemplo usando tres LEFT JOIN para traer datos de una tercera tabla y unirla a una 2da tabla.
Y todo con mi base datos de One Piece 🤠🏴‍☠️

select personajes.id, nombre as "Nombre" , nombre_fruta as "Fruta del Diablo", tipos_frutas.tipo as "Tipo de Fruta", ocupacion as "Ocupación"
from one_piece.personajes
left join one_piece.frutas on personajes.fruta_id = frutas.id
left join one_piece.tipos_frutas on frutas.tipo_fruta_id = tipos_frutas.id
left join one_piece.ocupaciones on personajes.ocupacion_id = ocupaciones.id;

Recuerden que si tenemos duplicados al unir dos tablas el UNION nos elimina los duplicados. Si queremos preservarlos podemos usar el UNION ALL

les comparto la consulta que realice la cual muestra el id, titulo, usuario, categoria, fecha de publicacion de los post que publico el usuario con nombre israel ordenados por id del post

select id_post as id, titulo, nickname as usuario, nom_categoria as categoria, fecha_publicacion
from post as p
inner join usuarios as u on p.id_usuarios = u.id_usuarios
inner join categorias as c on p.categorias_id = c.id
where u.nickname = 'israel'
order by id_post;

;

Armé una consulta uniendo 4 tablas de mi proyecto y funcionó 😄

select d.sales_id, a.first_name, a.last_name, b.razon_social, c.marca, c.modelo, c.costo_venta, c.ganancia
from sales d
join asesor a on a.asesor_id = d.asesor_id
join customer_corporate b on b.corporate_id = d.corporate_id
join product c on c.product_id = d.product_id
where sales_id= ‘1’ or sales_id=‘2’ or sales_id=‘3’

Un aporte que note que el profe no dijo, que para hacer el unión las tablas tienen que tener los mismos campo en su mismo orden y tipo de datos deben de coincidir para que se lleve a acabo.

UNION selecciona solo registros distintos, por eso es que en el ejemplo da la totalidad de los conjuntos, para aceptar duplicados se utiliza UNION ALL

Sentencia final

SELECT *
FROM platziblog.usuarios AS u
LEFT JOIN platziblog.posts AS p
ON u.id = p.usuario_id
WHERE p.usuario_id IS NULL
UNION
SELECT *
FROM platziblog.usuarios AS u
RIGHT JOIN platziblog.posts AS p
ON u.id = p.usuario_id
WHERE p.usuario_id IS NULL;

Explicar la clausula JOIN después de haber aplicado las reglas de Codd y obtener nulos o tuplas huerfánas es ambiguo, para un público nuevo violar la integridad de los datos significa un diseño que no va por buen camino!

-- get all the people with and without posts
 SELECT *
 FROM people
 LEFT JOIN posts
 ON people.id = posts_id
 
-- get all the people who does not have any post
 SELECT *
 FROM people
 LEFT JOIN posts
 on people.id = posts.person_id
 WHERE p.usuario_id IS NULL;

-- get all the post with and without user
 SELECT *
 FROM people
 RIGHT JOIN posts
 ON people.id = posts_id
 
 -- get all the posts without user
 SELECT *
 FROM people
 RIGHT JOIN posts
 on people.id = posts.person_id
 WHERE people.id is null;
 
 -- get all the user whit post or and post whit user
 -- this is the most used query
  SELECT *
 FROM people
 INNER JOIN posts
 ON people.id = posts_id
 
 -- get all the posts and users(UNION)
 -- FULL OUTER JOIN is a similar option
 -- but in MySQL is not supported
  SELECT *
 FROM people
 LEFT JOIN posts
 on people.id = posts.person_id
 UNION
  SELECT *
 FROM people
 RIGHT JOIN posts
 ON people.id = posts_id
 -- UNION deletes the deplicate rows
 -- UNION ALL joins the tables completely
 
 -- get all the users whitout posts and posts whitout user
   SELECT *
 FROM people
 LEFT JOIN posts
 on people.id = posts.person_id
 WHERE p.usuario_id is NULL
 UNION
  SELECT *
 FROM people
 RIGHT JOIN posts
 on people.id = posts.person_id
 WHERE p.usuario_id is NULL;

Mis Notas:

-- Trae a todos los usuarios tengan y no tengan posts
SELECT *
FROM usuarios
    LEFT JOIN posts ON usuarios.id_usuario = posts.id_usuario;

-- Trae a sólo los usuarios que no tengan posts
SELECT *
FROM usuarios
    LEFT JOIN posts ON usuarios.id_usuario = posts.id_usuario
WHERE posts.id_usuario IS NULL;

-- Trae a todos los post que tengan y no tengan asociado un usuario
SELECT *
FROM usuarios
    RIGHT JOIN posts ON usuarios.id_usuario = posts.id_usuario;

-- Trae a sólo los posts que no tengan usuario
SELECT *
FROM usuarios
    RIGHT JOIN posts ON usuarios.id_usuario = posts.id_usuario
WHERE posts.id_usuario IS NULL;

-- Trae a todos los posts que tengan un usuario o todos los usuarios que tengan posts (Intercepción)
SELECT *
FROM usuarios
    INNER JOIN posts ON usuarios.id_usuario = posts.id_usuario;

-- Trae a todos los usuarios tengan y no tengan posts y todos los post que tengan o no un usuario asociado (Unión)
SELECT *
FROM usuarios
    LEFT JOIN posts ON usuarios.id_usuario = posts.id_usuario
UNION
SELECT *
FROM usuarios
    RIGHT JOIN posts ON usuarios.id_usuario = posts.id_usuario

-- Trae a todos los usuarios no tengan posts y todos los post que no un usuario asociado (Diferencia Simétrica)
SELECT *
FROM usuarios
    LEFT JOIN posts ON usuarios.id_usuario = posts.id_usuario
WHERE posts.id_usuario IS NULL
UNION
SELECT *
FROM usuarios
    RIGHT JOIN posts ON usuarios.id_usuario = posts.id_usuario
WHERE posts.id_usuario IS NULL;
-- Ejemplo de FROM JOIN con tres Tablas (Todos los usuarios tengan o no posts y con o sin categorias)
SELECT login, nickname, email, titulo, estatus, nombre_categoria
FROM usuarios
    LEFT JOIN posts ON usuarios.id_usuario = posts.id_usuario
    LEFT JOIN categorias on  categorias.id_categoria = posts.id_categoria;

Vale la pena mencionar que en el código también puede colocar la condición WHERE posts.usuarios_id IS NOT NULL, en este caso estarías excluyendo los usuarios que no tiene un post, y los posts que no tienen un usuario

Asi logre juntar los usuarios con los posts y los post con los comentarios.

select usuarios.nickname as 'Username', posts.titulo as 'Encabezado',posts.fecha_publicacion as 'date', comentarios.cuerpo
from posts
inner join usuarios on usuarios.id = posts.usuario_id
inner join comentarios on posts.id=comentarios.post_id;

Este es mi consulta de varias tablas, problema: la columna id se llama igual en tres de las tablas con las que se hace el join y se inserta como un registro en vez de como una columna, me quedo esto de tarea para corregir.

SELECT * FROM 
autores 
inner join nacionalidades on autores.nacionalidad_id = nacionalidades.id
UNION
SELECT * FROM
autores
inner join profesiones on autores.profesion_id = profesiones.id
UNION
SELECT * FROM
autores
left join universidades on autores.universidad_id = universidades.id

resultado
__

– a que casa productora pertenece cada CEO (quiero nombre completo, correo y telefono y el nombre de la casa productora)?

SELECT ceo_musical_groups.name, ceo_musical_groups.last_name, ceo_musical_groups.email, ceo_musical_groups.cellphone, producer_houses.name AS producer_house_name
FROM registers_to_ph
INNER JOIN ceo_musical_groups ON ceo_musical_groups.id_ceo = registers_to_ph.id_ceo_fk
INNER JOIN producer_houses ON producer_houses.id_producer_house = registers_to_ph.id_producer_house_fk;

Pues probé a unir tres tablas con JOIN y pues aprendí a hacerlo.
Con mi proyecto sobre autos.
Logré unir las tablas: motores, fabricante_autos y vehiculos.

Query:

SELECT fabricante_autos.nombre AS Marca ,vehiculos.nombre AS Modelo, vehiculos.modelo AS Anio, motores.nombre AS Motor, motores.potencia_hp AS 'Potencia(Hp)'
FROM vehiculos
INNER JOIN fabricante_autos ON vehiculos.fabricante_auto_id = fabricante_autos.fabricante_id
INNER JOIN motores ON vehiculos.motor_id = motores.id;

Resultado:

No se si solo es persepción mia, no sabia nada de BD, y creia que era un tema compicado, pero con este curo y lo bien que enseña el profe veo que es algo sencillo y a la vez interesante.

Esta clase me ha permitido entender correctamente la diferencia que existe entre cada JOIN.
Si bien algunos de ellos no se encuentran disponibles de forma natural en algunos RDBMS, sus pollyfils los entendí a la perfección.

Debería enseñarse el método insert y también seria genial aprender a importar datos desde una tabla de excel por ejemplo

Muy Buena Lección !!!

Excelente video realmente cada vez que veo uno de estos vídeos me gusta mas la parte de base de datos

Excelente video 😃

SELECT *
FROM muebles
LEFT JOIN ventas ON muebles.id = ventas.muebles_id;

Excelente explicación!!! Muy buen profe!!

Realmente, excelente profesor!! espero que te hayan pagado bien por estas clases, porque realmente te lo mereces !!!

Excelente muy bien profundizado.

FULL OUTER JOIN se reemplaza por UNION de LEFT y RIGHT en mysql ya que no existe tal sentencia

Vole por unos minutos, definitivamente tengo que volver a ver el video.

Si alguien tiene problemas intenten espesificando la base de datos platziblog.

select u.login, u.email, p.titulo, p.contenido, p.estatus
from usuarios as u
inner join posts as p on u.i d = p.usuario_id

usando alias resulta mas comodo y corto a la hora de unir

Como aporte, ópino que debería ejecutarse la sentencia de la siguiente manera, ya que estamos buscando (en el full outer join) la totalidad de los datos. Por ende debe ir is not null y null.

select *
from usuarios
 left join posts ON usuarios.id = posts.usuario_id
WHERE posts.usuario_id is not null and posts.usuario_id is null
UNION
select *
from usuarios
 right join posts ON usuarios.id = posts.usuario_id
WHERE posts.usuario_id is not null and posts.usuario_id is null;

Lo que yo hice fue que me muestra los nombres que publicaron algun posts, el nombre del post, la fecha de su publicacion y el nombre de la categoria que esta asociada al post.

SELECT a.login, b.titulo,DATE(b.fecha_publicacion), c.nombre
FROM usuarios as a
	INNER JOIN posts as b 
ON a.id = b.usuario_id
	INNER JOIN categorias as c
ON b.categoria_id = c.id;