bueno, en esta imagen se aprecia la separacion de los join con su respectivo codigo basico
 trayendo una lista de los alumnos (customers) con su respectivo tutor_id (company) de la carrera (location) que tuviera más alumnos (customers).
DE acuerdo a este test que por cierto no pude resolver en el tiempo indicado hago un query para esta DB equivalente, espero les ayude en algo, a entender un poco también como es el ambiente laboral con SQL.
SELECTCONCAT(a.nombre,' ', a.apellido), a.tutor_idFROM platzi.alumnosAS a
JOIN platzi.carrerasAS c
ON c.id= a.carrera_idWHERE c.id=(SELECT c.idFROM platzi.carrerasAS c
INNERJOIN platzi.alumnosAS a
ON a.carrera_id= c.idGROUPBY c.idORDERBYCOUNT(*)DESCLIMIT1);
La verdad era sencilla la prueba pero bueno faltaba un poquito más de práctica...
Gracias por compartirnos tu experiencia.
SELECT maxCarrera.`carrera`,concat(ifnull(a.nombre,''),' ',ifnull(a.apellido,''))as estudiante
,concat(ifnull(t.nombre,''),' ',ifnull(t.apellido,''))as tutor
FROM alumnos a
INNERJOIN alumnos t on(t.id= a.tutor_id)INNERJOIN(SELECT ca.id, ca.carrera,count(a.carrera_id) cant_alumnos
FROM carreras ca
INNERJOIN alumnos a on(a.carrera_id=ca.id)GROUPBY ca.idORDERBY cant_alumnos DESCLIMIT1)as maxCarrera on maxCarrera.id= a.carrera_id;
En la siguiente imagen comparto los ejercicios hechos en clase con su respectivo diagrama de venn:
Gracias por esto.
¡GRAN APORTACIÓN! Muchas gracias
Me parece que hay un error al momento de usar WHERE en los JOIN.
Se debería manejar con las KEYS, en este caso sería:
WHERE a.carrera_idISNULLOR c.idISNULL
Pienso lo mismo
Pienso igual
--LEFTJOINEXCLUSIVOSELECT a.nombre, a.apellido, a.carrera_id, c.id, c.carreraFROM platzi.alumnosAS a
LEFTJOIN platzi.carrerasAS c
ON a.carrera_id= c.idWHERE c.idISNULL;--LEFTJOINSELECT a.nombre, a.apellido, a.carrera_id, c.id, c.carreraFROM platzi.alumnosAS a
LEFTJOIN platzi.carrerasAS c
ON a.carrera_id= c.idORDERBY c.idDESC;--RIGHTJOINSELECT a.nombre, a.apellido, a.carrera_id, c.id, c.carreraFROM platzi.alumnosAS a
RIGHTJOIN platzi.carrerasAS c
ON a.carrera_id= c.idORDERBY c.idDESC;--RIGHTJOINEXCLUSIVESELECT a.nombre, a.apellido, a.carrera_id, c.id, c.carreraFROM platzi.alumnosAS a
RIGHTJOIN platzi.carrerasAS c
ON a.carrera_id= c.idWHERE a.idISNULLORDERBY c.idDESC;--INNERJOINSELECT a.nombre, a.apellido, a.carrera_id, c.id, c.carreraFROM platzi.alumnosAS a
INNERJOIN platzi.carrerasAS c
ON a.carrera_id= c.idORDERBY c.idDESC;SELECT a.nombre, a.apellido, a.carrera_id, c.id, c.carreraFROM platzi.alumnosAS a
JOIN platzi.carrerasAS c
ON a.carrera_id= c.idORDERBY c.id;--FULLOUTERSELECT a.nombre, a.apellido, a.carrera_id, c.id, c.carreraFROM platzi.alumnosAS a
FULLOUTERJOIN platzi.carrerasAS c
ON a.carrera_id= c.idORDERBY c.id;--EXCLUSIVEFULLOUTERJOINSELECT a.nombre, a.apellido, a.carrera_id, c.id, c.carreraFROM platzi.alumnosAS a
FULLOUTERJOIN platzi.carrerasAS c
ON a.carrera_id= c.idWHERE a.idISNULLOR c.idISNULLORDERBY a.carrera_idDESC,c.idDESC;
full outer join es igual que full join?
Hola Liz
Si, es lo mismo. Pasa también con LEFT OUTER JOIN, que puedes indicarlo solo como LEFT JOIN y, por cierto, RIGHT OUTER JOIN como RIGHT JOIN. O INNER JOIN puedes indicarlo solo como JOIN.
La diferencia es solo un asunto de revisión del lenguaje, cosa que ha ocurrido varias veces.
Dejop un aporte
Desafío:
--Left join exclusivo:Traigo todos los alumnos que no tienen info de carrera
SELECT a.nombre, a.apellido, a.carrera_id, c.id, c.carreraFROM platzi.alumnosAS a
LEFTJOIN platzi.carrerasAS c
ON a.carrera_id= c.idWHERE c.idISNULL;--Left join:Traigo todos los alumnos, sin importar si tienen o no carreras
SELECT a.nombre, a.apellido, a.carrera_id, c.id, c.carreraFROM platzi.alumnosAS a
LEFTJOIN platzi.carrerasAS c
ON a.carrera_id= c.idORDERBY c.idDESC;--Right join:Traigo todas las carreras sin importar si tienen o no alumnos
--No veremos los alumnos que se inscribieron entre la 30 y 40 que no existen
SELECT a.nombre, a.apellido, a.carrera_id, c.id, c.carreraFROM platzi.alumnosAS a
RIGHTJOIN platzi.carrerasAS c
ON a.carrera_id= c.idORDERBY c.idDESC;--Right join exclusive:Solo las carreras que no tienen alumnos
SELECT a.nombre, a.apellido, a.carrera_id, c.id, c.carreraFROM platzi.alumnosAS a
RIGHTJOIN platzi.carrerasAS c
ON a.carrera_id= c.idWHERE a.idISNULLORDERBY c.idDESC;--Join solo o Inner join:Aquello que tienen en comun ambas tablas
SELECT a.nombre, a.apellido, a.carrera_id, c.id, c.carreraFROM platzi.alumnosAS a
INNERJOIN platzi.carrerasAS c
ON a.carrera_id= c.idORDERBY c.idDESC;--Join mas usado.-- Ó
SELECT a.nombre, a.apellido, a.carrera_id, c.id, c.carreraFROM platzi.alumnosAS a
JOIN platzi.carrerasAS c
ON a.carrera_id= c.idORDERBY c.idDESC;--Join mas usado.--Diferencia simétrica:Contrario al inner join:--Está en cada tabla pero no en la otra
SELECT a.nombre, a.apellido, a.carrera_id, c.id, c.carreraFROM platzi.alumnosAS a
FULLOUTERJOIN platzi.carrerasAS c
ON a.carrera_id= c.idWHERE a.idISNULLOR c.idISNULLORDERBY a.carrera_idDESC, c.idDESC;
super buen aporte !!!
Dejo un aporte extra con las principales diferencias de los joins.
lo dejo en formato markdown por si alguien lo necesita
Tipo de JOIN
Descripción
INNER JOIN
Devuelve filas cuando hay una coincidencia en ambas tablas
LEFT JOIN
Devuelve todas las filas de la tabla izquierda, incluso si no hay coincidencias en la tabla derecha
RIGHT JOIN
Devuelve todas las filas de la tabla derecha, incluso si no hay coincidencias en la tabla izquierda
FULL OUTER JOIN
Combina los resultados de los LEFT y RIGHT OUTER JOIN. La tabla unida contendrá todos los registros de ambas tablas y rellenará con NULLs las coincidencias faltantes en cualquier lado
CROSS JOIN
Produce un producto cartesiano entre las dos tablas, devolviendo todas las combinaciones posibles de todas las filas. No tiene cláusula ON porque simplemente está uniendo todo con todo
NATURAL JOIN
Une dos tablas basándose en columnas con el mismo nombre y tipo de datos en ambas tablas
SELF JOIN
Une una tabla consigo misma como si la tabla fuera dos tablas, renombrando temporalmente al menos una tabla en la declaración SQL
Comparto tutorial de este Crack
SQL desde Cero
Super bueno!! Muchas gracias :D
-- solo los alumnos que están en las carreras que eliminamos del conjunto de carreras → LEFTJOIN exlusivo --SELECTCONCAT(a.nombre,' ', a.apellido)AS full_name, a.carrera_id, c.id, c.carreraFROM platzi.alumnosAS a
LEFTJOIN platzi.carrerasAS c
ON a.carrera_id= c.idWHERE c.idISNULLORDERBY a.carrera_idDESC
.
---
.
-- alumnos que están o no en las carreras que eliminamos del conjunto → eliminamos el WHERE, pasa de ser LEFTJOIN exlusivo
-- a un LEFTJOIN inclusivo
SELECTCONCAT(a.nombre,' ', a.apellido)AS full_name, a.carrera_id, c.id, c.carreraFROM platzi.alumnosAS a
LEFTJOIN platzi.carrerasAS c
ON a.carrera_id= c.idORDERBY a.carrera_idDESC
.
---
.
-- alumnos que no están en las carreras que eliminamos así como las carreras sin alumnos --SELECTCONCAT(a.nombre,' ', a.apellido)AS full_name, a.carrera_id, c.id, c.carreraFROM platzi.alumnosAS a
RIGHTJOIN platzi.carrerasAS c
ON a.carrera_id= c.idORDERBY a.carrera_idDESC--RIGHTJOIN inclusivo
.
---
.
-- carreras sin alumnos
SELECTCONCAT(a.nombre,' ', a.apellido)AS full_name, a.carrera_id, c.id, c.carreraFROM platzi.alumnosAS a
RIGHTJOIN platzi.carrerasAS c
ON a.carrera_id= c.idWHERE a.carrera_idISNULLORDERBY a.carrera_idDESC--RIGHTJOIN exclusivo
.
---
.
-- alumnos que están o no en carreras que tienen o no alumnos --SELECTCONCAT(a.nombre,' ', a.apellido)AS full_name, a.carrera_id, c.id, c.carreraFROM platzi.alumnosAS a
FULLOUTERJOIN platzi.carrerasAS c
ON a.carrera_id= c.idORDERBY a.carrera_idDESC--FULLOUTERJOIN
.
---
.
-- alumnos que están en las carreras no borradas y en carreras con alumnos --SELECTCONCAT(a.nombre,' ', a.apellido)AS full_name, a.carrera_id, c.id, c.carreraFROM platzi.alumnosAS a
INNERJOIN platzi.carrerasAS c
ON a.carrera_id= c.idORDERBY a.carrera_idDESC
.
---
.
-- alumnos que están en el grupo de las carreras que fueron borradas y carreras sin alumnos --SELECTCONCAT(a.nombre,' ', a.apellido)AS full_name, a.carrera_id, c.id, c.carreraFROM platzi.alumnosAS a
FULLOUTERJOIN platzi.carrerasAS c
ON a.carrera_id= c.idWHERE a.carrera_idISNULLOR c.idISNULLORDERBY a.carrera_idDESC--Diferencia simétrica
Por qué aunque no existe el campo
a.id
aún así le carga bien cuando corre la sentencia:
SELECT a.nombre, a.apellido, a.carrera_id, c.id, c.carreraFROM platzi.alumnosAS a
FULLOUTERJOIN platzi.carrerasAS c
ON a.carrera_id= c.idWHERE a.idISNULLOR c.idISNULLORDERBY c.idDESC
Hola Daniel, el campo a id sí existe en la tabla platzi alumnos.
En la parte del ON
¿Siempre se realiza mediante los id?
ON a.carrera_id= c.id
Además ¿Por qué el igual? Gracias de antemano.
En el ON se hace la "union" de las llaves foraneas y llaves primarias, es comun que estas llaves sean los id's, pero pueden ser cosas como un nombre de usario, email, numero de telefono, etc.
a mi no me aparece los null, ya de plano no aparecern
Reto: Obtener el listado de los alumnos de la carrera que tenga más alumnos
SELECTCONCAT(nombre,' ',apellido)AS nombre, tutor_id
FROM platzi.alumnosWHERE carrera_id =(--Carrera con mas alumnos
SELECT carrera_id
FROM platzi.alumnosGROUPBY carrera_id
ORDERBYCOUNT(*)DESCLIMIT1)
El estándar SQL especifica cinco tipos de JOIN : INNER , LEFT OUTER , RIGHT OUTER , FULL OUTER y CROSS . Una tabla puede unirse a sí misma, produciendo una auto-combinación, SELF-JOIN.
Agrego una concatenación del nombre y apellido del alumno para facilitar su lectura, y excluyo alumnos que no estén estudiando ninguna carrera, para su futuro análisis o limpieza de base de datos de ex-alumnos.
SELECTCONCAT(a.nombre,' ', a.apellido)AS alumno, a.email, a.carrera_id, c.id, c.carreraFROM platzi.alumnosAS a
INNERJOIN platzi.carrerasAS c
ON a.carrera_id= c.idWHERE a.carrera_idISNOTNULLORDERBY carrera_id DESC;
Hola Agustin, gracias por tu aporte.
Creo si no estoy mal, sobra la cláusula where ya que al hacer inner join y filtrando por id= carrera_id descartas los ids y carreras ids que estén en null y al ser id un PK no deberia estar en null
Algunas prácticas, no es mucho pero es trabajo honesto :D
SELECT a.nombre, a.apellido, c.carreraFROM platzi.alumnosAS a
INNERJOIN platzi.carrerasAS c
ON a.id= c.idWHERE c.carrera='Química';--Nos dara la lista de alumnos que están en Quimica.SELECT c.carrera, c.id, a.nombre, a.apellido, a.carrera_idFROM platzi.carrerasAS c
FULLOUTERJOIN platzi.alumnosAS a
ON c.id= a.carrera_idWHERE c.vigente=falseORDERBY c.idASC;--Todos los alumnos con carreras NOVIGENTES, ordenado por el id de carrera.
--Alumnos que no tienen carrera asociada
select *from platzi.alumnos pa
left join platzi.carreras pc
on pa.carrera_id=pc.idand pc.id is null--Carreras que no tienen ningun alumno asociado
select *from platzi.alumnos pa
right join platzi.carreras pc
on pa.carrera_id=pc.idand pa.id is null--Todas las carreras con alumnos asociados
select *from platzi.alumnos pa
inner join platzi.carreras pc
on pa.carrera_id=pc.id--Todas los alumnos y solo las carreras que tienen un alumno asocioado
select *from platzi.alumnos pa
left join platzi.carreras pc
on pa.carrera_id=pc.id--Todas las carreras y solo los alumnos que tienen una carrera asocioada
select *from platzi.alumnos pa
right join platzi.carreras pc
on pa.carrera_id=pc.id--Trae todo
select *from platzi.alumnos pa
full outer join platzi.carreras pc
on pa.carrera_id=pc.id--Trae todo lo de las 2 tablas menos lo que coincida.select*from platzi.alumnos pa
full outer join platzi.carreras pc
on pa.carrera_id=pc.idwhere pa.carrera_id is nullor pc.id is null