[Tutorial] Junзгo entre tabelas MySQL
#1

Introduзгo
  • O que й uma Junзгo?
    Quando criamos um servidor utilizando o plugin MySQL, temos vбrias tabelas, e muitas delas sгo relacionadas, como por exemplo:
    PHP код:
    CREATE TABLE player(
    id INT(4AUTO_INCREMENT PRIMARY KEY,
    nick VARCHAR(24));
    CREATE TABLE house (
    id INT(4AUTO_INCREMENT PRIMARY KEY,
    player_id INT(4),
    FOREIGN KEY (player_idREFERENCES player(idON DELETE CASCADE); 
    Essas duas tabelas tem a relaзгo de que 1 casa pertence a apenas 1 player jб que a chave estrangeira esta na tabela house

    No decorrer do desenvolvimento pode surgir o seguinte problema:

    Selecionar o nome do dono da casa X(id da casa).

    Como fazer isso se sу tenho o id do player na tabela house?


    Tipos de JOIN

  • INNER JOIN

    Soluзгo para questгo acima: Usar um INNER JOIN(ou somente JOIN), uma junзгo interna, este tipo de junзгo nos retorna as linhas que possuem relaзгo, como por exemplo, uma casa que possua uma dono(player), veja um exemplo:
    PHP код:
    SELECT nick FROM player JOIN house ON house.player_id player.id WHERE house.id 10 
    Explicaзгo:
    1. SELECT nick FROM player - selecione a coluna 'nick' da tabela 'player'
    2. JOIN house - junte con a tabela 'house'
    3. ON house.player_id = player.id - Onde a coluna 'player_id' na tabela 'house' seja igual a coluna 'id' na tabela 'player'
    4. WHERE house.id = 10 - E onde a coluna 'id' na tabela 'house' seja igual a 10


    Mas se minha questгo for:
    Mostrar o nick dos players que nгo possuem casa?

  • OUTER JOIN
    Soluзгo para questгo acima: Para isso utilizamos um OUTER JOIN, uma junзгo externa, que nos retorna tanto os resultados que possuem uma relaзгo, quantos os que nгo possuem, veja um exemplo:
    PHP код:
    SELECT nick FROM player OUTER JOIN house ON house.player_id player.id where house.player_id is null 
    Explicaзгo:
    1. SELECT nick FROM player - selecione a coluna 'nick' da tabela 'player'
    2. OUTER JOIN house - junte con a tabela 'house' mostrando todos os resultados das duas tabelas
    3. ON house.player_id = player.id - Onde a coluna 'player_id' na tabela 'house' seja igual a coluna 'id' na tabela 'player'
    4. WHERE house.player_id is null - E onde a coluna 'player_id' na tabela 'house' seja nula, ou seja, nгo exista relacionamento entre as duas tabelas
    Porйm o cуdigo acima nos retornarб um erro, pois quando usamos um OUTER JOIN precisamos especificar se desejamos exibir da tabela a direita ou a esquerda da nossa junзгo. No nosso exemplo queremos exibir o a coluna 'nick' na tabela 'player', estamos selecionando a tabela antes de fazer a junзгo, ou seja, estamos fazendo um LEFT OUTER JOIN pois a coluna 'player' estб a esquerda da junзгo.

    Entгo o cуdigo correto seria este:
    PHP код:
    SELECT nick FROM player LEFT OUTER JOIN house ON house.player_id player.id where house.player_id is null 
    OBSERVAЗФES
    Lembrando que quando usamos uma junзгo precisamos comparar sempre a chave primбria de uma tabela com a chave estrangeira de outra tabela.

  • AUTO RELACIONAMENTO
    Outro tipo de relacionamento que possuнmos em SQL й o Auto Relacionamento, onde precisamos fazer uma consulta na mesma tabela mais de uma vez, para isso utilizamos Aliases(Apelidos) na tabela que queremos fazer a consulta, veja um exemplo:

    Supondo que temos as seguintes tabelas:
    PHP код:
    create table player(
    id int(4auto_increment primary key,
    nick varchar(24));
    create table friends 
    player_id1 int(4), 
    player_id2 int(4), 
    // nesse caso devemos utilizar Chave Primaria Composta, onde temos mais de um campo como chave primaria
    PRIMARY KEY(player_id1player_id2), 
    //e faremos os relacionamentos normais para cada chave
    FOREIGN KEY(player_id1REFERENCES player(id), 
    FOREIGN KEY(player_id2REFERENCES player(id
    //eu sei que existe maneira melhor para fazer o relacionamento, mas assim acho que fica mais claro para entender
    ); 
    Agora quero selecionar o nome dos meus amigos, ou seja, onde a coluna "player_id1" ou "player_id2" tenha como valor o meu ID

    Entгo faria o seguinte:
    PHP код:
    SELECT p1.nickp2.nick 
    FROM friends JOIN player p1 ON p1
    .id friends.player_id1
    JOIN player p2 ON p2
    .id friends.player_id2
    WHERE friends
    .player_id1 OR friends.player_id2 
    Vamos entender:
    SELECT p1.nick, p2.nick FROM friends - Selecione a coluna nick das tabelas p1 e p2
    FROM friends JOIN player p1 ON p1.id = friends.player_id1 - Selecione da tabela friends e junte com a tabela player. Repare que ao lado do nome da tabela colocamos seu apelido, no caso p1, a partir daqui sempre que formos nos referencias a esta tabela utilizamos o apelido dado a ela e nгo seu nome
    JOIN player p2 ON p2.id = friends.player_id2 - faзo outro join na tabela player porйm alterando seu apelido, isso faz com que o SGBD trate a tabela p1 e p2 como duas tabelas diferentes
    WHERE friends.player_id1 = 1 OR friends.player_id2 = 1 - Comparamos as chaves primarias da tabela friends para termos apenas os resultados em que meu ID esta cadastrado

    O resultado no final й esse:


    @ATUALIZAЗГO
  • INNER JOIN junto com UPDATE
    Quando possuimos tabelas relacionadas, as vezes precisamos atualizar os dados em mais de uma tabela, o mйtodo mais comum й usar dois UPDATE's, um para cada tabela alterada, porйm isto pode ser simplificado em apenas uma consulta, como no exemplo:

    Temos as seguintes tabelas:
    PHP код:
    CREATE TABLE player
    id INT(4AUTO_INCREMENT PRIMARY KEY
    nick VARCHAR(24), 
    money INT(9)); 
    CREATE TABLE house 
    id INT(4AUTO_INCREMENT PRIMARY KEY
    player_id INT(4),
    safe int(9), //dinheiro no cofre da casa 
    rent int(5), //valor do aluguel da casaa
    FOREIGN KEY (player_idREFERENCES player(idON DELETE CASCADE); 
    Agora vamos imaginar a seguinte situaзгo, tenho um sistema de aluguel de casa, onde o valor do aluguel й descontado do player e acrescentado no cofre da casa, para isso podemos utilizar a seguinte consulta:

    PHP код:
    UPDATE player JOIN house //junto a tabea player e a tabela house
    SET player.money player.money house.renthouse.safe hosue.safe house.rent //atualizo os valores nas duas tabelas
    WHERE house.player player.id //comparo chave primaria com chave estrangeira 
Reply
#2

Bom tutorial, bem explicado e nгo dei rep pq jб dei antes. PARABЙNS
Reply
#3

Muito bom!
Reply
#4

Quote:
Originally Posted by DelK
Посмотреть сообщение
Bom tutorial, bem explicado e nгo dei rep pq jб dei antes. PARABЙNS
Quote:
Originally Posted by Gguiz
Посмотреть сообщение
Muito bom!
Obrigado
Reply
#5

Nгo sabia deste recurso!
Realmente mais prбtico do que realizar uma consulta apуs a outra e ainda vocк consegue pegar informaзхes de outra tabela em uma sу consulta.
Reply
#6

Excelente tutorial. O MySQL й incrнvel pelas suas muitas possibilidades.
Reply
#7

Quote:
Originally Posted by F1N4L
Посмотреть сообщение
Nгo sabia deste recurso!
Muita gente nгo conhece, futuramente pretendo fazer um outro tutorial com algumas coisas legais que da pra fazer com SQL.

Quote:
Originally Posted by willttoonn
Посмотреть сообщение
Excelente tutorial. O MySQL й incrнvel pelas suas muitas possibilidades.
Nгo sу o MySQL, a linguagem SQL em si й muito poderosa
Reply
#8

Muito bom, eu nгo sabia disso.
Reply
#9

Quote:
Originally Posted by IlanZ
Посмотреть сообщение
Muito bom, eu nгo sabia disso.
Obrigado
Reply
#10

Muito bom tutorial.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)