Bases de datos: Vistas
Tags: beginners, database, sql
Published: 2021-05-24 00:46:42

> Photo by [luis gomes](https://www.pexels.com/@luis-gomes-166706) from [Pexels](https://www.pexels.com)



En algun momento de nuestras vidas como desarrolladores, nos hemos topado con SQL.

Hemos hecho consultas agradables:

```sql
SELECT * FROM users
WHERE age > 18;
```

Otras mas complejas

```sql
SELECT * FROM users
INNER JOIN posts
ON (posts.user_id = users.id)
WHERE users.age > 18;
```

Y mas complejas aun

```sql
SELECT * FROM employees
INNER JOIN departments
ON (departments.id = employees.dep_id)
WHERE salary > (
    SELECT AVG(salary) FROM employees
);

```

Y en algun momento te habras preguntado: ¿Hay una forma mas sencilla que estar copiando y ejecutando la misma sentencia SQL una y otra vez?

Bueno, esto ya esta respondido en el titulo 😁

## Introduccion a Vistas

Las vistas son tablas virtuales creadas a partir de una consulta almacenada.
Este mecanismo de SQL nos permite definir, una unica vez, una consulta (query) y usarla tantas veces como deseemos.


### Como crear una vista

Esto depende del motor de bases de datos usado.
Yo uso PostgreSQL, pero vos podes usar el que quieras (solo vas a tener que buscar la sintaxis)

```sql
CREATE VIEW <nombre_de_la_vista> AS
    <SENTENCIA_sql>
```

### Como usar una vista

Dado que se crea una tabla virtual, podemos consultarla como tal a traves del select.

```sql
SELECT * FROM <nombre_de_la_vista>
```


### Veamos un ejemplo
Mi tabla `users` tiene los siguiente campos:

* id
* username
* email
* password
* age

Necesito obtener el `username` y el `email` de aquellos usuarios cuya edad sea mayor a 18.

Antes, hubieramos realizado una consulta SQL normal de toda la vida.

```sql
SELECT username, email FROM users
WHERE age > 18;
```

Pero ahora que sabemos vistas, las cosas se ponen mas interesantes

```sql 
CREATE VIEW users_legal_age AS 
    SELECT username, email FROM users
    WHERE age > 18;

SELECT * FROM users_legal_age
```

Lo interesante de las vistas es que, dado que son tablas, podemos seguir lanzando distintas consultas sin necesidad de modificar la query original.

Si yo quisiera en este momento obtener, ademas de los usuarios mayores de edad, aquellos cuyo username contiene la cadena 'admin', solo tendria que hacer esto:

```sql
SELECT * FROM users_legal_age
WHERE username LIKE '%admin%'
```

Y nuestra query original se mantiene intacta.

### Recomendacion para operaciones con mas tablas

Si tenemos la siguiente vista

```sql
CREATE VIEW view_posts_users AS
    SELECT * FROM users
    INNER JOIN posts
    ON (posts.user_id = users.id)
    WHERE users.age > 18;
```

Debemos de tener cuidado con los campos que tienen el mismo nombre.

Si `users` y `posts` tienen campos cuyos nombres son iguales, debemos de asignarle un alias a esos campos para evitar conflictos.

## ¿Cuando debo usar vistas? 
Lo recomendado es que lo uses cuando tenes una query compleja y que requiere ser usada mas de una vez.


Aca tiene sentido crear una:

```sql
CREATE VIEW view_admin_users_legal_age AS
    SELECT first_name, last_name
    FROM users
    WHERE age > 18 AND username LIKE '%admin%';
```

Aca no:

```sql
CREATE VIEW view_list_users AS
    SELECT * FROM users;
```

----

Esto solo fue una introduccion, lo demas, lo dejo a tu imaginacion para que sigas practicando y probando 💪