União, interseção e combinação de dados com SQL

União, interseção e combinação de dados com SQL

Neste artigo vamos ver algumas operações referentes a conjuntos de dados utilizando SQL. Vamos ver como fazer uniões, interseções e combinação de dados com SQL utilizando SQL Server e MySQL

O que você vai aprender neste artigo?

- Como utilizar UNION para juntar duas ou mais tabelas

- Como utilizar INTERSECT para ver a diferença entre tabelas

- Como utilizar EXCEPT para ver registros que existem numa tabela mas são ausentes em outra.

- Gerar todas as combinações possíveis entre duas tabelas utilizando CROSS JOIN.

 

Antes de começar, precisamos criar os dados de exemplo que serão utilizados para criar nossas consultas. Para os três primeiros casos, vamos trabalhar com estes dados:

 

SQL SERVER

CREATE TABLE projeto1 (

    id int IDENTITY(1,1) PRIMARY KEY,

    nome varchar(50) NOT NULL,

    email varchar(70),

    qtde_horas int

);

CREATE TABLE projeto2 (

    id int IDENTITY(1,1) PRIMARY KEY,

    nome varchar(50) NOT NULL,

    email varchar(70),

    qtde_horas int

);

 

MYSQL

CREATE TABLE projeto1 (

    id int NOT NULL AUTO_INCREMENT,

    nome varchar(50) NOT NULL,

    email varchar(70),

    qtde_horas int,

    PRIMARY KEY (id)

);

CREATE TABLE projeto2 (

    id int NOT NULL AUTO_INCREMENT,

    nome varchar(50) NOT NULL,

    email varchar(70),

    qtde_horas int,

    PRIMARY KEY (id)

);

 

INSERT INTO projeto1 (nome, email, qtde_horas) VALUES ("Thiago", "thiago@teste.com.br", 40);

INSERT INTO projeto1 (nome, email, qtde_horas) VALUES ("Matheus", "matheus@teste.com.br", 60);

INSERT INTO projeto1 (nome, email, qtde_horas) VALUES ("João", "joao@teste.com.br", 80);

INSERT INTO projeto1 (nome, email, qtde_horas) VALUES ("Lucas", "lucas@teste.com.br", 100);

 

INSERT INTO projeto2 (nome, email, qtde_horas) VALUES ("Ezequiel", "ezequiel@teste.com.br", 30);

INSERT INTO projeto2 (nome, email, qtde_horas) VALUES ("Matheus", "matheus@teste.com.br", 50);

INSERT INTO projeto2 (nome, email, qtde_horas) VALUES ("Elias", "elias@teste.com.br", 70);

INSERT INTO projeto2 (nome, email, qtde_horas) VALUES ("Miguel", "miguel@teste.com.br", 90);

 

UNIAO DE DUAS TABELAS

 

Para unir duas tabelas utilizamos o comando UNION. Para que ele possa ser utilizado, a consulta entre as tabelas deve utilizar a mesma quantidade de campos, e os campos devem possuir o mesmo tipo de dados e ordem.

Para juntar as tabelas projeto1 e projeto2 a consulta seria a seguinte:

 

SELECT nome, email FROM projeto1 

UNION 

SELECT nome, email FROM projeto2 

projeto2

 

Você vai perceber que a união das tabelas retornou um conjunto de 7 registros, mas a soma dos registros das duas tabelas é 8. Isso ocorre porque o UNION desconsiderou a repetição de dados, eu tenho um colaborador chamado Matheus em ambas as tabelas.

Para retornar com as repetições, seria necessário utilizar UNION ALL

 

SELECT nome, email FROM projeto1 

UNION ALL

SELECT nome, email FROM projeto2 

projeto2

 

INTERSEÇÃO ENTRE DUAS TABELAS

 

Agora vamos ver como podemos ver registros em comuns nas duas tabelas. No exemplo anterior, vimos que Matheus existe em ambas as tabelas. Como criar uma consulta que retorne estes casos? Para resolver este tipo de problema utilizamos INTERSECT

 

SELECT nome, email FROM projeto1 

INTERSECT

SELECT nome, email FROM projeto2 

projeto2

 

 

DIFERENÇA ENTRE DUAS TABELAS

 

Se eu comparar a tabela projeto1 com a tabela projeto2, você vai ter 3 registros que não existem na tabela projeto2. Para retornar estes casos podemos usar o comando EXCEPT

 

SELECT nome, email FROM projeto1 

EXCEPT

SELECT nome, email FROM projeto2 

projeto2

 

GERAR TODAS AS COMBINAÇÕES POSSÍVEIS ENTRE DUAS TABELAS

 

Para gerar uma combinação entre tabelas vamos precisar criar um conjunto de dados diferentes. Os dados que vamos utilizar são estes:

 

 SQL SERVER

CREATE TABLE produtos (

    id int IDENTITY(1,1) PRIMARY KEY,

    nome varchar(50) NOT NULL,

);

CREATE TABLE embalagens (

    id int IDENTITY(1,1) PRIMARY KEY,

    tipo varchar(50) NOT NULL,

    peso int

);

 

MYSQL

CREATE TABLE produtos (

    id int NOT NULL AUTO_INCREMENT,

    nome varchar(50) NOT NULL,

    PRIMARY KEY (id)

);

 

CREATE TABLE embalagens (

    id int NOT NULL AUTO_INCREMENT,

    tipo varchar(50) NOT NULL,

    peso int,

    PRIMARY KEY (id)

);

 

INSERT INTO produtos (nome) VALUES ("Arroz");

INSERT INTO produtos (nome) VALUES ("Feijão");

INSERT INTO produtos (nome) VALUES ("Açúcar");

 

INSERT INTO embalagens (tipo, peso) VALUES ("500 gramas", 500);

INSERT INTO embalagens (tipo, peso) VALUES ("1 Kilo", 1000);

INSERT INTO embalagens (tipo, peso) VALUES ("2 Kilos", 2000);

INSERT INTO embalagens (tipo, peso) VALUES ("5 Kilos", 5000);

INSERT INTO embalagens (tipo, peso) VALUES ("10 Kilos", 10000);

 

Perceba que temos uma tabela de embalagens e de produtos. Todos os produtos podem ser vendidos utilizando qualquer uma das embalagens que cadastramos. Como temos 5 tipos de embalagens e 3 produtos, o resultado do cruzamento das duas tabelas deve ser um conjunto de dados com 15 registros.

Para fazer isso vamos utilizar CROSS JOIN

 

SELECT

  P.nome,

  E.tipo

FROM produtos as P

CROSS JOIN  embalagens as E

 

ENCERRAMENTO

 

Neste artigo você aprendeu como fazer união, interseção e combinação de tabelas utilizado SQL.

Se você gostou deste conteúdo os artigos a seguir podem ser de seu interesse:

 

Criando totais e subtotais com agrupamento no SQL

 

Como agrupar vários registros em uma única coluna com SQL

 

Outros conteudos que podem ser de seu interesse

Paginação de resultados com SQL
10/01/2021SQL

Paginação de resultados com SQL

Como paginar resultados usando bancos de dados MySQL e SQL Server

Saiba mais...
Máscaras para CPF, CNPJ e outros tipos de dados com SQL
30/08/2020SQL

Máscaras para CPF, CNPJ e outros tipos de dados com SQL

Neste artigo você vai ver exemplos de como aplicar máscaras em dados nos banco de dados SQL Server e MySQL

Saiba mais...

Conteúdo sobre banco de dados sem complicação!