Treinamento Online
Segunda-feira, 17 de fevereiro de 2003 às 02h59

POSTGRESQL Interagindo com banco de dados

Faltam -1 dias! Inscreva-se agora! O maior encontro de profissionais web da américa latina.

Agora que você já tem o banco de dados PostgreSQL instalado e rodando, e já se identificou com alguma ferramenta para manipulação das bases de dados, vamos começar a interagir com o banco de dados. A intenção não é ensinar SQL, mas sim, mostrar como verificar no PostgreSQL determinadas funcionalidades existentes em outros bancos de dados, bem como algumas de suas particularidades.

Primeiro, criaremos 3 tabelas:


CREATE TABLE cliente (
cliente_id SERIAL NOT NULL,
desde      DATE NULL,
nome       VARCHAR(60) NULL,
CONSTRAINT XPKcliente 
    PRIMARY KEY (cliente_id)
);

CREATE TABLE venda (
venda_id   SERIAL NOT NULL,
cliente_id INT4 NOT NULL,
data       DATE NULL,
valor      NUMERIC(15,2) NULL,
produto    VARCHAR(30) NULL,
CONSTRAINT XPKvenda 
    PRIMARY KEY (venda_id), 
CONSTRAINT cliente_vendas
    FOREIGN KEY (cliente_id)
        REFERENCES cliente
);

CREATE INDEX XIF1venda ON venda
(
cliente_id 
);

CREATE TABLE troca (
troca_id   SERIAL NOT NULL,
cliente_id INT4 NOT NULL,
data       DATE NULL,
produto    VARCHAR(30) NULL,
troca      VARCHAR(30) NULL,
CONSTRAINT XPKtroca 
    PRIMARY KEY (troca_id), 
CONSTRAINT cliente_trocas
    FOREIGN KEY (cliente_id)
        REFERENCES cliente
);

CREATE INDEX XIF1troca ON troca
(
cliente_id 
);

Em seguida, iremos popular as tabelas com alguns dados:


INSERT INTO cliente (desde,nome) 
       VALUES ('2002-01-12','Paulo Santos Macedo');
INSERT INTO cliente (desde,nome) 
       VALUES ('2001-07-21','Márcia Barbosa');
INSERT INTO cliente (desde,nome) 
       VALUES ('2000-02-27','Anderson Marques');
INSERT INTO cliente (desde,nome) 
       VALUES ('2003-01-12','Daniela Freitas');
INSERT INTO cliente (desde,nome) 
       VALUES ('2003-01-15','Ana Júlia Cabral');

INSERT INTO venda (cliente_id, data, valor, produto) 
       VALUES (1,'2002-12-23',16,'Relógio');
INSERT INTO venda (cliente_id, data, valor, produto) 
       VALUES (3,'2002-12-23',110,'Mala Viagem');
INSERT INTO venda (cliente_id, data, valor, produto) 
       VALUES (1,'2002-12-21',10,'Saca-rolha');
INSERT INTO venda (cliente_id, data, valor, produto) 
       VALUES (4,'2002-12-20',32,'Fichário');
INSERT INTO venda (cliente_id, data, valor, produto) 
       VALUES (2,'2002-12-23',28,'Despertador');
INSERT INTO venda (cliente_id, data, valor, produto) 
       VALUES (3,'2002-12-23',43,'Mochila');
INSERT INTO venda (cliente_id, data, valor, produto) 
       VALUES (2,'2002-12-21',22,'Rádio');
INSERT INTO venda (cliente_id, data, valor, produto) 
       VALUES (4,'2002-12-20',12,'Lapiseira');

INSERT INTO troca (cliente_id, data, produto, troca) 
       VALUES (1,'2003-02-12','Relógio','Relógio');
INSERT INTO troca (cliente_id, data, produto, troca) 
            VALUES (3,'2003-02-13','Mala Viagem', 'Maleta Executivo');
INSERT INTO troca (cliente_id, data, produto, troca) 
       VALUES (1,'2003-02-08','Saca-rolha','Garrafa Térmica');
INSERT INTO troca (cliente_id, data, produto, troca) 
       VALUES (4,'2003-02-09','Fichário','Fichário');

Agora sim, vamos começar.

COMBINANDO CONSULTAS

Um problema encontrado quando escrevemos consultas em SQL é que, em determinados casos, estas consultas devem ser combinadas para obter o resultado desejado, pois, através de uma consulta única e direta, talvez não seja possível obtê-los. Combinar consultas significa que mais de uma instrução SELECT estará sendo usada na consulta. O resultado desta combinação se dará através das seguintes palavras-chave:

UNION utilizada para adicionar (unir) os resultados das instruções SELECT apresentadas na consulta
INTERSECT retorna somente os dados comuns resultantes das instruções SELECT apresentadas na consulta
EXCEPT mostra todos os dados que não estão incluídos na segunda instrução SELECT apresentada na consulta

Vamos aos exemplos:

Pelos dados iniciais de exemplo, vimos que existem 4 clientes que adquiriram produtos para o natal do ano passado e, alguns deles, tiveram que fazer a troca de alguns produtos por um motivo qualquer. 

Queremos saber então, quais clientes NÃO precisaram fazer nenhuma troca:

SELECT cliente.nome FROM venda JOIN cliente ON cliente.cliente_id = venda.cliente_id
EXCEPT
SELECT cliente.nome FROM troca JOIN cliente ON cliente.cliente_id = troca.cliente_id;

troca.cliente_id;

nome

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

Márcia Barbosa

(1 row)

...e quais PRECISARAM fazer alguma troca:

SELECT cliente.nome FROM venda JOIN cliente ON cliente.cliente_id = venda.cliente_id
INTERSECT

SELECT
cliente.nome FROM troca JOIN cliente ON cliente.cliente_id = troca.cliente_id;

nome
--------------------------
Anderson Marques
Daniela Freitas
Paulo Santos Macedo
(3 rows)

Agora, queremos saber quais produtos foram movimentados, ou seja, tanto faz se foram vendidos ou trocados:

SELECT venda.produto FROM venda
UNION
SELECT troca.troca FROM troca;

produto
--------------------------
Despertador
Fichário
Garrafa Térmica
Lapiseira
Mala Viagem
Maleta Executivo
Mochila
Rádio
Relógio
Saca-rolha
(10 rows)

Observações:
A arquitetura da base de dados influi diretamente sobre como serão criadas as consultas, ou seja, quais tabelas contém certos dados e, qual o relacionamento entre eles;
Obviamente, existem muitas formas de obter o mesmo resultado, as maneiras apresentadas aqui, são algumas delas;
Podemos perceber que para a execução correta das combinações, usamos somente colunas semelhantes de cada SELECT;


 

Tudo OK até aí?
Então, semana que vem tem mais.

Dúvidas, críticas e sugestões podem ser enviadas diretamente para meu e-mail, colocando no assunto (subject) "iMasters-PSQL".
Um abraço a todos.

Nenhum comentário até agora

Cancelar resposta

Qual a sua opinião?

Faça login abaixo ou cadastre-se rapidamente.


Sobre o Autor
Juliano Ignácio é Gerente de Arquitetura de Dados na Prosoft Tecnologia e participa da coordenação do projeto PostreSQL Brasil.

2001 - iMasters FFPA Informática Ltda - Todos os direitos reservados.