Introdução
Bem-vindo ao blog do Gran Cursos Online Aqui, respondemos às dúvidas dos nossos alunos sobre diversos temas de estudo para concursos. Hoje, vamos esclarecer uma questão sobre comandos SQL no MS SQL Server, especificamente utilizando o comando `FULL JOIN`.
Pergunta:
Durante o estudo de comandos SQL para o MS SQL Server, encontrei a seguinte questão:
Questão (FGV/AL-RO/Analista/2018) Tomando por referência uma instalação MS SQL Server, analise os comandos a seguir.
sql
create table T (a int, b int);
insert into T values
(1,1), (2,NULL), (NULL,3), (4,4), (5,5);
select FROM T x full join T y on x.a = y.a;
—-
A questão pergunta: Qual o número de linhas no resultado, excluída a linha de títulos?
As opções são:
a) 5
b) 6
c) 7
d) 10
e) 25
Gostaria de entender como o comando `FULL JOIN` funciona e como calcular o número de linhas resultantes.
Resposta:
Vamos entender passo a passo como o comando `FULL JOIN` opera neste caso.
1. Criação da Tabela e Inserção de Valores:
– Criamos uma tabela `T` com duas colunas: `a` e `b`.
– Inserimos os seguintes valores:
| a | b |
|——|——|
| 1 | 1 |
| 2 | NULL |
| NULL | 3 |
| 4 | 4 |
| 5 | 5 |
2. Comando SELECT com FULL JOIN:
– Utilizamos o comando `FULL JOIN` para unir a tabela `T` consigo mesma com base na coluna `a`.
Explicação sobre FULL JOIN:
O `FULL JOIN` é um tipo de junção em SQL que retorna todas as linhas quando há uma correspondência em uma das tabelas. Se não houver correspondência, os valores nulos serão incluídos para a tabela que não tem correspondência. Isso significa que o `FULL JOIN` combina as funcionalidades dos comandos `LEFT JOIN` e `RIGHT JOIN`.
No `FULL JOIN`, todas as linhas de ambas as tabelas envolvidas na junção são retornadas. Quando uma linha em uma tabela não possui uma correspondência na outra tabela, os campos da outra tabela são preenchidos com `NULL`.
Para ilustrar esse conceito, vamos utilizar duas tabelas de exemplo:
Tabela A:
| ID | Nome |
|—–|——–|
| 1 | Alice |
| 2 | Bob |
| 3 | Carol |
Tabela B:
| ID | Sobrenome |
|—–|———–|
| 2 | Smith |
| 3 | Johnson |
| 4 | Brown |
Comando SQL com FULL JOIN:
“`sql
SELECT A.ID, A.Nome, B.Sobrenome
FROM TabelaA A
FULL JOIN TabelaB B ON A.ID = B.ID;
“`
Resultado do FULL JOIN:
| ID | Nome | Sobrenome |
|—–|——–|———–|
| 1 | Alice | NULL |
| 2 | Bob | Smith |
| 3 | Carol | Johnson |
| 4 | NULL | Brown |
Desenho Explicativo:
Para uma visualização didática, imagine duas tabelas em formato de Venn diagramas, onde a interseção representa as linhas que possuem correspondências nas duas tabelas, enquanto as áreas não sobrepostas representam as linhas que existem em uma tabela mas não na outra:
“`
Tabela A Tabela B
| ID | Nome | | ID | Sobrenome |
|—-|——–| |—-|———–|
| 1 | Alice | | 2 | Smith |
| 2 | Bob | | 3 | Johnson |
| 3 | Carol | | 4 | Brown |
“`
“`
Resultado do FULL JOIN
| ID | Nome | Sobrenome |
|—-|——–|———–|
| 1 | Alice | NULL |
| 2 | Bob | Smith |
| 3 | Carol | Johnson |
| 4 | NULL | Brown |
“`
No diagrama:
– Interseção (ID = 2, 3): Ambas as tabelas têm dados correspondentes, e o resultado contém dados de ambas as tabelas.
– Somente Tabela A (ID = 1): Tabela B não tem correspondência, resultando em valores `NULL` para os campos de Tabela B.
– Somente Tabela B (ID = 4): Tabela A não tem correspondência, resultando em valores `NULL` para os campos de Tabela A.
Essa explicação e visualização ajudam a entender como o `FULL JOIN` combina dados de duas tabelas, preenchendo com `NULL` onde não há correspondência.
3. Analisando o FULL JOIN:
– Então o `FULL JOIN` combina todas as linhas de `x` com todas as linhas de `y` onde `x.a = y.a`.
– Ele inclui todas as linhas de ambas as tabelas, preenchendo com `NULL` quando não há correspondência.
Resultado do FULL JOIN:
Com base na execução do comando no SQL Server, obtemos o seguinte resultado:
| x.a | x.b | y.a | y.b |
|——|——|——|——|
| 1 | 1 | 1 | 1 |
| 2 | NULL | 2 | NULL |
| NULL | 3 | NULL | NULL |
| 4 | 4 | 4 | 4 |
| 5 | 5 | 5 | 5 |
| NULL | NULL | NULL | 3 |
Explicação do Resultado:
1. Linha `(1, 1)` de `x` se junta com linha `(1, 1)` de `y`:
| x.a | x.b | y.a | y.b |
|—–|—–|—–|—–|
| 1 | 1 | 1 | 1 |
2. Linha `(2, NULL)` de `x` se junta com linha `(2, NULL)` de `y`:
| x.a | x.b | y.a | y.b |
|—–|—–|—–|—–|
| 2 | NULL| 2 | NULL|
3. Linha `(NULL, 3)` de `x` não encontra correspondência em `y`, então combina com `NULL`:
| x.a | x.b | y.a | y.b |
|——|——|——|——|
| NULL | 3 | NULL | NULL |
4. Linha `(4, 4)` de `x` se junta com linha `(4, 4)` de `y`:
| x.a | x.b | y.a | y.b |
|—–|—–|—–|—–|
| 4 | 4 | 4 | 4 |
5. Linha `(5, 5)` de `x` se junta com linha `(5, 5)` de `y`:
| x.a | x.b | y.a | y.b |
|—–|—–|—–|—–|
| 5 | 5 | 5 | 5 |
6. Linha `(NULL, 3)` de `y` não encontra correspondência em `x`, então combina com `NULL`:
| x.a | x.b | y.a | y.b |
|——|——|——|——|
| NULL | NULL | NULL | 3 |
Contagem total das linhas:
– 1 linha para `(1, 1)` se juntando com `(1, 1)`
– 1 linha para `(2, NULL)` se juntando com `(2, NULL)`
– 1 linha para `(NULL, 3)` em `x` sem correspondência em `y`
– 1 linha para `(4, 4)` se juntando com `(4, 4)`
– 1 linha para `(5, 5)` se juntando com `(5, 5)`
– 1 linha para `(NULL, 3)` em `y` sem correspondência em `x`
Totalizando: 1 + 1 + 1 + 1 + 1 + 1 = 6 linhas.
Portanto, a resposta correta é b) 6.
Figura 1 – Tela do MS SQL SERVER
Espero que esta explicação tenha esclarecido a dúvida sobre o funcionamento do `FULL JOIN` e como calcular o número de linhas resultantes de um comando SQL.
Atenciosamente,
Prof. PhD Washington Almeida
Gran Cursos Online
Quer ficar por dentro dos concursos públicos abertos e previstos pelo Brasil?
clique nos links abaixo:
Receba gratuitamente no seu celular as principais notícias do mundo dos concursos!
clique no link abaixo e inscreva-se gratuitamente: