Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Noções básicas sobre exibições em SQL


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 comando.
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.