sexta-feira, 23 de setembro de 2011

Selecionando Duas Tabelas Diferentes

           Dessa vez foi mais simples, mas tem algumas pessoas que ainda não entenderam como checar duas tabelas que estão relacionadas, vamos começar montando o exemplo, mas como eu não gosto de fruta, mamão com açúcar seria inútil.

           Tabela de Carro Novos (tb_carro_novo)
  
           car_codigo  -----  int ----- not null ----- PK
           car_modelo -----  varchar ----- not null 
           car_marca   ----- varchar  ----- not null
           car_cor       ----- varchar  ----- not null
           


          

           Tabela de Carro Usados (tb_carro_usado)

  
           car_codigo  -----  int ----- not null ----- PK
           car_modelo -----  varchar ----- not null 
           car_marca   ----- varchar  ----- not null
           car_cor       ----- varchar  ----- not null



           Tabela de Placas Registradas (tb_placa)

           pla_codigo  -----  int ----- not null ----- PK           car_codigo  -----  int ----- not null ----- FK
           pla_numero ----- varchar  ----- not null
           


           Com as tabelas definidas vamos montar uns exeplos de consultas:


            Consulta simples dos carros novos:


            Select * from tb_carro_novo // Selecionar todos os carros novos

              Consultas compostas entre tabela de carros usados e suas tabela de placas registradas na tabela de placas:     


              1º modo:
 
            Select * from tb_carro_usado X, tb_placa Z
               where x.car_codigo = z.car_codigo



            Observe: Ao selecionar a tabela de carros usados eu apelidei a tabela de "X" para que fique menor o código e a tabela de placas fiz o mesmo chamando de "Z" , veja como ficaria se não fizesse isso:

            Select * from tb_carro_usado, tb_placa
            where tb_carro_usado.car_codigo = tb_placa.car_codigo

            Com duas tabelas o código fica somente um pouco maior, mas vamos dizer que você precise selecionar 3 ou 4 tabelas, o código ficará bem maior.


            Agora vou explicar um pouco sobre a família JOIN que tem muita gente que não sabe muito bem como funciona então vamos lá:




            Left Join: Verificará e trará os campos solicitados somente da tabela que estiver a esquerda da comparação entre tabelas relacionadas.


            Right Join: O mesmo fará o right join porém buscando os campos da tabela que está a direita da comparação entre as tabelas relacionadas.


            Inner join: O efeito é trazer os campos de ambas tabelas relacionadas dentro da comparação feita entre elas.


           então vamos ao 2º Modo:

              Select * from tb_carro_usado X left join (tb_placa Y) on 
            (X.caruso_codigo = Y.caruso_codigo)
             
           Sendo assim buscamos os dados contidos na tabela de carros usados que estão cadastradas placas referentes a eles, os que não estiverem não serão mostrados.





          Vamos selecionar todos os carros novos e usados numa mesma consulta usando o camando Union, observe:


          select * from tb_carro_novo union select * from tb_carro_usado
 
 
          O banco de dados trará os dados da primeira tabela selecionada e em seguida o da segunda tabela no mesmo resultado, mas reparem que ele manteve a descrição da coluna da primeira tabela, porém ninguém uni nada sem um objetivo verdadeiro, então vamos dizer que o cliente quer saber quais carros da marca CHEVROLET a loja tem sendo usado ou não ai a chamada dos dados ficaria assim:


          
     (select * from tb_carro_novo where carnovo_marca = 'CHEVROLET')
       union 
      (select * from tb_carro_usado where caruso_marca = 'CHEVROLET')


      Observe que eu coloquei a cláusula where dentro do primeiro select e depois no segundo select para que traga a condição nas duas tabelas.
      Algumas pessoas podem estranhar o motivo de eu colocar o nome CHEVROLET em maiúsculo, é que eu mantenho o meu banco de dados utilizando maiúsculo para padronização de tamanho.


       Agora só pra terminar vamos selecionar na tabela de carros novos um lista de modelos de carros.

       Select * from tb_carro_novo
       where carnovo_modelo in ('CIVIC', 'CELTA', 'FIESTA')
       union
       Select * from tb_carro_usado
       where caruso_modelo in ('PALIO', 'GOL', 'CLIO')


       Sendo que eu não adicionei nenhum carro da Renault o CLIO não aparecerá, caso contrário estará lá no resultado.




       Bom, esta foi mais uma ajudinha pra galera.

       Espero ter ajudado.

       Que a força esteja com os Geeks.