quinta-feira, 10 de março de 2016

Relacionando tabelas em bancos de dados

Hoje veremos como relacionar tabelas em bancos de dados de forma bem básica: a 1ª é relacionando apenas duas tabelas; a seguir vamos acrescentar uma 3ª tabela. Siga os passos:




I – Relacionamento simples
Como exemplo, vamos criar 2 tabelas: autor e artigos (vamos usar o Postgres, para variar um pouco):

CREATE TABLE autor
(
  id serial NOT NULL,
  nome character varying(50),
  CONSTRAINT autor_pkey PRIMARY KEY (id )

)

CREATE TABLE artigos
(
  id serial NOT NULL,
  titulo character varying(100),
  texto character varying(500),
  id_autor integer,
  CONSTRAINT artigos_pkey PRIMARY KEY (id )

)

(a coluna “serial” no Postgres é como a auto_increment do Mysql)

Preencha as tabelas com alguns registros:



Olhando assim, já dá p/ perceber que o autor nº 1 (Fernando) tem 2 artigos (artigos 1 e 2) e o autor 2 1 artigo (nº 3), ok?

SQL:

select artigos.id, autor.nome, artigos.titulo, artigos.texto from autor join artigos on autor.id=artigos.id_autor;

Explicando: relacionar nome_da_tabela.coluna; p/ relacionar as tabelas: tabela 1 JOIN tabela 2 etc., no “ON” indicar as colunas em comum (neste caso, coluna id da tabela autor com coluna id_autor da tabela artigos):



Claro, existem outros tipos de “JOINs” (Left join, outer join...), mas o princípio ta aí.
Nesse exemplo simples, inclusive não é obrigatório o “JOIN”, pode-se usar “where” (sem o “ON”):



II – Complicando um pouquinho: Acrescentando uma 3ª tabela
Continuando nosso exemplo, vamos acrescentar uma tabela de categorias para os artigos (mas, para facilitar, vamos usar o Mysql mesmo):

CREATE TABLE `categoria` (
  `id` int(10) NOT NULL auto_increment,
  `nome_categ` varchar(50) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

Preencha com alguns registros:



Caso já tenha a tabela de artigos sem a coluna “categoria” use esse comando para adiciona-la:

alter table artigos add column categoria int(10);

Vamos inserir alguns registros para teste:


Ok, o primeiro teste é simples: vamos listar todos os artigos, com suas categorias e autores:

select artigos.id, categoria.nome_categ, autor.nome, artigos.titulo, artigos.texto
from artigos join categoria on artigos.categoria=categoria.id
join autor on artigos.autor=autor.id;


Ok, não é? O importante é “sacar” que relacionamos uma tabela (ex: artigos) com outra (JOIN categoria) com a condição de junção (on artigos.categoria=categoria.id); acrescentando outra(s) tabelas, basta manter a ordem

Agora 2 consultas mais interessantes: 1) vamos listar os artigos que Não sejam sobre a categoria “PHP”:


2) agora todos os artigos do autor “Fernando”:


Sugestão de exercício: acrescente uma coluna na tabela artigos e insira uma data de inserção do artigo; relacione a seguir os artigos de uma determinada data; de um determinado mês; some-os; faça uma outra consulta ordenando os artigos pela data mais recente até a mais antiga (dica: pesquise sobre “order by” e “desc”).