Por Manoj Debnath
As tabelas em um banco de dados SQL podem conter uma enorme quantidade de dados, mas nem sempre estão em um formato útil para serem usadas prontamente. O volume de dados deve ser filtrado com base em alguns critérios especificados para uso eficiente. Por motivos de segurança, podemos querer tornar público apenas uma certa quantidade de dados, enquanto o restante pode ser acessível aos usuários privilegiados. As operações SQL DML são extensíveis e usadas para filtrar uma ou mais tabelas usando expressões de consulta complexas. Aproveitando a ideia, podemos criar tabelas virtuais a partir de tabelas base persistentes usando SQL que conteriam os dados exatos de que precisamos. Esta é a razão pela qual o padrão SQL:2006 introduziu o uso de tabelas de visualização, ou visualizações. A definição de uma visão ou uma tabela virtual existe como um objeto de esquema. Este artigo apresenta o conceito de views em SQL, como funciona e mostra como é implementado com alguns exemplos.
Introdução às visualizações SQL
As visualizações SQL nada mais são do que tabelas virtuais que residem na memória derivada de uma ou mais tabelas base. Tabelas virtuais significam que as tuplas nas visualizações não têm existência física e não são armazenadas no banco de dados. As tuplas são como dados temporários criados como resultado da consulta SQL que normalmente extrai dados filtrados de uma ou mais tabelas base. Como resultado, há uma limitação no tipo de operação que pode ser aplicada a uma tabela de exibição. Por exemplo, a operação de atualização não pode ser aplicada a todos os tipos de exibição, mas não tem limitação na aplicação de consulta SQL nela.
Os exemplos abaixo são testados com o banco de dados MySQL. Comece criando algumas tabelas:
minha_empresa base de dados:
CREATE DATABASE my_company; CREATE TABLE Employee( empId INT(11) UNSIGNED CHECK (empId > 0), empName VARCHAR(20), birthDate DATE, address TEXT(128), gender VARCHAR(1), salary DECIMAL(15,2), managerId INT(11) UNSIGNED, deptId INT(11) UNSIGNED, PRIMARY KEY(empId) ); CREATE TABLE Department( deptId INT(11) UNSIGNED CHECK (empId > 0), deptName VARCHAR(20), deptMgrId INT(11) UNSIGNED, mgrStartDate DATE, PRIMARY KEY(deptId) ); CREATE TABLE Project( projId INT(11) UNSIGNED CHECK (empId > 0), projName VARCHAR(20), projLocation TEXT(128), deptId INT(11) UNSIGNED, PRIMARY KEY(projId) ); CREATE TABLE EmpWorksOnProj( empId INT(11) UNSIGNED, projId INT(11) UNSIGNED, hoursWorked DECIMAL(4,2) ); ALTER TABLE Employee ADD CONSTRAINT fk_emp_mgr FOREIGN KEY(managerId) REFERENCES Employee(empId); ALTER TABLE Employee ADD CONSTRAINT fk_emp_dept FOREIGN KEY(deptId) REFERENCES Department(deptId); ALTER TABLE Department ADD CONSTRAINT fk_dept_mgr FOREIGN KEY(deptMgrId) REFERENCES Employee(empId); ALTER TABLE Project ADD CONSTRAINT fk_proj_dept FOREIGN KEY(deptId) REFERENCES Department(deptId);
As visualizações podem ser consideradas como uma tabela de referência e podemos usá-la com a frequência que desejarmos, embora ela possa não existir fisicamente. Por exemplo, podemos frequentemente precisar consultar a minha_empresa banco de dados e encontre Funcionário e Projeto em formação. Observe que há muitos para muitos relacionamentos entre Funcionário e Projeto como uma pessoa pode trabalhar em muitos projetos e também um projeto tem muitos funcionários. Portanto, em vez de especificar a junção de três tabelas:Employee , EmpWorksOnProj e Projeto toda vez que precisamos de uma informação colaborativa e emitimos uma consulta, definimos uma view que é especificada como resultado da junção entre essas tabelas. A visualização forma a tabela virtual criada a partir do resultado da consulta. A vantagem é que a consulta agora pode recuperar de uma única tabela resultante em vez de ter que recuperar de três tabelas unidas. A coleção de tabelas:Funcionário , Projeto , Departamento etc. formam assim as tabelas base ou tabela definidora da visão.
Vamos criar algumas visualizações com base no esquema fornecido acima.
CREATE VIEW V1 AS SELECT empName, projName, hoursWorked FROM Employee, Project, EmpWorksOnProj WHERE Employee.empId=EmpWorksOnProj.empId AND Project.projId=EmpWorksOnProj.projId;
A maneira de especificar consultas SQL na exibição ou tabela virtual é a mesma que especificar consultas envolvendo tabelas base. Você pode usar SQL SELECT em exibições para obter os dados da seguinte forma:
SELECIONE * DE V1;
EmpName | Nome do projeto | HorasTrabalhadas |
Mickey Mouse | ClubHouse | 6,50 |
… | … | … |
Pato Donald | Agricultura | 7,0 |
O seguinte cria uma segunda visualização:
CREATE VIEW V2 AS SELECT deptName, COUNT(*), SUM(salary) FROM Department, Employee WHERE Employee.deptId=Department.deptId GROUP BY deptName;
O SQL SELECT resulta em
SELECT * FROM V1;
Nome do Departamento | CONTAR(*) | SOMA(salário) |
Música | 5 | 56.000,00 |
… | … | … |
Drama | 2 | 25.400,00 |
Observe que na visualização V1 os nomes dos atributos são derivados da tabela base. Na V2, os novos nomes de atributos são especificados explicitamente usando uma correspondência de um para um entre os atributos especificados da cláusula CREATE VIEW e os especificados na cláusula SELECT. A cláusula SELECT com a visão é decisiva na definição da visão.
As informações exibidas devem estar sempre atualizadas. Isso significa que deve sempre refletir as alterações feitas nas tabelas base nas quais está definido. Isso é interessante, porque significa que a visão não é realmente materializada no momento de defini-la, mas depois quando uma consulta é especificada nela. O sistema de gerenciamento de banco de dados em segundo plano é responsável por manter a visualização atualizada.
ATUALIZAR, INSERIR e EXCLUIR nas visualizações
Em SQL, é possível criar visualizações atualizáveis que podem ser usadas para alterar dados existentes ou inserir novas linhas na visualização que, por sua vez, insere ou modifica o registro na tabela base . Uma visão é atualizável ou não é determinada pela instrução SELECT definida na definição da visão. Não há nenhuma cláusula especial para designar uma visão como atualizável. Normalmente, a definição de exibição deve ser simples e não deve conter nenhuma função agregada, como SUM, AVG, MAX, MIN, COUNT. Qualquer tipo de agrupamento ou cláusula DISTINCT ou JOIN também torna a visualização não atualizável. Consulte o manual de banco de dados relevante do RDBMS específico para saber o que torna uma visualização não atualizável.
Vamos criar uma visão atualizável:
CREATE VIEW v3_ch_dept_name AS SELECT deptId, deptName, deptMgrId, mgrStartDate FROM Department;
A consulta SELECT em exibição:
SELECT * FROM v3_ch_dept_name;
DeptId | Nome do Departamento | DeptMgrId | MgrStartDate |
1 | Música | 123456789 | 01-01-2020 |
… | … | … | … |
5 | Drama | 987654321 | 05-03-2018 |
Agora atualize a exibição alterando o nome do departamento (deptName).
UPDATE v3_ch_dept_name SET deptName = 'Security' WHERE deptId = 5;
Uma linha pode ser inserida na visualização da seguinte forma:
INSERT INTO v3_ch_dept_name VALUES (7,'Logistics',666884444,'1982-07-07');
Também podemos DELETE uma linha da visão da seguinte forma:
DELETE FROM v3_ch_dept_name WHERE deptId = 7;
No MySQL, você pode encontrar facilmente as visualizações em um banco de dados que são atualizáveis ou não usando o seguinte comando SELECT.
SELECT table_name FROM information_schema.views WHERE is_updatable like 'YES' AND table_schema like 'my_company';
DROP visualizações do banco de dados
Uma visualização sempre pode ser descartada com DROP VIEW
DROP VIEW V1;
Observe que quando executamos o comando drop view, ele remove a definição da visualização. Os dados subjacentes armazenados nas tabelas base das quais essa exibição é derivada permanecem inalterados. Uma visualização, uma vez descartada, pode ser recriada com o mesmo nome.
A instrução ALTER VIEW
As visualizações geralmente são inalteráveis de acordo com o padrão SQL:2006, o que significa que a instrução ALTER VIEW não funciona com visualizações. No entanto, existem RDBMSs como MySQL ou SQL Server que suportam esse tipo de instrução. A Oracle acredita em descartar a visão primeiro e depois recriá-la em vez de alterá-la. Portanto, as funcionalidades suportadas nas visualizações pelos RDBMSs variam de produto para produto.
Conclusão
As visualizações SQL também são ferramentas úteis para acessar vários tipos de dados. As consultas complexas podem ser armazenadas na definição de exibição. Isso aproveita a reutilização porque podemos invocar a exibição em vez de recriar as consultas sempre que precisarmos delas. É uma maneira conveniente de apresentar informações ao usuário ocultando muitas informações que não queremos expor a todos. Isso também é importante do ponto de vista da segurança. Estruturas complexas podem ser sintetizadas e apresentadas em um formato fácil para o usuário final.
Referências:
Elmasri, Ramez e Shamkant B. Navathe. Fundamentos de sistemas de banco de dados . Pearson Educação.