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 )
)
(
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”).