quarta-feira, fevereiro 21, 2007

Visões

As visões podem nos dar uma boa solução quando
desejamos ver dados compilados de várias tabe-
las. Um exemplo clássico seria um sistema de
controle de estoque que se poderia ter em uma
visão (view) com os dados do produto, compra,
etc...

Este é um exemplo de como pode ser criado uma
visão no MySQL.

CREATE TABLE PRODUTO (
CODPRODUTO INT NOT NULL,
NOMEPRODUTO VARCHAR(100) NOT NULL,
VALORPRODUTO DECIMAL(19,2) NOT NULL
) ENGINE = INNODB;

ALTER TABLE Produto ADD PRIMARY KEY (CODPRODUTO);

INSERT INTO Produto(CodProduto, NomeProduto, ValorProduto
) VALUES(1, 'Teclado USB PT-BR', 34.90);
INSERT INTO Produto(CodProduto, NomeProduto, ValorProduto
) VALUES(2, 'Monitor 17" LCD', 780.00);
INSERT INTO Produto(CodProduto, NomeProduto, ValorProduto
) VALUES(3, 'Gabinete ATX', 112.80);
INSERT INTO Produto(CodProduto, NomeProduto, ValorProduto
) VALUES(4, 'Papel A4 500 fls', 11.37);

CREATE TABLE VENDA (
CODTRANSACAO INT NOT NULL,
CODUSUARIO INT NOT NULL,
CODPRODUTO INT NOT NULL,
QTDPRODUTO INT NOT NULL
) ENGINE = INNODB;

ALTER TABLE VENDA ADD INDEX (CODUSUARIO);
ALTER TABLE Venda ADD FOREIGN KEY (CODPRODUTO) REFERENCES
Produto(CODPRODUTO) ON DELETE RESTRICT;

INSERT INTO Venda(CodTransacao, CodUsuario, CodProduto,
QtdProduto) VALUES(1, 51, 4, 2);
INSERT INTO Venda(CodTransacao, CodUsuario, CodProduto,
QtdProduto) VALUES(1, 51, 1, 1);

INSERT INTO Venda(CodTransacao, CodUsuario, CodProduto,
QtdProduto) VALUES(2, 171, 2, 1);
INSERT INTO Venda(CodTransacao, CodUsuario, CodProduto,
QtdProduto) VALUES(2, 171, 3, 1);
INSERT INTO Venda(CodTransacao, CodUsuario, CodProduto,
QtdProduto) VALUES(2, 171, 1, 1);

CREATE OR REPLACE VIEW V_VENDA AS
SELECT v.CodTransacao, v.CodUsuario, v.QtdProduto,
p.NomeProduto, v.QtdProduto * p.ValorProduto
TotalItem
FROM Produto p, Venda v
WHERE v.CodProduto = p.CodProduto
ORDER BY v.CodTransacao, p.CodProduto;


Supondo que tivessemos essas tabelas poderiamos
fazer um SELECT * FROM V_Venda e saber todos os
detalhes da venda sem ter que se preocupar em
montar um select gigantesco a cada vez que de-
sejassemos ver os detalhes de uma venda.

Experimente:

SELECT *
FROM V_Venda
GROUP BY CodUsuario;

SELECT *
FROM V_Venda
WHERE CodUsuario = 171
GROUP BY CodUsuario;

SELECT CodUsuario, SUM(TotalItem) TotalVenda
FROM V_VENDA
WHERE CodUsuario = 171
GROUP BY CodUsuario;

Muito útil isso quando não se tem que programar
sobre os registros, ou seja uma visão mesmo do
que está acontecendo. Caso contrário, se fosse
para manusear os dados, eu ao menos preferiria
o fazer em cursores em um procedimento
(procedure). :)

Em breve: Subqueries.

Nenhum comentário: