?>
1-mysql Básico
Exercícios
?>

Capítulo 2

1-Junções

Na prática, um Banco de Dados não terá apenas uma tabela. Seja por motivo de organização dos dados, seja por questão de acesso a diferentes categorias de dados, geralmente organizamos o Banco em várias tabelas, que se relacionam entre si.

Portanto, geralmente, as consultass são feitas em várias tabelas simultaneamente. Para realizar consultas em mais de uma tabela usamos as junções (joins).

Nós vimos um exemplo "motivacional" quando fizemos uma consulta no Banco de Dados World.

No exemplo, mostramos que se fizermos a consulta apenas na tabela Country nós conseguiremos apenas obter o código do páis.

Para termos o resultado correto (país e capital) precisamos buscar o nome do páis, a partir do seu código.

(Veja nossa explicação nas páginas 11 e 12 desse texto)

Exemplo com Consulta em duas Tabelas

                            

mysql> select Name,Capital from Country where Continent = "South America";
+------------------+---------+
| Name             | Capital |
+------------------+---------+
| Argentina        |      69 |
| Bolivia          |     194 |
| Brazil           |     211 |
| Chile            |     554 |
| Colombia         |    2257 |
| Ecuador          |     594 |
| Falkland Islands |     763 |
| French Guiana    |    3014 |
| Guyana           |     928 |
| Peru             |    2890 |
| Paraguay         |    2885 |
| Suriname         |    3243 |
| Uruguay          |    3492 |
| Venezuela        |    3539 |
+------------------+---------+
14 rows in set (0.02 sec)


-------------------------------------------

mysql> select C.Name,T.Name
from Country C
inner join City T
ON C.Continent = "South America"
and
T.ID = C.Capital


+------------------+---------------------+
| Name             | Name                |
+------------------+---------------------+
| Argentina        | Buenos Aires        |
| Bolivia          | La Paz              |
| Brazil           | Brasília            |
| Chile            | Santiago de Chile   |
| Colombia         | Santafé de Bogotá   |
| Ecuador          | Quito               |
| Falkland Islands | Stanley             |
| French Guiana    | Cayenne             |
| Guyana           | Georgetown          |
| Peru             | Lima                |
| Paraguay         | Asunción            |
| Suriname         | Paramaribo          |
| Uruguay          | Montevideo          |
| Venezuela        | Caracas             |
+------------------+---------------------+
14 rows in set (0.06 sec)



                        

As junções, portanto, são usadas para coletarmos informações de mais de uma tabela. Ou seja, elas fazem "ligações" entre tabelas. Essas ligações são realizadas a partir dos valores de uma ou mais colunas.

juncao_world

Estudando Junções com Exemplos

Para entendermos melhor como são feitas as junções (que apesar de serem intuitivas, muitas vezes podem causar alguma confusão), vamos partir de exemplos simples, usando duas tabelas com apenas duas colunas.

Os exemplos que se seguem foram baseados numa explicação bem didática que pode ser encontrada nesse link.

Tabelas para Exemplos

Vamos usar duas tabelas (TabelaA e TabelaB), como mostrado abaixo:

Duas Tabelas para Estudo de Junções

                            

mysql> select * from TabelaA;
+---------+-------+
| Nome    | Chave |
+---------+-------+
| José    |     1 |
| Maria   |     3 |
| Renata  |     4 |
| Roberto |     8 |
+---------+-------+
4 rows in set (0.00 sec)

mysql> select * from TabelaB;
+------------+-------+
| Profissao  | Chave |
+------------+-------+
| Estivador  |     1 |
| Gerente    |     3 |
| Porteiro   |     5 |
| Engenheiro |     8 |
+------------+-------+
4 rows in set (0.00 sec)


                            
                        

Junção Interna - Inner Join

innerjoin

O diagrama apresentado acima exemplifica o que é uma junção interna: uma busca por valores na interseção de dois conjuntos.


A junção interna entre tabelas é a modalidade de junção que faz com que somente participem da relação resultante as linhas das tabelas de origem que antenderem à cláusula de junção. A sintaxe básica é:

Sintaxe Junção Interna

                            

SELECT col1, col2,...,colN, funcao1,...,funcao2
FROM tabela1
	INNER JOIN tabela2
	ON tabela1.col1=tabela2.col1
WHERE condicao
GROUP BY col1,col2,...,colN
HAVING expressao_logica
ORDER BY col1,col2,...,colN


                        

sendo,

                            

SELECT e FROM: comandos da seleção

col1,col2,...,colN: as N colunas da tabela

tabela1 e tabela2: tabelas envolvidas na junção

funcao1, funcao2,...,funcaoN: Funções agregadas (opcional)

WHERE, GROUP BY, HAVING e ORDER BY: cláusulas opcionais

INNER JOIN: cláusula que especifica que está sendo feita uma junção interna 
 entre as tabelas tabela1 e tabela2. 

A utilização dessa cláusula não é obrigatória. 

Ela é usada para definir melhor o comando.

ON: identifica quais as colunas que serão usadas para realizar a junção.


                        

Inner Join nas Tabelas "TabelaA e TabelaB"

Inner Join - Junção Interna

                            
mysql> select TabelaA.*,TabelaB.*
    -> from TabelaA INNER JOIN TabelaB
    -> ON TabelaA.Chave = TabelaB.Chave;
+---------+-------+------------+-------+
| Nome    | Chave | Profissao  | Chave |
+---------+-------+------------+-------+
| José    |     1 | Estivador  |     1 |
| Maria   |     3 | Gerente    |     3 |
| Roberto |     8 | Engenheiro |     8 |
+---------+-------+------------+-------+
3 rows in set (0.00 sec)


                            
                        

Importante

É importante sabermos que podemos fazer consulta em duas tabelas sem usar a cláusula INNER JOIN. Podemos, por exemplo, usar a instrução "SELECT FROM" aplicada às colunas envolvidas. Veja o exemplo a seguir:

Consulta a duas Tabelas, sem usar INNER JOIN

                            


    mysql> select TabelaA.*,TabelaB.* from TabelaA,TabelaB where TabelaA.Chave = TabelaB.Chave;
+---------+-------+------------+-------+
| Nome    | Chave | Profissao  | Chave |
+---------+-------+------------+-------+
| José    |     1 | Estivador  |     1 |
| Maria   |     3 | Gerente    |     3 |
| Roberto |     8 | Engenheiro |     8 |
+---------+-------+------------+-------+
3 rows in set (0.00 sec)



                            
                        

Junções Externas

Conceito

Como vimos acima, na junção interna só participam dos resultados as linhas cujas colunas de junção possuem os mesmos valores em ambas as tabelas.

Na junção externa mesmo não havendo igualdade de valores as linhas de uma determinada tabela aparecem todas, dependendo do tipo de junção que se faz.

Temos junções externas do tipo:

  • à Esquerda (LEFT JOIN)

  • à Direita (RIGHT JOIN)

  • Completa (FULL JOIN)

Junção Externa à Esquerda (LEFT JOIN) ou (LEFT OUTER JOIN)

innerjoin

O diagrama apresentado acima exemplifica o que é uma junção à esquerda (ou junção externa à esquerda): todos elementos do conjunto à esquerda! (incluindo a parte de interseção).

Em uma junção externa à esquerda, a junção ocorre de forma que todas as linhas pertencentes à tabela posicionada à esquerda do termo LEFT OUTER JOIN (ou LEFT JOIN) e que atendam aos critérios definidos na cláusula WHERE farão parte da relação resultado, mesmo se não existirem valores correspondentes na coluna de junção da tabela posicionada a direita do comando.

Caso não exista valor correspondente na tabela á direita, as colunas selecionadas desta tabela, nas linhas onde não existem correspondência, terão valor NULL.

A junção externa à esquerda, que possui a sintaxe:

LEFT OUTER JOIN

                            
SELECT col1, col2,...,colN, funcao1,...,funcao2
FROM tabela1
	LEFT OUTER JOIN tabela2
	ON tabela1.col1=tabela2.col1
WHERE condicao
GROUP BY col1,col2,...,colN
HAVING expressao_logica
ORDER BY col1,col2,...,colN

                        

Sendo...

                                            


SELECT e FROM: comandos da seleção

col1,col2,...,colN: as N colunas da tabela

tabela1 e tabela2: tabelas envolvidas na junção

funcao1, funcao2,...,funcaoN: Funções agregadas (opcional)

WHERE, GROUP BY, HAVING e ORDER BY: cláusulas opcionais

LEFT OUTER JOIN: cláusula que especifica que está sendo feita
uma junção externa à esquerda entre as tabelas tabela1 e tabela2. 

ON: identifica quais as colunas que serão usadas para realizar a junção.

Exemplo de LEFT JOIN para TabelaA e TabelaB

LEFT JOIN

                            


mysql> select * from TabelaA;
+---------+-------+
| Nome    | Chave |
+---------+-------+
| José    |     1 |
| Maria   |     3 |
| Renata  |     4 |
| Roberto |     8 |
+---------+-------+
4 rows in set (0.00 sec)

mysql> select TabelaA.*,TabelaB.*
    -> FROM TabelaA LEFT JOIN TabelaB
    -> ON TabelaA.Chave = TabelaB.Chave;
+---------+-------+------------+-------+
| Nome    | Chave | Profissao  | Chave |
+---------+-------+------------+-------+
| José    |     1 | Estivador  |     1 |
| Maria   |     3 | Gerente    |     3 |
| Renata  |     4 | NULL       |  NULL |
| Roberto |     8 | Engenheiro |     8 |
+---------+-------+------------+-------+
4 rows in set (0.00 sec)



                        

Podemos escrever usando LEFT OUTER JOIN:

LEFT OUTER JOIN

                            
mysql> select TabelaA.*,TabelaB.*
    -> FROM TabelaA LEFT OUTER JOIN TabelaB
    -> ON TabelaA.Chave = TabelaB.Chave;
+---------+-------+------------+-------+
| Nome    | Chave | Profissao  | Chave |
+---------+-------+------------+-------+
| José    |     1 | Estivador  |     1 |
| Maria   |     3 | Gerente    |     3 |
| Renata  |     4 | NULL       |  NULL |
| Roberto |     8 | Engenheiro |     8 |
+---------+-------+------------+-------+
4 rows in set (0.01 sec)


                        

Junção Externa à DIREITA (RIGHT JOIN) ou (RIGHT OUTER JOIN)

innerjoin

O diagrama apresentado acima exemplifica o que é uma junção à direita (ou junção externa à direita): todos elementos do conjunto à direita! (incluindo a parte de interseção).

Em uma junção externa à direita, a junção ocorre de forma que todas as linhas pertencentes à tabela posicionada à direita do termo RIGHT OUTER JOIN (ou RIGHT JOIN) e que atendam aos critérios definidos na cláusula WHERE farão parte da relação resultado, mesmo se não existirem valores correspondentes na coluna de junção da tabela posicionada a direita do comando.

Caso não exista valor correspondente na tabela á esquerda, as colunas selecionadas desta tabela, nas linhas onde não existem correspondência, terão valor NULL.

A junção externa à direita, que possui a sintaxe:

RIGHT OUTER JOIN

                            
SELECT col1, col2,...,colN, funcao1,...,funcao2
FROM tabela1
	RIGHT OUTER JOIN tabela2
	ON tabela1.col1=tabela2.col1
WHERE condicao
GROUP BY col1,col2,...,colN
HAVING expressao_logica
ORDER BY col1,col2,...,colN

                        

Sendo...

                                            

SELECT e FROM: comandos da seleção
col1,col2,...,colN: as N colunas da tabela
tabela1 e tabela2: tabelas envolvidas na junção
funcao1, funcao2,...,funcaoN: Funções agregadas (opcional)
WHERE, GROUP BY, HAVING e ORDER BY: cláusulas opcionais
RIGHT OUTER JOIN: cláusula que especifica que está sendo feita
 uma junção externa à esquerda 
				entre as tabelas tabela1 e tabela2. 
ON: identifica quais as colunas que serão usadas para realizar a junção.

Exemplo de RIGHT JOIN para TabelaA e TabelaB

RIGHT JOIN

                            
mysql> select * FROM TabelaB;
+------------+-------+
| Profissao  | Chave |
+------------+-------+
| Estivador  |     1 |
| Gerente    |     3 |
| Porteiro   |     5 |
| Engenheiro |     8 |
+------------+-------+


mysql> SELECT TabelaA.*, TabelaB.*
    -> FROM TabelaA RIGHT JOIN TabelaB
    -> ON TabelaA.Chave = TabelaB.Chave;
+---------+-------+------------+-------+
| Nome    | Chave | Profissao  | Chave |
+---------+-------+------------+-------+
| José    |     1 | Estivador  |     1 |
| Maria   |     3 | Gerente    |     3 |
| NULL    |  NULL | Porteiro   |     5 |
| Roberto |     8 | Engenheiro |     8 |
+---------+-------+------------+-------+
4 rows in set (0.01 sec)





                        

Podemos escrever usando RIGHT OUTER JOIN:

RIGHT OUTER JOIN

                            
                           
mysql> SELECT TabelaA.*, TabelaB.*
    -> FROM TabelaA RIGHT OUTER JOIN TabelaB
    -> ON TabelaA.Chave = TabelaB.Chave;
+---------+-------+------------+-------+
| Nome    | Chave | Profissao  | Chave |
+---------+-------+------------+-------+
| José    |     1 | Estivador  |     1 |
| Maria   |     3 | Gerente    |     3 |
| NULL    |  NULL | Porteiro   |     5 |
| Roberto |     8 | Engenheiro |     8 |
+---------+-------+------------+-------+
4 rows in set (0.00 sec)


                        

Junção Externa COMPLETA (FULL OUTER JOIN) ou (FULL JOIN)

innerjoin

O diagrama apresentado acima exemplifica uma junção completa (FULL JOIN).

SQL FULL JOIN

Na linguagem SQL temos a opção de mostrar todas os registros das tabelas envolvidas na junção. Para isso usamos a JUNÇÃO COMPLETA (FULL JOIN).

Na FULL JOIN obtemos a listagem de todas as linhas das tabelas participantes e que atendam aos critérios de seleção especificados na cláusula WHERE. A diferença da junção externa completa paras as junções a direita e a esquerda é nessas últimas, apenas uma das tabelas fornece todos os dados, mesmo quando não há correspondência. Na junção externa completa, as duas tabelas poderão apresentar valores sem correspondentes.

Sintaxe da FULL JOIN na SQL

RIGHT OUTER JOIN

                            
SELECT col1, col2,...,colN, funcao1,...,funcaoN

FROM NOME_TABELA
	FULL OUTER JOIN NOME_TABELA2

	ON NOME_TABELA.col1 = NOME_TABELA2.col1

WHERE CONDICAO

GROUP BY COL1,COL2,...COLN

HAVING expressao_logica

ORDER BY COL1,COL2,...COLN

                            
                        

Sendo...

                
SELECT e FROM: comandos da seleção

col1,col2,...,colN: as N colunas da tabela

tabela1 e tabela2: tabelas envolvidas na junção

funcao1, funcao2,...,funcaoN: Funções agregadas (opcional)

WHERE, GROUP BY, HAVING e ORDER BY: cláusulas opcionais

FULL OUTER JOIN: cláusula que especifica que está sendo feita
 uma junção externa COMPLETA 
entre as tabelas tabela1 e tabela2. 

ON: identifica quais as colunas que serão usadas para realizar a junção.

ATENÇÃO!!

O mysql não possui a JUNÇÃO EXTERNA COMPLETA. Ou seja não aceita a consulta usando as palavras chave:

FULL OUTER JOIN

Para fazermos um junção completa no mysql usamos uma UNION (união) entre duas instruções select, com junção à diretia e à esquerda. Veja:

FULL JOIN no mysql usando UNION

                            
                           
mysql> (SELECT TabelaA.*, TabelaB.* FROM TabelaA
    -> LEFT JOIN TabelaB
    -> ON TabelaA.Chave=TabelaB.Chave)
    -> UNION
    -> (SELECT TabelaA.*,TabelaB.* FROM TabelaA
    -> RIGHT JOIN TabelaB
    -> on TabelaA.Chave=TabelaB.Chave);
+---------+-------+------------+-------+
| Nome    | Chave | Profissao  | Chave |
+---------+-------+------------+-------+
| José    |     1 | Estivador  |     1 |
| Maria   |     3 | Gerente    |     3 |
| Renata  |     4 | NULL       |  NULL |
| Roberto |     8 | Engenheiro |     8 |
| NULL    |  NULL | Porteiro   |     5 |
+---------+-------+------------+-------+
5 rows in set (0.00 sec)





                        
JOINS no SQL
SQL - Sintaxe Opcional SQL - Sintaxe Completa
A LEFT JOIN B A LEFT OUTER JOIN B
A RIGHT JOIN B A RIGHT OUTER JOIN B
A FULL JOIN B A FULL OUTER JOIN B
A INNER JOIN B A JOIN B

Lembrando que no mysql não temos o FULL OUTER JOIN (ou FULL JOIN ). Para fazê-la nós usamos a UNION

Outer Excluding Join (Junção de Exclusão)

innerjoin

O diagrama apresentado acima exemplifica uma Outer Excluding Join.

Usando o Outer Excluding Join teremos como resultado todos os registros que estão na tabela B, mas que não estejam na tabela A, e todos os registros que estão na tabela A, mas que não estejam na tabela B, satisfazendo a condição da chave.

OUTER EXCLUDING JOIN

                            
mysql> (SELECT TabelaA.*, TabelaB.* 
-> FROM TabelaA LEFT JOIN TabelaB 
-> ON TabelaA.Chave=TabelaB.Chave 
-> where TabelaA.Chave is Null or TabelaB.Chave is NULL) 
-> UNION
->  (SELECT TabelaA.*,TabelaB.*
->  FROM TabelaA RIGHT JOIN TabelaB 
-> on TabelaA.Chave=TabelaB.Chave 
->  where TabelaA.Chave is Null or TabelaB.Chave is NULL);

+--------+-------+-----------+-------+
| Nome   | Chave | Profissao | Chave |
+--------+-------+-----------+-------+
| Renata |     4 | NULL      |  NULL |
| NULL   |  NULL | Porteiro  |     5 |
+--------+-------+-----------+-------+
2 rows in set (0.00 sec)


                        

Observação

Obviamente podemos ter a junção de exclusão à esquerda ou à direita. No nosso exemplo acima, basta não usarmos a união (UNION), fazendo apenas a primeira consulta (esquerda) ou a segunda (direita).

Cross JOIN - Junção Cruzada

Em algumas situações é necessário gerar todas as combinações possíveis entre elementos de duas tabelas. Essa operação é um produto cartesiano dos elementos das tabelas. Para isso, podemos usar uma junção cross join.

Nos exemplos que se seguem, usamos o banco de dados "campeonato", composto de dois grupos de tenistas:

Banco de Dados "campeonato"

                            

mysql> use campeonato
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+----------------------+
| Tables_in_campeonato |
+----------------------+
| grupo1               |
| grupo2               |
+----------------------+
2 rows in set (0.01 sec)



mysql> select * from grupo1;
+------+-----------+-----------+------+
| id   | nome      | sobrenome | pais |
+------+-----------+-----------+------+
|    1 | Novak     | Djokovic  | SERV |
|    3 | Dominic   | Thiem     | AUST |
|    5 | Roger     | Federer   | SUIC |
|    7 | Alexander | Zverev    | ALEM |
+------+-----------+-----------+------+
4 rows in set (0.00 sec)

mysql> select * from grupo2;
+------+----------+-----------+------+
| id   | nome     | sobrenome | pais |
+------+----------+-----------+------+
|    2 | Rafael   | Nadal     | ESP  |
|    4 | Danil    | Medvedev  | RUS  |
|    6 | Stefanos | Tsitsipas | GREC |
|    8 | Andrey   | Rublev    | RUS  |
+------+----------+-----------+------+
4 rows in set (0.00 sec)

mysql> select * from grupo1,grupo2;
+------+-----------+-----------+------+------+----------+-----------+------+
| id   | nome      | sobrenome | pais | id   | nome     | sobrenome | pais |
+------+-----------+-----------+------+------+----------+-----------+------+
|    7 | Alexander | Zverev    | ALEM |    2 | Rafael   | Nadal     | ESP  |
|    5 | Roger     | Federer   | SUIC |    2 | Rafael   | Nadal     | ESP  |
|    3 | Dominic   | Thiem     | AUST |    2 | Rafael   | Nadal     | ESP  |
|    1 | Novak     | Djokovic  | SERV |    2 | Rafael   | Nadal     | ESP  |
|    7 | Alexander | Zverev    | ALEM |    4 | Danil    | Medvedev  | RUS  |
|    5 | Roger     | Federer   | SUIC |    4 | Danil    | Medvedev  | RUS  |
|    3 | Dominic   | Thiem     | AUST |    4 | Danil    | Medvedev  | RUS  |
|    1 | Novak     | Djokovic  | SERV |    4 | Danil    | Medvedev  | RUS  |
|    7 | Alexander | Zverev    | ALEM |    6 | Stefanos | Tsitsipas | GREC |
|    5 | Roger     | Federer   | SUIC |    6 | Stefanos | Tsitsipas | GREC |
|    3 | Dominic   | Thiem     | AUST |    6 | Stefanos | Tsitsipas | GREC |
|    1 | Novak     | Djokovic  | SERV |    6 | Stefanos | Tsitsipas | GREC |
|    7 | Alexander | Zverev    | ALEM |    8 | Andrey   | Rublev    | RUS  |
|    5 | Roger     | Federer   | SUIC |    8 | Andrey   | Rublev    | RUS  |
|    3 | Dominic   | Thiem     | AUST |    8 | Andrey   | Rublev    | RUS  |
|    1 | Novak     | Djokovic  | SERV |    8 | Andrey   | Rublev    | RUS  |
+------+-----------+-----------+------+------+----------+-----------+------+
16 rows in set (0.03 sec)



                        

Sintaxe Cross JOIN

Veja a sintaxe da junção "cross join"

SELECT col1, col2,...,colN, funcao1,...,funcao2
FROM tabela1
	CROSS JOIN tabela2
WHERE condicao
GROUP BY col1,col2,...,colN
HAVING expressao_logica
ORDER BY col1,col2,...,colN

Exemplo

Exemplo de Cross Join

                            

mysql> select grupo1.sobrenome as G1,
    -> grupo2.sobrenome as G2
    -> from grupo1 cross join grupo2;
+----------+-----------+
| G1       | G2        |
+----------+-----------+
| Zverev   | Nadal     |
| Federer  | Nadal     |
| Thiem    | Nadal     |
| Djokovic | Nadal     |
| Zverev   | Medvedev  |
| Federer  | Medvedev  |
| Thiem    | Medvedev  |
| Djokovic | Medvedev  |
| Zverev   | Tsitsipas |
| Federer  | Tsitsipas |
| Thiem    | Tsitsipas |
| Djokovic | Tsitsipas |
| Zverev   | Rublev    |
| Federer  | Rublev    |
| Thiem    | Rublev    |
| Djokovic | Rublev    |
+----------+-----------+
16 rows in set (0.00 sec)

mysql> select grupo1.sobrenome as G1, grupo2.sobrenome as G2 from grupo1 cross join grupo2
    -> where grupo1.id < 7 and grupo2.id < 8;
+----------+-----------+
| G1       | G2        |
+----------+-----------+
| Federer  | Nadal     |
| Thiem    | Nadal     |
| Djokovic | Nadal     |
| Federer  | Medvedev  |
| Thiem    | Medvedev  |
| Djokovic | Medvedev  |
| Federer  | Tsitsipas |
| Thiem    | Tsitsipas |
| Djokovic | Tsitsipas |
+----------+-----------+
9 rows in set (0.01 sec)




mysql> select grupo1.id as G1, grupo2.id as G2 from grupo1 cross join grupo2 where grupo1.id < 7 and grupo2.id < 8;
+------+------+
| G1   | G2   |
+------+------+
|    5 |    2 |
|    3 |    2 |
|    1 |    2 |
|    5 |    4 |
|    3 |    4 |
|    1 |    4 |
|    5 |    6 |
|    3 |    6 |
|    1 |    6 |
+------+------+
9 rows in set (0.00 sec)


mysql> select  concat(grupo1.id,'-',grupo1.sobrenome) as g1, concat(grupo2.id,'-',grupo2.sobrenome) as g2 from grupo1 cross join grupo2 where grupo1.id < 7 and
grupo2.id < 8;
+------------+-------------+
| g1         | g2          |
+------------+-------------+
| 5-Federer  | 2-Nadal     |
| 3-Thiem    | 2-Nadal     |
| 1-Djokovic | 2-Nadal     |
| 5-Federer  | 4-Medvedev  |
| 3-Thiem    | 4-Medvedev  |
| 1-Djokovic | 4-Medvedev  |
| 5-Federer  | 6-Tsitsipas |
| 3-Thiem    | 6-Tsitsipas |
| 1-Djokovic | 6-Tsitsipas |
+------------+-------------+
9 rows in set (0.00 sec)


mysql> select  concat(grupo1.id,'-',grupo1.sobrenome) as g1, concat(grupo2.id,'-',grupo2.sobrenome) as g2 from grupo2 cross join grupo1 where grupo1.id < 7 and
grupo2.id < 8;
+------------+-------------+
| g1         | g2          |
+------------+-------------+
| 1-Djokovic | 6-Tsitsipas |
| 1-Djokovic | 4-Medvedev  |
| 1-Djokovic | 2-Nadal     |
| 3-Thiem    | 6-Tsitsipas |
| 3-Thiem    | 4-Medvedev  |
| 3-Thiem    | 2-Nadal     |
| 5-Federer  | 6-Tsitsipas |
| 5-Federer  | 4-Medvedev  |
| 5-Federer  | 2-Nadal     |
+------------+-------------+
9 rows in set (0.00 sec)


                        

Explicação

Nas consultas acima usamos a junção cruzada para gerar combinacões possíveis entre as duas tabelas (cada uma correspondente a um grupo de jogadores).

Podemos usar as consultas cruzadas para, por exemplo, definir uma tabela de jogos em que todos jogadores do grupo 1, jogam com todos dos grupo 2.

Exercício

Execute os exemplos apresentados nessa página. Foram usados os bancos "world", "ExemplosJuncoes", livraria" e "campeonato".

Veja nesse link a referência para esses bancos.

Alguns links sobre SQL JOIN

voltar ao início da página