Está en la página 1de 12

Vistas

Una vista es una consulta, que refleja el contenido de una o más tablas, desde la que se
puede acceder a los datos como si fuera una tabla.
También es una consulta especial que se emplea para registrar selecciones complejas o
que se usan frecuentemente.
Una vez creada la vista se puede realizar una selección de los datos como si fuera esta una
tabla e incluso se puede utilizar para definir procedimientos almacenados.

Dos son las principales razones por las que podemos crear vistas.

 Seguridad, nos pueden interesar que los usuarios tengan acceso a una parte de la
información que hay en una tabla, pero no a toda la tabla.
 Comodidad, como hemos dicho el modelo relacional no es el más cómodo para
visualizar los datos, lo que nos puede llevar a tener que escribir complejas
sentencias SQL, tener una vista nos simplifica esta tarea.

Las vistas no tienes una copia física de los datos, son consultas a los datos que hay en las
tablas, por lo que si actualizamos los datos de una vista, estamos actualizando realmente
la tabla, y si actualizamos la tabla estos cambios serán visibles desde la vista.

Nota: No siempre podremos actualizar los datos de una vista, dependerá de la


complejidad de la misma (dependerá de si el conjunto de resultados tiene acceso a la
clave principal de la tabla o no), y del gestor de la base de datos. No todos los gestores de
bases de datos permiten actualizar vistas, ORACLE, por ejemplo, no lo permite, mientas
que SQL Server sí.

Creación de vistas.
Para crear una vista debemos utilizar la sentencia CREATE VIEW, debiendo proporcionar
un nombre a la vista y una sentencia SQL SELECT valida.

CREATE VIEW <nombre_vista>


AS
(<sentencia_select>);

Ejemplo: Crear una vista sobre nuestra tabla alquileres, en la que se nos muestra el
nombre y apellidos del cliente en lugar de su código.

CREATE VIEW vAlquileres


AS
(
SELECT nombre, apellidos, matricula
FROM tAlquileres, tClientes
WHERE (tAlquileres.codigo_cliente = tClientes.codigo)
)

Si quieres modificar la definición de nuestra vista podemos utilizar la sentencia ALTER


VIEW, de forma muy parecida a como lo hacíamos con las tablas. En este caso queremos
añadir los campos fx_alquiler y fx_devolucion a la vista.

ALTER VIEW vAlquileres

AS
(
SELECT nombre, apellidos, matricula, fx_alquiler, fx_devolucion
FROM tAlquileres, tClientes
WHERE ( tAlquileres.codigo_cliente = tClientes.codigo )
)

Por ultimo podemos eliminar la vista a través de la sentencia DROP VIEW. Para eliminar la
vista que hemos creado anteriormente se utilizaría:

DROP VIEW vAlquileres:


Una vista se consulta como si fuera una tabla.

EJEMPLOS DE VISTAS

USE NORTHWIND GO
--Creación De vista Proveedores y sus pedidos

CREATE VIEW VIEW_SUPPLIER_PRODUCS


AS
(
SELECT S.SUPPLIERD,S.COMPANYNAME,S.CONTACTNAME
,P.PRODUCTID, P.PRODUCTNAME, P.UNITPRICE FROM SUPPLIERS AS INNER JOIN
PRODUCTS AS P ON S.SUPPLIERID=P.SUPPLIERRID GO

--CREACION DE UNA VISTA CON INSTRUCCION GROUP

CREATE VIEW VIEW_SUBTOTALES(CODIGO_ORDEN, SUB_TOTAL)


AS
SELECT OD.ORDERID,SUM(CONVERT(MONEY,(OD.UNITPRICE* QUANTITY*(1-
DISCOUNT)/100))*100) FROM[ORDER DETAILS] OD GROUP BY OD.ORDERID
GO

--LLAMAR A LA CONSULTA ANTERIOR


SELECT* FROM VIEW_SUBTOTALES

--VER VISTAS
SELECT*FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='VIEW'

--BORRAR UNA VISTA


DROP VIEW VIEW_SUBTOTALES

--ALTERAR UNA VISTA


ALTER VIEW VIEW_SUPPLIER_PRODUCS AS

EJEMPLOS VARIOS DE VISTAS Y EJECUCION DE ESTAS:

1. Crear una vista que liste 3 campos de clientes


Créate view v_listaclientes
as
select IdCliente,NombreCompañia,Pais from Clientes
go
Nota: para ejecutar la vista se hace lo siguiente
select * from v_listaclientes
go

2. Crear una vista que muestre el subtotal de los pedidos


Créate view v_subtotal
as
select IdPedido, SUM(d.PrecioUnidad * Cantidad * (1-d.Descuento)) as Subtotal
from DetallesDepedidos d
inner join Productos p
on d.IdProducto=p.IdProducto
group by IdPedido
go
select*from v_subtotal
go
3. Crear una vista que liste NombreProducto, NombreCategoria, PrecioUnidad,
Suspendido
Créate view v_productos
As
Select NombreProducto,Nombrecategoria,PrecioUnidad,Suspendido from
Producto p inner join Categorias c on p.IdCategoria = c.IdCategoria
go
4. Utilizando la vista anterior, crear una vista que muestre el total de productos x
categoría
créate view total_prodxcateg
as
select NombreCategoria.COUNT(*)as Totalprodxcateg from v_productos
group by NombreCategoria

select * from total_prodxcateg


5. Crear un vista que nos devuelva la cantidad de pedidos que tiene cada empleado
en los años 94,95 y 96
create view v_cant_pedidos
as
select Nombre,(Select COUNT (*)from v_empleado e where e.Nombre=c.Nombre
and YEAR(FechaPedido)=1994) as Año_1994,
(select COUNT(*)from v_empleado e where e.Nombre=c.Nombre and
YEAR(FechaPedido)=1995)as Año_1995,
(select COUNT(*)from v_empleado e where e.Nombre=c.Nombre and
YEAR(FechaPedido)=1996)as Año_1996
from v_empleado c
group by Nombre

select * from v_cant_pedidos


6. Crear una vista que presente el total de pedidos que tiene cada compañía de
envió
create view v_totalpedidos
as
select NombreCompañia,COUNT(*)as Total _Pedidos from v_compañia
group by NombreCompañia
go

select * from v_totalpedido


Funciones
Una función es una rutina almacenada que recibe unos parámetros escalares de entrada,
luego los procesa según el cuerpo definido de la función y por ultimo retorna en un
resultado de un tipo específico que permitirá cumplir un objetivo.

Las funciones definidas por el usuario en SQL Server permiten retornar tablas en los
resultados. Esta característica brinda al programador facilitar a la hora de administrar sus
bases de datos.

Funciones Escalares en SQLServer

Las funciones escalares son aquellas que reciben parámetros de entrada para ser
procesados y al final retornar en un tipo de dato sencillo. Cuando hablo de sencillo me
refiero a tipos de datos elementales como INT, FLOAT, VARCHAR, etc.

SQL Server no permite que las funciones escalares retornen en los tipos text, ntext, image,
cursor y timestamp. Al igual que MySQL, usaremos la palabra reservada RETURNS para
indicar el tipo de datos en el cual retornara la función. El cuerpo de la función escalar está
contenido en un bloque de instrucciones como en los procedimientos.

Veamos la sintaxis de creación:

CREATE FUNCTION nombre_funcion ([parametro1, parametro2,…])


RETURNS tipo_de_datos
[WITH ENCRYPTION I WITH SCHEMABINDING]
[AS]
BEGIN<bloque_de_instrucciones>
RETURN valor_retornado
END

Ejemplo de una función escalar de una aerolínea

A continuación veremos un enunciado que debe ser solucionado con la creación de una
función escalar. El problema esta basado en una base de datos de una aerolinea. Observa:

Averigue cuantas veces ha viajado un pasajero en un lapso de tiempo. Use la identificación


de pasajero para consultar dicha información. En cuanto al lapso de tiempo, especifique
una fecha de inicio y una fecha final.

CREATE FUNCTION cuanto_ha_viajado(@idpasajero INT,@fecha_final DATE, @fecha_final


DATE)
RETURNS INT
AS
BEGIN
DECLARE @cantidad_ocaciones INT;

SELECT @cantidad_ocasiones=COUNT(a.idpasajero)
FROM Aerolinea.Boleto AS a
WHERE a.idpasajero=@idpasajero AND (fecha_compra BETWEEN @fecha_inicio AND
@fecha_final);

IF (@cantidad_ocasiones IS NULL)
SET @cantidad_ocasiones=0;
RETURN @cantidad_ocasiones;
END

Funciones con valores de tabla en línea

Este tipo de funciones tiene la misma sintaxis que una función escalar, la única diferencia
está en que retorna un tipo de dato TABLE, es decir, una tabla compuesta de registros.
Veamos la variación de la sintaxis:

CREATE FUNCTION nombre_funcion ([parametro1, parametro2,…])


RETURNS TABLE
[WITH ENCRYPTION I WITH SCHEMABINDING])
[AS]
RETURN (consulta_SELECT)

Las funciones que retornan tablas son muy útiles cuando tenemos consultas que tengan
JOINS debido a la reducción de complejidad

Ejemplo de funciones de tabla sobre tienda digital

Supongo que tenemos una base de datos comercial de una tienda digital que vende
Hardware. Esta basase de datos tiene la famosa relación entre clientes, pedidos y
artículos. El requerimiento dice así:
Consulte todas las compras realizadas de un producto específico. Use el código del
producto para generar los resultados y muestre el nombre del cliente que compro ese
producto, la fecha en que se compró, el precio que tiene en ese momento y la cantidad
comprada.
CREATE FUNCTION ventas_producto(@idproducto INT)
RETURNS TABLE
AS
RETURN(
SELECT C.NOMBRE, F.FECHA, DF.CANTIDAD, DF.PRECIO, P.IDPRODUCTO
FROM
CLIENTE AS C JOIN FACTURA AS F ON C.IDCLIENTE=F.IDCLIENTE
JOIN DETALLEFACTURA AS DF ON DF.IDFACTURA=F.IDFACTURA
JOIN PRODUCTO AS P ON P.IDPRODUCTO=DF.IDPRODUCTO
WHERE P.IDPRODUCTO=@idproducto)

La anterior función retorna en una tabla que representa todas las compras de un producto
realizadas hasta el momento por los clientes. Ahora podemos realizar consultas sobre esta
tabla, por ejemplo, si quisiéramos sumar el total de todas las ventas del artículo con
código 1003, podríamos hacer la siguiente consulta:

SELECT SUM(CANTIDAD*PRECIO) FROM ventas_producto(1003)

Con esa función la base de datos de nuestra tienda virtual de hardware ganara velocidad
de cálculo, además de ahorrar tiempo para los desarrolladores y administradores

FUNCIONES CON VALORES DE TABLA Y MULTIPLES INSTRUCCIONES


Este tipo de funciones son similares a las funciones de tabla en línea, solo que incluyen un
bloque de sentencias para manipular la información antes de retornar la tabla. Su sintaxis
de creación es la siguiente:
CREATE FUNCTION nombre_funcion([parametro1, parametro2,…])
RETURNS @variable_tabla TABLE(nombre_columna tipo,…)
[WITH ENCRYPTION I WITH SCHEMABINDING]
[AS]
BEGIN
<bloque de instruciones>
RETURN
END

La anterior definición parametriza la variable de tipo TABLE en que retornara la función. Es


decir, definiéremos cómo será su estructura antes de retornarla. Así que debemos
especificar cada parámetro y su tipo.
Ejemplo de funciones con múltiples instrucciones

ENUNCIADO

Muestre todos los registros de la tabla EMPLEADO que tenga un salario mayor o igual a un
valor establecido como parámetro. Además de ello conviene en un solo campo el nombre
y apellido del empleado y agregue un nuevo atributo que muestre la cantidad de días que
lleva el empleado desde su fecha de ingreso.

CREATE FUNCTION reporte1_empleados(@salarioemp INT)


RETURNS @tabla TABLE(
IDEMPLEADO INT PRIMARY KEY NOT NULL IDENTITY,
NOMBRE VARCHAR(200) NOT NULL,
SALARIO INT NOT NULL,
DIASLABORANDO INT NOT NULL)
AS
BEGIN
INSERT @tabla
SELECT E.NONBRE+''+E.APELLIDO, E.SALARIO,DATEDIFF(DAY,
E.FECHA_INGRESO,GETDATE())
FROM EMPLEADO AS E
WHERE E.SALARIO >=@salarioemp;
RETURN;
END

Con la anterior función retornamos en una ventana tabla personalizada como lo pedía el
enunciado. Nota que antes de escribir el bloque de instrucciones hemos definido una
variable tipo TABLE con una estructura de 4 columnas. Esta definición se parece mucho a
la sintaxis CREATE TABLE para crear tablas. Y al final insertamos los datos con el formato
que se pidió.

Si queremos ver que registros tiene la tabla retornada por la función, solo realizamos una
consulta de la siguiente forma.

SELECT*FROM reporte1_empleados(1000);

Modificar una función definida por el usuario en SQL Server:

Para modificar una función debes usar ALTER FUNCTION. Este comando te permite
cambiar absolutamente toda la sintaxis de la función. Veamos como modificamos una
función escalar que antes tomaba dos números para una suma y ahora deseamos que
tome tres parámetros. Además queremos que proteja el esquema de la base de datos.

ALTER FUNCTION suma (@a int, @b int, @c int)


RETURNS INT
WITH SCHEMABINDING
BEGIN
RETURN @a+@b+@c;
END;

Borrar Una Función Definida Por El Usuario En Sql Server

Elimina una función definida por el usuario con la famosa sentencia DROP. Mira como
borramos una función que pronostica la cantidad de huéspedes futuros de un hotel.

DROP FUNCTION pronostico_anual _huespedes;

Procedimientos

Los procedimientos almacenados son un conjunto de instrucciones SQL mas una serie de
estructuras de control que nos permite dotar de cierta lógica la procedimiento. Estos
procedimientos están guardados en el servidor y pueden ser accedidos a través de llamas,
como veremos más adelante.

Para crear un procedimento, MySQL nos ofrece la dirección CREATE PROCEDURE y para
funciones CREATE FUNCTION al crearlo este es ligado o relacionado con la base de datos
que se está usando, tal como cuando creamos una tabla, para llamar a un procedimiento
lo hacemos mediante la instrucción CALL. Desde un procedimiento podemos invocar a su
vez a otros procedimientos o funciones.

Algunas situaciones en que los procedimientos almacenados pueden ser particularmente


útiles:

 Cuando múltiples aplicaciones cliente en distintos lenguajes o funcionan en


distintas plataformas, pero necesitan realizar la misma operación en la base de
datos.

 Cuando la seguridad es muy importante. Los bancos por ejemplo usan


procedimientos almacenados para todas las operaciones comunes.

Los parámetros almacenados pueden mejorar el rendimiento ya que se necesita enviar


memos información entre el servidor y el cliente. El intercambio que hay es que aumenta
la carga del servidor de la base de datos ya que la mayoría del trabajo se realiza en la
parte del servidor y no en el cliente.

Este procedimiento tiene como objetivo listar la provisión de gratificación para cada
empleado según el periodo ingresado.

CRITERIOS A EVALUAR:

Calcular la gratificación en base al periodo ingresado y la fecha de ingreso del empleado.

CARACTERISTICAS:

NOMBRE: SP_ProvisionGratificacion

PARAMETRO: tiene dos parámetros de entrada y 5 parametros de salida

Entrada:

 AÑO de tipo varchar con tamaño 4


 MES de tipo varchar con tamaño

Salida:

 EMPLEADO es el nombre del empleado


 SUELDO es la importante de remuneración mensual del empleado
 GRATIFICACION es el importe equivalente a los días trabajados por
el empleado
 MES DE INGRESO es el número de mes en el que ingreso el
empleado
 AÑO INGRESO es el año en que ingreso el empleado

FUNCIONES Y CONDICIONES UTILIZADAS

 CONCAT
 FORMAT
 ROUND
 IF

Procedimiento

CREATE PROCEDURE SP_ProvisionGratificacion(IN anio VARCHAR (4), in mes VARCHAR(2))

SELECT
CONCAT(e.NomEmp,' ',e.ApeEmp)EMPLEADO, FORMAT(e.sueldo,2) SUELDO,

FORMAT(ROUND(IF(YEAR(e.FechaIngEmp)=anio,

IF(mes <6,if(MONTH(e.FechaIngEmp)<6,(e.sueldo/6)*(6-
MONTH(e.FechaIngEmo)),e.sueldo).

IF(MONTH(e.FechaIngEmp)>6,(e.sueldo/6)*(12-

MONTH(e.FechaIngEmp)),e.sueldo)),E.sueldo)2),2)GRATIFICACION,

MONTH(e.FechaIngEmp) 'MES INGRESO', YEAR(e.FechaIngEmp)'AÑO INGRESO'

FROM empleado e;

TRIGGERS

Los Triggers o Disparadores son objetos que se asocian con tablas y se almacenan en la
base de datos. Su nombre se deriva por el comportamiento que presentan en su
funcionamiento, ya que se ejecutan cuando sucede algún evento sobre las tablas a las que
se encuentra asociado. Los eventos que hacen que se ejecute un trigger son las
operaciones de inserción (INSERT), borrado (DELETE) o actualización (UPDATE), ya que
modifican los datos de una tabla.
La utilidad principal de un trigger es mejorar la administración de la base de datos, ya que
no requieren que un usuario los ejecute. Por lo tanto, son empleados para implementar
las REGLAS DE NEGOCIO (tipo especial de integridad) de una base de datos. Una Regla de
Negocio es cualquier restricción, requerimiento, necesidad o actividad especial que debe
ser verificada al momento de intentar agregar, borrar o actualizar la información de una
base de datos. Un trigger puede prevenir errores en los datos, modificar valores de una
vista, sincronizar tablas, entre otros. EJEMPLO:
Crear un Trigger para insertar un pedido de algún producto cuando la cantidad de éste, en
nuestro almacén, sea inferior a un valor dado.
CREATE TRIGGER TR_ARTICULO ON ARTICULOS AFTER UPDATE AS BEGIN INSERT INTO
HCO_ARTICULO (IDARTICULO, STOCK, FECHA) SELECT ID_ARTICULO, STOCK, GETDATE()
FROM INSERTED END
INSERT INTO ARTICULOS VALUES (1, 'MEMORIA', 12, '12/03/2014')
SELECT * FROM ARTICULOS
UPDATE ARTICULOS SET STOCK = STOCK - 20 WHERE ID_ARTICULO = 1
SELECT * FROM HCO_ARTICULO

También podría gustarte