bueno, en esta imagen se aprecia la separacion de los join con su respectivo codigo basico

bueno, en esta imagen se aprecia la separacion de los join con su respectivo codigo basico

Hace una semana tuve un test de SQL para una empresa donde me presentaban 3 tablas parecidas a las descritas en clase, y me pedían que hiciera una query (que si traducimos a los datos de este schema DB) 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.
SELECT CONCAT(a.nombre, ' ', a.apellido),
a.tutor_id
FROM platzi.alumnos AS a
JOIN platzi.carreras AS c
ON c.id = a.carrera_id
WHERE c.id = (
SELECT c.id
FROM platzi.carreras AS c
INNER JOIN platzi.alumnos AS a
ON a.carrera_id = c.id
GROUP BY c.id
ORDER BY COUNT(*) DESC LIMIT 1);
La verdad era sencilla la prueba pero bueno faltaba un poquito más de práctica...
En la siguiente imagen comparto los ejercicios hechos en clase con su respectivo diagrama de venn:

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_id IS NULL
OR c.id IS NULL
-- LEFT JOIN EXCLUSIVO
SELECT a.nombre,
a.apellido,
a.carrera_id,
c.id,
c.carrera
FROM platzi.alumnos AS a
LEFT JOIN platzi.carreras AS c
ON a.carrera_id = c.id
WHERE c.id IS NULL;
-- LEFT JOIN
SELECT a.nombre,
a.apellido,
a.carrera_id,
c.id,
c.carrera
FROM platzi.alumnos AS a
LEFT JOIN platzi.carreras AS c
ON a.carrera_id = c.id
ORDER BY c.id DESC;
-- RIGHT JOIN
SELECT a.nombre,
a.apellido,
a.carrera_id,
c.id,
c.carrera
FROM platzi.alumnos AS a
RIGHT JOIN platzi.carreras AS c
ON a.carrera_id = c.id
ORDER BY c.id DESC;
-- RIGHT JOIN EXCLUSIVE
SELECT a.nombre,
a.apellido,
a.carrera_id,
c.id,
c.carrera
FROM platzi.alumnos AS a
RIGHT JOIN platzi.carreras AS c
ON a.carrera_id = c.id
WHERE a.id IS NULL
ORDER BY c.id DESC;
-- INNER JOIN
SELECT a.nombre,
a.apellido,
a.carrera_id,
c.id,
c.carrera
FROM platzi.alumnos AS a
INNER JOIN platzi.carreras AS c
ON a.carrera_id = c.id
ORDER BY c.id DESC;
SELECT a.nombre,
a.apellido,
a.carrera_id,
c.id,
c.carrera
FROM platzi.alumnos AS a
JOIN platzi.carreras AS c
ON a.carrera_id = c.id
ORDER BY c.id;
-- FULL OUTER
SELECT a.nombre,
a.apellido,
a.carrera_id,
c.id,
c.carrera
FROM platzi.alumnos AS a
FULL OUTER JOIN platzi.carreras AS c
ON a.carrera_id = c.id
ORDER BY c.id;
-- EXCLUSIVE FULL OUTER JOIN
SELECT a.nombre,
a.apellido,
a.carrera_id,
c.id,
c.carrera
FROM platzi.alumnos AS a
FULL OUTER JOIN platzi.carreras AS c
ON a.carrera_id = c.id
WHERE a.id IS NULL
OR c.id IS NULL
ORDER BY a.carrera_id DESC,c.id DESC;
full outer join es igual que full join?
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.carrera
FROM platzi.alumnos AS a
LEFT JOIN platzi.carreras AS c
ON a.carrera_id = c.id
WHERE c.id IS NULL;
-- Left join: Traigo todos los alumnos, sin importar si tienen o no carreras
SELECT a.nombre,
a.apellido,
a.carrera_id,
c.id,
c.carrera
FROM platzi.alumnos AS a
LEFT JOIN platzi.carreras AS c
ON a.carrera_id = c.id
ORDER BY c.id DESC;
-- 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.carrera
FROM platzi.alumnos AS a
RIGHT JOIN platzi.carreras AS c
ON a.carrera_id = c.id
ORDER BY c.id DESC;
-- Right join exclusive: Solo las carreras que no tienen alumnos
SELECT a.nombre,
a.apellido,
a.carrera_id,
c.id,
c.carrera
FROM platzi.alumnos AS a
RIGHT JOIN platzi.carreras AS c
ON a.carrera_id = c.id
WHERE a.id IS NULL
ORDER BY c.id DESC;
-- Join solo o Inner join: Aquello que tienen en comun ambas tablas
SELECT a.nombre,
a.apellido,
a.carrera_id,
c.id,
c.carrera
FROM platzi.alumnos AS a
INNER JOIN platzi.carreras AS c
ON a.carrera_id = c.id
ORDER BY c.id DESC; -- Join mas usado.
-- Ó
SELECT a.nombre,
a.apellido,
a.carrera_id,
c.id,
c.carrera
FROM platzi.alumnos AS a
JOIN platzi.carreras AS c
ON a.carrera_id = c.id
ORDER BY c.id DESC; -- 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.carrera
FROM platzi.alumnos AS a
FULL OUTER JOIN platzi.carreras AS c
ON a.carrera_id = c.id
WHERE a.id IS NULL
OR c.id IS NULL
ORDER BY a.carrera_id DESC, c.id DESC;
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 |

Anthony Guzman Lopez
bueno, en esta imagen se aprecia la separacion de los join con su respectivo codigo basico
 AS nombre, tutor_id FROM platzi.alumnos WHERE carrera_id = ( --Carrera con mas alumnos SELECT carrera_id FROM platzi.alumnos GROUP BY carrera_id ORDER BY COUNT(*) DESC LIMIT 1 )
Paola Juliet Orozco Molina
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.
Test técnico de una empresa
Hace una semana tuve un test de SQL para una empresa donde me presentaban 3 tablas parecidas a las descritas en clase, y me pedían que hiciera una query (que si traducimos a los datos de este schema DB) 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.
SELECT CONCAT(a.nombre, ' ', a.apellido), a.tutor_id FROM platzi.alumnos AS a JOIN platzi.carreras AS c ON c.id = a.carrera_id WHERE c.id = ( SELECT c.id FROM platzi.carreras AS c INNER JOIN platzi.alumnos AS a ON a.carrera_id = c.id GROUP BY c.id ORDER BY COUNT(*) DESC LIMIT 1);
La verdad era sencilla la prueba pero bueno faltaba un poquito más de práctica...
SELECT maxCarrera.`carrera` ,concat(ifnull(a.nombre,''),' ',ifnull(a.apellido,'')) as estudiante ,concat(ifnull(t.nombre,''),' ',ifnull(t.apellido,'')) as tutor FROM alumnos a INNER JOIN alumnos t on (t.id = a.tutor_id) INNER JOIN (SELECT ca.id, ca.carrera, count(a.carrera_id) cant_alumnos FROM carreras ca INNER JOIN alumnos a on (a.carrera_id=ca.id) GROUP BY ca.id ORDER BY cant_alumnos DESC LIMIT 1 ) as maxCarrera on maxCarrera.id = a.carrera_id;
-- LEFT JOIN EXCLUSIVO SELECT a.nombre, a.apellido, a.carrera_id, c.id, c.carrera FROM platzi.alumnos AS a LEFT JOIN platzi.carreras AS c ON a.carrera_id = c.id WHERE c.id IS NULL; -- LEFT JOIN SELECT a.nombre, a.apellido, a.carrera_id, c.id, c.carrera FROM platzi.alumnos AS a LEFT JOIN platzi.carreras AS c ON a.carrera_id = c.id ORDER BY c.id DESC; -- RIGHT JOIN SELECT a.nombre, a.apellido, a.carrera_id, c.id, c.carrera FROM platzi.alumnos AS a RIGHT JOIN platzi.carreras AS c ON a.carrera_id = c.id ORDER BY c.id DESC; -- RIGHT JOIN EXCLUSIVE SELECT a.nombre, a.apellido, a.carrera_id, c.id, c.carrera FROM platzi.alumnos AS a RIGHT JOIN platzi.carreras AS c ON a.carrera_id = c.id WHERE a.id IS NULL ORDER BY c.id DESC; -- INNER JOIN SELECT a.nombre, a.apellido, a.carrera_id, c.id, c.carrera FROM platzi.alumnos AS a INNER JOIN platzi.carreras AS c ON a.carrera_id = c.id ORDER BY c.id DESC; SELECT a.nombre, a.apellido, a.carrera_id, c.id, c.carrera FROM platzi.alumnos AS a JOIN platzi.carreras AS c ON a.carrera_id = c.id ORDER BY c.id; -- FULL OUTER SELECT a.nombre, a.apellido, a.carrera_id, c.id, c.carrera FROM platzi.alumnos AS a FULL OUTER JOIN platzi.carreras AS c ON a.carrera_id = c.id ORDER BY c.id; -- EXCLUSIVE FULL OUTER JOIN SELECT a.nombre, a.apellido, a.carrera_id, c.id, c.carrera FROM platzi.alumnos AS a FULL OUTER JOIN platzi.carreras AS c ON a.carrera_id = c.id WHERE a.id IS NULL OR c.id IS NULL ORDER BY a.carrera_id DESC,c.id DESC;
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.carrera FROM platzi.alumnos AS a LEFT JOIN platzi.carreras AS c ON a.carrera_id = c.id WHERE c.id IS NULL; -- Left join: Traigo todos los alumnos, sin importar si tienen o no carreras SELECT a.nombre, a.apellido, a.carrera_id, c.id, c.carrera FROM platzi.alumnos AS a LEFT JOIN platzi.carreras AS c ON a.carrera_id = c.id ORDER BY c.id DESC; -- 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.carrera FROM platzi.alumnos AS a RIGHT JOIN platzi.carreras AS c ON a.carrera_id = c.id ORDER BY c.id DESC; -- Right join exclusive: Solo las carreras que no tienen alumnos SELECT a.nombre, a.apellido, a.carrera_id, c.id, c.carrera FROM platzi.alumnos AS a RIGHT JOIN platzi.carreras AS c ON a.carrera_id = c.id WHERE a.id IS NULL ORDER BY c.id DESC; -- Join solo o Inner join: Aquello que tienen en comun ambas tablas SELECT a.nombre, a.apellido, a.carrera_id, c.id, c.carrera FROM platzi.alumnos AS a INNER JOIN platzi.carreras AS c ON a.carrera_id = c.id ORDER BY c.id DESC; -- Join mas usado. -- Ó SELECT a.nombre, a.apellido, a.carrera_id, c.id, c.carrera FROM platzi.alumnos AS a JOIN platzi.carreras AS c ON a.carrera_id = c.id ORDER BY c.id DESC; -- 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.carrera FROM platzi.alumnos AS a FULL OUTER JOIN platzi.carreras AS c ON a.carrera_id = c.id WHERE a.id IS NULL OR c.id IS NULL ORDER BY a.carrera_id DESC, c.id DESC;
-- solo los alumnos que están en las carreras que eliminamos del conjunto de carreras → LEFT JOIN exlusivo -- SELECT CONCAT(a.nombre, ' ', a.apellido) AS full_name, a.carrera_id, c.id, c.carrera FROM platzi.alumnos AS a LEFT JOIN platzi.carreras AS c ON a.carrera_id = c.id WHERE c.id IS NULL ORDER BY a.carrera_id DESC
.
---
.
-- alumnos que están o no en las carreras que eliminamos del conjunto → eliminamos el WHERE, pasa de ser LEFT JOIN exlusivo -- a un LEFT JOIN inclusivo SELECT CONCAT(a.nombre, ' ', a.apellido) AS full_name, a.carrera_id, c.id, c.carrera FROM platzi.alumnos AS a LEFT JOIN platzi.carreras AS c ON a.carrera_id = c.id ORDER BY a.carrera_id DESC
.
---
.
-- alumnos que no están en las carreras que eliminamos así como las carreras sin alumnos -- SELECT CONCAT(a.nombre, ' ', a.apellido) AS full_name, a.carrera_id, c.id, c.carrera FROM platzi.alumnos AS a RIGHT JOIN platzi.carreras AS c ON a.carrera_id = c.id ORDER BY a.carrera_id DESC -- RIGHT JOIN inclusivo
.
---
.
-- carreras sin alumnos SELECT CONCAT(a.nombre, ' ', a.apellido) AS full_name, a.carrera_id, c.id, c.carrera FROM platzi.alumnos AS a RIGHT JOIN platzi.carreras AS c ON a.carrera_id = c.id WHERE a.carrera_id IS NULL ORDER BY a.carrera_id DESC -- RIGHT JOIN exclusivo
.
---
.
-- alumnos que están o no en carreras que tienen o no alumnos -- SELECT CONCAT(a.nombre, ' ', a.apellido) AS full_name, a.carrera_id, c.id, c.carrera FROM platzi.alumnos AS a FULL OUTER JOIN platzi.carreras AS c ON a.carrera_id = c.id ORDER BY a.carrera_id DESC -- FULL OUTER JOIN
.
---
.
-- alumnos que están en las carreras no borradas y en carreras con alumnos -- SELECT CONCAT(a.nombre, ' ', a.apellido) AS full_name, a.carrera_id, c.id, c.carrera FROM platzi.alumnos AS a INNER JOIN platzi.carreras AS c ON a.carrera_id = c.id ORDER BY a.carrera_id DESC
.
---
.
-- alumnos que están en el grupo de las carreras que fueron borradas y carreras sin alumnos -- SELECT CONCAT(a.nombre, ' ', a.apellido) AS full_name, a.carrera_id, c.id, c.carrera FROM platzi.alumnos AS a FULL OUTER JOIN platzi.carreras AS c ON a.carrera_id = c.id WHERE a.carrera_id IS NULL OR c.id IS NULL ORDER BY a.carrera_id DESC -- Diferencia simétrica