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 venda (cliente_id, data, valor, produto) INSERT
INTO troca (cliente_id, data, produto, troca) |
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 nome Agora, queremos saber quais produtos foram movimentados,
ou seja, tanto faz se foram vendidos ou trocados:
SELECT venda.produto
FROM venda produto Observações:
INTERSECT
SELECT cliente.nome
FROM
troca JOIN cliente ON
cliente.cliente_id
= troca.cliente_id;
--------------------------
Anderson Marques
Daniela Freitas
Paulo Santos Macedo
(3 rows)
UNION
SELECT troca.troca
FROM troca;
--------------------------
Despertador
Fichário
Garrafa Térmica
Lapiseira
Mala Viagem
Maleta Executivo
Mochila
Rádio
Relógio
Saca-rolha
(10 rows)
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.
2001 - iMasters FFPA Informática Ltda - Todos os direitos reservados.