Sie sind auf Seite 1von 162

INTRODUCCIN A SQL SERVER 2014

El modelo de base de datos relacional fue creado por Edgar Frank Codd

El primer SQL fue llamado SQEL que significa Structure Query English Lenguaje

Microsoft fue el creador del anlisis de datos

EL explorador de objetos contiene todos los contenedores que se encuentran en Microsoft SQL
Server

Los flderes representan Contenedores

Se tiene un conjunto de base de datos

El core de SQL es la base de datos llamada MASTER la cual se encuentra dentro del contenedor de
Bases de Datos y dentro de la carpeta Bases de Datos Del Sistema; es denominada la base de datos
de las bases de datos, es decir que todo objeto que se crea debe de pasar y registrarse dentro de
la base de datos master, por lo que es de suma importancia realizar con eventualidad una copia de
seguridad a esta base de datos (MASTER), ya que cualquier cambio que se realice a cualquier base
de datos se ver reflejado en la base de datos MASTER. Una forma de restaurar un sistema de
base de datos, ante cualquier eventualidad, es restaurar la copia de seguridad de la base de datos
MASTER.

Model es la base de datos modelo, o bien tambin llamada plantilla de SQL Server, lo que quiere
decir que cuando se crea una base de datos y no especifique algn detalle, se basara en la base de
datos Modelo, como, por ejemplo; si no se especifica un tamao de un archivo se basara en el
tamao de archivo que contenga la base de datos modelo.

La base de datos MSDB es la base de datos del agente de SQL (SQL Agent) quien es el encargado
de manejar las tareas programadas, tales como:

Tarea programada de una copia de seguridad

Tarea programada de plan de mantenimiento

La base de datos TEMP; es la base de datos para objetos temporales, es decir todo objeto
temporal ya sea creado por SQL Server o bien creado por el usuario, quedar almacenado en la
TEMP DB.

Estas bases de datos son propias del sistema, es decir no deben ser manipuladas por ningn
usuario o administrador.

Cuando existen 2 servidores de base de datos y se replican datos, es decir se trasladan datos de un
servidor a otro, se crea una base de datos llamada DISTIBUTION.

Despus tenemos Instantneas de Bases de Datos, esto quiere decir que es posible realizar un
Snapshot de una base de datos es decir sacar un foto o copia exacta en un momento especifico,
esto es una solucin que tiene SQL Server por ejemplo al momento en que se va tener una
insercin masiva de datos a una base de datos en especfico, lo cual afectara el rendimiento de
dicha base de datos, se toma un snapshot de esa base datos para que as al momento en que la
insercin masiva de datos se de y esta pueda causar conflicto o se puedan presentar problemas se
pueda regresar en una lnea de tiempo a la instantnea o snapshot.

En cuanto a seguridad se refiere es muy importante el tema de inicios de sesin, SQL Server
cuenta con 2 opciones de autenticacin las cuales son:

Autenticacin para conectarse al servidor; se llama LOGIN o Inicio de Sesin

Usuario, el cual se utiliza para conectarse directamente a la base de datos

Es decir, el LOGIN permite realizar la conexin con el servidor y el Usuario, permitiendo la


conexin con una base de datos en especifico

En el caso de los Login's SQL Server maneja 2 autenticaciones las cuales son:

Una es la de Windows; Deja al sistema operativo la autenticacin basndose en el Usuario


y Contrasea, creados en el sistema operativo Windows, es decir el usuario de ingreso de
windows ser el mismo que para ingresar al servidor de SQL

Una por del lado de SQL Server; en donde se crea un usuario o bien un LOGIN, el usuario
puede iniciar sesin sin necesidad de tener que autenticarse como usuario del sistema
operativo windows.

SQL se maneja a travs de varios servicios:

Analysis Service
Reporting Service
Integration Services

Existen tambin elementos propios del motor de base de datos tales como:

SQL Server Browser --> que permite a un cliente u otro servidor el poder descubrir mi
servidor de SQL, es decir permite localizar mi servidor SQL

El agente de SQL Server, trabaja con la base de datos MSDB, que es una base de datos del
sistema, mediante la cual se pueden realizar tareas programadas.

-- Se utiliza para comentar una sola lnea dentro del sql management

/* */ Sirve para comentar varias lneas o bien si se desea realizar un bloque comentariado.
INTRODUCCION A CONSULTAS CON T-SQL

SQL es un estndar.

Fue desarrollado por IBM en 1970

Fue adoptado como norma por los organismos ANSI e ISO

Es utilizado ampliamente en la industria

PL/SQL Procedure Lenguaje, Transact-SQL

La implementacin de Microsoft SQL es Transact

Referido como T-SQL

Lenguaje de consulta para SQL Server 2012, 2014 y 2016

SQL es declarativo, no procedimental

Describe lo que desea, no especifica los pasos.

Lgica de predicados --> un predicado es la composicin de una condicin para posteriormente


utilizarla en un WHERE

EL cdigo de SQL se divide en 3 partes:

DML --> Data Manipulation Lenguage; incluyen las instrucciones SELECT, INSERT, UPDATE,
DELETE
DDL --> Data Definition Lenguage; son las instrucciones que nos permiten crear, eliminar y
modificar objetos mediante las instrucciones CREATE, DROP, ALTER
DCL --> Data Control Lenguage; se basa en los permisos para la manipulacin dentro de la
base de datos, incluye las instrucciones GRANT, REVOKE, DENY, para dar permiso a un
objeto para que pueda realizar un SELECT a una tabla se utiliza la instruccin GRANT, o
bien denegar el permiso mediante la instruccin DENY, la instruccin REVOKE es una
instruccin neutra ya que quita un permiso GRANT o una negacin DENY, que este
asignado.

ELEMENTOS DEL LENGUAJE T-SQL:

Dentro estos tenemos;

Los predicados y operadores


Funciones
Variables
Expresiones
Separadores de lotes
Control del flujo de
Comentarios

PREDICADOS Y OPERADORES:

Predicados; el predicado se refiere a utilizar una palabra para formar una condicin, y dentro de
los predicados en SQL encontramos las instrucciones:

IN
BETWEEN
LIKE

Operadores de comparacin: Como su nombre lo indica sirven para comparar datos dentro de una
consulta y estos son:

Igual =
Mayor >
Menor <
Mayor Igual que =>
Menor Igual que <=
Diferente <>
No Igual !=
No Mayor !>
No Menor !<

Operadores Lgicos: Sirven para concatenar o bien unir instrucciones, y estos operadores son:

AND
OR
NOT

El operador AND es selectivo, es decir mientras ms operadores hayan de este tipo ms restrictiva
ser la condicin y por lo tanto menos datos devolver una consulta.

El operador OR es ms denso, es decir que mientras ms operadores hayan de este tipo la


consulta se volver ms densa, o bien devolver ms datos.

Operadores Aritmticos: Sirven para realizar cualquier tipo de operacin aritmtica dentro de una
consulta, y estos son:

Suma +
Resta -
Multiplicacin *
Divisin /
Diferencia o residuo %
Concatenacin: Sirve para unir textos dentro de una consulta, su representacin es +, se diferencia
de la Suma ya que la concatenacin nicamente trabaja con textos y la suma con valores
aritmticos.

FUNCIONES

Las funciones tienen la tarea de ejecutar un conjunto o bien una sola instruccin. Dentro de las
funciones en Trasct-SQL tenemos:

Funciones de String (Cadena de caracteres)


SUBSTRING --> toma nicamente una porcin de un texto
LEFT, RIGHT --> Toma nicamente ciertos caracteres ya sea Izquierda/Derecha segn sea
definido
LEN --> Cuenta los caracteres de un texto
DATALENGTH --> Cuenta los caracteres de un texto
REPLACE --> Substitute
REPLICATE
UPPER, LOWER
RTRIM, LTRIM

Fechas y Funciones de Tiempo

GATEDATE --> Devuelve la fecha del da


SYSDATETIME --> Devuelve la fecha del sistema del da
GETUTCDATE
DATEADD
DATEDIFF
YEAR --> Extrae el ao de una fecha
MONTH --> Extrae el mes de una fecha
DAY --> Extrae el da de una fecha

Funciones de Agregado; se les llama as porque realizan sumarizaciones de un grupo de


registros
SUM --> Sumatoria
MIN --> Valor mnimo
MAX --> Valor mximo
AVG --> Promedio
COUNT --> Realiza una cuenta de los elementos o registros

DECLARACIN DE VARIABLES

Las variables en T-SQL almacenan temporalmente un valor de un tipo de dato especfico

El nombre para una variable debe comenzar con un signo de arroba @, caso contrario de las
funciones del sistema que empiezan con doble arroba @@.
Se debe asignar un tipo de dato a la/las variable/s

Es importante declarar y emplear las variables dentro una sola consulta

En SQL Server 2008 y versiones posteriores, puede declararse e inicializarse en una misma
instruccin. Ejemplo:

DECLARE @MiVariable int = 30; es decir en la misma instruccin de declaracin de la variable es


posible asignar el valor de la misma.

En T-SQL la instruccin por excelencia que se utilizar es SELECT, la cual es una peticin de datos
sin importar se solicita o pide datos de una tabla o variable, esta instruccin devolver los datos
almacenados.

SQL respeta el orden aritmtico de las matemticas, es decir que si se tiene un conjunto de
operaciones aritmticas el orden en que lo tomar ser el siguientes:

Exponente o elevado
Multiplicacin y Divisin
Sumas y restas

Para realizar operaciones combinadas es necesario segmentarlas mediante el uso de parntesis ().

EXPRESIONES T-SQL

Combinacin de identificadores, valores y operadores evaluados para obtener un solo resultado.

Se puede utilizar en la instruccin SELECT

Clusula SELECT

Clusula WHERE

Puede ser nica constante, la funcin de un solo valor o una variable

Puede combinarse si las expresiones tienen el mismo tipo de dato. Ejemplo:

SELECT YEAR(orderdate) + 1

SELECT qty*unitprice

ELEMENTOS T-SQL CONTROL DE FLUJO, ERRORES Y TRANSACCIONES

T-SQL es un lenguaje de programacin y como tal debe tener instrucciones que deben permitir el
manejo de flujos, realizar ciclos de instrucciones, etc.

Le permite controlar flujos de ejecucin de cdigo, manejar errores, y mantener las transacciones

Es utilizado en objetos de cdigo programticos

Los procedimientos almacenados, triggers, bloques de instrucciones


Control de Flujo Manejo de Errores Control de Transacciones
IF ... ELSE TRY ... CATCH BEGIN TRANSACTION
WHILE COMMIT TRANSACTION
BREAK ROLLBACK TRANSACTION
CONTINUE
BEGIN END

Las transacciones permiten escribir o no a disco, estas pueden ser manejadas de forma automtica
por medio del sistema SQL Server o bien pueden ser manuales mediante las instrucciones
anteriormente mencionadas.

ELEMENTOS DE T-SQL SEPARADOR DE BATCH

Un batch es un conjunto de instrucciones que deben ejecutarse juntas en SQL Server.

Son los lotes de conjunto de comandos enviados a SQL Server como una unidad

Los lotes determinan el mbito de la variable, la resolucin de nombres

Para separar las declaraciones en lotes, se debe utilizar un separador:

Dentro de las Herramientas de SQL Server se utiliza la palabra reservada de sistema GO, la
cual ejecuta un conjunto de instrucciones de forma continua, es decir sin realizar ninguna
pausa, GO separa los batchs de instrucciones ms sin embargo permite que estos
conjuntos de batch o instrucciones sean ejecutados en una sola ejecucin.

La instruccin de sistema GO no es un comando propio de T-SQL Server

La instruccin reservada del sistema GO es una caracterstica adicionada desde SQL Server
2005

TEORIA DE CONJUNTOS Y SQL SERVER

La teora de conjuntos es una base matemtica utilizada para el modelo de base de datos
relacional

Qu es un conjunto?

Es una coleccin de objetos distintos considerados como un todo, por ejemplo: "Todos los clientes
que viven en Portland"

Caractersticas del Conjunto de Elementos Ejemplo


Elementos de un conjunto llamado miembros Clientes como miembros de un conjunto de
clientes
Los elementos de un conjunto son descritos El primer nombre del cliente, apellido del
por atributos cliente, fecha de cumpleaos
Los elementos deben ser distintos, o nicos EL Id del cliente
Dentro de la teora de conjuntos tenemos el lgebra relacional el cual tiene 8 enunciados.

El Set de datos es una coleccin o conjunto de datos, que dentro de estos podemos identificar a
un elemento en especfico o bien describir atributos de dicho elemento. Las consultas o query's
deben tener la capacidad de realizar estas tareas.

Un atributo en base de datos es llamado columna.

La proyeccin en Base de datos es cuando se mencionan ciertos atributos especficos de una


entidad o tabla.

TEORIA DE CONJUNTOS APLICADA A CONSULTAS DE SQL SERVER

Aplicacin de Teora de Conjuntos Comentarios


Ley sobre todos los elementos de un conjunto a Consulta toda la Tabla o Entidad a la vez
la vez Ejemplo: SELECT * FROM ....
Utiliza declaraciones, Procesos basados en
Dgale al motor lo que desea recuperar
conjuntos
Evite el procesamiento basado en cursor -->
No le diga al motor de cmo recuperar los
(son un conjunto de datos cargados en
datos. No precise cada resultado individual
memoria)
Los elementos deberan de ser nicos Definir claves o llaves nicas en una tabla
Los artculos pueden ser devueltos en
cualquier orden. Esto requiere de
No se define orden en el conjunto de resultados
instrucciones explcitas de orden, si se desea
un ordenarlos.

ENTENDIENDO EL PREDICADO LOGICO

LOGICA DE PREDICADO Y SQL SERVER

La lgica de predicados es una base matemtica para el modelo de base de datos relacional

En teora, un predicado es una propiedad o expresin que puede ser verdadero o falso

EL predicado tambin se conoce como una expresin booleana.

LOGICA DE PREDICADO APLICADO A SQL SERVER

Utilizar Predicados para:

Filtrar datos en consultas (es decir utilizar las clusulas WHERE y HAVING)
Proporcionar lgica condicional a las expresiones
Unir tablas (con filtros)
Definicin de subconsultas
Hacer cumplir la integridad de datos (restricciones CHECK)
El control de flujo (IF)

Un predicado tiene la capacidad de generar una composicin que permite crear una condicin
para el filtrado de datos.
ELEMENTOS DE UNA DECLARACION SELECT

Elemento Expresin Rol


SELECT <Listas del SELECT> Define las columnas que va a
retornar
FROM <Tabla de origen> Define las tablas de la
consulta
WHERE <Condicin de bsqueda> Filtra las filas utilizando un
predicado
GROUP BY <Lista por Grupos> Organiza las filas en grupos
HAVING <Condicin de bsqueda> Filtra el grupo utilizando un
predicado
ORDER BY <Ordena por lista> Ordena los datos de salida

Dentro de los predicados existen 3 instrucciones especiales de SQL Server y estos son:

IN
BETWEEN
LIKE

Existen caracteres que son considerados comodn y algunos de estos son:

Porcentaje % --> Sustituye un conjunto de letras


Guion bajo _ --> Sustituye una sola letra

-- Comentario de una sola lnea

/* Bloque de comentarios */

Ejemplo
SELECT 'Hola Mundo';

SELECT GETDATE(); -- Muestra la fecha del sistema

use NORTHWND;

SELECT * FROM Customers;

-- Definir una variable

DECLARE @Variable varchar(100) -- Declarando la variable

SET @Variable = 'SQL Server' -- Asignando valor a la variable

SELECT @Variable; -- Mostrando la variable

-- Consultando una tabla

SELECT companyname, contactname FROM Customers;


SELECT @@error; -- Muestra los errores mostrados

-- Concatenacin

SELECT companyname+ ' ' +contactname FROM Customers;

/* Une la tabla companyname con la tabla contactname separados por un espacio en blanco*/

-- Operaciones Bsicas

SELECT productname, unitprice, UnitsInStock,

unitprice*unitsinstock FROM Products;

-- Operaciones combinadas

SELECT productname, unitprice, unitsinstock,

(unitprice*unitsinstock)*0.5 FROM Products

--Instruccin SELECT

SELECT * FROM Customers

WHERE Country = 'France' AND City = 'Versailles';

SELECT * FROM Customers

WHERE Country = 'France' OR Country = 'Canada'

ORDER BY Country;

-- Instruccin SELECT con GROUP BY

SELECT country, COUNT(companyname) FROM Customers

WHERE Country LIKE 'A%'

GROUP BY Country

HAVING COUNT(CompanyName) > 2;


ESCRIBIR CONSULTAS SELECT

ESCRIBIR SENTECIAS SELECT SIMPLES

ELEMENTOS DE SENTENCIA SELECT:

Clusula Expresin
SELECT <Lista del SELECT>
FROM <Tabla de origen>
WHERE <Condicin de bsqueda>
GROUP BY <Listado por grupos>
ORDER BY <Listado por orden>

RECUPERANDO COLUMNAS DE UNA TABLA O VISTA

Se utiliza SELECT en listas de columnas para mostrar las Columnas

Se debe utilizar con el fin de especificar una tabla origen o vista

Se debe especificar tanto el nombre de esquema como el de la tabla

Se debe delimitar los nombres si as fuese necesario

Se terminar todas las declaraciones mediante un punto y coma (;)

Palabra Clave Expresin


SELECT <Selecciona una lista>
FROM <Tabla de origen>

Ejemplo: SELECT companyname, country FROM Sales.Customers;

DESPLEGAR COLUMNAS

Existen 2 formas de desplegar las columnas:

1. Ver todas las columnas. Esto no es considerada una buena prctica cuando la base de
datos est en produccin. Ejemplo: SELECT * FROM Sales.Customers;
2. Desplegar columnas de forma especfica. Para esto se debe especificar que columnas se
desea mostrar. Ejemplo: SELECT companyname, country FROM Sales.Customers;
USUANDO CLCULOS EN LA CLUSULA SELECT

Los clculos son escalares, y devuelven un valor por cada fila

Operador Descripcin
Suma (+) Aade o concatena
Resta (-) Sustrae
Multiplicacin (*) Multiplica
Divisin (/) Divide
Diferencia (%) Modulo

Uso de expresiones escalares en la clusula SELECT:

SELECT unitprice, qty(unitprice * qty) FROM Sales.Orderdetails;

ELIMINACION DE DUPLICADOS CON DISCTINCT

CONJUNTOS DE SQL Y FILAS DUPLICADAS

Los resultados de la consulta SQL no son verdaderamente relacionales

Las filas no garantizan que sea nico, o sin un orden garantizado

Incluso las filas nicas en una tabla origen pueden devolver valores duplicados para algunas
columnas

Ejemplo: SELECT country FROM Sales.Customers;

Country
Argentina
Argentina
Austria
Austria
Belgium
Belgium

ENTENDER DISTINCT

La instruccin DISTINCT, es una instruccin que se utiliza para devolver valores nicos, ya que la
sentencia SELECT devuelve ms de un valor a la vez, en otras palabras, la instruccin DISTINCT
quita los valores duplicados para presentar de forma ms compacta el resultado de una consulta.

DISTINCT especifica que slo las filas nicas pueden aparecer en el conjunto de resultados

Elimina duplicados en base a la lista de la columna de los resultados, y no de la tabla origen

Proporciona singularidad a travs del conjunto de columnas seleccionadas

Elimina las filas intervenidas por la clusula WHERE, HAVING, y GROUP BY


Algunas consultas pueden mejorar su rendimiento mediante la filtracin de duplicados antes de la
ejecucin de la clusula SELECT.

XML:

Lenguaje Extendido de Marcas de Hipertexto

Se pueden importar o transferir datos de una base de datos a otra, a travs de una pgina web.

Es decir, muestra los datos en formato XML.

Una de las ms importantes ventajas de trabajar con XML es que las etiquetas pueden nombrarse
a conveniencia del usuario, es decir no tienen un nombre especifico, por lo que nicamente lo que
se espera es el formato, es decir una etiqueta de apertura y una de cierre

Existen diferentes presentaciones dentro de XML y algunas de estas son:

AUTO
PATH
RAW
EXPLICIT -- ms complejo

Estas presentaciones, muestran de diferente forma los datos y se escogen de acuerdo a la


conveniencia o esquema que se tiene para importar los datos.

SINTAXIS DE SELECT DISTINCT

SELECT DISTINCT <Lista de columnas> FROM <Tabla o Vista>

Ejemplo: SELECT DISTINCT companyname, country FROM Sales.Customers;

Compnayname Country
Customer AHPOP UK
Customer AHXHT Mexico
Customer AZJED Germany

USAR ALIAS DE COLUMNAS Y DE TABLAS

El ALIAS es un nombre temporal, el cual es escogido por el administrador o usuario que realiza la
consulta, para nombrar una tabla que se genera por expresiones escalares en las columnas, se
puede utilizar tambin para traducir el nombre de las columnas, o tablas.

Los ALIAS son utilizados a menudo para hacer ms legible los nombres de las columnas.

El ALIAS nicamente existe mientras dura la consulta, es decir que nicamente se muestra
mientras la consulta siga ejecutndose.
USO DE ALIAS PARA HACER REFERENCIA A COLUMNAS

El Alias de columna se utiliza haciendo referencia de la instruccin AS despus del nombre de la


columna a la que se desea aplicar el ALIAS.

Ejemplo: SELECT orderid, unitprice, qty AS quantity FROM Sales.OrderDetails;

As mismo tambin se puede utilizar el signo de IGUAL (=) para asignar un ALIAS a una columna. Se
debe colocar primero el ALIAS seguido del signo igual y por ltimo el nombre de la columna.

Ejemplo: SELECT orderid, unitprice, quantity = qty FROM Sales.OrderDetails;

Tambin existe el ALIAS de columna Accidental.

Ejemplo: SELECT orderid, unitprice quantity FROM Sales.OrderDetails;

INSTRUCCIN NOHOLDLOCK:

Esta instruccin se utiliza para el manejo de bloqueos; un bloque se da cuando se estable una
conexin con algn objeto de la base de datos. Por ejemplo, cuando se realiza un SELECT se
bloquea la tabla a la cual se le est aplicando el SELECT, ms sin embargo esto no quiere decir que
esta tabla no pueda ser utilizada.

Existe el bloque estndar, mediante la cual se utiliza la tabla lo cual hace que haya una conexin,
sin que afecte el uso a terceros sobre dicha tabla.

Existen diferentes tipos de bloqueos, sin embargo, el que se utiliza comnmente es el estndar.

Tambin existen bloqueos a nivel general, es decir que no se da acceso a la base de datos mientras
se realiza alguna consulta sobre esta.

USO DE ALIAS PARA HACER REFERENCIA A TABLAS

Para crear un ALIAS que hace referencia a una Tabla se debe utilizar la instruccin AS despus del
FROM y el nombre de la tabla

Ejemplo: SELECT custid, orderdate FROM Sales.Orders AS SO;

Otra de forma de asignar un ALIAS a una tabla es escribiendo el nombre de alias que se desea
asignar despus de la clusula FROM y de la tabla que a la cual se le asignar, sin utilizar ningn
signo o palabra reservada.

Ejemplo: SELECT custid, orderdate FROM Sales.Orders SO;

Tambin se puede utilizar el ALIAS dentro de la clusula SELECT para hacer referencia a las
Columnas que estn dentro de la tabla a la cual se le aplica el ALIAS.

Ejemplo: SELECT SO.custid, SO.orderdate FROM Sales.Orders AS SO;

Esto es ms utilizado al momento de realizr JOIN's


IMPACTO DE LA ORDEN DE PROCESAMIENTO LOGICO EN ALIAS

Las clusulas FROM, WHERE, HAVING se ejecutan antes del SELECT

Los ALIAS creados en la clusula SELECT solo son visibles para la instruccin ORDER BY

Los ALIAS en la clusula SELECT pueden repetirse en otras partes de la consulta.

ESCRIBIR EXPRESIONES SIMPLE CASE

USAR EXPRESIONES CASE EN LA CLAUSULA SELECT

La expresin CASE en T-SQL retorna un nico valor (escalar)

Esta expresin puede ser utilizada en:

Una lista de columna SELECT


En las clusulas WHERE o HAVING
Clusula ORDER BY

Case retorna los resultados de una expresin

No retorna un mecanismo de flujo de control

En la clusula SELECT, CASE se comporta como un ALIAS que requiere una columna calculada.

Esta instruccin ofrece una funcin de SQL Server

FORMAS DE EXPRECIONES CASE

SELECT <Lista de columnas>, CASE <columna de asignacin>

WHEN 1 THEN 'Lo que se desea asignar'

WHEN 2 THEN 'Lo que se desea asignar'

WHEN 3 THEN 'Lo que se desea asignar'

.........

ELSE 'Si no cumple con ninguno WHEN y se desea asignar otra opcin'

END AS Alias de la columna

FROM <Tabla origen>


EJEMPLO

SELECT companyname, contactname, country FROM Customers

WHERE CompanyName NOT LIKE 'A%';

-- DISTINCT

SELECT country FROM Customers

ORDER BY Country;

SELECT DISTINCT country FROM Customers

ORDER BY Country;

--XML

SELECT companyname, contactname, country FROM Customers

FOR XML AUTO;

-- ALIAS a nivel de columnas

SELECT productname, unitprice, unitsinstock, unitprice * unitsinstock AS Total

FROM Products;

SELECT productname, unitprice, unitsinstock, Total = unitprice * unitsinstock

FROM Products;

SELECT productname, unitprice, unitsinstock, unitprice * unitsinstock Total

FROM Products;

----- ALIAS a nivel de tabla

SELECT productname, unitprice, unitsinstock, unitprice * unitsinstock Total

FROM Products AS Productos;


SELECT P.productname, P.unitprice, P.unitsinstock, P.unitprice * P.unitsinstock Total

FROM Products P;

sp_lock

---------CASE

SELECT productname, unitprice,

CASE categoryid

WHEN 1 THEN 'Pastas'

WHEN 2 THEN 'Bebidas'

WHEN 3 THEN 'ALimentos'

ELSE 'Otros'

END AS Categoria

FROM Products;
CONSULTAS CON T-SQL, USO DEL JOIN

CONSULTAR VARIAS TABLAS

ENTENDIENDO LOS JOINS

CLAUSULA FROM Y TABLAS VIRTUALES

La clusula FROM determina tablas de origen de las cuales se obtienen los atributos o datos, para
ser utilizadas en las declaraciones SELECT

La clusula FROM puede contener tablas y operaciones

El conjunto de resultados de la clusula FROM es una tabla virtual. Esto quiere decir que se genera
un nuevo conjunto de datos los cuales pueden trabajarse como una consulta ADOC (es una
consulta que no se tiene almacenada, pero puede almacenar como una vista)

Las operaciones lgicas posteriores en las sentencias SELECT consumen a esta tabla virtual

La clusula FROM puede establecer alias de tabla para su utilizacin por las fases posteriores de la
consulta

TEMINOLOGIA DE INGRESO: PRODUCTO CARTESIANO

Las caractersticas de un producto cartesiano

Salida o resultado intermedio de la clusula FROM

Combinar todas las posibles combinaciones de dos conjuntos

En las consultas de T-SQL, por lo general no es deseado

Caso especial: tablas de nmeros

Un producto cartesiano es la multiplicacin de todos los elementos de 2 conjuntos

En SQL el producto cartesiano es llamado CROSS JOIN


SOBREVISTA TIPOS DE JOIN

Los Joins en la clusula FROM especifican las operaciones que se realizan en la tabla virtual:

Tipo de JOIN Descripcin


Combina todas las filas de ambas tablas
CROSS
(creando un producto cartesiano)
Inicia con el producto cartesiano; aplica un
filtro para que coincidan las filas entre cuadros
INNER basados en predicado. Coloca datos
nicamente donde ambas tablas de
combinacin sean iguales.
Inicia con el producto cartesiano; todas las
filas de la tabla designada se conservan,
OUTER igualando las filas de una tabla recuperada.
Los valores NULL (Nulos) son adicionados
como marcadores de posicin.

ELECCIONES DE SINTAXIS DE T-SQL

ANSI SQL-92

Este estndar fue creado en 1992, y a diferencia de antecesor aqu ya se aplica la instruccin JOIN
para realizar la unin de las tablas, y mediante la instruccin ON se hace mencin de las columnas
en comn de las tablas que se unirn

Tablas unidas por el operador JON es la clusula FROM

SELECT <Lista de seleccin> FROM <Tabla origen>

JOIN <Tabla que se une> ON <Coincidencia de predicados>

ANSI SQL-89

Este estndar se cre en 1989, y lo que hace es hacer una mencin de las tablas que se desean
unir, para posteriormente mediante el uso de WHERE se especifique de qu manera se unirn
dichas tablas.

Tablas unidas por comas en la clusula FROM

No es recomendado: productos cartesianos accidentales

SELECT <Lista de seleccin> FROM Tabla1, Tabla2

WHERE <Predicado de comparacin WHERE>

El INNER JOIN o JOIN INTERNO muestra nicamente los atributos que coinciden con la
comparacin de los predicados, es decir que si algn atributo o registro no coincide con la
comparacin de predicados este no se mostrar en la consulta, de all el nombre INTERNO.
Vindolo matemticamente el INNER JOIN muestra nicamente los atributos de la interseccin de
los conjuntos

EL OUTER JOIN o JOIN EXTERNO, muestra los atributos que no coinciden con la comparacin de los
predicados y aquellos que, si cumplen con dicha comparacin, es decir que mostrar todos los
atributos o registros que si coincidan y aquellos no coincidan con la comparacin de los
predicados. Para utilizarlo de forma correcta se debe especificar antes de la instruccin OUTER se
desea aplicar a la tabla izquierda LEFT o bien a la tabla derecha RIGHT, esto se debe a que las
tablas se apilan de izquierda a derecha segn el orden que estas se mencionen despus de la
clusula FROM. Vindolo matemticamente el LEFT OUTER JOIN mostrar todos los atributos del
conjunto de la izquierda mientras que el RIGHT OUTER JOIN mostrar todos los atributos del
conjunto de la derecha.

Como se menciona anteriormente aquellos registros que no coincidan con la comparacin de los
predicados tendrn un valor tipo NULL en los atributos en los que no coincidan con los otros
atributos de la tabla a la cual se est uniendo.

Para mostrar los registros que no coinciden se debe utilizar la clusula WHERE para realizar un
filtro sobre la consulta.

CORSS JOIN no necesita de un predicado de comparacin ya que su funcin es hacer una


comparacin de cada registro de la tabla origen con cada uno de los registros de la tabla de unin.

Es posible hacer una unin de una tabla con ella misma, para esto se utiliza el comando o
instruccin INNER JOIN pero haciendo mencin a la misma tabla, esta instruccin no es posible
ejecutarla a menos que se utilice un alias, ya que la misma tabla debe mencionarse 2 veces y en
una de esas veces debe de llevar el alias.

CONSULTAS CON INNER JOIN

ENTENDER LOS INNER JOIN

Inner Join Devuelve slo las filas donde se encuentra una coincidencia en ambas tablas de entrada

Correspondencia de filas basadas en atributos de predicado

ON es la clusula de comparacin de predicados en la sintaxis de ANSI SQL-92


(recomendada)

WHERE es la clusula de comparacin de predicados en la sintaxis de ANSI SQL-89

Por qu Filtrar en la clusula ON?

Para realizar una separacin lgica entre el filtrado de los efectos de la unin y los
resultados que arroja el filtrado mediante la clusula WHERE

El operador de combinacin en el predicado =, es tambin conocido como equicombinacin.


ENTENDER LA SINTAXIS DEL JOIN

Lista las tablas en la clusula FROM separados por el operador JOIN

Los alias de tabla preferidos

El orden de las tablas no importa

SELECT <Lista seleccionada> FROM Tabla 1

JOIN Tabla 2 ON T1.predicado = T2.predicado

Ejemplo:

SELECT O.Orderid, O.orderdate, OD.productid, OD.unitprice, OD.qty FROM Sales.Orders AS


O

JOIN Sales.OrderDetails AS OD ON O.orderid = OD.orderid;

EJEMLOS DE INNER JOIN

JOIN basado en coincidencia de un solo atributo

SELECT ... FROM Production.Categories AS C

INNTER JOIN Production.Products AS P

ON C.categoruid = P.cotegoryid;

JOIN basado en coincidencia de varios atributos (Composite join)

SELECT DISTINCT E.city, e.country, FROM Sales Customers AS C

INNER JOIN HR.Employees AS E

ON C.city = E.city AND C.country = E.country;

Esto no quiere decir que puede existir ms de un predicado de comparacin, y no necesariamente


sea solamente 1.

CONSULTAS CON OUTER JOIN

ENTENDER LAS COMBINACIONES EXTERNAS

OUTER JOIN devuelve todas las filas de una tabla y las filas coincidentes desde la segunda tabla

Una de las tablas "conserva" todas sus filas

Esto se define designando la palabra reservada LEFT, RIGHT, FULL

Todas las filas de salida de la tabla conservada son el conjunto de resultados

Las filas donde hay coincidencia son devueltas


Las filas adicionales son aadidas al resultado, aunque no tengan coincidencia

Se aaden atributos con valores NULL en lugares en los que los atributos no coinciden

Ejemplo: Regresa todos los clientes y para los que han hecho pedidos, devuelve la informacin de
los pedidos. Los clientes sin pedidos que coincidan, se mostrarn con un NULL para aquellos
detalles del pedido.

SINTAXIS OUTER JOIN

Devuelve todas las filas de la primera tabla, y slo las de la segunda tabla en donde exista
coincidencia:

SELECT ... FROM T1

LEFT OUTER JOIN T2

ON T1.col = T2.col;

Devuelve todas las filas de la segunda tabla, y slo las de la primera tabla en donde haya
coincidencia:

SELECT ... FROM T1

RIGHT OUTER JOIN T2

ON T1.col = T2.col;

Devuelve slo filas de la primera tabla sin coincidencias en la segunda tabla:

SELECT ... FROM T1

LEFT OUTER JOIN T2

ON T1.col = T2.col

WHERE T2.col IS NULL;

EL FULL JOIN es un concepto

EJEMPLOS DE OUTER JOIN

Todos los clientes con un detalle de orden si est presente:

SELECT C.custid, C.contactname, O.ordderid, O.orderdate FROM Sales.Customers AS C

LEFT OUTER JOIN Sales.Orders AS O


ON C.custid = O.custid;

Clientes que no tienen rdenes:

SELECT C.custid, C.contactname, O.ordderid, O.orderdate FROM Sales.Customers AS C

LEFT OUTER JOIN Sales.Orders AS O

ON C.custid = O.custid

WHERE O.orderid IS NULL;

CONSULTAS CON CROSS JOIN Y SELF JOIN

COMPREDER CROSS JOIN

Combina cada fila de la primera tabla con cada fila de la segunda tabla

Todas las posibles combinaciones de salida

Fundamento lgico para uniones interiores y exteriores

Combinacin interna comienza con producto cartesiano, aade filtro

Combinacin externa, toma de salida cartesiano, se filtra, se vuelve agregar filas que no
coinciden (con marcadores de posicin de tipo NULL)

Debido a la salida del producto cartesiano, no es tpicamente una forma deseada del JOIN

Algunas excepciones tiles:

Tabla de nmeros, la generacin de datos para las pruebas.

SINTAXIS DE CORSS JOIN

No hay coincidencia, sin utilizar la clusula ON

Devuelve todas las filas de la combinacin de la tabla izquierda con cada fila de la tabla de la
derecha (Sintaxis ANSI SQL-92)

SELECT ... FROM T1 CROSS JOIN T2;

Devuelve todas las filas de la combinacin de la tabla izquierda con cada fila de la tabla de la
derecha (Sintaxis ANSI SQL-89)

SELECT ... FROM T1, T2;


EJEMPLOS DE CROSS JOIN

Crea datos de prueba mediante la devolucin de todas las combinaciones de dos tablas

SELECT E1.firstname, E2.lastname

FROM HR.Employees AS E1

CROSS JOIN HR.Employees E2;

ENTENDER SELF JOIN

Por qu utilizar SELF JOIN?

Realiza comparaciones en una misma tabla

Crea 2 instancias de una misma tabla en la clusula FROM

Al menos un alias es requerido

Ejemplo: Devolver todos los empleados y el nombre del jefe del empleado.

INNER JOIN --> En donde ambas tablas de combinacin coinciden

LEFT JOIN --> En donde ambas tablas de combinacin coinciden, pero tambin los elementos de la
tabla de la izquierda, aunque estos no coincidan con los elementos de la tabla de la derecha

LEFT JOIN WHERE IS NULL --> Muestra todos los elementos de la tabla de la izquierda que no
coinciden con los elementos de la tabla de la derecha

FULL JOIN --> Coloca valores que coinciden, as como tambin los valores de la tabla de la
izquierda que no coincidan con los valores de la tabla de la derecha, y los valores de la tabla de la
derecha que no coincidan con los valores de la tabla de la izquierda (FULL JOIN conlleva un orden,
primero muestra los valores que coinciden, seguido muestra los valores de la tabla izquierda que
no coinciden con la tabla derecha y por ultimo muestra los valores de la tabla derecha que no
coinciden con la tabla izquierda

FULL JOIN WHERE IS NULL --> Muestra los valores que no coinciden entre ambas tablas

RIGHT JOIN --> En donde ambas tablas de combinacin coinciden, pero tambin los elementos de
la tabla de la derecha, aunque estos no coincidan con los elementos de la tabla de la izquierda

RIGHT JOIN WHERE IS NULL --> Muestra todos los elementos de la tabla de la derecha que no
coinciden con los elementos de la tabla de la izquierda
EJEMPLO
-- JOINS varias tablas

-- ISO ANSI 89

SELECT Customers.CompanyName, Customers.Country, Orders.OrderID, Orders.OrderDate

FROM Customers, Orders

WHERE Customers.CustomerID = Orders.CustomerID

-- ISO ANSE 92

SELECT Customers.CompanyName, Customers.Country, Orders.OrderID, Orders.OrderDate

FROM Customers

JOIN Orders

ON Customers.CustomerID = Orders.CustomerID;

-- INNER JOIN

SELECT Customers.CompanyName, Customers.Country, Orders.OrderID, Orders.OrderDate

FROM Customers

INNER JOIN Orders

ON Customers.CustomerID = Orders.CustomerID;

-- OUTER JOIN

SELECT Customers.CompanyName, Customers.Country, Orders.OrderID, Orders.OrderDate

FROM Customers

LEFT OUTER JOIN Orders

ON Customers.CustomerID = Orders.CustomerID;

SELECT Customers.CompanyName, Customers.Country, Orders.OrderID, Orders.OrderDate

FROM Customers

RIGHT OUTER JOIN Orders

ON Customers.CustomerID = Orders.CustomerID;
-- OUTER JOIN mostrando nicamente los registros que no coinciden

SELECT Customers.CompanyName, Customers.Country, Orders.OrderID, Orders.OrderDate

FROM Customers

LEFT OUTER JOIN Orders

ON Customers.CustomerID = Orders.CustomerID

WHERE Orders.OrderID IS NULL;

SELECT Customers.CompanyName, Customers.Country, Orders.OrderID, Orders.OrderDate

FROM Customers

RIGHT OUTER JOIN Orders

ON Customers.CustomerID = Orders.CustomerID

WHERE Orders.OrderID IS NULL;

-- JOIN Utilizando ALIAS

SELECT C.CompanyName, C.Country, O.OrderID, O.OrderDate FROM Customers C

INNER JOIN Orders O ON C.CustomerID = O.CustomerID;

-- Unir mas de dos tablas

SELECT C.CompanyName, C.Country, O.OrderID, O.OrderDate, P.ProductName, D.UnitPrice,

D.Quantity, (D.UnitPrice * D.Quantity) AS Parcial

FROM Customers AS C

INNER JOIN Orders AS O ON C.CustomerID = O.CustomerID

INNER JOIN [Order Details] AS D ON D.OrderID = O.OrderID

INNER JOIN Products AS P ON P.ProductID = D.ProductID

WHERE P.ProductName = 'Queso Cabrales';


-- CROSS JOIN ANSI 89

SELECT Customers.CompanyName, Customers.Country, Orders.OrderID, Orders.OrderDate

FROM Customers, Orders;

-- CROSS JOIN ANSI 92

SELECT C.CompanyName, C.Country, O.OrderID, O.OrderDate FROM Customers AS C

CROSS JOIN Orders AS O;

-- SELF JOIN

SELECT J.FirstName + ' ' + J.LastName AS Jefe, S.FirstName + ' ' + S.LastName AS

Subalterno FROM Employees AS S

INNER JOIN Employees AS J

ON J.EmployeeID = S.ReportsTo;
CONSULTAS CON T-SQL USO DE TOP, TOP WITH TIES, OFFSET-FETCH

ORDENAR Y FILTRAR DATOS

ORDENAR DATOS

USO DE LA CLAUSULA ORDER BY

ORDER BY ordena las filas en los resultados a efecto de presentarlos mediante un orden
especificado

No hay garanta de orden de filas sin la clusula ORDER BY, es decir sin esta clusula los datos no
se ordenan y se presentan tal cual lo arroja el sistema gestor de base de datos. No existe ninguna
otra clusula capaz de ordenar los datos en una consulta.

El uso de ORDER BY garantiza el orden de clasificacin de los resultados

Es la ltima clusula que se ejecuta mediante el orden de ejecucin lgico de una consulta

Ordena todos los valores nulos juntos

ORDER BY puede referirse a:

Columnas por nombre, alias o posicin ordinal, es decir se puede especificar el nmero de
columna por la cual se desea ordenar (no es recomendado)

Declaraciones por orden de clasificacin con ASC (ascendente) y DESC (descendente)

La clusula ORDER BY impacta directamente en el rendimiento de la base de datos, ya que una vez
ejecuta la consulta los datos son cargados, y al ordenarlos se presenta un paso adicional, ya que
debe ordenarlos y esto impacta en el recurso de procesador.

Para ordenar los datos sin la necesidad de utilizar la clusula ORDER BY, se debe realizar mediante
la implementacin de un ndice.

SINTAXIS DE LA CLAUSULA ORDER BY

Usando la clusula ORDER BY para ordenar por medio de los nombres de columnas:

SELECT <lista seleccionada>

FROM <Tabla origen>

ORDER BY <Nombre_de_Columna1>, <Nombre_de_Columna2>;


Usando la clusula ORDER BY para ordenar por medio de los alias de columnas:

SELECT <columna> AS <Alias_de_Columna>

FROM <Tabla origen>

ORDER BY <Alias_de_Columna>;

Especificando la clasificacin de orden en la clusula ORDER BY

SELECT <columna> AS <Alias_de_Columna>

FROM <Tabla origen>

ORDER BY <Nombre_de_Columna | Alias_de_Columna> ASC | DESC;

EL ordenamiento ascendente es el que ORDER BY utiliza de forma predeterminada, es decir que, si


no se especifica un orden ascendente o descendente en la clusula ORDER BY, este lo ordenar de
forma ascendente.

Al utilizar la instruccin TOP, esta escoger los nmeros de registros de mayor valor o bien los de
mayor peso dentro de la tabla y los mostrar, esto siempre y cuando no defina la instruccin ASC |
DESC, es indispensable saber que est instruccin no debe utilizarse sin la clusula ORDER BY, ya
que est clusula da la garanta que los datos se presentan de forma ordenada.

TOP muestra tantos elementos como se le indique en la consulta, y mostrar dependiendo la


clasificacin que se escoja, ASC para los mayores y DESC para los menores.

La instruccin TOP puede no solamente se especifica mediante un valor numrico, tambin puede
representarse por medio de porcentajes, lo cual lo admite como un valor valido. Es fundamental
definir el nmero de porcentaje y a continuacin escribir la palabra reservada PERCENT. Esto lo
que har es buscar del 100% que son todos los registros de la tabla, nicamente lo que
corresponde al nmero de porcentaje especificado.

La instruccin WITH TIES, esta instruccin se utiliza cuando se hace un TOP de alguna tabla, ya que
TOP nicamente muestra el nmero de registros que se le indica, en ocasiones existen registros
que poseen el mismo valor o que son repetidos y por ende son relevantes a mostrar, la instruccin
WITH TIES permite mostrar estos datos, aunque sobrepase el nmero indicado en la instruccin
TOP, aclarando que mostrar nicamente los datos repetidos.

La instruccin OFFSET permite a la consulta saltarse tantas filas como se le indique, ya que muchas
veces no es necesario conocer el nmero inicial de filas, y OFFSET permite saltar tantas filas como
sea necesario. Esta instruccin funciona nicamente si se estipula la clusula ORDER BY de lo
contrario existe un error que no permite ejecutar la consulta.
La instruccin FETCH NEXT, se utiliza en combinacin con la instruccin OFFSET y su funcin es
limitar el resultado de la consulta al nmero de registros o filas que se especifique en la consulta.
Es decir, ya no mostrar todos los registros, sino que se limitar a un nmero de filas especificado
en la consulta.

FILTRADO DE DATOS EN LA CLAUSULA WHERE CON PREDICADOS

La clusula WHERE utiliza predicados

Deben expresarse en condiciones lgicas

Slo se aceptan filas en las que el predicado es un valor TRUE (verdadero)

Los valores FALSE (falsos) o UNKNOW (desconocidos) son filtrados.

La clusula WHERE que es continuacin de FROM, precede a otras clusulas

No pueden usarse alias declarados en la clusula SELECT

Pueden ser optimizados por SQL Server para utilizar ndices

Se filtran los datos del lado del servidor

Puede reducir el trfico de red y uso de la memoria del cliente.

SINTAXIS DE LA CLAUSULA WHERE

Filtrando filas por clientes de Espaa

SELECT contactname, country

FROM Sales.Customers

WHERE country = 'SPAIN';

Filtrando filas por orden despues de 1 julio de 2007

SELECT orderid, orderdate

FROM Sales.Orders

WHERE orderdate > '20070101';

Filtrando ordenes que no estn en rango de las fechas

SELECT orderid, custid, orderdate

FROM Sales.Orders
WHERE orderdate >= '20070101' AND orderdate < '20080101';

FILTRADO DE DATOS CON TOP Y OFFSET-FETCH

FILTRANDO EN LA CLAUSULA SELECT USANDO LA OPCION TOP

Top le permite limitar el nmero o porcentaje de filas retornadas en una consulta

Trabaja con la clusula ORDER BY para limitar las filas en un orden especifico

Si la lista ORDER BY no es nica, el resultado no es determinstico (Es decir no hay un solo


conjunto de resultado correcto)

Modificar la lista ORDER BY para asegurar unicidad, o usar TOP WITH TIES

Agregar a la clusula SELECT:

SELECT TOP (Nmero) | TOP (Nmero) PERCENT

Con porcentaje, nmero de filas especificadas

SELECT TOP (Nmero) WITH TIES

Recupera duplicados donde sea aplicable (no determinstico)

TOP es propietario de Microsoft SQL Server, es decir nicamente se puede utilizar en el gestor de
base de datos Microsoft.

FILTRANDO EN LA CLAUSULA ORDER BY USANDO OFFSET - FETCH

OFFSET - FETCH es una extensin de la clusula ORDER BY:

Permite filtrar un rango solicitado de filas

Dependiente de la clusula ORDER BY

Provee un mecanismo para la paginacin a travs de los resultados

Especifica un nmero de filas para omitir, numero de filas para recuperar o devolver

ORDER BY <Ordenar por lista>

OFFSET <Nmero de filas omitidas> ROW(S)

FETCH FIRST | NEXT <Nmero de filas que mostrar> ROW(S) ONLY

Es una nueva opcin en SQL Server 2012

Basado en el proyecto SQL:2011 Estndar

Provee ms compatibilidad que TOP


SINTAXIS OFFSET - FETCH

El valor de OFFSET debe ser especificado

Puede ser cero si no se requiere omitir ningn registro

La clusula FETCH puede ser opcional, permite a todas las filas seguidas del valor OFFSET puedan
ser devueltas o retornadas

El enfoque natural en cdigo:

ROW y ROWS intercambiables

FIRST y NEXT intercambiables

EL valor OFFSET y el valor FETCH pueden ser constantes o expresiones, incluyendo variables y
parmetros

OFFSET <Valor_OFFSET> ROW | ROWS

FETCH FIRST | NEXT <Valor_FETCH> ROWS | ROWS [ONLY];

TRABAJAR CON VALORES DESCONOCIDOS

LGICA DE TRES-VALORES

SQL Server usa NULL para marcar valores ausentes

NULL puede ser ausente pero aplicable o ausente, pero no aplicable

Segundo nombre del cliente: No es provisto, o no tiene uno?

Con valores no ausentes, el predicado de salida nicamente puede ser verdadero (TRUE) o falso
(FALSE). Ejemplo 5 > 2, 1 = 1

Con valores ausentes, las salidas pueden ser Verdadero (TRUE), falso (FALSE) o desconocido
(UNKNOW). Ejemplo: NULL > 99, NULL = NULL

El predicado retorna un valor desconocido (UNKNOW) cuando compara un valor ausente con otro
valor, incluyendo otro valor ausente.

MANEJO DE NULL EN CONSULTAS

Los diferentes componentes de SQL Server manejan los valores ausentes (NULL) diferentemente:

Filtrado de consultas (ON, WHERE, HAVING), filtran salidas desconocidas (UNKNOWs)

Las restricciones CHECK aceptan salidas desconocidas (UNKNOW)

ORDER BY, DISTINCT tratan los valores ausentes (NULL) como iguales
Pruebas para NULL

Usar IS NULL o IS NOT NULL en lugar de " = NULL" o "<> NULL"

SELECT custid, city, region, country

FROM Sales.Customers

WHERE region IS NOT NULL;

Al utilizar una funcin tal como COUNT, este no toma en cuenta los valores NULOS (NULL), y al
momento de realizar alguna operacin aritmtica tal como multiplicar, dividir, etc. por un valor
NULO (NULL), dar como resultado un error.

EJEMPLO
-- USO de ORDER BY

SELECT customerid, companyname, contactname, country FROM Customers

ORDER BY ContactName;

SELECT customerid, companyname, contactname, country FROM Customers

ORDER BY ContactName DESC;

SELECT customerid, companyname, contactname, country FROM Customers

ORDER BY 4;

SELECT customerid, companyname, contactname, country AS Pais FROM Customers

ORDER BY Pais;

--Instruccion TOP

SELECT TOP 5 Productname, unitprice FROM Products

ORDER BY UnitPrice DESC;


SELECT TOP 5 Productname, unitprice FROM Products

ORDER BY UnitPrice ASC;

-- WITH TIES

SELECT TOP 12 WITH TIES productname, unitprice FROM Products

ORDER BY UnitPrice;

-- TOP usando porcentajes

SELECT TOP 20 PERCENT productname, unitprice FROM Products

ORDER BY UnitPrice;

-- OFFSET

SELECT productname, unitprice FROM Products

ORDER BY UnitPrice OFFSET 5 ROWS;

-- FETCH

SELECT productname, unitprice FROM Products

ORDER BY UnitPrice OFFSET 5 ROWS

FETCH NEXT 5 ROWS ONLY;

-- Valores NULL

SELECT customerid, companyname, contactname, country, fax

FROM Customers

WHERE Fax IS NULL;


TRABAJANDO CON SQL SERVER 2014 TIPOS DE DATOS

SQL SERVER TIPOS DE DATOS

SQL Server asocia columnas, expresiones, variables, y parmetros con tipos de datos

Los tipos de datos determinan que clase de datos pueden ser manejados

Enteros, caracteres, fechas, moneda, binarios, cadena de caracteres, etc.

SQL Server suministra los tipos incorporados

Los desarrolladores pueden tambin definir tipos personalizados

Alias en T-SQL

Usar tipos definidos en cdigo .NET

Categora de Tipos de Datos en SQL SERVER


Numrico exacto caracteres unicodigo
Numrico aproximado Binarios Strings
Fecha y tiempo Otros
Cadena de caracteres

TIPOS DE DATOS NUMERICOS

Numricos exactos o nmeros enteros

Tipo de Dato Rango Almacenamiento (Bytes)


TINYINT 0 a 255 1
SMALLINT -32,768 a 32768 2
-2^31 (-2,147,483,648)
INT a 4
2^31-1 (2,147,483,647)
-2^63 a 2^63 1
BIGINT 8
(+/- 9 QUINTILLON)
BIT 1, 0 o NULL 1
-10^38 +1 a 10^38 -1
/
DECIMAL / NUMERIC 5 - 17
cuando es usada la mxima
precisin
-922,337,203,685,477.5808
MONEY a 8
922,337,203,685,477.5807
SMALLMONEY -214,748.3648 a 214,748.3647 4
TIPOS DE DATOS BINARIOS

Cadenas de binarios

Tipo de Dato Rango Almacenamiento (Bytes)


BINARY (n) 1 - 8000 bytes n bytes
VARBINARY (n) 1 - 8000 bytes n bytes +2
VARBINARY (MAX) 1 - 2.1 billones (aprox) bytes longitud actual +2

OTROS TIPOS DE DATOS

Tipo de Dato Rango Almacenamiento (Bytes) Resea


Sucesor del tipo
ROWVERSION Auto-generado 8
TIMESTAMP
Identificador global nico
UNIQUEIDENTIFIER Auto-generado 16
(GUID)
Almacena XML en una
XML 0 - 2 GB 0-2 GB
estructura jerrquica nativa
No almacena un tipo de
CURSOR N/A N/A
dato
Representa la posicin en
HIERARCHYID N/A Depende del contenido
una jerarqua
Puede almacenar
SQL_VARIANT 0 - 8000 bytes Depende del contenido
diferentes tipos de datos
No almacena ningn tipo
de dato, es usado para
TABLE N/A N/A
consultas y operaciones
programticas

PRIORIDAD EN LOS TIPOS DE DATOS

La prioridad en los tipos de datos determina cual tipo de dato ser elegido cuando expresiones de
diferentes tipos son combinadas

Tipo de dato con la menor prioridad es convertido al tipo de dato con la mayor prioridad

Es importante entender las conversiones implcitas

La conversin del tipo de dato de menor prioridad debe de realizarse de forma explcita
(con la funcin CAST)

Ejemplo (de menor a mayor)

CHAR --> VARCHAR --> NVARCHAR --> TINYINT --> INT --> DECIMAL --> TIME --> DATE -->
DATETIME2 --> XML
CUANDO SON LOS TIPOS DE DATOS CONVERTIDOS?

Los escenarios de los tipos de datos convertidos

Cuando el dato es movido, comparado, o combinado con otros datos

Durante la asignacin de variables

Conversin implcita

Cuando se compara un tipo de dato con otro


Transparenta para el usuario
WHERE <Columna del tipo SMALLINT> = <un valor tipo INT>

Conversin Explicita

Usa la funcin CAST o CONVERT


CAST(unitprice AS INT)

No todas las conversiones son permitidas por SQL Server

TRABAJANDO CON DATOS DE CARACTERES

TIPOS DE DATOS CARACTER

SQL Server soporta 2 clases de tipos de datos de caracteres:

Regulares: CHAR, VARCHAR

Un byte de almacenamiento por carcter

Solo 256 posibles caracteres - lo que hace que soporte un lmite de


lenguaje

Unicodigo (Unicode): NCHAR, NVERCHAR

Dos bytes de almacenamiento por carcter

65 mil caracteres representativos - lo que hace que soporte mltiples lenguajes

Precede a los caracteres con una 'N' (Nacional)

TEXT, NTEXT son obsoletos

Utilizar en su lugar VARCHAR(MAX), NVARCHAR(MAX)

Los tipos de datos CHAR son estticos, es decir que estos reservarn un espacio de memoria segn
sea asignada la longitud del carcter, mientras que VARCHAR es un tipo de dato dinmico, es decir
que se le puede asignar una longitud, pero de no usar por completo esta, VARCHAR asignar a
memoria nicamente la longitud que est utilizando actualmente.

Lo tipos de datos de Caracteres Regulares se manejan por la tabla ASCII la cual tiene nicamente
256 caracteres lo cual limita en cuanto al uso de ciertos lenguajes, en cuanto los tipos de datos de
Caracteres Unicodigo o Unicode poseen 65 mil caracteres, lo que hace posible el uso de mltiples
lenguajes debido al gran nmero de combinaciones que pueden existir.

COLLATION

COLLATION es una coleccin de propiedades de caracteres

Soporta lenguajes, ordenar por clasificacin

En las consultas, el conocimiento de COLLATION es importante para las comparaciones

Es la base de datos case-sensitive?

Si lo es, N'Funk' <> N'funk'

Agregar la opcin COLLATE en la clusula WHERE para controlar las comparaciones de colacin

SELECT empid, lastaname

FROM HR.emplyees

WHERE lastname COLLATE Latin1_General_CS_AS = N'Funk';

Se puede definir COLLATE como el orden de la nomenclatura que maneja SQL Server, puede ser
case sensitive, y este se define desde que se instala el gestor de base de datos.

CONCATENACION DE STRING (CADENA DE CARACTERES)

SQL Server usa el signo ms (+) para la concatenacin de caracteres

La concatenacin de valores NULL o NULOS retornan NULL

SELECT empid, lastname, firstname, firstname + N'' + lastname AS fullname

FROM HR.employees;

SQL Server 2012 introduce la funcin CONCAT

Esta funcin convierte valores NULL en cadenas vacas antes de la concatenacin

SELECT custid, city, region, country, CONCAT(city,',' + region,',' + country) AS location

FROM Sales.Customers;
FUNCIONES PARA CADENAS DE CARACTERES

Funciones comunes que modifican las cadenas de caracteres

Funcin Sintaxis Resea


SUBSTRING() SUBTRING(expresion, inicio, longitud) Retorna parte de una expresin
LEFTH() retorna la parte izquierda de
LEFT() LEFTH(Expresion, valor_entero)
un string hasta un valor entero
RIGHT retorna la parte derecha del
RIGHT() RIGHT(Expresin, valor_entero)
string
LEN() retorna el nmero de caracteres
LEN() LEN(Expresin_string) de una expresin string especfica,
excluyendo los espacios en blanco.
DATALENGTH() retorna el nmero de
DATALENGTH() DATALENGTH(Expresin)
bytes usados.
Busca una expresin para otra
CHARINDEX(ExpresionA_Encontrar,
CHARINDEX() expresin y retorna la posicin inicial
Expresin_A_Buscar)
si se encuentra.
Reemplaza todas las ocurrencias de un
REPLACE(Expresin_string,
REPLACE() valor string especifico con otro valor
patron_string, reemplazo_string)
string
UPPER() retorna una expresin de
UPPER() UPER(Expresin_caracter)
carcter con minscula a Mayscula.
LOWER() convierte maysculas a
LOWER() LOWER(Expresin_caracter)
minsculas.

EL PREDICADO LIKE

El predicado LIKE es usado para comprobar una cadena de caracteres contra un patrn

Los patrones se expresan con smbolos

% (Porcentaje) representa un string de cualquier largo

_ (Guion bajo) representa un nico carcter

[<Lista de caracteres>] representa un nico carcter dentro de la lista suministrada

[<Carcter> - <carcter>] representa un nico carcter dentro del rango especificado

[^<Lista o rango de caracteres>] representa un nico carcter no especificado en la lista o


rango
Carcter de escape (ESCAPE CHARACTER) le permite buscar por un carcter que es
tambin un carcter wildcard (%, _ , [,] por ejemplo)

SELECT categoryid, categoryname, description

FROM Production.Categories

WHERE description LIKE 'Sweet%';


TIPOS DE DATOS DE TIEMPO Y FECHAS

Las versiones anteriores de SQL Server soportaban nicamente DATETIME y SMALLDATETIME

DATE, TIME, DATETIME2, y DATETIMEOFFSET son introducidos en SQL Server 2008

SQL Server 2012 aade nuevas funcionalidades para trabajar con tipos de datos de fecha y tiempo

FORMATO DE
RANGO DE
TIPO DE DATO ALMACENAMIENTO EXACTITUD ENTRADA
FECHA
RECOMENDADO
Enero 1, 1753
3-1/3 'YYMMDD
DATETIME 8 a diciembre
milisegundos HH:MM:SS:NNN'
31, 9999
Enero 1, 1990
'YYMMDD
SAMLLDATETIME 4 a Junio 6, 1 minuto
hh:mm:ss:nnn'
2079
Enero 1, 0001
100 'YYMMDD
DATETIME2 6a8 a Diciembre
nanosegundos hh:mm:ss:nnnnnn'
31, 9999
Enero 1, 0001
DATE 3 a Diciembre 1 da YYYY-MM-DD
31, 9999
100
TIME 3a5 hh:mm:ss:nnnnnnn
nanosegundos
Enero 1, 0001 'YY-MM-DD
100
DATETIMEOFFSET 8 a 10 a Diciembre hh:mm:ss:nnnnnnn
nanosegundos
31, 9999 [+ | -] hh:mm

TIPOS DE DATOS FECHA Y TIEMPO: LITERAL

SQL Server no ofrece una opcin para ingresar valores de fechas y tiempo de forma explicita

Las fechas y tiempos son ingresados como caracteres literales y son convertidos de forma
explcita o implcita

Por ejemplo, CHAR convertido a DATETIME debido a la precedencia

Los formatos son lenguajes dependientes, pueden causar confusin

Las mejores prcticas:

Usar cadenas de caracteres para expresar valores de fecha y tiempo

Usar formatos de lenguaje natural

SELECT orderid, custid, empid, orderdate

FROM Sales.Orders

WHERE orderdate = '20070825';


EJEMPLO
-- Ejemplo de funciones de texto

SELECT customerid, SUBSTRING(companyname,1,3) AS FirstLetter, companyname, contactname,


country

FROM Customers;

SELECT customerid, LEFT(companyname,3) AS FirstLetter, companyname, contactname, country

FROM Customers;

SELECT customerid, RIGHT(companyname,3) AS FirstLetter, companyname, contactname, country

FROM Customers;

SELECT customerid, SUBSTRING(companyname,1,3) AS FirstLetter,

LEN(companyname) AS Caracteres,companyname, contactname, country

FROM Customers;

-- Funciones dde conversi

SELECT productname, 'Precio de lista' + ' ' + CAST(unitprice AS VARCHAR(15))

FROM Products;

SELECT productname, 'Precio de lista' + ' ' + CONVERT(VARCHAR(15), UnitPrice)

FROM Products;

SELECT GETDATE() AS FechaHoy, CONVERT(NVARCHAR(30), GETDATE(), 126) AS ISO;

-- Aplicacion de los tipos de datos al momento de crear una tabla

CREATE TABLE Curso(IdCurso INT, Nombre NVARCHAR(100), Horario SMALLDATETIME,

Catedratico NVARCHAR(100), universidad NVARCHAR(100))


SELECT * FROM Curso;

DECLARE @hoy DATETIME

SET @hoy = GETDATE()

SELECT @hoy;

ALTER TABLE Curso

ADD precio DECIMAL(9,4);


DECLARACIONES UPDATE, INSERT Y DELETE (DML)

ADICIN DE DATOS A LAS TABLAS

USO DE INSERT PARA AGREGAR DATOS

INSERT .... VALUES es la declaracin que se utiliza para insertar un solo dato dentro de una tabla

INSERT INTO Nombre_Tabla(Campos de la tabla en donde se insertarn los datos)

VALUES(Valores que se insertarn en cada uno de los campos de la tabla);

Ejemplo:

INSERT INTO Sales.OrderDetails(orderid, productid, unitprice, qty, discount)

VALUES(12000, 39, 18, 2, 0.05);

Es posible insertar ms de un valor a la tabla

INSERT INTO Nombre_Tabla(Campos de la tabla en donde se insertarn los datos)

VALUES(Valores que se insertarn en cada uno de los campos de la tabla),

(Valores que se insertarn en cada uno de los campos de la tabla);

Ejemplo:

INSERT INTO Sales.OrderDetails(orderid, productid, unitprice, qty, discount)

VALUES(12001, 39, 18, 2, 0.05),

(12002, 39, 18, 5, 0.10);

USO DE INSERT CON SELECT Y EXEC

INSERT ... SELECT se utiliza para insertar el conjunto de resultados de una consulta en una tabla
existente. Es decir, esta combinacin de instrucciones nos permite insertar datos a una tabla a
travs de una consulta.

INSERT INTO Nombre_Tabla(Campos de la tabla en donde se insertarn los datos)

SELECT Campos de consulta que deben coincidir con los campos de insercin

FROM Tabla_Consultada

WHERE predicado_condicin
Ejemplo:

INSERT INTO Sales.OrderHist(orderid, custid, empid, orderdate)

SELECT orderid, custid, empid, orderdate

FROM Sales.Orders

WHERE orderdate < '20080101';

INSERT .... EXEC es utilizado para insertar el resultado de un procedimiento almacenado o de una
expresin dinmica de SQL en una tabla existente

INSERT INTO Nombre_Tabla(Campos de la tabla en donde se insertarn los datos)

EXEC Nombre_Procedimiento_Almacenado

variables si existen

USO DE SELECT INTO

SELECT ... INTO es similar a INSERT ... SELECT, con la nica diferencia que la instruccin SELECT ...
INTO crea una nueva tabla cada vez que se ejecuta la sentencia

Copia los nombres de las columnas, tipos de datos y valores nulos

En otras palabras, esta forma de insercin, lo que hace es construir el objeto o tabla tomando
como base los datos consultados.

No copia restricciones o ndices

SELECT Campos de la consulta que se insertarn en la tabla (deben coincidir el tipo


y nmero de columnas)

INTO Nombre_Tabla

FROM Nombre_Tabla_Consultada

WHERE predicado_condicin

Ejemplo:

SELECT orderid, custid, empid, orderdate, shippeddate

INTO Sales.OrderArchive

FROM Sales.Orders

WHERE orderdate < '20080101';


Un esquema se refiere a apartados o divisiones lgicas que poseen sus propios objetos ya sean
ndices, tablas, procedimientos almacenados, triggers, etc. El esquema predeterminado en SQL
Server es el "dbo".

Al momento de insertar datos en una tabla se debe tener en cuenta que algunos campos o
registros puedan tener o no tener alguna restriccin, es decir los campos pueden aceptar o no
aceptar valores de tipo NULL o nulos.

MODIFICACIN Y ELIMINACIN DE DATOS

UTILIZAR UPDATE PARA MODIFICAR DATOS

Actualiza todas las filas en una tabla o vista

Set se puede filtrar con la clusula WHERE

Set se puede definir con la clusula JOIN

Solo las columnas especificadas en la clusula SET son modificadas

UPDATE NombreDeLaTablaModificar

SET NombreDeLosCamposModificar =

WHERE PredicadoDeRestriccin =

Ejemplo

UPDATE Production.Products

SET untiprice = (unitprice * 1.04)

WHERE categoryid = 1 AND discounto = 0;

No se debe de hacer un UPDATE sin la clusula WHERE, ya que esto lo que hara es actualizar
todos los registros de la tabla en lugar de actualizar nicamente el registro que se desea modificar.

La clusula WHERE filtra y condiciona solamente aquellos elementos o campos de los cuales se
realizar la actualizacin.

Para actualizar datos de una tabla con respecto a otra se utiliza la funcin JOIN.

UTILIZAR MERGE PARA MODIFICAR DATOS

MERGE modifica los datos basndose en una condicin:

Cuando la fuente coincide con el objetivo

Cuando la fuente no tiene igual en el objetivo


Cuando el objeto no tiene igual en la fuente

La instruccin MERGE hace una comparacin entere 2 tablas, por lo que se tiene una tabla
objetivo y una tabla fuente, mediante estas tablas se realiza la comparacin. Tambin es posible
condicionar mediante la clusula WHEN siempre y cuando:

Las tablas coincidan

Las tablas no coincidan o exista alguna diferencia de la tabla fuente con la tabla objetivo

Las tablas no coincidan o exista alguna diferencia entre la tabla objetico con la tabla
fuente.

MERGE INTO Tabla Objetivo AS AliasAsignado

USING (SELECT <lista_seleccionada>) Tabla Fuente AS AliasAsignado

ON (TablaObjetivo.Col1 = TablaFuente.col1)

WHEN MATCHED THEN

UPDATE SET col2 = TablaFuente.col2

WHEN NOT MATCHED THEN

INSERT (<Lista_de_columnas>)

VALUES (<Lista_de_valores_agregar>);

USO DE DELETE PARA ELIMINAR LOS DATOS

Cuando se utiliza la instruccin DELETE sin agregar la clusula WHERE, eliminar todos los registros
de una tabla

DELETE FROM NombreTabla;

La clusula WHERE se utiliza para especificar que registros o filas se desean eliminar

DELETE FROM NombreTabla

WHERE PredicadoDeRestriccin

UTILIZAR TRUNCATE TABLE PARA ELIMINAR DATOS

La instruccin TRUNCATE TABLE borra la tabla complemente

El almacenamiento fsico es desalojado, no es removida cada fila individualmente

Mnimamente conectado

Se puede revertir si TRUNCATE se hace en una transaccin


La instruccin TRUNCATE TABLE fallar si la tabla est referenciada por una restriccin de clave
externa de otra tabla.

TRUNCATE TABLE NombreTabla;

En otras palabras, la instruccin TRUNCATE TABLE borra en bloque, es decir, no registra fila por fila
lo que ha borrado, sino que lo toma como un bloque.

No se puede agregar la clusula WHERE, ya que TRUNCATE TABLE borra todo

GENERACIN DE NMEROS

USO DE IDENTITY

La propiedad IDENTITY de una columna genera nmeros secuenciales automticamente para la


insercin en una tabla

Puede especificar valores de inicializacin e incremento opcionales

Slo en una columna de una tabla puede existir la propiedad IDENTITY definida

La columna IDENTITY se omite en la instruccin INSERT

La funcin @@IDENTITY devuelve el ultimo valor generado

CREATE TABLE NombreTabla(NombreColumna1 TipoDeVariable


IDENTITY(SecuenciaDeSaltos), NombreColumna2 ..., NombreColumna3 ...,
NombreColumnaX ..);

Ejemplo:

CREATE TABLE Prodcution.Products(Productid INT IDENTITY(1,1) NOT NULL, Productname


nvarchar(40) NOT NULL, categoryid INT NOT NULL, unitprice MONEY NOT NULL);

USO DE SEQUENCES

SEQUENCE es un objeto agregado en SQL Server 2012

Es un objeto independiente en la base de datos

Es ms flexible que la propiedad IDENTITY

Puede ser usado como un valor por defecto para una columna

Se administra con las clusulas CREATE/ALTER/DROP

Devuelve el valor con la clusula NEXT VALUE FOR


--Definiendo un SEQUENCE

CREATE SEQUENCE NombreTabla AS TipoDeValor START WITH NmeroConQueInicia

INCREMENT BY NmeroConQueIncremente

Ejemplo

CREATE SEQUENCE dbo.InvoiceSq AS INT START WITH 1

INCREMENT BY 1;

--Recuperar el siguiente valor de SEQUENCE

SELECT NEXT VALUE FOR NombreTabla

Ejemplo

SELECT NEXT VALUE FOR dbo.InoiceSeq;

EJEMPLO
-- INSERT Basico

INSERT INTO dbo.Customers (CustomerID, CompanyName, ContactName, ContactTitle, Country)

VALUES ('VHCV1', 'VISOAL','VICTOR CARDERNAS', 'ING','GUATEMALA'),

('OEAR1','GALILEO','OSACAR ACUA', 'ING', 'GUATEMALA');

-- CREAR UN OBJETO A PARTIR DE DATOS DE UNA TABLA

SELECT *

INTO CustomersDemos

FROM dbo.Customers;

-- Comprobar si existe CustomersDemo

SELECT * FROM CustomersDemos;

-- Consltando diseo de CustomersDemos

sp_help CustomersDemos

-- Borrando datos os registros de CustomersDemos

DELETE FROM CustomersDemos;


-- Insertando datos por medio de un select

INSERT INTO
CustomersDemos(CustomerID,CompanyName,ContactName,ContactTitle,[Address],City,Region,Po
stalCode,Country,Phone,

Fax)

SELECT
CustomerID,CompanyName,ContactName,ContactTitle,[Address],City,Region,PostalCode,Country,
Phone,

Fax FROM Customers;

-- UPDATE

UPDATE dbo.Customers SET city = 'Quetzaltenango'

WHERE Country = 'Guatemala';

SELECT customerid, companyname, country, city FROM dbo.Customers

WHERE Country = 'Guatemala';

-- Actualizar datos de una tabla con respecto a otra

/* Actualizando datos de todas las ordenes de los clientes de Brazil a la fecha del da de hoy*/

UPDATE O SET OrderDate = GETDATE()

FROM dbo.Customers AS C

INNER JOIN dbo.Orders AS O

ON C.CustomerID = O.CustomerID

WHERE C.country = 'Brazil';

SELECT C.customerid, c.companyname, c.country, o.orderid, o.orderdate FROM dbo.Customers AS


C

INNER JOIN dbo.Orders AS O

ON C.CustomerID = O.CustomerID

WHERE C.Country = 'Brazil';


-- Instruccin DELETE

DELETE FROM dbo.Customers

WHERE Country = 'Guatemala';

SELECT * FROM dbo.Customers

WHERE Country = 'Guatemala';

-- Eliminar todos los detalles de orden, en donde los detalles de orden tengan la fecha de hoy

DELETE D

FROM dbo.Orders AS O

INNER JOIN dbo.[Order Details] AS D

ON O.OrderID = D.OrderID

WHERE CAST (O.OrderDate AS DATE) = '17-04-2017';

SELECT O.orderid, O.orderdate, D.productid, D.quantity, D.unitprice FROM dbo.Orders AS O

INNER JOIN dbo.[Order Details] AS D

ON O.OrderID = D.OrderID

WHERE CAST (O.OrderDate AS DATE) = '17-04-2017';

-- Instruccin MERGE

-- Creando tabla destino

SELECT *

INTO ClientesA

FROM dbo.Customers

-- Creando Tabla fuente

SELECT *

INTO ClientesB

FROM dbo.Customers;
-- Modificando tabla destino

DELETE ClientesA WHERE CustomerID LIKE 'a%'

DELETE ClientesA WHERE CustomerID LIKE 'b%'

DELETE ClientesA WHERE CustomerID LIKE 'c%'

DELETE ClientesA WHERE CustomerID LIKE 'd%'

UPDATE ClientesA SET CompanyName = 'no definido'

WHERE CompanyName LIKE 'f%'

UPDATE ClientesA SET ContactName = 'no definido'

WHERE CompanyName LIKE 'f%'

UPDATE ClientesA SET ContactName = 'no definido'

WHERE CustomerID LIKE 'f%'

-- Comparando tablas

SELECT * FROM ClientesA

SELECT * FROM ClientesB

-- MERGE

MERGE INTO dbo.ClientesA AS A

USING dbo.CLientesB AS B

ON A.customerid = B.Customerid

WHEN MATCHED THEN

UPDATE SET A.Companyname = B.companyname, A.COntactname = B.contactname,


A.COntactTitle = B.contactTitle,

A.country = B.country

WHEN NOT MATCHED THEN

INSERT (Customerid, Companyname, Contactname, ContactTitle, Country)

VALUES (B.Customerid, B.COmpanyname, B.Contactname, B.ContactTitle, B.Country)

WHEN NOT MATCHED BY SOURCE THEN

DELETE;
-- Instruccion TRUNCATE

TRUNCATE TABLE dbo.CustomersDemos;

select * from CustomersDemos

--Identity y Sequence

CREATE TABLE Test1(codigo INT IDENTITY(5,5) PRIMARY KEY, Nombre NVARCHAR(100));

INSERT INTO Test1(nombre)

VALUES('Rodrigo'),

('Alberto'),

('Jose'),

('Juan'),

('Homero');

SELECT * FROM Test1;

SELECT @@IDENTITY;

--Sequence

CREATE SEQUENCE Numerador

AS INT

START WITH 5

INCREMENT BY 5

CREATE TABLE Test2(codigo int, Nombre NVARCHAR(100));

INSERT INTO Test2(codigo, Nombre)

VALUES(NEXT VALUE FOR Numerador,'Rodrigo'),


(NEXT VALUE FOR Numerador,'Alberto'),

(NEXT VALUE FOR Numerador,'Jose'),

(NEXT VALUE FOR Numerador,'Juan'),

(NEXT VALUE FOR Numerador,'Homero');

SELECT * FROM Test2;

CREATE TABLE Test3(codigo INT PRIMARY KEY DEFAULT(NEXT VALUE FOR Numerador), Nombre
NVARCHAR(100));

INSERT INTO Test3(Nombre)

VALUES('Rodrigo'),

('Alberto'),

('Jose'),

('Juan'),

('Homero');

SELECT * FROM Test3;


USO DE FUNCIONES INCORPORADAS

ESCRIBIR CONSULTAS CON FUNCIONES INCORPORADAS

TIPOS DE FUNCIONES INTEGRADAS EN SQL SERVER

Las funciones de SQL Server se pueden clasificar por el alcance de entrada y salida y por el tipo de
salida:

Categora de la Funcin Descripcin


Escalar Opera en una sola fila, devuelve un solo valor
Toma uno o ms valores, pero retorna solo un
Agregado de Grupo
valor resumido o sumarizado
De Ventana Opera en una ventana (conjunto) de filas
Devuelve una tabla virtual que se puede
Conjunto de Filas utilizar posteriormente en un comunicado de
T-SQL

FUNCIONES ESCALARES

Operan sobre los elementos de una sola fila como entrada, y devuelven un solo valor como salida.

Devuelven un solo valor de es escalar

Puede ser utilizado como una expresin de consulta

Puede llegar a ser determinista o No determinista

La intercalacin depende del valor de entrada o de la intercalacin predeterminada de la base de


datos

Categora de la Funcin Escalar


Configuracin
Conversin
Cursor
Fecha y Tiempo
Lgico
Matemtico
Metadato
Seguridad
String
Sistema
Estadstica de sistema
Texto e Imagen
FUNCIONES DE AGREGADO

Son funciones que operan sobre conjuntos o filas de datos

Resumen las filas de datos o conjuntos de entrada, devolviendo un nico resultado

Sin la clusula GROUP BY, todas las filas se encuentran como un grupo

Ejemplo

SELECT (*) AS numerodelineas, SUM(qty*unitprice) AS totalsales

FROM Sales.OrderDetails;

numerodelineas Totalsales
2155 56500.91

Las funciones de agregado, como su nombre lo indica agrupa los elementos que tengan la misma
categora y los resume en un nico resultado.

FUNCIONES DE VENTANA

Realizan operaciones para un conjunto de datos, el conjunto de datos es a lo que se le llama


ventana

Esta funcin a diferencia de las Funciones de Agregado que crean una fila resumen o resumida,
devuelven el mismo conjunto de filas aadiendo una columna extra la cual realiza una operacin,
dicha operacin tiende a variar ya que normalmente se utiliza en combinacin con una funcin.
Una Funcin de Venta debe tener la instruccin OVER, as mismo sobre esta funcin se puede
utilizar otras funciones tal es el caso de RANKING, OFFSET, FUNCIONES DE AGREGADO Y

FUNCIONES DE DISTRIBUCIN

Las funciones se aplican a una ventana o conjunto de datos

Incluye las funciones RANKING, OFFSET, FUNCIONES DE AGREGADO Y DISTRIBUCIN

Ejemplo

SELECT TOP(5) productid, productname, unitprice, RANK() OVER(ORDER BY


unitprice DESC) AS rankbyprice

FROM Production.Products

ORDER BY rankbyprice;
Productid Productname Unitprice Rankbyprice
8 Product QDOMO 263.50 1
29 Product VJXYN 123.79 2
9 Product AOZBW 97.00 3
20 Product QHFFP 81.00 4

FUNCIONES DE CONJUNTO DE FILAS

Devuelve un objeto que se puede utilizar como una tabla, en una declaracin de T-SQL

Incluye OPENDATASOURCE, OPENQUERY, OPENROWSET y OPENXML

En otras palabras, devuelven un conjunto de resultados, es decir devuelve una consulta o query,
de donde los datos que se tomarn varan, por ejemplo, si los datos son tomados de una variable
XML debemos utilizar OPENXML.

Para OPENQUERY Y OPENROWSET, se pueden tomar datos de otro servidor.

En cuanto a OPENDATASOURCE, se pueden tomar datos de un archivo plano.

Y en forma resumida su funcin principal es extraer los datos del origen y devolverlos en forma de
una consulta o query.

USO DE LAS FUNCIONES DE CONVERSIN

TIPOS DE DATOS CONVERSIONES IMPLCITAS Y EXPLCITAS

Las conversiones implcitas ocurren de forma automtica

Sigue las reglas de precedencia de tipos de datos

Se usan conversiones explicitas cuando:

La conversin implcita falla o no es permitida

Para anular la presencia del tipo de dato

Para convertir de forma Explcita entre tipos de datos se debe utilizar las funciones CAST o
CONVERT

CONVERSIN CON CAST

Convierte valores de un tipo de dato a otro

Puede ser usado en las clusulas SELECT y WHERE

Es un estndar ANSI

Su sintaxis es la siguiente:

CAST <valor> AS <tipo de dato>


Retornar un error si el tipo de dato es incompatible, como, por ejemplo:

SELECT CAST(SYSDATETIME() AS DATE);

--attempt to convert datetime2 to int

SELECT CAST(SYSDATETIME() AS INT);

Msg 529, Level 16, State 2, Line 1

Explicit conversion from data type datetime2 to int is not allowed

CONVERSIN CON CONVERT

Convierte valores de un tipo de dato a otro

Puede ser usado en las clusulas SELECT Y WHERE

CONVERT es especifico de SQL Server, no est basado sobre un estndar

El ESTILO o STYLE especifica cmo se convierte el valor de entrada:

Fecha, hora, numrico, XML, etc.

Su sintaxis es la siguiente:

CONVERT(<tipo de dato>, <valor>, <opcional estilo o style>)

Ejemplo

CONVERT(CHAR(8), CURRENT_TIMESTAMP,112) AS ISO_Style;

ISO_style
20170419
De igual forma que la funcin CAST, al momento de no poder realizar una conversin, se devolver
un error indicando porque no es posible realizar la conversin.

CONVERSIN DE CADENAS CON PARSE

PARSE es una nueva funcin en SQL Server 2012

Convierte texto a fecha, tiempo, y tipos de nmero

Elementos PARSE Comentarios


STRING_VALUE Formato NVARCHAR(4000) de entrada
DATA_TYPE Requiere un tipo de dato de salida
CULTURE Opcional un STRING en .NET CULTURE de: en-
US, es-ES, ar-SA, y as susecivamente
Ejemplo

PARSE (STRING_VALUE AS DATA_TYPE [USING CULTURE]);

SELECT PARSE ('02/12/2012' AS DATETIME2 USING 'en-US') AS Parse_Result;

CONVERSIN CON TRY_PARSE Y TRY_CONVERT

TRY_PARSE y TRY_CONVERT

Nuevo en SQL Server 2012

Devuelve los resultados de una conversin de tipos de datos

Como PARSE y CONVERT, convierte cadenas de texto a fecha, tiempo y valores


numricos

A diferencia de PARSE y CONVERT, retornar NULL si la conversin falla o no es


posible realizarla

Ejemplo

SELECT TRY_PARSE('SQLServer' AS DATETIME2 USING 'en-US') AS


Try_Parse_Result;
Try_Parse_Result
NULL

USO DE LAS FUNCIONES LGICAS

ESCRIBIR PRUEBAS LGICAS CON FUNCIONES

ISNUMERIC prueba si una expresin de entrada es un tipo de dato numrico vlido

Devuelve 1 cuando la entrada se evala como cualquier tipo numrico vlido, incluyendo
FLOAT y MONEY

Devuelve 0 en caso contrario

Ejemplo

SELECT ISNUMERIC('SQL') AS Isnumeric_result;

isnumeric_result
0

SELECT ISNUMERIC('101.99') AS isnumeric_result;

isnumeric_result

1
REALIZAR PRUEBAS CONDICIONALES CON IIF

IIF devuelve uno de los dos valores, dependiendo de la prueba lgica

Abreviatura de una expresin CASE de dos resultados

Elementos IIF Comentarios


Prueba lgica que evala TRUE, FALSE o
BOOLEAN_EXPRESION
UNKNOW
Valor retornado si la expresin evaluada es
TRUE_VALUE
verdadera
Valor retornado si la expresin evaluada es
FALSE_VALUE
falsa (FALSE) o desconocida (UNKNOW)

Ejemplo

SELECT CHOOSE(3, 'Beverages', 'Condiments', 'Confections') AS choose_result

choose_result
Confections

CHOOSE es una funcin de eleccin, en base al primer parmetro el cual indica que opcin se
elegir dentro de una lista de elecciones posibles, en el orden establecido.

La funcin CHOOSE

USO DE LAS FUNCIONES PARA TRABAJAR CON NULL

LA CONVERSIN DE NULL CON ISNULL

ISNULL reemplaza el NULL con un valor especifico

No es estndar; caso contrario de COALESCE el cual si es estndar

Su sintaxis es la siguiente:

Elementos INULL Comentarios


EXPRESION_TO_CHECK Devuelve la misma expresin si no es NULL
REPACEMENT_VALUE Devuelve esta expresin si es NULL

Ejemplo

SELECT custid, city, ISNULL(region, 'N/A') AS region, country

FROM Sales.Customers;

custid city region Country


7 Strasbourg N/A France
9 Marseille N/A France
32 Eugene OR USA
43 Walla Walla WA USA
45 San Francisco CA USA

Esta funcin permite reemplazar un valor NULL o nulo por un elemento que es escogido a nuestra
propia eleccin.

UTILIZAR COALESCE PARA DEVOLVER NULL SI LOS VALORES COINCIDEN

COALESCE retorna el primer valor no nulo de una lista de valores

Con slo dos argumentos, COALESCE se comporta como ISNULL

Si todos los argumentos son NULL, COALESCE devuelve NULL

COALESCE es un estndar ANSI

Ejemplo

SELECT custid, country, region, city, country+','+ COALESCE(region, '')+','+city AS


location

FROM Sales.Customers;

Resultado:

Custid Country Regin City Location


17 Germany NULL Aachen Germany, Aachen
65 USA NM Albuquerque USA, Albuquerque
55 USA AK Anchorage USA, Anchorage
83 Denamark NULL Arthus Denamark, Arthus

UTILIZAR NULLIF PARA DEVOLVER NULL SI LOS VALORES COINCIDEN

NULLIF compara dos expresiones

Devuelve NULL si ambos argumentos son iguales

Devuelve el primer argumento si los dos argumentos no son iguales

Emp_id Goal Actual


1 100 110
2 90 90
3 100 90
4 100 80
Ejemplo

SELECT emp_id, NULLIF(actual,goal) AS actual_if_different

FROM dbo.employee_goals;

emp_id actual_if_different
1 100
2 NULL
3 90
4 80

Esta funcin compara 2 valores, de ser ambos argumentos iguales devuelve un nulo o NULL, caso
contrario si los argumentos no son iguales devolver el primer valor o el primer argumento.

EJEMPLO
---- FUNCIONES DE AGREGADO

SELECT GETDATE();

GO

SELECT SUM(unitprice) FROM Products

SELECT CategoryName,SUM(unitprice) FROM Products AS P

INNER JOIN Categories AS C

ON C.CategoryID = P.CategoryID

GROUP BY C.Categoryname;

SELECT CONVERT(CHAR(8), CURRENT_TIMESTAMP,112) AS ISO_style;

-- Conversiones

SELECT productname+' '+CAST(unitprice AS NVARCHAR(100)) FROM dbo.Products;

SELECT productname+' '+CONVERT(NVARCHAR(100),unitprice) FROM dbo.Products;

SELECT GETDATE() AS UnconvertDateTime, CAST(GETDATE() AS NVARCHAR(30)) AS UsingCast,

CONVERT(NVARCHAR(30),GETDATE(), 126) AS UsingConvertTo_ISO8601;


--- PARSE

SELECT PARSE('Monday 13 DECEMBER 2010' AS DATETIME2 USING 'en-US') AS Resultado;

-- TRY_PARSE

SELECT TRY_PARSE('Lunes 13 DECEMBER 2010' AS DATETIME2 USING 'en-US') AS Resultado;

SET LANGUAGE 'English';

SELECT PARSE('12/16/2010' AS DATETIME2) AS RESULT;

-- TRY_CONVERT

SELECT GETDATE() AS UnConvertedDateTime,

CAST(GETDATE() AS nvarchar(30)) AS UsingCast,

TRY_CONVERT(varchar(30), GETDATE(), 567) AS UsingConvertTo_ISO8601;

-- CHOOSE

SELECT productname, unitprice, categoryid,

CHOOSE(CategoryID, 'Beverages','Condiments','COnfections','Dairy
Products','Grains/Cereals','Meat/Poultry','Produce',

'Seafood')

FROM Products;

-- IIF

SELECT productname, unitprice, IIF(unitprice > 35, 'Producto Caro','Producto Normal') AS estado,

categoryid, CHOOSE(CategoryID, 'Beverages','Condiments','COnfections','Dairy Products',

'Grains/Cereals','Meat/Poultry','Produce','Seafood')

FROM Products;

--ISNULL

SELECT companyname, ISNULL(region,'No existe'), Region, Country FROM Customers;


AGRUPACIN Y AGREGACIN DE DATOS

USO DE LAS FUNCIONES DE AGREGADO

TRABAJAR CON FUNCIONES DE AGREGADO

Las funciones de agregado:

Retornan un valor escalar (sin nombre de columna)

Ignora los valores nulos o NULL a excepcin de la funcin COUNT(*)

Puede ser usado en:

Las clusulas SELECT, HAVING Y ORDER BY

Frecuentemente es usado con la clusula GROUP BY

Ejemplo

SELECT AVG(unitprice) AS avg_price, MIN(qty) AS min_qty, MAX(discount) AS


max_discount

FROM Sales.OrderDetails;

avg_price min_qty max_discount


26.2185 1 0.250

Las funciones de agregado se encargan de sumarizar un conjunto de datos, devolviendo


nicamente un solo valor escalar, lo retorna sin un nombre de columna por lo que es
recomendado asignar un Alias a la columna.

FUNCIONES INCORPORADAS DE AGREGADO


Comunes Estadsticas Otras
SUM STDEV CHECKSUM_AGG
MIN STDEVP GROUPING
MAX VAR GROUPING_ID
AVG VARP
COUNT
COUNT_BIG

UTILIZANDO DISTINCT CON FUNCIONES DE AGREGADO

Se utiliza DISTINCT con funciones de agregado para sumarizar nicamente valores nicos

DISTINCT como agregado elimina los valores duplicados, no las filas (a diferencia de SELECT
DISTINCT)
Hace una comparacin con resultados parciales

Ejemplo:

SELECT empid, YEAR(orderdate) AS orderdateyear, COUNT(custid) AS all_custs,


COUNT(DISTINCT custid) AS unique_custs

FROM Sales.Orders

GROUP BY empid, YEAR(orderdate);

Empid Orderyear all_custs unique_custs


1 2006 26 22
2 2007 55 40
3 2008 42 32
4 2006 16 15

Al colocar la instruccin DISTINCT dentro de una funcin de agregado, contar nicamente


elementos nicos de la columna en mencin.

USO DE FUNCIONES DE AGREGADO CON NULL

La mayora de las funciones de agregado ignoran los valores nulos o NULL

COUNT(<columna>) --> ignora los valores nulos o NULL

COUNT(*) --> Cuenta todas las filas incluyendo los valores nulos o NULL

Los valores NULL pueden producir resultados incorrectos

Se debe utilizar ISNULL o COALESCE para reemplazar los valores nulos o NULL antes de la
agregacin

Ejemplo:

SELECT AVG(c2) AS AvgWithNULLs, AVG(COALESCE(c2)) AS AvgWithNULLReplace

FROM dbo.t2;

USO DE LA CLUSULA GROUP BY

USO DE CLUSULA GROUP BY

La clusula GROUP BY permite tomar un conjunto de datos, los resume y los muestra, esto
utilizando una funcin de agregado como SUM, COUNT, etc.

GROUP BY crea grupos de filas de salida, de acuerdo con una combinacin nica de los valores
especificados dentro de dicha clusula
SELECT <Lista_Seleccionada>

FROM <Tabla_fuente>

WHERE <Condicin_busqueda>

GROUP BY <Lista_GroupBy>

GROUP BY calcula un valor de resumen para las funciones de agregado en fases posteriores

Ejemplo:

SELECT empid, COUNT(*) AS cnt

FROM Sales.Orders

GROUP BY empid;

El detalle de las filas se perdi, despus que se procesa la clusula GROUP BY

GROUP BY Y EL ORDEN LOGICO DE LAS OPERACIONES


Orden Lgico Fases Comentario
5 SELECT
1 FROM
2 WHERE
3 GROUP BY Crea grupos
4 HAVING Opera en grupos
6 ORDER BY

Si una consulta utiliza la clusula GROUP BY, todas las fases posteriores operan en los grupos, no
en las filas de origen

HAVING, SELECT y ORDER BY, deben devolver un solo valor por grupo

Todas las columnas de SELECT, HAVING y ORDER BY, deben aparecer en la clusula GROUP BY o
ser recursos para agregar expresiones

La instruccin HAVING sirve para filtrar datos y bsicamente funciona como la clusula WHERE con
la diferencia que esta se utiliza nicamente despus de hacer uso de la clusula GROUP BY.
FLUJO DE TRABAJO DE GROUP BY

SELECT ordeid, empid, custid


FROM Sales.Orders;

Orderid Empid Custid Orderid Empid Custid


10463 6 1 10463 6 1
10692 4 1 10692 4 1
10926 4 2
WHERE custid IN(1,2) 10926 4 2
10925 3 2
10365 3 3 10925 3 2

GROUP BY empid

Empid COUNT(*)
6 1
4 2
3 1
USO DE GROUP BY CON FUNCIONES DE AGREGADO

Las funciones de agregacin se utilizan comnmente en la clusula SELECT, y lo que hacen es


resumir por grupo

Ejemplo:

SELECT custid, COUNT(*) AS cnt

FROM Sales.Orders

GROUP BY custid;

Las funciones de agregacin pueden referirse a cualquier columna, no slo a las de la clusula
GROUP BY

Ejemplo:

SELECT productid, MAX(qty) AS largest_order

FROM Sales.OrderDetails

GROUP BY productid;
FILTRADO CON HAVING

FILTRADO DE DATOS AGRUPADOS USANDO LA CLUSULA HAVING

Having filtra los datos una vez se ha utilizado la clusula GROUP BY, est clausula es obligatoria
usarla cuando dentro de la consulta tenemos funciones de agregado. Mientras tanto la clusula
WHERE filtra nicamente por filas.

La clusula HAVING proporciona una condicin de bsqueda que cada grupo debe satisfacer

La clusula HAVING se procesa despus de la clusula GROUP BY

Ejemplo:

SELECT custid, COUNT(*) AS count_orders

FROM Sales.Orders

GROUP BY custid

HAVING COUNT(*) > 10;

Es importante recalcar que la clusula HAVING no admite alias, por lo que se debe aadir la
funcin de agregado completa para realizar un filtro de datos.

COMPARANDO HAVING CON WHERE

El utilizar una expresin COUNT(*) en la clusula HAVING es til para resolver problemas
empresariales comunes

Mostrar solo los clientes que han colocado ms de una orden:

SELECT C.custid, COUNT(*) AS cnt

FROM Sales.Customers AS C

JOIN Sales.Orders AS O

ON C.custid = O.custid

GROUP BY C.custid

HAVING COUNT(*) > 1;

Mostrar slo los productos que aparecen en 10 o ms ordenes:

SELECT P.productid, COUNT(*) AS cnt

FROM Priduction.Products AS P

JOIN Sales.OrderDetails AS OD
ON P.productid = OD.productid

GROUP BY P.productid

HAVING COUNT(*) >= 10;

COUNT(*) es la nica instruccin que permite devolver el nmero de filas completo, ya que esta
instruccin es la nica que permite contar los valores nulos o NULL, por lo que muestra el nmero
real de registros.

EJEMPLO
--- FUNCIONES DE AGREGADO con NULL

SELECT COUNT(*) FROM Customers

SELECT COUNT(fax) FROM Customers

SELECT COUNT(ISNULL(fax,0)) FROM Customers

--- DISTINCT en Funciones de Agregado

SELECT COUNT(country) FROM Customers

SELECT COUNT(DISTINCT country) FROM Customers

---- Clusula GROUP BY y HAVING

SELECT C.companyname, C.country, SUM(D.quantity * D.unitprice) AS total, COUNT(O.OrderID) AS


conteodetalle

FROM dbo.Customers AS C

INNER JOIN dbo.Orders AS O

ON C.CustomerID = O.CustomerID

INNER JOIN [Order Details] AS D

ON D.OrderID = O.OrderID

GROUP BY C.CompanyName, C.Country

HAVING SUM(D.Quantity * D.UnitPrice) > 25000;

---- HAVING

SELECT country, COUNT(*) AS numero FROM dbo.Customers


GROUP BY Country

HAVING COUNT(*) > 7;

-- Instruccion COUNT(*)

SELECT country, COUNT(*) AS numero FROM dbo.Customers

GROUP BY Country

SELECT country, COUNT(fax) AS numero FROM dbo.Customers

GROUP BY Country;
SUB-CONSULTAS o SUBQUERYS
ESCRIBIR SUBCONSULTAS AUTOCONTENIDAS

TRABAJAR CON SUBCONSULTAS

Las subconsultas son consultas anidadas, es decir que son consultas dentro de otras consultas

Los resultados de la consulta interna pasan a la consulta externa

Consulta interna acta como una expresin de la perspectiva de la consulta


externa

Las subconsultas pueden ser autnomas o correlacionadas

Las subconsultas correlacionadas dependen de los valores de la consulta externa

Es decir, las consultas se ejecutan de forma independiente o por separado y


mediante un IN en una clusula WHERE se puede filtrar la consulta externa sin que
estas tengan correlacin entre s.

Las subconsultas pueden ser escalares, de mltiples valores o con valores de tabla.

ESCRIBIR SUBCONSULTAS ESCALARES

Las sub-consultas escalares devuelven un solo valor de la consulta externa

Puede ser utilizada en cualquier lugar como expresin de un solo valor: SELECT, WHERE, etc.

Ejemplo:

SELECT orderid, productid, unitprice, qty

FROM Sales.OrderDetails

WHERE orderid = (SELECT MAX(orderid) AS lastorder FROM Sales.Orders);

Si la consulta interna devuelve un conjunto vaco, el resultado se convierte en un valor NULL

La construccin de la consulta externa determina se la consulta interna debe devolver un solo


valor.

ESCRIBIR SUBCONSULTAS DE MULTIPLES VALORES

Una sub-consulta multivalor devuelve varios valores como un nico conjunto de columnas a la
consulta externa
Se utiliza el predicado IN

Si algn valor en el resultado de la sub-consulta coincide con la expresin de


predicado IN, el predicado devuelve TRUE

Ejemplo:

SELECT custid, orderid

FROM Sales.Orders

WHERE custid IN (SELECT custid FROM Sales.Customers WHERE country =

N'Mexico');

Tambin puede ser expresado como un JOIN.

ESCRIBIR SUBCONSULTAS CORRELACIONADAS

TRABAJAR CON SUBCONSULTAS CORRELACIONADAS

Las subconsultas correlacionadas hacen referencia a elementos de las tablas utilizadas en la


consulta externa

Depende de la consulta externa, no puede ser ejecutada por separado

Ms difcil de probar que las subconsultas autnomas

Se comportan como si la consulta interna se ejecutara una vez por cada fila exterior

Puede regresar un valor escalar o mltiples valores

Ejemplo:

SELECT orderid, empid, orderdate

FROM Sales.Orders AS O1

WHERE orderdate =

(SELECT MAX(orderdate)

FROM Sales.Orders AS O2

WHERE O2.empid = O1.empid)

ORDER BY empid, orderdate

ESCRIBIR SUBCONSULTAS CORRELACIONADAS

Se escribe la consulta interna para aceptar un valor de entrada de la consulta externa

Se escribe la consulta externa para aceptar un valor apropiado (escalar o de mltiples valores)
Son correlacionadas porque se pasa el valor de la consulta externa para que coincida con el
argumento de la consulta interna

Ejemplo:

SELECT custid, orderid, orderdate

FROM Sales.Orders AS outerorders

WHERE orderdate =

(SELECT MAX(orderdate)

FROM Sales.Orders AS innerorders

WHERE innerorders.custid = outerorders.custid)

ORDER BY custid;

UTILIZAR EL PREDICADO EXISTS EN SUBCONSULTAS

TRABAJAR CON EXISTS

Cuando en una subconsulta se utiliza la palabra calve EXISTS, funciona como una prueba de
existencia

Verdadero o Falso solamente, es decir no pasa valores a la consulta externa

EXISTS devuelve VERDADERO o FALSO (ms no devuelve UNKNOW)

Si las filas son devueltas por la subconsulta, EXISTS devolver TRUE

Si no son devueltas las filas, EXISTS devolver FALSE

Sintaxis:

WHERE [NOT] EXISTS (subconsulta);

ESCRIBIR SUBCONSULTAS USANDO EXISTS

La palabra clave EXISTS no consigue un nombre de columna u otra expresin

La lista SELECT de una subconsulta introducida por EXISTS normalmente slo utiliza un asterisco
(*)

Ejemplo:

SELECT custid, comapnyname

FROM Sales.Customers AS C
WHERE EXISTS (

SELECT * FROM Sales.Orders AS O

WHERE C.custid = O.custid);

SELECT custid, compnayname

FROM Sales.Customers AS C

WHERE NOT EXISTS (

SELECT * FROM Sales.Orders AS O

WHERE C.custid = O.custid);

EJEMPLO
--Subconsultas devolviendo un valor escalar (nico)

SELECT productname, UnitPrice, (SELECT AVG(UnitPrice) FROM dbo.Products) AS Promedio,

(SELECT AVG(UnitPrice) FROM dbo.Products) - unitprice AS Desviacion

FROM dbo.Products

-- Subconsulta como expresion para que se filtre

SELECT customerid, companyname, contactname, country

FROM dbo.Customers WHERE CustomerID IN ('ALFKI','PARIS');

SELECT customerid, companyname, contactname, country

FROM dbo.Customers WHERE CustomerID IN (SELECT DISTINCT customerid FROM dbo.Orders);

-- Subconsulta Correlacionada

SELECT C.CustomerID, C.CompanyName, C.ContactName, C.Country

FROM dbo.Customers AS C

WHERE EXISTS (SELECT O.customerid FROM Orders AS O WHERE C.CustomerID = O.CustomerID);

-- Consulta Macro de Ventas

SELECT C.country, C.CompanyName, C.CustomerID, O.orderid, O.orderdate,


DATEPART(YYYY,O.OrderDate) AS ao,

DATEPART(mm,O.OrderDate) AS mes, P.productname, D.unitprice, D.quantity, D.unitprice *


D.quantity AS parcial
FROM dbo.Customers AS C

INNER JOIN dbo.Orders AS O

ON C.CustomerID = O.CustomerID

INNER JOIN dbo.[Order Details] AS D

ON D.OrderID = O.OrderID

INNER JOIN dbo.Products AS P

ON D.ProductID = P.ProductID

-- Subconsulta de una consulta macro

SELECT T.ao, SUM(T.unitprice * T.quantity) AS total FROM

(SELECT C.country, C.CompanyName, C.CustomerID, O.orderid, O.orderdate,


DATEPART(YYYY,O.OrderDate) AS ao,

DATEPART(mm,O.OrderDate) AS mes, P.productname, D.unitprice, D.quantity, D.unitprice *


D.quantity AS parcial

FROM dbo.Customers AS C

INNER JOIN dbo.Orders AS O

ON C.CustomerID = O.CustomerID

INNER JOIN dbo.[Order Details] AS D

ON D.OrderID = O.OrderID

INNER JOIN dbo.Products AS P

ON D.ProductID = P.ProductID) AS T

GROUP BY T.ao

-- Consulta correlacionada / mostrar todas las ordenes donde se vendieron ms de 20 unidades del
producto con ID 23

SELECT O.orderdate, O.orderid, O.customerid

FROM dbo.Orders AS O

WHERE 20 < (SELECT D.quantity FROM dbo.[Order Details] AS D

WHERE O.OrderID = D.OrderID AND D.ProductID = 23);

SELECT * FROM dbo.[Order Details]

WHERE OrderID = 10543;


USO DE EXPRESIONES DE TABLA

Una expresin de tabla es una consulta o query que se ha creado, y este devuelve un conjunto de
datos, el cual se puede reutilizar, encapsulando toda la consulta en una VISTA, Comun Table
Expression.

USAR VISTAS

ESCRIBIR CONSULTAS QUE RETORNEN RESULTADOS DE VISTAS

Las vistas pueden ser referenciadas en una sentencia SELECT como una tabla

Las vistas se denominan expresiones de tabla con su definicin almacenadas en la base de datos

Al igual que las tablas derivadas y CTEs, consultas que utilizan VISTAS pueden proporcionar
encapsulamiento y simplificacin

Desde una perspectiva administrativa, las vistas pueden proporcionar una capa de seguridad a una
base de datos

SELECT <Lista del SELECT>

FROM <Nombre de la VISTA>

ORDER BY <Listas Ordenadas>

CREAR VISTAS SIMPLES

Las vistas guardan consultas creadas en una base de datos por los administradores y
desarrolladores

Las vistas se definen con una sola instruccin SELECT

La clusula ORDER BY no est permitida en una definicin de vista sin el uso de TOP, OFFSET /
FETCH o FOR XML

Para ordenar la salida, utilice ORDER BY en la consulta externa

La creacin de vistas admite opciones adicionales ms all del alcance de esta clase

CREATE Nombre_de_la_VISTA

AS

SELECT <Lista_del_SELECT>

FROM <Tabla_Fuente>
Ejemplo:

CREATE HR.EmpPhoneList

AS

SELECT empid, lastname, firstname, phone

FROM HR.Employees;

USAR FUNCIONES DE TABLA EN LINEA (TVFs)

ESCRIBIR CONSULTAS QUE UTILIZAN TVF EN LNEA

Los valores de tabla en lnea devuelven un conjunto de valores al igual que una vista

En otras palabras, se puede decir que una vista la cual recibe parmetros.

CREAR SIMPLES TVF EN LNEA

TVF son creados por los administradores y desarrolladores

Crea y Nombra una funcin y asigna parmetros opcionales con la instruccin CREATE FUNCTION

Declara el tipo de dato que retorna como tipo TABLE

Declara en lnea el SELECT que devuelve con la instruccin RETURN

Ejemplo:

CREATE FUNCTION Sales.fn_LineTotal(@orderid INT)

RETURNS TABLE

AS

RETURN

SELECT orderid, CAST((qty * unitprice * (1 - discount)) AS DECIMAL(8,2)) AS


line_total

FROM Sales.OrderDetails

WHERE orderid = @orderid;

RECUPERAR TVF EN LNEA

SELECT de la funcin

Use el nombre de dos partes


Pase los parmetros

Ejemplo:

SELECT orderid, line_total

FROM Sales.fn_LineTotal(10252) AS LT;

orderid line_total
10252 2462.40
10252 47.50
10252 1088.00

USAR TABLAS DERIVADAS

ESCRIBIR CONSUTLAS CON TABLAS DERIVADAS

Las tablas derivadas se llaman expresiones de consultas creadas dentro de una sentencia SELECT
externa

No se almacena en la base de datos. Representa una tabla relacional virtual

En caso de trasformacin, desempaquetado en consultas contra subyacentes objetos


referenciados

Permitir escribir ms bsquedas modulares

SELECT <Listado_de_columnas>

FROM (

<Definicin_de_la_tabla_derivada>) AS <Alias_de_la_tabla_derivada>

mbito de aplicacin de una tabla derivada es la consulta en la que se define

DIRECTRICES PARA TABLAS DERIVADAS

Necesario en las Tablas Derivadas Puede hacerse en las Tablas Derivadas


Utilizar Aliar internos o externos para las
Tener un Alias
columnas
Tienen nombres para todas las columnas Consultar los parmetros y / o variables
Tienen nombres nicos para todas las
Puede anidar en otras tablas derivadas
columnas
No utilizar una clusula ORDER BY (sin utilizar
antes TOP u OFFSET / FETCH)
No se hace referencia varias veces en la misma
consulta
USO DE ALIAS PARA NOMBRES DE COLUMNA EN TABLAS DERIVADAS

El Alias de la columna puede ser definido en Lnea

Ejemplo:

SELECT orderyear, COUNT(DISTINCT custid) AS cust_count

FROM (

SELECT YEAR(orderdate) AS orderyear, custid

FROM Sales.Orders) AS derived_year

GROUP BY orderyear;

El Alias de columna puede ser definido externamente

Ejemplo:

SELECT orederyear, COUNT(DISTINCT custid) AS cust_count

FROM (

SELECT YEAR(orderdate), custid

FROM Sales.Orders) AS derived_year(orderyear, custid)

GROUP BY orderyear;

PASAR ARGUMENTOS A TABLAS DERIVADAS

Las tablas derivadas pueden referirse a argumentos

Los argumentos pueden ser:

Variables declaradas en el mismo batch como la declaracin SELECT

Los parmetros pasan dentro de una funcin de valor de tabla o un procedimiento


almacenado

Ejemplo:

DECLARE @emp_id INT = 9;

SELECT orderyear, COUNT(orderdate) AS orderyear, custid

FROM (

SELECT YEAR(orderdate) AS orderyear, custid

FROM Sales.Orders
WHERE empid = @emp_id) AS derived_year

GROUP BY orderyear;

USAR EXPRESIONES DE TABLA COMUNES (CTEs)

ESCRIBIR CONSULTAS CON CTEs

CTEs son nombres de expresiones de tabla definidos en una consulta

CTEs son similares a las tablas derivadas en alcance y requerimientos de nombre

A diferencia de las tablas derivadas. los CTEs soportan multiples definiciones, multiples referencias
y recursin

WITH <Nombre_CTE>

AS (

<Definicin_CTE>

<Otra consulta referenciada CTE>;

Su funcin es dar nombre a una consulta, este no se almacena dentro de la base de datos a
diferencia de las vistas y funciones y sirve para ser utilizado dentro del mismo batch de
instrucciones.

CREAR CONSULTAS CON EXPRESIONES DE TABLA COMUN

Para crear un CTE se necesita:

Definir la expresin de tabla con la clusula WITH


Asignar un Alias a la columna (en lnea o externa)
Pasar los argumentos si se desea
Referenciar el CTE en la otra consulta

Ejemplo:

WITH CTE_year AS

SELECT YEAR(orderdate) AS orderyear, custid

FROM Sales.Orders

)
SELECT orderyear, COUNT(DISTINCT custid) AS cust_count

FROM CTE_year

GROUP BY orderyear;

EJEMPLO
--Vistas

CREATE VIEW DesgloseVentas

AS

SELECT C.country, C.CompanyName, C.CustomerID, O.orderid, O.orderdate,


DATEPART(YYYY,O.OrderDate) AS ao,

DATEPART(mm,O.OrderDate) AS mes, P.productname, D.unitprice, D.quantity, D.unitprice *


D.quantity AS parcial

FROM dbo.Customers AS C

INNER JOIN dbo.Orders AS O

ON C.CustomerID = O.CustomerID

INNER JOIN dbo.[Order Details] AS D

ON D.OrderID = O.OrderID

INNER JOIN dbo.Products AS P

ON D.ProductID = P.ProductID;

GO

SELECT orderid, SUM(UnitPrice*Quantity) AS total

FROM DesgloseVentas

GROUP BY OrderID

GO

-- Modificando una Vista

ALTER VIEW DesgloseVentas (pais, compaia, codigocliente, numeroorden, fechaorden, ao, mes,
nombreproducto, precio, cantidad, subtotal)

AS

SELECT C.country, C.CompanyName, C.CustomerID, O.orderid, O.orderdate,


DATEPART(YYYY,O.OrderDate) AS ao,
DATEPART(mm,O.OrderDate) AS mes, P.productname, D.unitprice, D.quantity, D.unitprice *
D.quantity AS parcial

FROM dbo.Customers AS C

INNER JOIN dbo.Orders AS O

ON C.CustomerID = O.CustomerID

INNER JOIN dbo.[Order Details] AS D

ON D.OrderID = O.OrderID

INNER JOIN dbo.Products AS P

ON D.ProductID = P.ProductID;

GO

SELECT * FROM DesgloseVentas;

GO

SELECT numeroorden, SUM(precio*cantidad) AS total

FROM DesgloseVentas

GROUP BY numeroorden;

GO

--Funciones de Tabla en Lnea

CREATE FUNCTION funcionVentas (@ao int)

RETURNS TABLE

AS

RETURN(SELECT C.country, C.CompanyName, C.CustomerID, O.orderid, O.orderdate,


DATEPART(YYYY,O.OrderDate) AS ao,

DATEPART(mm,O.OrderDate) AS mes, P.productname, D.unitprice, D.quantity, D.unitprice *


D.quantity AS parcial

FROM dbo.Customers AS C

INNER JOIN dbo.Orders AS O

ON C.CustomerID = O.CustomerID

INNER JOIN dbo.[Order Details] AS D

ON D.OrderID = O.OrderID

INNER JOIN dbo.Products AS P


ON D.ProductID = P.ProductID

WHERE DATEPART(YYYY,O.OrderDate) = @ao);

GO

SELECT * FROM funcionVentas (1998)

GO

--Funciones con valores de tabla de multiples instrucciones

CREATE FUNCTION ListaPorPais(@Pais VARCHAR(50))

RETURNS @Clientes TABLE

Customerid VARCHAR(10), Companyname VARCHAR(50),

Contactname VARCHAR(50), Country VARCHAR(50)

AS

BEGIN

INSERT @Clientes SELECT Customerid, Companyname, Contactname, Country

FROM Customers

WHERE Country = @Pais

RETURN

END;

GO

SELECT * FROM ListaPorPais ('France');

GO

--COMMON TABLE EXPRESION

WITH CTE_ordenes

AS

( SELECT C.companyname, O.orderid, O.orderdate, YEAR(O.orderdate) AS ao,


MONTH(orderdate) AS mes

FROM dbo.Customers AS C

INNER JOIN dbo.Orders AS O


ON C.CustomerID = O.CustomerID)

SELECT CompanyName, ao, COUNT(*) AS total_ordenes

FROM CTE_ordenes

WHERE CompanyName = 'Ana Trujillo Emparedados y helados'

GROUP BY CompanyName, ao;

GO

-- SELF JOIN Manejado con COMMON TABLE EXPRESSION

WITH Jefe

AS

SELECT EmployeeID, FirstName, LastName

FROM dbo.Employees

SELECT Jefe.EmployeeID, Jefe.FirstName, Jefe.LastName, dbo.Employees.EmployeeID,


dbo.Employees.FirstName, dbo.Employees.LastName

FROM Jefe

INNER JOIN dbo.Employees

ON Jefe.EmployeeID = dbo.Employees.ReportsTo;

GO

-- Contador dentro de COMMON TABLE EXPRESSION

WITH ReporteDirectores (ReportsTo, Employeeid, Name, EmployeeLevel)

AS

SELECT ReportsTo, EmployeeID, FirstName+' '+LastName AS name, 0 AS


employeeLevel

FROM Employees

WHERE ReportsTo IS NULL

UNION ALL

SELECT E.ReportsTo, E.EmployeeID, E.FirstName+' '+E.LastName AS name,


employeeLevel+1
FROM Employees AS E

INNER JOIN ReporteDirectores AS D

ON E.ReportsTo = D.ReportsTO

SELECT ReportsTo, EmployeeID, Name, EmployeeLevel

FROM ReporteDirectores;
USAR OPERADORES SET

ESCRIBIR CONSULTAS USANDO EL OPERADOR UNION

INTERACCIONES ENTRE CONJUNTOS DE DATOS

Los resultados de dos consultas de entrada pueden manipularse adicionalmente

Los SETS pueden combinar, compara o ser operados uno contra el otro

Ambos conjuntos deben tener el mismo nmero de columnas compatibles

La clusula ORDER BY no est permitida como entrada, pero se puede utilizar despus del
resultado de la operacin de conjuntos

Los valores NULL son considerados igual al comparar los conjuntos

<SELECT consulta 1>

<Conjunto_operadores>

<SELECT consulta 2>

[ORDER BY <Lista_ordenada>]

En otras palabras, se pueden tener 2 conjuntos o SETS de datos, es decir que se tendrn 2
resultados producto de 2 consultas o querys o la devolucin de 2 tablas los cuales son
denominados conjunto de datos, estos pueden ser manipulados de forma adicional, estos pueden
ser combinados solo si tienen el mismo nmero de columnas y se hace mediante el operador
UNION.

USO DE UNION

El operador UNION devuelve un conjunto de resultados de filas distintas las cuales son
combinadas de ambos lados

Los duplicados son removidos durante el procesamiento de consultas (afecta el rendimiento)

Ejemplo:

-- nicamente las filas distintas de ambas consultas son retornadas

SELECT country, region, city FROM HR.Employees

UNION

SELECT country, region, city FROM Sales.Customers;


UNION permite unir 2 consultas diferentes, ms sin embargo es indispensable que ambas posean
el mismo nmero de columnas y al mismo tiempo deben tener el mismo tipo de dato sin importar
si su nombre es diferente. Tambin se le conoce como consulta dividida, unin horizontal.

Es importante recordar que el operador UNION devuelve un conjunto de resultados de filas nicas,
es decir no devuelve filas repetidas, por lo que si en la unin de 2 consultas existen valores
repetidos UNION nicamente mostrar uno de los valores repetidos.

UTILIZAR EL OPERADOR UNION ALL

El operador UNION ALL devuelve un conjunto de resultados con todas las filas de ambos conjuntos

Para evitar la prdida de rendimiento, es necesario utilizar UNION ALL incluso se sabe que no
existen filas duplicadas en ambas consultas

--Todas las filas de ambas consultas sern retornadas

SELECT country, region, city FROM HR.Employees

UNION ALL

SELECT country, region, city FROM Sales.Customers;

USAR EXCEPT E INTERSECT

USAR EL OPERADOR INTERSECT

El operador INTERSCT devuelve slo filas que coinciden en ambos conjuntos de resultados

--nicamente filas que existen en ambas consultas sern retornadas

SELECT country, region, city FROM HR.Employees

INTERSECT

SELECT country, region, city FROM Sales.Customers;

El operador INTERSECT busca los valores que se intersectan, es decir aquellos que son iguales en
ambas consultas, en ambos conjuntos

USAR EL OPERADOR EXCEPT

El operador EXCEPT devuelve nicamente filas distintas que aparecen en el conjunto de la


izquierda, pero no el de la derecha

El orden en el que los conjuntos se especifican


--Unicamente las filas de la tabla Employees sern retonadas

SELECT country, region, city FROM HR.Employees

INTERSECT

SELECT country, region, city FROM Sales.Customers;

El operador INTERSECT busca los valores que no se intersectan, es decir aquellos que no son
diferentes en amabas consultas, en ambos conjuntos.

USAR APPLY

USAR EL OPERADOR APPLY

APPLY es un operador de tabla utilizado en la clusula FROM

Incluye los operadores CROSS APPLY y OUTER APPLY

Funciona con dos tablas de entrada, una izquierda y otra derecha

La tabla de la derecha es a menudo una tabla derivada o una funcin con valores de tabla

SELECT <Listado_columnas>

FROM <Tabla_izquierda> AS <Alias>

CROSS / OUTER APPLY

<Expresion_de_tabla_derivada o TVF_enlinea> AS <Alias>

USAR EL OPERADOR CROSS APPLY

El operador CROSS APPLY aplica la expresin de tabla derecha a cada fila en la tabla izquierda

Conceptualmente es similar a un CROSS JOIN entre dos tablas, pero con la diferencia que
puede correlacionar los datos entre las fuentes

Ejemplo:

SELECT S.supplierid, S.companyname, P.productid, P.productname, P.unitprice

FROM Production.Suppliers AS S

CROSS APPLY

dbo.fn_TopProductsByShipper(S.supplierid) AS P;
El operador CROSS APPLY funciona de la misma manera que un INNER JOIN con la diferencia que
este une una tabla con una funcin, en lugar de hacer la unin con otra tabla.

USAR EL OPERADOR OUTER APPLY

Conceptualmente es similar a un LEFT OUTER JOIN entre dos tablas

El operador OUTER APPLY aade un paso en la manipulacin utilizada por el operador CROSS
APPLY

El operador OUTER APPLY aplica la expresin de la tabla derecha a cada fila en la tabla
izquierda

El operador OUTER APPLY aade filas para aquellos con un valor tipo NULL en las columnas
de la tabla de la derecha

Ejemplo:

SELECT S.supplierid, S.companyname, P.productid, P.unitprice

FROM Production.Suppliers AS S

OUTER APPLY

dbo.fn_TopProductsByShipper(S.supplierid) AS P;

EJEMPLO
--UNION

SELECT companyname, contactname, contacttitle, country FROM dbo.Customers

UNION

SELECT companyname, contactname, contacttitle, country FROM dbo.Suppliers;

GO

SELECT companyname, contactname, contacttitle, country, 'customer' AS [type]

FROM dbo.Customers

UNION

SELECT companyname, contactname, contacttitle, country, 'supplier' AS [type]

FROM dbo.Suppliers;

--UNION ALL

SELECT companyname, contactname, contacttitle, country FROM dbo.Customers


UNION ALL

SELECT companyname, contactname, contacttitle, country FROM dbo.Suppliers;

--INTERSECT

SELECT customerid FROM dbo.Customers

INTERSECT

SELECT customerid FROM dbo.Orders;

--EXCEPT

SELECT customerid FROM dbo.Customers

EXCEPT

SELECT customerid FROM dbo.Orders;

--

CREATE DATABASE EjemploCTE;

USE EjemploCTE;

CREATE TABLE Employees(empid INT NOT NULL, mgrid INT NULL, empname NVARCHAR(25) NOT
NULL, salary MONEY NOT NULL

CONSTRAINT PK_Employees PRIMARY KEY(empid));

GO

INSERT INTO Employees VALUES(1, NULL, 'Nancy', $10000.00);

INSERT INTO Employees VALUES(2, 1, 'Andrew', $5000.00);

INSERT INTO Employees VALUES(3, 1, 'Janeth', $5000.00);

INSERT INTO Employees VALUES(4, 1, 'Margareth', $5000.00);

INSERT INTO Employees VALUES(5, 2, 'Steven', $2500.00);

INSERT INTO Employees VALUES(6, 2, 'Michael', $2500.00);

INSERT INTO Employees VALUES(7, 3, 'Robert', $2500.00);

INSERT INTO Employees VALUES(8, 3, 'Laura', $2500.00);

INSERT INTO Employees VALUES(9, 3, 'Ann', $2500.00);

INSERT INTO Employees VALUES(10, 4, 'Ina', $2500.00);


INSERT INTO Employees VALUES(11, 7, 'David', $2000.00);

INSERT INTO Employees VALUES(12, 7, 'Ron', $2000.00);

INSERT INTO Employees VALUES(13, 7, 'Dan', $2000.00);

INSERT INTO Employees VALUES(14, 11, 'James', $1500.00);

GO

CREATE TABLE Departments(deptid INT NOT NULL PRIMARY KEY, deptname NVARCHAR(25) NOT
NULL, deptmgrid INT NULL REFERENCES Employees);

GO

INSERT INTO Departments VALUES(1, 'HR', 2);

INSERT INTO Departments VALUES(2, 'Marketing', 7);

INSERT INTO Departments VALUES(3, 'Finance', 8);

INSERT INTO Departments VALUES(4, 'R&D', 9);

INSERT INTO Departments VALUES(5, 'Training', 4);

INSERT INTO Departments VALUES(6, 'Gardening', NULL);

GO

CREATE FUNCTION fn_jerarquia (@empid AS INT)

RETURNS TABLE

AS

RETURN (WITH Empleados_arbol (empid, empname, mgrid, lvl)

AS

(SELECT empid, empname, mgrid, 0 FROM Employees

WHERE empid = @empid

UNION ALL

SELECT E.empid, E.empname, E.mgrid, ES.lvl+1

FROM Employees AS E

INNER JOIN Empleados_arbol AS ES

ON E.mgrid = ES.mgrid)

SELECT * FROM Empleados_arbol

)
GO

SELECT * FROM fn_jerarquia(2)

OPTION(MAXRECURSION 0);

GO

--CROSS APPLY

SELECT D.deptid, D.deptname, D.deptmgrid, F.empid, F.empname, F.mgrid, F.lvl

FROM Departments AS D

CROSS APPLY

dbo.fn_jerarquia(D.deptmgrid) AS F

--OUTER APPLY

SELECT D.deptid, D.deptname, D.deptmgrid, F.empid, F.empname, F.mgrid, F.lvl

FROM Departments AS D

OUTER APPLY

dbo.fn_jerarquia(D.deptmgrid) AS F
FUNCIONES DE VENTANA RANKING, OFFSET Y DE AGREGADO

CREAR FUNCIONES DE VENTANA CON OVER

FUNCIONES DE VENTAS DE SQL

Extiende el aprovechamiento de T-SQL's con funciones de ventana

La funcin de venta permite especificar un orden como parte de un clculo, sin tener en cuenta el
orden de entrada o el orden de la salida final

La funcin de ventana permite la separacin y formulacin de filas para apoyar a las funciones

Las funciones de ventana pueden simplificar las consultas donde se necesitan encontrar los totales
acumulados, promedios mviles, o la falta de datos

Ejemplo:

SELECT Category, Qty, Orderyear,

SUM(Qty) OVER (PARTITION BY category

ORDER BY orderyear

ROWS BETWEEN UNBOUNDED PRECEDING

AND CURRENT ROW) AS RunningQty

FROM Sales.CategorQtyYear;

Las Funciones de ventanas nos permiten realizar clculos analticos de datos, tal y como lo hacen
las funciones de agregado con la instruccin GROUP BY, con la diferencia que en las Funciones de
Ventana se define un conjunto de filas utilizando la clusula OVER en la que la funcin trabajar, la
clusula OVER puede aplicarse sobre las funciones de agregado tal como: SUM, AVERAGE, MIN,
MAX, tambin con las funciones RANK, DESCRANK, ROWNUMBER, LAG, entre otros. Al combinar
funciones de agregado con funciones de ventana es posible particionar los datos, utilizar
enmarcados, manejar totales incrementales. Al combinar las funciones de agregado con las de
venta, se agregan nuevas caractersticas a SQL Server 2012 y 2014.

Las funciones de agregado son un estndar por lo que es posible utilizarlas en otros gestores de
base de datos.

Una FUNCIN DE VENTANA es una funcin agregada que aplica a una particin o subconjunto de
resultados de una consulta, se define utilizando la clusula OVER, devuelve un valor por cada fila
de resultado de una consulta.

Para trabajar con ventanas se pueden utilizar las funciones de agregado normales
La venta est formada por una instruccin PARTITION la cual ayuda a crear un frame.

La diferencia entre una funcin de agregado y una de venta se ve claramente en los resultados
devueltos en la consulta, ya que las funciones de agregado mostrarn nicamente un valor escalar
de la consulta, mientras que una funcin de ventana devolver tantos registros como los que han
sido consultados, agregando un nmero de funciones que han sido indicadas en la consulta.

COMPONENTES DE VENTA

Relacin conceptual entre elementos de la venta:

Conjunto de resultas (OVER)


Particin de ventana (PARTITION BY)
Frame(ROWS BETWEEN)

El frame permite manejar un rango de filas

UTILIZAR LA FUNCION OVER

La clusula OVER define una ventana, o conjunto de filas para ser utilizados por una funcin de
ventana, incluyendo cualquier pedido

Con una clusula de particin de ventana especificada, la clusula OVER restringe el conjunto de
filas a los que tienen los mismos valores en los elementos de la particin

Por s mismo la clusula OVER() no est restringida e incluye todas las filas

Varias clusulas OVER pueden ser utilizadas en una sola consulta, cada una con su propia particin
y orden, si es necesario.

OVER([<clusula PARTITION BY>]

[<clusula ORDER BY>]

[clusula ROWS o RANGE]

LA PARTICIN DE VENTANA

El particionamiento limita un conjunto o SET a filas con el mismo valor en la columna de


particionamiento

Utilizar PARTITION BY en la clusula OVER()

Sin la clusula PARTITION BY definida, la clusula OVER() crea una nica particin de todas las filas.
SELECT <Lista_seleccionada>, <Funcin_de_agregado>, OVER(PARTITION BY
Atributo_por_el_cual_se_particionar) AS <ALIAS>

FROM <Tabla_origen>

Ejemplo:

SELECT custid, ordermonth, qty, SUM(qty), OVER(PARTITION BY custid) AS


totalbycust

FROM Sales.CustOrders;

Custid Orderonth Qty totalbycust


1 2007-08-01 00:00:00.000 38 174
1 2007-10-01 00:00:00.000 41 174
2 2006-09-01 00:00:00.000 6 63
2 2007-08-01 00:00:00.000 18 63
3 2006-11-01 00:00:00.000 24 359
3 2007-04-01 00:00:00.000 30 359

Al particionar una venta se limita a un conjunto de filas con el mismo valor en la columna de
particionamiento. Por ejemplo, El siguiente fragmento de cdigo muestra el uso de PARTITION BY
para crear una Particin de ventana por categora. En este ejemplo, una particin contiene
nicamente filas con la categora de Beverages, o con la categora Confections.

<Nombre_de_la_funcin>() OVER(PARTITION BY Category)

Como se ha visto, si no existe una particin definida, entonces la clusula OVER() retornar todas
las filas desde el conjunto de resultados de la consulta, a la funcin de ventana.

El siguiente ejemplo se basa en el anterior.

Se aade la subclusula PARTITION BY a la clusula OVER, creando una particin de ventana para
las filas con valores que coinciden en Category. Esto permite a la funcin ROW_NUMBER numerar
cada conjunto de aos por categora por separado. Ntese que una subclusula ORDER BY ha sido
aadida a la clusula OVER para proporcionar significado a la funcin ROW_NUMBER.

Ejemplo

SELECT Category, Qty, Orderyear,

ROW_NUMBER() OVER (PARTITION BY Category ORDER BY Qty DESC) AS


Running

FROM Sales.CategoryQtyYear

ORDER BY Category;
Category Qty Orderyear Running
Beverages 3996 2007 1
Beverages 3694 2008 2
Beverages 1842 2006 3
Condiments 2895 2007 1
Condiments 1441 2008 2
Condiments 962 2006 3
Confections 4137 2007 1
Confections 2412 2008 2
Confections 1357 2006 3

La subclusula ORDER BY tambin ser necesaria en la clusula OVER si se va aadir un enmarcado


a la particin de ventana.

ORDENAR Y ENMARCADO

El enmarcado de ventana permite establecer lmites de inicio y fin dentro de una particin de
ventana.

UNBOUNDED (ilimitado) significa ir al lmite en la direccin especificada por PRECEDING (anterior)


o FOLLOWING (siguiente) es decir comienzo o fin.

CURRENT ROW indica el inicio o fin de la fila actual en la particin

ROWS BETWEEN permite definir un rango de filas entro dos puntos.

El ordenamiento de ventana proporciona un contexto al marco

Ordenar por un atributo permite una posicin significativa de un lmite

Sin ordenar, "Se empieza en la primera fila", lo que no es til porque un conjunto no tiene orden

Como se ha visto la particin de ventana permite definir subconjuntos de filas dentro de la


ventana externa definida por la clusula OVER. En un enfoque similar, el marco de ventana
permite adems restringir las filas disponibles por la funcin de ventana. Se puede pensar en un
marco como una ventana movindose sobre la data, empezando y finalizando en las posiciones
que se le defina.

Para definir un marco de ventana, se debe utilizar las subclusulas ROW o RANGE y proveer un
lmite de inicio y un lmite final. Por ejemplo, para establecer un marco que se extiende desde la
primera fila de la particin hasta la fila actual (tal como crear una ventana en movimiento para un
total de ejecuciones), se deben seguir estos pasos:
Definir una clusula OVER con un elemento PARTITION BY

Definir una subclusula ORDER BY en la clusula OVER. Esto causar que el


concepto de "Primera fila" sea til.

Aadir la subclusula ROWS BETWEEN, estableciendo el lmite inicial usando


UNBOUNDED PRECEDING. UNBOUNDED significa ir todo el camino hasta el lmite
en la direccin especificada como PRECEDING (antes de). Se debe agregar el
elemento CURRENT ROW para indicar que el lmite final es la fila calculada.

Ejemplo:

SELECT Category, Qty, Orderyear,

SUM(Qty) OVER (PARTITION BY Category ORDER BY Orderyear

ROWS BETWEEN UNBOUNDED PRECEDING

AND CURRENT ROW) AS RunningQty

FROM Sales.CategoryQtyYear;

EXPLORAR LAS FUNCIONES DE VENTANA

DEFINIR FUNCIONES DE VENTANA

Una funcin de ventana es una funcin aplicada a una ventana, o conjunto de filas

Las funciones de ventana incluyen funciones de AGREGADO, RANK, DISTRIBUCIN, Y OFFSET

Las funciones de ventana dependen del conjunto creado por la clusula OVER()

Ejemplo

SELECT productid, productname, unitprice, RANK() OVER(ORDER BY unitprice DESC) AS pricerank

FROM Production.Products

ORDER BY pricerank;

FUNCIONES DE AGREGADO DE VENTANA

Es similar a las funciones agrupadas de agregado

SUM, MIN, MAX, etc.

Aplicado a una ventana definida por la clusula OVER

Las funciones de agregado de ventana soportan particionamiento, ordenamiento y enmarcado.


Ejemplo:

SELECT custid, ordermonth, qty, SUM(qty), OVER(PARTITION BY custid) AS totalpercust

FROM Sales.CustOrders;

FUNCIN DE VENTANA RANKING

La funcin RANK requiere una clusula de ordenamiento de ventana

La particin es optativa

Para desplegar el resultado en el orden almacenado an se requiere de la clusula ORDER BY

Funcin Descripcin
Retorna el rango de cada fila dentro de la
RANK particin del conjunto de resultados. Puede
incluir vnculos y espacios vacos
Retorna el rango de cada fila dentro de la
particin del conjunto de resultados. Puede
DENSE_RANK
incluir vnculos. Pero no incluir espacios
vacos
Retorna un nico nmero de secuencia de fila
ROW_NUMBER dentro de la particin basndose en el orden
actual
Distribuye las filas en una particin ordenada
dentro de un nmero especfico de grupos.
NTILE
Retorna el nmero del grupo al cual pertenece
actualmente la fila

FUNCIN DE VENTANA DE DISTRIBUCIN

Una funcin de ventana distribuida desempea anlisis estadsticos en los datos, y requiere una
clusula de ordenamiento de ventana.

La distribucin RANK se desempea con PERCENT_RANK Y CUME_DIST

La distribucin inversa se desempea con PERCENTILE_CONT y PERCENTILE_DISC

FUNCIN DE VENTANA OFFSET

La funcin de ventana OFFSET permite realizar comparaciones entre filas en un conjunto sin la
necesidad de utilizar un SELF JOIN

La funcin OFFSET opera en una posicin relativa a la fila actual, o bien al inicio o final de un marco
de ventana
Funcin Descripcin
LAG Retorna una expresin de una fila previa que
es definida como offset de la fila actual.
Retorna un valor NULL si no hay una fila en la
posicin especificada
LEAD Retorna una expresin de una fila posterior
que est definida como offset de la fila actual.
Retorna un valor NULL si no hay una fila en la
posicin especificada.
FIRST_VALUE Retorna el primer valor en el marco actual de
venta. Requiere un ordenamiento de ventana
para que sea significativo
LAST_VALUE Retorna el ltimo valor en el marco actual de
ventana. Requiere de un ordenamiento de
ventana para que sea significativo

EJEMPLO
--Funcion OVER

SELECT O.OrderID, O.OrderDate, D.ProductID, D.Quantity, SUM(D.Quantity)

OVER (PARTITION BY O.Orderid) AS Total

FROM Orders AS O

INNER JOIN dbo.[Order Details] AS D

ON O.OrderID = D.OrderID;

GO

SELECT O.OrderID, O.OrderDate, D.ProductID, D.Quantity, SUM(D.Quantity) OVER (PARTITION BY


O.Orderid) AS Total,

AVG(D.Quantity) OVER (PARTITION BY O.Orderid) AS Promedio,

COUNT(D.Quantity) OVER (PARTITION BY O.Orderid) AS Conteo,

MIN(D.Quantity) OVER (PARTITION BY O.Orderid) AS Minimo,

MAX(D.Quantity) OVER (PARTITION BY O.Orderid) AS Maximo

FROM Orders AS O

INNER JOIN dbo.[Order Details] AS D

ON O.OrderID = D.OrderID;
GO

SELECT O.OrderID, O.OrderDate, D.ProductID, D.Quantity, SUM(D.Quantity)

OVER (PARTITION BY O.Orderid) AS Total,

CAST(1.* D.Quantity / SUM(D.Quantity) OVER (PARTITION BY O.OrderID) * 100 AS DECIMAL(5,2))


AS [Porcentaje por producto]

FROM Orders AS O

INNER JOIN dbo.[Order Details] AS D

ON O.OrderID = D.OrderID;

GO

--Usar la tabla customers y hacer conteo de filas por pas

SELECT country, companyname, ROW_NUMBER()

OVER(PARTITION BY country ORDER BY companyname)

FROM dbo.Customers;

--Funciones de ventala con RANK()

SELECT C.CategoryName, P.ProductName, P.UnitPrice, RANK() OVER(PARTITION BY


C.CategoryName ORDER BY P.unitprice DESC) AS [Ranqueo de prodcutos]

FROM dbo.Products AS P

INNER JOIN dbo.Categories AS C

ON P.CategoryID = C.CategoryID

ORDER BY C.CategoryName, P.UnitPrice DESC;

GO

SELECT C.CategoryName, P.ProductName, P.UnitPrice, DENSE_RANK() OVER(PARTITION BY


C.CategoryName ORDER BY P.unitprice DESC) AS [Ranqueo de prodcutos]

FROM dbo.Products AS P

INNER JOIN dbo.Categories AS C

ON P.CategoryID = C.CategoryID

ORDER BY C.CategoryName, P.UnitPrice DESC;

GO

--FUNCIONES LAG Y LEAD


INSERT INTO dbo.PreciosProducto(nombreproducto,fechavaluacion,precio)

VALUES('Pintura Spray Rojo Fuego', '01-01-2017',23.32),

('Pintura Spray Rojo Fuego', '01-02-2017',26.11),

('Pintura Spray Rojo Fuego', '01-03-2017',25.26),

('Pintura Spray Rojo Fuego', '01-04-2017',30.45),

('Pintura Spray Rojo Fuego', '01-05-2017',30.20),

('Pintura Spray Rojo Fuego', '01-06-2017',31.12),

('Pintura Spray Rojo Fuego', '01-07-2017',25.75),

('Pintura Spray Rojo Fuego', '01-08-2017',24.21),

('Pintura Spray Rojo Fuego', '01-09-2017',25.12),

('Pintura Spray Rojo Fuego', '01-10-2017',28.26);

GO

SELECT Actual.nombreproducto, Actual.fechavaluacion, Actual.precio, Anterior.precio

FROM dbo.PreciosProducto AS Actual

LEFT OUTER JOIN dbo.PreciosProducto AS Anterior

ON Actual.fechavaluacion = DATEADD(mm, 1, Anterior.fechavaluacion);

GO

SELECT nombreproducto, fechavaluacion, precio,

LAG(precio) OVER(ORDER BY fechavaluacion) AS precioanterior,

LEAD(precio) OVER(ORDER BY fechavaluacion) AS preciosiguiente

FROM dbo.PreciosProducto;
INSTRUCCIONES PIVOT, UNPIVOT, WITH ROLLUP Y WITH CUBE

ESCRIBIR CONSULTAS CON PIVOT Y UNPIVOT

QU ES PIVOTING?

Pivotar datos es rotarlos desde una orientacin basada en filas a una orientacin basada en
columnas

Los distintos valores de una sola columna se proyectan como encabezados para otras columnas,
pueden incluir agregacin.

La funcin PIVOT nos permite tomar un conjunto de datos, el cual lo maneja confrontando fila
contra columna.

En otras palabras, la Funcin PIVOT convierte un set o conjunto de resultados en una tabla fila
contra columna.

En la funcin PIVOT es necesario pasar manualmente los valores, es decir que se debe realizar
manualmente la operacin.

Por ende, la funcin UNPIVOT realiza el proceso inverso.

ELEMENTOS DE PIVOT

La funcin PIVOT incluye tres fases:

Agrupacin de determinados elementos que obtiene una fila en el conjunto de resultados

La separacin provee a los distintos valores que deben ser pivoteados

La agregacin ejecuta una funcin de agregado (tal como SUM)

Ejemplo

SELECT Category, [2006], [2007], [2008]

FROM (SELECT Category, Qty, Orderyear

FROM Sales.CategoryQtyYear) AS D

PIVOT(SUM(QTY) FOR orderyear

IN([2006], [2007], [2008])) AS pvt

ORDER BY Category;
Category 2006 2007 2008
Beverages 1842 3996 3694
Condiments 962 2895 1441
Confections 1357 4137 2412
Dairy Products 2086 4374 2689
Grains/Cereals 549 2636 1377
Meat/Poultry 950 2189 1060
Produce 549 1583 858
Seafood 1286 3679 2716

ESCRIBIR CONSULTAS CON UNPIVOT

Despivotar datos es rotar los datos desde una orientacin basada en columnas a una orientacin
basada en filas

Dispersa o divide los valores de una fila de origen en una o ms filas objetivo

Cada fila de origen se convierte en una o ms filas en el conjunto de resultados en funcin del
nmero de columnas que se pivotean.

Despivotar incluye tres elementos

La columna de origen que va ser despivoteada

Un nombre que se le asignar al nuevo valor de la columna

Un nombre que se le asignar a los nombres de columna

TRABAJAR CON CONJUNTOS AGRUPADOS (GROUPING SETS)

ESCRIBIR CONSULTAS CON CONJUNTOS AGRUPADOS

SELECT Category, Custo, SUM(qty) AS TotalQty

FROM Sales.CategorySales

GROUP BY

GROUPING SETS((Category), (Custs), ());

Si se necesita producir agregados de mltiples agrupaciones en la misma consulta, se puede


utilizar el mtodo GROUPING SETS el cual es una subclusula de la clusula GROUP BY.

GROUPING SETS proporciona una alternativa al uso de UNION ALL para combinar los resultados de
mltiples consultas, cada una con su propia clusula GROUP BY.

Con GROUPING SETS pude especificar mltiples combinaciones de atributos en los que agrupar.
Su sintaxis es la siguiente:

SELECT <Lista_seleccionada_con_agregados>

FROM <Tabla_fuente>

GROUP BY

GROUPING SETS (

(<nombre_columna>), --una o ms columnas

(<nombre_columna), -- una o ms columnas

() -- parentecis vaco si se agregan todas las filas);

Con GROUPING SETS, se puede especificar los atributos que se van agrupar y el orden de los
mismos.

Si en su lugar se desea agrupar en cualquier posible combinacin de atributos, se debe utilizar


CUBE o bien ROLLUP.

Ejemplo:

SELECT Category, Cust, SUM(Qty) AS TotalQty

FROM Sales.CategorySales

GROUP BY

GROUPING SETS((Category),(Cust),())

ORDER BY Category, Cust;

Category Cust TotalQty


372 NULL 999
NULL 1 80
NULL 2 12
NULL 3 154
NULL 4 241
NULL 5 512
Beverages NULL 513
Condiments NULL 114
Confections NULL

Este ejemplo utiliza la subclusula GROUPING SETS para agregar las columnas category y custs, as
como la notacin del parntesis vaco para agregar todas las filas

Hay que observar la presencia de valores nulos o NULL en los resultados. Los NULLs pueden ser
devueltos porque un valor NULL fue almacenado en la fuente, o bien porque es un marcador de
posicin en una fila generado como un resultado agregado. Por ejemplo, en los resultados
anteriores la primera fila muestra NULL, NULL, 999. Esto representa una fila total general. El valor
NULL en la fila Category y Custs, participan en la agregacin.

CUBE Y ROLLUP

CUBE provee de un acceso directo para los conjuntos agrupados definidos dada una lista de
columnas

Todas las posibles combinaciones de conjuntos agrupados son creadas

SELECT <Lista_columnas_con_agregados>

FROM <Tabla_origen>

GROUP BY CUBE (<nombre_columna>, <nombre_columna>, ...);

ROLLUP provee de un acceso directo para conjuntos agrupados definidos, creando combinaciones
asumiendo las columnas de entrada de una jerarqua.

SELECT <Lista_columnas_con_agregados>

FROM <Tabla_origen>

GROUP BY ROLLUP (<nombre_columna>, <nombre_columna>, ...);

Al igual que GROUPING SETS, las subclusula CUBE y ROLLUP tambin permiten mltiples
agrupaciones para agregar datos. Sin embargo, CUBE y ROLLUP no necesitan especificar cada
conjunto de atributos para agrupar. En su lugar, dado un conjunto de columnas CUBE determinar
todas las posibles combinaciones y agrupaciones de salida. ROLLUP crea combinaciones
asumiendo que la columna de entrada representa una jerarqua. Por lo tanto, CUBE y ROLLUP
pueden considerarse como atajos para GROUPING SETS.

Para utilizar CUBE, debe agregarse la palabra clave CUBE a la clusula GROUP BY y proporcionar de
una lista de columnas para agrupar.

Para usar ROLLUP, debe agregarse la palabra clave ROLLUP a la clusula GROUP BY y proporcionar
de una lista de columnas para agrupar.

GROUPING_ID

Mltiples conjuntos agrupados presentan problemas en identificar el origen para cada fila en el
conjunto de resultados.
Los valores NULLs pueden provenir del origen de la data o puede ser un marcador de posicin en
el conjunto agrupado.

La funcin GROUPING_ID provee un mtodo para marcar una fila con un valor de 1 o 0 para
identificar a que conjunto agrupado pertenece la fila.

SELECT GROUPING_ID(Nombre_columna) AS <Alias>,

GROUPING_ID(Nombre_columna) AS <Alias>,

<Lista_Seleccionada>

FROM <Tabla_origen>

GROUP BY <Orden_por_grupo>

ORDER BY <Lista_de_oredenamiento>

Ejemplo:

SELECT GROUPING_ID(Category) AS grpCat,

GROUPING_ID(Cust) AS grpCust,

Category, Cust, SUM(Qty) AS TotalQty

FROM Sales.CategorySales

GROUP BY (Category, Cust)

ORDER BY Category, Cust;

Como se ha visto varios conjuntos agrupados permiten combinar diferentes niveles de agregacin
en la misma consulta. Tambin se ha visto que SQL Server marcar los valores de marcador de
posicin con valores tipo NULL si una fila no toma parte en el conjunto agrupado.

Pero en una consulta con varios conjuntos, cmo saber si un valor NULL marca un marcador de
posicin o proviene de la raz de los datos? Si marca un marcador de posicin para un conjunto
agrupado, Qu conjunto?

La funcin GROUPING_ID puede ayudar proveyendo informacin adicional para responder esas
preguntas.

Ejemplo:

SELECT Category, SUM(QTY) AS TotalQty

FROM Sales.CategorySales

GROUP BY

GROUIPING SETS((Category),(Cust),())

ORDER BY Categery, Cust;


Category Cust TotalQty
NULL NULL 999
NULL 1 80
NULL 2 12
NULL 3 154
NULL 4 241
NULL 5 512
Beverages NULL 513
Condiments NULL 114
Confections NULL

A simple vista, puede parecer difcil determinar por qu aparece un NULL en la columna

La funcin GROUPING_ID puede ser usada para asociar filas de resultados con sus conjuntos
agrupados

Ejemplo:

SELECT

GROUPING_ID(Category)AS grpCat,

GROUPING_ID(Cust) AS grpCust,

Category, Cust, SUM(Qty) AS TotalQty

FROM Sales.CategorySales

GROUP BY CUBE(Category,Cust);

grpCat grpCust Category Cust TotalQty


0 0 Beverages 1 36
0 0 Condiments 1 44
1 0 NULL 1 80
0 0 Beverages 2 5
0 0 Confections 2 7
1 0 NULL 2 12
0 0 Beverages 3 105
0 0 Condiments 3 4
0 0 Confections 3 45
1 0 NULL 3 154

1 1 NULL NULL 999
0 1 Beverages NULL 513
0 1 Condiments NULL 114
0 1 Confections NULL 372
Como se puede observar la funcin GROUPIN_ID devuelve 1 cuando una fila es agregada como
parte del presente conjunto agrupado y devuelve un 0 cuando no lo es. En la primera fila ambos
grpCat y grpCust retornan 0; por lo tanto, la fila es parte del conjunto agrupado (Category, Cust)

Nota importante GROUPING_ID tambin puede tomar varias columnas como entrada y devolver
un nico valor tipo entero bitmap, compuesto por conjunto agrupado.

EJEMPLO
--Funcion PIVOT

/* Mostrando las ventas por categoria de producto vrs los aos de compra */

SELECT * FROM

(SELECT C.CategoryName, DATEPART(yyyy,O.OrderDate) AS ao, (D.UnitPrice * D.Quantity) AS


total FROM dbo.Categories AS C

INNER JOIN dbo.Products AS P

ON C.CategoryID = P.CategoryID

INNER JOIN dbo.[Order Details] AS D

ON P.ProductID = D.ProductID

INNER JOIN dbo.Orders AS O

ON D.OrderID = O.OrderID) AS T

PIVOT(SUM(total) FOR ao IN ([1996], [1997], [1998])) AS pvt;

GO

--UNPIVOT

SELECT *

INTO TablaPivote

FROM

(SELECT C.CategoryName, DATEPART(yyyy,O.OrderDate) AS ao, (D.UnitPrice * D.Quantity) AS


total FROM dbo.Categories AS C

INNER JOIN dbo.Products AS P

ON C.CategoryID = P.CategoryID

INNER JOIN dbo.[Order Details] AS D

ON P.ProductID = D.ProductID
INNER JOIN dbo.Orders AS O

ON D.OrderID = O.OrderID) AS T

PIVOT(SUM(total) FOR ao IN ([1996], [1997], [1998])) AS pvt;

--Nueva Tabla

SELECT Categoryname, Ao, Venta

FROM

(SELECT CategoryName, [1996], [1997], [1998]

FROM dbo.TablaPivote) AS P

UNPIVOT (Venta FOR Ao IN ([1996],[1997],[1998])) AS unpvt

GO

--ROLLUP y CUBE

SELECT C.CategoryName, DATEPART(yyyy,O.OrderDate) AS ao, SUM(D.UnitPrice * D.Quantity) AS


total FROM dbo.Categories AS C

INNER JOIN dbo.Products AS P

ON C.CategoryID = P.CategoryID

INNER JOIN dbo.[Order Details] AS D

ON P.ProductID = D.ProductID

INNER JOIN dbo.Orders AS O

ON D.OrderID = O.OrderID

GROUP BY C.CategoryName, DATEPART(yyyy,O.OrderDate) WITH ROLLUP

ORDER BY C.CategoryName, DATEPART(YYYY,O.OrderDate);

--CUBE

SELECT C.CategoryName, DATEPART(yyyy,O.OrderDate) AS ao, SUM(D.UnitPrice * D.Quantity) AS


total FROM dbo.Categories AS C

INNER JOIN dbo.Products AS P

ON C.CategoryID = P.CategoryID

INNER JOIN dbo.[Order Details] AS D

ON P.ProductID = D.ProductID

INNER JOIN dbo.Orders AS O

ON D.OrderID = O.OrderID
GROUP BY C.CategoryName, DATEPART(yyyy,O.OrderDate) WITH CUBE

HAVING C.CategoryName IS NULL OR DATEPART(YYYY,O.OrderDate) IS NULL

ORDER BY C.CategoryName, DATEPART(YYYY,O.OrderDate);

--GRUPPING

SELECT C.CategoryName, DATEPART(yyyy,O.OrderDate) AS ao, SUM(D.UnitPrice * D.Quantity) AS


total FROM dbo.Categories AS C

INNER JOIN dbo.Products AS P

ON C.CategoryID = P.CategoryID

INNER JOIN dbo.[Order Details] AS D

ON P.ProductID = D.ProductID

INNER JOIN dbo.Orders AS O

ON D.OrderID = O.OrderID

GROUP BY GROUPING SETS (C.CategoryName, DATEPART(yyyy,O.OrderDate))

ORDER BY C.CategoryName, DATEPART(YYYY,O.OrderDate);


INTRODUCCIN A PROCEDIMIENTOS ALMACENADOS

CONSULTAS DE DATOS CON PROCEDIMIENTOS ALMACENADOS

EXAMINAR PROCEDIMIENTOS ALMACENADOS

Los Procedimientos Almacenados son declaraciones colectadas por T-SQL y almacenadas en una
base de datos

Los Procedimientos pueden devolver resultados, manipular datos, y realizar acciones


administrativas en el servidor

Con otros objetos, los Procedimientos pueden proveer una aplicacin de interface programada
confiable a una base de datos, aislando las aplicaciones de cambios en la estructura de la base de
datos

Utilizar vistas, funciones, y procedimientos para devolver datos

Utilizar procedimientos para modificar y aadir nuevos datos

Modificar las definiciones de los procedimientos en un lugar, en vez de actualizar el cdigo


de la aplicacin

EJECUTAR PROCEDIMIENTOS ALMACENADOS

Para invocar o mandar a llamar a un PROCEDIMIENTO ALMACENA se utiliza EXECUTE o EXEC

La llamada a un Procedimientos se hace con un nombre en dos partes

Para pasar un parmetro se debe utilizar arroba @ en el nombre de la variable seguido del valor
que se le asignar, y se hace de esta forma @nombre = valor de, utilizando el tipo de dato
apropiado

EXEC Production.ProductsbySuppliers

@supplierid = 1;

EXEC Production.ProductsbySuppliers

@supplierid = 1, @numrows = 2;
PASAR PARAMETROS A PROCEDIMIENTOS ALMACENADOS

PASAR PARAMETROS DE ENTRADA A PROCEDIMIENTOS ALMACENADOS

Los parmetros son definidos en el encabezado del cdigo del procedimiento, incluyendo nombre,
tipo de dato y direccin (por defecto es de entrada)

Los parmetros son mostrados utilizando SQL Server Management Studio y la vista sys.parameters

Para pasar parmetros en una declaracin EXEC, se utiliza el nombre definido en el procedimiento
almacenado

CREATE PROCEDURE Nombre_del_ProcedimientoAlmacenado

(@NombrePrametrodeEntrada AS TipodeDato)

AS ....

EXEC Nombre_del_ProcedimientoAlmacenado

@NombreParametrodeEntrada = ValorAsignado;

Ejemplo:

CREATE PROCEDURA Production.ProductbySuppliers

(@supplierid AS INT)

AS ...

EXEC Production.ProductbySuppliers

@supplierid = 1;

TRABAJAR CON PARAMETROS DE SALIDA

Los parmetros de salida le permiten devolver valores de un PROCEDIMIENTO ALMACENADO

Lo compara con un conjunto de resultados retornados

Los parmetros de salida son marcados en el encabezado del Procedimientos Almacenado y son
llamados en la consulta

CREATE PROCEDURE <NombredelProcedimientoAlmacenado>

(@<ParametrodeEntrada> AS <TipodeDato>,

@<ParametrodeSalida> AS <TipodeDato> OUTPUT)


AS ....

DECLARE @<ParametrodeSalida> AS <TipodeDato>

EXEC <NombredelProcedimientoAlmacenado> <ListadeParametrosdeEntrada>,

@<ParametrodeSalida> OUTPUT;

SELECT @ParametrodeSalida;

CREAR PROCEDIMIENTOS ALMACENADOS SIMPLES

CREAR PROCEDIMIENTOS QUE DEVUELVEN FILAS

Los Procedimientos Almacenados pueden contener declaraciones SELECT simples o complejas

Los Procedimientos pueden incluir parmetros de entrada y salida, como tambin retornar valores

Usar la declaracin CREATE PROCEDURE

CREATE PROCEDURE <Nombre_del_Esquema.Nombre_del_ProcedimientoAlmacenado>

(<Lista_de_Parametros>)

AS

SELECT <Cuerpo_de_la_declaracin_SELECT>;

Para modificar el diseo de un Procedimiento Almacenado se utiliza la declaracin ALTER


PROCEDURE

No necesita eliminar o volver a crear el Procedimiento Almacenado.

CREAR PROCEDIMIENTOS QUE ACEPTAN PARAMETROS

Los parmetros de entrada pasan al comportamiento lgico de los procedimientos como variables
locales dentro del cdigo del Procedimiento

Para asignarles nombres se debe utilizar antes una arroba @ seguido del tipo de dato en el
encabezado del Procedimientos de esta forma @prefijo AS tipo_de_dato

Referenciar un parmetro en el cuerpo del procedimiento:

CREATE PROCEDURE Production.ProdsByCategory

(@numrows AS INT, @catid AS INT)

AS

SELECT TOP(@numrows), productid, productname, unitprice


FROM Production.Products

WHERE categoryid = @catid;

TRABAJAR CON DYNAMIC SQL

CONSTRUIR DYNAMIC SQL

DYNAMIC SQL es un cdigo T-SQL ensamblado en una cada de caracteres, interpretado como un
comando, y ejecutado.

DYNAMIC SQL provee flexibilidad para tareas administrativas y de programacin

Existen dos mtodos para ejecutar dinmicamente declaraciones SQL

El comando EXEC puede aceptar un STING como entrada en parntesis. Ningn parmetro
puede ser pasado adentro

El Procedimiento Almacenado del Sistema o sp_EXECUTESQL (preferiblemente), soporta


parmetros

Se debe tener cuidado con las entradas no validadas en el SQL dinmico.

Crear un SQL Dinmico se refiere a que el usuario debe autocompletar la declaracin SELECT

ESRIBIR CONSULTAS CON DYNAMIC SQL

Utilizar sp_EXECUTESQL

Acepta STRING como cdigo para ser ejecutado

Soporta parmetros de entrada y salida para las consultas

Permite parametrizar cdigo mientras minimiza el riesgo del SQL Injection

Puede desempearse mejor que EXEC debido a la reutilizacin del plan de consulta

DECLARE @codigoSQL AS Tipo_de_Valor =

N'<Codigo_que_se_ejecuta>

EXEC sys.sp_EXECUTESQL @declaracion = @codigoSQL;

Ejemplo

DECLARE @sqlcode AS NVARCHAR(256) =

N'SELECT GETDATE() AS dt;

EXEC sys.sp_EXECUTESQL @statement = @sqlcode;


En otras palabras, DYNAMIC SQL dentro de un PROCEDIMIENTO ALMACENADO nos permite tener
la posibilidad de construir una expresin a travs de concatenar valores de variables.

EJEMPLO
--Procedimiento Almacenado Simple

CREATE PROCEDURE VentasCategoria

AS

SELECT C.CategoryName, DATEPART(YYYY,O.OrderDate) AS ao, SUM(D.UnitPrice * D.Quantity) AS


total

FROM dbo.Categories AS C

INNER JOIN dbo.Products AS P

ON C.CategoryID = P.CategoryID

INNER JOIN dbo.[Order Details] AS D

ON P.ProductID = D.ProductID

INNER JOIN dbo.Orders AS O

ON D.OrderID = O.OrderID

GROUP BY C.CategoryName, DATEPART(YYYY,O.OrderDate);

GO

--EJECUTAR PROCEDIMIENTOS ALMACENADO

EXECUTE VentasCategoria;

GO

-- RECIBIENDO UN PARAMETRO EN EL PROCEDIMIENTO ALMACENADO

CREATE PROCEDURE sp_VentasCategorias

(@ao AS INT)

AS

SELECT C.CategoryName, DATEPART(YYYY,O.OrderDate) AS ao, SUM(D.UnitPrice * D.Quantity) AS


total

FROM dbo.Categories AS C

INNER JOIN dbo.Products AS P

ON C.CategoryID = P.CategoryID

INNER JOIN dbo.[Order Details] AS D


ON P.ProductID = D.ProductID

INNER JOIN dbo.Orders AS O

ON D.OrderID = O.OrderID

WHERE DATEPART(YYYY,O.OrderDate) = @ao

GROUP BY C.CategoryName, DATEPART(YYYY,O.OrderDate);

GO

--Ejecutando el procedimiento almacenado

EXECUTE sp_VentasCategorias 1997;

GO

--Procedimiento Almacenado que retorna valores

CREATE PROCEDURE sp_VentaCategoria

(@ao AS INT, @numerofilas AS INT OUTPUT)

AS

SELECT C.CategoryName, DATEPART(YYYY,O.OrderDate) AS ao, SUM(D.UnitPrice * D.Quantity) AS


total

FROM dbo.Categories AS C

INNER JOIN dbo.Products AS P

ON C.CategoryID = P.CategoryID

INNER JOIN dbo.[Order Details] AS D

ON P.ProductID = D.ProductID

INNER JOIN dbo.Orders AS O

ON D.OrderID = O.OrderID

WHERE DATEPART(YYYY,O.OrderDate) = @ao

GROUP BY C.CategoryName, DATEPART(YYYY,O.OrderDate)

SET @numerofilas = @@ROWCOUNT;

--Ejecutando el procedimiento almacenado

DECLARE @variable INT

EXEC sp_VentaCategoria 1997, @variable OUTPUT

SELECT @variable AS numerofilas;


GO

--SQL DINAMICO

DECLARE @variable AS VARCHAR(200)

SET @variable = 'SELECT customerid, companyname, contactname FROM customers'

EXECUTE (@variable);

GO

--Forma dinamica

DECLARE @variable AS VARCHAR(200)

SET @variable = 'customers'

EXECUTE ('SELECT * FROM ' + @variable);

GO

--Dynamic SQL en un Procedimiento Almacenado

CREATE PROCEDURE sp_ConsultaDinamica @variable AS VARCHAR(200)

AS

EXECUTE ('SELECT * FROM ' + @variable)

GO

--Ejecutando Procedimientos Almacenado con SQL Dinamico

sp_ConsultaDinamica 'suppliers';
PROGRAMACIN CON T-SQL

ELEMENTOS DE PROGRAMACIN T-SQL

INTODUCCIN A LOS LOTES DE T-SQL

Los Lotes de T-SQL son colecciones de una o ms sentencias T-SQL enviadas a SQL Server como
una unidad de anlisis, optimizacin y ejecucin

Los Lotes se terminan con la instruccin GO por defecto

Los Lotes limitan el alcance de las variables

Algunos estados (por ejemplo, CREATE FUNCTION, CREATE PROCEDURE, CREATE VIEW) no se
pueden combinar con otros en un mismo lote

CREATE VIEW <Nombre_de_Vista>

AS ...

GO

CREATE PROCEDURE <Nombre_del_Procedimiento>

AS ...

GO

En otras palabras, se puede decir que es una manera de limitar la secuencia de instrucciones que
se necesitan ejecutar, las cuales deben llevar un orden establecido. La instruccin GO indica el fin
de una instruccin y el comienzo de otra.

En cuanto a las variables, estas tienen su alcance o bien dejan de existir cuando se impone la
instruccin GO.

En cuanto al manejo de errores, de presentarse alguno en un Lote, solamente mostrar el error en


dicho lote ms no afectar el resto.

TRABAJAR CON LOTES

Los Lotes son analizados para conocer la sintaxis como una unidad

Los errores de sintaxis causan que todo el Lote sea rechazado


Los errores de ejecucin pueden permitir que el Lote pueda continuar ejecutndose
despus de un fallo por defecto

--Valid Batch

INSERT INTO dbo.t1 VALUES(1,2,N'abc');

INSERT INTO dbo.t1 VALUES(2,3,N'def');

GO

--Invalid Batch

INSERT INTO dbo.t1 VALUE(1,2,N'abc');

INSERT INTO dbo.t1 VALUES(2,3N'def');

GO

Los Lotes pueden contener cdigo de control de errores.

INTRODUCCIN A LAS VARIABLES DE T-SQL

Las variables son objetos que permiten el almacenamiento de un valor para su uso posterior en el
mismo lote

Las variables se definen con la palabra clave DECLARE

En SQL Server 2008 y posteriormente, las variables pueden ser declaradas e inicializadas
en una misma instruccin

Las variables son siempre locales al Lote en el que se declaran y salen de su mbito cuando
termina el proceso por Lotes.

---Declaracin e inicializacin de una variable

DECLARE @Nombre_de_la_Variable Tipo_De_Variable = Valore_de_la_Variable

DECLARE @numrows INT = 3, @carid INT = 2;

--Uso de una variable para pasar parametros a un procedimiento almacenado

EXEC Production.PordsByCategory

@numrows = @numrows, @catid = @catid;

GO

De no inicializarse la variable en la misma instruccin que la declaracin, es posible declararla ms


adelante con la instruccin SET
TRABAJAR CON VARIABLES

Inicializar una variable utilizando la sentencia DECLARE

DECLARE @i INT = 0;

Asignar un solo valor (escalar) utilizando la sentencia SET

SET @i = 1;

Asignar un valor a una variable mediante una instruccin SELECT

Se debe asegurar que la instruccin SELECT devuelva exactamente una fila

SELECT @i = COUNT(*) FROM Sales.SalesOrderHeader;

Esto se utiliza cuando el valor que se debe asignar a la variable requiere una consulta a una tabla.

TRABAJAR CON SINNIMOS

Un sinnimo es un alias o un enlace a un objeto almacenado ya sea en la misma instancia de SQL


Server o en un servidor vinculado

Los sinnimos pueden apuntar a tablas, vistas, procedimientos almacenados y funciones

Los sinnimos se pueden utilizar para hacer referencia a objetos remotos como si estuvieran
situados a nivel local, o para proporcionar nombres alternos a otros objetos locales.

Se utiliza la secuencia de comandos CREATE y DROP para administrar los sinnimos

Ejemplo:

USE tempdb;

GO

CREATE SYNONYM dbo.ProdsByCategory FOR

TSQL.Production.ProdsByCategory;

GO

EXEC dbo.ProdsByCategory

@numrows = 3, @catid = 2;

En otras palabras, un sinnimo es la accin de renombrar un objeto con un alias para darle una
definicin ms prctica y ms amigable para el usuario
EL CONTROL DEL FLUJO DEL PROGRAMA

COMPRENDER EL CONTROL DE FLUJO DEL PROGRAMA DE T-SQL

SQL Server proporciona los elementos de lenguaje adicionales que controlan el flujo de ejecucin
de las instrucciones T-SQL.

Se utilizan en Lotes, Procedimientos Almacenados y Funciones de Mltiples Instrucciones

Los elementos del control de flujo permiten declaraciones que se deben realizar en un orden
determinado o en absoluto

El valor por defecto es para comandos que se ejecutan secuencialmente

Incluye IF ... ELSE, BEGIN ... END, WHILE, RETURN, entre otros.

Ejemplo:

IF object_ID('dbo.t1') IS NOT NULL

DROP TABLE dbo.t1:

GO

T-SQL proporciona instrucciones adicionales, mediante las cuales es posible controlar el flujo de
ejecucin del cdigo, para esto puede utilizarse la instruccin IF ... ELSE, la cual tiene un proceso
de VERDADERO o FALSO, WHILE, con la cual es posible manejar ciclos.

TRABAJAR CON IF ... ELSE

IF ... ELSE utiliza un predicado para determinar el flujo del cdigo

El cdigo en el bloque IF es ejecutado si el predicado evaluado es verdadero (TRUE)

El cdigo en el bloque ELSE es ejecutado si el predicado evaluado es falso (FALSE) o


desconocido (UNKNOW)

Es muy til cuando se combina con el operador EXISTS

Ejemplo:

IF OBJECT_ID('dbo.t1') IS NULL

PRINT 'El objeto no existe';

ELSE

DROP TABLE dbo.t1;


TRABAJAR CON WHILE

WHILE permite que el cdigo se ejecute en un loop

Las declaraciones en el bloque del WHILE se repiten mientras el predicado evala si es verdadero
(TRUE)

El loop termina cuando el predicado evaluado es falso (FALSE) o desconocido (UNKNOW)

La ejecucin puede ser cambiada con un BREAK o CONTINUE

Ejemplo:

DECLARE @empid AS INT = 1. @lname AS NVARCHAR(20);

WHILE @empid <= 5

BEGIN

SELECT @lname = lastname FROM HR.Employees

WHERE empid = @empid;

PRINT @lname;

SET @empid += 1;

END;

EJEMPLO
--Variables

DECLARE @tabla VARCHAR(50) = 'Products';

EXECUTE ('SELECT * FROM ' + @tabla);

GO

DECLARE @tabla VARCHAR(50) = 'Customers';

EXECUTE ('SELECT * FROM ' + @tabla);

GO

-- Instruccin SET

DECLARE @tabla VARCHAR(50);

SET @tabla = 'Categories'

EXECUTE ('SELECT * FROM ' + @tabla);

GO
-- Variable sin valor inicial y asignado con la instruccin SELECT

DECLARE @valor INT;

SELECT @valor = COUNT(*) FROM Orders;

SELECT @valor;

GO

--Creacin y Asignacin de un Sinnimo a un Objeto

CREATE VIEW VentasAnuales

AS

SELECT C.CompanyName, DATEPART(YYYY,O.OrderDate) AS anio, SUM(D.UnitPrice * D.Quantity)


AS total

FROM dbo.Customers AS C

INNER JOIN dbo.Orders AS O

ON C.CustomerID = O.CustomerID

INNER JOIN dbo.[Order Details] AS D

ON O.OrderID = D.OrderID

GROUP BY C.CompanyName, DATEPART(YYYY,O.OrderDate)

GO

CREATE SYNONYM TotalesAo FOR VentasAnuales;

GO

SELECT * FROM TotalesAo;

SELECT * FROM VentasAnuales;

GO

--Creando un ciclo con la instruccin WHILE

DECLARE @empid AS INT = 1, @lname AS NVARCHAR(50);

WHILE @empid <= 5

BEGIN

SELECT @lname = LastName FROM dbo.Employees

WHERE EmployeeID = @empid

PRINT @lname
SET @empid = @empid + 1

END;

GO

-- IF dentro de WHILE

DECLARE @i AS INT = 0;

WHILE @i <= 10

BEGIN;

IF (@i %2!= 0)

PRINT @i

SET @i = @i + 1;

END;

GO

-- Instruccin IF

CREATE PROCEDURE InsertarCatalogo

@Companyname VARCHAR(100), @Contactname NVARCHAR(15), @ContactTitle VARCHAR(150),


@Country VARCHAR(150),

@tabla VARCHAR(100)

AS

IF @tabla = 'Customers'

BEGIN

INSERT INTO dbo.Customers(CustomerID, CompanyName, ContactName,


ContactTitle, Country)

VALUES (SUBSTRING(@Companyname, 1,5), @Companyname, @Contactname,


@ContactTitle, @Country)

END

ELSE

BEGIN

INSERT INTo dbo.Suppliers(CompanyName, ContactName, ContactTitle, Country)

VALUES(@Companyname, @Contactname, @ContactTitle, @Country)

END;
GO

-- Ejecutando SP

EXECUTE InsertarCatalogo 'MRK, s.a.', 'Enrique Merck', 'Lic', 'Guatemala', 'Suppliers';

EXECUTE InsertarCatalogo 'MRK, s.a.', 'Enrique Merck', 'Lic', 'Guatemala', 'Customers';

SELECT * FROM dbo.Customers

WHERE CompanyName = 'MRK, s.a.';

SELECT * FROM dbo.Suppliers

WHERE CompanyName = 'MRK, s.a.';


INTERPRETAR EL MANEJO DE ERRORES

APLICACIN DEL TRATAMIENTO DE ERRORES EN T-SQL

ERRORES Y MENSAJES DE ERROR

Elementos de Errores del Motor de Base de Datos


Nmero nico que identifica el error
ERROR NUMBER
especfico
ERROR MESSAGE Texto que describe el error
Indicador numrico a partir de la seriedad
SEVERITY
comprendido del 1 25
Cdigo de estado interno para el estado del
STATE
motor de base de datos
El nombre del Procedimiento Almacenado o
PROCEDURE
desencadenador en el que produce el error
Nmero de lnea en donde existe un error ya
LINE NUMBER sea para una consulta independiente o bien un
lote o procedimiento genera el error

El mensaje de error del sistema (System Error) se encuentra en SYS.MESSAGES

Es posible aadir errores personalizados de las aplicaciones utilizando el Procedimiento


Almacenado sp_add_message

Para crear nuestros mensajes de errores personalizados es indispensable utilizar el Procedimiento


Almacenado sp_ADDMESSAGE mediante el cual se generar un mensaje cuando exista un error,
seguido del Procedimiento Almacenado, se debe utilizar el nmero 50001, seguido es necesario
agregar un grado de severidad siempre comprendido entre el rango que va del 1 - 25, el nivel 16 es
el nmero de severidad utilizado por estndar, por ultimo debe ser agregado el mensaje que se
desea mostrar siempre que este vaya encerrado en comillas simples ('')

EXEC sp_addmessage Nmero_del_error, Nmero_de_severidad, 'Mensaje que se desea


mostrar';

Ejemplo:

EXEC sp_addmessage, 50001, 16, 'Atencin!';


GENERAR ERRORES USANDO RAISERROR

La instruccin RAISERROR, se utiliza para disparar o mostrar un error.

RAISERROR(Nmero_de_error, Nmero_de_severidad_del_error,
Nmero_de_estado_del_error)

RAISERROR es usado para:

Facilitar la solucin del cdigo T-SQL

Comprobar los valores de los datos

Devolver los mensajes que contienen texto variable

Ejemplo:

RAISERROR(N'%s%d', -- Mensaje de texto

10, -- Severidad

1, -- Estado

N'Custom error message number',

2);

Retorna:

Custom error message number 2

GENERAR ERROES USANDO THROW

La instruccin THROW tambin es utilizada para disparar o mostrar errores.

SQL Server provee de la declaracin THROW

Es la sucesora de la instruccin RAISERROR

No requiere la definicin de los errores en la tabla d SYS.MESSAGES

Ejemplo:

THROW 50001,'An Error Ocurred', 0;

En otras palabras, la instruccin THROW no necesita que el administrador de la base de datos cree
o defina el mensaje del error dentro de las tablas del sistema, mediante el Procedimiento
Almacenado sp_ADDMESSAGE, lo que lo hace ms prctico.
EL USO DE @@ERROR

Cuando se genera un error, se crea una variable del sistema la cual es @@error, esta almacena el
cdigo del ultimo error generado.

CREACIN DE ALERTAS CUANDO SE PRODUCEN ERRORES

El posible crear alertas, esto puede hacerse mediante cdigo T-SQL o bien de forma grfica, para
hacerlo de forma grfica es necesario ir al apartado de SQL Server Agent, luego al apartado de
Alertas.

Para crear una alerta damos Click derecho sobre el apartado de Alertas y seleccionamos la opcin
de Nueva Alerta

Se le asigna un nombre a la Alerta.

Estas alertas pueden ser disparadas ya sea por el Nmero de Error o bien por la Severidad del
mismo, esto se define cuando se est creando la Alerta.

Tambin es posible indicarle a SQL Server que tome algn tipo de accin, esta ser definida por el
Administrador de la base de datos, en el apartado de Respuesta, siempre dentro del men de
creacin de alerta.

Las Alertas pueden visualizarse en el Visor de Eventos de WINDOWS

APLICACIN DEL CONTROL DE EXCEPCIONES ESTRUCTURADAS

MANEJO DE EXCEPCIONES ESTRUCTURADAS

El manejo de excepciones estructuradas permite una respuesta centralizada para los errores de
ejecucin en tiempo real

TRY ejecuta un bloque de comandos y CATCH captura cualquier error

La ejecucin se mueve al bloque de comandos CATCH cuando ocurre un error

No se necesita verificar cada declaracin para ver si un error a ocurrido

El administrador de base de datos decide s la transaccin debe hacer un ROLL BACK,


registrar los errores, etc.

No todos los errores pueden ser capturados por TRY / CATCH

Errores de sintaxis o compilacin

Algunos errores de resolucin de nombres


CREANDO BLOQUES TRY CATCH

El bloque TRY est definido por las declaraciones BEGIN TRY y END TRY

Coloca todo el cdigo que podra generar un error entre ellos

No se debe colocar ningn cdigo entre la instruccin END TRY y BEGIN CATCH

Los bloques TRY y CATCH pueden ser anidados

El bloque CATCH est definido por las declaraciones BEGIN CATCH y END CATCH

La ejecucin se mueve al bloque CATCH cuando se captura un error ocurrido dentro del
bloque TRY

BEGIN TRY

SELECT <Lista_seleccionada> --Donde se puede generar el error

END TRY

BEGIN CATCH

--Se responde el error aqu

END CATCH;

Ejemplo:

BEGIN TRY

SELECT 1/0 --se genera el error aqu

END TRY

BEGIN CATCH

--responde al error aqu

END CATCH

EJEMPLO
--Errores

SELECT 80/0;

--Creando errores personalizados RAISERROR

EXEC sp_addmessage 50001, 16, 'Atencin la divisin entre 0 no est definida!';

GO

RAISERROR(50001,16,1);
--Errores con THROW

THROW 50001, 'Ha ocurrido un error', 16;

GO

-- ERROR CON @@ERROR

SELECT 80/0

SELECT @@ERROR

GO

--MANEJO DE ERRORES CON TRY ... CATCH

BEGIN TRY

SELECT 80/0;

END TRY

BEGIN CATCH

SELECT ERROR_NUMBER() AS NumeroError,

ERROR_SEVERITY() AS NumeroSeveridad,

ERROR_STATE() AS NumeroEstado,

ERROR_PROCEDURE() AS ProcedimientoAlmacenadodelError,

ERROR_MESSAGE() AS MensajeError

END CATCH;
IMPLEMENTAR TRANSACCIONES

TRANSACCIONES Y EL MOTOR DE BASE DE DATOS

DEFINICIN DE TRANSACCIONES

Una transaccin es un grupo de tareas que definen una unidad de trabajo

Toda la unidad tiene xito o bien falla de forma conjunta, no est permitida una terminacin
parcial

--Dos tareas que hacen una unidad de trabajo

INSERT INTO Sales.Orders ...

INSERT INTO Sales.OrderDetails ...

Las declaraciones de modificacin de datos individuales se tratan automticamente como


transacciones independientes

Las Transacciones de usuarios se pueden administrar con comandos T-SQL:

BEGIN TRANSACTION / COMMIT TRANSACTION / ROLLBACK TRANSACTION

SQL Server utiliza mecanismos de bloqueo y el registro de transacciones para admitir las
transacciones.

Una transaccin es cualquier elemento que Inserta, Modifica o Elimina datos en el disco duro.

LA NECESIDAD DE TRANSACCIONES: PROBLEMAS CON LOTES

Algunos errores de tiempo de ejecucin durante un lote pueden resultar en un xito parcial
inaceptable:

Si parte del lote tiene xito y otra parte falla, deja atrs los resultados de la parte del lote
que sucedi

El manejo sencillo de errores dentro de un lote no puede repara el xito parcial

--Lote sin administracin de transacciones

BEGIN TRY

INSERT INTO Sales.Orders ... -- Insercin Exitosa


INSERT INTO Sales,OrderDetails ... -- Insercin Fallida

END TRY

BEGIN CATCH

--Filas insertadas todava existen en la tabla Sales.Orders

SELECT ERROR_NUMBER()

...

END CATCH;

En otras palabras, las transacciones son importantes porque algunos errores en tiempo de
ejecucin en un lote pueden resultar en xito parcialmente inaceptable,

TRANSACCIONES AMPLIAR LOTES

Los comandos de transaccin identifican bloques de cdigo que deben tener xito o fallar de
forma conjunta y proporcionar puntos en los que el motor de base de datos puede revertir o
deshacer las operaciones:

Ejemplo

BEGIN TRY

BEGIN TRANSACTION

INSERT INTO Sales.Orders ... --Insercin exitosa

INSERT INTO Sales.OrderDetails ... --Insercin fallida

COMMIT TRANSACTION --Si no hay errores, la transaccin se completa

END TRY

BEGIN CATCH

--Las filas insertadas en la tabla Sales.Orders todavia existen

SELECT ERROR_NUMBER()

ROLLBACK TRANSACTION --Se cancela cualquier transaccin trabajada

END CATCH;

Para empezar una transaccin se debe especificar con la instruccin BEGIN TRANSACTION
BEGIN TRY

BEGIN TRANSACTION

INSERT, UPDATE, DELETE

COMMIT TRANSACTION

END TRY

BEGIN CATCH

Captura de Errores

ROLLBACK TRANSACTION

END CATCH;

CONTROL DE TRANSACCIONES

BEGIN TRANSACTION

Esta instruccin marca el punto de partida en una transaccin explcita definida por el usuario

Las transacciones duran hasta que se emite la sentencia COMMIT, o cuando se emite una
sentencia ROLLBACK, de igual forma al momento de que exista una prdida de conexin con el
servidor SQL Server o el cliente, se emite la sentencia ROLLBACK de forma automtica para evitar
cualquier inconsistencia en la transaccin.

Las transacciones son locales a una conexin y no pueden abarcar conexiones

En el cdigo T-SQL: Marca el inicio del trabajo la transaccin

BEGIN TRY

BEGIN TRANSACTION --Marca el inicio de la transaccin

INSERT INTO ... --Trabajo de la transaccin

INSERT INTO ... --Trabajo de la transaccin

.......

COMMIT TRANSACTION

La instruccin COMMIT asegura que todas las modificaciones de la transaccin sean parte
permanente de la base de datos

La instruccin COMMIT libera recursos, tales como bloques, utilizados por la transaccin

En el cdigo T-SQL: Si una transaccin es exitosa, Confrmela


BEGIN TRY

BEGIN TRANSACTION --Marca el inicio de la transaccin

INSERT INTO ... --Trabajo de la transaccin

INSERT INTO ... --Trabajo de la transaccin

COMMIT TRANSACTION -- Marca la transaccin como completa

END TRY

ROLLBACK TRANSACTION

La instruccin ROLLBACK deshace todas las modificaciones realizadas en la transaccin volviendo


los datos al estado en el que se encontraban al inicio de la transaccin

ROLLBACK libera recursos, tales como bloqueos, mantenidos por la transaccin

Antes de retroceder, puede probar el estoado de la transaccin mediante la funcin XACT_STATE

En cdigo T-SQL: Si se produce un error, ROLLBACK al punto de la instruccin BEGIN


TRANSACTION, es decir que ROLLBACK retrocede hasta el inicio de la transaccin sin que se gener
cambio alguno en la base de datos.

BEGIN CATCH

SELECT ERROR_NUMBER() --Manejo simple de error

ROLLBACK TRANSACTION --Retrocede al inicio en la transaccin

END CATCH;

Toda transaccin realizada pasa primeramente por el LOG de Transacciones, este acta como una
bitcora dentro de la base de datos, ya que registra todos los INSERT, UPDATE O DELETE que se
hacen dentro de la base de datos. Dentro de este LOG de Transacciones es en donde se espera la
confirmacin mediante una instruccin COMMIT TRANSACTION.

COMMIT TRANSACCTION puede darse de forma automtica, siempre y cuando sea el propio SQL
Server quien lo maneje, pero si la transaccin est siendo manejada de forma explcita SQL Server
esperar una instruccin COMMIT TRANSACTION y nicamente si recibe esta instruccin es escrita
la Insercin, Modificacin o Eliminacin de un registro dentro de la base de datos.

Dentro de SQL Server existe un Procedimiento Almacenado llamado sp_lock, este Procedimiento
indica los bloqueos con objetos de la base de datos que estn establecidos, los bloqueos hacen
referencia a las conexiones, estas conexiones que se realizan con objetos dentro de la base de
datos pueden que realmente bloqueen o no.
Existen 2 tipos de bloques:

Los bloqueos ESTANDAR (S), son aquellos que nicamente representan conexiones
establecidas, las cuales no realizan un bloqueo como tal, permitiendo a los usuarios poder
utilizar y realizar consultas sobre los objetos en los cuales se establecen los bloqueos
Los bloqueos de tipo EXCLUSIVO (X) o bien EXCLUSIVO DE INTENCIN (IX), son aquellos
que si establecen un bloqueo como tal a los objetos de la base de datos, lo cual no permite
ninguna consulta, o uso del objeto por parte del usuario

USO DE XACT_ABORT

SQL Server no devuelve automticamente las transacciones cuando se produce un error

Para retrotraer o retroceder, debe utilizarse la instruccin ROLLBACK en la lgica de manejo de


errores o bien se debe habilitar XACT_ABORT

XACT_ABORT especifica si SQL Server devuelve automticamente la transaccin actual cuando se


produce un error de tiempo de ejecucin

Cuando SET XACT_ABORT es en ON o encendido, toda la transaccin se termina y se deshace en


caso de error, a menos que se produzca en el bloque TRY

SET XACT_ABORT OFF, es el valor predeterminado

Cambiar el valor XACT_ABORT mediante el comando SET:

SET XACT_ABORT ON;

Las transacciones permiten ejecutar un grupo de instrucciones como una unidad de trabajo, por lo
que, si alguna de estas instrucciones falla, fallar por completo el lote entero de instrucciones.

EJEMPLO
--Ver los bloqueos o conexiones sobre objetos de la base de datos

sp_lock;

GO

--Declarando una transaccin

BEGIN TRANSACTION

INSERT INTO Customers(CustomerID, CompanyName, ContactName, ContactTitle,


Country)

VALUES
('VHC1','MRK','Enrique Merck','Lic. Sistemas','Guatemala');

GO

--Deshacer la transaccin

ROLLBACK TRANSACTION

--Confirmar la transaccin

COMMIT TRANSACTION

--Uso de XACT_ABORT

SET XACT_ABORT ON;

GO

BEGIN TRANSACTION

INSERT INTO dbo.[Order Details] (OrderID, ProductID, UnitPrice, Quantity, Discount)

VALUES(10248, 22, 11.50, 12, 0)

INSERT INTO dbo.[Order Details] (OrderID, ProductID, UnitPrice, Quantity, Discount)

VALUES(10248, 22, 11.50, 12, 0)

INSERT INTO dbo.[Order Details] (OrderID, ProductID, UnitPrice, Quantity, Discount)

VALUES(10249, 22, 11.50, 12, 0)

COMMIT TRANSACTION;
MEJORAR EL RENDIMIENTOS DE LAS CONSULTAS

FACTORES EN EL RENDIMIENTO DE LAS COSNSULTAS

ESCRIBIR CONSULTAS CON BUEN DESEMPAO

Se debe recuperar solamente lo que se necesita

En la clusula SELECT, se debe utilizar nicamente las columnas necesarias, en otras


palabras, se debe evitar el uso de * en la clusula SELECT

Se debe utilizar la clusula WHERE, con el fin de realizar un filtrado y devolver solamente
las filas necesarias

Mejorar el rendimiento de la bsqueda de la clusula WHERE

Evitar expresiones que manipulan las columnas en el predicado, tales como formulas o
bien condiciones complejas que deban primero realizar operaciones

Minimizar el uso de tablas temporales frente a las variables de tabla

Utilizar las funciones de ventanas u otras operaciones basadas en conjuntos cuando sea
posible

Evitar los cursores y otros mtodos iterativos

Trabajar con el administrador de base de datos (DBA) para organizar ndices buenos que apoyen
filtros, JOINS, y ordenamientos

Aprender cmo hacer frente a las tareas con diferentes enfoques de consulta para comparar el
rendimiento.

LA INDEXACIN EN SQL SERVER

SQL Server tiene acceso a los datos mediante el uso de ndices o mediante el escaneo de todas las
filas de una tabla

Los ndices tambin soportan operaciones tales como las de agrupacin, unin y clusulas ORDER
BY de ordenamiento

Son de suma importancia ya que permiten bsquedas ms eficientes, evita el ordenamiento de


datos ya que estos se encuentran previamente ordenados lo cual ahorra tiempo.
FUNDAMENTOS DE NDICE DE SERVIDOR SQL: NDICES AGRUPADOS

Tambin llamado ndice CLUSTEREADO es aquel que se ordena fsicamente con el disco por la
columna o columnas que se le indiquen, esto hace que los datos estn predispuestos en el disco
duro en base al ndice agrupado o CLUSTEREADO

Los ndices agrupados determinan el orden lgico de las filas dentro de una tabla

Conceptualmente, una tabla con un ndice agrupado es como un diccionario, cuyos


trminos son la clave del ndice

Caractersticas de los ndices agrupados:

Un ndice agrupado en una columna provoca que una tabla que se guardar con filas
lgicamente organizadas por los valores de las columnas

Un ndice agrupado no es una estructura fsica separada de la tabla de datos, es decir el


ndice se almacena en la tabla

Solamente puede existir un ndice agrupado por tabla

FUNDAMENTOS DE NDICE DE SERVIDOR SQL: NDICES NO AGRUPADOS

Tambin llamado NO CLUSTEREADO, es aquel que crea una estructura adicional llamada a nivel de
hoja

Los ndices no agrupados son estructuras separadas con punteros a la ubicacin de los datos

Conceptualmente es similar a un ndice de materia impresa en la parte posterior de un


libro

Los ndices no agrupados proporcionan formas alternativas para localizar rpidamente los datos

Si la tabla tiene un ndice agrupado el cual est en empid, y un ndice no agrupado en el


apellido, esto puede ser til para consultas que utilizan el apellido en el predicado

Una tabla puede tener varios ndices no agrupados

La adicin de ndices no agrupados se suma a los requisitos de almacenamiento de la base


de datos, se suma el tiempo de procesamiento cuando se actualizan los datos.

LOS NDICES DE SQL SERVER: CONSIDERACIONES SOBRE EL RENDIMIENTO

Se deben de comprobar los planes de ejecucin de las consultas para ver si los ndices estn
presentes y se usan como se espera que se haga

Para los escritores de consultas que no son los DBAs o los desarrolladores, que no son capaces de
detectar problemas con los ndices, tales como los recorridos de tablas cuando se espera que
utilice un ndice, puede ser muy til en una aplicacin tuning
Un plan de ejecucin es la manera en que SQL Server devuelve un dato, mostrando la ruta que
tom para devolver el dato.

ESTADSTICAS DE DISTRIBUCIN

Las estadsticas de distribucin describen la distribucin y la singularidad, de la selectividad, de los


datos

Las estadsticas de forma predeterminada, se crean y se actualizan de automticamente

Las estadsticas son utilizadas por el optimizador de consultas para estimar la selectividad de los
datos, incluyendo el tamao de los resultados

Las grandes variaciones entre los valores estimados y los reales podran indicar un problema con
las estimaciones, que pueden ser abordados a travs de estadsticas de actualizacin

Selectivo es aquella consulta de devuelve pocos datos

DENIFICIN DE CURSORES

Los cursores proporcionan un mecanismo para trabajar con una fila a la vez en un cierto orden

A diferencia de los conjuntos, que permiten trabajar en todas las filas de una solo vez y no
tiene fin

Conceptualmente es similar a un bucle WHILE cclico a travs de los datos de una fila a la vez

El enfoque del cursor es a menudo familiar para los nuevos desarrolladores de T-SQL, pero tiene
sus inconvenientes.

Un cursor carga los datos a la memoria voltil, con el fin de mostrar los datos ms rpidamente

EVITAR CURSORES

Los cursores contradicen al modelo relacional, que opera en conjuntos

Los cursores normalmente requieren ms cdigo que el enfoque basado en conjuntos

Los cursores normalmente incurren en ms sobrecarga durante la ejecucin de una operacin


basada en conjunto comparable

Alternativas a los cursores:

Funciones de ventanas

Las funciones de agregado


Uso apropiado para los cursores:

La generacin de cdigo SQL dinmico

La realizacin de tareas administrativas

DEPLEGANDO DATOS DE RENDIMIENTO DE LAS CONSULTAS

QUE ES UN PLAN DE EJECUCIN?

Es la revisin del proceso de ejecucin de una consulta

Analizar, resolver, optimizar, ejecutar

Un plan de ejecucin incluye informacin sobre qu tablas hay acceso, sobre que ndices, lo que se
une para realizar la consulta

Si existen estadsticas para una columna o ndice correspondiente, a continuacin, el


optimizador lo utilizar en sus clculos

Las herramientas de SQL Server proporcionan acceso a los planes de ejecucin para mostrar cmo
se ejecuta una consulta o cmo iba a ser ejecutado

Los planes disponibles en formato de texto (en desuso), formato XML, y representaciones
grficas de XML

Visor de planos accesibles en los resultados del panel de SSMS

LOS PLANES REALES Y ESTIMADOS DE EJECUCIN

Los planes de ejecucin de forma grfica representan los mtodos que utiliza SQL Server para
ejecutar las sentencias en una consulta T-SQL

SSMS proporciona acceso a dos tipos de planes de ejecucin:

Planes de ejecucin estimados no ejecutando la consulta. En cambio, muestra el plan que


SQL Server probablemente usara si se ejecuta la consulta

Planes de ejecucin reales, se devuelven la prxima vez que se ejecute la consulta.


Presentan el plan de realmente fue utilizado por SQL Server

VISUALIZACIN DE LOS PLANES DE EJECUCIN GRFICOS

Para habilitar la visualizacin del plan de ejecucin en SSMS:

Seleccionar Consulta o Query

Seleccionar Mostrar plan de ejecucin estimado o Display Estimated Execution


Plan
Seleccionar Incluir plan de ejecucin actual o Include Actual Execution Plan

INTERPRETAR EL PLAN DE EJECUCIN

El TABLE SCAN, podramos decir que es igual que buscar un tema en un libro sin hacer uso del
ndice, sin un orden apropiado, se debera de ir hoja por hoja del libro hasta encontrar el tema
deseado, de la misma forma un TABLE SCAN indica al motor de base de datos que necesita leer
completamente la tabla sin utilizar un ndice porque no existe lo que no es funcional, lo cual la
mayor parte del tiempo es deficiente.

Existe tambin el TABLE SACN con paralelismo, lo que quiere decir que se divide la carga de
trabajo en varios procesadores y de esta forma distribuye paralelamente la carga de trabajo que
esta ocasionando el escaneo de la tabla

CLUSTERED INDEX SCAN, es similar a TABLE SCAN pero con la diferencia que la tabla cuenta con un
ndice clustereado el cual pre-ordena los datos, con lo cual al momento de realizar el escaneo este
lo hace recorriendo los datos ordenados, de igual forma es lento que recorra todo el ndice por lo
que no es eficiente.

CLUSTERED INDEX SEEK, este si mucho ms eficiente, este tipo de accin es buscar en el
diccionario, el cual sabemos que se encuentra ordenado de forma alfabticamente, por lo que, si
se realiza una bsqueda a una palabra, no se emperezar a buscar letra por letra, sino que se
buscar por la letra con la cual empieza la palabra.

NON CLUSTERED INDEX SCAN, al no poder ordenar los datos fsicamente en el disco duro, porque
esto ya lo hizo el ndice clustereado, se crea una estructura adicional con las columnas que va a
indexar y ordena las columnas, si la consulta solo usa la estructura del ndice sin llegar a tocar las
pginas de datos esto no es perfecto, pero es ms eficiente que el TABLE SCAN y que el
CLUSTERED INDEX SCAN.

NON CLUSTERED INDEX SEEK, es el perfecto uso de un ndice NON CLUSTERE, el concepto es
similar a buscar un tema en un libro, donde recurrimos al ndice del libro en las primeras hojas
para localizar la pgina donde est la informacin a consultar.

STREAM AGGREGATE, aparece cuando se agrupan los datos, y se mezclan con funciones de
agregado como MIN, SUM, AVG, entre otros, tambin la clusula HAVING.
ORDER BY, cuando el motor de base de datos necesita ordenar por un campo que no est pre-
ordenado por un ndice necesita hacer la operacin de ordenamiento que por lo general baja el
rendimiento de la consulta.

NESTED LOOP JOIN, son dos conjuntos de datos donde uno se encuentra pre-ordenado y con
elementos nicos y el otro no, se toma como base el conjunto ordenado y de los tems nicos
elegir el primer elemento y buscar su correspondiente match con cada elemento del segundo
conjunto, recorriendo todos los elementos debido a que el segundo elemento no se encuentra
ordenado. Al terminar e iniciar con el segundo elemento es imposible que exista nuevamente el
primer elemento y que quede algn match con el segundo elemento ya que para esto se
encontraba previamente ordenado.

MERGE JOIN, este operador es el ms eficiente de los JOINs y en este caso tanto el primer
conjunto de datos como el segundo se encuentran previamente ordenados, lo que hace una
bsqueda ms eficiente en el segundo conjunto de datos. Nuevamente cada elemento del primer
conjunto de datos busca hacer match con los tems del segundo conjunto de datos, pero al estar
ordenado el segundo conjunto de datos, y al ya no existir ms coincidencias, ya no es necesario
recorrer toda la tabla por cada elemento del primer conjunto.

HASH JOIN, este es el ms deficiente de los JOINs, ya que, al no encontrar un ordenamiento valido
a travs de ndices en ninguna de las dos tablas o conjunto de datos (es decir no hay ndices en
ninguna de las 2 tablas), tiene que crear una tabla temporal ordenada para sustituir uno de los
conjuntos y luego emular un JOIN como lo es el NESTED LOOP JOIN.

VER ESTADSTICAS DE CONSULTAS

SQL Server provee informacin de detalles en tiempo de ejecucin acerca de la ejecucin de una
consulta o query

STATISTICS TIME mostrar el tiempo tardado en el anlisis y compilacin de una consulta

SET STATISTICS TIME ON;

STATISTICS IO mostrar la cantidad de actividad de disco que genera una consulta

SET STATISTICS IO ON;

EJEMPLO
--Plan de ejecucin

SELECT customerid, CompanyName, contactname


FROM dbo.Customers

WHERE CustomerID = 'ALFKI'

GO

SELECT customerid, CompanyName, contactname

INTO Clientes

FROM Customers

GO

SELECT customerid, CompanyName, contactname

FROM dbo.Clientes

WHERE CustomerID = 'ALFKI';

--Crear Indice Agrupado

CREATE CLUSTERED INDEX CL_Clientes

ON dbo.Clientes(Customerid);

GO

--Funcion de agregado

SELECT country, COUNT(customerid) FROM dbo.Customers

GROUP BY Country;

GO

--JOINS

SELECT C.CustomerID, C.CompanyName, C.Country, O.OrderID, O.OrderDate, CA.CategoryName,


P.ProductName, D.UnitPrice, D.Quantity

FROM dbo.Customers AS C

INNER JOIN dbo.Orders AS O

ON C.CustomerID = O.CustomerID

INNER JOIN dbo.[Order Details] AS D

ON O.OrderID = D.OrderID

INNER JOIN dbo.Products AS P

ON D.ProductID = P.ProductID

INNER JOIN dbo.Categories AS CA


ON P.CategoryID = CA.CategoryID

WHERE C.CustomerID = 'ALFKI';


CONSULTAR LA METADATA EN SQL SERVER

Los metadatos es la informacin de la base de datos, est incluye las tablas y objetos de la base de
datos, esta informacin debe de ser almacenada en tablas del sistema. A estas tablas del sistema
las cuales poseen la informacin es a lo que le llamaremos METADATA.

CONSULTAR VISTAS Y FUNCIONES A CATALOGOS DEL SISTEMA

VISTAS DE CTALOGO DEL SISTEMA

Se encuentran incorporados en las vistas que proporcionan informacin sobre el catalogo del
sistema

Se utilizan los metadatos de consulta estndar para devolver metadatos

COLUMN LIST, JOIN, WHERE, ORDER BY

Algunas vistas son filtradas para mostrar slo los objetos del usuario, algunas vistas incluyen
objetos del sistema

--Pre-filtrado para excluir objetos del sistema

SELECT name, OBJECT_ID, SCHEMA_ID, TYPE, TYPE_DESC

FROM SYS.TABLES:

--Incluyendo objetos del sistema y de usuario

SELECT name, OBJECT_ID, SCHEMA_ID, TYPE, TYPE_DESC

FROM SYS.OBJECTS;

Los catlogos del sistema empiezan con el prefijo sys, y pueden ser consultados, como, por
ejemplo: SYS.TABLES, SYS.OBJECTS, SYS.INDEXES, entre otros. Estos catlogos de sistema pueden
combinarse con otros catlogos mediante la implementacin de JOINs, la clusula WHERE, ORDER
BY.

Es posible realizar todo esto ya que se comporta como una tabla normal, con la diferencia que
almacena informacin de la base de datos.
VISTAS DE ESQUEMA DE INFORMACIN

Las vistas de INFORMATION_SCHEMA, son un estndar ISO y pueden ser utilizadas para consultar
los metadatos de la base de datos

Las vistas almacenadas en el esquema del sistema son llamadas INFORMATION_SCHEMA

Es un sistema de retorno de metadatos segn la norma ISO, y es una herramienta utilizada en


otros gestores de bases de datos.

Mapea nombres estndar (catlogo, dominio) a los nombres de SQL Server (base de datos, tipos
de datos definidos por el usuario)

Ejemplo:

SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE

FROM INFORMATION_SCHEMA.TABLES;

SELECT VIEW_CATALOG, VIEW_SCHEMA, VIEW_NAME, TABLE_CATALOG,

TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME

FROM INFORMATION_SCHEMA_VIEW_COLUMN_USAGE;

FUNCIONES DEL SISTEMA DE MATADATOS

Devuelven informacin acerca de los ajustes, valores y objetos en SQL Server

Vienen en una variedad de formatos:

Algunas marcadas con el prefijo @@, designado a veces incorrectamente como variables
globales del sistema: @@VERSION

Algunas marcadas con un sufijo (), simular a las funciones aritmticas o de cadena:
ERROR_NUMBER()

Algunas funciones especiales marcadas con un prefijo: $$PARTITION

Se pregunta con una instruccin SELECT estndar:

Ejemplo:

SELECT @@VERSION AS SQL_Version;

SELECT SERVERPROPERTY('ProductVersion') AS version;

SELECT SERVERPROPERTY('Collation') AS collation;


Estas funciones especiales devuelven la configuracin de la base de datos.

EJECUTAR PROCEDIMIENTOS ALMACENADOS DEL SISTEMA

EJECUCIN DE PROCEDIMIENTOS ALMACENADOS

Se debe utilizar el comando EXECUTE o EXEC antes del nombre del procedimiento almacenado

Para pasar parmetros por nombre o posicin, se debe separar por comas (,) cuando sea aplicable

--Sin parmetros

EXEC SYS.sp_DATABASES;

--Un nico parmetro

EXEC sys.sp_help N'Sales.Customers';

--Mltiples parmetros nombrados

EXEC sys.sp_tables

@table_name = '%',

@table_owner = N'Sales';

Los procedimientos almacenados que empiezan con el prefijo sp, son importantes ya que
devuelven informacin acerca del estado del servidor o de la base de datos

EJECUCIN DE PROCEDIMIENTOS ALMACENADOS DEL SISTEMA

Los procedimientos almacenados del sistema son:

Marcado con un sp_prefix

Almacenados en un recurso escondido en la base de datos

Aparecen de forma lgica en el esquema sys de cada usuario y del sistema de base de

datos

Las mejores prcticas para su ejecucin incluyen:

Siempre utilizar EXEC o EXECUTE en lugar de simplemente llamarlos por su nombre

definido

Incluir el nombre del esquema sys cuando se ejecute


Nombrar cada parmetro y especificar que tipo de dato es apropiado

--Este ejemplo usa EXEC, incluye el nombre del esquema sys, y pasa el nombre de
la tabla como un parmetro unicodigo nombrado

-- a un procedimiento aceptando un parmetro de entrada tipo NVARCHAR(776)

EXEC sys.sp_help @objectname = N'Sales.Customers';

SISTEMA COMN DE PROCEDIMIENTOS ALMACENADOS

Los procedimientos del motor de base de datos pueden proveer metadatos generales

sp_help, sp_helplanguage

sp_who, sp_lock

Los procedimientos de catlogos pueden ser usados como una alternativa a las vistas y funciones
del catlogo del sistema

Nombre Descripcin

Lista todas las bases de datos en una instancia


sp_databases
de SQL Server

Retorna una lista de las tablas o vistas,


sp_tables
exceptuando los sinnimos

Retorna informacin de la columna para los


sp_columns
objetos especificados

CONSUTLAR LOS OBJETOS DE ADMINISTRACIN DINMICA

ACERCA DE LOS OBJETOS DE GESTIN DINMICA

Las vistas y funciones dinmicas de administracin (DMV) devuelven informacin acerca del
estado del servidor

Casi 200 DMV incluidos en SQL Server

Los DMVs incluyen informacin de catlogo, as como informacin de estado administrativo, como
dependencia de objetos

Los DMVs son de mbito del servidor (a nivel de instancia) o de base de datos

Es necesario el nombre del esquema para ser invocado

Requiere permisos de VIEW SERVER STATE o VIEW DATABASE STATE para consultar los DMVs
La estructura subyacente cambia con el tiempo, as que se debe evitar escribir consultas SELECT *
sobre los DMVs

CATEGORIZACIN DE LOS DMV

Los DMVs son categorizados por convencin de nomenclatura

Patrn de nomenclatura Descripcin

Db Informacin relacionada con la base de datos

Informacin relacionada con la ejecucin de


Exec
consultas

Informacin del Sistema Operativo de SQL


Io
Server (SQLOS)

Tran Informacin relacionada con Transacciones

CONSULTAR VISTAS Y FUNCIONES DE GESTIN DINMICA

Las vistas de gestin dinmica son como consultas de vista estndar

Ejemplo:

SELECT session_id, login_time, PROGRAM_NAME

FROM sys.dm_exec_sessions

WHERE is_user_process = 1;

Las funciones de gestin dinmicas son consultas como las funciones de valor de tabla, incluyendo
los parmetros

Ejemplo:

SELECT referencing_schema_name, referencing_entity_name,

referencing_class_desc

FROM sys.dm_sql_referencing_entities('Sales.Orders', 'OBJECT');

EJEMPLO
--Catalagos del sistema

SELECT I.name, OBJECT_NAME(IC.object_id) AS NombreTabla, COL_NAME(IC.object_id,


IC.column_id) AS NombreColumna
FROM SYS.indexes AS I

INNER JOIN SYS.index_columns AS IC

ON I.object_id = IC.object_id

AND I.index_id = IC.index_id AND I.is_primary_key = 1;

GO

--Llamando a un catalogo o tabla del sistema

SELECT * FROM SYS.views;

GO

--Procedimiento Almacenado que lista el script de la vista

sp_helptext INVOICES

GO

--Consultar los catalogos del sistema a traves de VISTA INFORMATION_SCHEMA

SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE

FROM INFORMATION_SCHEMA.TABLES;

GO

SELECT VIEW_CATALOG, VIEW_SCHEMA, VIEW_NAME, TABLE_CATALOG, TABLE_SCHEMA,


TABLE_NAME, COLUMN_NAME

FROM INFORMATION_SCHEMA.VIEW_COLUMN_USAGE;

GO

--Ejecucin de Procedimientos almacenados

sp_helpdb Northwnd;

GO

sp_help Customers;

GO

sp_who;

GO

sp_who2;

GO

sp_lock;
GO

--Vistas y funciones de gestion dinamica Realizando un backup de las bases de datos

DECLARE @nombre_db AS VARCHAR(50)

DECLARE tablas_cursor CURSOR FOR

SELECT name

FROM sys.databases

WHERE name NOT IN('master','tempdb','model','msdb')

OPEN tablas_cursor

FETCH NEXT

FROM tablas_cursor INTO @nombre_db

WHILE @@FETCH_STATUS = 0

BEGIN

DECLARE @nombre VARCHAR(150)

SET @nombre = CONVERT(VARCHAR(9), GETDATE(),6)

SET @nombre = 'C:\Backup\' + @nombre + '-' +@nombre_db + '.back'

SET @nombre = REPLACE(@nombre,' ','') --SELECT @nombre

BACKUP DATABASE @nombre_db TO DISK = @nombre WITH COMPRESSION

FETCH NEXT FROM tablas_cursor INTO @nombre_db

END

CLOSE tablas_cursor

DEALLOCATE tablas_cursor;
Un trigger es parecido a un Procedimiento Almacenado, con la diferencia que estos estn
vinculados a una tabla o vista.

nicamente se ejecutarn si ocurre una accin sobre la tabla, est accin puede ser INSERT,
UPDATE o DELETE.

En SQL Server existen 2 tipos de triggers:

Los Triggers INSTEAD OF - Estos triggers cancelan la accin desencadenadora, es decir si la


invocacin del trigger fue hecha por un INSERT, UPDATE o DELETE, la accin sobre la tabla
es cancelada para hacer una nueva accin definida en el trigger.

Los Triggers AFTER - Estos triggers como su nombre lo indica se ejecutan despus de que
se haya dado una accin sobre la tabla ya sea una insercin, una modificacin o una
eliminacin. Estos tipos de triggers son llamados tambin reactivos, ya que espera a que
se realice una accin sobre la tabla para poder iniciar el procedimiento o ejecutar la
instruccin definida en l

Al realizar una eliminacin de un registro se crea una tabla temporal llamada DELETED, la cual
puede ser muy bien usada por el trigger. Esta tabla temporal contiene los datos eliminados.

La tabla DELETED se construye con la misma estructura que la tabla de donde se elimina el
registro.

De igual forma al momento de insertar un dato se crea una tabla temporal llamada INSERTED, la
cual posee exactamente la misma estructura de la tabla en donde se estn insertando los datos.

Al realizar una actualizacin UPDATE, se generan 2 tablas una DELETED y una INSERTED, la tabla
temporal INSERTED es la que contendr el dato nuevo que se est actualizando, mientras que la
tabla temporal DELETED contendr el dato viejo o anterior que se modific.

EJEMPLO

CREATE TABLE HistoriaActividad(fecha DATE, descripcion VARCHAR(100), usuario VARCHAR(20));

GO

--para verificar si tabla ya tiene asignado un trigger

sp_helptrigger Customers;

GO
--AFTER TRIGGER

CREATE TRIGGER Tg_Cliente_Eliminado

ON Customers

AFTER DELETE

AS

INSERT INTO HistoriaActividad(fecha, descripcion, usuario)

VALUES(GETDATE(),'Eliminacin de cliente',USER);

GO

SELECT * FROM HistoriaActividad;

GO

SELECT * FROM Customers;

GO

DELETE Customers WHERE CustomerID = 'MRK';

GO

SELECT *

INTO CustomersDeleted

FROM dbo.Customers;

GO

TRUNCATE TABLE CustomersDeleted;

GO

SELECT * FROM dbo.CustomersDeleted;

GO

--Modificando Trigger para insertar datos eliminados desde la Tabla DELETED

ALTER TRIGGER Tg_Cliente_Eliminado

ON Customers

AFTER DELETE

AS

INSERT INTO CustomersDeleted


SELECT * FROM deleted;

GO

SELECT * FROM dbo.Customers

GO

INSERT INTO dbo.Customers(CustomerID,CompanyName,ContactName,Country)

VALUES ('ABCD','FPK','Jorge Hernandez','Guatemala'),

('ABCD1','MAGA','Pedro Pelaez','Guatemala'),

('ABCD2','CAMPERS','Julio Giron','GUATEMALA'),

('ABCD3','COBACHA','MARIA TZUL','GUATEMALA');

GO

DELETE Customers WHERE CustomerID LIKE 'ABC%';

GO

--Haciendo una insercion desde la tabla INSERTED mediante un trigger

SELECT * FROM dbo.Products;

GO

SELECT * FROM dbo.[Order Details];

GO

CREATE TRIGGER Tr_Quitar_Inventario

ON [Order Details]

AFTER INSERT

AS

UPDATE P SET P.Unitsinstock = P.unitsinstock - I.quantity

FROM inserted AS I

INNER JOIN dbo.Products AS P

ON I.ProductID = P.ProductID;

GO

INSERT INTO dbo.[Order Details](OrderID,ProductID,UnitPrice,Quantity,Discount)

VALUES(10248,1,12.60,30,0);

GO
--Creando vista

SELECT * FROM CUSTOMERS;

SELECT * FROM Suppliers;

GO

CREATE VIEW Directorio

AS

SELECT CompanyName, Contactname, ContactTitle, Country, 'Cliente' AS Tipo

FROM dbo.Customers

UNION ALL

SELECT CompanyName, ContactName, ContactTitle, Country, 'Proveedor' AS Tipo

FROM dbo.Suppliers;

GO

--Consultando la vista Directorio

SELECT * FROM Directorio;

GO

-- Trigger INSTEAD OF

CREATE TRIGGER Tr_Insert_Directorio

ON Directorio

INSTEAD OF INSERT

AS

INSERT INTO Customers(CustomerID,CompanyName,

ContactName,ContactTitle,Country)

SELECT SUBSTRING(companyname,1,5), CompanyName, ContactName, ContactTitle,

Country

FROM inserted

WHERE tipo = 'Cliente'

INSERT INTO Suppliers(CompanyName,ContactName,ContactTitle,Country)

SELECT CompanyName, ContactName,ContactTitle,Country

FROM inserted
WHERE tipo = 'Proveedor';

GO

--Insertando Dato

INSERT INTO Directorio(CompanyName,ContactName,ContactTitle,Country,Tipo)

VALUES('TEST','Juan Perez','Ing','Guatemala','Cliente');

GO

SELECT * FROM dbo.Customers

WHERE CompanyName = 'TEST'

SELECT * FROM dbo.Suppliers

WHERE CompanyName = 'TEST';


CONSULTAS USANDO XML EN SQL SERVER

XML, por sus siglas en ingles de Extensible Markup Language (Lenguaje de Marcas Extendible), es
un metalenguaje extendible de etiquetas desarrollado por el World Wide Web Consortium(W3C).
Es una simplificacin y adaptacin del SGML y permite definir la gramtica de lenguajes especficos
(de la misma manera que HTML es a su vez un lenguaje definido por SGML). Por lo tanto, XML no
es realmente un lenguaje en particular, sino una manera de definir lenguajes para diferentes
necesidades. Algunos de estos lenguajes que usan XML para su definicin son XHTML, SVG,
MathML.

XML no ha nacido slo para su aplicacin en internet, sino que se propone como un estndar para
el intercambio de informacin estructurada entre diferentes plataformas. Se puede usar en base
de datos, editores de texto hojas de clculo y casi cualquier cosa imaginable.

XML es una tecnologa sencilla que tiene a su alrededor otras que la complementan y la hacen
mucho ms grande y con unas posibilidades mucho mayores. Tiene un papel muy importante en la
actualidad ya que permite la compatibilidad entre sistemas para compartir la informacin de
manera segura, fiable y fcil.

Para que una consulta devuelva un resultado en formato XML se debe utilizar la instruccin FOR
XML

Tambin es posible utilizarlo como subconsultas mediante las instrucciones INSERT, UPDATE y
DELETE

Existen 4 modos en las que se puede utilizar la instruccin FOR XML:

RAW - Esta opcin genera un nico elemento de tipo ROW, es decir que las etiquetas
iniciaran con la palabra ROW. En otras palabras, la instruccin FOR XML RAW devolver
por cada fila una etiqueta de ROW, sin importar que haya una tabla principal y una
secundaria.

AUTO - Genera un anidamiento en XML resultante de utilizar heurstica basada en la forma


en que se especfica la instruccin SELECT, el control sobre la forma en que es generado el
XML es escaso. En otras palabras, la instruccin FOR XML AUTO, generar etiquetas
respetando una jerarqua en la cual la tabla principal contendr las tablas secundarias.

EXPLICIT - Esta opcin permite devolver resultados en una estructura definida


especficamente por el usuario, es ms potente que RAW y AUTO, ya que incluye
relaciones entre padres e hijos, en donde los valores se muestran como valores de nodo o
atributos de nodo de forma codificada o no codificada. Para realizar una consulta FOR XML
EXPLICIT se debe crear una tabla o bien elaborar la consulta de forma que las 2 primeras
columnas se llamen TAG y PARENT, estas columnas deben contener valores de tipo entero
INT, los cuales indican las jerarquas de las filas en los nodos de XML. Seguido se coloca la
informacin de las tablas de forma horizontal mediante la instruccin UNION. Los ALIAS
son importantes ya que estos definen la estructura de los nodos

PATH - Presenta los datos de forma ordenada por jerarquas, utilizando la etiqueta ROW,
seguido de las etiquetas con el nombre de los campos que provienen de la tabla
consultada. La etiqueta ROW que es la etiqueta de nodo principal por defecto puede ser
modificada a conveniencia, esto poniendo seguido de la instruccin FOR XML PATH, entre
parntesis () y cerrado con comillas simples '', el nombre que se desea asignar

XML permite definir un lenguaje para la presentacin de los datos.

Una caracterstica que resalta en XML es que est no posee etiquetas prefijadas ya que es el
propio diseador quien crea a su criterio las etiquetas necesarias.

Las etiquetas varan de acuerdo al tipo de FOR XML que se escoja, ya sea RAW, AUTO, EXPLICIT o
PATH.

En SQL Server es posible declarar variables de tipo XML, as como tambin campos dentro de una
tabla de tipo XML, para estos casos en particular es necesario extraer la informacin a la columna
XML o bien a la variable de tipo XML. Para poder realizar esta tarea SQL Server cuenta con
instrucciones especficas tales como XML QUERY o bien XML VALUE, entre otras. XML.VALUE
extrae un valor a un xml.

EJEMPLO
--XML RAW

SELECT C.CustomerID, C.CompanyName, O.OrderID, O.OrderDate

FROM dbo.Customers AS C

INNER JOIN dbo.Orders AS O

ON C.CustomerID = O.CustomerID

FOR XML RAW;

GO

--XML AUTO

SELECT CustomerID, CompanyName, Country

FROM dbo.Customers

FOR XML AUTO;

GO
-- XML EXPLICT

SELECT 1 AS Tag, NULL AS Parent, CustomerID AS [Cliente!1!CustomerID], ContactName AS


[Cliente!1], NULL AS [Orden!2!OrderID],

NULL AS [Orden!2]

FROM dbo.Customers AS C

WHERE C.CustomerID = 'ALFKI'

UNION

SELECT 2 AS Tag, 1 AS Parent, C.CustomerID, C.ContactNAme, O.OrderID, O.ShipAddress

FROM dbo.Customers AS C

INNER JOIN dbo.Orders AS O

ON C.CustomerID = O.CustomerID

WHERE C.CustomerID = 'ALFKI'

FOR XML EXPLICIT;

GO

/*Resultado en Jerarquias

<Cliente CustomerID="ALFKI">Maria Anders

<Orden OrderID="10643">Obere Str. 57</Orden>

<Orden OrderID="10692">Obere Str. 57</Orden>

<Orden OrderID="10702">Obere Str. 57</Orden>

<Orden OrderID="10835">Obere Str. 57</Orden>

<Orden OrderID="10952">Obere Str. 57</Orden>

<Orden OrderID="11011">Obere Str. 57</Orden>

</Cliente>

*/

--XML PATH

SELECT C.CustomerID, C.CompanyName, O.OrderID, O.OrderDate

FROM dbo.Customers AS C

INNER JOIN dbo.Orders AS O

ON C.CustomerID = O.CustomerID
FOR XML PATH ('Ventas');

GO

--Uso de XML.QUERY en variable tipo XML

DECLARE @mydoc XML

SET @mydoc = '<root>

<productdescription productid = "1" productname = "rood bike">

<Features>

<Warranty>1 ao de garantia para parte </Warranty>

<maintenance>3 aos de mantenimiento</maintenance>

</Features>

</productdescription>

</root>'

--Comprobando la variable

SELECT @mydoc.query ('/root/productdescription/Features/Warranty')

SELECT @mydoc.query ('/root/productdescription/Features/maintenance')

GO

--XML.VALUE

DECLARE @bicicleta VARCHAR(100)

DECLARE @mydoc XML

SET @mydoc = '<root>

<productdescription productid = "1" productname = "rood bike">

<Features>

<Warranty>1 ao de garantia para parte </Warranty>

<maintenance>3 aos de mantenimiento</maintenance>

</Features>

</productdescription>

</root>'

SET @bicicleta = @mydoc.value('(/root/productdescription/@productname) [1]', 'VARCHAR(100)')

SELECT @bicicleta;
Existen 3 tipos de funciones:

Funciones escalares
Funciones con valores de tabla de varias instrucciones
Funciones con valores de tabla en lnea

Las funciones escalares son las ms parecidas a las que se utilizan en los lenguajes de
programacin, por lo general se utilizan para realizar calclos bsicos matemticos debido a que
devuelven un nico valor.

CREATE FUNCTION Nombre_Funcin (@Parametro_recibir


Tipo_de_valor_del_Parmetro)
RETURNS Tipo_de_valor_que_retornar
AS
BEGIN
Declaracin de variables, asignacin de valor a variables, sentencia select, etc.
RETURN (@Variable_declarada)
END

Para llamar a una funcin se debe realizar una consulta SELECT y se debe llamar a la funcin. Para
llamar a la funcin, esta se divide en un nombre de 2 partes:

El nombre del esquema o propietario

Seguido del parmetro que solicita la funcin

Es necesario agregar un ALIAS a la columna que retornar la funcin ya que esta carece de un
nombre propio.

Mientras que las funciones con valores de tabla de varias instrucciones y las funciones con valor de
tabla en lnea, pueden decirse que son un hibirido entre una vista y un procedimiento almacenado
ya que son consultas con una instruccin SELECT pero a su vez reciben parmetros, lo que no
puede hacer una vista, ms sin embargo un procedimiento almacenado si puede hacerlo.

Estas funciones tienen la caracterstica de retornar un valor de tipo tabla

Las funcines son mucho ms eficientes si pueden realizar consultas con parmetros, y esta
herramienta es la que se debe preferir al momento de hacer sentencias de este tipo.
La estructura de una funcin con valor de tabla de varias instrucciones es la siguiente:

CREATE FUNCTION Nombre_Funcin (@Parmetro_a_recibir Tipo_de_dato)


RETURNS @Variable_tipo_Tabla Table
(nombre y tipos de datos que se necesitan para definir la variable de tipo
tabla)
AS
BEGIN
Declaraciones SELECT, INSERT, UPDATE, DELETE, declaracin de
variables, etc.
RETURN
END

Para mandar a llamar a la funcin se hace uso de una declaracin SELECT, se piden las columnas
que se desean retornar seguido de la clusula FROM, el nombre de la funcin y encerrado entre
parntesis el parmetro que se desea retornar.

La funcin con valor de tabla en lnea, tiene la peculiaridad que no necesita de la encapsulacin de
un BEGIN y un END para ejecutar la declaracin, en su lugar se encapsula mediante la instruccin
RETURN.

Su estructura es la siguiente:

CREATE FUNCTION Nombre_Funcin (@Parmetro_de_entrada


Tipo_de_dato)
RETURNS @Variable TABLE
AS
RETURN
(Declaraciones SELECT, INSERT, UPDATE, DELETE, declaracin de variables,
etc.);

EJEMPLO
-- Funcin escalar

CREATE FUNCTION fn_IVA (@cantidad MONEY)

RETURNS MONEY

AS

BEGIN

DECLARE @resultado MONEY


SET @resultado = @cantidad * 0.12
RETURN (@resultado)

END
-- LLamando a la funcin

SELECT productname, unitprice, dbo.fn_IVA(unitprice) AS iva

FROM dbo.Products

--Funcin con valores de tabla de varias instrucciones

CREATE FUNCTION fn_ListadoPais (@pais VARCHAR(100))

RETURNS @clientes TABLE

(customerid VARCHAR(5), companyname VARCHAR(50), contactname VARCHAR(100), country


VARCHAR(100))

AS

BEGIN

INSERT INTO @clientes SELECT customerid, companyname, contactname, country FROM


dbo.Customers
WHERE country = @pais
RETURN

END

--Llamando a la funcin

SELECT * FROM dbo.fn_ListadoPais ('Germany');

--funcin con valor de tabla en lnea

CREATE FUNCTION fn_ListadoPais2 (@pais VARCHAR(100))

RETURNS TABLE

AS

RETURN

(SELECT customerid, companyname, contactname, country FROM dbo.Customers

WHERE country = @pais);

-- Llamando a la funcin

SELECT * FROM dbo.ListadoPais2 ('FRANCE');