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