English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
En este tutorial, aprenderás a crear, actualizar y eliminar vistas utilizando SQL.
Una vista es una tabla virtual, cuyas definiciones se almacenan en la base de datos. Sin embargo, a diferencia de las tablas, las vistas no contienen datos. En su lugar, proporcionan un método para almacenar consultas complejas comunes en la base de datos. Pero puedes usarSentencia SELECT de SQLPara acceder a los datos de la vista, al igual que con una tabla o tabla base común.
Las vistas también pueden actuar como mecanismo de seguridad, permitiendo que los usuarios accedan a los datos a través de la vista en lugar de otorgar acceso completo a la tabla base.
Se crea una vista utilizando la sentencia CREATE VIEW.
CREATE VIEW view_name AS select_statement;
Para entender esto claramente, veamos lo siguienteemployeesYdepartments表。
+--------+--------------+--------+---------+ | emp_id | emp_name | salary | dept_id | +--------+--------------+--------+---------+ | 1 | Ethan Hunt | 5000 | 4 | | 2 | Tony Montana | 6500 | 1 | | 3 | Sarah Connor | 8000 | 5 | | 4 | Rick Deckard | 7200 | 3 | | 5 | Martin Blank | 5600 | NULL | +--------+--------------+--------+---------+ | +---------+------------------+ | dept_id | dept_name | +---------+------------------+ | 1 | Administration | | 2 | Customer Service | | 3 | Finance | | 4 | Human Resources | | 5 | Sales | +---------+------------------+ | |
Tabla: employees | Tabla: departments |
Supongamos que desea recuperar el ID y el nombre del empleado, así como el nombre de su departamento, debe ejecutarUnión izquierdaOperación, como se muestra a continuación:
SELECT t1.emp_id, t1.emp_name, t2.dept_name FROM employees AS t1 LEFT JOIN departments AS t2 ON t1.dept_id = t2.dept_id;
Una vez ejecutada la consulta superior, se obtendrá el siguiente resultado:
+--------+--------------+-----------------+ | emp_id | emp_name | dept_name | +--------+--------------+-----------------+ | 1 | Ethan Hunt | Human Resources | | 2 | Tony Montana | Administration | | 3 | Sarah Connor | Sales | | 4 | Rick Deckard | Finance | | 5 | Martin Blank | NULL | +--------+--------------+-----------------+
Pero, cada vez que se accede a este registro, se debe escribir nuevamente toda la consulta. Si realiza este tipo de operación con frecuencia, se volverá muy incómodo y molesto.
En este caso, puede crear una vista para que los resultados de la consulta sean más fáciles de acceder, como se muestra a continuación:
CREATE VIEW emp_dept_view AS SELECT t1.emp_id, t1.emp_name, t2.dept_name FROM employees AS t1 LEFT JOIN departments AS t2 ON t1.dept_id = t2.dept_id;
Ahora, puede usar la vista emp_dept_view para acceder a los mismos registros, como se muestra a continuación:
SELECT * FROM emp_dept_view;
Como puede ver, puede ahorrar mucho tiempo y energía en la vista.
Consejo:La vista siempre muestra los datos más recientes! Cada vez que se consulta la vista, el motor de base de datos ejecuta la consulta SQL asociada con la vista y recrea los datos.
Nota:En MySQL, también puede especificar en la definición de la vistaORDER BYcláusula. Sin embargo, en SQL Server, la definición de la vista no puede contener la cláusula ORDER BY, a menos queSELECTtambién se encuentra en la lista de selecciones de la sentencia.TOPcláusula.
En MySQL, si se desea actualizar o reemplazar una vista existente, se puede eliminar la vista y crear una nueva, o solo utilizar la cláusula OR REPLACE en la sentencia CREATE VIEW, como se muestra a continuación:
CREATE OR REPLACE VIEW view_name AS select_statement;
Nota:Cuando se utiliza la cláusula OR REPLACE en la sentencia CREATE VIEW, si la vista no existe, se creará una nueva vista; de lo contrario, se reemplazará la vista existente.
Las siguientes sentencias SQL reemplazarán o modificarán la vista existenteemp_dept_viewLa definición de la vista, que es agregar una nueva columna salary.
-- La sintaxis del motor de bases de datos MySQL CREATE OR REPLACE VIEW emp_dept_view AS SELECT t1.emp_id, t1.emp_name, t1.salary, t2.dept_name FROM employees AS t1 LEFT JOIN departments AS t2 ON t1.dept_id = t2.dept_id;
Después de actualizar la vista, si ejecuta la siguiente sentencia:
SELECT * FROM emp_dept_view ORDER BY emp_id;
Verá otra columna en la salida de resultadossalaryComo se muestra a continuación:
+--------+--------------+--------+-----------------+ | emp_id | emp_name | salary | dept_name | +--------+--------------+--------+-----------------+ | 1 | Ethan Hunt | 5000 | Human Resources | | 2 | Tony Montana | 6500 | Administration | | 3 | Sarah Connor | 8000 | Sales | | 4 | Rick Deckard | 7200 | Finance | | 5 | Martin Blank | 5600 | NULL | +--------+--------------+--------+-----------------+
Nota: SQL Server no admite la cláusula OR REPLACE, por lo que, para reemplazar la vista, puede eliminarla directamente y crear una nueva vista desde stretch.
En teoría, además deSELECTAdemás de las sentencias INSERT, también puede ejecutarINSERT,UPDATEYDELETESin embargo, no todas las vistas son actualizables, es decir, capaces de modificar los datos de la tabla fuente base. Hay algunas limitaciones de actualización.
Generalmente, si la vista contiene cualquier de las siguientes, no se puede actualizar:
DISTINCT, GROUP BY o la cláusula HAVING.
Funciones de agregación, como AVG(), COUNT(), SUM(), MIN(), MAX() y otros.
Operadores UNION, UNION ALL, CROSS JOIN, EXCEPT o INTERSECT.
La subconsulta en la cláusula WHERE hace referencia a la tabla en la cláusula FROM.
Si una vista cumple con estas condiciones, se puede utilizar para modificar la tabla de origen.
Las siguientes instrucciones actualizarán el salario de los empleados con1salario de los empleados (salary).
UPDATE emp_dept_view SET salary = '6000' WHERE emp_id = 1;
Nota:Para lograr la insertabilidad, la vista debe contener todas las columnas sin valor predeterminado de la tabla base. Del mismo modo, para lograr la actualización, cada columna actualizable de la vista debe corresponder a la columna actualizable de la tabla de origen.
Del mismo modo, si ya no se necesita la vista, se puede eliminar de la base de datos utilizando la instrucción DROP VIEW, como se muestra en la siguiente sintaxis:
DROP VIEW view_name;
Las siguientes instrucciones eliminarán la vista desde la base de datosemp_dept_view。
DROP VIEW emp_dept_view;