Por Manoj Debnath
Las tablas en una base de datos SQL pueden contener una enorme cantidad de datos, pero no siempre están en un formato útil para usarlas fácilmente. El volumen de datos debe filtrarse en función de algunos criterios específicos para un uso eficiente. Por razones de seguridad, es posible que queramos hacer públicos solo una cierta cantidad de datos, mientras que el resto puede ser accesible para los usuarios privilegiados. Las operaciones SQL DML son extensibles y se usan para filtrar una o más tablas usando expresiones de consulta complejas. Aprovechando la idea, podemos crear tablas virtuales a partir de tablas base persistentes usando SQL que contendrían los datos exactos que necesitamos. Esta es la razón por la que el estándar SQL:2006 introdujo el uso de tablas de vista o vistas. La definición de una vista o una tabla virtual existe como un objeto de esquema. Este artículo presenta el concepto de vistas en SQL, cómo funciona y muestra cómo se implementa con algunos ejemplos.
Introducción a las Vistas SQL
Las vistas SQL no son más que tablas virtuales que residen en la memoria derivadas de una o más tablas base. Las tablas virtuales significan que las tuplas en las vistas no tienen existencia física y no se almacenan en la base de datos. Las tuplas son como datos temporales creados como resultado de la consulta SQL que normalmente extrae datos filtrados de una o más tablas base. Como resultado, existe una limitación en el tipo de operación que se puede aplicar a una tabla de vista. Por ejemplo, la operación de actualización no se puede aplicar a todos los tipos de vistas, pero no tiene limitación para aplicarle una consulta SQL.
Los siguientes ejemplos se prueban con la base de datos MySQL. Comience creando algunas tablas:
mi_empresa base de datos:
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);
Las vistas se pueden pensar como una tabla de referencia, y podemos usarla tantas veces como queramos aunque no exista físicamente. Por ejemplo, es posible que con frecuencia necesitemos hacer referencia a my_company base de datos y busque Empleado y Proyecto información. Tenga en cuenta que existe una relación de muchos a muchos entre Empleado y Proyecto ya que una persona puede trabajar en muchos proyectos y también un proyecto tiene muchos empleados. Por lo tanto, en lugar de especificar la combinación de tres tablas:Empleado , EmpWorksOnProj y Proyecto cada vez que necesitamos una información colaborativa y emitimos una consulta, definimos una vista que se especifica como el resultado de la unión entre estas tablas. La vista forma la tabla virtual creada a partir del resultado de la consulta. La ventaja es que la consulta ahora puede recuperarse de una sola tabla resultante en lugar de tener que recuperarse de tres tablas unidas. La colección de tablas:Employee , Proyecto , Departamento etc. así forman las tablas base o tabla definitoria de la vista.
Vamos a crear algunas vistas basadas en el esquema anterior.
CREATE VIEW V1 AS SELECT empName, projName, hoursWorked FROM Employee, Project, EmpWorksOnProj WHERE Employee.empId=EmpWorksOnProj.empId AND Project.projId=EmpWorksOnProj.projId;
La forma de especificar consultas SQL en vista o tabla virtual es la misma que especificar consultas que involucran tablas base. Puede usar SQL SELECT en las vistas para obtener los datos de la siguiente manera:
SELECCIONE * DESDE V1;
NombreEmp | Nombre del proyecto | Horas trabajadas |
Ratón Mickey | Casa club | 6.50 |
… | … | … |
Pato Donald | Agricultura | 7.0 |
Lo siguiente crea una segunda vista:
CREAR VISTA V2 COMO SELECCIONAR nombreDepto, CUENTA(*), SUMA(salario) DESDE Departamento, Empleado DONDE Empleado.DeptId=Departamento.DeptId GRUPO POR NombreDepto;
Los resultados SQL SELECT en
SELECT * FROM V1;
NombreDepto | CONTAR(*) | SUMA(salario) |
Música | 5 | 56000.00 |
… | … | … |
Teatro | 2 | 25400.00 |
Tenga en cuenta que en la vista V1, los nombres de los atributos se derivan de la tabla base. En V2, los nuevos nombres de atributos se especifican explícitamente utilizando una correspondencia uno a uno entre los atributos especificados de la cláusula CREATE VIEW y los especificados en la cláusula SELECT. La cláusula SELECT con la vista es decisiva para la definición de la vista.
Se supone que la información a la vista siempre está actualizada. Eso significa que siempre debe reflejar los cambios realizados en las tablas base en las que se define. Esto es interesante, porque significa que la vista no se materializa realmente en el momento de definirla, sino más tarde cuando se especifica una consulta sobre ella. El sistema de administración de la base de datos en segundo plano es responsable de mantener la vista actualizada.
ACTUALIZAR, INSERTAR y ELIMINAR vistas
En SQL, es posible crear vistas actualizables que se pueden usar para cambiar datos existentes o insertar nuevas filas en la vista que a su vez inserta o modifica el registro en la tabla base . Una vista es actualizable o no está determinada por la declaración SELECT definida dentro de la definición de la vista. No existe una cláusula especial para designar una vista como actualizable. Por lo general, la definición de la vista debe ser simple y no debe contener funciones agregadas como SUM, AVG, MAX, MIN, COUNT. Cualquier tipo de cláusula de agrupación o DISTINCT o JOIN también hace que la vista no sea actualizable. Consulte el manual de la base de datos correspondiente del RDBMS específico para saber qué hace que una vista no sea actualizable.
Vamos a crear una vista que sea actualizable:
CREATE VIEW v3_ch_dept_name AS SELECT deptId, deptName, deptMgrId, mgrStartDate FROM Department;
La consulta SELECT a la vista:
SELECT * FROM v3_ch_dept_name;
ID de departamento | NombreDepto | IdGestiónDepto | Fecha de inicio del administrador |
1 | Música | 123456789 | 2020-01-01 |
… | … | … | … |
5 | Teatro | 987654321 | 2018-03-05 |
Ahora actualice la vista cambiando el nombre del departamento (deptName).
UPDATE v3_ch_dept_name SET deptName = 'Security' WHERE deptId = 5;
Se puede insertar una fila en la vista de la siguiente manera:
INSERT INTO v3_ch_dept_name VALUES (7,'Logistics',666884444,'1982-07-07');
También podemos ELIMINAR una fila de la vista de la siguiente manera:
DELETE FROM v3_ch_dept_name WHERE deptId = 7;
En MySQL, puede encontrar fácilmente las vistas en una base de datos que son actualizables o no usando el siguiente comando SELECT.
SELECT table_name FROM information_schema.views WHERE is_updatable like 'YES' AND table_schema like 'my_company';
ELIMINAR vistas de la base de datos
Una vista siempre se puede eliminar con DROP VIEW
DROP VIEW V1;
Tenga en cuenta que cuando ejecutamos el comando soltar vista, elimina la definición de vista. Los datos subyacentes almacenados en las tablas base de las que se deriva esta vista permanecen sin cambios. Una vez soltada, una vista se puede volver a crear con el mismo nombre.
La declaración ALTER VIEW
Las vistas son generalmente inalterables según el estándar SQL:2006, lo que significa que la instrucción ALTER VIEW no funciona con las vistas. Sin embargo, existen RDBMS como MySQL o SQL Server que admiten este tipo de declaraciones. El Oráculo cree en eliminar la vista primero y luego recrearla en lugar de alterarla. Por lo tanto, las funcionalidades admitidas en las vistas por RDBMS varían de un producto a otro.
Conclusión
Las vistas SQL también son una herramienta útil para acceder a múltiples tipos de datos. Las consultas complejas se pueden almacenar dentro de la definición de vista. Esto aprovecha la reutilización porque podemos invocar la vista en lugar de recrear las consultas cada vez que las necesitamos. Es una forma conveniente de presentar información al usuario ocultando mucha información que no queremos exponer a todos. Esto también es importante desde la perspectiva de la seguridad. Las estructuras complejas se pueden sintetizar y presentar en un formato sencillo para el usuario final.
Referencias:
Elmasri, Ramez y Shamkant B. Navathe. Fundamentos de los sistemas de bases de datos . Educación de Pearson.