Bienvenida conceptos básicos y contexto histórico de las Bases de Datos
Bienvenida conceptos básicos y contexto histórico de las Bases de Datos
Playground: tu primera consulta en bases de datos
Introducción a las bases de datos relacionales
Qué son entidades y atributos
Historia de las bases de datos relacionales
Entidades de Platzi Blog
Relaciones
Múltiples muchos
Diagrama ER
Diagrama Físico: tipos de datos y constraints
Diagrama Físico: normalización
Formas normales en Bases de Datos relacionales
Diagrama Físico: normalizando Platziblog
RDBMS (MySQL) o cómo hacer lo anterior de manera práctica
¿Qué es RDB y RDBMS?
Instalación local de un RDBMS (Windows)
Instalación local de un RDBMS (Mac)
Instalación local de un RDBMS (Ubuntu)
Clientes gráficos
Servicios administrados
SQL hasta en la sopa
Historia de SQL
DDL create
Playground: CREATE TABLE
CREATE VIEW y DDL ALTER
DDL drop
Playground: VIEW, ALTER y DROP en SQL
DML
Playground: CRUD con SQL
¿Qué tan standard es SQL?
Creando Platziblog: tablas independientes
Creando Platziblog: tablas dependientes
Creando Platziblog: tablas transitivas
Consultas a una base de datos
¿Por qué las consultas son tan importantes?
Estructura básica de un Query
SELECT
Playground: SELECT en SQL
FROM y SQL JOINs
Utilizando la sentencia FROM
Playground: FROM y LEFT JOIN en SQL
WHERE
Utilizando la sentencia WHERE nulo y no nulo
Playground: Filtrando Datos con WHERE
GROUP BY
ORDER BY y HAVING
Playground: Agrupamiento y Ordenamiento de Datos
El interminable agujero de conejo (Nested queries)
¿Cómo convertir una pregunta en un query SQL?
Preguntándole a la base de datos
Consultando PlatziBlog
Playground: Prueba Final con PlatziBlog
Introducción a la bases de datos NO relacionales
¿Qué son y cuáles son los tipos de bases de datos no relacionales?
Servicios administrados y jerarquía de datos
Manejo de modelos de datos en bases de datos no relacionales
Top level collection con Firebase
Creando y borrando documentos en Firestore
Colecciones vs subcolecciones
Recreando Platziblog
Construyendo Platziblog en Firestore
Proyecto final: transformando tu proyecto en una db no relacional
Bases de datos en la vida real
Bases de datos en la vida real
Big Data
Data warehouse
Data mining
ETL
Business intelligence
Machine Learning
Data Science
¿Por qué aprender bases de datos hoy?
Bonus
Bases de datos relacionales vs no relacionales
Elegir una base de datos
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Aportes 378
Preguntas 70
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;
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;
este profe es de lo mejor que vi en Platzi!
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
Perez Oso
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/
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;
Para mi base de datos uni tres tablas, las personas veganas, con los alimentos que consumen y ejercicios que práctican, así:
Hola buenas tardes !!! Dejo la captura de mi BD sobre una tienda de bicicletas y ejecutando algunas sentencias.
Excelente clase profe!!
Me ha quedado claro el tema de los JOINS
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. 😄
Esta clase me despejo varias dudas de como funcionaba los join o como tenia que entenderlos.
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.
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;
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.
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.
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;
Creo que falto explicar el NATURAL JOIN. Igual, excelent explicacion. Mucho mejor que en la universidad!
lo conseguiii…
@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
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.
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
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;
 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
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]
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
;```

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 😄
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
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.
Hola compañeros!
Les comparto mis apuntes sobre este tema
Increíble que hace 5 meses abandoné este curso
Quiza a alguien le sirva pero no me funcionó la consulta de la intersección
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 usuarios.id IS NULL;
Sin estan tomando el curso con versiones nuevas de SQL y la sintaxis no sirve, puede corregirla por medio de la siguiente pag
https://www.eversql.com/sql-syntax-check-validator/, seleccionando la versión y el motor BD
Este es un CheatSheet bien completo para el uso de los JOINS 😃
Descargar CheatSheet
Select -> Determines which columns to include in the query’s result set
From -> Identifies the tables from which to retrieve data and how the tables should be joined
Where - > Filters out unwanted data
Group by -> Used to group rows together by common column values
Having -> Filters out unwanted groups
Order by -> Sorts the rows of the final result set by one or more columns
— Mi aporte, selección de diferentes columnas de tres diferentes tablas
— Me guíe de unos comentarios de otros estudiantes.
– Mi proyecto es es una base de datos de la formula 1 - 2022.
<code>
select * from formula1.`conductores`
left join `equipos` ON `conductores`.equipo_id = `equipos`.id
union
select * from formula1.`conductores`
right join `equipos` ON `conductores`.equipo_id = `equipos`.id
;
select equipos.id, nombre_equipo, nombre, apellido, nombre_monoplaza
from formula1.`equipos`
join `conductores` on `equipos`.id = `conductores`.equipo_id
join `monoplazas` on `conductores`.monoplaza_id = `monoplazas`.id;
;
select conductores.id, nombre, apellido, nombre_monoplaza
from `conductores`
join `monoplazas`on `conductores`.monoplaza_id = `monoplazas`.id;
select nombre, apellido, nombre_monoplaza, nombre_equipo, nacionalidad
from `conductores`
join `monoplazas` on `conductores`.monoplaza_id = `monoplazas`.id
join `equipos` on `monoplazas`.equipo_id = `equipos`.id;
Debo decir que esta fue una de mis clases favoritas, como siempre el profesor lo explico de manera muy comprensible 😃
Estuve practicando con todas las sentencias.
les dejo este link , esuna manera mas visual de ver los resultados de los Joins
https://github.com/gerzahim/-fundaments-BD/blob/main/SQL_joins.sql
Quiero dejar este aportee! tal vez alguien lo conozca, tal ves no… Pero asi como le asignamos alias a las columnas, lo mismo podemos hacer con las tablas, tal cual la imagen, a usuarios lo llamo u y posts p y trae la misma info
Creo que esta imagen resumen mucho la clase de FROM
Estos son una consultas que hecho en mi proyecto.
- consulta de empleo por periodo
SELECT fecha_reporte
,num_admin_temp
,num_de_admin_permt
,num_temp_por_empresa
,num_aprendiz
FROM periodos
LEFT JOIN admin_temporal ON periodos.id = admin_temporal.id_periodo
LEFT JOIN admin_permanente ON periodos.id = admin_permanente.id_periodo
LEFT JOIN admin_temp_por_empresa ON periodos.id = admin_temp_por_empresa.id_periodo
LEFT JOIN admin_aprendiz ON periodos.id = admin_aprendiz.id_periodo;
-- seleccion de empresas con cero produccion por cada periodo
SELECT *
FROM periodos
LEFT JOIN produccion ON periodos.id = produccion.id_perido
WHERE produccion.produccion = 0 ;
Se me ocurre esta para hacer un reporte de cuanto demoraron en promedio los envios de las ordenes.
Select date_shipped, date_arrival FROM ecommerce.shipments
INNER JOIN ecommerce.orders ON shipments.order_id=orders.id
WHERE ecommerce.orders.id = 'Done';
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.
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
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?