Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
D E B A S E S D E D AT O S
E S C U E L A T E C N O L Ó G I C A I N S T I T U TO T É C N I C O C E N T R A L
B A S E D E D AT O S I I
RICARDO GIRALDO GÓMEZ
CREANDO OTROS OBJETOS DE BASES
DE DATOS
• TEMAS AVANZADOS DE T-SQL
• VISTAS
• FUNCIONES DEFINIDAS POR EL USUARIO
• LOS PROCEDIMIENTOS ALMACENADOS
• DISPARADORES DE MANIPULACION DE DATOS
T E M A S AVA N Z A D O S D E T- S Q L
AGREGACIONES, VENTANAS Y
AGRUPAMIENTOS
• Independientemente de los datos que se almacena, en algún punto, será necesario adicionar
agregaciones de alguna manera en los datos.
• Utilizando la sintaxis de T-SQL, puede agregar los datos con una función escalares y agrupo los
datos utilizando la palabra clave GROUP BY para realizar estas operaciones.
EJECUTANDO AGREGACIONES
• La función SUM(). que suma todos los valores de un conjunto de datos dado.
• La función AVG permite calcular la media de todo el conjunto de resultados.
• La función COUNT cuenta el número de registros, incluyendo valores duplicados.
• La función DISTINCT COUNT, cuenta el número de registro sin incluir duplicados.
EJECUTAR UNA SIMPLE AGREGACIÓN
USE AdventureWorks2012;
SELECT
SUM(poh.TotalDue) AS [Total Due],
AVG(poh.TotalDue) AS [Average Total Due],
COUNT(poh.EmployeeID) [Number Of Employees],
COUNT(DISTINCT poh.EmployeeID) [Distinct Number Of Employees]
FROM Purchasing.PurchaseOrderHeader poh
EJECUTANDO AGREGACIONES CON
AGRUPAMIENTOS
• De manera global las agregaciones datos, dentro de un resultado probablemente no es algo
que se ve en el uso regular. Normalmente, los datos se desglosan o agrupan en categorías o
segmentos como el año, territorio, país, o vendedor. Usando la palabra clave GROUP BY, se
puede resumir el resultado seleccionado fijado por una o más columnas o expresiones.
EJECUTANDO AGREGACIONES CON
AGRUPAMIENTOS - SINTAXIS
SELECT
FROM
GROUP BY <column1>, <column2>,…
• Las columnas que no son utilizados por una función de agregación que se muestra en la
instrucción SELECT deben incluirse en la cláusula GROUP BY. Sin embargo, una columna
puede ser incluida en la cláusula GROUP BY, pero no en la instrucción SELECT
EJECUTAR AGREGACIONES CON LA
CLÁUSULA GROUP BY
USE AdventureWorks2012;
SELECT sm.Name AS ShippingMethod, SUM(poh.TotalDue) AS [Total Due],
AVG(poh.TotalDue) AS [Average Total Due], COUNT(poh.EmployeeID) AS [Number Of Employees],
COUNT(DISTINCT poh.EmployeeID) AS [Distinct Number Of Employees]
GROUP BY sm.Name
USO DE LA CLÁUSULA HAVING
• La cláusula HAVING se comporta de manera similar a una instrucción WHERE. Sin embargo, se
puede aprovechar la agregación. Se puede utilizar sólo con una declaración SELECT, y se utiliza
típicamente con una cláusula GROUP BY
LIMITANDO FILAS AGREGADAS CON
UNA CLÁUSULA HAVING
USE AdventureWorks2012;
SELECT
sm.Name AS ShippingMethod,YEAR(poh.OrderDate) OrderYear,
SUM(poh.TotalDue) AS [Total Due],
AVG(poh.TotalDue) AS [Average Total Due], COUNT(poh.EmployeeID) AS [Number Of
Employees],
COUNT(DISTINCT poh.EmployeeID) AS [Distinct Number Of Employees]
FROM Purchasing.PurchaseOrderHeader poh
INNER JOIN Purchasing.ShipMethod sm
ON poh.ShipMethodID = sm.ShipMethodID
GROUP BY sm.Name,YEAR(poh.OrderDate)
HAVING SUM(poh.TotalDue) > 5000000
LIMITANDO FILAS AGREGADAS CON
UNA CLÁUSULA HAVING
EL USO DE OBJETOS TEMPORALES EN
SQL SERVER
• Al trabajar con T-SQL, puede encontrar a menudo la necesidad de almacenar temporalmente
un conjunto de datos para su uso posterior.
• SQL Server 2012 tiene tres objetos temporales primarios
– Expresiones de tabla comunes
– Las variables de tablas
– Las tablas temporales
EXPRESIONES DE TABLA COMUNES
• Una expresión de tabla común (CTE) es un conjunto de resultados temporales que se define
durante la ejecución de una sentencia SELECT, INSERT, UPDATE, DELETE o CREATE VIEW.
• El CTE está disponible sólo durante la duración de la consulta y no se almacena como otros
objetos de la base de datos.
• Los usos típicos de las CTE son para reemplazar las vistas, los datos de grupo, realizar
recursividad, y crear múltiples referencias a una sola tabla.
EXPRESIONES DE TABLA COMUNES -
SINTAXIS
WITH <expression_name> [(column_name [,...n])]
AS
(CTE_query_definition)
• Las variables de tabla se comportan de manera similar a las variables locales. Se suelen utilizar
para almacenar pequeñas cantidades de datos (al menos de 500 filas) y sólo están disponibles
en el ámbito local, función o procedimiento almacenado en el que se han declarado.
VARIABLES DE TABLAS - SINTAXIS
• Al igual que con cualquier lenguaje de programación, T-SQL proporciona métodos elegantes
para el manejo de errores y excepciones durante la ejecución.
• T-SQL utiliza TRY ... CATCH, similar a Microsoft Visual C #.
• Al escribir T-SQL, se coloca el código en el bloque TRY, y si se produce un error, el control se
envía al bloque CATCH.
• Dentro del bloque CATCH, se debe adjuntar el código T-SQL que se encargará de los errores.
MANEJO DE ERRORES DE T-SQL -
SINTAXIS
BEGIN TRY
{ sql_statement |statement_block}
END TRY
BEGIN CATCH
[{ sql_statement |statement_block}]
END CATCH
• sql_statement es una sola instrucción T-SQL y statement_block es cualquier conjunto o lote de
instrucciones T-SQL.
• Esto se aplica a los bloques tanto en el try y catch.
• Los bloques try y catch se deben construir juntos.
MANEJO DE ERRORES DE T-SQL -
SINTAXIS
• Microsoft SQL Server 2012, introdujo la instrucción THROW, lo que plantea una excepción y
transfiere la ejecución al bloque CATCH.
BEGIN TRY
SELECT 1/0;
END TRY
BEGIN CATCH
THROW 51000, 'You divided my ZERO!!!', 1;
END CATCH
PALABRAS CLAVES EN EL CONTROL DE
FLUJO
• La determinación de cuándo y cómo el código debe reaccionar o trabajar juntos es una parte
fundamental de cualquier lenguaje de programación.
• T-SQL incluye un conjunto de palabras clave que le permiten agrupar una serie de
declaraciones y tomar decisiones en tiempo de ejecución basado en la lógica dentro del código
PALABRAS CLAVES EN EL CONTROL DE
FLUJO
– BEGIN…END
– BREAK
– CONTINUE
– GOTO
– IF…ELSE
– RETURN
– WAITFOR
– WHILE
BEGIN…END
BEGIN
{
sql_Statement | statement_block
}
END
UTILIZANDO EL BLOQUE BEGIN ... END
USE AdventureWorks2012;
BEGIN
DECLARE @StartingHireDate datetime = '12/31/2001'
SELECT e.BusinessEntityID, p.FirstName, p.LastName, e.HireDate
FROM HumanResources.Employee e INNER JOIN Person.Person p
ON e.BusinessEntityID = p.BusinessEntityID
WHERE HireDate <= @StartingHireDate
END
IF…ELSE
• El bloque IF ... ELSE simplemente le dice al lenguaje de programación realizar una instrucción T-
SQL o un conjunto de sentencias si se cumple la condición especificada, o otra instrucción T-
SQL o un conjunto de instrucciones si no se cumple.
• El IF puede existir sin el ELSE, pero el ELSE no puede existir sin el IF.
IF…ELSE - SINTAXIS
IF(DATENAME(M, GETDATE())='December')
BEGIN
SELECT 'Tiempo de Vacaciones!!!!' Results
END
ELSE
BEGIN
SELECT 'No está seguro de lo que está pasando ahora :' Results
END
WHILE
• WHILE es un mecanismo de bucle sobre la base de una expresión booleana. Siempre y cuando
la expresión se evalúa como verdadero, la sentencia T-SQL especificada o bloque de código se
ejecutará.
• Dos palabras clave opcionales, break y continue, pueden incluirse con la palabra clave WHILE
para ayudar en el control de la lógica dentro del bucle.
WHILE - SINTAXIS
WHILE Boolean_expression
{ sql_statement | statement_block | BREAK | CONTINUE }
UTILIZANDO EL BUCLE WHILE CON
BREAK Y CONTINUE
DECLARE @count int = 0
WHILE (@count < 10)
BEGIN
SET @count = @count + 1;
IF(@count < 5)
BEGIN
SELECT @count AS Counter
CONTINUE;
END
ELSE
BREAK;
END
VISTAS
QUÉ SON LAS VISTAS?
• Una vista es un objeto virtual o una tabla cuyo conjunto de resultados se deriva de una
consulta.
• Es muy similar a una tabla real, ya que contiene columnas y filas de datos.
• Una vez que la vista se materializa, o se almacena en el disco, es cuando se indexa.
– Filtrar los datos de las tablas subyacentes
– Filtrar los datos por motivos de seguridad
– Centralizar datos distribuidos a través de varios servidores
– Crear un conjunto de datos reutilizable
QUÉ SON LAS VISTAS?
• Las vistas se utilizan a menudo como una capa de abstracción para los desarrolladores de
bases de datos. A veces también se utilizan para proteger los datos de diversas maneras.
• Como práctica recomendada, se debe evitar el uso de SELECT * en las vistas
• No se debe usar ORDER BY en las vistas, ya que no son válidos; sólo son válidos cuando se utiliza con
TOP. En ese caso, ORDER BY se usa para determinar cuáles registros retorna.
CREAR VISTA CON SSMS Y T-SQL
• Una vista indizada es diferente de otras vistas ya que se materializa y se almacena en el disco
de la misma manera como una tabla.
• Un punto interesante acerca de una vista indizada es que el optimizador de consultas puede
hacer referencia a fin de mejorar el rendimiento, aunque no se hace referencia en la consulta.
• Esta función está disponible sólo en la edición Enterprise de SQL Server.
REQUISITOS PARA LA TABLA
REFERENCIADA
• Antes de crear una vista indizada, necesita asegurarse de que todas las tablas de referencia
reúnen una serie de requisitos.
– En primer lugar, todas las tablas a las que hace referencia deben estar contenidas dentro de la misma
base de datos.
– Si alguno de columnas calculadas en las tablas base no son deterministas, éstas deben ser eliminadas.
Determinista se define como siempre devolver el mismo valor o conjunto de resultados.
REQUISITOS PARA LA TABLA
REFERENCIADA
USE AdventureWorks2012;
GO
SELECT COLUMNPROPERTY( OBJECT_ID('Sales.SalesOrderDetail'),'LineTotal'
,'IsDeterministic')AS 'Column Length';
GO
• Además de ser determinista, también puede ser necesario marcar la columna como PERSISTED.
Esto depende de si el tipo de datos es impreciso. Los tipo de datos float o real se considera
imprecisa y no puede ser una clave de un índice a menos que se marquen como PERSISTED.
• Por último, las opciones ANSI_NULLS y QUOTED_INDENTIFIER deben haberse establecido en
verdadero cuando se creen las tablas de referencia.
REQUISITOS PARA VISTAS
INDIZADAS
• Las siguientes opciones SET deben estar en ON:
– ANSI_NULLS
– ANSI_PADDING
– ANSI_WARNINGS
– ARITHABORT
– CONCAT_NULL_YIELDS_NULL
– QUOTED_IDENTIFIER
• La opción NUMERIC_ROUNDABORT se debe establecer en OFF.
• Antes de crear la vista, debe configurar estas opciones.
• A continuación, debe comprobar que la vista es determinista.
• Al crear la vista, debe utilizar la opción WITH SCHEMABINDING, que se une la vista al esquema de las tablas subyacentes.
• Por último, el primer índice debe ser un índice UNIQUE CLUSTERED
CREAR UNA VISTA INDIZADA
GO GO
CREAR UNA VISTA INDIZADA
--Add a unico indice agrupado
CREATE UNIQUE CLUSTERED INDEX
CIX_vwPurchaseOrders_OrderDateProduct
ID
ON Purchasing.vwPurchaseOrders(OrderDate,
ProductID)
FUNCIONES DEFINIDAS POR
EL USUARIO
FUNCIONES DEFINIDAS POR EL
USUARIO
• Las funciones definidas por el usuario son similares a las funciones en otros lenguajes de
programación.
• Microsoft SQL Server 2012 le permite crear dos tipos de funciones: escalares y con valores de
tabla.
• Estas funciones permiten un tipo modular de la programación, donde el código y la lógica se
pueden incluir dentro de la función.
• Otras aplicaciones, las rutinas y los objetos de base de datos pueden utilizar la función.
• Este enfoque también permite colocar las normas y la gobernanza en torno a cómo se
desarrolla y se despliega el código.
FUNCIONES DEFINIDAS POR EL
USUARIO
• Las funciones son código T-SQL que puede aceptar parámetros, ejecutar la lógica y cálculos
complejos, y devolver datos.
• Las funciones escalares devuelven un solo valor, y las funciones con valores de tabla devuelven
un conjunto de resultados.
• Las funciones pueden ser utilizadas como CHECK CONSTRAINST en tablas, por vista, para
definir una columna en una sentencia SELECT, y de muchas otras maneras.
ENTENDIENDO LAS FUNCIONES
ESCALARES DEFINIDAS POR EL USUARIO
• Una función escalar definida por el usuario es una rutina que devuelve un solo valor.
• Estas funciones se utilizan a menudo para centralizar la lógica de un cálculo complejo que
puede ser utilizado por varios otros recursos de base de datos o de aplicaciones.
FUNCIONES ESCALARES DEFINIDAS
POR EL USUARIO - SINTAXIS
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ][ type_schema_name. ] parameter_data_type
[ = default ] [ READONLY ] }
[ ,...n ]
]
)
RETURNS return_data_type
[ WITH <function_option> [ ,...n ] ]
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END
[;]
PARAMETRIZACIÓN DE FUNCIONES
-- Parametro de entrada
CREATE FUNCTION dbo.Input
@parameter1 int
-- Parametro Opcional
CREATE FUNCTION dbo.Optional
@parameter1 int = NULL
-- Parametro Predeterminado
CREATE FUNCTION dbo.Default
@parameter1 int = 1
CREAR, MODIFICAR Y QUITAR UNA
FUNCIÓN ESCALAR DEFINIDA POR EL
USUARIO
-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Autor: ETITC
-- Fecha de Creación : 9/4/2015
-- Descripcion: Función escalar que sera usada para retornar la edad de los Empleados
-- =============================================
CREAR, MODIFICAR Y QUITAR UNA
FUNCIÓN ESCALAR DEFINIDA POR EL
USUARIO
CREATE FUNCTION dbo.GetEmployeeAge
(
@BirthDate datetime
)
RETURNS int
AS
BEGIN
-- Declare aqui la variable de retorno
DECLARE @Age int
-- Adicionar sentencia T-SQL Para calcular el valor de retorno
SELECT @Age = DATEDIFF(DAY, @BirthDate, GETDATE())
-- Retorna el resultado de la función
RETURN @Age
END
GO
CREAR, MODIFICAR Y QUITAR UNA
FUNCIÓN ESCALAR DEFINIDA POR EL
USUARIO
USE AdventureWorks2012;
SELECT TOP(10)
p.FirstName, p.LastName, e.BirthDate,
dbo.GetEmployeeAge(BirthDate) EmployeeAge
FROM HumanResources.Employee e
INNER JOIN Person.Person p
ON e.BusinessEntityID = p.BusinessEntityID
LLAMAR A LAS FUNCIONES
ESCALARES USANDO LA PALABRA
CLAVE EXECUTE
USE AdventureWorks2012;
GO
DECLARE @Age int;
EXECUTE @Age = dbo.GetEmployeeAge @BirthDate = '5/26/1972'
SELECT @Age;
Entender las funciones con valores
de tabla
USE AdventureWorks2012
EXEC dbo.PurchaseOrderInformation
WITH RESULT SETS
(
(
[Purchase Order ID] int,
[Purchase Order Detail ID] int,
[Order Date] datetime,
[Total Due] Money,
[Received Quantity] float,
[Product Name] varchar(50)
)
)
PARAMETRIZACIÓN DE LOS
PROCEDIMIENTOS
ALMACENADOS
• Al igual que las funciones, los procedimientos almacenados pueden incluir
parámetros como parte de su código.
• La creación de un procedimiento almacenado con parámetros permite que
los programas en las llamadas pasen valores en el procedimiento.
• Los parámetros de los procedimientos almacenados difieren de las
funciones en la que puede especificar la dirección, si se trata de un
parámetro de entrada o de salida.
• Los procedimientos almacenados pueden tener parámetros opcionales y
predeterminados similares a los de las funciones.
SINTAXIS DE EJECUCIÓN
• Disparadores de manipulación de datos son conjuntos de instrucciones T-SQL que realizan una
acción específica.
• Ellos se refieren a menudo como un tipo especial de procedimiento almacenado.
• A diferencia de los procedimientos almacenados, triggers se ejecutan sólo cuando un usuario o
una aplicación intenta modificar datos utilizando Data Manipulation Language (DML). DML
incluye inserciones, actualizaciones y eliminaciones contra las vistas y/o las tablas.
TIPOS DE DISPARADORES
• Al igual que con todos los demás objetos programables en SQL Server, un disparador sólo se
puede modificar mediante T-SQL. Una situación puede presentarse, en la que tendrá que
cambiar la lógica en el interior del trigger. En lugar de descartar y volver a crear el trigger,
puede utilizar la palabra clave ALTER para modificar rápidamente el trigger
ELIMINAR TRIGGERS