-- INNER JOIN
SELECT *
FROM Employes -- Quero ver tudo (*) dos empregados (Employes)
    INNER JOIN Department -- Quero juntar isso com a tabela dos departamentos (Department)
    ON Employes.Dep = Department.id_dep;
-- Liga cada empregado ao seu departamento,
-- onde o número do departamento do empregado (Employes.Dep)
-- é igual ao número do departamento na tabela de departamentos (Department.id)
ON table1.fk = table2.fk -- LEFT JOIN
-- Quero juntar as tabelas, mas mostrando TODOS os empregados,
-- mesmo que não tenham departamento.
SELECT *
FROM Employes -- Escolhe tudo (*) da tabela de empregados.
    LEFT JOIN Department -- Junta com a tabela dos departamentos,
    -- mas garante que TODOS os empregados aparecem.
    ON Employes.Dep = Department.id_Dep;
-- Liga o número do departamento do empregado (Employes.Dep)
-- com o número do departamento na tabela dos departamentos (Department.id_Dep).
-- Se não existir departamento, mostra NULL.
-- RIGHT JOIN
-- Quero juntar as tabelas, mas mostrando TODOS os departamentos,
-- mesmo que não tenham empregados.
SELECT *
FROM Employes -- Escolhe tudo (*) da tabela de empregados.
    RIGHT JOIN Department -- Junta com a tabela dos departamentos,
    -- mas garante que TODOS os departamentos aparecem,
    -- mesmo que não tenham empregados.
    ON Employes.Dep = Department.id_Dep;
-- Liga o número do departamento do empregado (Employes.Dep)
-- com o número do departamento na tabela dos departamentos (Department.id_Dep).
-- Se não existir empregado nesse departamento, mostra NULL.
SELECT *
FROM Employes AS E
    RIGHT JOIN Department AS D ON D.id = E.Dep;
SELECT *
FROM Employes AS E -- Quero ver tudo (*) da tabela dos empregados (Employes)
    -- mas vou chamar essa tabela só de E, para ficar mais curtinho.
    RIGHT JOIN Department AS D -- Vou juntar com a tabela dos departamentos (Department),
    -- e vou chamar essa tabela só de D.
    ON D.id = E.Dep;
-- Agora ligo as duas tabelas usando o ponto (.)
-- D.id quer dizer: na tabela D (Department), usa a coluna id
-- E.Dep quer dizer: na tabela E (Employes), usa a coluna Dep
D.id --> "id" da tabela Department (apelidada como D)
E.Dep --> "Dep" da tabela Employes (apelidada como E)
-- 
-- Assim estou a dizer:
-- "Junta o departamento D.id com o empregado E.Dep
-- para saber quem trabalha em qual departamento."


-- FULL JOIN 

SELECT * FROM Employes
FULL OUTER Department
ON Employes.Dep = Department.id_Dep;

-- Quero juntar as duas listas (tabelas) de empregados e departamentos,
-- mas mostrando tudo de **ambas** as tabelas, mesmo que não tenham ligação.
SELECT *
FROM Employes -- 👀Quero ver tudo (*) da tabela dos empregados.
    FULL OUTER JOIN Department -- Quero juntar com a tabela dos departamentos,
    -- mostrando tudo: empregados com departamento, 
    -- e também empregados sem departamento, e departamentos sem empregados.
    ON Employes.Dep = Department.id_Dep;
-- Aqui digo como juntar:  
-- o número do departamento do empregado (Employes.Dep)  
-- deve ser igual ao número do departamento da tabela Department (Department.id_Dep).
-- Se um empregado não tiver departamento, ou um departamento não tiver empregados,
-- mesmo assim aparecem na lista, com espaços vazios (NULL) onde falta informação.


-- FULL OUTER
 
SELECT *
FROM Employes AS e -- 👀 Quero ver tudo dos empregados, e vou chamar eles de 'e' para simplificar
    LEFT JOIN Department AS d -- 🤝 Junta com os departamentos, chamados 'd',
    -- mostrando TODOS os empregados, mesmo que não tenham departamento
    ON e.Dep = d.id_Dep -- 🔗 Junta onde o número do departamento do empregado (e.Dep)
    -- é igual ao número do departamento na tabela (d.id_Dep)
UNION
-- ✋ Junta os resultados desta consulta com a próxima,
-- sem repetir as linhas iguais
SELECT *
FROM Employes AS e -- 👀 Quero ver tudo dos empregados, 'e' de novo
    RIGHT JOIN Department AS d -- 🤝 Junta com os departamentos 'd',
    -- mostrando TODOS os departamentos, mesmo que não tenham empregados
    ON e.Dep = d.id_Dep;
-- 🔗 Junta onde o número do departamento do empregado (e.Dep)
-- é igual ao número do departamento na tabela (d.id_Dep)

-- Com o UNION ALL, se alguma linha aparecer nas duas consultas (por exemplo, um empregado com departamento que aparece tanto no LEFT JOIN como no RIGHT JOIN), essa linha vai aparecer duas vezes na lista final.

-- Com o UNION, essas linhas repetidas aparecem só uma vez.


-- CROSS JOIN

SELECT * FROM Employes
CROSS JOIN Department;

SELECT *
FROM Employes -- 👀 Quero ver tudo dos empregados
    CROSS JOIN Department;
-- 🤝 Quero juntar todos os empregados com todos os departamentos,
-- como se cada empregado visitasse todas as salas,
-- criando uma lista com todas as combinações possíveis.



-- SELF JOIN 

SELECT * FROM Employes AS T1, Employes AS T2
WHERE T1.Salaire > T2.Salaire;

SELECT *
FROM Employes AS T1,
    Employes AS T2 -- 👀 Quero olhar para a lista de empregados duas vezes:
    -- a primeira vez chamo de T1 e a segunda vez chamo de T2
WHERE T1.Salaire > T2.Salaire;
-- 🔍 Quero só as combinações onde o salário do empregado T1
-- é maior do que o salário do empregado T2
-- Ou seja, estou a comparar todos os empregados entre si
-- para ver quem ganha mais do que quem.