VISTAS / VIEWS

Las vistas en Supabase son consultas SQL predefinidas que actúan como tablas virtuales, permitiendo simplificar consultas complejas, combinar múltiples tablas y aplicar filtros sin alterar la estructura de datos subyacente. Se crean mediante el Editor SQL en el panel de control usando la sintaxis CREATE VIEW y pueden exponerse automáticamente a través de las APIs REST y GraphQL generadas por Supabase.

Las vistas no heredan las reglas de seguridad a nivel de fila (RLS) de las tablas originales.
Para garantizar que la seguridad RLS se aplique a la vista, debes especificar la opción security_invoker = true durante su creación o alteración, asegurando que los usuarios solo accedan a los datos autorizados según las políticas definidas.

Para crear vistas en Supabase, se utiliza la sentencia CREATE VIEW en el editor SQL del panel de control, definiendo la consulta que deseas guardar como una tabla virtual. La sentencia CREATE VIEW se escribe seguida del nombre deseado y la consulta SELECT. Ejemplo:

CREATE VIEW vista_ejemplo AS
SELECT nombre, edad
FROM usuarios;

Para aplicar la seguridad RLS a una vista, debes usar la opción security_invoker = true:

CREATE VIEW vista_ejemplo WITH (security_invoker = true) AS
SELECT nombre, edad
FROM usuarios;

Vistas Materializadas

Las vistas materializadas permiten mejorar el rendimiento en consultas complejas o con grandes volúmenes de datos, ya que almacenan físicamente los resultados.

Las vistas materializadas requieren actualización manual o programada para mantener los datos sincronizados con las tablas base:

CREATE MATERIALIZED VIEW vista_ejemplo AS
SELECT nombre, edad
FROM usuarios;

Para actualizar una vista materializada, se utiliza la sentencia REFRESH MATERIALIZED VIEW:

Ejercicios

  1. Calcula el número total de empleados que hay en la tabla empleado.
    Guarda la consulta como una VISTA que llamarás numempleados
    CREATE VIEW numempleados AS
    SELECT COUNT(*) AS totalempleados
    FROM empleado;
  2. Utilizando las tablas empleado y la vista creada en el punto 1, realizar una consulta que muestre el porcentaje de empleados por estado civil
  3. Utilizando las tablas empleado y departamento y la vista creada en el punto 1, realizar una consulta que muestre el porcentaje de empleados por departamento.
  4. Utilizando las tablas empleado y la vista creada en el punto 1, realizar una consulta que muestre el porcentaje de empleados con y sin hijos. (Función CASE)

    SELECT d.descendencia, count(d.*) AS numeroempleados, t.totalempleados, (count(d.*)::float/totalempleados::float*100) AS porcentaje_hijos
    FROM descendientes AS d, numempleados AS t
    GROUP BY d.descendencia, t.totalempleados;

    En Postgres para dividir dos enteros y obtener un decimal tenemos que convertir los enteros a números decimales (float). Para ello se coloca a continuación del nombre del campo ::float

  5. Calcula el promedio de sueldo por cargo.
    Guarda la consulta como una VISTA que llamarás sueldo_promedio_cargo.
    Incluye en la misma, tanto el código como el nombre del cargo
  6. Utilizando la tabla empleado y la vista creada en el punto anterior, realizar una consulta que muestre el nombre y apellido de cada empleado y si su sueldo está por encima o por debajo del promedio.
  7. Calcula el promedio de sueldo por departamento.
    Guarda la consulta como una VISTA que llamarás sueldo_promedio_dpto.
    Incluye en la misma, tanto el código como el nombre del departamento