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

SQL vs Pandas - Manipulando strings
26/11/2023SQL

SQL vs Pandas - Manipulando strings

Exemplos básicos de manipulação de strings no SQL e no Pandas

Saiba mais...
Listando chaves primárias e estrangeiras de um banco de dados SQL
15/03/2021SQL

Listando chaves primárias e estrangeiras de um banco de dados SQL

Como listar as chaves primárias e estrangeiras de um banco de dados MySQL ou SQL Server

Saiba mais...

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