Академический Документы
Профессиональный Документы
Культура Документы
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
EL explorador de objetos contiene todos los contenedores que se encuentran en Microsoft SQL
Server
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:
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:
En el caso de los Login's SQL Server maneja 2 autenticaciones las cuales son:
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.
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.
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.
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.
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:
DECLARACIN DE VARIABLES
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
En SQL Server 2008 y versiones posteriores, puede declararse e inicializarse en una misma
instruccin. Ejemplo:
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
Clusula SELECT
Clusula WHERE
SELECT YEAR(orderdate) + 1
SELECT qty*unitprice
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
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.
Son los lotes de conjunto de comandos enviados a SQL Server como una unidad
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 reservada del sistema GO es una caracterstica adicionada desde SQL Server
2005
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"
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.
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
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
Dentro de los predicados existen 3 instrucciones especiales de SQL Server y estos son:
IN
BETWEEN
LIKE
/* Bloque de comentarios */
Ejemplo
SELECT 'Hola Mundo';
use NORTHWND;
-- Concatenacin
/* Une la tabla companyname con la tabla contactname separados por un espacio en blanco*/
-- Operaciones Bsicas
-- Operaciones combinadas
--Instruccin SELECT
ORDER BY Country;
GROUP BY Country
Clusula Expresin
SELECT <Lista del SELECT>
FROM <Tabla de origen>
WHERE <Condicin de bsqueda>
GROUP BY <Listado por grupos>
ORDER BY <Listado por orden>
DESPLEGAR 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
Operador Descripcin
Suma (+) Aade o concatena
Resta (-) Sustrae
Multiplicacin (*) Multiplica
Divisin (/) Divide
Diferencia (%) Modulo
Incluso las filas nicas en una tabla origen pueden devolver valores duplicados para algunas
columnas
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
XML:
Se pueden importar o transferir datos de una base de datos a otra, a travs de una pgina web.
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
AUTO
PATH
RAW
EXPLICIT -- ms complejo
Compnayname Country
Customer AHPOP UK
Customer AHXHT Mexico
Customer AZJED Germany
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
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.
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.
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
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.
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.
Los ALIAS creados en la clusula SELECT solo son visibles para la instruccin ORDER BY
En la clusula SELECT, CASE se comporta como un ALIAS que requiere una columna calculada.
.........
ELSE 'Si no cumple con ninguno WHEN y se desea asignar otra opcin'
-- DISTINCT
ORDER BY Country;
ORDER BY Country;
--XML
FROM Products;
FROM Products;
FROM Products;
FROM Products P;
sp_lock
---------CASE
CASE categoryid
ELSE 'Otros'
END AS Categoria
FROM Products;
CONSULTAS CON T-SQL, USO DEL JOIN
La clusula FROM determina tablas de origen de las cuales se obtienen los atributos o datos, para
ser utilizadas en las declaraciones SELECT
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
Los Joins en la clusula FROM especifican las operaciones que se realizan en la tabla virtual:
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
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.
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.
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.
Inner Join Devuelve slo las filas donde se encuentra una coincidencia en ambas tablas de entrada
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
Ejemplo:
ON C.categoruid = P.cotegoryid;
OUTER JOIN devuelve todas las filas de una tabla y las filas coincidentes desde la segunda tabla
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.
Devuelve todas las filas de la primera tabla, y slo las de la segunda tabla en donde exista
coincidencia:
ON T1.col = T2.col;
Devuelve todas las filas de la segunda tabla, y slo las de la primera tabla en donde haya
coincidencia:
ON T1.col = T2.col;
ON T1.col = T2.col
ON C.custid = O.custid
Combina cada fila de la primera tabla con cada fila de la segunda tabla
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
Devuelve todas las filas de la combinacin de la tabla izquierda con cada fila de la tabla de la
derecha (Sintaxis ANSI SQL-92)
Devuelve todas las filas de la combinacin de la tabla izquierda con cada fila de la tabla de la
derecha (Sintaxis ANSI SQL-89)
Crea datos de prueba mediante la devolucin de todas las combinaciones de dos tablas
FROM HR.Employees AS E1
Ejemplo: Devolver todos los empleados y el nombre del jefe del empleado.
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
-- ISO ANSE 92
FROM Customers
JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;
-- INNER JOIN
FROM Customers
ON Customers.CustomerID = Orders.CustomerID;
-- OUTER JOIN
FROM Customers
ON Customers.CustomerID = Orders.CustomerID;
FROM Customers
ON Customers.CustomerID = Orders.CustomerID;
-- OUTER JOIN mostrando nicamente los registros que no coinciden
FROM Customers
ON Customers.CustomerID = Orders.CustomerID
FROM Customers
ON Customers.CustomerID = Orders.CustomerID
FROM Customers AS C
-- SELF JOIN
SELECT J.FirstName + ' ' + J.LastName AS Jefe, S.FirstName + ' ' + S.LastName AS
ON J.EmployeeID = S.ReportsTo;
CONSULTAS CON T-SQL USO DE TOP, TOP WITH TIES, OFFSET-FETCH
ORDENAR DATOS
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.
Es la ltima clusula que se ejecuta mediante el orden de ejecucin lgico de una consulta
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)
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.
Usando la clusula ORDER BY para ordenar por medio de los nombres de columnas:
ORDER BY <Alias_de_Columna>;
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.
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.
FROM Sales.Customers
FROM Sales.Orders
FROM Sales.Orders
WHERE orderdate >= '20070101' AND orderdate < '20080101';
Trabaja con la clusula ORDER BY para limitar las filas en un orden especifico
Modificar la lista ORDER BY para asegurar unicidad, o usar TOP WITH TIES
TOP es propietario de Microsoft SQL Server, es decir nicamente se puede utilizar en el gestor de
base de datos Microsoft.
Especifica un nmero de filas para omitir, numero de filas para recuperar o devolver
La clusula FETCH puede ser opcional, permite a todas las filas seguidas del valor OFFSET puedan
ser devueltas o retornadas
EL valor OFFSET y el valor FETCH pueden ser constantes o expresiones, incluyendo variables y
parmetros
LGICA DE TRES-VALORES
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.
Los diferentes componentes de SQL Server manejan los valores ausentes (NULL) diferentemente:
ORDER BY, DISTINCT tratan los valores ausentes (NULL) como iguales
Pruebas para NULL
FROM Sales.Customers
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
ORDER BY ContactName;
ORDER BY 4;
ORDER BY Pais;
--Instruccion TOP
-- WITH TIES
ORDER BY UnitPrice;
ORDER BY UnitPrice;
-- OFFSET
-- FETCH
-- Valores NULL
FROM Customers
SQL Server asocia columnas, expresiones, variables, y parmetros con tipos de datos
Los tipos de datos determinan que clase de datos pueden ser manejados
Alias en T-SQL
Cadenas de binarios
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
La conversin del tipo de dato de menor prioridad debe de realizarse de forma explcita
(con la funcin CAST)
CHAR --> VARCHAR --> NVARCHAR --> TINYINT --> INT --> DECIMAL --> TIME --> DATE -->
DATETIME2 --> XML
CUANDO SON LOS TIPOS DE DATOS CONVERTIDOS?
Conversin implcita
Conversin Explicita
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
Agregar la opcin COLLATE en la clusula WHERE para controlar las comparaciones de colacin
FROM HR.emplyees
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.
FROM HR.employees;
FROM Sales.Customers;
FUNCIONES PARA CADENAS DE CARACTERES
EL PREDICADO LIKE
El predicado LIKE es usado para comprobar una cadena de caracteres contra un patrn
FROM Production.Categories
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
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
FROM Sales.Orders
FROM Customers;
FROM Customers;
FROM Customers;
FROM Customers;
FROM Products;
FROM Products;
SELECT @hoy;
INSERT .... VALUES es la declaracin que se utiliza para insertar un solo dato dentro de una tabla
Ejemplo:
Ejemplo:
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.
SELECT Campos de consulta que deben coincidir con los campos de insercin
FROM Tabla_Consultada
WHERE predicado_condicin
Ejemplo:
FROM Sales.Orders
INSERT .... EXEC es utilizado para insertar el resultado de un procedimiento almacenado o de una
expresin dinmica de SQL en una tabla existente
EXEC Nombre_Procedimiento_Almacenado
variables si existen
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
En otras palabras, esta forma de insercin, lo que hace es construir el objeto o tabla tomando
como base los datos consultados.
INTO Nombre_Tabla
FROM Nombre_Tabla_Consultada
WHERE predicado_condicin
Ejemplo:
INTO Sales.OrderArchive
FROM Sales.Orders
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.
UPDATE NombreDeLaTablaModificar
SET NombreDeLosCamposModificar =
WHERE PredicadoDeRestriccin =
Ejemplo
UPDATE Production.Products
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.
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 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.
ON (TablaObjetivo.Col1 = TablaFuente.col1)
INSERT (<Lista_de_columnas>)
VALUES (<Lista_de_valores_agregar>);
Cuando se utiliza la instruccin DELETE sin agregar la clusula WHERE, eliminar todos los registros
de una tabla
La clusula WHERE se utiliza para especificar que registros o filas se desean eliminar
WHERE PredicadoDeRestriccin
Mnimamente conectado
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.
GENERACIN DE NMEROS
USO DE IDENTITY
Slo en una columna de una tabla puede existir la propiedad IDENTITY definida
Ejemplo:
USO DE SEQUENCES
Puede ser usado como un valor por defecto para una columna
INCREMENT BY NmeroConQueIncremente
Ejemplo
INCREMENT BY 1;
Ejemplo
EJEMPLO
-- INSERT Basico
SELECT *
INTO CustomersDemos
FROM dbo.Customers;
sp_help CustomersDemos
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,
-- UPDATE
/* Actualizando datos de todas las ordenes de los clientes de Brazil a la fecha del da de hoy*/
FROM dbo.Customers AS C
ON C.CustomerID = O.CustomerID
ON C.CustomerID = O.CustomerID
-- Eliminar todos los detalles de orden, en donde los detalles de orden tengan la fecha de hoy
DELETE D
FROM dbo.Orders AS O
ON O.OrderID = D.OrderID
ON O.OrderID = D.OrderID
-- Instruccin MERGE
SELECT *
INTO ClientesA
FROM dbo.Customers
SELECT *
INTO ClientesB
FROM dbo.Customers;
-- Modificando tabla destino
-- Comparando tablas
-- MERGE
USING dbo.CLientesB AS B
ON A.customerid = B.Customerid
A.country = B.country
DELETE;
-- Instruccion TRUNCATE
--Identity y Sequence
VALUES('Rodrigo'),
('Alberto'),
('Jose'),
('Juan'),
('Homero');
SELECT @@IDENTITY;
--Sequence
AS INT
START WITH 5
INCREMENT BY 5
CREATE TABLE Test3(codigo INT PRIMARY KEY DEFAULT(NEXT VALUE FOR Numerador), Nombre
NVARCHAR(100));
VALUES('Rodrigo'),
('Alberto'),
('Jose'),
('Juan'),
('Homero');
Las funciones de SQL Server se pueden clasificar por el alcance de entrada y salida y por el tipo de
salida:
FUNCIONES ESCALARES
Operan sobre los elementos de una sola fila como entrada, y devuelven un solo valor como salida.
Sin la clusula GROUP BY, todas las filas se encuentran como un grupo
Ejemplo
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
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
Ejemplo
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
Devuelve un objeto que se puede utilizar como una tabla, en una declaracin de T-SQL
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.
Y en forma resumida su funcin principal es extraer los datos del origen y devolverlos en forma de
una consulta o query.
Para convertir de forma Explcita entre tipos de datos se debe utilizar las funciones CAST o
CONVERT
Es un estndar ANSI
Su sintaxis es la siguiente:
Su sintaxis es la siguiente:
Ejemplo
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.
TRY_PARSE y TRY_CONVERT
Ejemplo
Devuelve 1 cuando la entrada se evala como cualquier tipo numrico vlido, incluyendo
FLOAT y MONEY
Ejemplo
isnumeric_result
0
isnumeric_result
1
REALIZAR PRUEBAS CONDICIONALES CON IIF
Ejemplo
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
Su sintaxis es la siguiente:
Ejemplo
FROM Sales.Customers;
Esta funcin permite reemplazar un valor NULL o nulo por un elemento que es escogido a nuestra
propia eleccin.
Ejemplo
FROM Sales.Customers;
Resultado:
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
ON C.CategoryID = P.CategoryID
GROUP BY C.Categoryname;
-- Conversiones
-- TRY_PARSE
-- TRY_CONVERT
-- CHOOSE
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,
'Grains/Cereals','Meat/Poultry','Produce','Seafood')
FROM Products;
--ISNULL
Ejemplo
FROM Sales.OrderDetails;
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:
FROM Sales.Orders
COUNT(*) --> Cuenta todas las filas incluyendo los valores nulos o NULL
Se debe utilizar ISNULL o COALESCE para reemplazar los valores nulos o NULL antes de la
agregacin
Ejemplo:
FROM dbo.t2;
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:
FROM Sales.Orders
GROUP BY empid;
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
GROUP BY empid
Empid COUNT(*)
6 1
4 2
3 1
USO DE GROUP BY CON FUNCIONES DE AGREGADO
Ejemplo:
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:
FROM Sales.OrderDetails
GROUP BY productid;
FILTRADO CON 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
Ejemplo:
FROM Sales.Orders
GROUP BY custid
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.
El utilizar una expresin COUNT(*) en la clusula HAVING es til para resolver problemas
empresariales comunes
FROM Sales.Customers AS C
JOIN Sales.Orders AS O
ON C.custid = O.custid
GROUP BY C.custid
FROM Priduction.Products AS P
JOIN Sales.OrderDetails AS OD
ON P.productid = OD.productid
GROUP BY P.productid
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
FROM dbo.Customers AS C
ON C.CustomerID = O.CustomerID
ON D.OrderID = O.OrderID
---- HAVING
-- Instruccion COUNT(*)
GROUP BY Country
GROUP BY Country;
SUB-CONSULTAS o SUBQUERYS
ESCRIBIR SUBCONSULTAS AUTOCONTENIDAS
Las subconsultas son consultas anidadas, es decir que son consultas dentro de otras consultas
Las subconsultas pueden ser escalares, de mltiples valores o con valores de tabla.
Puede ser utilizada en cualquier lugar como expresin de un solo valor: SELECT, WHERE, etc.
Ejemplo:
FROM Sales.OrderDetails
Una sub-consulta multivalor devuelve varios valores como un nico conjunto de columnas a la
consulta externa
Se utiliza el predicado IN
Ejemplo:
FROM Sales.Orders
N'Mexico');
Se comportan como si la consulta interna se ejecutara una vez por cada fila exterior
Ejemplo:
FROM Sales.Orders AS O1
WHERE orderdate =
(SELECT MAX(orderdate)
FROM Sales.Orders AS O2
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:
WHERE orderdate =
(SELECT MAX(orderdate)
ORDER BY custid;
Cuando en una subconsulta se utiliza la palabra calve EXISTS, funciona como una prueba de
existencia
Sintaxis:
La lista SELECT de una subconsulta introducida por EXISTS normalmente slo utiliza un asterisco
(*)
Ejemplo:
FROM Sales.Customers AS C
WHERE EXISTS (
FROM Sales.Customers AS C
EJEMPLO
--Subconsultas devolviendo un valor escalar (nico)
FROM dbo.Products
-- Subconsulta Correlacionada
FROM dbo.Customers AS C
ON C.CustomerID = O.CustomerID
ON D.OrderID = O.OrderID
ON D.ProductID = P.ProductID
FROM dbo.Customers AS C
ON C.CustomerID = O.CustomerID
ON D.OrderID = O.OrderID
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
FROM dbo.Orders AS O
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
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
Las vistas guardan consultas creadas en una base de datos por los administradores y
desarrolladores
La clusula ORDER BY no est permitida en una definicin de vista sin el uso de TOP, OFFSET /
FETCH o FOR XML
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
FROM HR.Employees;
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.
Crea y Nombra una funcin y asigna parmetros opcionales con la instruccin CREATE FUNCTION
Ejemplo:
RETURNS TABLE
AS
RETURN
FROM Sales.OrderDetails
SELECT de la funcin
Ejemplo:
orderid line_total
10252 2462.40
10252 47.50
10252 1088.00
Las tablas derivadas se llaman expresiones de consultas creadas dentro de una sentencia SELECT
externa
SELECT <Listado_de_columnas>
FROM (
<Definicin_de_la_tabla_derivada>) AS <Alias_de_la_tabla_derivada>
Ejemplo:
FROM (
GROUP BY orderyear;
Ejemplo:
FROM (
GROUP BY orderyear;
Ejemplo:
FROM (
FROM Sales.Orders
WHERE empid = @emp_id) AS derived_year
GROUP BY orderyear;
A diferencia de las tablas derivadas. los CTEs soportan multiples definiciones, multiples referencias
y recursin
WITH <Nombre_CTE>
AS (
<Definicin_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.
Ejemplo:
WITH CTE_year AS
FROM Sales.Orders
)
SELECT orderyear, COUNT(DISTINCT custid) AS cust_count
FROM CTE_year
GROUP BY orderyear;
EJEMPLO
--Vistas
AS
FROM dbo.Customers AS C
ON C.CustomerID = O.CustomerID
ON D.OrderID = O.OrderID
ON D.ProductID = P.ProductID;
GO
FROM DesgloseVentas
GROUP BY OrderID
GO
ALTER VIEW DesgloseVentas (pais, compaia, codigocliente, numeroorden, fechaorden, ao, mes,
nombreproducto, precio, cantidad, subtotal)
AS
FROM dbo.Customers AS C
ON C.CustomerID = O.CustomerID
ON D.OrderID = O.OrderID
ON D.ProductID = P.ProductID;
GO
GO
FROM DesgloseVentas
GROUP BY numeroorden;
GO
RETURNS TABLE
AS
FROM dbo.Customers AS C
ON C.CustomerID = O.CustomerID
ON D.OrderID = O.OrderID
GO
GO
AS
BEGIN
FROM Customers
RETURN
END;
GO
GO
WITH CTE_ordenes
AS
FROM dbo.Customers AS C
FROM CTE_ordenes
GO
WITH Jefe
AS
FROM dbo.Employees
FROM Jefe
ON Jefe.EmployeeID = dbo.Employees.ReportsTo;
GO
AS
FROM Employees
UNION ALL
ON E.ReportsTo = D.ReportsTO
FROM ReporteDirectores;
USAR OPERADORES SET
Los SETS pueden combinar, compara o ser operados uno contra el otro
La clusula ORDER BY no est permitida como entrada, pero se puede utilizar despus del
resultado de la operacin de conjuntos
<Conjunto_operadores>
[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
Ejemplo:
UNION
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.
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
UNION ALL
El operador INTERSCT devuelve slo filas que coinciden en ambos conjuntos de resultados
INTERSECT
El operador INTERSECT busca los valores que se intersectan, es decir aquellos que son iguales en
ambas consultas, en ambos conjuntos
INTERSECT
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
La tabla de la derecha es a menudo una tabla derivada o una funcin con valores de tabla
SELECT <Listado_columnas>
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:
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.
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:
FROM Production.Suppliers AS S
OUTER APPLY
dbo.fn_TopProductsByShipper(S.supplierid) AS P;
EJEMPLO
--UNION
UNION
GO
FROM dbo.Customers
UNION
FROM dbo.Suppliers;
--UNION ALL
--INTERSECT
INTERSECT
--EXCEPT
EXCEPT
--
USE EjemploCTE;
CREATE TABLE Employees(empid INT NOT NULL, mgrid INT NULL, empname NVARCHAR(25) NOT
NULL, salary MONEY NOT NULL
GO
GO
CREATE TABLE Departments(deptid INT NOT NULL PRIMARY KEY, deptname NVARCHAR(25) NOT
NULL, deptmgrid INT NULL REFERENCES Employees);
GO
GO
RETURNS TABLE
AS
AS
UNION ALL
FROM Employees AS E
ON E.mgrid = ES.mgrid)
)
GO
OPTION(MAXRECURSION 0);
GO
--CROSS APPLY
FROM Departments AS D
CROSS APPLY
dbo.fn_jerarquia(D.deptmgrid) AS F
--OUTER APPLY
FROM Departments AS D
OUTER APPLY
dbo.fn_jerarquia(D.deptmgrid) AS F
FUNCIONES DE VENTANA RANKING, OFFSET Y DE AGREGADO
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:
ORDER BY orderyear
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
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.
LA PARTICIN DE VENTANA
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:
FROM Sales.CustOrders;
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.
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.
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
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
ORDENAR Y ENMARCADO
El enmarcado de ventana permite establecer lmites de inicio y fin dentro de una particin de
ventana.
Sin ordenar, "Se empieza en la primera fila", lo que no es til porque un conjunto no tiene orden
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
Ejemplo:
FROM Sales.CategoryQtyYear;
Una funcin de ventana es una funcin aplicada a una ventana, o conjunto de filas
Las funciones de ventana dependen del conjunto creado por la clusula OVER()
Ejemplo
FROM Production.Products
ORDER BY pricerank;
FROM Sales.CustOrders;
La particin es optativa
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
Una funcin de ventana distribuida desempea anlisis estadsticos en los datos, y requiere una
clusula de ordenamiento de ventana.
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
FROM Orders AS O
ON O.OrderID = D.OrderID;
GO
FROM Orders AS O
ON O.OrderID = D.OrderID;
GO
FROM Orders AS O
ON O.OrderID = D.OrderID;
GO
FROM dbo.Customers;
FROM dbo.Products AS P
ON P.CategoryID = C.CategoryID
GO
FROM dbo.Products AS P
ON P.CategoryID = C.CategoryID
GO
GO
GO
FROM dbo.PreciosProducto;
INSTRUCCIONES PIVOT, UNPIVOT, WITH ROLLUP Y WITH CUBE
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.
ELEMENTOS DE PIVOT
Ejemplo
FROM Sales.CategoryQtyYear) AS D
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
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.
FROM Sales.CategorySales
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 (
Con GROUPING SETS, se puede especificar los atributos que se van agrupar y el orden de los
mismos.
Ejemplo:
FROM Sales.CategorySales
GROUP BY
GROUPING SETS((Category),(Cust),())
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
SELECT <Lista_columnas_con_agregados>
FROM <Tabla_origen>
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>
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.
GROUPING_ID(Nombre_columna) AS <Alias>,
<Lista_Seleccionada>
FROM <Tabla_origen>
GROUP BY <Orden_por_grupo>
ORDER BY <Lista_de_oredenamiento>
Ejemplo:
GROUPING_ID(Cust) AS grpCust,
FROM Sales.CategorySales
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:
FROM Sales.CategorySales
GROUP BY
GROUIPING SETS((Category),(Cust),())
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,
FROM Sales.CategorySales
GROUP BY CUBE(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
ON C.CategoryID = P.CategoryID
ON P.ProductID = D.ProductID
ON D.OrderID = O.OrderID) AS T
GO
--UNPIVOT
SELECT *
INTO TablaPivote
FROM
ON C.CategoryID = P.CategoryID
ON P.ProductID = D.ProductID
INNER JOIN dbo.Orders AS O
ON D.OrderID = O.OrderID) AS T
--Nueva Tabla
FROM
FROM dbo.TablaPivote) AS P
GO
--ROLLUP y CUBE
ON C.CategoryID = P.CategoryID
ON P.ProductID = D.ProductID
ON D.OrderID = O.OrderID
--CUBE
ON C.CategoryID = P.CategoryID
ON P.ProductID = D.ProductID
ON D.OrderID = O.OrderID
GROUP BY C.CategoryName, DATEPART(yyyy,O.OrderDate) WITH CUBE
--GRUPPING
ON C.CategoryID = P.CategoryID
ON P.ProductID = D.ProductID
ON D.OrderID = O.OrderID
Los Procedimientos Almacenados son declaraciones colectadas por T-SQL y almacenadas en una
base de datos
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
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
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
(@NombrePrametrodeEntrada AS TipodeDato)
AS ....
EXEC Nombre_del_ProcedimientoAlmacenado
@NombreParametrodeEntrada = ValorAsignado;
Ejemplo:
(@supplierid AS INT)
AS ...
EXEC Production.ProductbySuppliers
@supplierid = 1;
Los parmetros de salida son marcados en el encabezado del Procedimientos Almacenado y son
llamados en la consulta
(@<ParametrodeEntrada> AS <TipodeDato>,
@<ParametrodeSalida> OUTPUT;
SELECT @ParametrodeSalida;
Los Procedimientos pueden incluir parmetros de entrada y salida, como tambin retornar valores
(<Lista_de_Parametros>)
AS
SELECT <Cuerpo_de_la_declaracin_SELECT>;
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
AS
DYNAMIC SQL es un cdigo T-SQL ensamblado en una cada de caracteres, interpretado como un
comando, y ejecutado.
El comando EXEC puede aceptar un STING como entrada en parntesis. Ningn parmetro
puede ser pasado adentro
Crear un SQL Dinmico se refiere a que el usuario debe autocompletar la declaracin SELECT
Utilizar sp_EXECUTESQL
Puede desempearse mejor que EXEC debido a la reutilizacin del plan de consulta
N'<Codigo_que_se_ejecuta>
Ejemplo
EJEMPLO
--Procedimiento Almacenado Simple
AS
FROM dbo.Categories AS C
ON C.CategoryID = P.CategoryID
ON P.ProductID = D.ProductID
ON D.OrderID = O.OrderID
GO
EXECUTE VentasCategoria;
GO
(@ao AS INT)
AS
FROM dbo.Categories AS C
ON C.CategoryID = P.CategoryID
ON D.OrderID = O.OrderID
GO
GO
AS
FROM dbo.Categories AS C
ON C.CategoryID = P.CategoryID
ON P.ProductID = D.ProductID
ON D.OrderID = O.OrderID
--SQL DINAMICO
EXECUTE (@variable);
GO
--Forma dinamica
GO
AS
GO
sp_ConsultaDinamica 'suppliers';
PROGRAMACIN CON 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
Algunos estados (por ejemplo, CREATE FUNCTION, CREATE PROCEDURE, CREATE VIEW) no se
pueden combinar con otros en un mismo lote
AS ...
GO
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.
Los Lotes son analizados para conocer la sintaxis como una unidad
--Valid Batch
GO
--Invalid Batch
GO
Las variables son objetos que permiten el almacenamiento de un valor para su uso posterior en el
mismo lote
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.
EXEC Production.PordsByCategory
GO
DECLARE @i INT = 0;
SET @i = 1;
Esto se utiliza cuando el valor que se debe asignar a la variable requiere una consulta a una tabla.
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.
Ejemplo:
USE tempdb;
GO
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
SQL Server proporciona los elementos de lenguaje adicionales que controlan el flujo de ejecucin
de las instrucciones T-SQL.
Los elementos del control de flujo permiten declaraciones que se deben realizar en un orden
determinado o en absoluto
Incluye IF ... ELSE, BEGIN ... END, WHILE, RETURN, entre otros.
Ejemplo:
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.
Ejemplo:
IF OBJECT_ID('dbo.t1') IS NULL
ELSE
Las declaraciones en el bloque del WHILE se repiten mientras el predicado evala si es verdadero
(TRUE)
Ejemplo:
BEGIN
PRINT @lname;
SET @empid += 1;
END;
EJEMPLO
--Variables
GO
GO
-- Instruccin SET
GO
-- Variable sin valor inicial y asignado con la instruccin SELECT
SELECT @valor;
GO
AS
FROM dbo.Customers AS C
ON C.CustomerID = O.CustomerID
ON O.OrderID = D.OrderID
GO
GO
GO
BEGIN
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
@tabla VARCHAR(100)
AS
IF @tabla = 'Customers'
BEGIN
END
ELSE
BEGIN
END;
GO
-- Ejecutando SP
Ejemplo:
RAISERROR(Nmero_de_error, Nmero_de_severidad_del_error,
Nmero_de_estado_del_error)
Ejemplo:
10, -- Severidad
1, -- Estado
2);
Retorna:
Ejemplo:
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.
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
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.
El manejo de excepciones estructuradas permite una respuesta centralizada para los errores de
ejecucin en tiempo real
El bloque TRY est definido por las declaraciones BEGIN TRY y END TRY
No se debe colocar ningn cdigo entre la instruccin END TRY y BEGIN CATCH
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
END TRY
BEGIN CATCH
END CATCH;
Ejemplo:
BEGIN TRY
END TRY
BEGIN CATCH
END CATCH
EJEMPLO
--Errores
SELECT 80/0;
GO
RAISERROR(50001,16,1);
--Errores con THROW
GO
SELECT 80/0
SELECT @@ERROR
GO
BEGIN TRY
SELECT 80/0;
END TRY
BEGIN CATCH
ERROR_SEVERITY() AS NumeroSeveridad,
ERROR_STATE() AS NumeroEstado,
ERROR_PROCEDURE() AS ProcedimientoAlmacenadodelError,
ERROR_MESSAGE() AS MensajeError
END CATCH;
IMPLEMENTAR TRANSACCIONES
DEFINICIN DE TRANSACCIONES
Toda la unidad tiene xito o bien falla de forma conjunta, no est permitida una terminacin
parcial
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.
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
BEGIN TRY
END TRY
BEGIN CATCH
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,
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
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER()
END CATCH;
Para empezar una transaccin se debe especificar con la instruccin BEGIN TRANSACTION
BEGIN TRY
BEGIN TRANSACTION
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.
BEGIN TRY
.......
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
END TRY
ROLLBACK TRANSACTION
BEGIN CATCH
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
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
BEGIN TRANSACTION
VALUES
('VHC1','MRK','Enrique Merck','Lic. Sistemas','Guatemala');
GO
--Deshacer la transaccin
ROLLBACK TRANSACTION
--Confirmar la transaccin
COMMIT TRANSACTION
--Uso de XACT_ABORT
GO
BEGIN TRANSACTION
COMMIT TRANSACTION;
MEJORAR EL RENDIMIENTOS DE LAS CONSULTAS
Se debe utilizar la clusula WHERE, con el fin de realizar un filtrado y devolver solamente
las filas necesarias
Evitar expresiones que manipulan las columnas en el predicado, tales como formulas o
bien condiciones complejas que deban primero realizar operaciones
Utilizar las funciones de ventanas u otras operaciones basadas en conjuntos cuando sea
posible
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.
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
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
Un ndice agrupado en una columna provoca que una tabla que se guardar con filas
lgicamente organizadas por los valores de las columnas
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
Los ndices no agrupados proporcionan formas alternativas para localizar rpidamente los datos
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 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
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
Funciones de ventanas
Un plan de ejecucin incluye informacin sobre qu tablas hay acceso, sobre que ndices, lo que se
une para realizar la consulta
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
Los planes de ejecucin de forma grfica representan los mtodos que utiliza SQL Server para
ejecutar las sentencias en una consulta T-SQL
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.
SQL Server provee informacin de detalles en tiempo de ejecucin acerca de la ejecucin de una
consulta o query
EJEMPLO
--Plan de ejecucin
GO
INTO Clientes
FROM Customers
GO
FROM dbo.Clientes
ON dbo.Clientes(Customerid);
GO
--Funcion de agregado
GROUP BY Country;
GO
--JOINS
FROM dbo.Customers AS C
ON C.CustomerID = O.CustomerID
ON O.OrderID = D.OrderID
ON D.ProductID = P.ProductID
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.
Se encuentran incorporados en las vistas que proporcionan informacin sobre el catalogo del
sistema
Algunas vistas son filtradas para mostrar slo los objetos del usuario, algunas vistas incluyen
objetos del sistema
FROM SYS.TABLES:
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
Mapea nombres estndar (catlogo, dominio) a los nombres de SQL Server (base de datos, tipos
de datos definidos por el usuario)
Ejemplo:
FROM INFORMATION_SCHEMA.TABLES;
FROM INFORMATION_SCHEMA_VIEW_COLUMN_USAGE;
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()
Ejemplo:
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;
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
Aparecen de forma lgica en el esquema sys de cada usuario y del sistema de base de
datos
definido
--Este ejemplo usa EXEC, incluye el nombre del esquema sys, y pasa el nombre de
la tabla como un parmetro unicodigo nombrado
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
Las vistas y funciones dinmicas de administracin (DMV) devuelven informacin acerca del
estado del servidor
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
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
Ejemplo:
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:
referencing_class_desc
EJEMPLO
--Catalagos del sistema
ON I.object_id = IC.object_id
GO
GO
sp_helptext INVOICES
GO
FROM INFORMATION_SCHEMA.TABLES;
GO
FROM INFORMATION_SCHEMA.VIEW_COLUMN_USAGE;
GO
sp_helpdb Northwnd;
GO
sp_help Customers;
GO
sp_who;
GO
sp_who2;
GO
sp_lock;
GO
SELECT name
FROM sys.databases
OPEN tablas_cursor
FETCH NEXT
WHILE @@FETCH_STATUS = 0
BEGIN
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.
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
GO
sp_helptrigger Customers;
GO
--AFTER TRIGGER
ON Customers
AFTER DELETE
AS
VALUES(GETDATE(),'Eliminacin de cliente',USER);
GO
GO
GO
GO
SELECT *
INTO CustomersDeleted
FROM dbo.Customers;
GO
GO
GO
ON Customers
AFTER DELETE
AS
GO
GO
('ABCD1','MAGA','Pedro Pelaez','Guatemala'),
('ABCD2','CAMPERS','Julio Giron','GUATEMALA'),
('ABCD3','COBACHA','MARIA TZUL','GUATEMALA');
GO
GO
GO
GO
ON [Order Details]
AFTER INSERT
AS
FROM inserted AS I
ON I.ProductID = P.ProductID;
GO
VALUES(10248,1,12.60,30,0);
GO
--Creando vista
GO
AS
FROM dbo.Customers
UNION ALL
FROM dbo.Suppliers;
GO
GO
-- Trigger INSTEAD OF
ON Directorio
INSTEAD OF INSERT
AS
ContactName,ContactTitle,Country)
Country
FROM inserted
FROM inserted
WHERE tipo = 'Proveedor';
GO
--Insertando Dato
VALUES('TEST','Juan Perez','Ing','Guatemala','Cliente');
GO
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
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.
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
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
FROM dbo.Customers AS C
ON C.CustomerID = O.CustomerID
GO
--XML AUTO
FROM dbo.Customers
GO
-- XML EXPLICT
NULL AS [Orden!2]
FROM dbo.Customers AS C
UNION
FROM dbo.Customers AS C
ON C.CustomerID = O.CustomerID
GO
/*Resultado en Jerarquias
</Cliente>
*/
--XML PATH
FROM dbo.Customers AS C
ON C.CustomerID = O.CustomerID
FOR XML PATH ('Ventas');
GO
<Features>
</Features>
</productdescription>
</root>'
--Comprobando la variable
GO
--XML.VALUE
<Features>
</Features>
</productdescription>
</root>'
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.
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:
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.
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:
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:
EJEMPLO
-- Funcin escalar
RETURNS MONEY
AS
BEGIN
END
-- LLamando a la funcin
FROM dbo.Products
AS
BEGIN
END
--Llamando a la funcin
RETURNS TABLE
AS
RETURN
-- Llamando a la funcin