# MySQL 5.7 - 09 :: Vistas
###### tags: `M2` `UF3` `Ejercicios` `MySQL` `Teoría`
:::info
:book: **Manual**: [23.5 Using Views](https://dev.mysql.com/doc/refman/5.7/en/views.html)
:::
## Sintaxis
```sql
CREATE [o REPLACE] VIEW [<nombre_DB>].<nombre_vista> AS <CONSULTA> [WITH [CASCADED | LOCAL] CHECK OPTION];
```
`DROP`, `ALTER`...
## ¿Qué es una vista?
Una vista es una ++consulta++ que se **almacena** en el servidor.
## ¿Qué sentido tiene guardar una consulta en el servidor?
Simplificar una consulta SQL para la gente que no tiene ni idea.
También se puede gestionar permisos de forma más sencilla.
### Ejemplo práctico
Queremos que nuestro intrépido oficinista tenga acceso a esta consulta
```sql
SELECT name, countrycode FROM city WHERE countrycode IN (SELECT code FROM country WHERE continent='Europe');
```
Para facilitarle la tarea (ya que no tiene ni idea de MySQL) crearemos una vista sobre esa consulta
```sql
CREATE VIEW ciudades_europeas AS SELECT name, countrycode FROM city WHERE countrycode IN (SELECT code FROM country WHERE continent='Europe');
```
Cuando el oficinista haga un `SHOW TABLES;` verá como una tabla la vista `ciudades_europeas`, pero **no es una tabla**.
El oficinista podrá realizar consultas sobre esa vista como si fuera una tabla (siempre y cuando tenga permisos)
```sql
SELECT * FROM ciudades_europeas;
```
También podrá insertar datos (se insertarán en la base de datos original)
```sql
INSERT INTO ciudades_europeas VALUES ('Nombre', 'Código');
```
## CHECK OPTION
Esta opción sirve para que las inserciones desde la vista dependan del `WHERE` de la consulta original.
En nuestro ejemplo tenemos como `WHERE` lo siguiente
```sql
WHERE countrycode IN (SELECT code FROM country WHERE continent='Europe');
```
Si queremos hacer que el oficinista únicamente pueda insertar ciudades en el continente de Europa, debemos crear la vista añadiendo un `CHECK OPTION` al final
```sql
CREATE VIEW ciudades_europeas AS SELECT name, countrycode FROM city WHERE countrycode IN (SELECT code FROM country WHERE continent='Europe') WITH CHECK OPTION;
```
---
---
# EJERCICIOS
- Crea una vista con el nombre de 'EMPDEP' en la bbdd ConsultasBásicas que muestre todos los datos de los empleados junto con el nombre del departamento al que pertencen. Realiza alguna consulta para ver como funciona.
```sql
```
- Crea una vista en la que sólo aparezcan los departamentos con número par en su código de departamento.
```sql
```
- Modifica la comisión de un empleado de la vista EMPDEP. ¿Qué ha pasado en la tabla original?
```sql
```
- Ahora trata de cambiar el nombre del departamento de un empleado. ¿Qué pasa?
```sql
```
- Elimina un empleado de la vista. ¿Se puede?¿Por qué?
```sql
```
- Prueba con insertar un empleado.
```sql
```
- Inserta un departamento de código impar en la vista DEP_CODIGO_PAR. ¿Qué pasa?¿Cómo lo podemos solucionar?
```sql
```
- Modifica un código de departamento de número par a impar.
```sql
```