Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Curso Práctico de SQL

Curso Práctico de SQL

Israel Vázquez Morales

Israel Vázquez Morales

Todas las uniones

20/29
Recursos

Aportes 24

Preguntas 5

Ordenar por:

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

Hola a todos, siguiendo la tarea del profesor, les comparto esta imagen que encontré en donde se pueden evidenciar las diferencias de cada uno de los joins y su visualización usando los diagramas de venn

Fuente:
https://riptutorial.com/es/sql/example/14930/diferencias-entre-uniones-internas---externas

Este video es muy bueno para afianzar y complementar conocimiento en los JOIN

https://www.youtube.com/watch?v=9yeOJ0ZMUYw

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

![](

Hola

MYSQL no tiene FULL OUTER JOIN que le permita traer todos los registros o hacer una diferencia simétrica.

Para ello nos podemos valer del siguiente comando (stackoverflow):

// Estructura del query
SELECT * FROM t1
LEFT JOIN t2 ON t1.id = t2.id
UNION
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id;

// Traer todo
SELECT * FROM alumnos AS a
	LEFT JOIN carreras AS c
	ON a.carrera_id = c.id
UNION
SELECT * FROM alumnos AS a
	RIGHT JOIN carreras AS c
	ON a.carrera_id = c.id;

// Diferencia simétrica
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
UNION
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;

En la siguiente imagen comparto los ejercicios hechos en clase con su respectivo diagrama de venn:

-- 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;	

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…

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;  

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

Algunas prácticas, no es mucho pero es trabajo honesto 😄

SELECT a.nombre, a.apellido, c.carrera
FROM platzi.alumnos AS a
INNER JOIN platzi.carreras AS c
ON a.id = c.id
WHERE 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_id
FROM platzi.carreras AS c
FULL OUTER JOIN platzi.alumnos AS a
ON c.id = a.carrera_id
WHERE c.vigente = false
ORDER BY c.id ASC; --Todos los alumnos con carreras NO VIGENTES, 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.id
and 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.id
and 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.id
where pa.carrera_id is null
or pc.id is null
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 carrera DESC;

=)

<SELECT 
a.[nombre]
,a.[apellido]
,a.[carrera_id]
,b.id
,b.carrera
FROM [HAHM].[dbo].[platzialumnos] a
full join platzicarreras b on a.carrera_id = b.id

order by carrera desc





>

Intenté usar este algunos JOINS con este código pero no me funcionó en PostgreSQL. Alguien sabe por qué? El conflicto me lo marcaba en “UNION or near”

SELECT a_.id,
	   a_.nombre,
       a_.carrera_id,
       c_.carrera,
       c_.id
from alumnos as a_
full OUTER JOIN carreras as c_
on a_.carrera_id = c_.id
order by c_.id;

Este es el reto:
LEFT JOIN
Muestra todas las carreras que tienen los alumnos

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;

EXCLUSIVE LEFT JOIN
Muestra todos los alumnos que tienen carreras no incluidas en la tabla de 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
WHERE c.id IS NULL
ORDER BY a.carrera_id;

RIGHT JOIN
Muestra todas las carreras de la tabla carreras inclusive sin alumnos asignados

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;

EXCLUSIVE RIGHT JOIN
Muestra las carreras que no tienen alumnos asignados

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.carrera_id IS NULL
ORDER BY c.id DESC;

FULL OUTER JOIN
Muestra tanto los alumnos con carreras asignadas y los alumnos que tienen carreras que no existen en la tabla de carreras así como las carreras que no están asignadas a ningún alumno.

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 a.carrera_id;

EXCLUSIVE FULL OUTER JOIN o DIFERENCIA SIMETRICA
Muestra las carreras sin alumnos asignados y los alumnos con carreras que no se encuentran en la tabla de carreras

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.carrera_id IS NULL
OR c.id IS NULL
ORDER BY a.carrera_id DESC, c.id DESC;

INNER JOIN
Muestra todos los alumnos con carreras coincidentes en la tabla de carreras

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;

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	
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	

FULL OUTHER 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 c.id DESC

Comparto mis apuntes. Espero y les sirva

--FULL OUTER JOIN para traer los alumnos y las carreras, aunque los alumnos no tengan carrera asignada y que las carreras no tengan alumnos asignados
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 carrera_id;


--LEFT JOIN para trer todos los alumnos aunque su carrera sea nula. No trae las carreras que no tengan alumnos.
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;


--LEFT JOIN EXCLUSIVO para traer aquellos alumnos donde su carrera sea nula, o tambien aquellos alumnos donde su carrera exista. Se hace con el WHERE c.id IS NULL; o WHERE c.id IS NOT NULL;
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;


--RIGHT JOIN para trer todas las carreras aunque no tenga alumno asignado. No trae los alumnos que no tengan carrera asignada
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;


--RIGHT JOIN EXCLUSIVO para traer las carreras que no tengan alumnos, o tambien las carreras que si tengan alumnos. Se hace con el WHERE a.id IS NULL; o WHERE a.id IS NOT NULL;
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 para traer los datos que ambos comparten, es decir, no trae datos Nulos
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;


--FULL OUTER JOIN EXCLUSIVO para traer aquellos nuelos en ambas tablas, es decir, aquellos alumnos que no tengan carrera asignada y aquellas carreras que no tengan alumnos asignados
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 c.id IS NULL
	OR a.id IS NULL
ORDER BY a.carrera_id DESC;

Para SQL Server:


-- LEFT JOIN EXCLUSIVO
-- A - B
USE [platzi]
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
ORDER BY c.id DESC
GO


-- LEFT JOIN NORMAL
-- A
USE [platzi]
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
GO


-- RIGHT JOIN NORMAL
-- B
USE [platzi]
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
GO


-- RIGHT JOIN EXCLUSIVO
-- B - A
USE [platzi]
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.carrera_id IS NULL
ORDER BY c.id DESC
GO


-- INNER JOIN
-- A INTERSECCION B
USE [platzi]
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
GO


-- FULL OUTER JOIN EXCLUSIVO
-- A DIFERENCIA_SIMETRICA B
USE [platzi]
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.carrera_id IS NULL
	OR c.id IS NULL
ORDER BY a.carrera_id DESC, c.id DESC
GO


-- FULL OUTER JOIN
-- A UNION B
USE [platzi]
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 a.carrera_id
GO

#LEFT JOIN EXCLUSIVO (SIN INTERSECCION)

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 NORMAL (CON INTERSECCION)

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;

#RIGHT JOIN EXCLUSIVO (SIN INTERSECCION)

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;

#RIGHT JOIN (CON INTERSECCION)

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;

#INNER JOIN (SOLO LA INTERSECCION)

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
;

#FULL OUTER JOIN EXCLUSIVO (UNION TABLAS SIN EL INNER (INTERSECCION))

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 
;

#FULL (OUTER) JOIN (UNION DE TODO)	   
	   
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 a.carrera_id;
INNER JOIN

SELECT * 
FROM platzi.alumnos as a
INNER JOIN platzi.carreras as c
ON a.carrera_id = c.id
ORDER BY c.id ASC;
;

RIGHT JOIN 

SELECT * 
FROM platzi.alumnos as a
RIGHT JOIN platzi.carreras as c
ON a.carrera_id = c.id
ORDER BY C.ID ASC;

EXCLUSIVE RIGHT JOIN

SELECT * 
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 C.ID ASC;

EXCLUSIVE OUTER JOIN

SELECT * 
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 C.ID ASC;

FULL JOIN

SELECT * 
FROM platzi.alumnos as a
FULL OUTER JOIN platzi.carreras as c
ON a.carrera_id = c.id
ORDER BY C.ID ASC;

<h3>Todas las uniones</h3>

-- FULL OUTER JOIN
SELECT a.nombre,
  a.apellido,
  a.carrera_id,
  c.id,
  c.carrera
FROM alumnos AS a
  FULL OUTER JOIN carreras AS c
  ON a.carrera_id = c.id
ORDER BY c.id DESC;

-- INNER JOIN
SELECT a.nombre,
  a.apellido,
  a.carrera_id,
  c.id,
  c.carrera
FROM alumnos AS a
  INNER JOIN carreras AS c
  ON a.carrera_id = c.id
ORDER BY c.id DESC;

-- LEFT JOIN
SELECT a.nombre,
  a.apellido,
  a.carrera_id,
  c.id,
  c.carrera
FROM alumnos AS a
  LEFT JOIN carreras AS c
  ON a.carrera_id = c.id
ORDER BY c.id DESC;

-- LEFT JOIN EXCLUSIVO
SELECT a.nombre,
  a.apellido,
  a.carrera_id,
  c.id,
  c.carrera
FROM alumnos AS a
  LEFT JOIN carreras AS c
  ON a.carrera_id = c.id
WHERE c.id IS NULL;

-- right join
SELECT a.nombre,
  a.apellido,
  a.carrera_id,
  c.id,
  c.carrera
FROM alumnos AS a
  RIGHT JOIN carreras AS c
  ON a.carrera_id = c.id
ORDER BY c.id DESC;

-- right join exclusivo
SELECT a.nombre,
  a.apellido,
  a.carrera_id,
  c.id,
  c.carrera
FROM alumnos AS a
  RIGHT JOIN carreras AS c
  ON a.carrera_id = c.id
WHERE a.id IS NULL
ORDER BY c.id DESC;

-- diferencia simetrica
SELECT a.nombre,
  a.apellido,
  a.carrera_id,
  c.id,
  c.carrera
FROM alumnos AS a
  FULL OUTER JOIN 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;