base de datos

81
UNIVERSIDAD TÉCNICA DE AMBATO FACULTAD CIENCIAS HUMANAS Y DE LA EDUCACIÓN CARRERA DE DOCENCIA EN INFORMÁTICA Módulo de Contenidos Gestor de Base de Datos II OCTAVO SEMESTRE Lic. Einstein Fabián Camacho Saltos Mg. AMBATO – ECUADOR

Upload: einsteinfabian

Post on 02-Aug-2015

222 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: Base de Datos

UNIVERSIDAD TEacuteCNICA DE AMBATO

FACULTAD CIENCIAS HUMANAS Y DE LA EDUCACIOacuteN

CARRERA DE DOCENCIA EN INFORMAacuteTICA

Moacutedulo de Contenidos

Gestor de Base de Datos II

OCTAVO SEMESTRE

Lic Einstein Fabiaacuten Camacho Saltos Mg

AMBATO ndash ECUADORmarzo ndash agosto 2012

FILOSOFIacuteA DEL MOacuteDULO

La metodologiacutea a aplicarse en el moacutedulo es el ciclo de Kolb contemplando todas sus fases se pretende que los estudiantes alcancen un aprendizaje significativo para lo cual se realizaraacute una retroalimentacioacuten se explicaraacute mediante ejemplos se crearaacute un aprendizaje situado en lo cognitivo los estudiantes trabajaraacuten con ejercicios praacutecticos en el laboratorio se realizaraacuten exposiciones pruebas representacioacuten graacutefica de base de datos A continuacioacuten se detalla como se trabajaraacute con el ciclo del aprendizaje de KOLB

1- Experiencia concretaPara esta fase se realizaraacute la explicacioacuten respectiva luego se plantearaacute preguntas para que los estudiantes traten de responder2-Observacioacuten reflexivaEn esta etapa se plantearaacute ejercicios praacutecticos y que los estudiantes reflexionen en cada uno de ellos luego el profesor los resolveraacute en clases3- Conceptualizacioacuten abstractaSe propone ejercicios para que resuelvan los estudiantes y practiquen 4- Experimentacioacuten activaLos estudiantes deben realizar un pequentildeo proyecto aplicando los conocimientos adquiridos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 2

INDICE DE CONTENIDOS

Contenido Paacuteg

FILOSOFIacuteA DEL MOacuteDULO2

INTRODUCCIOacuteN 5

IDENTIFICAR LA ESTRUCTURA DE UNA BASE DE DATOS CON OBJETOS QUE LA COMPONEN 6

13 Estructura loacutegica7

14 Planificacioacuten ndash disentildeo8

15 Normalizacioacuten17

16 Herramientas para la normalizacioacuten19

Realizar diferentes tareas de disentildeo y planificacioacuten sobre la estructura de tablas19

21 Tabla 19

22 Tipos de datos20

23 Creacioacuten de tablas23

24 Creacioacuten de Restricciones26

25 Diagramas de bases de datos29

Aplicar las diferentes sentencias y modos en lenguaje SQL para tratamiento de la informacioacuten almacenada en las diferentes tablas de la base de datos32

31 Lenguaje de definicioacuten de datos32

32 Lenguaje de control de datos34

33 Lenguaje de manipulacioacuten de datos34

34 Caracteriacutesticas de la programacioacuten35

35 Funciones 38

Trabajar con los diferentes tipos de iacutendices conociendo las ventajas y desventajas de su uso en funcioacuten del objetivo buscado58

41 Iacutendices 58

42 Mantenimiento de iacutendices58

43 Iacutendices agrupados y no agrupados59

44 Creacioacuten de iacutendices60

45 Vistas 60

46 Creacioacuten de vistas60

Realizar tareas de administracioacuten de bases de datos mediante el uso de triggers61

51Triggers 61

52 Creacioacuten de triggers61

53 Procedimientos almacenados62

54 Trabajar con procedimientos almacenados62

BIBLIOGRAFIacuteA 63

ANEXOS 64

INTRODUCCIOacuteN

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 3

Gracias al aporte del Vicerrectorado Acadeacutemico de la Universidad Teacutecnica de Ambato en los esquemas presentados en la paacutegina web de la Institucioacuten se ha determinado los paraacutemetros del presente moacutedulo de contenidosEl moacutedulo empieza realizando una pequentildea introduccioacuten explicando conceptos y a continuacioacuten los objetos que componen una base de datos Luego explica la creacioacuten de tablas y sus relaciones entre ellos para ir avanzando a las diferentes sentencias y aplicaciones del lenguaje TRANSACT SQL para la consulta de base de dato luego se trabajara con iacutendices y finalmente con triggers para la administracioacuten de la base de datos la versioacuten de SQL server en que se haraacuten las aplicaciones es SQL SERVER 2008 EXPRESS R2 que es una versioacuten gratuita de MICROSOFT que permite realizar aplicaciones de escritorio aplicaciones web y pequentildeas aplicaciones de servidorSe trabajara con conceptos teoacutericos y praacutecticos que permitiraacuten el progreso del estudiante hasta alcanzar el dominio requerido se pretende realizar un pequentildeo sistema aplicable a una institucioacuten educativa con el propoacutesito de apoyar al sistema educativo y que el estudiante tenga una acercamiento a lo que seraacute su vida profesionalEl propoacutesito de este moacutedulo es desarrollar la capacidad de razonamiento en los estudiantes para que puedan desarrollar sistemas utilizando la menor cantidad de recursos de sistemas evitando crear aplicaciones pesadas sin no todo lo contrario crear aplicaciones livianas y raacutepidas que optimice recursos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 4

DESARROLLO DE CONTENIDOS

CAPIacuteTULO I

IDENTIFICAR LA ESTRUCTURA DE UNA BASE DE DATOS CON

OBJETOS QUE LA COMPONEN

11 Definicioacuten

111 Definicioacuten de base de datosUna base de datos es una entidad en la cual se pueden almacenar gran cantidad de datos de manera estructurada para luego poderlos recuperarlas posteriormente

112 EntidadEn bases de datos una entidad es la representacioacuten de un objeto o concepto del mundo real que se describe en una base de datosPor ejemplo nombres de entidades pueden ser Alumno Empleado Artiacuteculo etc1121 Entidades fuertes Una entidad fuerte es aquella que puede ser identificada uniacutevocamente sin participar en la relacioacuten Ejemplo cliente vehiacuteculo1121 Entidades deacutebiles Es aquella que no puede participar sin existir en la relacioacuten Ejemplo Factura viaje a la entidad deacutebil se le representa con doble rectaacutengulo

12 Estructura fiacutesicaUna base de datos se almacena en varios ficheros o archivos en disco Como miacutenimo existen dos archivos donde podremos guardar la base de datos

Archivo de datos Archivo de registro de transacciones

El archivo de datos o aquellos que antildeadimos como extras son los archivos que tendraacuten almacenada la informacioacutenPor otro lado tenemos el archivo de registro de transacciones Este fichero es tan importante como el anteriorEl nombre de una base de datos parte de una principal definida por el administrador y a partir de ese nombre principal sql server antildeade

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 5

terminaciones y extensiones a ese nombre principal ademaacutes como administrador puedo elegir el lugar donde se almacenaraacute la base de datosEjemplo si soy administrador de una base de datos y quiero crear una base de datos llama uta los archivos que se creariacutean son los siguientes

Archivo de datos miEmpresa_DataMDF Archivo de registro de transacciones miEmpresa_LogLDF

En caso de tener archivos extras nosotros como administradores tambieacuten podremos darles su nombre principal y la extensioacuten que suele utilizarse es NDFComo administradores tambieacuten puedo seleccionar el lugar de almacenamiento en una determinada carpeta o directorio incluso diferentes unidades fiacutesicasNo debes quedarte con la idea de que una base de datos se compone sencillamente de dos archivos es algo mucho maacutes completo que todo eso lo que representa una base de datos como entidad121 Tamantildeo de la base de datos

Al crear una base de datos con SQL server no es necesario separar una gran cantidad de memoria ya que los archivos de datos y registro crecen automaacuteticamente el administrador de la base de datos le da un tamantildeo inicial una cantidad muy pequentildea en Megabytes una vez que se utilice la base de datos y alcance el tamantildeo maacuteximo se incrementa13 Estructura loacutegicaEs el esqueleto o armazoacuten conceptual estaacute constituido por abstracciones de la realidad para enfocarse en el aacutembito conceptual sin entrar en detalles fiacutesicos Entre los elementos que conforman la estructura loacutegica de una base de datos podemos destacar131 TablasLas tablas son las unidades que almacenan los datos Como norma general se suele imponer que cada tabla almacena informacioacuten comuacuten sobre una entidad en particular (recuerda los libros) Esta norma se conoce como normalizacioacutenLa mayor parte de la actividad producida en una base de datos se produce sobre las tablas siendo las principales tareas las siguientes

Antildeadir informacioacuten Eliminar informacioacuten Modificar y actualizar informacioacuten Recoger informacioacuten y mostrarla

132 Campos y registros

Las tablas estaacuten compuestas de registros y campos Si imaginamos el disentildeo de una tabla como si de una cuadriacutecula se tratase sabemos que estaacute compuesta por varias filas y columnas Las filas corresponden a los registros mientras que las columnas seriacutean los campos Y cada una de las celdas que se forman de enlazar un registro (fila) con un campo (columna) formariacutea una celda la cual almacena un valor

Por lo tanto un registro esta formado por varios campos y cada campo almacena un determinado valor

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 6

133 IacutendicesUn iacutendice es un conjunto de valores clave el iacutendice guarda el elemento que desea indexar y la posicioacuten en la base de datosLos valores claves de los iacutendices pueden almacenar el contenido de una o varias columnas de una tabla134 VistasEs un conjunto de registros determinados de una o varias tablas se trabaja sobre ella como si fuera una tabla pero no lo es una vista no almacena datos si no que los extrae y permite trabajar con datos de varias tablas como si fuera una sola135 SQLSignifica lenguaje de consulta estructurado permite el acceso a bases de datos que explota la flexibilidad y potencia de los sistemas relacionales permitiendo gran variedad de operaciones14 Planificacioacuten ndash disentildeo141- Identificar el objetivo de la base de datosConsiste en un diaacutelogo intenso para averiguar expliacutecitamente que es lo que quiere el cliente142 Revisioacuten datos existentesUna gran herramienta para iniciar una aplicacioacuten es ver documetacioacuten sobre los datos existentes Hojas de caacutelculo albaranes facturas documentacioacuten en generalUna forma que ayuda mucho en la primera parte del desarrollo es mirar las necesidades del cliente iniciando por el final Por ejemplo si analizamos un informe de ventas que nos proporcione el cliente podemos ver mucha informacioacuten incluso la forma de relacionar las tablas Sabremos tambieacuten si estos datos hay que agruparlos por ejemplo por vendedor o por poblacioacuten Esto nos ayudaraacute a saber queacute campos y tablas necesitaremos para conseguir el objetivo final que se muestra en el informe del clienteCuanta maacutes informacioacuten se pueda recabar maacutes faacutecil seraacute dar los primeros pasos y acercarse desde el principio al disentildeo maacutes correcto posible Para evitar un trabajo suplementario y correcciones innecesarias hazlo bien la primera vez143 Modelado de la base de datos1431 Paso al SGBDLlave principal Es un campo o a una combinacioacuten de campos que identifica de forma uacutenica a cada fila de una tabla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 7

Llave foraacutenea Identifica una columna o grupo de columnas que se refiere a una columna o grupo de columnas en otra tablaRelaciones uno a unoEn una relacioacuten uno a uno una fila de la tabla A no puede tener maacutes de una fila coincidente en la tabla B y viceversa Se crea una relacioacuten uno a uno si las dos columnas relacionadas son claves principales Relaciones uno a variosUna relacioacuten uno a varios es el tipo maacutes habitual de relacioacuten En este tipo de relacioacuten una fila de la tabla A puede corresponderse con muchas filas de la tabla B pero una fila de la tabla B soacutelo puede corresponderse con otra de la tabla A Por ejemplo en las tablas (editoriales) y (tiacutetulos) se da una relacioacuten uno a varios una editorial publica muchos tiacutetulos pero a cada tiacutetulo le corresponde soacutelo una editorialEn una relacioacuten uno a varios solamente una de las columnas relacionadas es la clave principal o tiene una restriccioacuten uniqueRelaciones Varios a VariosEn una relacioacuten varios a varios una fila de la tabla A puede tener muchas filas coincidentes en la tabla B y viceversa Este tipo de relaciones se crea definiendo una tercera tabla denominada tabla de unioacuten cuya clave principal esteacute constituida por las claves externas de las tablas A y B Por ejemplo entre las tablas (autores) y (tiacutetulos) existiriacutea una relacioacuten varios a varios definida por una relacioacuten uno a varios entre cada una de ellas y la tabla (tiacutetuloautor) La clave principal de la tabla es la combinacioacuten de la columna au_id (la clave principal de la tabla autores) y la columna title_id (la clave principal de la tabla tiacutetulos)1432 Modelo entidad relacioacuten

1433 EjerciciosSupongamos que queremos disentildear una base de datos para una biblioteca y hemos conocido que eacutesta funciona de la siguiente formaEn la biblioteca se encuentra como es natural una serie de libros que los empleados solicitan a las editoriales Cuando un libro se recibe se le da de alta construyeacutendole una ficha para buacutesqueda por autor y otra ficha para buacutesqueda por tema En ambas fichas aparecen el tiacutetulo del libro el nombre del autor y su nacionalidad la editorial a la que pertenece la publicacioacuten el tema sobre el que trata el ISBN y la estanteriacutea de la biblioteca en la que se encuentra Un empleado puede solicitar un libro escribiendo una carta de

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 8

Entidades

Relaciones

Conectores

peticioacuten a la editorial correspondiente La direccioacuten a la que se a de dirigir la carta se encuentra en el archivo de editoriales Para acceder a los libros de la biblioteca es necesario la posesioacuten de un carnet que acredita a los distintos usuarios Este carnet se confecciona a cada persona la primera vez que intenta retirar un libro Cada usuario puede tener retirado un libro en un momento determinadoEn la biblioteca les gustariacutea disponer de un listado que se lanzariacutea al final de cada diacutea y en el que apareceriacutea para cada libro que se encuentra retirado el tiacutetulo el ISBN el autor y el nuacutemero de carnet nombre y la ceacutedula del usuario que lo mantiene retiradoCuando un usuario intente retirar un libro ha de presentar su carnet para que se tome nota de la retirada Si el libro que desea ha sido retirado por otro usuario se llama a eacuteste por teleacutefono indicaacutendole que hay otro usuario que desea el libro para que lo devuelva en caso de que no lo esteacute utilizandoMensualmente se confecciona un inventario actualizado donde se indica para cada libro el nombre el autor y el lugar de la biblioteca donde se encuentra

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 9telefononombrecedula

carnet

USUARIO

1

m 1

editado

DireccioacutenNombre

EDITORIAL

n

NACIONALIDNOMB

CODAUTO

AUTOR

TEMA

TITULO

ISBN

LIBRO Situado en

nuacutemerorororo

lugarnestanteria

ESTANTERIA

1

escrito

escrito

m

1

Problema 2 Artiacuteculos y encargosUna base de datos para una pequentildea empresa debe contener informacioacuten acerca de clientes artiacuteculos y pedidos Hasta el momento se registran los siguientes datos en documentos variosbull Para cada cliente Nuacutemero de cliente (uacutenico) Direcciones de enviacuteo (varias por cliente) Saldo Liacutemite de creacutedito (depende del cliente pero en ninguacuten caso debe superar los 3000000 pts) Descuentobull Para cada artiacuteculo Nuacutemero de artiacuteculo (uacutenico) Faacutebricas que lo distribuyen Existencias de ese artiacuteculo en cada faacutebrica Descripcioacuten del artiacuteculobull Para cada pedido Cada pedido tiene una cabecera y el cuerpo del pedido La cabecera estaacute formada por el nuacutemero de cliente direccioacuten de enviacuteo y fecha del pedido El cuerpo del pedido son varias liacuteneas en cada liacutenea se especifican el nuacutemero del artiacuteculo pedido y la cantidadAdemaacutes se ha determinado que se debe almacenar la informacioacuten de las faacutebricas Sin embargo dado el uso de distribuidores se usaraacute Nuacutemero de la faacutebrica (uacutenico) y Teleacutefono de contacto Y se desean ver cuaacutentos artiacuteculos (en total) provee la faacutebrica Tambieacuten por informacioacuten estrateacutegica se podriacutea incluir informacioacuten de faacutebricas alternativas respecto de las que ya fabrican artiacuteculos para esta empresaNota Una direccioacuten se entenderaacute como Nordm Calle Comuna y Ciudad Una fecha incluye horaSe pide hacer el diagrama ER para la base de datos que represente esta informacioacuten

Problema 2 () Sistema de ventas

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 10

Le contratan para hacer una BD que permita apoyar la gestioacuten de un sistema de ventas La empresa necesita llevar un control de proveedores clientes productos y ventasUn proveedor tiene un RUT nombre direccioacuten teleacutefono y paacutegina web Un cliente tambieacuten tiene RUT nombre direccioacuten pero puede tener varios teleacutefonos de contacto La direccioacuten se entiende por calle nuacutemero comuna y ciudadUn producto tiene un id uacutenico nombre precio actual stock y nombre del proveedor Ademaacutes seorganizan en categoriacuteas y cada producto va soacutelo en una categoriacutea Una categoriacutea tiene id nombre y descripcioacutenPor razones de contabilidad se debe registrar la informacioacuten de cada venta con un id fecha cliente descuento y monto final Ademaacutes se debe guardar el precio al momento de la venta la cantidad vendida y el monto total por el producto

Problema 3 CarreterasDisentildear un esquema ER que recoja la organizacioacuten de una base de datos para contener la informacioacuten sobre todas las carreteras del paiacutes sabiendo que se deben cumplir las siguientes especificaciones- Las carreteras estaacuten divididas en varias categoriacuteas (locales comerciales regionales nacionalesautoviacuteas etc)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 11

- Las carreteras se dividen en tramos Un tramo siempre pertenece a una uacutenica carretera y no puede cambiar de carretera- Un tramo puede pasar por varias comunas interesando conocer el Km de la carretera y la comuna donde empieza el tramo y en donde termina- Para los tramos que suponen principio o final de carretera interesa saber si es que la carreteraconcluye fiacutesicamente o es que confluye en otra carretera En este caso interesa conocer con queacutecarretera confluye y en queacute kiloacutemetro tramo y comunaProblema 4 Sistema de vuelosObtener el diagrama ER para un sistema de control de vuelos adaptado a las siguientes reglas degestioacuten (indicar las entidades interrelaciones etc que se deducen de cada una de las reglas)a) De cada aeropuerto se conoce su coacutedigo nombre ciudad y paiacutesb) En cada aeropuerto pueden tomar tierra diversos modelos de aviones (el modelo de un avioacutendetermina su capacidad es decir el nuacutemero de plazasc) En cada aeropuerto existe una coleccioacuten de programas de vuelo En cada programa de vuelo se indica el nuacutemero de vuelo liacutenea aeacuterea y diacuteas de la semana en que existe dicho vuelod) Cada programa de vuelo despega de un aeropuerto y aterriza en otroe) Los nuacutemeros de vuelo son uacutenicos para todo el mundof) En cada aeropuerto hay muacuteltiples aterrizajes y despegues Todos los aeropuertos contemplados estaacuten en activo es decir tienen alguacuten aterrizaje y alguacuten despegueg) Cada vuelo realizado pertenece a un cierto programa de vuelo Para cada vuelo se quiere conocer su fecha plazas vaciacuteas y el modelo de avioacuten utilizadoh) Algunos programas de vuelo incorporan escalas teacutecnicas intermedias entre los aeropuertos de salida y de llegada Se entiende por escala teacutecnica a un aterrizaje y despegue consecutivos sin altas oacute bajas de pasajerosi) De cada vuelo se quieren conocer las escalas teacutecnicas ordenadas asignaacutendole a cada una un nuacutemero de ordenPor ejemplo el programa de vuelo 555 de Iberia con vuelos los lunes y jueves despega de Barajas-Madrid-Espantildea y aterriza en Caudell-Sydney-Australia teniendo las siguientes escalas teacutecnicas 1- Los Pradintildeos-Sao Paulo-Brasil 2-El Emperador-Santiago-Chile y 3-Saint Kitts-Auckland-Nueva Zelanda1048576 iquestQue cambios se produciraacuten en el caso anterior si en las escalas pudiesen bajar o subir pasajerosExplicar coacutemo se podriacutea representar esta nueva situacioacutenProblema 5 () OlimpiacuteadasLas sedes oliacutempicas se dividen en complejos deportivos Los complejos deportivos se subdividen en aquellos en los que se desarrolla un uacutenico deporte y en los polideportivos Los complejos polideportivos tienen aacutereas designadas para cada deporte con un indicador de localizacioacuten (ejemplo centro esquina- NE etc) Un complejo tiene una localizacioacuten un jefe de organizacioacuten individual y un aacuterea total ocupada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 12

Los dos tipos de complejos (deporte uacutenico y polideportivo) tendraacuten diferentes tipos de informacioacuten Para cada tipo de sede se conservaraacute el nuacutemero de complejos junto con su presupuesto aproximadoCada complejo celebra una serie de eventos (ejemplo la pista del estadio puede celebrar muchascarreras distintas) Para cada evento estaacute prevista una fecha duracioacuten nuacutemero de participantes nuacutemero de comisarios Una lista de todos los comisarios se conservaraacute junto con la lista de los eventos en los que esteacute involucrado cada comisario ya sea cumpliendo la tarea de juez u observador Tanto para cada evento como para el mantenimiento se necesitaraacute cierto equipamiento (ejemplo arcos peacutertigas barras paralelas etc)Problema 6 Educando SAEn la Empresa Educando SA se lleva control de sus Bienes y Servicios El intereacutes primario es poder hacer que los Bienes se manejen de forma raacutepida y con el menor grado de error Para esto quien maneja la seccioacuten de Bienes y Suministros plantea las siguientes condiciones del negocio para la construccioacuten de una base de datos10485761048576La Seccioacuten estaacute dividida en tres (3) aacutereas COMPRAS ALMACEN INVENTARIO10485761048576El aacuterea de Compras funciona de la siguiente formao Recibe las solicitudes de compras de las diferentes aacutereas de la empresao Cada solicitud tiene un responsableo Cada solicitud es autorizada por el jefe del aacuterea y posteriormente por el DirectorFinancieroo Quien realiza una solicitud puede ser responsable de uno o varios centros de costos conla salvedad de que eacutel como empleado solo estaacute adscrito a unoo De la solicitud se debe diligenciar la siguiente informacioacuten Nuacutemero de la solicitud (consecutivo) Fecha Responsable (nombre y ceacutedula) Centro de Costos Rubro presupuestal del cual se descargaraacute la compra En cada solicitud se pueden discriminar uno o muchos iacutetems con la siguiente informacioacuten iacutetem nombre del bien cantidad solicitada unidad de medida del bien valor unitario y valor total Cada solicitud debe ser totalizadao Cada bien es identificado por un coacutedigo universal que es uacutenico y es de caraacutecter devolutivo (suministro) o un bien inmuebleo Una vez diligenciada la solicitud es remitida al aacuterea de compras para realizar sucorrespondiente cotizacioacuteno Las cotizaciones son realizadas con uno o varios proveedores de los bienes solicitadoso Una vez la cotizacioacuten definitiva estaacute lista se crea una orden contractual que maneja lasiguiente informacioacuten Nuacutemero de la orden contractual nit y nombre del proveedor al cualse le va a realizar la compra fecha de la orden monto total de la orden fecha de entrega Cada orden puede tener asociado uno o varios iacutetems de la solicitud o solicitudes que van a ser despachadas Cada iacutetem tiene la siguiente informacioacuten nombre del bien cantidad solicitada cantidad despachada unidad de medida del bien valor unitario y valor total

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 13

o La orden de compra es aprobada por el Director Financiero para que sea enviada alproveedor elegido10485761048576El aacuterea de Almaceacuten funciona de la siguiente formao Su funcioacuten principal es recepcionar los bienes que llegan de los proveedores ydistribuirlos a las correspondientes aacutereas que realizaron las solicitudes de compraso Cuando llega un proveedor mercanciacutea este hace una entrega fiacutesica de los bienes loscuales son comparados con la factura que este entrega y con la orden de compracorrespondiente Si esta accioacuten es correcta se registra una entrada de almaceacuten por cadafactura relacionada con la siguiente informacioacuten Nuacutemero de Entrada Fecha Nuacutemero defactura Proveedor Total Bienes Valor Total (los totales deben coincidir con los de lafactura) Adjunto a esta se discriminan los iacutetems recibidos con la siguiente informacioacutennombre del bien cantidad entregadao Cuando el almaceacuten decide despachar los bienes a las diferentes aacutereas solicitantesregistra cada una de las entregas en Salidas de Almaceacuten con la siguiente informacioacutenNuacutemero de Salida Empleado responsable del bien a entregar fecha de salida fecha deentrega Por cada entrega se detalla cada uno de los iacutetems con la siguiente informacioacutennombre del bien cantidad entregadao Una entrada de almaceacuten puede generar muchas salidas de almaceacuten por ejemplo Pueden ingresar 500 pacas de papel higieacutenico pero como se debe repartir entrevarias aacutereas cada una requiere de una salida de almaceacuten10485761048576El aacuterea de inventarios funciona de la siguiente formao Es la encargada de administrar y controlar la ubicacioacuten de los bienes dentro de laempresa por esto antes de que el bien salga del almaceacuten debe ser codificado a traveacutesde un coacutedigo uacutenico que lo haga identificable dentro de la empresao La ubicacioacuten del bien se identifica por la siguiente informacioacuten responsable del bienfecha de entrega direccioacuten del bien (ubicacioacuten)Disentildear modelo ER para la base de datosProblema 7 Torneo de Tenis Grand SlamEl sistema debe memorizar todos los encuentros que se han desarrollado desde que existe el torneo asiacute como las siguientes caracteriacutesticas de estosDescripcioacutenEl Grand Slam se compone de cuatro torneos anuales que se celebran en Gran Bretantildea Estados Unidos Francia y Australia En cada paiacutes se pueden

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 14

desarrollar en distintos lugares (p ej en EE UU Puede desarrollarse en Forest Hill o en Flashing Meadows)Cada partido tiene asociado un premio de consolacioacuten para el perdedor que dependeraacute de la fase en que se encuentre el torneo (p ej el perdedor de octavos de final puede ganar 5000 doacutelares) El ganador de a final recibiraacute el premio correspondiente al torneoCada torneo tiene cinco modalidades Individual masculino individual femenino dobles masculino dobles femenino y dobles mixtosTambieacuten hay que tener en cuenta la nacionalidad de un jugador de forma que acuteeste puede ser apaacutetrida o tener varias nacionalidadesResultados a considerarEl sistema debe dar respuesta a las siguientes preguntas1 Dado un antildeo y un torneo composicioacuten y resultado de los partidos2 Lista de aacuterbitros que participaron en el torneo3 Ganancias percibidas en premios por un jugador a lo largo del torneo4 Lista de entrenadores que han entrenado a un jugador a lo largo del torneo y fechas en las que lo hizo Ejemplos de acceso a la base de datos1 Connors gano Gerulaitis en Roland Garros en 1979 en cuartos de final en individuales masculinos por6-3 4-67-5 6-02 El sentildeor Wilkinson arbitro ese partido3 Alemania ha ganado dos veces las individuales masculinas de Wimbledon Borg ha ganado 2000000de doacutelares a lo largo de su participacioacuten en el Grand Slam4 El ganado de Roland Garros de 1987 ganoacute 20000 doacutelares5 Noah ha jugado cuatro veces en dobles mixtos con MandlikovaProblema 8Se desea crear un sitio web con informacioacuten referente a las peliacuteculas en cartel en las salas de un dudoso cine cercano a la plaza de armasDe cada peliacutecula se almacena una ficha con su tiacutetulo de distribucioacuten su tiacutetulo original su geacutenero el idioma origina si tiene subtiacutetulos en espantildeol o no los paises de origen el antildeo de la produccioacuten la url del sitio web de la peliacutecula la duracioacuten (en horas y minutos) la calificacioacuten (Apta todo puacuteblico+9 antildeos +15 antildeos+18 antildeos) fecha de estreno en Santiago un resumen y un identificador de la peliacutecula De cada peliacutecula interesa conocer la lista de directores y el reparto es decir para cada actor que trabaja el nombre de todos los personajes que interpretaAdemaacutes interesa disponer de informacioacuten sobre los directores y actores que trabajan en cada peliacutecula De ambos se conoce su nombre (que lo identifica) y su nacionalidad Ademaacutes se desea conocer la cantidad de peliacuteculas en las que dirigieron o actuaron Tenga en cuenta que hay personas que cumplen los dos rolesLos cines pueden tener maacutes de una sala y cada semana cada uno de los cines enviacutea la cartelera para dicha semana indicando de detalle de las funciones Para cada funcioacuten se conoce el diacutea de la semana y la hora de comienzo y obviamente la sala y la peliacutecula que exhibe De cada sala se sabe el nombre un nuacutemero que la identifica dentro del cine y la cantidad de butacas que posee De cada cine se conoce el nombre que lo identifica su direccioacuten y teleacutefono para consultas

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 15

Algunos cines cuentan con promociones Estas promociones dependen de la funcioacuten (Ej De lunes a jueves antes de las 18 50 de descuento en la sala tal del cine tal para la peliacutecula cualLa funcioacuten del lunes a las 14 para la peliacutecula tal en la sala cual no se cobra a los escolares con tuacutenica ) De cada promocioacuten se conoce una descripcioacuten y el descuento que aplicaAdemaacutes del resumen de la peliacutecula que se incluye en la ficha interesa mostrar la opinioacuten de las personas que vieron la peliacutecula De cada opinioacuten se conoce el nombre de la persona que la realiza su edad le fecha en que registroacute su opinioacuten la calificacioacuten que le dio a la peliacutecula (Obra Maestra Muy BuenaBuena Regular Mala) y el comentario propiamente dicho A cada opinioacuten se le asigna un nuacutemero que la identifica respecto de la peliacutecula sobre la cual opina

15 Normalizacioacuten151 Primera forma normalUna tabla estaacute en Primera Forma Normal si

Todos los atributos son atoacutemicos Un atributo es atoacutemico si los elementos del dominio son indivisibles miacutenimos

La tabla contiene una llave primaria uacutenica La llave primaria no contiene atributos nulos No debe existir variacioacuten en el nuacutemero de columnas Los Campos no llave deben identificarse por la llave (Dependencia

Funcional) Debe Existir una independencia del orden tanto de las filas como de las

columnas es decir si los datos cambian de orden no deben cambiar sus significados

Una tabla no puede tener muacuteltiples valores en cada columna Los datos son atoacutemicos (Si a cada valor de X le pertenece un valor de Y y viceversa)Esta forma normal elimina los valores repetidos dentro de una BD

152 Segunda Forma Normal (2FN)

Dependencia Funcional Una relacioacuten estaacute en 2FN si estaacute en 1FN y si los atributos que no forman parte de ninguna clave dependen de forma completa de la clave principal Es decir que no existen dependencias parciales (Todos los atributos que no son clave principal deben depender uacutenicamente de la clave principal)

En otras palabras podriacuteamos decir que la segunda forma normal estaacute basada en el concepto de dependencia completamente funcional Una dependencia funcional es completamente funcional si al eliminar los atributos A de X significa que la dependencia no es mantenida esto es que Una dependencia funcional es una dependencia parcial si hay algunos atributos que pueden ser eliminados

de X y la dependencia todaviacutea se mantiene esto es

Por ejemplo DNI ID_PROYECTO HORAS_TRABAJO (con el DNI de un empleado y el ID de un proyecto sabemos cuaacutentas horas de trabajo por semana trabaja un empleado en dicho proyecto) es completamente dependiente dado que ni DNI HORAS_TRABAJO ni ID_PROYECTO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 16

HORAS_TRABAJO mantienen la dependencia Sin embargo DNI ID_PROYECTO NOMBRE_EMPLEADO es parcialmente dependiente dado que DNI NOMBRE_EMPLEADO mantiene la dependencia

153 Tercera Forma Normal (3FN)

La tabla se encuentra en 3FN si es 2FN y si no existe ninguna dependencia funcional transitiva entre los atributos que no son clave

Un ejemplo de este concepto seriacutea que una dependencia funcional X-gtY en un esquema de relacioacuten R es una dependencia transitiva si hay un conjunto de atributos Z que no es un subconjunto de alguna clave de R donde se mantiene X-gtZ y Z-gtY

Por ejemplo la dependencia SSN-gtDMGRSSN es una dependencia transitiva en EMP_DEPT de la siguiente figura Decimos que la dependencia de DMGRSSN el atributo clave SSN es transitiva viacutea DNUMBER porque las dependencias SSNrarrDNUMBER y DNUMBERrarrDMGRSSN son mantenidas y DNUMBER no es un subconjunto de la clave de EMP_DEPT Intuitivamente podemos ver que la dependencia de DMGRSSN sobre DNUMBER es indeseable en EMP_DEPT dado que DNUMBER no es una clave de EMP_DEPT

Formalmente un esquema de relacion estaacute en 3 Forma Normal Elmasri-Navathe[2] si para toda dependencia funcional se cumple al menos una de las siguientes condiciones

es superllave o clave

es atributo primo de esto es si es miembro de alguna clave en

Ademaacutes el esquema debe cumplir necesariamente

Ejemplo

Id estudiante Ci Nombres Apellidos Curso Materia Descripicoacuten01 1803327418 Fransico

FabianCamacho Saltos

4 En Ingeacutes

02 10152465 Carlos Banabeti

Ruales Camacho

5 ES Espantildeol

03

1 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 17

2 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

Id Curso Curso01 Primero02 SegundoId Materia Materia Descripcioacuten01 En Ingleacutes02 MT Matemaacutetica

3 era forma normal

Iddescripcion DescripcioacutenIngleacutesMatemaacutetica

Dada la siguiente tabla normalizarlaIDcliente Ceacutedula Nombres Direccioacuten Proveedor Producto

16 Herramientas para la normalizacioacuten

A continuacioacuten se mencionan algunas herramientas para normalizar una base de datos mediante un proceso automatizado

CAPIacuteTULO IIRealizar diferentes tareas de disentildeo y planificacioacuten sobre la

estructura de tablas

21 Tabla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 18

Id Materia Materia01 En02 MT

Es un conjunto de datos ordenados en filas y columnas

22 Tipos de datossql_variant Puede usarse en columnas paraacutemetros variables y valores devueltos de funciones definidas por el usuariosql_variant permite que estos objetos de base de datos admitan valores de otros tipos de datosxml Capaz de almacenar documentos XML oacute fragmentos XML que es posible utilizar tanto en variables como en campos de tablas y que a diferencia de otros tipos de datos ofrece meacutetodos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 19

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 20

23 Creacioacuten de tablasAntes de aprender sobre la creacioacuten de tablas es necesario conocer los pasos para crear una base de datos en sql server 2008Para crear una base de datos en SQL Server 2008 debemos seguir los siguientes pasos1- Ingresar a SQLServer

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 21

2- En la ventana que nos aparece realizamos clic derecho en donde dice database

3- Nos aparece el siguiente menuacute hacemos clic donde dice New Database

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 22

4- Nos aparece la siguiente ventana

En donde dice Database Name le damos un nombre a la base de datos

5- Luego hacemos clic en

Nos aparece la siguiente ventana

Aquiacute tenemos dos opciones In percent nos permite que si sobrepasa el tamantildeo de la base de datos crezca en porcentajeIn Megabytes nos permite hacer que la base de datos crezca de 1 Megabyte en 1 megabyte si sobrepasa el tamantildeo y listoAhora para crear una tabla seguimos los siguientes pasos1- Hacemos clic en donde dice database buscamos el nombre de nuestra base de datos en la seccioacuten tables realizamos clic derecho con el botoacuten secundario del mouse

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 23

Nos aparece el siguiente menuacute

Hacemos clic en New Table

Y en donde dice Column Name vamos poniendo los campos de las bases de datos con su respectivo tipoAl final hacemos clic en donde estaacute el iacutecono de un diskette nos aparece una ventana pidiendo el nombre de la tabla le asignamos un nombre y realizamos clic en el botoacuten ok24 Creacioacuten de RestriccionesUna restriccioacuten es una condicioacuten que obliga el cumplimiento de ciertas condiciones en la base de datos Algunas no son determinadas por los usuarios sino que son inherentemente definidas por el simple hecho de que la base de datos sea relacional Algunas otras restricciones las puede definir el usuario por ejemplo usar un campo con valores enteros entre 1 y 10

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 24

Las restricciones proveen un meacutetodo de implementar reglas en la base de datos Las restricciones restringen los datos que pueden ser almacenados en las tablas Usualmente se definen usando expresiones que dan como resultado un valor booleano indicando si los datos satisfacen la restriccioacuten o noLas restricciones no son parte formal del modelo relacional pero son incluidas porque juegan el rol de organizar mejor los datos Las restricciones son muy discutidas junto con los conceptos relacionalesPueden crearse los siguientes tipos de restricciones Las restricciones unique y primary key exigen que no haya dos filas en una tabla con los mismos valores en las columnas especificadas Ademaacutes la restriccioacuten primary key requiere que no haya valores nulos en ninguna fila de la columna

241 Crear una restriccioacuten PRIMARY KEYPara crear una restriccioacuten Primary Key realizamos clic en el campo donde

queremos crear la restriccioacuten y luego realizamos clic en el iacutecono 242 Crear una restriccioacuten UNIQUEPara crear una restriccioacuten UNIQUE realizamos clic en el campo donde queremos crear dicha restriccioacuten y luego escogemos el menuacute Table Designe y luego en IndexesKeys

Nos aparece la siguiente ventana en donde dice Type escogemos Unique Key

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 25

Realizamos clic en close y guardamos la tabla

La integridad de referencia ( references ) exige que los datos insertados en columnas especiacuteficas ya tengan datos coincidentes en la tabla y columnas especificadas Las restricciones check limitan los valores de datos insertados en las columnas

243 Agregar una restriccioacuten CHECKRealizamos clic derecho dentro del explorador de objetos en la seccioacuten tables buscamos el nombre de la tabla y buscamos constraints realizamos clic derecho con el botoacuten secundario del mouse y escogemos New Constraint

Nos apareced la siguiente ventana

|

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 26

Realizamos clic en este botoacuten para poder editar la expresioacuten que queremos que tenga restricciones

En la ventana que nos aparece ponemos la expresioacuten deseada y realizamos clic en el botoacuten Ok

Para poder editar la tabla y verificar los cambios realizados buscamos en el explorador de objetos el nombre de la tabla realizamos clic derecho y escogemos la opcioacuten Edit Top 200 Rows

Y procedemos a ingresar datos para probarTambieacuten se puede imponer la integridad de datos restringiendo el uso de valores nulos en una columna (las palabras clave null o not null ) y proporcionando valores predeterminados para columnas (la claacuteusula default )

25 Diagramas de bases de datosLos diagramas de bases de datos se utiliza para visualizar las tablas graacuteficamente y para poder establecer las relaciones

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 27

Para crear un diagrama hacemos clic en el explorador de objetos hacemos clic en el nombre de la base de datos y escogemos Database Diagrams hacemos clic derecho escogemos new Database Diagrams

Nos aparece el siguiente mensaje realizamos un clic dentro del botoacuten Yes

Volvemos hacer clic derechos y volvemos a escoger New Data Base Diagram

Aparece la siguiente ventana en pantalla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 28

Seleccionamos todas y escogemos AddNos aparece la siguiente ventana

En el caso de tener una relacioacuten muchos a muchos debemos romper la relacioacuten con una tercera tabla para esto desde el mismo Database Diagram hacemos clic derecho en un lugar en blanco y escogemos new table llenos las columnas con los campos y tipos de datos respectivosDebemos tomar en cuenta que en las tablas a donde va la relacioacuten tiene que tener su respectiva llave foraacutenea y para poder establecer la relacioacuten

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 29

arrastramos desde el campo principal hacia la llave foraacutenea es decir de la tabla padre a la hijaQuedando las relaciones asiacute

Finalmente cerramos la base de datos nos aparece la siguiente ventana

pidiendo guardar el Database Diagram le demos un nombre y realizamos clic

en el botoacuten OK

252 Ejercicios

Los diagramas del ejercicio 1 y 2 del capiacutetulo anterior pasar al modelo

relacional en SQLSERVER 2008

Los ejercicios 5 y 6 los ejercicios de la prueba pasarlos a sql server

Transformar el siguiente modelo entidad relacioacuten al modelo relacional

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 30

CAPIacuteTULO III

Aplicar las diferentes sentencias y modos en lenguaje SQL

para tratamiento de la informacioacuten almacenada en las

diferentes tablas de la base de datos

31 Lenguaje de definicioacuten de datosLas sentencias DDL son CREATE ALTER y DROP Siempre se usan estas

sentencias junto con el tipo de objeto y el nombre del objeto

CREATE

Crea una base de datos o un objeto

Sintaxis

Create database nombre on grupo_base de datos filegroup

Ejemplo

USE mastergoIF DB_ID (Ncalificaciones) IS NULL BEGIN create database calificaciones on primary( name = calificaciones filename = Ccalificacionescalificacionesmdf

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 31

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 2: Base de Datos

FILOSOFIacuteA DEL MOacuteDULO

La metodologiacutea a aplicarse en el moacutedulo es el ciclo de Kolb contemplando todas sus fases se pretende que los estudiantes alcancen un aprendizaje significativo para lo cual se realizaraacute una retroalimentacioacuten se explicaraacute mediante ejemplos se crearaacute un aprendizaje situado en lo cognitivo los estudiantes trabajaraacuten con ejercicios praacutecticos en el laboratorio se realizaraacuten exposiciones pruebas representacioacuten graacutefica de base de datos A continuacioacuten se detalla como se trabajaraacute con el ciclo del aprendizaje de KOLB

1- Experiencia concretaPara esta fase se realizaraacute la explicacioacuten respectiva luego se plantearaacute preguntas para que los estudiantes traten de responder2-Observacioacuten reflexivaEn esta etapa se plantearaacute ejercicios praacutecticos y que los estudiantes reflexionen en cada uno de ellos luego el profesor los resolveraacute en clases3- Conceptualizacioacuten abstractaSe propone ejercicios para que resuelvan los estudiantes y practiquen 4- Experimentacioacuten activaLos estudiantes deben realizar un pequentildeo proyecto aplicando los conocimientos adquiridos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 2

INDICE DE CONTENIDOS

Contenido Paacuteg

FILOSOFIacuteA DEL MOacuteDULO2

INTRODUCCIOacuteN 5

IDENTIFICAR LA ESTRUCTURA DE UNA BASE DE DATOS CON OBJETOS QUE LA COMPONEN 6

13 Estructura loacutegica7

14 Planificacioacuten ndash disentildeo8

15 Normalizacioacuten17

16 Herramientas para la normalizacioacuten19

Realizar diferentes tareas de disentildeo y planificacioacuten sobre la estructura de tablas19

21 Tabla 19

22 Tipos de datos20

23 Creacioacuten de tablas23

24 Creacioacuten de Restricciones26

25 Diagramas de bases de datos29

Aplicar las diferentes sentencias y modos en lenguaje SQL para tratamiento de la informacioacuten almacenada en las diferentes tablas de la base de datos32

31 Lenguaje de definicioacuten de datos32

32 Lenguaje de control de datos34

33 Lenguaje de manipulacioacuten de datos34

34 Caracteriacutesticas de la programacioacuten35

35 Funciones 38

Trabajar con los diferentes tipos de iacutendices conociendo las ventajas y desventajas de su uso en funcioacuten del objetivo buscado58

41 Iacutendices 58

42 Mantenimiento de iacutendices58

43 Iacutendices agrupados y no agrupados59

44 Creacioacuten de iacutendices60

45 Vistas 60

46 Creacioacuten de vistas60

Realizar tareas de administracioacuten de bases de datos mediante el uso de triggers61

51Triggers 61

52 Creacioacuten de triggers61

53 Procedimientos almacenados62

54 Trabajar con procedimientos almacenados62

BIBLIOGRAFIacuteA 63

ANEXOS 64

INTRODUCCIOacuteN

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 3

Gracias al aporte del Vicerrectorado Acadeacutemico de la Universidad Teacutecnica de Ambato en los esquemas presentados en la paacutegina web de la Institucioacuten se ha determinado los paraacutemetros del presente moacutedulo de contenidosEl moacutedulo empieza realizando una pequentildea introduccioacuten explicando conceptos y a continuacioacuten los objetos que componen una base de datos Luego explica la creacioacuten de tablas y sus relaciones entre ellos para ir avanzando a las diferentes sentencias y aplicaciones del lenguaje TRANSACT SQL para la consulta de base de dato luego se trabajara con iacutendices y finalmente con triggers para la administracioacuten de la base de datos la versioacuten de SQL server en que se haraacuten las aplicaciones es SQL SERVER 2008 EXPRESS R2 que es una versioacuten gratuita de MICROSOFT que permite realizar aplicaciones de escritorio aplicaciones web y pequentildeas aplicaciones de servidorSe trabajara con conceptos teoacutericos y praacutecticos que permitiraacuten el progreso del estudiante hasta alcanzar el dominio requerido se pretende realizar un pequentildeo sistema aplicable a una institucioacuten educativa con el propoacutesito de apoyar al sistema educativo y que el estudiante tenga una acercamiento a lo que seraacute su vida profesionalEl propoacutesito de este moacutedulo es desarrollar la capacidad de razonamiento en los estudiantes para que puedan desarrollar sistemas utilizando la menor cantidad de recursos de sistemas evitando crear aplicaciones pesadas sin no todo lo contrario crear aplicaciones livianas y raacutepidas que optimice recursos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 4

DESARROLLO DE CONTENIDOS

CAPIacuteTULO I

IDENTIFICAR LA ESTRUCTURA DE UNA BASE DE DATOS CON

OBJETOS QUE LA COMPONEN

11 Definicioacuten

111 Definicioacuten de base de datosUna base de datos es una entidad en la cual se pueden almacenar gran cantidad de datos de manera estructurada para luego poderlos recuperarlas posteriormente

112 EntidadEn bases de datos una entidad es la representacioacuten de un objeto o concepto del mundo real que se describe en una base de datosPor ejemplo nombres de entidades pueden ser Alumno Empleado Artiacuteculo etc1121 Entidades fuertes Una entidad fuerte es aquella que puede ser identificada uniacutevocamente sin participar en la relacioacuten Ejemplo cliente vehiacuteculo1121 Entidades deacutebiles Es aquella que no puede participar sin existir en la relacioacuten Ejemplo Factura viaje a la entidad deacutebil se le representa con doble rectaacutengulo

12 Estructura fiacutesicaUna base de datos se almacena en varios ficheros o archivos en disco Como miacutenimo existen dos archivos donde podremos guardar la base de datos

Archivo de datos Archivo de registro de transacciones

El archivo de datos o aquellos que antildeadimos como extras son los archivos que tendraacuten almacenada la informacioacutenPor otro lado tenemos el archivo de registro de transacciones Este fichero es tan importante como el anteriorEl nombre de una base de datos parte de una principal definida por el administrador y a partir de ese nombre principal sql server antildeade

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 5

terminaciones y extensiones a ese nombre principal ademaacutes como administrador puedo elegir el lugar donde se almacenaraacute la base de datosEjemplo si soy administrador de una base de datos y quiero crear una base de datos llama uta los archivos que se creariacutean son los siguientes

Archivo de datos miEmpresa_DataMDF Archivo de registro de transacciones miEmpresa_LogLDF

En caso de tener archivos extras nosotros como administradores tambieacuten podremos darles su nombre principal y la extensioacuten que suele utilizarse es NDFComo administradores tambieacuten puedo seleccionar el lugar de almacenamiento en una determinada carpeta o directorio incluso diferentes unidades fiacutesicasNo debes quedarte con la idea de que una base de datos se compone sencillamente de dos archivos es algo mucho maacutes completo que todo eso lo que representa una base de datos como entidad121 Tamantildeo de la base de datos

Al crear una base de datos con SQL server no es necesario separar una gran cantidad de memoria ya que los archivos de datos y registro crecen automaacuteticamente el administrador de la base de datos le da un tamantildeo inicial una cantidad muy pequentildea en Megabytes una vez que se utilice la base de datos y alcance el tamantildeo maacuteximo se incrementa13 Estructura loacutegicaEs el esqueleto o armazoacuten conceptual estaacute constituido por abstracciones de la realidad para enfocarse en el aacutembito conceptual sin entrar en detalles fiacutesicos Entre los elementos que conforman la estructura loacutegica de una base de datos podemos destacar131 TablasLas tablas son las unidades que almacenan los datos Como norma general se suele imponer que cada tabla almacena informacioacuten comuacuten sobre una entidad en particular (recuerda los libros) Esta norma se conoce como normalizacioacutenLa mayor parte de la actividad producida en una base de datos se produce sobre las tablas siendo las principales tareas las siguientes

Antildeadir informacioacuten Eliminar informacioacuten Modificar y actualizar informacioacuten Recoger informacioacuten y mostrarla

132 Campos y registros

Las tablas estaacuten compuestas de registros y campos Si imaginamos el disentildeo de una tabla como si de una cuadriacutecula se tratase sabemos que estaacute compuesta por varias filas y columnas Las filas corresponden a los registros mientras que las columnas seriacutean los campos Y cada una de las celdas que se forman de enlazar un registro (fila) con un campo (columna) formariacutea una celda la cual almacena un valor

Por lo tanto un registro esta formado por varios campos y cada campo almacena un determinado valor

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 6

133 IacutendicesUn iacutendice es un conjunto de valores clave el iacutendice guarda el elemento que desea indexar y la posicioacuten en la base de datosLos valores claves de los iacutendices pueden almacenar el contenido de una o varias columnas de una tabla134 VistasEs un conjunto de registros determinados de una o varias tablas se trabaja sobre ella como si fuera una tabla pero no lo es una vista no almacena datos si no que los extrae y permite trabajar con datos de varias tablas como si fuera una sola135 SQLSignifica lenguaje de consulta estructurado permite el acceso a bases de datos que explota la flexibilidad y potencia de los sistemas relacionales permitiendo gran variedad de operaciones14 Planificacioacuten ndash disentildeo141- Identificar el objetivo de la base de datosConsiste en un diaacutelogo intenso para averiguar expliacutecitamente que es lo que quiere el cliente142 Revisioacuten datos existentesUna gran herramienta para iniciar una aplicacioacuten es ver documetacioacuten sobre los datos existentes Hojas de caacutelculo albaranes facturas documentacioacuten en generalUna forma que ayuda mucho en la primera parte del desarrollo es mirar las necesidades del cliente iniciando por el final Por ejemplo si analizamos un informe de ventas que nos proporcione el cliente podemos ver mucha informacioacuten incluso la forma de relacionar las tablas Sabremos tambieacuten si estos datos hay que agruparlos por ejemplo por vendedor o por poblacioacuten Esto nos ayudaraacute a saber queacute campos y tablas necesitaremos para conseguir el objetivo final que se muestra en el informe del clienteCuanta maacutes informacioacuten se pueda recabar maacutes faacutecil seraacute dar los primeros pasos y acercarse desde el principio al disentildeo maacutes correcto posible Para evitar un trabajo suplementario y correcciones innecesarias hazlo bien la primera vez143 Modelado de la base de datos1431 Paso al SGBDLlave principal Es un campo o a una combinacioacuten de campos que identifica de forma uacutenica a cada fila de una tabla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 7

Llave foraacutenea Identifica una columna o grupo de columnas que se refiere a una columna o grupo de columnas en otra tablaRelaciones uno a unoEn una relacioacuten uno a uno una fila de la tabla A no puede tener maacutes de una fila coincidente en la tabla B y viceversa Se crea una relacioacuten uno a uno si las dos columnas relacionadas son claves principales Relaciones uno a variosUna relacioacuten uno a varios es el tipo maacutes habitual de relacioacuten En este tipo de relacioacuten una fila de la tabla A puede corresponderse con muchas filas de la tabla B pero una fila de la tabla B soacutelo puede corresponderse con otra de la tabla A Por ejemplo en las tablas (editoriales) y (tiacutetulos) se da una relacioacuten uno a varios una editorial publica muchos tiacutetulos pero a cada tiacutetulo le corresponde soacutelo una editorialEn una relacioacuten uno a varios solamente una de las columnas relacionadas es la clave principal o tiene una restriccioacuten uniqueRelaciones Varios a VariosEn una relacioacuten varios a varios una fila de la tabla A puede tener muchas filas coincidentes en la tabla B y viceversa Este tipo de relaciones se crea definiendo una tercera tabla denominada tabla de unioacuten cuya clave principal esteacute constituida por las claves externas de las tablas A y B Por ejemplo entre las tablas (autores) y (tiacutetulos) existiriacutea una relacioacuten varios a varios definida por una relacioacuten uno a varios entre cada una de ellas y la tabla (tiacutetuloautor) La clave principal de la tabla es la combinacioacuten de la columna au_id (la clave principal de la tabla autores) y la columna title_id (la clave principal de la tabla tiacutetulos)1432 Modelo entidad relacioacuten

1433 EjerciciosSupongamos que queremos disentildear una base de datos para una biblioteca y hemos conocido que eacutesta funciona de la siguiente formaEn la biblioteca se encuentra como es natural una serie de libros que los empleados solicitan a las editoriales Cuando un libro se recibe se le da de alta construyeacutendole una ficha para buacutesqueda por autor y otra ficha para buacutesqueda por tema En ambas fichas aparecen el tiacutetulo del libro el nombre del autor y su nacionalidad la editorial a la que pertenece la publicacioacuten el tema sobre el que trata el ISBN y la estanteriacutea de la biblioteca en la que se encuentra Un empleado puede solicitar un libro escribiendo una carta de

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 8

Entidades

Relaciones

Conectores

peticioacuten a la editorial correspondiente La direccioacuten a la que se a de dirigir la carta se encuentra en el archivo de editoriales Para acceder a los libros de la biblioteca es necesario la posesioacuten de un carnet que acredita a los distintos usuarios Este carnet se confecciona a cada persona la primera vez que intenta retirar un libro Cada usuario puede tener retirado un libro en un momento determinadoEn la biblioteca les gustariacutea disponer de un listado que se lanzariacutea al final de cada diacutea y en el que apareceriacutea para cada libro que se encuentra retirado el tiacutetulo el ISBN el autor y el nuacutemero de carnet nombre y la ceacutedula del usuario que lo mantiene retiradoCuando un usuario intente retirar un libro ha de presentar su carnet para que se tome nota de la retirada Si el libro que desea ha sido retirado por otro usuario se llama a eacuteste por teleacutefono indicaacutendole que hay otro usuario que desea el libro para que lo devuelva en caso de que no lo esteacute utilizandoMensualmente se confecciona un inventario actualizado donde se indica para cada libro el nombre el autor y el lugar de la biblioteca donde se encuentra

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 9telefononombrecedula

carnet

USUARIO

1

m 1

editado

DireccioacutenNombre

EDITORIAL

n

NACIONALIDNOMB

CODAUTO

AUTOR

TEMA

TITULO

ISBN

LIBRO Situado en

nuacutemerorororo

lugarnestanteria

ESTANTERIA

1

escrito

escrito

m

1

Problema 2 Artiacuteculos y encargosUna base de datos para una pequentildea empresa debe contener informacioacuten acerca de clientes artiacuteculos y pedidos Hasta el momento se registran los siguientes datos en documentos variosbull Para cada cliente Nuacutemero de cliente (uacutenico) Direcciones de enviacuteo (varias por cliente) Saldo Liacutemite de creacutedito (depende del cliente pero en ninguacuten caso debe superar los 3000000 pts) Descuentobull Para cada artiacuteculo Nuacutemero de artiacuteculo (uacutenico) Faacutebricas que lo distribuyen Existencias de ese artiacuteculo en cada faacutebrica Descripcioacuten del artiacuteculobull Para cada pedido Cada pedido tiene una cabecera y el cuerpo del pedido La cabecera estaacute formada por el nuacutemero de cliente direccioacuten de enviacuteo y fecha del pedido El cuerpo del pedido son varias liacuteneas en cada liacutenea se especifican el nuacutemero del artiacuteculo pedido y la cantidadAdemaacutes se ha determinado que se debe almacenar la informacioacuten de las faacutebricas Sin embargo dado el uso de distribuidores se usaraacute Nuacutemero de la faacutebrica (uacutenico) y Teleacutefono de contacto Y se desean ver cuaacutentos artiacuteculos (en total) provee la faacutebrica Tambieacuten por informacioacuten estrateacutegica se podriacutea incluir informacioacuten de faacutebricas alternativas respecto de las que ya fabrican artiacuteculos para esta empresaNota Una direccioacuten se entenderaacute como Nordm Calle Comuna y Ciudad Una fecha incluye horaSe pide hacer el diagrama ER para la base de datos que represente esta informacioacuten

Problema 2 () Sistema de ventas

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 10

Le contratan para hacer una BD que permita apoyar la gestioacuten de un sistema de ventas La empresa necesita llevar un control de proveedores clientes productos y ventasUn proveedor tiene un RUT nombre direccioacuten teleacutefono y paacutegina web Un cliente tambieacuten tiene RUT nombre direccioacuten pero puede tener varios teleacutefonos de contacto La direccioacuten se entiende por calle nuacutemero comuna y ciudadUn producto tiene un id uacutenico nombre precio actual stock y nombre del proveedor Ademaacutes seorganizan en categoriacuteas y cada producto va soacutelo en una categoriacutea Una categoriacutea tiene id nombre y descripcioacutenPor razones de contabilidad se debe registrar la informacioacuten de cada venta con un id fecha cliente descuento y monto final Ademaacutes se debe guardar el precio al momento de la venta la cantidad vendida y el monto total por el producto

Problema 3 CarreterasDisentildear un esquema ER que recoja la organizacioacuten de una base de datos para contener la informacioacuten sobre todas las carreteras del paiacutes sabiendo que se deben cumplir las siguientes especificaciones- Las carreteras estaacuten divididas en varias categoriacuteas (locales comerciales regionales nacionalesautoviacuteas etc)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 11

- Las carreteras se dividen en tramos Un tramo siempre pertenece a una uacutenica carretera y no puede cambiar de carretera- Un tramo puede pasar por varias comunas interesando conocer el Km de la carretera y la comuna donde empieza el tramo y en donde termina- Para los tramos que suponen principio o final de carretera interesa saber si es que la carreteraconcluye fiacutesicamente o es que confluye en otra carretera En este caso interesa conocer con queacutecarretera confluye y en queacute kiloacutemetro tramo y comunaProblema 4 Sistema de vuelosObtener el diagrama ER para un sistema de control de vuelos adaptado a las siguientes reglas degestioacuten (indicar las entidades interrelaciones etc que se deducen de cada una de las reglas)a) De cada aeropuerto se conoce su coacutedigo nombre ciudad y paiacutesb) En cada aeropuerto pueden tomar tierra diversos modelos de aviones (el modelo de un avioacutendetermina su capacidad es decir el nuacutemero de plazasc) En cada aeropuerto existe una coleccioacuten de programas de vuelo En cada programa de vuelo se indica el nuacutemero de vuelo liacutenea aeacuterea y diacuteas de la semana en que existe dicho vuelod) Cada programa de vuelo despega de un aeropuerto y aterriza en otroe) Los nuacutemeros de vuelo son uacutenicos para todo el mundof) En cada aeropuerto hay muacuteltiples aterrizajes y despegues Todos los aeropuertos contemplados estaacuten en activo es decir tienen alguacuten aterrizaje y alguacuten despegueg) Cada vuelo realizado pertenece a un cierto programa de vuelo Para cada vuelo se quiere conocer su fecha plazas vaciacuteas y el modelo de avioacuten utilizadoh) Algunos programas de vuelo incorporan escalas teacutecnicas intermedias entre los aeropuertos de salida y de llegada Se entiende por escala teacutecnica a un aterrizaje y despegue consecutivos sin altas oacute bajas de pasajerosi) De cada vuelo se quieren conocer las escalas teacutecnicas ordenadas asignaacutendole a cada una un nuacutemero de ordenPor ejemplo el programa de vuelo 555 de Iberia con vuelos los lunes y jueves despega de Barajas-Madrid-Espantildea y aterriza en Caudell-Sydney-Australia teniendo las siguientes escalas teacutecnicas 1- Los Pradintildeos-Sao Paulo-Brasil 2-El Emperador-Santiago-Chile y 3-Saint Kitts-Auckland-Nueva Zelanda1048576 iquestQue cambios se produciraacuten en el caso anterior si en las escalas pudiesen bajar o subir pasajerosExplicar coacutemo se podriacutea representar esta nueva situacioacutenProblema 5 () OlimpiacuteadasLas sedes oliacutempicas se dividen en complejos deportivos Los complejos deportivos se subdividen en aquellos en los que se desarrolla un uacutenico deporte y en los polideportivos Los complejos polideportivos tienen aacutereas designadas para cada deporte con un indicador de localizacioacuten (ejemplo centro esquina- NE etc) Un complejo tiene una localizacioacuten un jefe de organizacioacuten individual y un aacuterea total ocupada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 12

Los dos tipos de complejos (deporte uacutenico y polideportivo) tendraacuten diferentes tipos de informacioacuten Para cada tipo de sede se conservaraacute el nuacutemero de complejos junto con su presupuesto aproximadoCada complejo celebra una serie de eventos (ejemplo la pista del estadio puede celebrar muchascarreras distintas) Para cada evento estaacute prevista una fecha duracioacuten nuacutemero de participantes nuacutemero de comisarios Una lista de todos los comisarios se conservaraacute junto con la lista de los eventos en los que esteacute involucrado cada comisario ya sea cumpliendo la tarea de juez u observador Tanto para cada evento como para el mantenimiento se necesitaraacute cierto equipamiento (ejemplo arcos peacutertigas barras paralelas etc)Problema 6 Educando SAEn la Empresa Educando SA se lleva control de sus Bienes y Servicios El intereacutes primario es poder hacer que los Bienes se manejen de forma raacutepida y con el menor grado de error Para esto quien maneja la seccioacuten de Bienes y Suministros plantea las siguientes condiciones del negocio para la construccioacuten de una base de datos10485761048576La Seccioacuten estaacute dividida en tres (3) aacutereas COMPRAS ALMACEN INVENTARIO10485761048576El aacuterea de Compras funciona de la siguiente formao Recibe las solicitudes de compras de las diferentes aacutereas de la empresao Cada solicitud tiene un responsableo Cada solicitud es autorizada por el jefe del aacuterea y posteriormente por el DirectorFinancieroo Quien realiza una solicitud puede ser responsable de uno o varios centros de costos conla salvedad de que eacutel como empleado solo estaacute adscrito a unoo De la solicitud se debe diligenciar la siguiente informacioacuten Nuacutemero de la solicitud (consecutivo) Fecha Responsable (nombre y ceacutedula) Centro de Costos Rubro presupuestal del cual se descargaraacute la compra En cada solicitud se pueden discriminar uno o muchos iacutetems con la siguiente informacioacuten iacutetem nombre del bien cantidad solicitada unidad de medida del bien valor unitario y valor total Cada solicitud debe ser totalizadao Cada bien es identificado por un coacutedigo universal que es uacutenico y es de caraacutecter devolutivo (suministro) o un bien inmuebleo Una vez diligenciada la solicitud es remitida al aacuterea de compras para realizar sucorrespondiente cotizacioacuteno Las cotizaciones son realizadas con uno o varios proveedores de los bienes solicitadoso Una vez la cotizacioacuten definitiva estaacute lista se crea una orden contractual que maneja lasiguiente informacioacuten Nuacutemero de la orden contractual nit y nombre del proveedor al cualse le va a realizar la compra fecha de la orden monto total de la orden fecha de entrega Cada orden puede tener asociado uno o varios iacutetems de la solicitud o solicitudes que van a ser despachadas Cada iacutetem tiene la siguiente informacioacuten nombre del bien cantidad solicitada cantidad despachada unidad de medida del bien valor unitario y valor total

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 13

o La orden de compra es aprobada por el Director Financiero para que sea enviada alproveedor elegido10485761048576El aacuterea de Almaceacuten funciona de la siguiente formao Su funcioacuten principal es recepcionar los bienes que llegan de los proveedores ydistribuirlos a las correspondientes aacutereas que realizaron las solicitudes de compraso Cuando llega un proveedor mercanciacutea este hace una entrega fiacutesica de los bienes loscuales son comparados con la factura que este entrega y con la orden de compracorrespondiente Si esta accioacuten es correcta se registra una entrada de almaceacuten por cadafactura relacionada con la siguiente informacioacuten Nuacutemero de Entrada Fecha Nuacutemero defactura Proveedor Total Bienes Valor Total (los totales deben coincidir con los de lafactura) Adjunto a esta se discriminan los iacutetems recibidos con la siguiente informacioacutennombre del bien cantidad entregadao Cuando el almaceacuten decide despachar los bienes a las diferentes aacutereas solicitantesregistra cada una de las entregas en Salidas de Almaceacuten con la siguiente informacioacutenNuacutemero de Salida Empleado responsable del bien a entregar fecha de salida fecha deentrega Por cada entrega se detalla cada uno de los iacutetems con la siguiente informacioacutennombre del bien cantidad entregadao Una entrada de almaceacuten puede generar muchas salidas de almaceacuten por ejemplo Pueden ingresar 500 pacas de papel higieacutenico pero como se debe repartir entrevarias aacutereas cada una requiere de una salida de almaceacuten10485761048576El aacuterea de inventarios funciona de la siguiente formao Es la encargada de administrar y controlar la ubicacioacuten de los bienes dentro de laempresa por esto antes de que el bien salga del almaceacuten debe ser codificado a traveacutesde un coacutedigo uacutenico que lo haga identificable dentro de la empresao La ubicacioacuten del bien se identifica por la siguiente informacioacuten responsable del bienfecha de entrega direccioacuten del bien (ubicacioacuten)Disentildear modelo ER para la base de datosProblema 7 Torneo de Tenis Grand SlamEl sistema debe memorizar todos los encuentros que se han desarrollado desde que existe el torneo asiacute como las siguientes caracteriacutesticas de estosDescripcioacutenEl Grand Slam se compone de cuatro torneos anuales que se celebran en Gran Bretantildea Estados Unidos Francia y Australia En cada paiacutes se pueden

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 14

desarrollar en distintos lugares (p ej en EE UU Puede desarrollarse en Forest Hill o en Flashing Meadows)Cada partido tiene asociado un premio de consolacioacuten para el perdedor que dependeraacute de la fase en que se encuentre el torneo (p ej el perdedor de octavos de final puede ganar 5000 doacutelares) El ganador de a final recibiraacute el premio correspondiente al torneoCada torneo tiene cinco modalidades Individual masculino individual femenino dobles masculino dobles femenino y dobles mixtosTambieacuten hay que tener en cuenta la nacionalidad de un jugador de forma que acuteeste puede ser apaacutetrida o tener varias nacionalidadesResultados a considerarEl sistema debe dar respuesta a las siguientes preguntas1 Dado un antildeo y un torneo composicioacuten y resultado de los partidos2 Lista de aacuterbitros que participaron en el torneo3 Ganancias percibidas en premios por un jugador a lo largo del torneo4 Lista de entrenadores que han entrenado a un jugador a lo largo del torneo y fechas en las que lo hizo Ejemplos de acceso a la base de datos1 Connors gano Gerulaitis en Roland Garros en 1979 en cuartos de final en individuales masculinos por6-3 4-67-5 6-02 El sentildeor Wilkinson arbitro ese partido3 Alemania ha ganado dos veces las individuales masculinas de Wimbledon Borg ha ganado 2000000de doacutelares a lo largo de su participacioacuten en el Grand Slam4 El ganado de Roland Garros de 1987 ganoacute 20000 doacutelares5 Noah ha jugado cuatro veces en dobles mixtos con MandlikovaProblema 8Se desea crear un sitio web con informacioacuten referente a las peliacuteculas en cartel en las salas de un dudoso cine cercano a la plaza de armasDe cada peliacutecula se almacena una ficha con su tiacutetulo de distribucioacuten su tiacutetulo original su geacutenero el idioma origina si tiene subtiacutetulos en espantildeol o no los paises de origen el antildeo de la produccioacuten la url del sitio web de la peliacutecula la duracioacuten (en horas y minutos) la calificacioacuten (Apta todo puacuteblico+9 antildeos +15 antildeos+18 antildeos) fecha de estreno en Santiago un resumen y un identificador de la peliacutecula De cada peliacutecula interesa conocer la lista de directores y el reparto es decir para cada actor que trabaja el nombre de todos los personajes que interpretaAdemaacutes interesa disponer de informacioacuten sobre los directores y actores que trabajan en cada peliacutecula De ambos se conoce su nombre (que lo identifica) y su nacionalidad Ademaacutes se desea conocer la cantidad de peliacuteculas en las que dirigieron o actuaron Tenga en cuenta que hay personas que cumplen los dos rolesLos cines pueden tener maacutes de una sala y cada semana cada uno de los cines enviacutea la cartelera para dicha semana indicando de detalle de las funciones Para cada funcioacuten se conoce el diacutea de la semana y la hora de comienzo y obviamente la sala y la peliacutecula que exhibe De cada sala se sabe el nombre un nuacutemero que la identifica dentro del cine y la cantidad de butacas que posee De cada cine se conoce el nombre que lo identifica su direccioacuten y teleacutefono para consultas

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 15

Algunos cines cuentan con promociones Estas promociones dependen de la funcioacuten (Ej De lunes a jueves antes de las 18 50 de descuento en la sala tal del cine tal para la peliacutecula cualLa funcioacuten del lunes a las 14 para la peliacutecula tal en la sala cual no se cobra a los escolares con tuacutenica ) De cada promocioacuten se conoce una descripcioacuten y el descuento que aplicaAdemaacutes del resumen de la peliacutecula que se incluye en la ficha interesa mostrar la opinioacuten de las personas que vieron la peliacutecula De cada opinioacuten se conoce el nombre de la persona que la realiza su edad le fecha en que registroacute su opinioacuten la calificacioacuten que le dio a la peliacutecula (Obra Maestra Muy BuenaBuena Regular Mala) y el comentario propiamente dicho A cada opinioacuten se le asigna un nuacutemero que la identifica respecto de la peliacutecula sobre la cual opina

15 Normalizacioacuten151 Primera forma normalUna tabla estaacute en Primera Forma Normal si

Todos los atributos son atoacutemicos Un atributo es atoacutemico si los elementos del dominio son indivisibles miacutenimos

La tabla contiene una llave primaria uacutenica La llave primaria no contiene atributos nulos No debe existir variacioacuten en el nuacutemero de columnas Los Campos no llave deben identificarse por la llave (Dependencia

Funcional) Debe Existir una independencia del orden tanto de las filas como de las

columnas es decir si los datos cambian de orden no deben cambiar sus significados

Una tabla no puede tener muacuteltiples valores en cada columna Los datos son atoacutemicos (Si a cada valor de X le pertenece un valor de Y y viceversa)Esta forma normal elimina los valores repetidos dentro de una BD

152 Segunda Forma Normal (2FN)

Dependencia Funcional Una relacioacuten estaacute en 2FN si estaacute en 1FN y si los atributos que no forman parte de ninguna clave dependen de forma completa de la clave principal Es decir que no existen dependencias parciales (Todos los atributos que no son clave principal deben depender uacutenicamente de la clave principal)

En otras palabras podriacuteamos decir que la segunda forma normal estaacute basada en el concepto de dependencia completamente funcional Una dependencia funcional es completamente funcional si al eliminar los atributos A de X significa que la dependencia no es mantenida esto es que Una dependencia funcional es una dependencia parcial si hay algunos atributos que pueden ser eliminados

de X y la dependencia todaviacutea se mantiene esto es

Por ejemplo DNI ID_PROYECTO HORAS_TRABAJO (con el DNI de un empleado y el ID de un proyecto sabemos cuaacutentas horas de trabajo por semana trabaja un empleado en dicho proyecto) es completamente dependiente dado que ni DNI HORAS_TRABAJO ni ID_PROYECTO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 16

HORAS_TRABAJO mantienen la dependencia Sin embargo DNI ID_PROYECTO NOMBRE_EMPLEADO es parcialmente dependiente dado que DNI NOMBRE_EMPLEADO mantiene la dependencia

153 Tercera Forma Normal (3FN)

La tabla se encuentra en 3FN si es 2FN y si no existe ninguna dependencia funcional transitiva entre los atributos que no son clave

Un ejemplo de este concepto seriacutea que una dependencia funcional X-gtY en un esquema de relacioacuten R es una dependencia transitiva si hay un conjunto de atributos Z que no es un subconjunto de alguna clave de R donde se mantiene X-gtZ y Z-gtY

Por ejemplo la dependencia SSN-gtDMGRSSN es una dependencia transitiva en EMP_DEPT de la siguiente figura Decimos que la dependencia de DMGRSSN el atributo clave SSN es transitiva viacutea DNUMBER porque las dependencias SSNrarrDNUMBER y DNUMBERrarrDMGRSSN son mantenidas y DNUMBER no es un subconjunto de la clave de EMP_DEPT Intuitivamente podemos ver que la dependencia de DMGRSSN sobre DNUMBER es indeseable en EMP_DEPT dado que DNUMBER no es una clave de EMP_DEPT

Formalmente un esquema de relacion estaacute en 3 Forma Normal Elmasri-Navathe[2] si para toda dependencia funcional se cumple al menos una de las siguientes condiciones

es superllave o clave

es atributo primo de esto es si es miembro de alguna clave en

Ademaacutes el esquema debe cumplir necesariamente

Ejemplo

Id estudiante Ci Nombres Apellidos Curso Materia Descripicoacuten01 1803327418 Fransico

FabianCamacho Saltos

4 En Ingeacutes

02 10152465 Carlos Banabeti

Ruales Camacho

5 ES Espantildeol

03

1 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 17

2 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

Id Curso Curso01 Primero02 SegundoId Materia Materia Descripcioacuten01 En Ingleacutes02 MT Matemaacutetica

3 era forma normal

Iddescripcion DescripcioacutenIngleacutesMatemaacutetica

Dada la siguiente tabla normalizarlaIDcliente Ceacutedula Nombres Direccioacuten Proveedor Producto

16 Herramientas para la normalizacioacuten

A continuacioacuten se mencionan algunas herramientas para normalizar una base de datos mediante un proceso automatizado

CAPIacuteTULO IIRealizar diferentes tareas de disentildeo y planificacioacuten sobre la

estructura de tablas

21 Tabla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 18

Id Materia Materia01 En02 MT

Es un conjunto de datos ordenados en filas y columnas

22 Tipos de datossql_variant Puede usarse en columnas paraacutemetros variables y valores devueltos de funciones definidas por el usuariosql_variant permite que estos objetos de base de datos admitan valores de otros tipos de datosxml Capaz de almacenar documentos XML oacute fragmentos XML que es posible utilizar tanto en variables como en campos de tablas y que a diferencia de otros tipos de datos ofrece meacutetodos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 19

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 20

23 Creacioacuten de tablasAntes de aprender sobre la creacioacuten de tablas es necesario conocer los pasos para crear una base de datos en sql server 2008Para crear una base de datos en SQL Server 2008 debemos seguir los siguientes pasos1- Ingresar a SQLServer

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 21

2- En la ventana que nos aparece realizamos clic derecho en donde dice database

3- Nos aparece el siguiente menuacute hacemos clic donde dice New Database

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 22

4- Nos aparece la siguiente ventana

En donde dice Database Name le damos un nombre a la base de datos

5- Luego hacemos clic en

Nos aparece la siguiente ventana

Aquiacute tenemos dos opciones In percent nos permite que si sobrepasa el tamantildeo de la base de datos crezca en porcentajeIn Megabytes nos permite hacer que la base de datos crezca de 1 Megabyte en 1 megabyte si sobrepasa el tamantildeo y listoAhora para crear una tabla seguimos los siguientes pasos1- Hacemos clic en donde dice database buscamos el nombre de nuestra base de datos en la seccioacuten tables realizamos clic derecho con el botoacuten secundario del mouse

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 23

Nos aparece el siguiente menuacute

Hacemos clic en New Table

Y en donde dice Column Name vamos poniendo los campos de las bases de datos con su respectivo tipoAl final hacemos clic en donde estaacute el iacutecono de un diskette nos aparece una ventana pidiendo el nombre de la tabla le asignamos un nombre y realizamos clic en el botoacuten ok24 Creacioacuten de RestriccionesUna restriccioacuten es una condicioacuten que obliga el cumplimiento de ciertas condiciones en la base de datos Algunas no son determinadas por los usuarios sino que son inherentemente definidas por el simple hecho de que la base de datos sea relacional Algunas otras restricciones las puede definir el usuario por ejemplo usar un campo con valores enteros entre 1 y 10

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 24

Las restricciones proveen un meacutetodo de implementar reglas en la base de datos Las restricciones restringen los datos que pueden ser almacenados en las tablas Usualmente se definen usando expresiones que dan como resultado un valor booleano indicando si los datos satisfacen la restriccioacuten o noLas restricciones no son parte formal del modelo relacional pero son incluidas porque juegan el rol de organizar mejor los datos Las restricciones son muy discutidas junto con los conceptos relacionalesPueden crearse los siguientes tipos de restricciones Las restricciones unique y primary key exigen que no haya dos filas en una tabla con los mismos valores en las columnas especificadas Ademaacutes la restriccioacuten primary key requiere que no haya valores nulos en ninguna fila de la columna

241 Crear una restriccioacuten PRIMARY KEYPara crear una restriccioacuten Primary Key realizamos clic en el campo donde

queremos crear la restriccioacuten y luego realizamos clic en el iacutecono 242 Crear una restriccioacuten UNIQUEPara crear una restriccioacuten UNIQUE realizamos clic en el campo donde queremos crear dicha restriccioacuten y luego escogemos el menuacute Table Designe y luego en IndexesKeys

Nos aparece la siguiente ventana en donde dice Type escogemos Unique Key

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 25

Realizamos clic en close y guardamos la tabla

La integridad de referencia ( references ) exige que los datos insertados en columnas especiacuteficas ya tengan datos coincidentes en la tabla y columnas especificadas Las restricciones check limitan los valores de datos insertados en las columnas

243 Agregar una restriccioacuten CHECKRealizamos clic derecho dentro del explorador de objetos en la seccioacuten tables buscamos el nombre de la tabla y buscamos constraints realizamos clic derecho con el botoacuten secundario del mouse y escogemos New Constraint

Nos apareced la siguiente ventana

|

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 26

Realizamos clic en este botoacuten para poder editar la expresioacuten que queremos que tenga restricciones

En la ventana que nos aparece ponemos la expresioacuten deseada y realizamos clic en el botoacuten Ok

Para poder editar la tabla y verificar los cambios realizados buscamos en el explorador de objetos el nombre de la tabla realizamos clic derecho y escogemos la opcioacuten Edit Top 200 Rows

Y procedemos a ingresar datos para probarTambieacuten se puede imponer la integridad de datos restringiendo el uso de valores nulos en una columna (las palabras clave null o not null ) y proporcionando valores predeterminados para columnas (la claacuteusula default )

25 Diagramas de bases de datosLos diagramas de bases de datos se utiliza para visualizar las tablas graacuteficamente y para poder establecer las relaciones

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 27

Para crear un diagrama hacemos clic en el explorador de objetos hacemos clic en el nombre de la base de datos y escogemos Database Diagrams hacemos clic derecho escogemos new Database Diagrams

Nos aparece el siguiente mensaje realizamos un clic dentro del botoacuten Yes

Volvemos hacer clic derechos y volvemos a escoger New Data Base Diagram

Aparece la siguiente ventana en pantalla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 28

Seleccionamos todas y escogemos AddNos aparece la siguiente ventana

En el caso de tener una relacioacuten muchos a muchos debemos romper la relacioacuten con una tercera tabla para esto desde el mismo Database Diagram hacemos clic derecho en un lugar en blanco y escogemos new table llenos las columnas con los campos y tipos de datos respectivosDebemos tomar en cuenta que en las tablas a donde va la relacioacuten tiene que tener su respectiva llave foraacutenea y para poder establecer la relacioacuten

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 29

arrastramos desde el campo principal hacia la llave foraacutenea es decir de la tabla padre a la hijaQuedando las relaciones asiacute

Finalmente cerramos la base de datos nos aparece la siguiente ventana

pidiendo guardar el Database Diagram le demos un nombre y realizamos clic

en el botoacuten OK

252 Ejercicios

Los diagramas del ejercicio 1 y 2 del capiacutetulo anterior pasar al modelo

relacional en SQLSERVER 2008

Los ejercicios 5 y 6 los ejercicios de la prueba pasarlos a sql server

Transformar el siguiente modelo entidad relacioacuten al modelo relacional

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 30

CAPIacuteTULO III

Aplicar las diferentes sentencias y modos en lenguaje SQL

para tratamiento de la informacioacuten almacenada en las

diferentes tablas de la base de datos

31 Lenguaje de definicioacuten de datosLas sentencias DDL son CREATE ALTER y DROP Siempre se usan estas

sentencias junto con el tipo de objeto y el nombre del objeto

CREATE

Crea una base de datos o un objeto

Sintaxis

Create database nombre on grupo_base de datos filegroup

Ejemplo

USE mastergoIF DB_ID (Ncalificaciones) IS NULL BEGIN create database calificaciones on primary( name = calificaciones filename = Ccalificacionescalificacionesmdf

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 31

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 3: Base de Datos

INDICE DE CONTENIDOS

Contenido Paacuteg

FILOSOFIacuteA DEL MOacuteDULO2

INTRODUCCIOacuteN 5

IDENTIFICAR LA ESTRUCTURA DE UNA BASE DE DATOS CON OBJETOS QUE LA COMPONEN 6

13 Estructura loacutegica7

14 Planificacioacuten ndash disentildeo8

15 Normalizacioacuten17

16 Herramientas para la normalizacioacuten19

Realizar diferentes tareas de disentildeo y planificacioacuten sobre la estructura de tablas19

21 Tabla 19

22 Tipos de datos20

23 Creacioacuten de tablas23

24 Creacioacuten de Restricciones26

25 Diagramas de bases de datos29

Aplicar las diferentes sentencias y modos en lenguaje SQL para tratamiento de la informacioacuten almacenada en las diferentes tablas de la base de datos32

31 Lenguaje de definicioacuten de datos32

32 Lenguaje de control de datos34

33 Lenguaje de manipulacioacuten de datos34

34 Caracteriacutesticas de la programacioacuten35

35 Funciones 38

Trabajar con los diferentes tipos de iacutendices conociendo las ventajas y desventajas de su uso en funcioacuten del objetivo buscado58

41 Iacutendices 58

42 Mantenimiento de iacutendices58

43 Iacutendices agrupados y no agrupados59

44 Creacioacuten de iacutendices60

45 Vistas 60

46 Creacioacuten de vistas60

Realizar tareas de administracioacuten de bases de datos mediante el uso de triggers61

51Triggers 61

52 Creacioacuten de triggers61

53 Procedimientos almacenados62

54 Trabajar con procedimientos almacenados62

BIBLIOGRAFIacuteA 63

ANEXOS 64

INTRODUCCIOacuteN

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 3

Gracias al aporte del Vicerrectorado Acadeacutemico de la Universidad Teacutecnica de Ambato en los esquemas presentados en la paacutegina web de la Institucioacuten se ha determinado los paraacutemetros del presente moacutedulo de contenidosEl moacutedulo empieza realizando una pequentildea introduccioacuten explicando conceptos y a continuacioacuten los objetos que componen una base de datos Luego explica la creacioacuten de tablas y sus relaciones entre ellos para ir avanzando a las diferentes sentencias y aplicaciones del lenguaje TRANSACT SQL para la consulta de base de dato luego se trabajara con iacutendices y finalmente con triggers para la administracioacuten de la base de datos la versioacuten de SQL server en que se haraacuten las aplicaciones es SQL SERVER 2008 EXPRESS R2 que es una versioacuten gratuita de MICROSOFT que permite realizar aplicaciones de escritorio aplicaciones web y pequentildeas aplicaciones de servidorSe trabajara con conceptos teoacutericos y praacutecticos que permitiraacuten el progreso del estudiante hasta alcanzar el dominio requerido se pretende realizar un pequentildeo sistema aplicable a una institucioacuten educativa con el propoacutesito de apoyar al sistema educativo y que el estudiante tenga una acercamiento a lo que seraacute su vida profesionalEl propoacutesito de este moacutedulo es desarrollar la capacidad de razonamiento en los estudiantes para que puedan desarrollar sistemas utilizando la menor cantidad de recursos de sistemas evitando crear aplicaciones pesadas sin no todo lo contrario crear aplicaciones livianas y raacutepidas que optimice recursos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 4

DESARROLLO DE CONTENIDOS

CAPIacuteTULO I

IDENTIFICAR LA ESTRUCTURA DE UNA BASE DE DATOS CON

OBJETOS QUE LA COMPONEN

11 Definicioacuten

111 Definicioacuten de base de datosUna base de datos es una entidad en la cual se pueden almacenar gran cantidad de datos de manera estructurada para luego poderlos recuperarlas posteriormente

112 EntidadEn bases de datos una entidad es la representacioacuten de un objeto o concepto del mundo real que se describe en una base de datosPor ejemplo nombres de entidades pueden ser Alumno Empleado Artiacuteculo etc1121 Entidades fuertes Una entidad fuerte es aquella que puede ser identificada uniacutevocamente sin participar en la relacioacuten Ejemplo cliente vehiacuteculo1121 Entidades deacutebiles Es aquella que no puede participar sin existir en la relacioacuten Ejemplo Factura viaje a la entidad deacutebil se le representa con doble rectaacutengulo

12 Estructura fiacutesicaUna base de datos se almacena en varios ficheros o archivos en disco Como miacutenimo existen dos archivos donde podremos guardar la base de datos

Archivo de datos Archivo de registro de transacciones

El archivo de datos o aquellos que antildeadimos como extras son los archivos que tendraacuten almacenada la informacioacutenPor otro lado tenemos el archivo de registro de transacciones Este fichero es tan importante como el anteriorEl nombre de una base de datos parte de una principal definida por el administrador y a partir de ese nombre principal sql server antildeade

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 5

terminaciones y extensiones a ese nombre principal ademaacutes como administrador puedo elegir el lugar donde se almacenaraacute la base de datosEjemplo si soy administrador de una base de datos y quiero crear una base de datos llama uta los archivos que se creariacutean son los siguientes

Archivo de datos miEmpresa_DataMDF Archivo de registro de transacciones miEmpresa_LogLDF

En caso de tener archivos extras nosotros como administradores tambieacuten podremos darles su nombre principal y la extensioacuten que suele utilizarse es NDFComo administradores tambieacuten puedo seleccionar el lugar de almacenamiento en una determinada carpeta o directorio incluso diferentes unidades fiacutesicasNo debes quedarte con la idea de que una base de datos se compone sencillamente de dos archivos es algo mucho maacutes completo que todo eso lo que representa una base de datos como entidad121 Tamantildeo de la base de datos

Al crear una base de datos con SQL server no es necesario separar una gran cantidad de memoria ya que los archivos de datos y registro crecen automaacuteticamente el administrador de la base de datos le da un tamantildeo inicial una cantidad muy pequentildea en Megabytes una vez que se utilice la base de datos y alcance el tamantildeo maacuteximo se incrementa13 Estructura loacutegicaEs el esqueleto o armazoacuten conceptual estaacute constituido por abstracciones de la realidad para enfocarse en el aacutembito conceptual sin entrar en detalles fiacutesicos Entre los elementos que conforman la estructura loacutegica de una base de datos podemos destacar131 TablasLas tablas son las unidades que almacenan los datos Como norma general se suele imponer que cada tabla almacena informacioacuten comuacuten sobre una entidad en particular (recuerda los libros) Esta norma se conoce como normalizacioacutenLa mayor parte de la actividad producida en una base de datos se produce sobre las tablas siendo las principales tareas las siguientes

Antildeadir informacioacuten Eliminar informacioacuten Modificar y actualizar informacioacuten Recoger informacioacuten y mostrarla

132 Campos y registros

Las tablas estaacuten compuestas de registros y campos Si imaginamos el disentildeo de una tabla como si de una cuadriacutecula se tratase sabemos que estaacute compuesta por varias filas y columnas Las filas corresponden a los registros mientras que las columnas seriacutean los campos Y cada una de las celdas que se forman de enlazar un registro (fila) con un campo (columna) formariacutea una celda la cual almacena un valor

Por lo tanto un registro esta formado por varios campos y cada campo almacena un determinado valor

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 6

133 IacutendicesUn iacutendice es un conjunto de valores clave el iacutendice guarda el elemento que desea indexar y la posicioacuten en la base de datosLos valores claves de los iacutendices pueden almacenar el contenido de una o varias columnas de una tabla134 VistasEs un conjunto de registros determinados de una o varias tablas se trabaja sobre ella como si fuera una tabla pero no lo es una vista no almacena datos si no que los extrae y permite trabajar con datos de varias tablas como si fuera una sola135 SQLSignifica lenguaje de consulta estructurado permite el acceso a bases de datos que explota la flexibilidad y potencia de los sistemas relacionales permitiendo gran variedad de operaciones14 Planificacioacuten ndash disentildeo141- Identificar el objetivo de la base de datosConsiste en un diaacutelogo intenso para averiguar expliacutecitamente que es lo que quiere el cliente142 Revisioacuten datos existentesUna gran herramienta para iniciar una aplicacioacuten es ver documetacioacuten sobre los datos existentes Hojas de caacutelculo albaranes facturas documentacioacuten en generalUna forma que ayuda mucho en la primera parte del desarrollo es mirar las necesidades del cliente iniciando por el final Por ejemplo si analizamos un informe de ventas que nos proporcione el cliente podemos ver mucha informacioacuten incluso la forma de relacionar las tablas Sabremos tambieacuten si estos datos hay que agruparlos por ejemplo por vendedor o por poblacioacuten Esto nos ayudaraacute a saber queacute campos y tablas necesitaremos para conseguir el objetivo final que se muestra en el informe del clienteCuanta maacutes informacioacuten se pueda recabar maacutes faacutecil seraacute dar los primeros pasos y acercarse desde el principio al disentildeo maacutes correcto posible Para evitar un trabajo suplementario y correcciones innecesarias hazlo bien la primera vez143 Modelado de la base de datos1431 Paso al SGBDLlave principal Es un campo o a una combinacioacuten de campos que identifica de forma uacutenica a cada fila de una tabla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 7

Llave foraacutenea Identifica una columna o grupo de columnas que se refiere a una columna o grupo de columnas en otra tablaRelaciones uno a unoEn una relacioacuten uno a uno una fila de la tabla A no puede tener maacutes de una fila coincidente en la tabla B y viceversa Se crea una relacioacuten uno a uno si las dos columnas relacionadas son claves principales Relaciones uno a variosUna relacioacuten uno a varios es el tipo maacutes habitual de relacioacuten En este tipo de relacioacuten una fila de la tabla A puede corresponderse con muchas filas de la tabla B pero una fila de la tabla B soacutelo puede corresponderse con otra de la tabla A Por ejemplo en las tablas (editoriales) y (tiacutetulos) se da una relacioacuten uno a varios una editorial publica muchos tiacutetulos pero a cada tiacutetulo le corresponde soacutelo una editorialEn una relacioacuten uno a varios solamente una de las columnas relacionadas es la clave principal o tiene una restriccioacuten uniqueRelaciones Varios a VariosEn una relacioacuten varios a varios una fila de la tabla A puede tener muchas filas coincidentes en la tabla B y viceversa Este tipo de relaciones se crea definiendo una tercera tabla denominada tabla de unioacuten cuya clave principal esteacute constituida por las claves externas de las tablas A y B Por ejemplo entre las tablas (autores) y (tiacutetulos) existiriacutea una relacioacuten varios a varios definida por una relacioacuten uno a varios entre cada una de ellas y la tabla (tiacutetuloautor) La clave principal de la tabla es la combinacioacuten de la columna au_id (la clave principal de la tabla autores) y la columna title_id (la clave principal de la tabla tiacutetulos)1432 Modelo entidad relacioacuten

1433 EjerciciosSupongamos que queremos disentildear una base de datos para una biblioteca y hemos conocido que eacutesta funciona de la siguiente formaEn la biblioteca se encuentra como es natural una serie de libros que los empleados solicitan a las editoriales Cuando un libro se recibe se le da de alta construyeacutendole una ficha para buacutesqueda por autor y otra ficha para buacutesqueda por tema En ambas fichas aparecen el tiacutetulo del libro el nombre del autor y su nacionalidad la editorial a la que pertenece la publicacioacuten el tema sobre el que trata el ISBN y la estanteriacutea de la biblioteca en la que se encuentra Un empleado puede solicitar un libro escribiendo una carta de

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 8

Entidades

Relaciones

Conectores

peticioacuten a la editorial correspondiente La direccioacuten a la que se a de dirigir la carta se encuentra en el archivo de editoriales Para acceder a los libros de la biblioteca es necesario la posesioacuten de un carnet que acredita a los distintos usuarios Este carnet se confecciona a cada persona la primera vez que intenta retirar un libro Cada usuario puede tener retirado un libro en un momento determinadoEn la biblioteca les gustariacutea disponer de un listado que se lanzariacutea al final de cada diacutea y en el que apareceriacutea para cada libro que se encuentra retirado el tiacutetulo el ISBN el autor y el nuacutemero de carnet nombre y la ceacutedula del usuario que lo mantiene retiradoCuando un usuario intente retirar un libro ha de presentar su carnet para que se tome nota de la retirada Si el libro que desea ha sido retirado por otro usuario se llama a eacuteste por teleacutefono indicaacutendole que hay otro usuario que desea el libro para que lo devuelva en caso de que no lo esteacute utilizandoMensualmente se confecciona un inventario actualizado donde se indica para cada libro el nombre el autor y el lugar de la biblioteca donde se encuentra

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 9telefononombrecedula

carnet

USUARIO

1

m 1

editado

DireccioacutenNombre

EDITORIAL

n

NACIONALIDNOMB

CODAUTO

AUTOR

TEMA

TITULO

ISBN

LIBRO Situado en

nuacutemerorororo

lugarnestanteria

ESTANTERIA

1

escrito

escrito

m

1

Problema 2 Artiacuteculos y encargosUna base de datos para una pequentildea empresa debe contener informacioacuten acerca de clientes artiacuteculos y pedidos Hasta el momento se registran los siguientes datos en documentos variosbull Para cada cliente Nuacutemero de cliente (uacutenico) Direcciones de enviacuteo (varias por cliente) Saldo Liacutemite de creacutedito (depende del cliente pero en ninguacuten caso debe superar los 3000000 pts) Descuentobull Para cada artiacuteculo Nuacutemero de artiacuteculo (uacutenico) Faacutebricas que lo distribuyen Existencias de ese artiacuteculo en cada faacutebrica Descripcioacuten del artiacuteculobull Para cada pedido Cada pedido tiene una cabecera y el cuerpo del pedido La cabecera estaacute formada por el nuacutemero de cliente direccioacuten de enviacuteo y fecha del pedido El cuerpo del pedido son varias liacuteneas en cada liacutenea se especifican el nuacutemero del artiacuteculo pedido y la cantidadAdemaacutes se ha determinado que se debe almacenar la informacioacuten de las faacutebricas Sin embargo dado el uso de distribuidores se usaraacute Nuacutemero de la faacutebrica (uacutenico) y Teleacutefono de contacto Y se desean ver cuaacutentos artiacuteculos (en total) provee la faacutebrica Tambieacuten por informacioacuten estrateacutegica se podriacutea incluir informacioacuten de faacutebricas alternativas respecto de las que ya fabrican artiacuteculos para esta empresaNota Una direccioacuten se entenderaacute como Nordm Calle Comuna y Ciudad Una fecha incluye horaSe pide hacer el diagrama ER para la base de datos que represente esta informacioacuten

Problema 2 () Sistema de ventas

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 10

Le contratan para hacer una BD que permita apoyar la gestioacuten de un sistema de ventas La empresa necesita llevar un control de proveedores clientes productos y ventasUn proveedor tiene un RUT nombre direccioacuten teleacutefono y paacutegina web Un cliente tambieacuten tiene RUT nombre direccioacuten pero puede tener varios teleacutefonos de contacto La direccioacuten se entiende por calle nuacutemero comuna y ciudadUn producto tiene un id uacutenico nombre precio actual stock y nombre del proveedor Ademaacutes seorganizan en categoriacuteas y cada producto va soacutelo en una categoriacutea Una categoriacutea tiene id nombre y descripcioacutenPor razones de contabilidad se debe registrar la informacioacuten de cada venta con un id fecha cliente descuento y monto final Ademaacutes se debe guardar el precio al momento de la venta la cantidad vendida y el monto total por el producto

Problema 3 CarreterasDisentildear un esquema ER que recoja la organizacioacuten de una base de datos para contener la informacioacuten sobre todas las carreteras del paiacutes sabiendo que se deben cumplir las siguientes especificaciones- Las carreteras estaacuten divididas en varias categoriacuteas (locales comerciales regionales nacionalesautoviacuteas etc)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 11

- Las carreteras se dividen en tramos Un tramo siempre pertenece a una uacutenica carretera y no puede cambiar de carretera- Un tramo puede pasar por varias comunas interesando conocer el Km de la carretera y la comuna donde empieza el tramo y en donde termina- Para los tramos que suponen principio o final de carretera interesa saber si es que la carreteraconcluye fiacutesicamente o es que confluye en otra carretera En este caso interesa conocer con queacutecarretera confluye y en queacute kiloacutemetro tramo y comunaProblema 4 Sistema de vuelosObtener el diagrama ER para un sistema de control de vuelos adaptado a las siguientes reglas degestioacuten (indicar las entidades interrelaciones etc que se deducen de cada una de las reglas)a) De cada aeropuerto se conoce su coacutedigo nombre ciudad y paiacutesb) En cada aeropuerto pueden tomar tierra diversos modelos de aviones (el modelo de un avioacutendetermina su capacidad es decir el nuacutemero de plazasc) En cada aeropuerto existe una coleccioacuten de programas de vuelo En cada programa de vuelo se indica el nuacutemero de vuelo liacutenea aeacuterea y diacuteas de la semana en que existe dicho vuelod) Cada programa de vuelo despega de un aeropuerto y aterriza en otroe) Los nuacutemeros de vuelo son uacutenicos para todo el mundof) En cada aeropuerto hay muacuteltiples aterrizajes y despegues Todos los aeropuertos contemplados estaacuten en activo es decir tienen alguacuten aterrizaje y alguacuten despegueg) Cada vuelo realizado pertenece a un cierto programa de vuelo Para cada vuelo se quiere conocer su fecha plazas vaciacuteas y el modelo de avioacuten utilizadoh) Algunos programas de vuelo incorporan escalas teacutecnicas intermedias entre los aeropuertos de salida y de llegada Se entiende por escala teacutecnica a un aterrizaje y despegue consecutivos sin altas oacute bajas de pasajerosi) De cada vuelo se quieren conocer las escalas teacutecnicas ordenadas asignaacutendole a cada una un nuacutemero de ordenPor ejemplo el programa de vuelo 555 de Iberia con vuelos los lunes y jueves despega de Barajas-Madrid-Espantildea y aterriza en Caudell-Sydney-Australia teniendo las siguientes escalas teacutecnicas 1- Los Pradintildeos-Sao Paulo-Brasil 2-El Emperador-Santiago-Chile y 3-Saint Kitts-Auckland-Nueva Zelanda1048576 iquestQue cambios se produciraacuten en el caso anterior si en las escalas pudiesen bajar o subir pasajerosExplicar coacutemo se podriacutea representar esta nueva situacioacutenProblema 5 () OlimpiacuteadasLas sedes oliacutempicas se dividen en complejos deportivos Los complejos deportivos se subdividen en aquellos en los que se desarrolla un uacutenico deporte y en los polideportivos Los complejos polideportivos tienen aacutereas designadas para cada deporte con un indicador de localizacioacuten (ejemplo centro esquina- NE etc) Un complejo tiene una localizacioacuten un jefe de organizacioacuten individual y un aacuterea total ocupada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 12

Los dos tipos de complejos (deporte uacutenico y polideportivo) tendraacuten diferentes tipos de informacioacuten Para cada tipo de sede se conservaraacute el nuacutemero de complejos junto con su presupuesto aproximadoCada complejo celebra una serie de eventos (ejemplo la pista del estadio puede celebrar muchascarreras distintas) Para cada evento estaacute prevista una fecha duracioacuten nuacutemero de participantes nuacutemero de comisarios Una lista de todos los comisarios se conservaraacute junto con la lista de los eventos en los que esteacute involucrado cada comisario ya sea cumpliendo la tarea de juez u observador Tanto para cada evento como para el mantenimiento se necesitaraacute cierto equipamiento (ejemplo arcos peacutertigas barras paralelas etc)Problema 6 Educando SAEn la Empresa Educando SA se lleva control de sus Bienes y Servicios El intereacutes primario es poder hacer que los Bienes se manejen de forma raacutepida y con el menor grado de error Para esto quien maneja la seccioacuten de Bienes y Suministros plantea las siguientes condiciones del negocio para la construccioacuten de una base de datos10485761048576La Seccioacuten estaacute dividida en tres (3) aacutereas COMPRAS ALMACEN INVENTARIO10485761048576El aacuterea de Compras funciona de la siguiente formao Recibe las solicitudes de compras de las diferentes aacutereas de la empresao Cada solicitud tiene un responsableo Cada solicitud es autorizada por el jefe del aacuterea y posteriormente por el DirectorFinancieroo Quien realiza una solicitud puede ser responsable de uno o varios centros de costos conla salvedad de que eacutel como empleado solo estaacute adscrito a unoo De la solicitud se debe diligenciar la siguiente informacioacuten Nuacutemero de la solicitud (consecutivo) Fecha Responsable (nombre y ceacutedula) Centro de Costos Rubro presupuestal del cual se descargaraacute la compra En cada solicitud se pueden discriminar uno o muchos iacutetems con la siguiente informacioacuten iacutetem nombre del bien cantidad solicitada unidad de medida del bien valor unitario y valor total Cada solicitud debe ser totalizadao Cada bien es identificado por un coacutedigo universal que es uacutenico y es de caraacutecter devolutivo (suministro) o un bien inmuebleo Una vez diligenciada la solicitud es remitida al aacuterea de compras para realizar sucorrespondiente cotizacioacuteno Las cotizaciones son realizadas con uno o varios proveedores de los bienes solicitadoso Una vez la cotizacioacuten definitiva estaacute lista se crea una orden contractual que maneja lasiguiente informacioacuten Nuacutemero de la orden contractual nit y nombre del proveedor al cualse le va a realizar la compra fecha de la orden monto total de la orden fecha de entrega Cada orden puede tener asociado uno o varios iacutetems de la solicitud o solicitudes que van a ser despachadas Cada iacutetem tiene la siguiente informacioacuten nombre del bien cantidad solicitada cantidad despachada unidad de medida del bien valor unitario y valor total

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 13

o La orden de compra es aprobada por el Director Financiero para que sea enviada alproveedor elegido10485761048576El aacuterea de Almaceacuten funciona de la siguiente formao Su funcioacuten principal es recepcionar los bienes que llegan de los proveedores ydistribuirlos a las correspondientes aacutereas que realizaron las solicitudes de compraso Cuando llega un proveedor mercanciacutea este hace una entrega fiacutesica de los bienes loscuales son comparados con la factura que este entrega y con la orden de compracorrespondiente Si esta accioacuten es correcta se registra una entrada de almaceacuten por cadafactura relacionada con la siguiente informacioacuten Nuacutemero de Entrada Fecha Nuacutemero defactura Proveedor Total Bienes Valor Total (los totales deben coincidir con los de lafactura) Adjunto a esta se discriminan los iacutetems recibidos con la siguiente informacioacutennombre del bien cantidad entregadao Cuando el almaceacuten decide despachar los bienes a las diferentes aacutereas solicitantesregistra cada una de las entregas en Salidas de Almaceacuten con la siguiente informacioacutenNuacutemero de Salida Empleado responsable del bien a entregar fecha de salida fecha deentrega Por cada entrega se detalla cada uno de los iacutetems con la siguiente informacioacutennombre del bien cantidad entregadao Una entrada de almaceacuten puede generar muchas salidas de almaceacuten por ejemplo Pueden ingresar 500 pacas de papel higieacutenico pero como se debe repartir entrevarias aacutereas cada una requiere de una salida de almaceacuten10485761048576El aacuterea de inventarios funciona de la siguiente formao Es la encargada de administrar y controlar la ubicacioacuten de los bienes dentro de laempresa por esto antes de que el bien salga del almaceacuten debe ser codificado a traveacutesde un coacutedigo uacutenico que lo haga identificable dentro de la empresao La ubicacioacuten del bien se identifica por la siguiente informacioacuten responsable del bienfecha de entrega direccioacuten del bien (ubicacioacuten)Disentildear modelo ER para la base de datosProblema 7 Torneo de Tenis Grand SlamEl sistema debe memorizar todos los encuentros que se han desarrollado desde que existe el torneo asiacute como las siguientes caracteriacutesticas de estosDescripcioacutenEl Grand Slam se compone de cuatro torneos anuales que se celebran en Gran Bretantildea Estados Unidos Francia y Australia En cada paiacutes se pueden

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 14

desarrollar en distintos lugares (p ej en EE UU Puede desarrollarse en Forest Hill o en Flashing Meadows)Cada partido tiene asociado un premio de consolacioacuten para el perdedor que dependeraacute de la fase en que se encuentre el torneo (p ej el perdedor de octavos de final puede ganar 5000 doacutelares) El ganador de a final recibiraacute el premio correspondiente al torneoCada torneo tiene cinco modalidades Individual masculino individual femenino dobles masculino dobles femenino y dobles mixtosTambieacuten hay que tener en cuenta la nacionalidad de un jugador de forma que acuteeste puede ser apaacutetrida o tener varias nacionalidadesResultados a considerarEl sistema debe dar respuesta a las siguientes preguntas1 Dado un antildeo y un torneo composicioacuten y resultado de los partidos2 Lista de aacuterbitros que participaron en el torneo3 Ganancias percibidas en premios por un jugador a lo largo del torneo4 Lista de entrenadores que han entrenado a un jugador a lo largo del torneo y fechas en las que lo hizo Ejemplos de acceso a la base de datos1 Connors gano Gerulaitis en Roland Garros en 1979 en cuartos de final en individuales masculinos por6-3 4-67-5 6-02 El sentildeor Wilkinson arbitro ese partido3 Alemania ha ganado dos veces las individuales masculinas de Wimbledon Borg ha ganado 2000000de doacutelares a lo largo de su participacioacuten en el Grand Slam4 El ganado de Roland Garros de 1987 ganoacute 20000 doacutelares5 Noah ha jugado cuatro veces en dobles mixtos con MandlikovaProblema 8Se desea crear un sitio web con informacioacuten referente a las peliacuteculas en cartel en las salas de un dudoso cine cercano a la plaza de armasDe cada peliacutecula se almacena una ficha con su tiacutetulo de distribucioacuten su tiacutetulo original su geacutenero el idioma origina si tiene subtiacutetulos en espantildeol o no los paises de origen el antildeo de la produccioacuten la url del sitio web de la peliacutecula la duracioacuten (en horas y minutos) la calificacioacuten (Apta todo puacuteblico+9 antildeos +15 antildeos+18 antildeos) fecha de estreno en Santiago un resumen y un identificador de la peliacutecula De cada peliacutecula interesa conocer la lista de directores y el reparto es decir para cada actor que trabaja el nombre de todos los personajes que interpretaAdemaacutes interesa disponer de informacioacuten sobre los directores y actores que trabajan en cada peliacutecula De ambos se conoce su nombre (que lo identifica) y su nacionalidad Ademaacutes se desea conocer la cantidad de peliacuteculas en las que dirigieron o actuaron Tenga en cuenta que hay personas que cumplen los dos rolesLos cines pueden tener maacutes de una sala y cada semana cada uno de los cines enviacutea la cartelera para dicha semana indicando de detalle de las funciones Para cada funcioacuten se conoce el diacutea de la semana y la hora de comienzo y obviamente la sala y la peliacutecula que exhibe De cada sala se sabe el nombre un nuacutemero que la identifica dentro del cine y la cantidad de butacas que posee De cada cine se conoce el nombre que lo identifica su direccioacuten y teleacutefono para consultas

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 15

Algunos cines cuentan con promociones Estas promociones dependen de la funcioacuten (Ej De lunes a jueves antes de las 18 50 de descuento en la sala tal del cine tal para la peliacutecula cualLa funcioacuten del lunes a las 14 para la peliacutecula tal en la sala cual no se cobra a los escolares con tuacutenica ) De cada promocioacuten se conoce una descripcioacuten y el descuento que aplicaAdemaacutes del resumen de la peliacutecula que se incluye en la ficha interesa mostrar la opinioacuten de las personas que vieron la peliacutecula De cada opinioacuten se conoce el nombre de la persona que la realiza su edad le fecha en que registroacute su opinioacuten la calificacioacuten que le dio a la peliacutecula (Obra Maestra Muy BuenaBuena Regular Mala) y el comentario propiamente dicho A cada opinioacuten se le asigna un nuacutemero que la identifica respecto de la peliacutecula sobre la cual opina

15 Normalizacioacuten151 Primera forma normalUna tabla estaacute en Primera Forma Normal si

Todos los atributos son atoacutemicos Un atributo es atoacutemico si los elementos del dominio son indivisibles miacutenimos

La tabla contiene una llave primaria uacutenica La llave primaria no contiene atributos nulos No debe existir variacioacuten en el nuacutemero de columnas Los Campos no llave deben identificarse por la llave (Dependencia

Funcional) Debe Existir una independencia del orden tanto de las filas como de las

columnas es decir si los datos cambian de orden no deben cambiar sus significados

Una tabla no puede tener muacuteltiples valores en cada columna Los datos son atoacutemicos (Si a cada valor de X le pertenece un valor de Y y viceversa)Esta forma normal elimina los valores repetidos dentro de una BD

152 Segunda Forma Normal (2FN)

Dependencia Funcional Una relacioacuten estaacute en 2FN si estaacute en 1FN y si los atributos que no forman parte de ninguna clave dependen de forma completa de la clave principal Es decir que no existen dependencias parciales (Todos los atributos que no son clave principal deben depender uacutenicamente de la clave principal)

En otras palabras podriacuteamos decir que la segunda forma normal estaacute basada en el concepto de dependencia completamente funcional Una dependencia funcional es completamente funcional si al eliminar los atributos A de X significa que la dependencia no es mantenida esto es que Una dependencia funcional es una dependencia parcial si hay algunos atributos que pueden ser eliminados

de X y la dependencia todaviacutea se mantiene esto es

Por ejemplo DNI ID_PROYECTO HORAS_TRABAJO (con el DNI de un empleado y el ID de un proyecto sabemos cuaacutentas horas de trabajo por semana trabaja un empleado en dicho proyecto) es completamente dependiente dado que ni DNI HORAS_TRABAJO ni ID_PROYECTO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 16

HORAS_TRABAJO mantienen la dependencia Sin embargo DNI ID_PROYECTO NOMBRE_EMPLEADO es parcialmente dependiente dado que DNI NOMBRE_EMPLEADO mantiene la dependencia

153 Tercera Forma Normal (3FN)

La tabla se encuentra en 3FN si es 2FN y si no existe ninguna dependencia funcional transitiva entre los atributos que no son clave

Un ejemplo de este concepto seriacutea que una dependencia funcional X-gtY en un esquema de relacioacuten R es una dependencia transitiva si hay un conjunto de atributos Z que no es un subconjunto de alguna clave de R donde se mantiene X-gtZ y Z-gtY

Por ejemplo la dependencia SSN-gtDMGRSSN es una dependencia transitiva en EMP_DEPT de la siguiente figura Decimos que la dependencia de DMGRSSN el atributo clave SSN es transitiva viacutea DNUMBER porque las dependencias SSNrarrDNUMBER y DNUMBERrarrDMGRSSN son mantenidas y DNUMBER no es un subconjunto de la clave de EMP_DEPT Intuitivamente podemos ver que la dependencia de DMGRSSN sobre DNUMBER es indeseable en EMP_DEPT dado que DNUMBER no es una clave de EMP_DEPT

Formalmente un esquema de relacion estaacute en 3 Forma Normal Elmasri-Navathe[2] si para toda dependencia funcional se cumple al menos una de las siguientes condiciones

es superllave o clave

es atributo primo de esto es si es miembro de alguna clave en

Ademaacutes el esquema debe cumplir necesariamente

Ejemplo

Id estudiante Ci Nombres Apellidos Curso Materia Descripicoacuten01 1803327418 Fransico

FabianCamacho Saltos

4 En Ingeacutes

02 10152465 Carlos Banabeti

Ruales Camacho

5 ES Espantildeol

03

1 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 17

2 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

Id Curso Curso01 Primero02 SegundoId Materia Materia Descripcioacuten01 En Ingleacutes02 MT Matemaacutetica

3 era forma normal

Iddescripcion DescripcioacutenIngleacutesMatemaacutetica

Dada la siguiente tabla normalizarlaIDcliente Ceacutedula Nombres Direccioacuten Proveedor Producto

16 Herramientas para la normalizacioacuten

A continuacioacuten se mencionan algunas herramientas para normalizar una base de datos mediante un proceso automatizado

CAPIacuteTULO IIRealizar diferentes tareas de disentildeo y planificacioacuten sobre la

estructura de tablas

21 Tabla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 18

Id Materia Materia01 En02 MT

Es un conjunto de datos ordenados en filas y columnas

22 Tipos de datossql_variant Puede usarse en columnas paraacutemetros variables y valores devueltos de funciones definidas por el usuariosql_variant permite que estos objetos de base de datos admitan valores de otros tipos de datosxml Capaz de almacenar documentos XML oacute fragmentos XML que es posible utilizar tanto en variables como en campos de tablas y que a diferencia de otros tipos de datos ofrece meacutetodos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 19

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 20

23 Creacioacuten de tablasAntes de aprender sobre la creacioacuten de tablas es necesario conocer los pasos para crear una base de datos en sql server 2008Para crear una base de datos en SQL Server 2008 debemos seguir los siguientes pasos1- Ingresar a SQLServer

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 21

2- En la ventana que nos aparece realizamos clic derecho en donde dice database

3- Nos aparece el siguiente menuacute hacemos clic donde dice New Database

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 22

4- Nos aparece la siguiente ventana

En donde dice Database Name le damos un nombre a la base de datos

5- Luego hacemos clic en

Nos aparece la siguiente ventana

Aquiacute tenemos dos opciones In percent nos permite que si sobrepasa el tamantildeo de la base de datos crezca en porcentajeIn Megabytes nos permite hacer que la base de datos crezca de 1 Megabyte en 1 megabyte si sobrepasa el tamantildeo y listoAhora para crear una tabla seguimos los siguientes pasos1- Hacemos clic en donde dice database buscamos el nombre de nuestra base de datos en la seccioacuten tables realizamos clic derecho con el botoacuten secundario del mouse

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 23

Nos aparece el siguiente menuacute

Hacemos clic en New Table

Y en donde dice Column Name vamos poniendo los campos de las bases de datos con su respectivo tipoAl final hacemos clic en donde estaacute el iacutecono de un diskette nos aparece una ventana pidiendo el nombre de la tabla le asignamos un nombre y realizamos clic en el botoacuten ok24 Creacioacuten de RestriccionesUna restriccioacuten es una condicioacuten que obliga el cumplimiento de ciertas condiciones en la base de datos Algunas no son determinadas por los usuarios sino que son inherentemente definidas por el simple hecho de que la base de datos sea relacional Algunas otras restricciones las puede definir el usuario por ejemplo usar un campo con valores enteros entre 1 y 10

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 24

Las restricciones proveen un meacutetodo de implementar reglas en la base de datos Las restricciones restringen los datos que pueden ser almacenados en las tablas Usualmente se definen usando expresiones que dan como resultado un valor booleano indicando si los datos satisfacen la restriccioacuten o noLas restricciones no son parte formal del modelo relacional pero son incluidas porque juegan el rol de organizar mejor los datos Las restricciones son muy discutidas junto con los conceptos relacionalesPueden crearse los siguientes tipos de restricciones Las restricciones unique y primary key exigen que no haya dos filas en una tabla con los mismos valores en las columnas especificadas Ademaacutes la restriccioacuten primary key requiere que no haya valores nulos en ninguna fila de la columna

241 Crear una restriccioacuten PRIMARY KEYPara crear una restriccioacuten Primary Key realizamos clic en el campo donde

queremos crear la restriccioacuten y luego realizamos clic en el iacutecono 242 Crear una restriccioacuten UNIQUEPara crear una restriccioacuten UNIQUE realizamos clic en el campo donde queremos crear dicha restriccioacuten y luego escogemos el menuacute Table Designe y luego en IndexesKeys

Nos aparece la siguiente ventana en donde dice Type escogemos Unique Key

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 25

Realizamos clic en close y guardamos la tabla

La integridad de referencia ( references ) exige que los datos insertados en columnas especiacuteficas ya tengan datos coincidentes en la tabla y columnas especificadas Las restricciones check limitan los valores de datos insertados en las columnas

243 Agregar una restriccioacuten CHECKRealizamos clic derecho dentro del explorador de objetos en la seccioacuten tables buscamos el nombre de la tabla y buscamos constraints realizamos clic derecho con el botoacuten secundario del mouse y escogemos New Constraint

Nos apareced la siguiente ventana

|

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 26

Realizamos clic en este botoacuten para poder editar la expresioacuten que queremos que tenga restricciones

En la ventana que nos aparece ponemos la expresioacuten deseada y realizamos clic en el botoacuten Ok

Para poder editar la tabla y verificar los cambios realizados buscamos en el explorador de objetos el nombre de la tabla realizamos clic derecho y escogemos la opcioacuten Edit Top 200 Rows

Y procedemos a ingresar datos para probarTambieacuten se puede imponer la integridad de datos restringiendo el uso de valores nulos en una columna (las palabras clave null o not null ) y proporcionando valores predeterminados para columnas (la claacuteusula default )

25 Diagramas de bases de datosLos diagramas de bases de datos se utiliza para visualizar las tablas graacuteficamente y para poder establecer las relaciones

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 27

Para crear un diagrama hacemos clic en el explorador de objetos hacemos clic en el nombre de la base de datos y escogemos Database Diagrams hacemos clic derecho escogemos new Database Diagrams

Nos aparece el siguiente mensaje realizamos un clic dentro del botoacuten Yes

Volvemos hacer clic derechos y volvemos a escoger New Data Base Diagram

Aparece la siguiente ventana en pantalla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 28

Seleccionamos todas y escogemos AddNos aparece la siguiente ventana

En el caso de tener una relacioacuten muchos a muchos debemos romper la relacioacuten con una tercera tabla para esto desde el mismo Database Diagram hacemos clic derecho en un lugar en blanco y escogemos new table llenos las columnas con los campos y tipos de datos respectivosDebemos tomar en cuenta que en las tablas a donde va la relacioacuten tiene que tener su respectiva llave foraacutenea y para poder establecer la relacioacuten

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 29

arrastramos desde el campo principal hacia la llave foraacutenea es decir de la tabla padre a la hijaQuedando las relaciones asiacute

Finalmente cerramos la base de datos nos aparece la siguiente ventana

pidiendo guardar el Database Diagram le demos un nombre y realizamos clic

en el botoacuten OK

252 Ejercicios

Los diagramas del ejercicio 1 y 2 del capiacutetulo anterior pasar al modelo

relacional en SQLSERVER 2008

Los ejercicios 5 y 6 los ejercicios de la prueba pasarlos a sql server

Transformar el siguiente modelo entidad relacioacuten al modelo relacional

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 30

CAPIacuteTULO III

Aplicar las diferentes sentencias y modos en lenguaje SQL

para tratamiento de la informacioacuten almacenada en las

diferentes tablas de la base de datos

31 Lenguaje de definicioacuten de datosLas sentencias DDL son CREATE ALTER y DROP Siempre se usan estas

sentencias junto con el tipo de objeto y el nombre del objeto

CREATE

Crea una base de datos o un objeto

Sintaxis

Create database nombre on grupo_base de datos filegroup

Ejemplo

USE mastergoIF DB_ID (Ncalificaciones) IS NULL BEGIN create database calificaciones on primary( name = calificaciones filename = Ccalificacionescalificacionesmdf

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 31

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 4: Base de Datos

Gracias al aporte del Vicerrectorado Acadeacutemico de la Universidad Teacutecnica de Ambato en los esquemas presentados en la paacutegina web de la Institucioacuten se ha determinado los paraacutemetros del presente moacutedulo de contenidosEl moacutedulo empieza realizando una pequentildea introduccioacuten explicando conceptos y a continuacioacuten los objetos que componen una base de datos Luego explica la creacioacuten de tablas y sus relaciones entre ellos para ir avanzando a las diferentes sentencias y aplicaciones del lenguaje TRANSACT SQL para la consulta de base de dato luego se trabajara con iacutendices y finalmente con triggers para la administracioacuten de la base de datos la versioacuten de SQL server en que se haraacuten las aplicaciones es SQL SERVER 2008 EXPRESS R2 que es una versioacuten gratuita de MICROSOFT que permite realizar aplicaciones de escritorio aplicaciones web y pequentildeas aplicaciones de servidorSe trabajara con conceptos teoacutericos y praacutecticos que permitiraacuten el progreso del estudiante hasta alcanzar el dominio requerido se pretende realizar un pequentildeo sistema aplicable a una institucioacuten educativa con el propoacutesito de apoyar al sistema educativo y que el estudiante tenga una acercamiento a lo que seraacute su vida profesionalEl propoacutesito de este moacutedulo es desarrollar la capacidad de razonamiento en los estudiantes para que puedan desarrollar sistemas utilizando la menor cantidad de recursos de sistemas evitando crear aplicaciones pesadas sin no todo lo contrario crear aplicaciones livianas y raacutepidas que optimice recursos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 4

DESARROLLO DE CONTENIDOS

CAPIacuteTULO I

IDENTIFICAR LA ESTRUCTURA DE UNA BASE DE DATOS CON

OBJETOS QUE LA COMPONEN

11 Definicioacuten

111 Definicioacuten de base de datosUna base de datos es una entidad en la cual se pueden almacenar gran cantidad de datos de manera estructurada para luego poderlos recuperarlas posteriormente

112 EntidadEn bases de datos una entidad es la representacioacuten de un objeto o concepto del mundo real que se describe en una base de datosPor ejemplo nombres de entidades pueden ser Alumno Empleado Artiacuteculo etc1121 Entidades fuertes Una entidad fuerte es aquella que puede ser identificada uniacutevocamente sin participar en la relacioacuten Ejemplo cliente vehiacuteculo1121 Entidades deacutebiles Es aquella que no puede participar sin existir en la relacioacuten Ejemplo Factura viaje a la entidad deacutebil se le representa con doble rectaacutengulo

12 Estructura fiacutesicaUna base de datos se almacena en varios ficheros o archivos en disco Como miacutenimo existen dos archivos donde podremos guardar la base de datos

Archivo de datos Archivo de registro de transacciones

El archivo de datos o aquellos que antildeadimos como extras son los archivos que tendraacuten almacenada la informacioacutenPor otro lado tenemos el archivo de registro de transacciones Este fichero es tan importante como el anteriorEl nombre de una base de datos parte de una principal definida por el administrador y a partir de ese nombre principal sql server antildeade

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 5

terminaciones y extensiones a ese nombre principal ademaacutes como administrador puedo elegir el lugar donde se almacenaraacute la base de datosEjemplo si soy administrador de una base de datos y quiero crear una base de datos llama uta los archivos que se creariacutean son los siguientes

Archivo de datos miEmpresa_DataMDF Archivo de registro de transacciones miEmpresa_LogLDF

En caso de tener archivos extras nosotros como administradores tambieacuten podremos darles su nombre principal y la extensioacuten que suele utilizarse es NDFComo administradores tambieacuten puedo seleccionar el lugar de almacenamiento en una determinada carpeta o directorio incluso diferentes unidades fiacutesicasNo debes quedarte con la idea de que una base de datos se compone sencillamente de dos archivos es algo mucho maacutes completo que todo eso lo que representa una base de datos como entidad121 Tamantildeo de la base de datos

Al crear una base de datos con SQL server no es necesario separar una gran cantidad de memoria ya que los archivos de datos y registro crecen automaacuteticamente el administrador de la base de datos le da un tamantildeo inicial una cantidad muy pequentildea en Megabytes una vez que se utilice la base de datos y alcance el tamantildeo maacuteximo se incrementa13 Estructura loacutegicaEs el esqueleto o armazoacuten conceptual estaacute constituido por abstracciones de la realidad para enfocarse en el aacutembito conceptual sin entrar en detalles fiacutesicos Entre los elementos que conforman la estructura loacutegica de una base de datos podemos destacar131 TablasLas tablas son las unidades que almacenan los datos Como norma general se suele imponer que cada tabla almacena informacioacuten comuacuten sobre una entidad en particular (recuerda los libros) Esta norma se conoce como normalizacioacutenLa mayor parte de la actividad producida en una base de datos se produce sobre las tablas siendo las principales tareas las siguientes

Antildeadir informacioacuten Eliminar informacioacuten Modificar y actualizar informacioacuten Recoger informacioacuten y mostrarla

132 Campos y registros

Las tablas estaacuten compuestas de registros y campos Si imaginamos el disentildeo de una tabla como si de una cuadriacutecula se tratase sabemos que estaacute compuesta por varias filas y columnas Las filas corresponden a los registros mientras que las columnas seriacutean los campos Y cada una de las celdas que se forman de enlazar un registro (fila) con un campo (columna) formariacutea una celda la cual almacena un valor

Por lo tanto un registro esta formado por varios campos y cada campo almacena un determinado valor

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 6

133 IacutendicesUn iacutendice es un conjunto de valores clave el iacutendice guarda el elemento que desea indexar y la posicioacuten en la base de datosLos valores claves de los iacutendices pueden almacenar el contenido de una o varias columnas de una tabla134 VistasEs un conjunto de registros determinados de una o varias tablas se trabaja sobre ella como si fuera una tabla pero no lo es una vista no almacena datos si no que los extrae y permite trabajar con datos de varias tablas como si fuera una sola135 SQLSignifica lenguaje de consulta estructurado permite el acceso a bases de datos que explota la flexibilidad y potencia de los sistemas relacionales permitiendo gran variedad de operaciones14 Planificacioacuten ndash disentildeo141- Identificar el objetivo de la base de datosConsiste en un diaacutelogo intenso para averiguar expliacutecitamente que es lo que quiere el cliente142 Revisioacuten datos existentesUna gran herramienta para iniciar una aplicacioacuten es ver documetacioacuten sobre los datos existentes Hojas de caacutelculo albaranes facturas documentacioacuten en generalUna forma que ayuda mucho en la primera parte del desarrollo es mirar las necesidades del cliente iniciando por el final Por ejemplo si analizamos un informe de ventas que nos proporcione el cliente podemos ver mucha informacioacuten incluso la forma de relacionar las tablas Sabremos tambieacuten si estos datos hay que agruparlos por ejemplo por vendedor o por poblacioacuten Esto nos ayudaraacute a saber queacute campos y tablas necesitaremos para conseguir el objetivo final que se muestra en el informe del clienteCuanta maacutes informacioacuten se pueda recabar maacutes faacutecil seraacute dar los primeros pasos y acercarse desde el principio al disentildeo maacutes correcto posible Para evitar un trabajo suplementario y correcciones innecesarias hazlo bien la primera vez143 Modelado de la base de datos1431 Paso al SGBDLlave principal Es un campo o a una combinacioacuten de campos que identifica de forma uacutenica a cada fila de una tabla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 7

Llave foraacutenea Identifica una columna o grupo de columnas que se refiere a una columna o grupo de columnas en otra tablaRelaciones uno a unoEn una relacioacuten uno a uno una fila de la tabla A no puede tener maacutes de una fila coincidente en la tabla B y viceversa Se crea una relacioacuten uno a uno si las dos columnas relacionadas son claves principales Relaciones uno a variosUna relacioacuten uno a varios es el tipo maacutes habitual de relacioacuten En este tipo de relacioacuten una fila de la tabla A puede corresponderse con muchas filas de la tabla B pero una fila de la tabla B soacutelo puede corresponderse con otra de la tabla A Por ejemplo en las tablas (editoriales) y (tiacutetulos) se da una relacioacuten uno a varios una editorial publica muchos tiacutetulos pero a cada tiacutetulo le corresponde soacutelo una editorialEn una relacioacuten uno a varios solamente una de las columnas relacionadas es la clave principal o tiene una restriccioacuten uniqueRelaciones Varios a VariosEn una relacioacuten varios a varios una fila de la tabla A puede tener muchas filas coincidentes en la tabla B y viceversa Este tipo de relaciones se crea definiendo una tercera tabla denominada tabla de unioacuten cuya clave principal esteacute constituida por las claves externas de las tablas A y B Por ejemplo entre las tablas (autores) y (tiacutetulos) existiriacutea una relacioacuten varios a varios definida por una relacioacuten uno a varios entre cada una de ellas y la tabla (tiacutetuloautor) La clave principal de la tabla es la combinacioacuten de la columna au_id (la clave principal de la tabla autores) y la columna title_id (la clave principal de la tabla tiacutetulos)1432 Modelo entidad relacioacuten

1433 EjerciciosSupongamos que queremos disentildear una base de datos para una biblioteca y hemos conocido que eacutesta funciona de la siguiente formaEn la biblioteca se encuentra como es natural una serie de libros que los empleados solicitan a las editoriales Cuando un libro se recibe se le da de alta construyeacutendole una ficha para buacutesqueda por autor y otra ficha para buacutesqueda por tema En ambas fichas aparecen el tiacutetulo del libro el nombre del autor y su nacionalidad la editorial a la que pertenece la publicacioacuten el tema sobre el que trata el ISBN y la estanteriacutea de la biblioteca en la que se encuentra Un empleado puede solicitar un libro escribiendo una carta de

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 8

Entidades

Relaciones

Conectores

peticioacuten a la editorial correspondiente La direccioacuten a la que se a de dirigir la carta se encuentra en el archivo de editoriales Para acceder a los libros de la biblioteca es necesario la posesioacuten de un carnet que acredita a los distintos usuarios Este carnet se confecciona a cada persona la primera vez que intenta retirar un libro Cada usuario puede tener retirado un libro en un momento determinadoEn la biblioteca les gustariacutea disponer de un listado que se lanzariacutea al final de cada diacutea y en el que apareceriacutea para cada libro que se encuentra retirado el tiacutetulo el ISBN el autor y el nuacutemero de carnet nombre y la ceacutedula del usuario que lo mantiene retiradoCuando un usuario intente retirar un libro ha de presentar su carnet para que se tome nota de la retirada Si el libro que desea ha sido retirado por otro usuario se llama a eacuteste por teleacutefono indicaacutendole que hay otro usuario que desea el libro para que lo devuelva en caso de que no lo esteacute utilizandoMensualmente se confecciona un inventario actualizado donde se indica para cada libro el nombre el autor y el lugar de la biblioteca donde se encuentra

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 9telefononombrecedula

carnet

USUARIO

1

m 1

editado

DireccioacutenNombre

EDITORIAL

n

NACIONALIDNOMB

CODAUTO

AUTOR

TEMA

TITULO

ISBN

LIBRO Situado en

nuacutemerorororo

lugarnestanteria

ESTANTERIA

1

escrito

escrito

m

1

Problema 2 Artiacuteculos y encargosUna base de datos para una pequentildea empresa debe contener informacioacuten acerca de clientes artiacuteculos y pedidos Hasta el momento se registran los siguientes datos en documentos variosbull Para cada cliente Nuacutemero de cliente (uacutenico) Direcciones de enviacuteo (varias por cliente) Saldo Liacutemite de creacutedito (depende del cliente pero en ninguacuten caso debe superar los 3000000 pts) Descuentobull Para cada artiacuteculo Nuacutemero de artiacuteculo (uacutenico) Faacutebricas que lo distribuyen Existencias de ese artiacuteculo en cada faacutebrica Descripcioacuten del artiacuteculobull Para cada pedido Cada pedido tiene una cabecera y el cuerpo del pedido La cabecera estaacute formada por el nuacutemero de cliente direccioacuten de enviacuteo y fecha del pedido El cuerpo del pedido son varias liacuteneas en cada liacutenea se especifican el nuacutemero del artiacuteculo pedido y la cantidadAdemaacutes se ha determinado que se debe almacenar la informacioacuten de las faacutebricas Sin embargo dado el uso de distribuidores se usaraacute Nuacutemero de la faacutebrica (uacutenico) y Teleacutefono de contacto Y se desean ver cuaacutentos artiacuteculos (en total) provee la faacutebrica Tambieacuten por informacioacuten estrateacutegica se podriacutea incluir informacioacuten de faacutebricas alternativas respecto de las que ya fabrican artiacuteculos para esta empresaNota Una direccioacuten se entenderaacute como Nordm Calle Comuna y Ciudad Una fecha incluye horaSe pide hacer el diagrama ER para la base de datos que represente esta informacioacuten

Problema 2 () Sistema de ventas

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 10

Le contratan para hacer una BD que permita apoyar la gestioacuten de un sistema de ventas La empresa necesita llevar un control de proveedores clientes productos y ventasUn proveedor tiene un RUT nombre direccioacuten teleacutefono y paacutegina web Un cliente tambieacuten tiene RUT nombre direccioacuten pero puede tener varios teleacutefonos de contacto La direccioacuten se entiende por calle nuacutemero comuna y ciudadUn producto tiene un id uacutenico nombre precio actual stock y nombre del proveedor Ademaacutes seorganizan en categoriacuteas y cada producto va soacutelo en una categoriacutea Una categoriacutea tiene id nombre y descripcioacutenPor razones de contabilidad se debe registrar la informacioacuten de cada venta con un id fecha cliente descuento y monto final Ademaacutes se debe guardar el precio al momento de la venta la cantidad vendida y el monto total por el producto

Problema 3 CarreterasDisentildear un esquema ER que recoja la organizacioacuten de una base de datos para contener la informacioacuten sobre todas las carreteras del paiacutes sabiendo que se deben cumplir las siguientes especificaciones- Las carreteras estaacuten divididas en varias categoriacuteas (locales comerciales regionales nacionalesautoviacuteas etc)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 11

- Las carreteras se dividen en tramos Un tramo siempre pertenece a una uacutenica carretera y no puede cambiar de carretera- Un tramo puede pasar por varias comunas interesando conocer el Km de la carretera y la comuna donde empieza el tramo y en donde termina- Para los tramos que suponen principio o final de carretera interesa saber si es que la carreteraconcluye fiacutesicamente o es que confluye en otra carretera En este caso interesa conocer con queacutecarretera confluye y en queacute kiloacutemetro tramo y comunaProblema 4 Sistema de vuelosObtener el diagrama ER para un sistema de control de vuelos adaptado a las siguientes reglas degestioacuten (indicar las entidades interrelaciones etc que se deducen de cada una de las reglas)a) De cada aeropuerto se conoce su coacutedigo nombre ciudad y paiacutesb) En cada aeropuerto pueden tomar tierra diversos modelos de aviones (el modelo de un avioacutendetermina su capacidad es decir el nuacutemero de plazasc) En cada aeropuerto existe una coleccioacuten de programas de vuelo En cada programa de vuelo se indica el nuacutemero de vuelo liacutenea aeacuterea y diacuteas de la semana en que existe dicho vuelod) Cada programa de vuelo despega de un aeropuerto y aterriza en otroe) Los nuacutemeros de vuelo son uacutenicos para todo el mundof) En cada aeropuerto hay muacuteltiples aterrizajes y despegues Todos los aeropuertos contemplados estaacuten en activo es decir tienen alguacuten aterrizaje y alguacuten despegueg) Cada vuelo realizado pertenece a un cierto programa de vuelo Para cada vuelo se quiere conocer su fecha plazas vaciacuteas y el modelo de avioacuten utilizadoh) Algunos programas de vuelo incorporan escalas teacutecnicas intermedias entre los aeropuertos de salida y de llegada Se entiende por escala teacutecnica a un aterrizaje y despegue consecutivos sin altas oacute bajas de pasajerosi) De cada vuelo se quieren conocer las escalas teacutecnicas ordenadas asignaacutendole a cada una un nuacutemero de ordenPor ejemplo el programa de vuelo 555 de Iberia con vuelos los lunes y jueves despega de Barajas-Madrid-Espantildea y aterriza en Caudell-Sydney-Australia teniendo las siguientes escalas teacutecnicas 1- Los Pradintildeos-Sao Paulo-Brasil 2-El Emperador-Santiago-Chile y 3-Saint Kitts-Auckland-Nueva Zelanda1048576 iquestQue cambios se produciraacuten en el caso anterior si en las escalas pudiesen bajar o subir pasajerosExplicar coacutemo se podriacutea representar esta nueva situacioacutenProblema 5 () OlimpiacuteadasLas sedes oliacutempicas se dividen en complejos deportivos Los complejos deportivos se subdividen en aquellos en los que se desarrolla un uacutenico deporte y en los polideportivos Los complejos polideportivos tienen aacutereas designadas para cada deporte con un indicador de localizacioacuten (ejemplo centro esquina- NE etc) Un complejo tiene una localizacioacuten un jefe de organizacioacuten individual y un aacuterea total ocupada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 12

Los dos tipos de complejos (deporte uacutenico y polideportivo) tendraacuten diferentes tipos de informacioacuten Para cada tipo de sede se conservaraacute el nuacutemero de complejos junto con su presupuesto aproximadoCada complejo celebra una serie de eventos (ejemplo la pista del estadio puede celebrar muchascarreras distintas) Para cada evento estaacute prevista una fecha duracioacuten nuacutemero de participantes nuacutemero de comisarios Una lista de todos los comisarios se conservaraacute junto con la lista de los eventos en los que esteacute involucrado cada comisario ya sea cumpliendo la tarea de juez u observador Tanto para cada evento como para el mantenimiento se necesitaraacute cierto equipamiento (ejemplo arcos peacutertigas barras paralelas etc)Problema 6 Educando SAEn la Empresa Educando SA se lleva control de sus Bienes y Servicios El intereacutes primario es poder hacer que los Bienes se manejen de forma raacutepida y con el menor grado de error Para esto quien maneja la seccioacuten de Bienes y Suministros plantea las siguientes condiciones del negocio para la construccioacuten de una base de datos10485761048576La Seccioacuten estaacute dividida en tres (3) aacutereas COMPRAS ALMACEN INVENTARIO10485761048576El aacuterea de Compras funciona de la siguiente formao Recibe las solicitudes de compras de las diferentes aacutereas de la empresao Cada solicitud tiene un responsableo Cada solicitud es autorizada por el jefe del aacuterea y posteriormente por el DirectorFinancieroo Quien realiza una solicitud puede ser responsable de uno o varios centros de costos conla salvedad de que eacutel como empleado solo estaacute adscrito a unoo De la solicitud se debe diligenciar la siguiente informacioacuten Nuacutemero de la solicitud (consecutivo) Fecha Responsable (nombre y ceacutedula) Centro de Costos Rubro presupuestal del cual se descargaraacute la compra En cada solicitud se pueden discriminar uno o muchos iacutetems con la siguiente informacioacuten iacutetem nombre del bien cantidad solicitada unidad de medida del bien valor unitario y valor total Cada solicitud debe ser totalizadao Cada bien es identificado por un coacutedigo universal que es uacutenico y es de caraacutecter devolutivo (suministro) o un bien inmuebleo Una vez diligenciada la solicitud es remitida al aacuterea de compras para realizar sucorrespondiente cotizacioacuteno Las cotizaciones son realizadas con uno o varios proveedores de los bienes solicitadoso Una vez la cotizacioacuten definitiva estaacute lista se crea una orden contractual que maneja lasiguiente informacioacuten Nuacutemero de la orden contractual nit y nombre del proveedor al cualse le va a realizar la compra fecha de la orden monto total de la orden fecha de entrega Cada orden puede tener asociado uno o varios iacutetems de la solicitud o solicitudes que van a ser despachadas Cada iacutetem tiene la siguiente informacioacuten nombre del bien cantidad solicitada cantidad despachada unidad de medida del bien valor unitario y valor total

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 13

o La orden de compra es aprobada por el Director Financiero para que sea enviada alproveedor elegido10485761048576El aacuterea de Almaceacuten funciona de la siguiente formao Su funcioacuten principal es recepcionar los bienes que llegan de los proveedores ydistribuirlos a las correspondientes aacutereas que realizaron las solicitudes de compraso Cuando llega un proveedor mercanciacutea este hace una entrega fiacutesica de los bienes loscuales son comparados con la factura que este entrega y con la orden de compracorrespondiente Si esta accioacuten es correcta se registra una entrada de almaceacuten por cadafactura relacionada con la siguiente informacioacuten Nuacutemero de Entrada Fecha Nuacutemero defactura Proveedor Total Bienes Valor Total (los totales deben coincidir con los de lafactura) Adjunto a esta se discriminan los iacutetems recibidos con la siguiente informacioacutennombre del bien cantidad entregadao Cuando el almaceacuten decide despachar los bienes a las diferentes aacutereas solicitantesregistra cada una de las entregas en Salidas de Almaceacuten con la siguiente informacioacutenNuacutemero de Salida Empleado responsable del bien a entregar fecha de salida fecha deentrega Por cada entrega se detalla cada uno de los iacutetems con la siguiente informacioacutennombre del bien cantidad entregadao Una entrada de almaceacuten puede generar muchas salidas de almaceacuten por ejemplo Pueden ingresar 500 pacas de papel higieacutenico pero como se debe repartir entrevarias aacutereas cada una requiere de una salida de almaceacuten10485761048576El aacuterea de inventarios funciona de la siguiente formao Es la encargada de administrar y controlar la ubicacioacuten de los bienes dentro de laempresa por esto antes de que el bien salga del almaceacuten debe ser codificado a traveacutesde un coacutedigo uacutenico que lo haga identificable dentro de la empresao La ubicacioacuten del bien se identifica por la siguiente informacioacuten responsable del bienfecha de entrega direccioacuten del bien (ubicacioacuten)Disentildear modelo ER para la base de datosProblema 7 Torneo de Tenis Grand SlamEl sistema debe memorizar todos los encuentros que se han desarrollado desde que existe el torneo asiacute como las siguientes caracteriacutesticas de estosDescripcioacutenEl Grand Slam se compone de cuatro torneos anuales que se celebran en Gran Bretantildea Estados Unidos Francia y Australia En cada paiacutes se pueden

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 14

desarrollar en distintos lugares (p ej en EE UU Puede desarrollarse en Forest Hill o en Flashing Meadows)Cada partido tiene asociado un premio de consolacioacuten para el perdedor que dependeraacute de la fase en que se encuentre el torneo (p ej el perdedor de octavos de final puede ganar 5000 doacutelares) El ganador de a final recibiraacute el premio correspondiente al torneoCada torneo tiene cinco modalidades Individual masculino individual femenino dobles masculino dobles femenino y dobles mixtosTambieacuten hay que tener en cuenta la nacionalidad de un jugador de forma que acuteeste puede ser apaacutetrida o tener varias nacionalidadesResultados a considerarEl sistema debe dar respuesta a las siguientes preguntas1 Dado un antildeo y un torneo composicioacuten y resultado de los partidos2 Lista de aacuterbitros que participaron en el torneo3 Ganancias percibidas en premios por un jugador a lo largo del torneo4 Lista de entrenadores que han entrenado a un jugador a lo largo del torneo y fechas en las que lo hizo Ejemplos de acceso a la base de datos1 Connors gano Gerulaitis en Roland Garros en 1979 en cuartos de final en individuales masculinos por6-3 4-67-5 6-02 El sentildeor Wilkinson arbitro ese partido3 Alemania ha ganado dos veces las individuales masculinas de Wimbledon Borg ha ganado 2000000de doacutelares a lo largo de su participacioacuten en el Grand Slam4 El ganado de Roland Garros de 1987 ganoacute 20000 doacutelares5 Noah ha jugado cuatro veces en dobles mixtos con MandlikovaProblema 8Se desea crear un sitio web con informacioacuten referente a las peliacuteculas en cartel en las salas de un dudoso cine cercano a la plaza de armasDe cada peliacutecula se almacena una ficha con su tiacutetulo de distribucioacuten su tiacutetulo original su geacutenero el idioma origina si tiene subtiacutetulos en espantildeol o no los paises de origen el antildeo de la produccioacuten la url del sitio web de la peliacutecula la duracioacuten (en horas y minutos) la calificacioacuten (Apta todo puacuteblico+9 antildeos +15 antildeos+18 antildeos) fecha de estreno en Santiago un resumen y un identificador de la peliacutecula De cada peliacutecula interesa conocer la lista de directores y el reparto es decir para cada actor que trabaja el nombre de todos los personajes que interpretaAdemaacutes interesa disponer de informacioacuten sobre los directores y actores que trabajan en cada peliacutecula De ambos se conoce su nombre (que lo identifica) y su nacionalidad Ademaacutes se desea conocer la cantidad de peliacuteculas en las que dirigieron o actuaron Tenga en cuenta que hay personas que cumplen los dos rolesLos cines pueden tener maacutes de una sala y cada semana cada uno de los cines enviacutea la cartelera para dicha semana indicando de detalle de las funciones Para cada funcioacuten se conoce el diacutea de la semana y la hora de comienzo y obviamente la sala y la peliacutecula que exhibe De cada sala se sabe el nombre un nuacutemero que la identifica dentro del cine y la cantidad de butacas que posee De cada cine se conoce el nombre que lo identifica su direccioacuten y teleacutefono para consultas

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 15

Algunos cines cuentan con promociones Estas promociones dependen de la funcioacuten (Ej De lunes a jueves antes de las 18 50 de descuento en la sala tal del cine tal para la peliacutecula cualLa funcioacuten del lunes a las 14 para la peliacutecula tal en la sala cual no se cobra a los escolares con tuacutenica ) De cada promocioacuten se conoce una descripcioacuten y el descuento que aplicaAdemaacutes del resumen de la peliacutecula que se incluye en la ficha interesa mostrar la opinioacuten de las personas que vieron la peliacutecula De cada opinioacuten se conoce el nombre de la persona que la realiza su edad le fecha en que registroacute su opinioacuten la calificacioacuten que le dio a la peliacutecula (Obra Maestra Muy BuenaBuena Regular Mala) y el comentario propiamente dicho A cada opinioacuten se le asigna un nuacutemero que la identifica respecto de la peliacutecula sobre la cual opina

15 Normalizacioacuten151 Primera forma normalUna tabla estaacute en Primera Forma Normal si

Todos los atributos son atoacutemicos Un atributo es atoacutemico si los elementos del dominio son indivisibles miacutenimos

La tabla contiene una llave primaria uacutenica La llave primaria no contiene atributos nulos No debe existir variacioacuten en el nuacutemero de columnas Los Campos no llave deben identificarse por la llave (Dependencia

Funcional) Debe Existir una independencia del orden tanto de las filas como de las

columnas es decir si los datos cambian de orden no deben cambiar sus significados

Una tabla no puede tener muacuteltiples valores en cada columna Los datos son atoacutemicos (Si a cada valor de X le pertenece un valor de Y y viceversa)Esta forma normal elimina los valores repetidos dentro de una BD

152 Segunda Forma Normal (2FN)

Dependencia Funcional Una relacioacuten estaacute en 2FN si estaacute en 1FN y si los atributos que no forman parte de ninguna clave dependen de forma completa de la clave principal Es decir que no existen dependencias parciales (Todos los atributos que no son clave principal deben depender uacutenicamente de la clave principal)

En otras palabras podriacuteamos decir que la segunda forma normal estaacute basada en el concepto de dependencia completamente funcional Una dependencia funcional es completamente funcional si al eliminar los atributos A de X significa que la dependencia no es mantenida esto es que Una dependencia funcional es una dependencia parcial si hay algunos atributos que pueden ser eliminados

de X y la dependencia todaviacutea se mantiene esto es

Por ejemplo DNI ID_PROYECTO HORAS_TRABAJO (con el DNI de un empleado y el ID de un proyecto sabemos cuaacutentas horas de trabajo por semana trabaja un empleado en dicho proyecto) es completamente dependiente dado que ni DNI HORAS_TRABAJO ni ID_PROYECTO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 16

HORAS_TRABAJO mantienen la dependencia Sin embargo DNI ID_PROYECTO NOMBRE_EMPLEADO es parcialmente dependiente dado que DNI NOMBRE_EMPLEADO mantiene la dependencia

153 Tercera Forma Normal (3FN)

La tabla se encuentra en 3FN si es 2FN y si no existe ninguna dependencia funcional transitiva entre los atributos que no son clave

Un ejemplo de este concepto seriacutea que una dependencia funcional X-gtY en un esquema de relacioacuten R es una dependencia transitiva si hay un conjunto de atributos Z que no es un subconjunto de alguna clave de R donde se mantiene X-gtZ y Z-gtY

Por ejemplo la dependencia SSN-gtDMGRSSN es una dependencia transitiva en EMP_DEPT de la siguiente figura Decimos que la dependencia de DMGRSSN el atributo clave SSN es transitiva viacutea DNUMBER porque las dependencias SSNrarrDNUMBER y DNUMBERrarrDMGRSSN son mantenidas y DNUMBER no es un subconjunto de la clave de EMP_DEPT Intuitivamente podemos ver que la dependencia de DMGRSSN sobre DNUMBER es indeseable en EMP_DEPT dado que DNUMBER no es una clave de EMP_DEPT

Formalmente un esquema de relacion estaacute en 3 Forma Normal Elmasri-Navathe[2] si para toda dependencia funcional se cumple al menos una de las siguientes condiciones

es superllave o clave

es atributo primo de esto es si es miembro de alguna clave en

Ademaacutes el esquema debe cumplir necesariamente

Ejemplo

Id estudiante Ci Nombres Apellidos Curso Materia Descripicoacuten01 1803327418 Fransico

FabianCamacho Saltos

4 En Ingeacutes

02 10152465 Carlos Banabeti

Ruales Camacho

5 ES Espantildeol

03

1 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 17

2 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

Id Curso Curso01 Primero02 SegundoId Materia Materia Descripcioacuten01 En Ingleacutes02 MT Matemaacutetica

3 era forma normal

Iddescripcion DescripcioacutenIngleacutesMatemaacutetica

Dada la siguiente tabla normalizarlaIDcliente Ceacutedula Nombres Direccioacuten Proveedor Producto

16 Herramientas para la normalizacioacuten

A continuacioacuten se mencionan algunas herramientas para normalizar una base de datos mediante un proceso automatizado

CAPIacuteTULO IIRealizar diferentes tareas de disentildeo y planificacioacuten sobre la

estructura de tablas

21 Tabla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 18

Id Materia Materia01 En02 MT

Es un conjunto de datos ordenados en filas y columnas

22 Tipos de datossql_variant Puede usarse en columnas paraacutemetros variables y valores devueltos de funciones definidas por el usuariosql_variant permite que estos objetos de base de datos admitan valores de otros tipos de datosxml Capaz de almacenar documentos XML oacute fragmentos XML que es posible utilizar tanto en variables como en campos de tablas y que a diferencia de otros tipos de datos ofrece meacutetodos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 19

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 20

23 Creacioacuten de tablasAntes de aprender sobre la creacioacuten de tablas es necesario conocer los pasos para crear una base de datos en sql server 2008Para crear una base de datos en SQL Server 2008 debemos seguir los siguientes pasos1- Ingresar a SQLServer

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 21

2- En la ventana que nos aparece realizamos clic derecho en donde dice database

3- Nos aparece el siguiente menuacute hacemos clic donde dice New Database

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 22

4- Nos aparece la siguiente ventana

En donde dice Database Name le damos un nombre a la base de datos

5- Luego hacemos clic en

Nos aparece la siguiente ventana

Aquiacute tenemos dos opciones In percent nos permite que si sobrepasa el tamantildeo de la base de datos crezca en porcentajeIn Megabytes nos permite hacer que la base de datos crezca de 1 Megabyte en 1 megabyte si sobrepasa el tamantildeo y listoAhora para crear una tabla seguimos los siguientes pasos1- Hacemos clic en donde dice database buscamos el nombre de nuestra base de datos en la seccioacuten tables realizamos clic derecho con el botoacuten secundario del mouse

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 23

Nos aparece el siguiente menuacute

Hacemos clic en New Table

Y en donde dice Column Name vamos poniendo los campos de las bases de datos con su respectivo tipoAl final hacemos clic en donde estaacute el iacutecono de un diskette nos aparece una ventana pidiendo el nombre de la tabla le asignamos un nombre y realizamos clic en el botoacuten ok24 Creacioacuten de RestriccionesUna restriccioacuten es una condicioacuten que obliga el cumplimiento de ciertas condiciones en la base de datos Algunas no son determinadas por los usuarios sino que son inherentemente definidas por el simple hecho de que la base de datos sea relacional Algunas otras restricciones las puede definir el usuario por ejemplo usar un campo con valores enteros entre 1 y 10

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 24

Las restricciones proveen un meacutetodo de implementar reglas en la base de datos Las restricciones restringen los datos que pueden ser almacenados en las tablas Usualmente se definen usando expresiones que dan como resultado un valor booleano indicando si los datos satisfacen la restriccioacuten o noLas restricciones no son parte formal del modelo relacional pero son incluidas porque juegan el rol de organizar mejor los datos Las restricciones son muy discutidas junto con los conceptos relacionalesPueden crearse los siguientes tipos de restricciones Las restricciones unique y primary key exigen que no haya dos filas en una tabla con los mismos valores en las columnas especificadas Ademaacutes la restriccioacuten primary key requiere que no haya valores nulos en ninguna fila de la columna

241 Crear una restriccioacuten PRIMARY KEYPara crear una restriccioacuten Primary Key realizamos clic en el campo donde

queremos crear la restriccioacuten y luego realizamos clic en el iacutecono 242 Crear una restriccioacuten UNIQUEPara crear una restriccioacuten UNIQUE realizamos clic en el campo donde queremos crear dicha restriccioacuten y luego escogemos el menuacute Table Designe y luego en IndexesKeys

Nos aparece la siguiente ventana en donde dice Type escogemos Unique Key

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 25

Realizamos clic en close y guardamos la tabla

La integridad de referencia ( references ) exige que los datos insertados en columnas especiacuteficas ya tengan datos coincidentes en la tabla y columnas especificadas Las restricciones check limitan los valores de datos insertados en las columnas

243 Agregar una restriccioacuten CHECKRealizamos clic derecho dentro del explorador de objetos en la seccioacuten tables buscamos el nombre de la tabla y buscamos constraints realizamos clic derecho con el botoacuten secundario del mouse y escogemos New Constraint

Nos apareced la siguiente ventana

|

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 26

Realizamos clic en este botoacuten para poder editar la expresioacuten que queremos que tenga restricciones

En la ventana que nos aparece ponemos la expresioacuten deseada y realizamos clic en el botoacuten Ok

Para poder editar la tabla y verificar los cambios realizados buscamos en el explorador de objetos el nombre de la tabla realizamos clic derecho y escogemos la opcioacuten Edit Top 200 Rows

Y procedemos a ingresar datos para probarTambieacuten se puede imponer la integridad de datos restringiendo el uso de valores nulos en una columna (las palabras clave null o not null ) y proporcionando valores predeterminados para columnas (la claacuteusula default )

25 Diagramas de bases de datosLos diagramas de bases de datos se utiliza para visualizar las tablas graacuteficamente y para poder establecer las relaciones

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 27

Para crear un diagrama hacemos clic en el explorador de objetos hacemos clic en el nombre de la base de datos y escogemos Database Diagrams hacemos clic derecho escogemos new Database Diagrams

Nos aparece el siguiente mensaje realizamos un clic dentro del botoacuten Yes

Volvemos hacer clic derechos y volvemos a escoger New Data Base Diagram

Aparece la siguiente ventana en pantalla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 28

Seleccionamos todas y escogemos AddNos aparece la siguiente ventana

En el caso de tener una relacioacuten muchos a muchos debemos romper la relacioacuten con una tercera tabla para esto desde el mismo Database Diagram hacemos clic derecho en un lugar en blanco y escogemos new table llenos las columnas con los campos y tipos de datos respectivosDebemos tomar en cuenta que en las tablas a donde va la relacioacuten tiene que tener su respectiva llave foraacutenea y para poder establecer la relacioacuten

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 29

arrastramos desde el campo principal hacia la llave foraacutenea es decir de la tabla padre a la hijaQuedando las relaciones asiacute

Finalmente cerramos la base de datos nos aparece la siguiente ventana

pidiendo guardar el Database Diagram le demos un nombre y realizamos clic

en el botoacuten OK

252 Ejercicios

Los diagramas del ejercicio 1 y 2 del capiacutetulo anterior pasar al modelo

relacional en SQLSERVER 2008

Los ejercicios 5 y 6 los ejercicios de la prueba pasarlos a sql server

Transformar el siguiente modelo entidad relacioacuten al modelo relacional

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 30

CAPIacuteTULO III

Aplicar las diferentes sentencias y modos en lenguaje SQL

para tratamiento de la informacioacuten almacenada en las

diferentes tablas de la base de datos

31 Lenguaje de definicioacuten de datosLas sentencias DDL son CREATE ALTER y DROP Siempre se usan estas

sentencias junto con el tipo de objeto y el nombre del objeto

CREATE

Crea una base de datos o un objeto

Sintaxis

Create database nombre on grupo_base de datos filegroup

Ejemplo

USE mastergoIF DB_ID (Ncalificaciones) IS NULL BEGIN create database calificaciones on primary( name = calificaciones filename = Ccalificacionescalificacionesmdf

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 31

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 5: Base de Datos

DESARROLLO DE CONTENIDOS

CAPIacuteTULO I

IDENTIFICAR LA ESTRUCTURA DE UNA BASE DE DATOS CON

OBJETOS QUE LA COMPONEN

11 Definicioacuten

111 Definicioacuten de base de datosUna base de datos es una entidad en la cual se pueden almacenar gran cantidad de datos de manera estructurada para luego poderlos recuperarlas posteriormente

112 EntidadEn bases de datos una entidad es la representacioacuten de un objeto o concepto del mundo real que se describe en una base de datosPor ejemplo nombres de entidades pueden ser Alumno Empleado Artiacuteculo etc1121 Entidades fuertes Una entidad fuerte es aquella que puede ser identificada uniacutevocamente sin participar en la relacioacuten Ejemplo cliente vehiacuteculo1121 Entidades deacutebiles Es aquella que no puede participar sin existir en la relacioacuten Ejemplo Factura viaje a la entidad deacutebil se le representa con doble rectaacutengulo

12 Estructura fiacutesicaUna base de datos se almacena en varios ficheros o archivos en disco Como miacutenimo existen dos archivos donde podremos guardar la base de datos

Archivo de datos Archivo de registro de transacciones

El archivo de datos o aquellos que antildeadimos como extras son los archivos que tendraacuten almacenada la informacioacutenPor otro lado tenemos el archivo de registro de transacciones Este fichero es tan importante como el anteriorEl nombre de una base de datos parte de una principal definida por el administrador y a partir de ese nombre principal sql server antildeade

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 5

terminaciones y extensiones a ese nombre principal ademaacutes como administrador puedo elegir el lugar donde se almacenaraacute la base de datosEjemplo si soy administrador de una base de datos y quiero crear una base de datos llama uta los archivos que se creariacutean son los siguientes

Archivo de datos miEmpresa_DataMDF Archivo de registro de transacciones miEmpresa_LogLDF

En caso de tener archivos extras nosotros como administradores tambieacuten podremos darles su nombre principal y la extensioacuten que suele utilizarse es NDFComo administradores tambieacuten puedo seleccionar el lugar de almacenamiento en una determinada carpeta o directorio incluso diferentes unidades fiacutesicasNo debes quedarte con la idea de que una base de datos se compone sencillamente de dos archivos es algo mucho maacutes completo que todo eso lo que representa una base de datos como entidad121 Tamantildeo de la base de datos

Al crear una base de datos con SQL server no es necesario separar una gran cantidad de memoria ya que los archivos de datos y registro crecen automaacuteticamente el administrador de la base de datos le da un tamantildeo inicial una cantidad muy pequentildea en Megabytes una vez que se utilice la base de datos y alcance el tamantildeo maacuteximo se incrementa13 Estructura loacutegicaEs el esqueleto o armazoacuten conceptual estaacute constituido por abstracciones de la realidad para enfocarse en el aacutembito conceptual sin entrar en detalles fiacutesicos Entre los elementos que conforman la estructura loacutegica de una base de datos podemos destacar131 TablasLas tablas son las unidades que almacenan los datos Como norma general se suele imponer que cada tabla almacena informacioacuten comuacuten sobre una entidad en particular (recuerda los libros) Esta norma se conoce como normalizacioacutenLa mayor parte de la actividad producida en una base de datos se produce sobre las tablas siendo las principales tareas las siguientes

Antildeadir informacioacuten Eliminar informacioacuten Modificar y actualizar informacioacuten Recoger informacioacuten y mostrarla

132 Campos y registros

Las tablas estaacuten compuestas de registros y campos Si imaginamos el disentildeo de una tabla como si de una cuadriacutecula se tratase sabemos que estaacute compuesta por varias filas y columnas Las filas corresponden a los registros mientras que las columnas seriacutean los campos Y cada una de las celdas que se forman de enlazar un registro (fila) con un campo (columna) formariacutea una celda la cual almacena un valor

Por lo tanto un registro esta formado por varios campos y cada campo almacena un determinado valor

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 6

133 IacutendicesUn iacutendice es un conjunto de valores clave el iacutendice guarda el elemento que desea indexar y la posicioacuten en la base de datosLos valores claves de los iacutendices pueden almacenar el contenido de una o varias columnas de una tabla134 VistasEs un conjunto de registros determinados de una o varias tablas se trabaja sobre ella como si fuera una tabla pero no lo es una vista no almacena datos si no que los extrae y permite trabajar con datos de varias tablas como si fuera una sola135 SQLSignifica lenguaje de consulta estructurado permite el acceso a bases de datos que explota la flexibilidad y potencia de los sistemas relacionales permitiendo gran variedad de operaciones14 Planificacioacuten ndash disentildeo141- Identificar el objetivo de la base de datosConsiste en un diaacutelogo intenso para averiguar expliacutecitamente que es lo que quiere el cliente142 Revisioacuten datos existentesUna gran herramienta para iniciar una aplicacioacuten es ver documetacioacuten sobre los datos existentes Hojas de caacutelculo albaranes facturas documentacioacuten en generalUna forma que ayuda mucho en la primera parte del desarrollo es mirar las necesidades del cliente iniciando por el final Por ejemplo si analizamos un informe de ventas que nos proporcione el cliente podemos ver mucha informacioacuten incluso la forma de relacionar las tablas Sabremos tambieacuten si estos datos hay que agruparlos por ejemplo por vendedor o por poblacioacuten Esto nos ayudaraacute a saber queacute campos y tablas necesitaremos para conseguir el objetivo final que se muestra en el informe del clienteCuanta maacutes informacioacuten se pueda recabar maacutes faacutecil seraacute dar los primeros pasos y acercarse desde el principio al disentildeo maacutes correcto posible Para evitar un trabajo suplementario y correcciones innecesarias hazlo bien la primera vez143 Modelado de la base de datos1431 Paso al SGBDLlave principal Es un campo o a una combinacioacuten de campos que identifica de forma uacutenica a cada fila de una tabla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 7

Llave foraacutenea Identifica una columna o grupo de columnas que se refiere a una columna o grupo de columnas en otra tablaRelaciones uno a unoEn una relacioacuten uno a uno una fila de la tabla A no puede tener maacutes de una fila coincidente en la tabla B y viceversa Se crea una relacioacuten uno a uno si las dos columnas relacionadas son claves principales Relaciones uno a variosUna relacioacuten uno a varios es el tipo maacutes habitual de relacioacuten En este tipo de relacioacuten una fila de la tabla A puede corresponderse con muchas filas de la tabla B pero una fila de la tabla B soacutelo puede corresponderse con otra de la tabla A Por ejemplo en las tablas (editoriales) y (tiacutetulos) se da una relacioacuten uno a varios una editorial publica muchos tiacutetulos pero a cada tiacutetulo le corresponde soacutelo una editorialEn una relacioacuten uno a varios solamente una de las columnas relacionadas es la clave principal o tiene una restriccioacuten uniqueRelaciones Varios a VariosEn una relacioacuten varios a varios una fila de la tabla A puede tener muchas filas coincidentes en la tabla B y viceversa Este tipo de relaciones se crea definiendo una tercera tabla denominada tabla de unioacuten cuya clave principal esteacute constituida por las claves externas de las tablas A y B Por ejemplo entre las tablas (autores) y (tiacutetulos) existiriacutea una relacioacuten varios a varios definida por una relacioacuten uno a varios entre cada una de ellas y la tabla (tiacutetuloautor) La clave principal de la tabla es la combinacioacuten de la columna au_id (la clave principal de la tabla autores) y la columna title_id (la clave principal de la tabla tiacutetulos)1432 Modelo entidad relacioacuten

1433 EjerciciosSupongamos que queremos disentildear una base de datos para una biblioteca y hemos conocido que eacutesta funciona de la siguiente formaEn la biblioteca se encuentra como es natural una serie de libros que los empleados solicitan a las editoriales Cuando un libro se recibe se le da de alta construyeacutendole una ficha para buacutesqueda por autor y otra ficha para buacutesqueda por tema En ambas fichas aparecen el tiacutetulo del libro el nombre del autor y su nacionalidad la editorial a la que pertenece la publicacioacuten el tema sobre el que trata el ISBN y la estanteriacutea de la biblioteca en la que se encuentra Un empleado puede solicitar un libro escribiendo una carta de

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 8

Entidades

Relaciones

Conectores

peticioacuten a la editorial correspondiente La direccioacuten a la que se a de dirigir la carta se encuentra en el archivo de editoriales Para acceder a los libros de la biblioteca es necesario la posesioacuten de un carnet que acredita a los distintos usuarios Este carnet se confecciona a cada persona la primera vez que intenta retirar un libro Cada usuario puede tener retirado un libro en un momento determinadoEn la biblioteca les gustariacutea disponer de un listado que se lanzariacutea al final de cada diacutea y en el que apareceriacutea para cada libro que se encuentra retirado el tiacutetulo el ISBN el autor y el nuacutemero de carnet nombre y la ceacutedula del usuario que lo mantiene retiradoCuando un usuario intente retirar un libro ha de presentar su carnet para que se tome nota de la retirada Si el libro que desea ha sido retirado por otro usuario se llama a eacuteste por teleacutefono indicaacutendole que hay otro usuario que desea el libro para que lo devuelva en caso de que no lo esteacute utilizandoMensualmente se confecciona un inventario actualizado donde se indica para cada libro el nombre el autor y el lugar de la biblioteca donde se encuentra

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 9telefononombrecedula

carnet

USUARIO

1

m 1

editado

DireccioacutenNombre

EDITORIAL

n

NACIONALIDNOMB

CODAUTO

AUTOR

TEMA

TITULO

ISBN

LIBRO Situado en

nuacutemerorororo

lugarnestanteria

ESTANTERIA

1

escrito

escrito

m

1

Problema 2 Artiacuteculos y encargosUna base de datos para una pequentildea empresa debe contener informacioacuten acerca de clientes artiacuteculos y pedidos Hasta el momento se registran los siguientes datos en documentos variosbull Para cada cliente Nuacutemero de cliente (uacutenico) Direcciones de enviacuteo (varias por cliente) Saldo Liacutemite de creacutedito (depende del cliente pero en ninguacuten caso debe superar los 3000000 pts) Descuentobull Para cada artiacuteculo Nuacutemero de artiacuteculo (uacutenico) Faacutebricas que lo distribuyen Existencias de ese artiacuteculo en cada faacutebrica Descripcioacuten del artiacuteculobull Para cada pedido Cada pedido tiene una cabecera y el cuerpo del pedido La cabecera estaacute formada por el nuacutemero de cliente direccioacuten de enviacuteo y fecha del pedido El cuerpo del pedido son varias liacuteneas en cada liacutenea se especifican el nuacutemero del artiacuteculo pedido y la cantidadAdemaacutes se ha determinado que se debe almacenar la informacioacuten de las faacutebricas Sin embargo dado el uso de distribuidores se usaraacute Nuacutemero de la faacutebrica (uacutenico) y Teleacutefono de contacto Y se desean ver cuaacutentos artiacuteculos (en total) provee la faacutebrica Tambieacuten por informacioacuten estrateacutegica se podriacutea incluir informacioacuten de faacutebricas alternativas respecto de las que ya fabrican artiacuteculos para esta empresaNota Una direccioacuten se entenderaacute como Nordm Calle Comuna y Ciudad Una fecha incluye horaSe pide hacer el diagrama ER para la base de datos que represente esta informacioacuten

Problema 2 () Sistema de ventas

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 10

Le contratan para hacer una BD que permita apoyar la gestioacuten de un sistema de ventas La empresa necesita llevar un control de proveedores clientes productos y ventasUn proveedor tiene un RUT nombre direccioacuten teleacutefono y paacutegina web Un cliente tambieacuten tiene RUT nombre direccioacuten pero puede tener varios teleacutefonos de contacto La direccioacuten se entiende por calle nuacutemero comuna y ciudadUn producto tiene un id uacutenico nombre precio actual stock y nombre del proveedor Ademaacutes seorganizan en categoriacuteas y cada producto va soacutelo en una categoriacutea Una categoriacutea tiene id nombre y descripcioacutenPor razones de contabilidad se debe registrar la informacioacuten de cada venta con un id fecha cliente descuento y monto final Ademaacutes se debe guardar el precio al momento de la venta la cantidad vendida y el monto total por el producto

Problema 3 CarreterasDisentildear un esquema ER que recoja la organizacioacuten de una base de datos para contener la informacioacuten sobre todas las carreteras del paiacutes sabiendo que se deben cumplir las siguientes especificaciones- Las carreteras estaacuten divididas en varias categoriacuteas (locales comerciales regionales nacionalesautoviacuteas etc)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 11

- Las carreteras se dividen en tramos Un tramo siempre pertenece a una uacutenica carretera y no puede cambiar de carretera- Un tramo puede pasar por varias comunas interesando conocer el Km de la carretera y la comuna donde empieza el tramo y en donde termina- Para los tramos que suponen principio o final de carretera interesa saber si es que la carreteraconcluye fiacutesicamente o es que confluye en otra carretera En este caso interesa conocer con queacutecarretera confluye y en queacute kiloacutemetro tramo y comunaProblema 4 Sistema de vuelosObtener el diagrama ER para un sistema de control de vuelos adaptado a las siguientes reglas degestioacuten (indicar las entidades interrelaciones etc que se deducen de cada una de las reglas)a) De cada aeropuerto se conoce su coacutedigo nombre ciudad y paiacutesb) En cada aeropuerto pueden tomar tierra diversos modelos de aviones (el modelo de un avioacutendetermina su capacidad es decir el nuacutemero de plazasc) En cada aeropuerto existe una coleccioacuten de programas de vuelo En cada programa de vuelo se indica el nuacutemero de vuelo liacutenea aeacuterea y diacuteas de la semana en que existe dicho vuelod) Cada programa de vuelo despega de un aeropuerto y aterriza en otroe) Los nuacutemeros de vuelo son uacutenicos para todo el mundof) En cada aeropuerto hay muacuteltiples aterrizajes y despegues Todos los aeropuertos contemplados estaacuten en activo es decir tienen alguacuten aterrizaje y alguacuten despegueg) Cada vuelo realizado pertenece a un cierto programa de vuelo Para cada vuelo se quiere conocer su fecha plazas vaciacuteas y el modelo de avioacuten utilizadoh) Algunos programas de vuelo incorporan escalas teacutecnicas intermedias entre los aeropuertos de salida y de llegada Se entiende por escala teacutecnica a un aterrizaje y despegue consecutivos sin altas oacute bajas de pasajerosi) De cada vuelo se quieren conocer las escalas teacutecnicas ordenadas asignaacutendole a cada una un nuacutemero de ordenPor ejemplo el programa de vuelo 555 de Iberia con vuelos los lunes y jueves despega de Barajas-Madrid-Espantildea y aterriza en Caudell-Sydney-Australia teniendo las siguientes escalas teacutecnicas 1- Los Pradintildeos-Sao Paulo-Brasil 2-El Emperador-Santiago-Chile y 3-Saint Kitts-Auckland-Nueva Zelanda1048576 iquestQue cambios se produciraacuten en el caso anterior si en las escalas pudiesen bajar o subir pasajerosExplicar coacutemo se podriacutea representar esta nueva situacioacutenProblema 5 () OlimpiacuteadasLas sedes oliacutempicas se dividen en complejos deportivos Los complejos deportivos se subdividen en aquellos en los que se desarrolla un uacutenico deporte y en los polideportivos Los complejos polideportivos tienen aacutereas designadas para cada deporte con un indicador de localizacioacuten (ejemplo centro esquina- NE etc) Un complejo tiene una localizacioacuten un jefe de organizacioacuten individual y un aacuterea total ocupada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 12

Los dos tipos de complejos (deporte uacutenico y polideportivo) tendraacuten diferentes tipos de informacioacuten Para cada tipo de sede se conservaraacute el nuacutemero de complejos junto con su presupuesto aproximadoCada complejo celebra una serie de eventos (ejemplo la pista del estadio puede celebrar muchascarreras distintas) Para cada evento estaacute prevista una fecha duracioacuten nuacutemero de participantes nuacutemero de comisarios Una lista de todos los comisarios se conservaraacute junto con la lista de los eventos en los que esteacute involucrado cada comisario ya sea cumpliendo la tarea de juez u observador Tanto para cada evento como para el mantenimiento se necesitaraacute cierto equipamiento (ejemplo arcos peacutertigas barras paralelas etc)Problema 6 Educando SAEn la Empresa Educando SA se lleva control de sus Bienes y Servicios El intereacutes primario es poder hacer que los Bienes se manejen de forma raacutepida y con el menor grado de error Para esto quien maneja la seccioacuten de Bienes y Suministros plantea las siguientes condiciones del negocio para la construccioacuten de una base de datos10485761048576La Seccioacuten estaacute dividida en tres (3) aacutereas COMPRAS ALMACEN INVENTARIO10485761048576El aacuterea de Compras funciona de la siguiente formao Recibe las solicitudes de compras de las diferentes aacutereas de la empresao Cada solicitud tiene un responsableo Cada solicitud es autorizada por el jefe del aacuterea y posteriormente por el DirectorFinancieroo Quien realiza una solicitud puede ser responsable de uno o varios centros de costos conla salvedad de que eacutel como empleado solo estaacute adscrito a unoo De la solicitud se debe diligenciar la siguiente informacioacuten Nuacutemero de la solicitud (consecutivo) Fecha Responsable (nombre y ceacutedula) Centro de Costos Rubro presupuestal del cual se descargaraacute la compra En cada solicitud se pueden discriminar uno o muchos iacutetems con la siguiente informacioacuten iacutetem nombre del bien cantidad solicitada unidad de medida del bien valor unitario y valor total Cada solicitud debe ser totalizadao Cada bien es identificado por un coacutedigo universal que es uacutenico y es de caraacutecter devolutivo (suministro) o un bien inmuebleo Una vez diligenciada la solicitud es remitida al aacuterea de compras para realizar sucorrespondiente cotizacioacuteno Las cotizaciones son realizadas con uno o varios proveedores de los bienes solicitadoso Una vez la cotizacioacuten definitiva estaacute lista se crea una orden contractual que maneja lasiguiente informacioacuten Nuacutemero de la orden contractual nit y nombre del proveedor al cualse le va a realizar la compra fecha de la orden monto total de la orden fecha de entrega Cada orden puede tener asociado uno o varios iacutetems de la solicitud o solicitudes que van a ser despachadas Cada iacutetem tiene la siguiente informacioacuten nombre del bien cantidad solicitada cantidad despachada unidad de medida del bien valor unitario y valor total

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 13

o La orden de compra es aprobada por el Director Financiero para que sea enviada alproveedor elegido10485761048576El aacuterea de Almaceacuten funciona de la siguiente formao Su funcioacuten principal es recepcionar los bienes que llegan de los proveedores ydistribuirlos a las correspondientes aacutereas que realizaron las solicitudes de compraso Cuando llega un proveedor mercanciacutea este hace una entrega fiacutesica de los bienes loscuales son comparados con la factura que este entrega y con la orden de compracorrespondiente Si esta accioacuten es correcta se registra una entrada de almaceacuten por cadafactura relacionada con la siguiente informacioacuten Nuacutemero de Entrada Fecha Nuacutemero defactura Proveedor Total Bienes Valor Total (los totales deben coincidir con los de lafactura) Adjunto a esta se discriminan los iacutetems recibidos con la siguiente informacioacutennombre del bien cantidad entregadao Cuando el almaceacuten decide despachar los bienes a las diferentes aacutereas solicitantesregistra cada una de las entregas en Salidas de Almaceacuten con la siguiente informacioacutenNuacutemero de Salida Empleado responsable del bien a entregar fecha de salida fecha deentrega Por cada entrega se detalla cada uno de los iacutetems con la siguiente informacioacutennombre del bien cantidad entregadao Una entrada de almaceacuten puede generar muchas salidas de almaceacuten por ejemplo Pueden ingresar 500 pacas de papel higieacutenico pero como se debe repartir entrevarias aacutereas cada una requiere de una salida de almaceacuten10485761048576El aacuterea de inventarios funciona de la siguiente formao Es la encargada de administrar y controlar la ubicacioacuten de los bienes dentro de laempresa por esto antes de que el bien salga del almaceacuten debe ser codificado a traveacutesde un coacutedigo uacutenico que lo haga identificable dentro de la empresao La ubicacioacuten del bien se identifica por la siguiente informacioacuten responsable del bienfecha de entrega direccioacuten del bien (ubicacioacuten)Disentildear modelo ER para la base de datosProblema 7 Torneo de Tenis Grand SlamEl sistema debe memorizar todos los encuentros que se han desarrollado desde que existe el torneo asiacute como las siguientes caracteriacutesticas de estosDescripcioacutenEl Grand Slam se compone de cuatro torneos anuales que se celebran en Gran Bretantildea Estados Unidos Francia y Australia En cada paiacutes se pueden

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 14

desarrollar en distintos lugares (p ej en EE UU Puede desarrollarse en Forest Hill o en Flashing Meadows)Cada partido tiene asociado un premio de consolacioacuten para el perdedor que dependeraacute de la fase en que se encuentre el torneo (p ej el perdedor de octavos de final puede ganar 5000 doacutelares) El ganador de a final recibiraacute el premio correspondiente al torneoCada torneo tiene cinco modalidades Individual masculino individual femenino dobles masculino dobles femenino y dobles mixtosTambieacuten hay que tener en cuenta la nacionalidad de un jugador de forma que acuteeste puede ser apaacutetrida o tener varias nacionalidadesResultados a considerarEl sistema debe dar respuesta a las siguientes preguntas1 Dado un antildeo y un torneo composicioacuten y resultado de los partidos2 Lista de aacuterbitros que participaron en el torneo3 Ganancias percibidas en premios por un jugador a lo largo del torneo4 Lista de entrenadores que han entrenado a un jugador a lo largo del torneo y fechas en las que lo hizo Ejemplos de acceso a la base de datos1 Connors gano Gerulaitis en Roland Garros en 1979 en cuartos de final en individuales masculinos por6-3 4-67-5 6-02 El sentildeor Wilkinson arbitro ese partido3 Alemania ha ganado dos veces las individuales masculinas de Wimbledon Borg ha ganado 2000000de doacutelares a lo largo de su participacioacuten en el Grand Slam4 El ganado de Roland Garros de 1987 ganoacute 20000 doacutelares5 Noah ha jugado cuatro veces en dobles mixtos con MandlikovaProblema 8Se desea crear un sitio web con informacioacuten referente a las peliacuteculas en cartel en las salas de un dudoso cine cercano a la plaza de armasDe cada peliacutecula se almacena una ficha con su tiacutetulo de distribucioacuten su tiacutetulo original su geacutenero el idioma origina si tiene subtiacutetulos en espantildeol o no los paises de origen el antildeo de la produccioacuten la url del sitio web de la peliacutecula la duracioacuten (en horas y minutos) la calificacioacuten (Apta todo puacuteblico+9 antildeos +15 antildeos+18 antildeos) fecha de estreno en Santiago un resumen y un identificador de la peliacutecula De cada peliacutecula interesa conocer la lista de directores y el reparto es decir para cada actor que trabaja el nombre de todos los personajes que interpretaAdemaacutes interesa disponer de informacioacuten sobre los directores y actores que trabajan en cada peliacutecula De ambos se conoce su nombre (que lo identifica) y su nacionalidad Ademaacutes se desea conocer la cantidad de peliacuteculas en las que dirigieron o actuaron Tenga en cuenta que hay personas que cumplen los dos rolesLos cines pueden tener maacutes de una sala y cada semana cada uno de los cines enviacutea la cartelera para dicha semana indicando de detalle de las funciones Para cada funcioacuten se conoce el diacutea de la semana y la hora de comienzo y obviamente la sala y la peliacutecula que exhibe De cada sala se sabe el nombre un nuacutemero que la identifica dentro del cine y la cantidad de butacas que posee De cada cine se conoce el nombre que lo identifica su direccioacuten y teleacutefono para consultas

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 15

Algunos cines cuentan con promociones Estas promociones dependen de la funcioacuten (Ej De lunes a jueves antes de las 18 50 de descuento en la sala tal del cine tal para la peliacutecula cualLa funcioacuten del lunes a las 14 para la peliacutecula tal en la sala cual no se cobra a los escolares con tuacutenica ) De cada promocioacuten se conoce una descripcioacuten y el descuento que aplicaAdemaacutes del resumen de la peliacutecula que se incluye en la ficha interesa mostrar la opinioacuten de las personas que vieron la peliacutecula De cada opinioacuten se conoce el nombre de la persona que la realiza su edad le fecha en que registroacute su opinioacuten la calificacioacuten que le dio a la peliacutecula (Obra Maestra Muy BuenaBuena Regular Mala) y el comentario propiamente dicho A cada opinioacuten se le asigna un nuacutemero que la identifica respecto de la peliacutecula sobre la cual opina

15 Normalizacioacuten151 Primera forma normalUna tabla estaacute en Primera Forma Normal si

Todos los atributos son atoacutemicos Un atributo es atoacutemico si los elementos del dominio son indivisibles miacutenimos

La tabla contiene una llave primaria uacutenica La llave primaria no contiene atributos nulos No debe existir variacioacuten en el nuacutemero de columnas Los Campos no llave deben identificarse por la llave (Dependencia

Funcional) Debe Existir una independencia del orden tanto de las filas como de las

columnas es decir si los datos cambian de orden no deben cambiar sus significados

Una tabla no puede tener muacuteltiples valores en cada columna Los datos son atoacutemicos (Si a cada valor de X le pertenece un valor de Y y viceversa)Esta forma normal elimina los valores repetidos dentro de una BD

152 Segunda Forma Normal (2FN)

Dependencia Funcional Una relacioacuten estaacute en 2FN si estaacute en 1FN y si los atributos que no forman parte de ninguna clave dependen de forma completa de la clave principal Es decir que no existen dependencias parciales (Todos los atributos que no son clave principal deben depender uacutenicamente de la clave principal)

En otras palabras podriacuteamos decir que la segunda forma normal estaacute basada en el concepto de dependencia completamente funcional Una dependencia funcional es completamente funcional si al eliminar los atributos A de X significa que la dependencia no es mantenida esto es que Una dependencia funcional es una dependencia parcial si hay algunos atributos que pueden ser eliminados

de X y la dependencia todaviacutea se mantiene esto es

Por ejemplo DNI ID_PROYECTO HORAS_TRABAJO (con el DNI de un empleado y el ID de un proyecto sabemos cuaacutentas horas de trabajo por semana trabaja un empleado en dicho proyecto) es completamente dependiente dado que ni DNI HORAS_TRABAJO ni ID_PROYECTO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 16

HORAS_TRABAJO mantienen la dependencia Sin embargo DNI ID_PROYECTO NOMBRE_EMPLEADO es parcialmente dependiente dado que DNI NOMBRE_EMPLEADO mantiene la dependencia

153 Tercera Forma Normal (3FN)

La tabla se encuentra en 3FN si es 2FN y si no existe ninguna dependencia funcional transitiva entre los atributos que no son clave

Un ejemplo de este concepto seriacutea que una dependencia funcional X-gtY en un esquema de relacioacuten R es una dependencia transitiva si hay un conjunto de atributos Z que no es un subconjunto de alguna clave de R donde se mantiene X-gtZ y Z-gtY

Por ejemplo la dependencia SSN-gtDMGRSSN es una dependencia transitiva en EMP_DEPT de la siguiente figura Decimos que la dependencia de DMGRSSN el atributo clave SSN es transitiva viacutea DNUMBER porque las dependencias SSNrarrDNUMBER y DNUMBERrarrDMGRSSN son mantenidas y DNUMBER no es un subconjunto de la clave de EMP_DEPT Intuitivamente podemos ver que la dependencia de DMGRSSN sobre DNUMBER es indeseable en EMP_DEPT dado que DNUMBER no es una clave de EMP_DEPT

Formalmente un esquema de relacion estaacute en 3 Forma Normal Elmasri-Navathe[2] si para toda dependencia funcional se cumple al menos una de las siguientes condiciones

es superllave o clave

es atributo primo de esto es si es miembro de alguna clave en

Ademaacutes el esquema debe cumplir necesariamente

Ejemplo

Id estudiante Ci Nombres Apellidos Curso Materia Descripicoacuten01 1803327418 Fransico

FabianCamacho Saltos

4 En Ingeacutes

02 10152465 Carlos Banabeti

Ruales Camacho

5 ES Espantildeol

03

1 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 17

2 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

Id Curso Curso01 Primero02 SegundoId Materia Materia Descripcioacuten01 En Ingleacutes02 MT Matemaacutetica

3 era forma normal

Iddescripcion DescripcioacutenIngleacutesMatemaacutetica

Dada la siguiente tabla normalizarlaIDcliente Ceacutedula Nombres Direccioacuten Proveedor Producto

16 Herramientas para la normalizacioacuten

A continuacioacuten se mencionan algunas herramientas para normalizar una base de datos mediante un proceso automatizado

CAPIacuteTULO IIRealizar diferentes tareas de disentildeo y planificacioacuten sobre la

estructura de tablas

21 Tabla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 18

Id Materia Materia01 En02 MT

Es un conjunto de datos ordenados en filas y columnas

22 Tipos de datossql_variant Puede usarse en columnas paraacutemetros variables y valores devueltos de funciones definidas por el usuariosql_variant permite que estos objetos de base de datos admitan valores de otros tipos de datosxml Capaz de almacenar documentos XML oacute fragmentos XML que es posible utilizar tanto en variables como en campos de tablas y que a diferencia de otros tipos de datos ofrece meacutetodos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 19

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 20

23 Creacioacuten de tablasAntes de aprender sobre la creacioacuten de tablas es necesario conocer los pasos para crear una base de datos en sql server 2008Para crear una base de datos en SQL Server 2008 debemos seguir los siguientes pasos1- Ingresar a SQLServer

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 21

2- En la ventana que nos aparece realizamos clic derecho en donde dice database

3- Nos aparece el siguiente menuacute hacemos clic donde dice New Database

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 22

4- Nos aparece la siguiente ventana

En donde dice Database Name le damos un nombre a la base de datos

5- Luego hacemos clic en

Nos aparece la siguiente ventana

Aquiacute tenemos dos opciones In percent nos permite que si sobrepasa el tamantildeo de la base de datos crezca en porcentajeIn Megabytes nos permite hacer que la base de datos crezca de 1 Megabyte en 1 megabyte si sobrepasa el tamantildeo y listoAhora para crear una tabla seguimos los siguientes pasos1- Hacemos clic en donde dice database buscamos el nombre de nuestra base de datos en la seccioacuten tables realizamos clic derecho con el botoacuten secundario del mouse

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 23

Nos aparece el siguiente menuacute

Hacemos clic en New Table

Y en donde dice Column Name vamos poniendo los campos de las bases de datos con su respectivo tipoAl final hacemos clic en donde estaacute el iacutecono de un diskette nos aparece una ventana pidiendo el nombre de la tabla le asignamos un nombre y realizamos clic en el botoacuten ok24 Creacioacuten de RestriccionesUna restriccioacuten es una condicioacuten que obliga el cumplimiento de ciertas condiciones en la base de datos Algunas no son determinadas por los usuarios sino que son inherentemente definidas por el simple hecho de que la base de datos sea relacional Algunas otras restricciones las puede definir el usuario por ejemplo usar un campo con valores enteros entre 1 y 10

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 24

Las restricciones proveen un meacutetodo de implementar reglas en la base de datos Las restricciones restringen los datos que pueden ser almacenados en las tablas Usualmente se definen usando expresiones que dan como resultado un valor booleano indicando si los datos satisfacen la restriccioacuten o noLas restricciones no son parte formal del modelo relacional pero son incluidas porque juegan el rol de organizar mejor los datos Las restricciones son muy discutidas junto con los conceptos relacionalesPueden crearse los siguientes tipos de restricciones Las restricciones unique y primary key exigen que no haya dos filas en una tabla con los mismos valores en las columnas especificadas Ademaacutes la restriccioacuten primary key requiere que no haya valores nulos en ninguna fila de la columna

241 Crear una restriccioacuten PRIMARY KEYPara crear una restriccioacuten Primary Key realizamos clic en el campo donde

queremos crear la restriccioacuten y luego realizamos clic en el iacutecono 242 Crear una restriccioacuten UNIQUEPara crear una restriccioacuten UNIQUE realizamos clic en el campo donde queremos crear dicha restriccioacuten y luego escogemos el menuacute Table Designe y luego en IndexesKeys

Nos aparece la siguiente ventana en donde dice Type escogemos Unique Key

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 25

Realizamos clic en close y guardamos la tabla

La integridad de referencia ( references ) exige que los datos insertados en columnas especiacuteficas ya tengan datos coincidentes en la tabla y columnas especificadas Las restricciones check limitan los valores de datos insertados en las columnas

243 Agregar una restriccioacuten CHECKRealizamos clic derecho dentro del explorador de objetos en la seccioacuten tables buscamos el nombre de la tabla y buscamos constraints realizamos clic derecho con el botoacuten secundario del mouse y escogemos New Constraint

Nos apareced la siguiente ventana

|

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 26

Realizamos clic en este botoacuten para poder editar la expresioacuten que queremos que tenga restricciones

En la ventana que nos aparece ponemos la expresioacuten deseada y realizamos clic en el botoacuten Ok

Para poder editar la tabla y verificar los cambios realizados buscamos en el explorador de objetos el nombre de la tabla realizamos clic derecho y escogemos la opcioacuten Edit Top 200 Rows

Y procedemos a ingresar datos para probarTambieacuten se puede imponer la integridad de datos restringiendo el uso de valores nulos en una columna (las palabras clave null o not null ) y proporcionando valores predeterminados para columnas (la claacuteusula default )

25 Diagramas de bases de datosLos diagramas de bases de datos se utiliza para visualizar las tablas graacuteficamente y para poder establecer las relaciones

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 27

Para crear un diagrama hacemos clic en el explorador de objetos hacemos clic en el nombre de la base de datos y escogemos Database Diagrams hacemos clic derecho escogemos new Database Diagrams

Nos aparece el siguiente mensaje realizamos un clic dentro del botoacuten Yes

Volvemos hacer clic derechos y volvemos a escoger New Data Base Diagram

Aparece la siguiente ventana en pantalla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 28

Seleccionamos todas y escogemos AddNos aparece la siguiente ventana

En el caso de tener una relacioacuten muchos a muchos debemos romper la relacioacuten con una tercera tabla para esto desde el mismo Database Diagram hacemos clic derecho en un lugar en blanco y escogemos new table llenos las columnas con los campos y tipos de datos respectivosDebemos tomar en cuenta que en las tablas a donde va la relacioacuten tiene que tener su respectiva llave foraacutenea y para poder establecer la relacioacuten

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 29

arrastramos desde el campo principal hacia la llave foraacutenea es decir de la tabla padre a la hijaQuedando las relaciones asiacute

Finalmente cerramos la base de datos nos aparece la siguiente ventana

pidiendo guardar el Database Diagram le demos un nombre y realizamos clic

en el botoacuten OK

252 Ejercicios

Los diagramas del ejercicio 1 y 2 del capiacutetulo anterior pasar al modelo

relacional en SQLSERVER 2008

Los ejercicios 5 y 6 los ejercicios de la prueba pasarlos a sql server

Transformar el siguiente modelo entidad relacioacuten al modelo relacional

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 30

CAPIacuteTULO III

Aplicar las diferentes sentencias y modos en lenguaje SQL

para tratamiento de la informacioacuten almacenada en las

diferentes tablas de la base de datos

31 Lenguaje de definicioacuten de datosLas sentencias DDL son CREATE ALTER y DROP Siempre se usan estas

sentencias junto con el tipo de objeto y el nombre del objeto

CREATE

Crea una base de datos o un objeto

Sintaxis

Create database nombre on grupo_base de datos filegroup

Ejemplo

USE mastergoIF DB_ID (Ncalificaciones) IS NULL BEGIN create database calificaciones on primary( name = calificaciones filename = Ccalificacionescalificacionesmdf

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 31

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 6: Base de Datos

terminaciones y extensiones a ese nombre principal ademaacutes como administrador puedo elegir el lugar donde se almacenaraacute la base de datosEjemplo si soy administrador de una base de datos y quiero crear una base de datos llama uta los archivos que se creariacutean son los siguientes

Archivo de datos miEmpresa_DataMDF Archivo de registro de transacciones miEmpresa_LogLDF

En caso de tener archivos extras nosotros como administradores tambieacuten podremos darles su nombre principal y la extensioacuten que suele utilizarse es NDFComo administradores tambieacuten puedo seleccionar el lugar de almacenamiento en una determinada carpeta o directorio incluso diferentes unidades fiacutesicasNo debes quedarte con la idea de que una base de datos se compone sencillamente de dos archivos es algo mucho maacutes completo que todo eso lo que representa una base de datos como entidad121 Tamantildeo de la base de datos

Al crear una base de datos con SQL server no es necesario separar una gran cantidad de memoria ya que los archivos de datos y registro crecen automaacuteticamente el administrador de la base de datos le da un tamantildeo inicial una cantidad muy pequentildea en Megabytes una vez que se utilice la base de datos y alcance el tamantildeo maacuteximo se incrementa13 Estructura loacutegicaEs el esqueleto o armazoacuten conceptual estaacute constituido por abstracciones de la realidad para enfocarse en el aacutembito conceptual sin entrar en detalles fiacutesicos Entre los elementos que conforman la estructura loacutegica de una base de datos podemos destacar131 TablasLas tablas son las unidades que almacenan los datos Como norma general se suele imponer que cada tabla almacena informacioacuten comuacuten sobre una entidad en particular (recuerda los libros) Esta norma se conoce como normalizacioacutenLa mayor parte de la actividad producida en una base de datos se produce sobre las tablas siendo las principales tareas las siguientes

Antildeadir informacioacuten Eliminar informacioacuten Modificar y actualizar informacioacuten Recoger informacioacuten y mostrarla

132 Campos y registros

Las tablas estaacuten compuestas de registros y campos Si imaginamos el disentildeo de una tabla como si de una cuadriacutecula se tratase sabemos que estaacute compuesta por varias filas y columnas Las filas corresponden a los registros mientras que las columnas seriacutean los campos Y cada una de las celdas que se forman de enlazar un registro (fila) con un campo (columna) formariacutea una celda la cual almacena un valor

Por lo tanto un registro esta formado por varios campos y cada campo almacena un determinado valor

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 6

133 IacutendicesUn iacutendice es un conjunto de valores clave el iacutendice guarda el elemento que desea indexar y la posicioacuten en la base de datosLos valores claves de los iacutendices pueden almacenar el contenido de una o varias columnas de una tabla134 VistasEs un conjunto de registros determinados de una o varias tablas se trabaja sobre ella como si fuera una tabla pero no lo es una vista no almacena datos si no que los extrae y permite trabajar con datos de varias tablas como si fuera una sola135 SQLSignifica lenguaje de consulta estructurado permite el acceso a bases de datos que explota la flexibilidad y potencia de los sistemas relacionales permitiendo gran variedad de operaciones14 Planificacioacuten ndash disentildeo141- Identificar el objetivo de la base de datosConsiste en un diaacutelogo intenso para averiguar expliacutecitamente que es lo que quiere el cliente142 Revisioacuten datos existentesUna gran herramienta para iniciar una aplicacioacuten es ver documetacioacuten sobre los datos existentes Hojas de caacutelculo albaranes facturas documentacioacuten en generalUna forma que ayuda mucho en la primera parte del desarrollo es mirar las necesidades del cliente iniciando por el final Por ejemplo si analizamos un informe de ventas que nos proporcione el cliente podemos ver mucha informacioacuten incluso la forma de relacionar las tablas Sabremos tambieacuten si estos datos hay que agruparlos por ejemplo por vendedor o por poblacioacuten Esto nos ayudaraacute a saber queacute campos y tablas necesitaremos para conseguir el objetivo final que se muestra en el informe del clienteCuanta maacutes informacioacuten se pueda recabar maacutes faacutecil seraacute dar los primeros pasos y acercarse desde el principio al disentildeo maacutes correcto posible Para evitar un trabajo suplementario y correcciones innecesarias hazlo bien la primera vez143 Modelado de la base de datos1431 Paso al SGBDLlave principal Es un campo o a una combinacioacuten de campos que identifica de forma uacutenica a cada fila de una tabla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 7

Llave foraacutenea Identifica una columna o grupo de columnas que se refiere a una columna o grupo de columnas en otra tablaRelaciones uno a unoEn una relacioacuten uno a uno una fila de la tabla A no puede tener maacutes de una fila coincidente en la tabla B y viceversa Se crea una relacioacuten uno a uno si las dos columnas relacionadas son claves principales Relaciones uno a variosUna relacioacuten uno a varios es el tipo maacutes habitual de relacioacuten En este tipo de relacioacuten una fila de la tabla A puede corresponderse con muchas filas de la tabla B pero una fila de la tabla B soacutelo puede corresponderse con otra de la tabla A Por ejemplo en las tablas (editoriales) y (tiacutetulos) se da una relacioacuten uno a varios una editorial publica muchos tiacutetulos pero a cada tiacutetulo le corresponde soacutelo una editorialEn una relacioacuten uno a varios solamente una de las columnas relacionadas es la clave principal o tiene una restriccioacuten uniqueRelaciones Varios a VariosEn una relacioacuten varios a varios una fila de la tabla A puede tener muchas filas coincidentes en la tabla B y viceversa Este tipo de relaciones se crea definiendo una tercera tabla denominada tabla de unioacuten cuya clave principal esteacute constituida por las claves externas de las tablas A y B Por ejemplo entre las tablas (autores) y (tiacutetulos) existiriacutea una relacioacuten varios a varios definida por una relacioacuten uno a varios entre cada una de ellas y la tabla (tiacutetuloautor) La clave principal de la tabla es la combinacioacuten de la columna au_id (la clave principal de la tabla autores) y la columna title_id (la clave principal de la tabla tiacutetulos)1432 Modelo entidad relacioacuten

1433 EjerciciosSupongamos que queremos disentildear una base de datos para una biblioteca y hemos conocido que eacutesta funciona de la siguiente formaEn la biblioteca se encuentra como es natural una serie de libros que los empleados solicitan a las editoriales Cuando un libro se recibe se le da de alta construyeacutendole una ficha para buacutesqueda por autor y otra ficha para buacutesqueda por tema En ambas fichas aparecen el tiacutetulo del libro el nombre del autor y su nacionalidad la editorial a la que pertenece la publicacioacuten el tema sobre el que trata el ISBN y la estanteriacutea de la biblioteca en la que se encuentra Un empleado puede solicitar un libro escribiendo una carta de

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 8

Entidades

Relaciones

Conectores

peticioacuten a la editorial correspondiente La direccioacuten a la que se a de dirigir la carta se encuentra en el archivo de editoriales Para acceder a los libros de la biblioteca es necesario la posesioacuten de un carnet que acredita a los distintos usuarios Este carnet se confecciona a cada persona la primera vez que intenta retirar un libro Cada usuario puede tener retirado un libro en un momento determinadoEn la biblioteca les gustariacutea disponer de un listado que se lanzariacutea al final de cada diacutea y en el que apareceriacutea para cada libro que se encuentra retirado el tiacutetulo el ISBN el autor y el nuacutemero de carnet nombre y la ceacutedula del usuario que lo mantiene retiradoCuando un usuario intente retirar un libro ha de presentar su carnet para que se tome nota de la retirada Si el libro que desea ha sido retirado por otro usuario se llama a eacuteste por teleacutefono indicaacutendole que hay otro usuario que desea el libro para que lo devuelva en caso de que no lo esteacute utilizandoMensualmente se confecciona un inventario actualizado donde se indica para cada libro el nombre el autor y el lugar de la biblioteca donde se encuentra

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 9telefononombrecedula

carnet

USUARIO

1

m 1

editado

DireccioacutenNombre

EDITORIAL

n

NACIONALIDNOMB

CODAUTO

AUTOR

TEMA

TITULO

ISBN

LIBRO Situado en

nuacutemerorororo

lugarnestanteria

ESTANTERIA

1

escrito

escrito

m

1

Problema 2 Artiacuteculos y encargosUna base de datos para una pequentildea empresa debe contener informacioacuten acerca de clientes artiacuteculos y pedidos Hasta el momento se registran los siguientes datos en documentos variosbull Para cada cliente Nuacutemero de cliente (uacutenico) Direcciones de enviacuteo (varias por cliente) Saldo Liacutemite de creacutedito (depende del cliente pero en ninguacuten caso debe superar los 3000000 pts) Descuentobull Para cada artiacuteculo Nuacutemero de artiacuteculo (uacutenico) Faacutebricas que lo distribuyen Existencias de ese artiacuteculo en cada faacutebrica Descripcioacuten del artiacuteculobull Para cada pedido Cada pedido tiene una cabecera y el cuerpo del pedido La cabecera estaacute formada por el nuacutemero de cliente direccioacuten de enviacuteo y fecha del pedido El cuerpo del pedido son varias liacuteneas en cada liacutenea se especifican el nuacutemero del artiacuteculo pedido y la cantidadAdemaacutes se ha determinado que se debe almacenar la informacioacuten de las faacutebricas Sin embargo dado el uso de distribuidores se usaraacute Nuacutemero de la faacutebrica (uacutenico) y Teleacutefono de contacto Y se desean ver cuaacutentos artiacuteculos (en total) provee la faacutebrica Tambieacuten por informacioacuten estrateacutegica se podriacutea incluir informacioacuten de faacutebricas alternativas respecto de las que ya fabrican artiacuteculos para esta empresaNota Una direccioacuten se entenderaacute como Nordm Calle Comuna y Ciudad Una fecha incluye horaSe pide hacer el diagrama ER para la base de datos que represente esta informacioacuten

Problema 2 () Sistema de ventas

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 10

Le contratan para hacer una BD que permita apoyar la gestioacuten de un sistema de ventas La empresa necesita llevar un control de proveedores clientes productos y ventasUn proveedor tiene un RUT nombre direccioacuten teleacutefono y paacutegina web Un cliente tambieacuten tiene RUT nombre direccioacuten pero puede tener varios teleacutefonos de contacto La direccioacuten se entiende por calle nuacutemero comuna y ciudadUn producto tiene un id uacutenico nombre precio actual stock y nombre del proveedor Ademaacutes seorganizan en categoriacuteas y cada producto va soacutelo en una categoriacutea Una categoriacutea tiene id nombre y descripcioacutenPor razones de contabilidad se debe registrar la informacioacuten de cada venta con un id fecha cliente descuento y monto final Ademaacutes se debe guardar el precio al momento de la venta la cantidad vendida y el monto total por el producto

Problema 3 CarreterasDisentildear un esquema ER que recoja la organizacioacuten de una base de datos para contener la informacioacuten sobre todas las carreteras del paiacutes sabiendo que se deben cumplir las siguientes especificaciones- Las carreteras estaacuten divididas en varias categoriacuteas (locales comerciales regionales nacionalesautoviacuteas etc)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 11

- Las carreteras se dividen en tramos Un tramo siempre pertenece a una uacutenica carretera y no puede cambiar de carretera- Un tramo puede pasar por varias comunas interesando conocer el Km de la carretera y la comuna donde empieza el tramo y en donde termina- Para los tramos que suponen principio o final de carretera interesa saber si es que la carreteraconcluye fiacutesicamente o es que confluye en otra carretera En este caso interesa conocer con queacutecarretera confluye y en queacute kiloacutemetro tramo y comunaProblema 4 Sistema de vuelosObtener el diagrama ER para un sistema de control de vuelos adaptado a las siguientes reglas degestioacuten (indicar las entidades interrelaciones etc que se deducen de cada una de las reglas)a) De cada aeropuerto se conoce su coacutedigo nombre ciudad y paiacutesb) En cada aeropuerto pueden tomar tierra diversos modelos de aviones (el modelo de un avioacutendetermina su capacidad es decir el nuacutemero de plazasc) En cada aeropuerto existe una coleccioacuten de programas de vuelo En cada programa de vuelo se indica el nuacutemero de vuelo liacutenea aeacuterea y diacuteas de la semana en que existe dicho vuelod) Cada programa de vuelo despega de un aeropuerto y aterriza en otroe) Los nuacutemeros de vuelo son uacutenicos para todo el mundof) En cada aeropuerto hay muacuteltiples aterrizajes y despegues Todos los aeropuertos contemplados estaacuten en activo es decir tienen alguacuten aterrizaje y alguacuten despegueg) Cada vuelo realizado pertenece a un cierto programa de vuelo Para cada vuelo se quiere conocer su fecha plazas vaciacuteas y el modelo de avioacuten utilizadoh) Algunos programas de vuelo incorporan escalas teacutecnicas intermedias entre los aeropuertos de salida y de llegada Se entiende por escala teacutecnica a un aterrizaje y despegue consecutivos sin altas oacute bajas de pasajerosi) De cada vuelo se quieren conocer las escalas teacutecnicas ordenadas asignaacutendole a cada una un nuacutemero de ordenPor ejemplo el programa de vuelo 555 de Iberia con vuelos los lunes y jueves despega de Barajas-Madrid-Espantildea y aterriza en Caudell-Sydney-Australia teniendo las siguientes escalas teacutecnicas 1- Los Pradintildeos-Sao Paulo-Brasil 2-El Emperador-Santiago-Chile y 3-Saint Kitts-Auckland-Nueva Zelanda1048576 iquestQue cambios se produciraacuten en el caso anterior si en las escalas pudiesen bajar o subir pasajerosExplicar coacutemo se podriacutea representar esta nueva situacioacutenProblema 5 () OlimpiacuteadasLas sedes oliacutempicas se dividen en complejos deportivos Los complejos deportivos se subdividen en aquellos en los que se desarrolla un uacutenico deporte y en los polideportivos Los complejos polideportivos tienen aacutereas designadas para cada deporte con un indicador de localizacioacuten (ejemplo centro esquina- NE etc) Un complejo tiene una localizacioacuten un jefe de organizacioacuten individual y un aacuterea total ocupada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 12

Los dos tipos de complejos (deporte uacutenico y polideportivo) tendraacuten diferentes tipos de informacioacuten Para cada tipo de sede se conservaraacute el nuacutemero de complejos junto con su presupuesto aproximadoCada complejo celebra una serie de eventos (ejemplo la pista del estadio puede celebrar muchascarreras distintas) Para cada evento estaacute prevista una fecha duracioacuten nuacutemero de participantes nuacutemero de comisarios Una lista de todos los comisarios se conservaraacute junto con la lista de los eventos en los que esteacute involucrado cada comisario ya sea cumpliendo la tarea de juez u observador Tanto para cada evento como para el mantenimiento se necesitaraacute cierto equipamiento (ejemplo arcos peacutertigas barras paralelas etc)Problema 6 Educando SAEn la Empresa Educando SA se lleva control de sus Bienes y Servicios El intereacutes primario es poder hacer que los Bienes se manejen de forma raacutepida y con el menor grado de error Para esto quien maneja la seccioacuten de Bienes y Suministros plantea las siguientes condiciones del negocio para la construccioacuten de una base de datos10485761048576La Seccioacuten estaacute dividida en tres (3) aacutereas COMPRAS ALMACEN INVENTARIO10485761048576El aacuterea de Compras funciona de la siguiente formao Recibe las solicitudes de compras de las diferentes aacutereas de la empresao Cada solicitud tiene un responsableo Cada solicitud es autorizada por el jefe del aacuterea y posteriormente por el DirectorFinancieroo Quien realiza una solicitud puede ser responsable de uno o varios centros de costos conla salvedad de que eacutel como empleado solo estaacute adscrito a unoo De la solicitud se debe diligenciar la siguiente informacioacuten Nuacutemero de la solicitud (consecutivo) Fecha Responsable (nombre y ceacutedula) Centro de Costos Rubro presupuestal del cual se descargaraacute la compra En cada solicitud se pueden discriminar uno o muchos iacutetems con la siguiente informacioacuten iacutetem nombre del bien cantidad solicitada unidad de medida del bien valor unitario y valor total Cada solicitud debe ser totalizadao Cada bien es identificado por un coacutedigo universal que es uacutenico y es de caraacutecter devolutivo (suministro) o un bien inmuebleo Una vez diligenciada la solicitud es remitida al aacuterea de compras para realizar sucorrespondiente cotizacioacuteno Las cotizaciones son realizadas con uno o varios proveedores de los bienes solicitadoso Una vez la cotizacioacuten definitiva estaacute lista se crea una orden contractual que maneja lasiguiente informacioacuten Nuacutemero de la orden contractual nit y nombre del proveedor al cualse le va a realizar la compra fecha de la orden monto total de la orden fecha de entrega Cada orden puede tener asociado uno o varios iacutetems de la solicitud o solicitudes que van a ser despachadas Cada iacutetem tiene la siguiente informacioacuten nombre del bien cantidad solicitada cantidad despachada unidad de medida del bien valor unitario y valor total

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 13

o La orden de compra es aprobada por el Director Financiero para que sea enviada alproveedor elegido10485761048576El aacuterea de Almaceacuten funciona de la siguiente formao Su funcioacuten principal es recepcionar los bienes que llegan de los proveedores ydistribuirlos a las correspondientes aacutereas que realizaron las solicitudes de compraso Cuando llega un proveedor mercanciacutea este hace una entrega fiacutesica de los bienes loscuales son comparados con la factura que este entrega y con la orden de compracorrespondiente Si esta accioacuten es correcta se registra una entrada de almaceacuten por cadafactura relacionada con la siguiente informacioacuten Nuacutemero de Entrada Fecha Nuacutemero defactura Proveedor Total Bienes Valor Total (los totales deben coincidir con los de lafactura) Adjunto a esta se discriminan los iacutetems recibidos con la siguiente informacioacutennombre del bien cantidad entregadao Cuando el almaceacuten decide despachar los bienes a las diferentes aacutereas solicitantesregistra cada una de las entregas en Salidas de Almaceacuten con la siguiente informacioacutenNuacutemero de Salida Empleado responsable del bien a entregar fecha de salida fecha deentrega Por cada entrega se detalla cada uno de los iacutetems con la siguiente informacioacutennombre del bien cantidad entregadao Una entrada de almaceacuten puede generar muchas salidas de almaceacuten por ejemplo Pueden ingresar 500 pacas de papel higieacutenico pero como se debe repartir entrevarias aacutereas cada una requiere de una salida de almaceacuten10485761048576El aacuterea de inventarios funciona de la siguiente formao Es la encargada de administrar y controlar la ubicacioacuten de los bienes dentro de laempresa por esto antes de que el bien salga del almaceacuten debe ser codificado a traveacutesde un coacutedigo uacutenico que lo haga identificable dentro de la empresao La ubicacioacuten del bien se identifica por la siguiente informacioacuten responsable del bienfecha de entrega direccioacuten del bien (ubicacioacuten)Disentildear modelo ER para la base de datosProblema 7 Torneo de Tenis Grand SlamEl sistema debe memorizar todos los encuentros que se han desarrollado desde que existe el torneo asiacute como las siguientes caracteriacutesticas de estosDescripcioacutenEl Grand Slam se compone de cuatro torneos anuales que se celebran en Gran Bretantildea Estados Unidos Francia y Australia En cada paiacutes se pueden

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 14

desarrollar en distintos lugares (p ej en EE UU Puede desarrollarse en Forest Hill o en Flashing Meadows)Cada partido tiene asociado un premio de consolacioacuten para el perdedor que dependeraacute de la fase en que se encuentre el torneo (p ej el perdedor de octavos de final puede ganar 5000 doacutelares) El ganador de a final recibiraacute el premio correspondiente al torneoCada torneo tiene cinco modalidades Individual masculino individual femenino dobles masculino dobles femenino y dobles mixtosTambieacuten hay que tener en cuenta la nacionalidad de un jugador de forma que acuteeste puede ser apaacutetrida o tener varias nacionalidadesResultados a considerarEl sistema debe dar respuesta a las siguientes preguntas1 Dado un antildeo y un torneo composicioacuten y resultado de los partidos2 Lista de aacuterbitros que participaron en el torneo3 Ganancias percibidas en premios por un jugador a lo largo del torneo4 Lista de entrenadores que han entrenado a un jugador a lo largo del torneo y fechas en las que lo hizo Ejemplos de acceso a la base de datos1 Connors gano Gerulaitis en Roland Garros en 1979 en cuartos de final en individuales masculinos por6-3 4-67-5 6-02 El sentildeor Wilkinson arbitro ese partido3 Alemania ha ganado dos veces las individuales masculinas de Wimbledon Borg ha ganado 2000000de doacutelares a lo largo de su participacioacuten en el Grand Slam4 El ganado de Roland Garros de 1987 ganoacute 20000 doacutelares5 Noah ha jugado cuatro veces en dobles mixtos con MandlikovaProblema 8Se desea crear un sitio web con informacioacuten referente a las peliacuteculas en cartel en las salas de un dudoso cine cercano a la plaza de armasDe cada peliacutecula se almacena una ficha con su tiacutetulo de distribucioacuten su tiacutetulo original su geacutenero el idioma origina si tiene subtiacutetulos en espantildeol o no los paises de origen el antildeo de la produccioacuten la url del sitio web de la peliacutecula la duracioacuten (en horas y minutos) la calificacioacuten (Apta todo puacuteblico+9 antildeos +15 antildeos+18 antildeos) fecha de estreno en Santiago un resumen y un identificador de la peliacutecula De cada peliacutecula interesa conocer la lista de directores y el reparto es decir para cada actor que trabaja el nombre de todos los personajes que interpretaAdemaacutes interesa disponer de informacioacuten sobre los directores y actores que trabajan en cada peliacutecula De ambos se conoce su nombre (que lo identifica) y su nacionalidad Ademaacutes se desea conocer la cantidad de peliacuteculas en las que dirigieron o actuaron Tenga en cuenta que hay personas que cumplen los dos rolesLos cines pueden tener maacutes de una sala y cada semana cada uno de los cines enviacutea la cartelera para dicha semana indicando de detalle de las funciones Para cada funcioacuten se conoce el diacutea de la semana y la hora de comienzo y obviamente la sala y la peliacutecula que exhibe De cada sala se sabe el nombre un nuacutemero que la identifica dentro del cine y la cantidad de butacas que posee De cada cine se conoce el nombre que lo identifica su direccioacuten y teleacutefono para consultas

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 15

Algunos cines cuentan con promociones Estas promociones dependen de la funcioacuten (Ej De lunes a jueves antes de las 18 50 de descuento en la sala tal del cine tal para la peliacutecula cualLa funcioacuten del lunes a las 14 para la peliacutecula tal en la sala cual no se cobra a los escolares con tuacutenica ) De cada promocioacuten se conoce una descripcioacuten y el descuento que aplicaAdemaacutes del resumen de la peliacutecula que se incluye en la ficha interesa mostrar la opinioacuten de las personas que vieron la peliacutecula De cada opinioacuten se conoce el nombre de la persona que la realiza su edad le fecha en que registroacute su opinioacuten la calificacioacuten que le dio a la peliacutecula (Obra Maestra Muy BuenaBuena Regular Mala) y el comentario propiamente dicho A cada opinioacuten se le asigna un nuacutemero que la identifica respecto de la peliacutecula sobre la cual opina

15 Normalizacioacuten151 Primera forma normalUna tabla estaacute en Primera Forma Normal si

Todos los atributos son atoacutemicos Un atributo es atoacutemico si los elementos del dominio son indivisibles miacutenimos

La tabla contiene una llave primaria uacutenica La llave primaria no contiene atributos nulos No debe existir variacioacuten en el nuacutemero de columnas Los Campos no llave deben identificarse por la llave (Dependencia

Funcional) Debe Existir una independencia del orden tanto de las filas como de las

columnas es decir si los datos cambian de orden no deben cambiar sus significados

Una tabla no puede tener muacuteltiples valores en cada columna Los datos son atoacutemicos (Si a cada valor de X le pertenece un valor de Y y viceversa)Esta forma normal elimina los valores repetidos dentro de una BD

152 Segunda Forma Normal (2FN)

Dependencia Funcional Una relacioacuten estaacute en 2FN si estaacute en 1FN y si los atributos que no forman parte de ninguna clave dependen de forma completa de la clave principal Es decir que no existen dependencias parciales (Todos los atributos que no son clave principal deben depender uacutenicamente de la clave principal)

En otras palabras podriacuteamos decir que la segunda forma normal estaacute basada en el concepto de dependencia completamente funcional Una dependencia funcional es completamente funcional si al eliminar los atributos A de X significa que la dependencia no es mantenida esto es que Una dependencia funcional es una dependencia parcial si hay algunos atributos que pueden ser eliminados

de X y la dependencia todaviacutea se mantiene esto es

Por ejemplo DNI ID_PROYECTO HORAS_TRABAJO (con el DNI de un empleado y el ID de un proyecto sabemos cuaacutentas horas de trabajo por semana trabaja un empleado en dicho proyecto) es completamente dependiente dado que ni DNI HORAS_TRABAJO ni ID_PROYECTO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 16

HORAS_TRABAJO mantienen la dependencia Sin embargo DNI ID_PROYECTO NOMBRE_EMPLEADO es parcialmente dependiente dado que DNI NOMBRE_EMPLEADO mantiene la dependencia

153 Tercera Forma Normal (3FN)

La tabla se encuentra en 3FN si es 2FN y si no existe ninguna dependencia funcional transitiva entre los atributos que no son clave

Un ejemplo de este concepto seriacutea que una dependencia funcional X-gtY en un esquema de relacioacuten R es una dependencia transitiva si hay un conjunto de atributos Z que no es un subconjunto de alguna clave de R donde se mantiene X-gtZ y Z-gtY

Por ejemplo la dependencia SSN-gtDMGRSSN es una dependencia transitiva en EMP_DEPT de la siguiente figura Decimos que la dependencia de DMGRSSN el atributo clave SSN es transitiva viacutea DNUMBER porque las dependencias SSNrarrDNUMBER y DNUMBERrarrDMGRSSN son mantenidas y DNUMBER no es un subconjunto de la clave de EMP_DEPT Intuitivamente podemos ver que la dependencia de DMGRSSN sobre DNUMBER es indeseable en EMP_DEPT dado que DNUMBER no es una clave de EMP_DEPT

Formalmente un esquema de relacion estaacute en 3 Forma Normal Elmasri-Navathe[2] si para toda dependencia funcional se cumple al menos una de las siguientes condiciones

es superllave o clave

es atributo primo de esto es si es miembro de alguna clave en

Ademaacutes el esquema debe cumplir necesariamente

Ejemplo

Id estudiante Ci Nombres Apellidos Curso Materia Descripicoacuten01 1803327418 Fransico

FabianCamacho Saltos

4 En Ingeacutes

02 10152465 Carlos Banabeti

Ruales Camacho

5 ES Espantildeol

03

1 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 17

2 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

Id Curso Curso01 Primero02 SegundoId Materia Materia Descripcioacuten01 En Ingleacutes02 MT Matemaacutetica

3 era forma normal

Iddescripcion DescripcioacutenIngleacutesMatemaacutetica

Dada la siguiente tabla normalizarlaIDcliente Ceacutedula Nombres Direccioacuten Proveedor Producto

16 Herramientas para la normalizacioacuten

A continuacioacuten se mencionan algunas herramientas para normalizar una base de datos mediante un proceso automatizado

CAPIacuteTULO IIRealizar diferentes tareas de disentildeo y planificacioacuten sobre la

estructura de tablas

21 Tabla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 18

Id Materia Materia01 En02 MT

Es un conjunto de datos ordenados en filas y columnas

22 Tipos de datossql_variant Puede usarse en columnas paraacutemetros variables y valores devueltos de funciones definidas por el usuariosql_variant permite que estos objetos de base de datos admitan valores de otros tipos de datosxml Capaz de almacenar documentos XML oacute fragmentos XML que es posible utilizar tanto en variables como en campos de tablas y que a diferencia de otros tipos de datos ofrece meacutetodos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 19

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 20

23 Creacioacuten de tablasAntes de aprender sobre la creacioacuten de tablas es necesario conocer los pasos para crear una base de datos en sql server 2008Para crear una base de datos en SQL Server 2008 debemos seguir los siguientes pasos1- Ingresar a SQLServer

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 21

2- En la ventana que nos aparece realizamos clic derecho en donde dice database

3- Nos aparece el siguiente menuacute hacemos clic donde dice New Database

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 22

4- Nos aparece la siguiente ventana

En donde dice Database Name le damos un nombre a la base de datos

5- Luego hacemos clic en

Nos aparece la siguiente ventana

Aquiacute tenemos dos opciones In percent nos permite que si sobrepasa el tamantildeo de la base de datos crezca en porcentajeIn Megabytes nos permite hacer que la base de datos crezca de 1 Megabyte en 1 megabyte si sobrepasa el tamantildeo y listoAhora para crear una tabla seguimos los siguientes pasos1- Hacemos clic en donde dice database buscamos el nombre de nuestra base de datos en la seccioacuten tables realizamos clic derecho con el botoacuten secundario del mouse

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 23

Nos aparece el siguiente menuacute

Hacemos clic en New Table

Y en donde dice Column Name vamos poniendo los campos de las bases de datos con su respectivo tipoAl final hacemos clic en donde estaacute el iacutecono de un diskette nos aparece una ventana pidiendo el nombre de la tabla le asignamos un nombre y realizamos clic en el botoacuten ok24 Creacioacuten de RestriccionesUna restriccioacuten es una condicioacuten que obliga el cumplimiento de ciertas condiciones en la base de datos Algunas no son determinadas por los usuarios sino que son inherentemente definidas por el simple hecho de que la base de datos sea relacional Algunas otras restricciones las puede definir el usuario por ejemplo usar un campo con valores enteros entre 1 y 10

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 24

Las restricciones proveen un meacutetodo de implementar reglas en la base de datos Las restricciones restringen los datos que pueden ser almacenados en las tablas Usualmente se definen usando expresiones que dan como resultado un valor booleano indicando si los datos satisfacen la restriccioacuten o noLas restricciones no son parte formal del modelo relacional pero son incluidas porque juegan el rol de organizar mejor los datos Las restricciones son muy discutidas junto con los conceptos relacionalesPueden crearse los siguientes tipos de restricciones Las restricciones unique y primary key exigen que no haya dos filas en una tabla con los mismos valores en las columnas especificadas Ademaacutes la restriccioacuten primary key requiere que no haya valores nulos en ninguna fila de la columna

241 Crear una restriccioacuten PRIMARY KEYPara crear una restriccioacuten Primary Key realizamos clic en el campo donde

queremos crear la restriccioacuten y luego realizamos clic en el iacutecono 242 Crear una restriccioacuten UNIQUEPara crear una restriccioacuten UNIQUE realizamos clic en el campo donde queremos crear dicha restriccioacuten y luego escogemos el menuacute Table Designe y luego en IndexesKeys

Nos aparece la siguiente ventana en donde dice Type escogemos Unique Key

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 25

Realizamos clic en close y guardamos la tabla

La integridad de referencia ( references ) exige que los datos insertados en columnas especiacuteficas ya tengan datos coincidentes en la tabla y columnas especificadas Las restricciones check limitan los valores de datos insertados en las columnas

243 Agregar una restriccioacuten CHECKRealizamos clic derecho dentro del explorador de objetos en la seccioacuten tables buscamos el nombre de la tabla y buscamos constraints realizamos clic derecho con el botoacuten secundario del mouse y escogemos New Constraint

Nos apareced la siguiente ventana

|

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 26

Realizamos clic en este botoacuten para poder editar la expresioacuten que queremos que tenga restricciones

En la ventana que nos aparece ponemos la expresioacuten deseada y realizamos clic en el botoacuten Ok

Para poder editar la tabla y verificar los cambios realizados buscamos en el explorador de objetos el nombre de la tabla realizamos clic derecho y escogemos la opcioacuten Edit Top 200 Rows

Y procedemos a ingresar datos para probarTambieacuten se puede imponer la integridad de datos restringiendo el uso de valores nulos en una columna (las palabras clave null o not null ) y proporcionando valores predeterminados para columnas (la claacuteusula default )

25 Diagramas de bases de datosLos diagramas de bases de datos se utiliza para visualizar las tablas graacuteficamente y para poder establecer las relaciones

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 27

Para crear un diagrama hacemos clic en el explorador de objetos hacemos clic en el nombre de la base de datos y escogemos Database Diagrams hacemos clic derecho escogemos new Database Diagrams

Nos aparece el siguiente mensaje realizamos un clic dentro del botoacuten Yes

Volvemos hacer clic derechos y volvemos a escoger New Data Base Diagram

Aparece la siguiente ventana en pantalla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 28

Seleccionamos todas y escogemos AddNos aparece la siguiente ventana

En el caso de tener una relacioacuten muchos a muchos debemos romper la relacioacuten con una tercera tabla para esto desde el mismo Database Diagram hacemos clic derecho en un lugar en blanco y escogemos new table llenos las columnas con los campos y tipos de datos respectivosDebemos tomar en cuenta que en las tablas a donde va la relacioacuten tiene que tener su respectiva llave foraacutenea y para poder establecer la relacioacuten

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 29

arrastramos desde el campo principal hacia la llave foraacutenea es decir de la tabla padre a la hijaQuedando las relaciones asiacute

Finalmente cerramos la base de datos nos aparece la siguiente ventana

pidiendo guardar el Database Diagram le demos un nombre y realizamos clic

en el botoacuten OK

252 Ejercicios

Los diagramas del ejercicio 1 y 2 del capiacutetulo anterior pasar al modelo

relacional en SQLSERVER 2008

Los ejercicios 5 y 6 los ejercicios de la prueba pasarlos a sql server

Transformar el siguiente modelo entidad relacioacuten al modelo relacional

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 30

CAPIacuteTULO III

Aplicar las diferentes sentencias y modos en lenguaje SQL

para tratamiento de la informacioacuten almacenada en las

diferentes tablas de la base de datos

31 Lenguaje de definicioacuten de datosLas sentencias DDL son CREATE ALTER y DROP Siempre se usan estas

sentencias junto con el tipo de objeto y el nombre del objeto

CREATE

Crea una base de datos o un objeto

Sintaxis

Create database nombre on grupo_base de datos filegroup

Ejemplo

USE mastergoIF DB_ID (Ncalificaciones) IS NULL BEGIN create database calificaciones on primary( name = calificaciones filename = Ccalificacionescalificacionesmdf

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 31

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 7: Base de Datos

133 IacutendicesUn iacutendice es un conjunto de valores clave el iacutendice guarda el elemento que desea indexar y la posicioacuten en la base de datosLos valores claves de los iacutendices pueden almacenar el contenido de una o varias columnas de una tabla134 VistasEs un conjunto de registros determinados de una o varias tablas se trabaja sobre ella como si fuera una tabla pero no lo es una vista no almacena datos si no que los extrae y permite trabajar con datos de varias tablas como si fuera una sola135 SQLSignifica lenguaje de consulta estructurado permite el acceso a bases de datos que explota la flexibilidad y potencia de los sistemas relacionales permitiendo gran variedad de operaciones14 Planificacioacuten ndash disentildeo141- Identificar el objetivo de la base de datosConsiste en un diaacutelogo intenso para averiguar expliacutecitamente que es lo que quiere el cliente142 Revisioacuten datos existentesUna gran herramienta para iniciar una aplicacioacuten es ver documetacioacuten sobre los datos existentes Hojas de caacutelculo albaranes facturas documentacioacuten en generalUna forma que ayuda mucho en la primera parte del desarrollo es mirar las necesidades del cliente iniciando por el final Por ejemplo si analizamos un informe de ventas que nos proporcione el cliente podemos ver mucha informacioacuten incluso la forma de relacionar las tablas Sabremos tambieacuten si estos datos hay que agruparlos por ejemplo por vendedor o por poblacioacuten Esto nos ayudaraacute a saber queacute campos y tablas necesitaremos para conseguir el objetivo final que se muestra en el informe del clienteCuanta maacutes informacioacuten se pueda recabar maacutes faacutecil seraacute dar los primeros pasos y acercarse desde el principio al disentildeo maacutes correcto posible Para evitar un trabajo suplementario y correcciones innecesarias hazlo bien la primera vez143 Modelado de la base de datos1431 Paso al SGBDLlave principal Es un campo o a una combinacioacuten de campos que identifica de forma uacutenica a cada fila de una tabla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 7

Llave foraacutenea Identifica una columna o grupo de columnas que se refiere a una columna o grupo de columnas en otra tablaRelaciones uno a unoEn una relacioacuten uno a uno una fila de la tabla A no puede tener maacutes de una fila coincidente en la tabla B y viceversa Se crea una relacioacuten uno a uno si las dos columnas relacionadas son claves principales Relaciones uno a variosUna relacioacuten uno a varios es el tipo maacutes habitual de relacioacuten En este tipo de relacioacuten una fila de la tabla A puede corresponderse con muchas filas de la tabla B pero una fila de la tabla B soacutelo puede corresponderse con otra de la tabla A Por ejemplo en las tablas (editoriales) y (tiacutetulos) se da una relacioacuten uno a varios una editorial publica muchos tiacutetulos pero a cada tiacutetulo le corresponde soacutelo una editorialEn una relacioacuten uno a varios solamente una de las columnas relacionadas es la clave principal o tiene una restriccioacuten uniqueRelaciones Varios a VariosEn una relacioacuten varios a varios una fila de la tabla A puede tener muchas filas coincidentes en la tabla B y viceversa Este tipo de relaciones se crea definiendo una tercera tabla denominada tabla de unioacuten cuya clave principal esteacute constituida por las claves externas de las tablas A y B Por ejemplo entre las tablas (autores) y (tiacutetulos) existiriacutea una relacioacuten varios a varios definida por una relacioacuten uno a varios entre cada una de ellas y la tabla (tiacutetuloautor) La clave principal de la tabla es la combinacioacuten de la columna au_id (la clave principal de la tabla autores) y la columna title_id (la clave principal de la tabla tiacutetulos)1432 Modelo entidad relacioacuten

1433 EjerciciosSupongamos que queremos disentildear una base de datos para una biblioteca y hemos conocido que eacutesta funciona de la siguiente formaEn la biblioteca se encuentra como es natural una serie de libros que los empleados solicitan a las editoriales Cuando un libro se recibe se le da de alta construyeacutendole una ficha para buacutesqueda por autor y otra ficha para buacutesqueda por tema En ambas fichas aparecen el tiacutetulo del libro el nombre del autor y su nacionalidad la editorial a la que pertenece la publicacioacuten el tema sobre el que trata el ISBN y la estanteriacutea de la biblioteca en la que se encuentra Un empleado puede solicitar un libro escribiendo una carta de

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 8

Entidades

Relaciones

Conectores

peticioacuten a la editorial correspondiente La direccioacuten a la que se a de dirigir la carta se encuentra en el archivo de editoriales Para acceder a los libros de la biblioteca es necesario la posesioacuten de un carnet que acredita a los distintos usuarios Este carnet se confecciona a cada persona la primera vez que intenta retirar un libro Cada usuario puede tener retirado un libro en un momento determinadoEn la biblioteca les gustariacutea disponer de un listado que se lanzariacutea al final de cada diacutea y en el que apareceriacutea para cada libro que se encuentra retirado el tiacutetulo el ISBN el autor y el nuacutemero de carnet nombre y la ceacutedula del usuario que lo mantiene retiradoCuando un usuario intente retirar un libro ha de presentar su carnet para que se tome nota de la retirada Si el libro que desea ha sido retirado por otro usuario se llama a eacuteste por teleacutefono indicaacutendole que hay otro usuario que desea el libro para que lo devuelva en caso de que no lo esteacute utilizandoMensualmente se confecciona un inventario actualizado donde se indica para cada libro el nombre el autor y el lugar de la biblioteca donde se encuentra

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 9telefononombrecedula

carnet

USUARIO

1

m 1

editado

DireccioacutenNombre

EDITORIAL

n

NACIONALIDNOMB

CODAUTO

AUTOR

TEMA

TITULO

ISBN

LIBRO Situado en

nuacutemerorororo

lugarnestanteria

ESTANTERIA

1

escrito

escrito

m

1

Problema 2 Artiacuteculos y encargosUna base de datos para una pequentildea empresa debe contener informacioacuten acerca de clientes artiacuteculos y pedidos Hasta el momento se registran los siguientes datos en documentos variosbull Para cada cliente Nuacutemero de cliente (uacutenico) Direcciones de enviacuteo (varias por cliente) Saldo Liacutemite de creacutedito (depende del cliente pero en ninguacuten caso debe superar los 3000000 pts) Descuentobull Para cada artiacuteculo Nuacutemero de artiacuteculo (uacutenico) Faacutebricas que lo distribuyen Existencias de ese artiacuteculo en cada faacutebrica Descripcioacuten del artiacuteculobull Para cada pedido Cada pedido tiene una cabecera y el cuerpo del pedido La cabecera estaacute formada por el nuacutemero de cliente direccioacuten de enviacuteo y fecha del pedido El cuerpo del pedido son varias liacuteneas en cada liacutenea se especifican el nuacutemero del artiacuteculo pedido y la cantidadAdemaacutes se ha determinado que se debe almacenar la informacioacuten de las faacutebricas Sin embargo dado el uso de distribuidores se usaraacute Nuacutemero de la faacutebrica (uacutenico) y Teleacutefono de contacto Y se desean ver cuaacutentos artiacuteculos (en total) provee la faacutebrica Tambieacuten por informacioacuten estrateacutegica se podriacutea incluir informacioacuten de faacutebricas alternativas respecto de las que ya fabrican artiacuteculos para esta empresaNota Una direccioacuten se entenderaacute como Nordm Calle Comuna y Ciudad Una fecha incluye horaSe pide hacer el diagrama ER para la base de datos que represente esta informacioacuten

Problema 2 () Sistema de ventas

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 10

Le contratan para hacer una BD que permita apoyar la gestioacuten de un sistema de ventas La empresa necesita llevar un control de proveedores clientes productos y ventasUn proveedor tiene un RUT nombre direccioacuten teleacutefono y paacutegina web Un cliente tambieacuten tiene RUT nombre direccioacuten pero puede tener varios teleacutefonos de contacto La direccioacuten se entiende por calle nuacutemero comuna y ciudadUn producto tiene un id uacutenico nombre precio actual stock y nombre del proveedor Ademaacutes seorganizan en categoriacuteas y cada producto va soacutelo en una categoriacutea Una categoriacutea tiene id nombre y descripcioacutenPor razones de contabilidad se debe registrar la informacioacuten de cada venta con un id fecha cliente descuento y monto final Ademaacutes se debe guardar el precio al momento de la venta la cantidad vendida y el monto total por el producto

Problema 3 CarreterasDisentildear un esquema ER que recoja la organizacioacuten de una base de datos para contener la informacioacuten sobre todas las carreteras del paiacutes sabiendo que se deben cumplir las siguientes especificaciones- Las carreteras estaacuten divididas en varias categoriacuteas (locales comerciales regionales nacionalesautoviacuteas etc)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 11

- Las carreteras se dividen en tramos Un tramo siempre pertenece a una uacutenica carretera y no puede cambiar de carretera- Un tramo puede pasar por varias comunas interesando conocer el Km de la carretera y la comuna donde empieza el tramo y en donde termina- Para los tramos que suponen principio o final de carretera interesa saber si es que la carreteraconcluye fiacutesicamente o es que confluye en otra carretera En este caso interesa conocer con queacutecarretera confluye y en queacute kiloacutemetro tramo y comunaProblema 4 Sistema de vuelosObtener el diagrama ER para un sistema de control de vuelos adaptado a las siguientes reglas degestioacuten (indicar las entidades interrelaciones etc que se deducen de cada una de las reglas)a) De cada aeropuerto se conoce su coacutedigo nombre ciudad y paiacutesb) En cada aeropuerto pueden tomar tierra diversos modelos de aviones (el modelo de un avioacutendetermina su capacidad es decir el nuacutemero de plazasc) En cada aeropuerto existe una coleccioacuten de programas de vuelo En cada programa de vuelo se indica el nuacutemero de vuelo liacutenea aeacuterea y diacuteas de la semana en que existe dicho vuelod) Cada programa de vuelo despega de un aeropuerto y aterriza en otroe) Los nuacutemeros de vuelo son uacutenicos para todo el mundof) En cada aeropuerto hay muacuteltiples aterrizajes y despegues Todos los aeropuertos contemplados estaacuten en activo es decir tienen alguacuten aterrizaje y alguacuten despegueg) Cada vuelo realizado pertenece a un cierto programa de vuelo Para cada vuelo se quiere conocer su fecha plazas vaciacuteas y el modelo de avioacuten utilizadoh) Algunos programas de vuelo incorporan escalas teacutecnicas intermedias entre los aeropuertos de salida y de llegada Se entiende por escala teacutecnica a un aterrizaje y despegue consecutivos sin altas oacute bajas de pasajerosi) De cada vuelo se quieren conocer las escalas teacutecnicas ordenadas asignaacutendole a cada una un nuacutemero de ordenPor ejemplo el programa de vuelo 555 de Iberia con vuelos los lunes y jueves despega de Barajas-Madrid-Espantildea y aterriza en Caudell-Sydney-Australia teniendo las siguientes escalas teacutecnicas 1- Los Pradintildeos-Sao Paulo-Brasil 2-El Emperador-Santiago-Chile y 3-Saint Kitts-Auckland-Nueva Zelanda1048576 iquestQue cambios se produciraacuten en el caso anterior si en las escalas pudiesen bajar o subir pasajerosExplicar coacutemo se podriacutea representar esta nueva situacioacutenProblema 5 () OlimpiacuteadasLas sedes oliacutempicas se dividen en complejos deportivos Los complejos deportivos se subdividen en aquellos en los que se desarrolla un uacutenico deporte y en los polideportivos Los complejos polideportivos tienen aacutereas designadas para cada deporte con un indicador de localizacioacuten (ejemplo centro esquina- NE etc) Un complejo tiene una localizacioacuten un jefe de organizacioacuten individual y un aacuterea total ocupada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 12

Los dos tipos de complejos (deporte uacutenico y polideportivo) tendraacuten diferentes tipos de informacioacuten Para cada tipo de sede se conservaraacute el nuacutemero de complejos junto con su presupuesto aproximadoCada complejo celebra una serie de eventos (ejemplo la pista del estadio puede celebrar muchascarreras distintas) Para cada evento estaacute prevista una fecha duracioacuten nuacutemero de participantes nuacutemero de comisarios Una lista de todos los comisarios se conservaraacute junto con la lista de los eventos en los que esteacute involucrado cada comisario ya sea cumpliendo la tarea de juez u observador Tanto para cada evento como para el mantenimiento se necesitaraacute cierto equipamiento (ejemplo arcos peacutertigas barras paralelas etc)Problema 6 Educando SAEn la Empresa Educando SA se lleva control de sus Bienes y Servicios El intereacutes primario es poder hacer que los Bienes se manejen de forma raacutepida y con el menor grado de error Para esto quien maneja la seccioacuten de Bienes y Suministros plantea las siguientes condiciones del negocio para la construccioacuten de una base de datos10485761048576La Seccioacuten estaacute dividida en tres (3) aacutereas COMPRAS ALMACEN INVENTARIO10485761048576El aacuterea de Compras funciona de la siguiente formao Recibe las solicitudes de compras de las diferentes aacutereas de la empresao Cada solicitud tiene un responsableo Cada solicitud es autorizada por el jefe del aacuterea y posteriormente por el DirectorFinancieroo Quien realiza una solicitud puede ser responsable de uno o varios centros de costos conla salvedad de que eacutel como empleado solo estaacute adscrito a unoo De la solicitud se debe diligenciar la siguiente informacioacuten Nuacutemero de la solicitud (consecutivo) Fecha Responsable (nombre y ceacutedula) Centro de Costos Rubro presupuestal del cual se descargaraacute la compra En cada solicitud se pueden discriminar uno o muchos iacutetems con la siguiente informacioacuten iacutetem nombre del bien cantidad solicitada unidad de medida del bien valor unitario y valor total Cada solicitud debe ser totalizadao Cada bien es identificado por un coacutedigo universal que es uacutenico y es de caraacutecter devolutivo (suministro) o un bien inmuebleo Una vez diligenciada la solicitud es remitida al aacuterea de compras para realizar sucorrespondiente cotizacioacuteno Las cotizaciones son realizadas con uno o varios proveedores de los bienes solicitadoso Una vez la cotizacioacuten definitiva estaacute lista se crea una orden contractual que maneja lasiguiente informacioacuten Nuacutemero de la orden contractual nit y nombre del proveedor al cualse le va a realizar la compra fecha de la orden monto total de la orden fecha de entrega Cada orden puede tener asociado uno o varios iacutetems de la solicitud o solicitudes que van a ser despachadas Cada iacutetem tiene la siguiente informacioacuten nombre del bien cantidad solicitada cantidad despachada unidad de medida del bien valor unitario y valor total

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 13

o La orden de compra es aprobada por el Director Financiero para que sea enviada alproveedor elegido10485761048576El aacuterea de Almaceacuten funciona de la siguiente formao Su funcioacuten principal es recepcionar los bienes que llegan de los proveedores ydistribuirlos a las correspondientes aacutereas que realizaron las solicitudes de compraso Cuando llega un proveedor mercanciacutea este hace una entrega fiacutesica de los bienes loscuales son comparados con la factura que este entrega y con la orden de compracorrespondiente Si esta accioacuten es correcta se registra una entrada de almaceacuten por cadafactura relacionada con la siguiente informacioacuten Nuacutemero de Entrada Fecha Nuacutemero defactura Proveedor Total Bienes Valor Total (los totales deben coincidir con los de lafactura) Adjunto a esta se discriminan los iacutetems recibidos con la siguiente informacioacutennombre del bien cantidad entregadao Cuando el almaceacuten decide despachar los bienes a las diferentes aacutereas solicitantesregistra cada una de las entregas en Salidas de Almaceacuten con la siguiente informacioacutenNuacutemero de Salida Empleado responsable del bien a entregar fecha de salida fecha deentrega Por cada entrega se detalla cada uno de los iacutetems con la siguiente informacioacutennombre del bien cantidad entregadao Una entrada de almaceacuten puede generar muchas salidas de almaceacuten por ejemplo Pueden ingresar 500 pacas de papel higieacutenico pero como se debe repartir entrevarias aacutereas cada una requiere de una salida de almaceacuten10485761048576El aacuterea de inventarios funciona de la siguiente formao Es la encargada de administrar y controlar la ubicacioacuten de los bienes dentro de laempresa por esto antes de que el bien salga del almaceacuten debe ser codificado a traveacutesde un coacutedigo uacutenico que lo haga identificable dentro de la empresao La ubicacioacuten del bien se identifica por la siguiente informacioacuten responsable del bienfecha de entrega direccioacuten del bien (ubicacioacuten)Disentildear modelo ER para la base de datosProblema 7 Torneo de Tenis Grand SlamEl sistema debe memorizar todos los encuentros que se han desarrollado desde que existe el torneo asiacute como las siguientes caracteriacutesticas de estosDescripcioacutenEl Grand Slam se compone de cuatro torneos anuales que se celebran en Gran Bretantildea Estados Unidos Francia y Australia En cada paiacutes se pueden

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 14

desarrollar en distintos lugares (p ej en EE UU Puede desarrollarse en Forest Hill o en Flashing Meadows)Cada partido tiene asociado un premio de consolacioacuten para el perdedor que dependeraacute de la fase en que se encuentre el torneo (p ej el perdedor de octavos de final puede ganar 5000 doacutelares) El ganador de a final recibiraacute el premio correspondiente al torneoCada torneo tiene cinco modalidades Individual masculino individual femenino dobles masculino dobles femenino y dobles mixtosTambieacuten hay que tener en cuenta la nacionalidad de un jugador de forma que acuteeste puede ser apaacutetrida o tener varias nacionalidadesResultados a considerarEl sistema debe dar respuesta a las siguientes preguntas1 Dado un antildeo y un torneo composicioacuten y resultado de los partidos2 Lista de aacuterbitros que participaron en el torneo3 Ganancias percibidas en premios por un jugador a lo largo del torneo4 Lista de entrenadores que han entrenado a un jugador a lo largo del torneo y fechas en las que lo hizo Ejemplos de acceso a la base de datos1 Connors gano Gerulaitis en Roland Garros en 1979 en cuartos de final en individuales masculinos por6-3 4-67-5 6-02 El sentildeor Wilkinson arbitro ese partido3 Alemania ha ganado dos veces las individuales masculinas de Wimbledon Borg ha ganado 2000000de doacutelares a lo largo de su participacioacuten en el Grand Slam4 El ganado de Roland Garros de 1987 ganoacute 20000 doacutelares5 Noah ha jugado cuatro veces en dobles mixtos con MandlikovaProblema 8Se desea crear un sitio web con informacioacuten referente a las peliacuteculas en cartel en las salas de un dudoso cine cercano a la plaza de armasDe cada peliacutecula se almacena una ficha con su tiacutetulo de distribucioacuten su tiacutetulo original su geacutenero el idioma origina si tiene subtiacutetulos en espantildeol o no los paises de origen el antildeo de la produccioacuten la url del sitio web de la peliacutecula la duracioacuten (en horas y minutos) la calificacioacuten (Apta todo puacuteblico+9 antildeos +15 antildeos+18 antildeos) fecha de estreno en Santiago un resumen y un identificador de la peliacutecula De cada peliacutecula interesa conocer la lista de directores y el reparto es decir para cada actor que trabaja el nombre de todos los personajes que interpretaAdemaacutes interesa disponer de informacioacuten sobre los directores y actores que trabajan en cada peliacutecula De ambos se conoce su nombre (que lo identifica) y su nacionalidad Ademaacutes se desea conocer la cantidad de peliacuteculas en las que dirigieron o actuaron Tenga en cuenta que hay personas que cumplen los dos rolesLos cines pueden tener maacutes de una sala y cada semana cada uno de los cines enviacutea la cartelera para dicha semana indicando de detalle de las funciones Para cada funcioacuten se conoce el diacutea de la semana y la hora de comienzo y obviamente la sala y la peliacutecula que exhibe De cada sala se sabe el nombre un nuacutemero que la identifica dentro del cine y la cantidad de butacas que posee De cada cine se conoce el nombre que lo identifica su direccioacuten y teleacutefono para consultas

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 15

Algunos cines cuentan con promociones Estas promociones dependen de la funcioacuten (Ej De lunes a jueves antes de las 18 50 de descuento en la sala tal del cine tal para la peliacutecula cualLa funcioacuten del lunes a las 14 para la peliacutecula tal en la sala cual no se cobra a los escolares con tuacutenica ) De cada promocioacuten se conoce una descripcioacuten y el descuento que aplicaAdemaacutes del resumen de la peliacutecula que se incluye en la ficha interesa mostrar la opinioacuten de las personas que vieron la peliacutecula De cada opinioacuten se conoce el nombre de la persona que la realiza su edad le fecha en que registroacute su opinioacuten la calificacioacuten que le dio a la peliacutecula (Obra Maestra Muy BuenaBuena Regular Mala) y el comentario propiamente dicho A cada opinioacuten se le asigna un nuacutemero que la identifica respecto de la peliacutecula sobre la cual opina

15 Normalizacioacuten151 Primera forma normalUna tabla estaacute en Primera Forma Normal si

Todos los atributos son atoacutemicos Un atributo es atoacutemico si los elementos del dominio son indivisibles miacutenimos

La tabla contiene una llave primaria uacutenica La llave primaria no contiene atributos nulos No debe existir variacioacuten en el nuacutemero de columnas Los Campos no llave deben identificarse por la llave (Dependencia

Funcional) Debe Existir una independencia del orden tanto de las filas como de las

columnas es decir si los datos cambian de orden no deben cambiar sus significados

Una tabla no puede tener muacuteltiples valores en cada columna Los datos son atoacutemicos (Si a cada valor de X le pertenece un valor de Y y viceversa)Esta forma normal elimina los valores repetidos dentro de una BD

152 Segunda Forma Normal (2FN)

Dependencia Funcional Una relacioacuten estaacute en 2FN si estaacute en 1FN y si los atributos que no forman parte de ninguna clave dependen de forma completa de la clave principal Es decir que no existen dependencias parciales (Todos los atributos que no son clave principal deben depender uacutenicamente de la clave principal)

En otras palabras podriacuteamos decir que la segunda forma normal estaacute basada en el concepto de dependencia completamente funcional Una dependencia funcional es completamente funcional si al eliminar los atributos A de X significa que la dependencia no es mantenida esto es que Una dependencia funcional es una dependencia parcial si hay algunos atributos que pueden ser eliminados

de X y la dependencia todaviacutea se mantiene esto es

Por ejemplo DNI ID_PROYECTO HORAS_TRABAJO (con el DNI de un empleado y el ID de un proyecto sabemos cuaacutentas horas de trabajo por semana trabaja un empleado en dicho proyecto) es completamente dependiente dado que ni DNI HORAS_TRABAJO ni ID_PROYECTO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 16

HORAS_TRABAJO mantienen la dependencia Sin embargo DNI ID_PROYECTO NOMBRE_EMPLEADO es parcialmente dependiente dado que DNI NOMBRE_EMPLEADO mantiene la dependencia

153 Tercera Forma Normal (3FN)

La tabla se encuentra en 3FN si es 2FN y si no existe ninguna dependencia funcional transitiva entre los atributos que no son clave

Un ejemplo de este concepto seriacutea que una dependencia funcional X-gtY en un esquema de relacioacuten R es una dependencia transitiva si hay un conjunto de atributos Z que no es un subconjunto de alguna clave de R donde se mantiene X-gtZ y Z-gtY

Por ejemplo la dependencia SSN-gtDMGRSSN es una dependencia transitiva en EMP_DEPT de la siguiente figura Decimos que la dependencia de DMGRSSN el atributo clave SSN es transitiva viacutea DNUMBER porque las dependencias SSNrarrDNUMBER y DNUMBERrarrDMGRSSN son mantenidas y DNUMBER no es un subconjunto de la clave de EMP_DEPT Intuitivamente podemos ver que la dependencia de DMGRSSN sobre DNUMBER es indeseable en EMP_DEPT dado que DNUMBER no es una clave de EMP_DEPT

Formalmente un esquema de relacion estaacute en 3 Forma Normal Elmasri-Navathe[2] si para toda dependencia funcional se cumple al menos una de las siguientes condiciones

es superllave o clave

es atributo primo de esto es si es miembro de alguna clave en

Ademaacutes el esquema debe cumplir necesariamente

Ejemplo

Id estudiante Ci Nombres Apellidos Curso Materia Descripicoacuten01 1803327418 Fransico

FabianCamacho Saltos

4 En Ingeacutes

02 10152465 Carlos Banabeti

Ruales Camacho

5 ES Espantildeol

03

1 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 17

2 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

Id Curso Curso01 Primero02 SegundoId Materia Materia Descripcioacuten01 En Ingleacutes02 MT Matemaacutetica

3 era forma normal

Iddescripcion DescripcioacutenIngleacutesMatemaacutetica

Dada la siguiente tabla normalizarlaIDcliente Ceacutedula Nombres Direccioacuten Proveedor Producto

16 Herramientas para la normalizacioacuten

A continuacioacuten se mencionan algunas herramientas para normalizar una base de datos mediante un proceso automatizado

CAPIacuteTULO IIRealizar diferentes tareas de disentildeo y planificacioacuten sobre la

estructura de tablas

21 Tabla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 18

Id Materia Materia01 En02 MT

Es un conjunto de datos ordenados en filas y columnas

22 Tipos de datossql_variant Puede usarse en columnas paraacutemetros variables y valores devueltos de funciones definidas por el usuariosql_variant permite que estos objetos de base de datos admitan valores de otros tipos de datosxml Capaz de almacenar documentos XML oacute fragmentos XML que es posible utilizar tanto en variables como en campos de tablas y que a diferencia de otros tipos de datos ofrece meacutetodos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 19

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 20

23 Creacioacuten de tablasAntes de aprender sobre la creacioacuten de tablas es necesario conocer los pasos para crear una base de datos en sql server 2008Para crear una base de datos en SQL Server 2008 debemos seguir los siguientes pasos1- Ingresar a SQLServer

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 21

2- En la ventana que nos aparece realizamos clic derecho en donde dice database

3- Nos aparece el siguiente menuacute hacemos clic donde dice New Database

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 22

4- Nos aparece la siguiente ventana

En donde dice Database Name le damos un nombre a la base de datos

5- Luego hacemos clic en

Nos aparece la siguiente ventana

Aquiacute tenemos dos opciones In percent nos permite que si sobrepasa el tamantildeo de la base de datos crezca en porcentajeIn Megabytes nos permite hacer que la base de datos crezca de 1 Megabyte en 1 megabyte si sobrepasa el tamantildeo y listoAhora para crear una tabla seguimos los siguientes pasos1- Hacemos clic en donde dice database buscamos el nombre de nuestra base de datos en la seccioacuten tables realizamos clic derecho con el botoacuten secundario del mouse

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 23

Nos aparece el siguiente menuacute

Hacemos clic en New Table

Y en donde dice Column Name vamos poniendo los campos de las bases de datos con su respectivo tipoAl final hacemos clic en donde estaacute el iacutecono de un diskette nos aparece una ventana pidiendo el nombre de la tabla le asignamos un nombre y realizamos clic en el botoacuten ok24 Creacioacuten de RestriccionesUna restriccioacuten es una condicioacuten que obliga el cumplimiento de ciertas condiciones en la base de datos Algunas no son determinadas por los usuarios sino que son inherentemente definidas por el simple hecho de que la base de datos sea relacional Algunas otras restricciones las puede definir el usuario por ejemplo usar un campo con valores enteros entre 1 y 10

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 24

Las restricciones proveen un meacutetodo de implementar reglas en la base de datos Las restricciones restringen los datos que pueden ser almacenados en las tablas Usualmente se definen usando expresiones que dan como resultado un valor booleano indicando si los datos satisfacen la restriccioacuten o noLas restricciones no son parte formal del modelo relacional pero son incluidas porque juegan el rol de organizar mejor los datos Las restricciones son muy discutidas junto con los conceptos relacionalesPueden crearse los siguientes tipos de restricciones Las restricciones unique y primary key exigen que no haya dos filas en una tabla con los mismos valores en las columnas especificadas Ademaacutes la restriccioacuten primary key requiere que no haya valores nulos en ninguna fila de la columna

241 Crear una restriccioacuten PRIMARY KEYPara crear una restriccioacuten Primary Key realizamos clic en el campo donde

queremos crear la restriccioacuten y luego realizamos clic en el iacutecono 242 Crear una restriccioacuten UNIQUEPara crear una restriccioacuten UNIQUE realizamos clic en el campo donde queremos crear dicha restriccioacuten y luego escogemos el menuacute Table Designe y luego en IndexesKeys

Nos aparece la siguiente ventana en donde dice Type escogemos Unique Key

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 25

Realizamos clic en close y guardamos la tabla

La integridad de referencia ( references ) exige que los datos insertados en columnas especiacuteficas ya tengan datos coincidentes en la tabla y columnas especificadas Las restricciones check limitan los valores de datos insertados en las columnas

243 Agregar una restriccioacuten CHECKRealizamos clic derecho dentro del explorador de objetos en la seccioacuten tables buscamos el nombre de la tabla y buscamos constraints realizamos clic derecho con el botoacuten secundario del mouse y escogemos New Constraint

Nos apareced la siguiente ventana

|

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 26

Realizamos clic en este botoacuten para poder editar la expresioacuten que queremos que tenga restricciones

En la ventana que nos aparece ponemos la expresioacuten deseada y realizamos clic en el botoacuten Ok

Para poder editar la tabla y verificar los cambios realizados buscamos en el explorador de objetos el nombre de la tabla realizamos clic derecho y escogemos la opcioacuten Edit Top 200 Rows

Y procedemos a ingresar datos para probarTambieacuten se puede imponer la integridad de datos restringiendo el uso de valores nulos en una columna (las palabras clave null o not null ) y proporcionando valores predeterminados para columnas (la claacuteusula default )

25 Diagramas de bases de datosLos diagramas de bases de datos se utiliza para visualizar las tablas graacuteficamente y para poder establecer las relaciones

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 27

Para crear un diagrama hacemos clic en el explorador de objetos hacemos clic en el nombre de la base de datos y escogemos Database Diagrams hacemos clic derecho escogemos new Database Diagrams

Nos aparece el siguiente mensaje realizamos un clic dentro del botoacuten Yes

Volvemos hacer clic derechos y volvemos a escoger New Data Base Diagram

Aparece la siguiente ventana en pantalla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 28

Seleccionamos todas y escogemos AddNos aparece la siguiente ventana

En el caso de tener una relacioacuten muchos a muchos debemos romper la relacioacuten con una tercera tabla para esto desde el mismo Database Diagram hacemos clic derecho en un lugar en blanco y escogemos new table llenos las columnas con los campos y tipos de datos respectivosDebemos tomar en cuenta que en las tablas a donde va la relacioacuten tiene que tener su respectiva llave foraacutenea y para poder establecer la relacioacuten

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 29

arrastramos desde el campo principal hacia la llave foraacutenea es decir de la tabla padre a la hijaQuedando las relaciones asiacute

Finalmente cerramos la base de datos nos aparece la siguiente ventana

pidiendo guardar el Database Diagram le demos un nombre y realizamos clic

en el botoacuten OK

252 Ejercicios

Los diagramas del ejercicio 1 y 2 del capiacutetulo anterior pasar al modelo

relacional en SQLSERVER 2008

Los ejercicios 5 y 6 los ejercicios de la prueba pasarlos a sql server

Transformar el siguiente modelo entidad relacioacuten al modelo relacional

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 30

CAPIacuteTULO III

Aplicar las diferentes sentencias y modos en lenguaje SQL

para tratamiento de la informacioacuten almacenada en las

diferentes tablas de la base de datos

31 Lenguaje de definicioacuten de datosLas sentencias DDL son CREATE ALTER y DROP Siempre se usan estas

sentencias junto con el tipo de objeto y el nombre del objeto

CREATE

Crea una base de datos o un objeto

Sintaxis

Create database nombre on grupo_base de datos filegroup

Ejemplo

USE mastergoIF DB_ID (Ncalificaciones) IS NULL BEGIN create database calificaciones on primary( name = calificaciones filename = Ccalificacionescalificacionesmdf

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 31

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 8: Base de Datos

Llave foraacutenea Identifica una columna o grupo de columnas que se refiere a una columna o grupo de columnas en otra tablaRelaciones uno a unoEn una relacioacuten uno a uno una fila de la tabla A no puede tener maacutes de una fila coincidente en la tabla B y viceversa Se crea una relacioacuten uno a uno si las dos columnas relacionadas son claves principales Relaciones uno a variosUna relacioacuten uno a varios es el tipo maacutes habitual de relacioacuten En este tipo de relacioacuten una fila de la tabla A puede corresponderse con muchas filas de la tabla B pero una fila de la tabla B soacutelo puede corresponderse con otra de la tabla A Por ejemplo en las tablas (editoriales) y (tiacutetulos) se da una relacioacuten uno a varios una editorial publica muchos tiacutetulos pero a cada tiacutetulo le corresponde soacutelo una editorialEn una relacioacuten uno a varios solamente una de las columnas relacionadas es la clave principal o tiene una restriccioacuten uniqueRelaciones Varios a VariosEn una relacioacuten varios a varios una fila de la tabla A puede tener muchas filas coincidentes en la tabla B y viceversa Este tipo de relaciones se crea definiendo una tercera tabla denominada tabla de unioacuten cuya clave principal esteacute constituida por las claves externas de las tablas A y B Por ejemplo entre las tablas (autores) y (tiacutetulos) existiriacutea una relacioacuten varios a varios definida por una relacioacuten uno a varios entre cada una de ellas y la tabla (tiacutetuloautor) La clave principal de la tabla es la combinacioacuten de la columna au_id (la clave principal de la tabla autores) y la columna title_id (la clave principal de la tabla tiacutetulos)1432 Modelo entidad relacioacuten

1433 EjerciciosSupongamos que queremos disentildear una base de datos para una biblioteca y hemos conocido que eacutesta funciona de la siguiente formaEn la biblioteca se encuentra como es natural una serie de libros que los empleados solicitan a las editoriales Cuando un libro se recibe se le da de alta construyeacutendole una ficha para buacutesqueda por autor y otra ficha para buacutesqueda por tema En ambas fichas aparecen el tiacutetulo del libro el nombre del autor y su nacionalidad la editorial a la que pertenece la publicacioacuten el tema sobre el que trata el ISBN y la estanteriacutea de la biblioteca en la que se encuentra Un empleado puede solicitar un libro escribiendo una carta de

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 8

Entidades

Relaciones

Conectores

peticioacuten a la editorial correspondiente La direccioacuten a la que se a de dirigir la carta se encuentra en el archivo de editoriales Para acceder a los libros de la biblioteca es necesario la posesioacuten de un carnet que acredita a los distintos usuarios Este carnet se confecciona a cada persona la primera vez que intenta retirar un libro Cada usuario puede tener retirado un libro en un momento determinadoEn la biblioteca les gustariacutea disponer de un listado que se lanzariacutea al final de cada diacutea y en el que apareceriacutea para cada libro que se encuentra retirado el tiacutetulo el ISBN el autor y el nuacutemero de carnet nombre y la ceacutedula del usuario que lo mantiene retiradoCuando un usuario intente retirar un libro ha de presentar su carnet para que se tome nota de la retirada Si el libro que desea ha sido retirado por otro usuario se llama a eacuteste por teleacutefono indicaacutendole que hay otro usuario que desea el libro para que lo devuelva en caso de que no lo esteacute utilizandoMensualmente se confecciona un inventario actualizado donde se indica para cada libro el nombre el autor y el lugar de la biblioteca donde se encuentra

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 9telefononombrecedula

carnet

USUARIO

1

m 1

editado

DireccioacutenNombre

EDITORIAL

n

NACIONALIDNOMB

CODAUTO

AUTOR

TEMA

TITULO

ISBN

LIBRO Situado en

nuacutemerorororo

lugarnestanteria

ESTANTERIA

1

escrito

escrito

m

1

Problema 2 Artiacuteculos y encargosUna base de datos para una pequentildea empresa debe contener informacioacuten acerca de clientes artiacuteculos y pedidos Hasta el momento se registran los siguientes datos en documentos variosbull Para cada cliente Nuacutemero de cliente (uacutenico) Direcciones de enviacuteo (varias por cliente) Saldo Liacutemite de creacutedito (depende del cliente pero en ninguacuten caso debe superar los 3000000 pts) Descuentobull Para cada artiacuteculo Nuacutemero de artiacuteculo (uacutenico) Faacutebricas que lo distribuyen Existencias de ese artiacuteculo en cada faacutebrica Descripcioacuten del artiacuteculobull Para cada pedido Cada pedido tiene una cabecera y el cuerpo del pedido La cabecera estaacute formada por el nuacutemero de cliente direccioacuten de enviacuteo y fecha del pedido El cuerpo del pedido son varias liacuteneas en cada liacutenea se especifican el nuacutemero del artiacuteculo pedido y la cantidadAdemaacutes se ha determinado que se debe almacenar la informacioacuten de las faacutebricas Sin embargo dado el uso de distribuidores se usaraacute Nuacutemero de la faacutebrica (uacutenico) y Teleacutefono de contacto Y se desean ver cuaacutentos artiacuteculos (en total) provee la faacutebrica Tambieacuten por informacioacuten estrateacutegica se podriacutea incluir informacioacuten de faacutebricas alternativas respecto de las que ya fabrican artiacuteculos para esta empresaNota Una direccioacuten se entenderaacute como Nordm Calle Comuna y Ciudad Una fecha incluye horaSe pide hacer el diagrama ER para la base de datos que represente esta informacioacuten

Problema 2 () Sistema de ventas

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 10

Le contratan para hacer una BD que permita apoyar la gestioacuten de un sistema de ventas La empresa necesita llevar un control de proveedores clientes productos y ventasUn proveedor tiene un RUT nombre direccioacuten teleacutefono y paacutegina web Un cliente tambieacuten tiene RUT nombre direccioacuten pero puede tener varios teleacutefonos de contacto La direccioacuten se entiende por calle nuacutemero comuna y ciudadUn producto tiene un id uacutenico nombre precio actual stock y nombre del proveedor Ademaacutes seorganizan en categoriacuteas y cada producto va soacutelo en una categoriacutea Una categoriacutea tiene id nombre y descripcioacutenPor razones de contabilidad se debe registrar la informacioacuten de cada venta con un id fecha cliente descuento y monto final Ademaacutes se debe guardar el precio al momento de la venta la cantidad vendida y el monto total por el producto

Problema 3 CarreterasDisentildear un esquema ER que recoja la organizacioacuten de una base de datos para contener la informacioacuten sobre todas las carreteras del paiacutes sabiendo que se deben cumplir las siguientes especificaciones- Las carreteras estaacuten divididas en varias categoriacuteas (locales comerciales regionales nacionalesautoviacuteas etc)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 11

- Las carreteras se dividen en tramos Un tramo siempre pertenece a una uacutenica carretera y no puede cambiar de carretera- Un tramo puede pasar por varias comunas interesando conocer el Km de la carretera y la comuna donde empieza el tramo y en donde termina- Para los tramos que suponen principio o final de carretera interesa saber si es que la carreteraconcluye fiacutesicamente o es que confluye en otra carretera En este caso interesa conocer con queacutecarretera confluye y en queacute kiloacutemetro tramo y comunaProblema 4 Sistema de vuelosObtener el diagrama ER para un sistema de control de vuelos adaptado a las siguientes reglas degestioacuten (indicar las entidades interrelaciones etc que se deducen de cada una de las reglas)a) De cada aeropuerto se conoce su coacutedigo nombre ciudad y paiacutesb) En cada aeropuerto pueden tomar tierra diversos modelos de aviones (el modelo de un avioacutendetermina su capacidad es decir el nuacutemero de plazasc) En cada aeropuerto existe una coleccioacuten de programas de vuelo En cada programa de vuelo se indica el nuacutemero de vuelo liacutenea aeacuterea y diacuteas de la semana en que existe dicho vuelod) Cada programa de vuelo despega de un aeropuerto y aterriza en otroe) Los nuacutemeros de vuelo son uacutenicos para todo el mundof) En cada aeropuerto hay muacuteltiples aterrizajes y despegues Todos los aeropuertos contemplados estaacuten en activo es decir tienen alguacuten aterrizaje y alguacuten despegueg) Cada vuelo realizado pertenece a un cierto programa de vuelo Para cada vuelo se quiere conocer su fecha plazas vaciacuteas y el modelo de avioacuten utilizadoh) Algunos programas de vuelo incorporan escalas teacutecnicas intermedias entre los aeropuertos de salida y de llegada Se entiende por escala teacutecnica a un aterrizaje y despegue consecutivos sin altas oacute bajas de pasajerosi) De cada vuelo se quieren conocer las escalas teacutecnicas ordenadas asignaacutendole a cada una un nuacutemero de ordenPor ejemplo el programa de vuelo 555 de Iberia con vuelos los lunes y jueves despega de Barajas-Madrid-Espantildea y aterriza en Caudell-Sydney-Australia teniendo las siguientes escalas teacutecnicas 1- Los Pradintildeos-Sao Paulo-Brasil 2-El Emperador-Santiago-Chile y 3-Saint Kitts-Auckland-Nueva Zelanda1048576 iquestQue cambios se produciraacuten en el caso anterior si en las escalas pudiesen bajar o subir pasajerosExplicar coacutemo se podriacutea representar esta nueva situacioacutenProblema 5 () OlimpiacuteadasLas sedes oliacutempicas se dividen en complejos deportivos Los complejos deportivos se subdividen en aquellos en los que se desarrolla un uacutenico deporte y en los polideportivos Los complejos polideportivos tienen aacutereas designadas para cada deporte con un indicador de localizacioacuten (ejemplo centro esquina- NE etc) Un complejo tiene una localizacioacuten un jefe de organizacioacuten individual y un aacuterea total ocupada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 12

Los dos tipos de complejos (deporte uacutenico y polideportivo) tendraacuten diferentes tipos de informacioacuten Para cada tipo de sede se conservaraacute el nuacutemero de complejos junto con su presupuesto aproximadoCada complejo celebra una serie de eventos (ejemplo la pista del estadio puede celebrar muchascarreras distintas) Para cada evento estaacute prevista una fecha duracioacuten nuacutemero de participantes nuacutemero de comisarios Una lista de todos los comisarios se conservaraacute junto con la lista de los eventos en los que esteacute involucrado cada comisario ya sea cumpliendo la tarea de juez u observador Tanto para cada evento como para el mantenimiento se necesitaraacute cierto equipamiento (ejemplo arcos peacutertigas barras paralelas etc)Problema 6 Educando SAEn la Empresa Educando SA se lleva control de sus Bienes y Servicios El intereacutes primario es poder hacer que los Bienes se manejen de forma raacutepida y con el menor grado de error Para esto quien maneja la seccioacuten de Bienes y Suministros plantea las siguientes condiciones del negocio para la construccioacuten de una base de datos10485761048576La Seccioacuten estaacute dividida en tres (3) aacutereas COMPRAS ALMACEN INVENTARIO10485761048576El aacuterea de Compras funciona de la siguiente formao Recibe las solicitudes de compras de las diferentes aacutereas de la empresao Cada solicitud tiene un responsableo Cada solicitud es autorizada por el jefe del aacuterea y posteriormente por el DirectorFinancieroo Quien realiza una solicitud puede ser responsable de uno o varios centros de costos conla salvedad de que eacutel como empleado solo estaacute adscrito a unoo De la solicitud se debe diligenciar la siguiente informacioacuten Nuacutemero de la solicitud (consecutivo) Fecha Responsable (nombre y ceacutedula) Centro de Costos Rubro presupuestal del cual se descargaraacute la compra En cada solicitud se pueden discriminar uno o muchos iacutetems con la siguiente informacioacuten iacutetem nombre del bien cantidad solicitada unidad de medida del bien valor unitario y valor total Cada solicitud debe ser totalizadao Cada bien es identificado por un coacutedigo universal que es uacutenico y es de caraacutecter devolutivo (suministro) o un bien inmuebleo Una vez diligenciada la solicitud es remitida al aacuterea de compras para realizar sucorrespondiente cotizacioacuteno Las cotizaciones son realizadas con uno o varios proveedores de los bienes solicitadoso Una vez la cotizacioacuten definitiva estaacute lista se crea una orden contractual que maneja lasiguiente informacioacuten Nuacutemero de la orden contractual nit y nombre del proveedor al cualse le va a realizar la compra fecha de la orden monto total de la orden fecha de entrega Cada orden puede tener asociado uno o varios iacutetems de la solicitud o solicitudes que van a ser despachadas Cada iacutetem tiene la siguiente informacioacuten nombre del bien cantidad solicitada cantidad despachada unidad de medida del bien valor unitario y valor total

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 13

o La orden de compra es aprobada por el Director Financiero para que sea enviada alproveedor elegido10485761048576El aacuterea de Almaceacuten funciona de la siguiente formao Su funcioacuten principal es recepcionar los bienes que llegan de los proveedores ydistribuirlos a las correspondientes aacutereas que realizaron las solicitudes de compraso Cuando llega un proveedor mercanciacutea este hace una entrega fiacutesica de los bienes loscuales son comparados con la factura que este entrega y con la orden de compracorrespondiente Si esta accioacuten es correcta se registra una entrada de almaceacuten por cadafactura relacionada con la siguiente informacioacuten Nuacutemero de Entrada Fecha Nuacutemero defactura Proveedor Total Bienes Valor Total (los totales deben coincidir con los de lafactura) Adjunto a esta se discriminan los iacutetems recibidos con la siguiente informacioacutennombre del bien cantidad entregadao Cuando el almaceacuten decide despachar los bienes a las diferentes aacutereas solicitantesregistra cada una de las entregas en Salidas de Almaceacuten con la siguiente informacioacutenNuacutemero de Salida Empleado responsable del bien a entregar fecha de salida fecha deentrega Por cada entrega se detalla cada uno de los iacutetems con la siguiente informacioacutennombre del bien cantidad entregadao Una entrada de almaceacuten puede generar muchas salidas de almaceacuten por ejemplo Pueden ingresar 500 pacas de papel higieacutenico pero como se debe repartir entrevarias aacutereas cada una requiere de una salida de almaceacuten10485761048576El aacuterea de inventarios funciona de la siguiente formao Es la encargada de administrar y controlar la ubicacioacuten de los bienes dentro de laempresa por esto antes de que el bien salga del almaceacuten debe ser codificado a traveacutesde un coacutedigo uacutenico que lo haga identificable dentro de la empresao La ubicacioacuten del bien se identifica por la siguiente informacioacuten responsable del bienfecha de entrega direccioacuten del bien (ubicacioacuten)Disentildear modelo ER para la base de datosProblema 7 Torneo de Tenis Grand SlamEl sistema debe memorizar todos los encuentros que se han desarrollado desde que existe el torneo asiacute como las siguientes caracteriacutesticas de estosDescripcioacutenEl Grand Slam se compone de cuatro torneos anuales que se celebran en Gran Bretantildea Estados Unidos Francia y Australia En cada paiacutes se pueden

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 14

desarrollar en distintos lugares (p ej en EE UU Puede desarrollarse en Forest Hill o en Flashing Meadows)Cada partido tiene asociado un premio de consolacioacuten para el perdedor que dependeraacute de la fase en que se encuentre el torneo (p ej el perdedor de octavos de final puede ganar 5000 doacutelares) El ganador de a final recibiraacute el premio correspondiente al torneoCada torneo tiene cinco modalidades Individual masculino individual femenino dobles masculino dobles femenino y dobles mixtosTambieacuten hay que tener en cuenta la nacionalidad de un jugador de forma que acuteeste puede ser apaacutetrida o tener varias nacionalidadesResultados a considerarEl sistema debe dar respuesta a las siguientes preguntas1 Dado un antildeo y un torneo composicioacuten y resultado de los partidos2 Lista de aacuterbitros que participaron en el torneo3 Ganancias percibidas en premios por un jugador a lo largo del torneo4 Lista de entrenadores que han entrenado a un jugador a lo largo del torneo y fechas en las que lo hizo Ejemplos de acceso a la base de datos1 Connors gano Gerulaitis en Roland Garros en 1979 en cuartos de final en individuales masculinos por6-3 4-67-5 6-02 El sentildeor Wilkinson arbitro ese partido3 Alemania ha ganado dos veces las individuales masculinas de Wimbledon Borg ha ganado 2000000de doacutelares a lo largo de su participacioacuten en el Grand Slam4 El ganado de Roland Garros de 1987 ganoacute 20000 doacutelares5 Noah ha jugado cuatro veces en dobles mixtos con MandlikovaProblema 8Se desea crear un sitio web con informacioacuten referente a las peliacuteculas en cartel en las salas de un dudoso cine cercano a la plaza de armasDe cada peliacutecula se almacena una ficha con su tiacutetulo de distribucioacuten su tiacutetulo original su geacutenero el idioma origina si tiene subtiacutetulos en espantildeol o no los paises de origen el antildeo de la produccioacuten la url del sitio web de la peliacutecula la duracioacuten (en horas y minutos) la calificacioacuten (Apta todo puacuteblico+9 antildeos +15 antildeos+18 antildeos) fecha de estreno en Santiago un resumen y un identificador de la peliacutecula De cada peliacutecula interesa conocer la lista de directores y el reparto es decir para cada actor que trabaja el nombre de todos los personajes que interpretaAdemaacutes interesa disponer de informacioacuten sobre los directores y actores que trabajan en cada peliacutecula De ambos se conoce su nombre (que lo identifica) y su nacionalidad Ademaacutes se desea conocer la cantidad de peliacuteculas en las que dirigieron o actuaron Tenga en cuenta que hay personas que cumplen los dos rolesLos cines pueden tener maacutes de una sala y cada semana cada uno de los cines enviacutea la cartelera para dicha semana indicando de detalle de las funciones Para cada funcioacuten se conoce el diacutea de la semana y la hora de comienzo y obviamente la sala y la peliacutecula que exhibe De cada sala se sabe el nombre un nuacutemero que la identifica dentro del cine y la cantidad de butacas que posee De cada cine se conoce el nombre que lo identifica su direccioacuten y teleacutefono para consultas

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 15

Algunos cines cuentan con promociones Estas promociones dependen de la funcioacuten (Ej De lunes a jueves antes de las 18 50 de descuento en la sala tal del cine tal para la peliacutecula cualLa funcioacuten del lunes a las 14 para la peliacutecula tal en la sala cual no se cobra a los escolares con tuacutenica ) De cada promocioacuten se conoce una descripcioacuten y el descuento que aplicaAdemaacutes del resumen de la peliacutecula que se incluye en la ficha interesa mostrar la opinioacuten de las personas que vieron la peliacutecula De cada opinioacuten se conoce el nombre de la persona que la realiza su edad le fecha en que registroacute su opinioacuten la calificacioacuten que le dio a la peliacutecula (Obra Maestra Muy BuenaBuena Regular Mala) y el comentario propiamente dicho A cada opinioacuten se le asigna un nuacutemero que la identifica respecto de la peliacutecula sobre la cual opina

15 Normalizacioacuten151 Primera forma normalUna tabla estaacute en Primera Forma Normal si

Todos los atributos son atoacutemicos Un atributo es atoacutemico si los elementos del dominio son indivisibles miacutenimos

La tabla contiene una llave primaria uacutenica La llave primaria no contiene atributos nulos No debe existir variacioacuten en el nuacutemero de columnas Los Campos no llave deben identificarse por la llave (Dependencia

Funcional) Debe Existir una independencia del orden tanto de las filas como de las

columnas es decir si los datos cambian de orden no deben cambiar sus significados

Una tabla no puede tener muacuteltiples valores en cada columna Los datos son atoacutemicos (Si a cada valor de X le pertenece un valor de Y y viceversa)Esta forma normal elimina los valores repetidos dentro de una BD

152 Segunda Forma Normal (2FN)

Dependencia Funcional Una relacioacuten estaacute en 2FN si estaacute en 1FN y si los atributos que no forman parte de ninguna clave dependen de forma completa de la clave principal Es decir que no existen dependencias parciales (Todos los atributos que no son clave principal deben depender uacutenicamente de la clave principal)

En otras palabras podriacuteamos decir que la segunda forma normal estaacute basada en el concepto de dependencia completamente funcional Una dependencia funcional es completamente funcional si al eliminar los atributos A de X significa que la dependencia no es mantenida esto es que Una dependencia funcional es una dependencia parcial si hay algunos atributos que pueden ser eliminados

de X y la dependencia todaviacutea se mantiene esto es

Por ejemplo DNI ID_PROYECTO HORAS_TRABAJO (con el DNI de un empleado y el ID de un proyecto sabemos cuaacutentas horas de trabajo por semana trabaja un empleado en dicho proyecto) es completamente dependiente dado que ni DNI HORAS_TRABAJO ni ID_PROYECTO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 16

HORAS_TRABAJO mantienen la dependencia Sin embargo DNI ID_PROYECTO NOMBRE_EMPLEADO es parcialmente dependiente dado que DNI NOMBRE_EMPLEADO mantiene la dependencia

153 Tercera Forma Normal (3FN)

La tabla se encuentra en 3FN si es 2FN y si no existe ninguna dependencia funcional transitiva entre los atributos que no son clave

Un ejemplo de este concepto seriacutea que una dependencia funcional X-gtY en un esquema de relacioacuten R es una dependencia transitiva si hay un conjunto de atributos Z que no es un subconjunto de alguna clave de R donde se mantiene X-gtZ y Z-gtY

Por ejemplo la dependencia SSN-gtDMGRSSN es una dependencia transitiva en EMP_DEPT de la siguiente figura Decimos que la dependencia de DMGRSSN el atributo clave SSN es transitiva viacutea DNUMBER porque las dependencias SSNrarrDNUMBER y DNUMBERrarrDMGRSSN son mantenidas y DNUMBER no es un subconjunto de la clave de EMP_DEPT Intuitivamente podemos ver que la dependencia de DMGRSSN sobre DNUMBER es indeseable en EMP_DEPT dado que DNUMBER no es una clave de EMP_DEPT

Formalmente un esquema de relacion estaacute en 3 Forma Normal Elmasri-Navathe[2] si para toda dependencia funcional se cumple al menos una de las siguientes condiciones

es superllave o clave

es atributo primo de esto es si es miembro de alguna clave en

Ademaacutes el esquema debe cumplir necesariamente

Ejemplo

Id estudiante Ci Nombres Apellidos Curso Materia Descripicoacuten01 1803327418 Fransico

FabianCamacho Saltos

4 En Ingeacutes

02 10152465 Carlos Banabeti

Ruales Camacho

5 ES Espantildeol

03

1 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 17

2 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

Id Curso Curso01 Primero02 SegundoId Materia Materia Descripcioacuten01 En Ingleacutes02 MT Matemaacutetica

3 era forma normal

Iddescripcion DescripcioacutenIngleacutesMatemaacutetica

Dada la siguiente tabla normalizarlaIDcliente Ceacutedula Nombres Direccioacuten Proveedor Producto

16 Herramientas para la normalizacioacuten

A continuacioacuten se mencionan algunas herramientas para normalizar una base de datos mediante un proceso automatizado

CAPIacuteTULO IIRealizar diferentes tareas de disentildeo y planificacioacuten sobre la

estructura de tablas

21 Tabla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 18

Id Materia Materia01 En02 MT

Es un conjunto de datos ordenados en filas y columnas

22 Tipos de datossql_variant Puede usarse en columnas paraacutemetros variables y valores devueltos de funciones definidas por el usuariosql_variant permite que estos objetos de base de datos admitan valores de otros tipos de datosxml Capaz de almacenar documentos XML oacute fragmentos XML que es posible utilizar tanto en variables como en campos de tablas y que a diferencia de otros tipos de datos ofrece meacutetodos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 19

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 20

23 Creacioacuten de tablasAntes de aprender sobre la creacioacuten de tablas es necesario conocer los pasos para crear una base de datos en sql server 2008Para crear una base de datos en SQL Server 2008 debemos seguir los siguientes pasos1- Ingresar a SQLServer

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 21

2- En la ventana que nos aparece realizamos clic derecho en donde dice database

3- Nos aparece el siguiente menuacute hacemos clic donde dice New Database

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 22

4- Nos aparece la siguiente ventana

En donde dice Database Name le damos un nombre a la base de datos

5- Luego hacemos clic en

Nos aparece la siguiente ventana

Aquiacute tenemos dos opciones In percent nos permite que si sobrepasa el tamantildeo de la base de datos crezca en porcentajeIn Megabytes nos permite hacer que la base de datos crezca de 1 Megabyte en 1 megabyte si sobrepasa el tamantildeo y listoAhora para crear una tabla seguimos los siguientes pasos1- Hacemos clic en donde dice database buscamos el nombre de nuestra base de datos en la seccioacuten tables realizamos clic derecho con el botoacuten secundario del mouse

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 23

Nos aparece el siguiente menuacute

Hacemos clic en New Table

Y en donde dice Column Name vamos poniendo los campos de las bases de datos con su respectivo tipoAl final hacemos clic en donde estaacute el iacutecono de un diskette nos aparece una ventana pidiendo el nombre de la tabla le asignamos un nombre y realizamos clic en el botoacuten ok24 Creacioacuten de RestriccionesUna restriccioacuten es una condicioacuten que obliga el cumplimiento de ciertas condiciones en la base de datos Algunas no son determinadas por los usuarios sino que son inherentemente definidas por el simple hecho de que la base de datos sea relacional Algunas otras restricciones las puede definir el usuario por ejemplo usar un campo con valores enteros entre 1 y 10

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 24

Las restricciones proveen un meacutetodo de implementar reglas en la base de datos Las restricciones restringen los datos que pueden ser almacenados en las tablas Usualmente se definen usando expresiones que dan como resultado un valor booleano indicando si los datos satisfacen la restriccioacuten o noLas restricciones no son parte formal del modelo relacional pero son incluidas porque juegan el rol de organizar mejor los datos Las restricciones son muy discutidas junto con los conceptos relacionalesPueden crearse los siguientes tipos de restricciones Las restricciones unique y primary key exigen que no haya dos filas en una tabla con los mismos valores en las columnas especificadas Ademaacutes la restriccioacuten primary key requiere que no haya valores nulos en ninguna fila de la columna

241 Crear una restriccioacuten PRIMARY KEYPara crear una restriccioacuten Primary Key realizamos clic en el campo donde

queremos crear la restriccioacuten y luego realizamos clic en el iacutecono 242 Crear una restriccioacuten UNIQUEPara crear una restriccioacuten UNIQUE realizamos clic en el campo donde queremos crear dicha restriccioacuten y luego escogemos el menuacute Table Designe y luego en IndexesKeys

Nos aparece la siguiente ventana en donde dice Type escogemos Unique Key

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 25

Realizamos clic en close y guardamos la tabla

La integridad de referencia ( references ) exige que los datos insertados en columnas especiacuteficas ya tengan datos coincidentes en la tabla y columnas especificadas Las restricciones check limitan los valores de datos insertados en las columnas

243 Agregar una restriccioacuten CHECKRealizamos clic derecho dentro del explorador de objetos en la seccioacuten tables buscamos el nombre de la tabla y buscamos constraints realizamos clic derecho con el botoacuten secundario del mouse y escogemos New Constraint

Nos apareced la siguiente ventana

|

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 26

Realizamos clic en este botoacuten para poder editar la expresioacuten que queremos que tenga restricciones

En la ventana que nos aparece ponemos la expresioacuten deseada y realizamos clic en el botoacuten Ok

Para poder editar la tabla y verificar los cambios realizados buscamos en el explorador de objetos el nombre de la tabla realizamos clic derecho y escogemos la opcioacuten Edit Top 200 Rows

Y procedemos a ingresar datos para probarTambieacuten se puede imponer la integridad de datos restringiendo el uso de valores nulos en una columna (las palabras clave null o not null ) y proporcionando valores predeterminados para columnas (la claacuteusula default )

25 Diagramas de bases de datosLos diagramas de bases de datos se utiliza para visualizar las tablas graacuteficamente y para poder establecer las relaciones

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 27

Para crear un diagrama hacemos clic en el explorador de objetos hacemos clic en el nombre de la base de datos y escogemos Database Diagrams hacemos clic derecho escogemos new Database Diagrams

Nos aparece el siguiente mensaje realizamos un clic dentro del botoacuten Yes

Volvemos hacer clic derechos y volvemos a escoger New Data Base Diagram

Aparece la siguiente ventana en pantalla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 28

Seleccionamos todas y escogemos AddNos aparece la siguiente ventana

En el caso de tener una relacioacuten muchos a muchos debemos romper la relacioacuten con una tercera tabla para esto desde el mismo Database Diagram hacemos clic derecho en un lugar en blanco y escogemos new table llenos las columnas con los campos y tipos de datos respectivosDebemos tomar en cuenta que en las tablas a donde va la relacioacuten tiene que tener su respectiva llave foraacutenea y para poder establecer la relacioacuten

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 29

arrastramos desde el campo principal hacia la llave foraacutenea es decir de la tabla padre a la hijaQuedando las relaciones asiacute

Finalmente cerramos la base de datos nos aparece la siguiente ventana

pidiendo guardar el Database Diagram le demos un nombre y realizamos clic

en el botoacuten OK

252 Ejercicios

Los diagramas del ejercicio 1 y 2 del capiacutetulo anterior pasar al modelo

relacional en SQLSERVER 2008

Los ejercicios 5 y 6 los ejercicios de la prueba pasarlos a sql server

Transformar el siguiente modelo entidad relacioacuten al modelo relacional

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 30

CAPIacuteTULO III

Aplicar las diferentes sentencias y modos en lenguaje SQL

para tratamiento de la informacioacuten almacenada en las

diferentes tablas de la base de datos

31 Lenguaje de definicioacuten de datosLas sentencias DDL son CREATE ALTER y DROP Siempre se usan estas

sentencias junto con el tipo de objeto y el nombre del objeto

CREATE

Crea una base de datos o un objeto

Sintaxis

Create database nombre on grupo_base de datos filegroup

Ejemplo

USE mastergoIF DB_ID (Ncalificaciones) IS NULL BEGIN create database calificaciones on primary( name = calificaciones filename = Ccalificacionescalificacionesmdf

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 31

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 9: Base de Datos

peticioacuten a la editorial correspondiente La direccioacuten a la que se a de dirigir la carta se encuentra en el archivo de editoriales Para acceder a los libros de la biblioteca es necesario la posesioacuten de un carnet que acredita a los distintos usuarios Este carnet se confecciona a cada persona la primera vez que intenta retirar un libro Cada usuario puede tener retirado un libro en un momento determinadoEn la biblioteca les gustariacutea disponer de un listado que se lanzariacutea al final de cada diacutea y en el que apareceriacutea para cada libro que se encuentra retirado el tiacutetulo el ISBN el autor y el nuacutemero de carnet nombre y la ceacutedula del usuario que lo mantiene retiradoCuando un usuario intente retirar un libro ha de presentar su carnet para que se tome nota de la retirada Si el libro que desea ha sido retirado por otro usuario se llama a eacuteste por teleacutefono indicaacutendole que hay otro usuario que desea el libro para que lo devuelva en caso de que no lo esteacute utilizandoMensualmente se confecciona un inventario actualizado donde se indica para cada libro el nombre el autor y el lugar de la biblioteca donde se encuentra

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 9telefononombrecedula

carnet

USUARIO

1

m 1

editado

DireccioacutenNombre

EDITORIAL

n

NACIONALIDNOMB

CODAUTO

AUTOR

TEMA

TITULO

ISBN

LIBRO Situado en

nuacutemerorororo

lugarnestanteria

ESTANTERIA

1

escrito

escrito

m

1

Problema 2 Artiacuteculos y encargosUna base de datos para una pequentildea empresa debe contener informacioacuten acerca de clientes artiacuteculos y pedidos Hasta el momento se registran los siguientes datos en documentos variosbull Para cada cliente Nuacutemero de cliente (uacutenico) Direcciones de enviacuteo (varias por cliente) Saldo Liacutemite de creacutedito (depende del cliente pero en ninguacuten caso debe superar los 3000000 pts) Descuentobull Para cada artiacuteculo Nuacutemero de artiacuteculo (uacutenico) Faacutebricas que lo distribuyen Existencias de ese artiacuteculo en cada faacutebrica Descripcioacuten del artiacuteculobull Para cada pedido Cada pedido tiene una cabecera y el cuerpo del pedido La cabecera estaacute formada por el nuacutemero de cliente direccioacuten de enviacuteo y fecha del pedido El cuerpo del pedido son varias liacuteneas en cada liacutenea se especifican el nuacutemero del artiacuteculo pedido y la cantidadAdemaacutes se ha determinado que se debe almacenar la informacioacuten de las faacutebricas Sin embargo dado el uso de distribuidores se usaraacute Nuacutemero de la faacutebrica (uacutenico) y Teleacutefono de contacto Y se desean ver cuaacutentos artiacuteculos (en total) provee la faacutebrica Tambieacuten por informacioacuten estrateacutegica se podriacutea incluir informacioacuten de faacutebricas alternativas respecto de las que ya fabrican artiacuteculos para esta empresaNota Una direccioacuten se entenderaacute como Nordm Calle Comuna y Ciudad Una fecha incluye horaSe pide hacer el diagrama ER para la base de datos que represente esta informacioacuten

Problema 2 () Sistema de ventas

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 10

Le contratan para hacer una BD que permita apoyar la gestioacuten de un sistema de ventas La empresa necesita llevar un control de proveedores clientes productos y ventasUn proveedor tiene un RUT nombre direccioacuten teleacutefono y paacutegina web Un cliente tambieacuten tiene RUT nombre direccioacuten pero puede tener varios teleacutefonos de contacto La direccioacuten se entiende por calle nuacutemero comuna y ciudadUn producto tiene un id uacutenico nombre precio actual stock y nombre del proveedor Ademaacutes seorganizan en categoriacuteas y cada producto va soacutelo en una categoriacutea Una categoriacutea tiene id nombre y descripcioacutenPor razones de contabilidad se debe registrar la informacioacuten de cada venta con un id fecha cliente descuento y monto final Ademaacutes se debe guardar el precio al momento de la venta la cantidad vendida y el monto total por el producto

Problema 3 CarreterasDisentildear un esquema ER que recoja la organizacioacuten de una base de datos para contener la informacioacuten sobre todas las carreteras del paiacutes sabiendo que se deben cumplir las siguientes especificaciones- Las carreteras estaacuten divididas en varias categoriacuteas (locales comerciales regionales nacionalesautoviacuteas etc)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 11

- Las carreteras se dividen en tramos Un tramo siempre pertenece a una uacutenica carretera y no puede cambiar de carretera- Un tramo puede pasar por varias comunas interesando conocer el Km de la carretera y la comuna donde empieza el tramo y en donde termina- Para los tramos que suponen principio o final de carretera interesa saber si es que la carreteraconcluye fiacutesicamente o es que confluye en otra carretera En este caso interesa conocer con queacutecarretera confluye y en queacute kiloacutemetro tramo y comunaProblema 4 Sistema de vuelosObtener el diagrama ER para un sistema de control de vuelos adaptado a las siguientes reglas degestioacuten (indicar las entidades interrelaciones etc que se deducen de cada una de las reglas)a) De cada aeropuerto se conoce su coacutedigo nombre ciudad y paiacutesb) En cada aeropuerto pueden tomar tierra diversos modelos de aviones (el modelo de un avioacutendetermina su capacidad es decir el nuacutemero de plazasc) En cada aeropuerto existe una coleccioacuten de programas de vuelo En cada programa de vuelo se indica el nuacutemero de vuelo liacutenea aeacuterea y diacuteas de la semana en que existe dicho vuelod) Cada programa de vuelo despega de un aeropuerto y aterriza en otroe) Los nuacutemeros de vuelo son uacutenicos para todo el mundof) En cada aeropuerto hay muacuteltiples aterrizajes y despegues Todos los aeropuertos contemplados estaacuten en activo es decir tienen alguacuten aterrizaje y alguacuten despegueg) Cada vuelo realizado pertenece a un cierto programa de vuelo Para cada vuelo se quiere conocer su fecha plazas vaciacuteas y el modelo de avioacuten utilizadoh) Algunos programas de vuelo incorporan escalas teacutecnicas intermedias entre los aeropuertos de salida y de llegada Se entiende por escala teacutecnica a un aterrizaje y despegue consecutivos sin altas oacute bajas de pasajerosi) De cada vuelo se quieren conocer las escalas teacutecnicas ordenadas asignaacutendole a cada una un nuacutemero de ordenPor ejemplo el programa de vuelo 555 de Iberia con vuelos los lunes y jueves despega de Barajas-Madrid-Espantildea y aterriza en Caudell-Sydney-Australia teniendo las siguientes escalas teacutecnicas 1- Los Pradintildeos-Sao Paulo-Brasil 2-El Emperador-Santiago-Chile y 3-Saint Kitts-Auckland-Nueva Zelanda1048576 iquestQue cambios se produciraacuten en el caso anterior si en las escalas pudiesen bajar o subir pasajerosExplicar coacutemo se podriacutea representar esta nueva situacioacutenProblema 5 () OlimpiacuteadasLas sedes oliacutempicas se dividen en complejos deportivos Los complejos deportivos se subdividen en aquellos en los que se desarrolla un uacutenico deporte y en los polideportivos Los complejos polideportivos tienen aacutereas designadas para cada deporte con un indicador de localizacioacuten (ejemplo centro esquina- NE etc) Un complejo tiene una localizacioacuten un jefe de organizacioacuten individual y un aacuterea total ocupada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 12

Los dos tipos de complejos (deporte uacutenico y polideportivo) tendraacuten diferentes tipos de informacioacuten Para cada tipo de sede se conservaraacute el nuacutemero de complejos junto con su presupuesto aproximadoCada complejo celebra una serie de eventos (ejemplo la pista del estadio puede celebrar muchascarreras distintas) Para cada evento estaacute prevista una fecha duracioacuten nuacutemero de participantes nuacutemero de comisarios Una lista de todos los comisarios se conservaraacute junto con la lista de los eventos en los que esteacute involucrado cada comisario ya sea cumpliendo la tarea de juez u observador Tanto para cada evento como para el mantenimiento se necesitaraacute cierto equipamiento (ejemplo arcos peacutertigas barras paralelas etc)Problema 6 Educando SAEn la Empresa Educando SA se lleva control de sus Bienes y Servicios El intereacutes primario es poder hacer que los Bienes se manejen de forma raacutepida y con el menor grado de error Para esto quien maneja la seccioacuten de Bienes y Suministros plantea las siguientes condiciones del negocio para la construccioacuten de una base de datos10485761048576La Seccioacuten estaacute dividida en tres (3) aacutereas COMPRAS ALMACEN INVENTARIO10485761048576El aacuterea de Compras funciona de la siguiente formao Recibe las solicitudes de compras de las diferentes aacutereas de la empresao Cada solicitud tiene un responsableo Cada solicitud es autorizada por el jefe del aacuterea y posteriormente por el DirectorFinancieroo Quien realiza una solicitud puede ser responsable de uno o varios centros de costos conla salvedad de que eacutel como empleado solo estaacute adscrito a unoo De la solicitud se debe diligenciar la siguiente informacioacuten Nuacutemero de la solicitud (consecutivo) Fecha Responsable (nombre y ceacutedula) Centro de Costos Rubro presupuestal del cual se descargaraacute la compra En cada solicitud se pueden discriminar uno o muchos iacutetems con la siguiente informacioacuten iacutetem nombre del bien cantidad solicitada unidad de medida del bien valor unitario y valor total Cada solicitud debe ser totalizadao Cada bien es identificado por un coacutedigo universal que es uacutenico y es de caraacutecter devolutivo (suministro) o un bien inmuebleo Una vez diligenciada la solicitud es remitida al aacuterea de compras para realizar sucorrespondiente cotizacioacuteno Las cotizaciones son realizadas con uno o varios proveedores de los bienes solicitadoso Una vez la cotizacioacuten definitiva estaacute lista se crea una orden contractual que maneja lasiguiente informacioacuten Nuacutemero de la orden contractual nit y nombre del proveedor al cualse le va a realizar la compra fecha de la orden monto total de la orden fecha de entrega Cada orden puede tener asociado uno o varios iacutetems de la solicitud o solicitudes que van a ser despachadas Cada iacutetem tiene la siguiente informacioacuten nombre del bien cantidad solicitada cantidad despachada unidad de medida del bien valor unitario y valor total

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 13

o La orden de compra es aprobada por el Director Financiero para que sea enviada alproveedor elegido10485761048576El aacuterea de Almaceacuten funciona de la siguiente formao Su funcioacuten principal es recepcionar los bienes que llegan de los proveedores ydistribuirlos a las correspondientes aacutereas que realizaron las solicitudes de compraso Cuando llega un proveedor mercanciacutea este hace una entrega fiacutesica de los bienes loscuales son comparados con la factura que este entrega y con la orden de compracorrespondiente Si esta accioacuten es correcta se registra una entrada de almaceacuten por cadafactura relacionada con la siguiente informacioacuten Nuacutemero de Entrada Fecha Nuacutemero defactura Proveedor Total Bienes Valor Total (los totales deben coincidir con los de lafactura) Adjunto a esta se discriminan los iacutetems recibidos con la siguiente informacioacutennombre del bien cantidad entregadao Cuando el almaceacuten decide despachar los bienes a las diferentes aacutereas solicitantesregistra cada una de las entregas en Salidas de Almaceacuten con la siguiente informacioacutenNuacutemero de Salida Empleado responsable del bien a entregar fecha de salida fecha deentrega Por cada entrega se detalla cada uno de los iacutetems con la siguiente informacioacutennombre del bien cantidad entregadao Una entrada de almaceacuten puede generar muchas salidas de almaceacuten por ejemplo Pueden ingresar 500 pacas de papel higieacutenico pero como se debe repartir entrevarias aacutereas cada una requiere de una salida de almaceacuten10485761048576El aacuterea de inventarios funciona de la siguiente formao Es la encargada de administrar y controlar la ubicacioacuten de los bienes dentro de laempresa por esto antes de que el bien salga del almaceacuten debe ser codificado a traveacutesde un coacutedigo uacutenico que lo haga identificable dentro de la empresao La ubicacioacuten del bien se identifica por la siguiente informacioacuten responsable del bienfecha de entrega direccioacuten del bien (ubicacioacuten)Disentildear modelo ER para la base de datosProblema 7 Torneo de Tenis Grand SlamEl sistema debe memorizar todos los encuentros que se han desarrollado desde que existe el torneo asiacute como las siguientes caracteriacutesticas de estosDescripcioacutenEl Grand Slam se compone de cuatro torneos anuales que se celebran en Gran Bretantildea Estados Unidos Francia y Australia En cada paiacutes se pueden

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 14

desarrollar en distintos lugares (p ej en EE UU Puede desarrollarse en Forest Hill o en Flashing Meadows)Cada partido tiene asociado un premio de consolacioacuten para el perdedor que dependeraacute de la fase en que se encuentre el torneo (p ej el perdedor de octavos de final puede ganar 5000 doacutelares) El ganador de a final recibiraacute el premio correspondiente al torneoCada torneo tiene cinco modalidades Individual masculino individual femenino dobles masculino dobles femenino y dobles mixtosTambieacuten hay que tener en cuenta la nacionalidad de un jugador de forma que acuteeste puede ser apaacutetrida o tener varias nacionalidadesResultados a considerarEl sistema debe dar respuesta a las siguientes preguntas1 Dado un antildeo y un torneo composicioacuten y resultado de los partidos2 Lista de aacuterbitros que participaron en el torneo3 Ganancias percibidas en premios por un jugador a lo largo del torneo4 Lista de entrenadores que han entrenado a un jugador a lo largo del torneo y fechas en las que lo hizo Ejemplos de acceso a la base de datos1 Connors gano Gerulaitis en Roland Garros en 1979 en cuartos de final en individuales masculinos por6-3 4-67-5 6-02 El sentildeor Wilkinson arbitro ese partido3 Alemania ha ganado dos veces las individuales masculinas de Wimbledon Borg ha ganado 2000000de doacutelares a lo largo de su participacioacuten en el Grand Slam4 El ganado de Roland Garros de 1987 ganoacute 20000 doacutelares5 Noah ha jugado cuatro veces en dobles mixtos con MandlikovaProblema 8Se desea crear un sitio web con informacioacuten referente a las peliacuteculas en cartel en las salas de un dudoso cine cercano a la plaza de armasDe cada peliacutecula se almacena una ficha con su tiacutetulo de distribucioacuten su tiacutetulo original su geacutenero el idioma origina si tiene subtiacutetulos en espantildeol o no los paises de origen el antildeo de la produccioacuten la url del sitio web de la peliacutecula la duracioacuten (en horas y minutos) la calificacioacuten (Apta todo puacuteblico+9 antildeos +15 antildeos+18 antildeos) fecha de estreno en Santiago un resumen y un identificador de la peliacutecula De cada peliacutecula interesa conocer la lista de directores y el reparto es decir para cada actor que trabaja el nombre de todos los personajes que interpretaAdemaacutes interesa disponer de informacioacuten sobre los directores y actores que trabajan en cada peliacutecula De ambos se conoce su nombre (que lo identifica) y su nacionalidad Ademaacutes se desea conocer la cantidad de peliacuteculas en las que dirigieron o actuaron Tenga en cuenta que hay personas que cumplen los dos rolesLos cines pueden tener maacutes de una sala y cada semana cada uno de los cines enviacutea la cartelera para dicha semana indicando de detalle de las funciones Para cada funcioacuten se conoce el diacutea de la semana y la hora de comienzo y obviamente la sala y la peliacutecula que exhibe De cada sala se sabe el nombre un nuacutemero que la identifica dentro del cine y la cantidad de butacas que posee De cada cine se conoce el nombre que lo identifica su direccioacuten y teleacutefono para consultas

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 15

Algunos cines cuentan con promociones Estas promociones dependen de la funcioacuten (Ej De lunes a jueves antes de las 18 50 de descuento en la sala tal del cine tal para la peliacutecula cualLa funcioacuten del lunes a las 14 para la peliacutecula tal en la sala cual no se cobra a los escolares con tuacutenica ) De cada promocioacuten se conoce una descripcioacuten y el descuento que aplicaAdemaacutes del resumen de la peliacutecula que se incluye en la ficha interesa mostrar la opinioacuten de las personas que vieron la peliacutecula De cada opinioacuten se conoce el nombre de la persona que la realiza su edad le fecha en que registroacute su opinioacuten la calificacioacuten que le dio a la peliacutecula (Obra Maestra Muy BuenaBuena Regular Mala) y el comentario propiamente dicho A cada opinioacuten se le asigna un nuacutemero que la identifica respecto de la peliacutecula sobre la cual opina

15 Normalizacioacuten151 Primera forma normalUna tabla estaacute en Primera Forma Normal si

Todos los atributos son atoacutemicos Un atributo es atoacutemico si los elementos del dominio son indivisibles miacutenimos

La tabla contiene una llave primaria uacutenica La llave primaria no contiene atributos nulos No debe existir variacioacuten en el nuacutemero de columnas Los Campos no llave deben identificarse por la llave (Dependencia

Funcional) Debe Existir una independencia del orden tanto de las filas como de las

columnas es decir si los datos cambian de orden no deben cambiar sus significados

Una tabla no puede tener muacuteltiples valores en cada columna Los datos son atoacutemicos (Si a cada valor de X le pertenece un valor de Y y viceversa)Esta forma normal elimina los valores repetidos dentro de una BD

152 Segunda Forma Normal (2FN)

Dependencia Funcional Una relacioacuten estaacute en 2FN si estaacute en 1FN y si los atributos que no forman parte de ninguna clave dependen de forma completa de la clave principal Es decir que no existen dependencias parciales (Todos los atributos que no son clave principal deben depender uacutenicamente de la clave principal)

En otras palabras podriacuteamos decir que la segunda forma normal estaacute basada en el concepto de dependencia completamente funcional Una dependencia funcional es completamente funcional si al eliminar los atributos A de X significa que la dependencia no es mantenida esto es que Una dependencia funcional es una dependencia parcial si hay algunos atributos que pueden ser eliminados

de X y la dependencia todaviacutea se mantiene esto es

Por ejemplo DNI ID_PROYECTO HORAS_TRABAJO (con el DNI de un empleado y el ID de un proyecto sabemos cuaacutentas horas de trabajo por semana trabaja un empleado en dicho proyecto) es completamente dependiente dado que ni DNI HORAS_TRABAJO ni ID_PROYECTO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 16

HORAS_TRABAJO mantienen la dependencia Sin embargo DNI ID_PROYECTO NOMBRE_EMPLEADO es parcialmente dependiente dado que DNI NOMBRE_EMPLEADO mantiene la dependencia

153 Tercera Forma Normal (3FN)

La tabla se encuentra en 3FN si es 2FN y si no existe ninguna dependencia funcional transitiva entre los atributos que no son clave

Un ejemplo de este concepto seriacutea que una dependencia funcional X-gtY en un esquema de relacioacuten R es una dependencia transitiva si hay un conjunto de atributos Z que no es un subconjunto de alguna clave de R donde se mantiene X-gtZ y Z-gtY

Por ejemplo la dependencia SSN-gtDMGRSSN es una dependencia transitiva en EMP_DEPT de la siguiente figura Decimos que la dependencia de DMGRSSN el atributo clave SSN es transitiva viacutea DNUMBER porque las dependencias SSNrarrDNUMBER y DNUMBERrarrDMGRSSN son mantenidas y DNUMBER no es un subconjunto de la clave de EMP_DEPT Intuitivamente podemos ver que la dependencia de DMGRSSN sobre DNUMBER es indeseable en EMP_DEPT dado que DNUMBER no es una clave de EMP_DEPT

Formalmente un esquema de relacion estaacute en 3 Forma Normal Elmasri-Navathe[2] si para toda dependencia funcional se cumple al menos una de las siguientes condiciones

es superllave o clave

es atributo primo de esto es si es miembro de alguna clave en

Ademaacutes el esquema debe cumplir necesariamente

Ejemplo

Id estudiante Ci Nombres Apellidos Curso Materia Descripicoacuten01 1803327418 Fransico

FabianCamacho Saltos

4 En Ingeacutes

02 10152465 Carlos Banabeti

Ruales Camacho

5 ES Espantildeol

03

1 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 17

2 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

Id Curso Curso01 Primero02 SegundoId Materia Materia Descripcioacuten01 En Ingleacutes02 MT Matemaacutetica

3 era forma normal

Iddescripcion DescripcioacutenIngleacutesMatemaacutetica

Dada la siguiente tabla normalizarlaIDcliente Ceacutedula Nombres Direccioacuten Proveedor Producto

16 Herramientas para la normalizacioacuten

A continuacioacuten se mencionan algunas herramientas para normalizar una base de datos mediante un proceso automatizado

CAPIacuteTULO IIRealizar diferentes tareas de disentildeo y planificacioacuten sobre la

estructura de tablas

21 Tabla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 18

Id Materia Materia01 En02 MT

Es un conjunto de datos ordenados en filas y columnas

22 Tipos de datossql_variant Puede usarse en columnas paraacutemetros variables y valores devueltos de funciones definidas por el usuariosql_variant permite que estos objetos de base de datos admitan valores de otros tipos de datosxml Capaz de almacenar documentos XML oacute fragmentos XML que es posible utilizar tanto en variables como en campos de tablas y que a diferencia de otros tipos de datos ofrece meacutetodos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 19

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 20

23 Creacioacuten de tablasAntes de aprender sobre la creacioacuten de tablas es necesario conocer los pasos para crear una base de datos en sql server 2008Para crear una base de datos en SQL Server 2008 debemos seguir los siguientes pasos1- Ingresar a SQLServer

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 21

2- En la ventana que nos aparece realizamos clic derecho en donde dice database

3- Nos aparece el siguiente menuacute hacemos clic donde dice New Database

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 22

4- Nos aparece la siguiente ventana

En donde dice Database Name le damos un nombre a la base de datos

5- Luego hacemos clic en

Nos aparece la siguiente ventana

Aquiacute tenemos dos opciones In percent nos permite que si sobrepasa el tamantildeo de la base de datos crezca en porcentajeIn Megabytes nos permite hacer que la base de datos crezca de 1 Megabyte en 1 megabyte si sobrepasa el tamantildeo y listoAhora para crear una tabla seguimos los siguientes pasos1- Hacemos clic en donde dice database buscamos el nombre de nuestra base de datos en la seccioacuten tables realizamos clic derecho con el botoacuten secundario del mouse

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 23

Nos aparece el siguiente menuacute

Hacemos clic en New Table

Y en donde dice Column Name vamos poniendo los campos de las bases de datos con su respectivo tipoAl final hacemos clic en donde estaacute el iacutecono de un diskette nos aparece una ventana pidiendo el nombre de la tabla le asignamos un nombre y realizamos clic en el botoacuten ok24 Creacioacuten de RestriccionesUna restriccioacuten es una condicioacuten que obliga el cumplimiento de ciertas condiciones en la base de datos Algunas no son determinadas por los usuarios sino que son inherentemente definidas por el simple hecho de que la base de datos sea relacional Algunas otras restricciones las puede definir el usuario por ejemplo usar un campo con valores enteros entre 1 y 10

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 24

Las restricciones proveen un meacutetodo de implementar reglas en la base de datos Las restricciones restringen los datos que pueden ser almacenados en las tablas Usualmente se definen usando expresiones que dan como resultado un valor booleano indicando si los datos satisfacen la restriccioacuten o noLas restricciones no son parte formal del modelo relacional pero son incluidas porque juegan el rol de organizar mejor los datos Las restricciones son muy discutidas junto con los conceptos relacionalesPueden crearse los siguientes tipos de restricciones Las restricciones unique y primary key exigen que no haya dos filas en una tabla con los mismos valores en las columnas especificadas Ademaacutes la restriccioacuten primary key requiere que no haya valores nulos en ninguna fila de la columna

241 Crear una restriccioacuten PRIMARY KEYPara crear una restriccioacuten Primary Key realizamos clic en el campo donde

queremos crear la restriccioacuten y luego realizamos clic en el iacutecono 242 Crear una restriccioacuten UNIQUEPara crear una restriccioacuten UNIQUE realizamos clic en el campo donde queremos crear dicha restriccioacuten y luego escogemos el menuacute Table Designe y luego en IndexesKeys

Nos aparece la siguiente ventana en donde dice Type escogemos Unique Key

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 25

Realizamos clic en close y guardamos la tabla

La integridad de referencia ( references ) exige que los datos insertados en columnas especiacuteficas ya tengan datos coincidentes en la tabla y columnas especificadas Las restricciones check limitan los valores de datos insertados en las columnas

243 Agregar una restriccioacuten CHECKRealizamos clic derecho dentro del explorador de objetos en la seccioacuten tables buscamos el nombre de la tabla y buscamos constraints realizamos clic derecho con el botoacuten secundario del mouse y escogemos New Constraint

Nos apareced la siguiente ventana

|

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 26

Realizamos clic en este botoacuten para poder editar la expresioacuten que queremos que tenga restricciones

En la ventana que nos aparece ponemos la expresioacuten deseada y realizamos clic en el botoacuten Ok

Para poder editar la tabla y verificar los cambios realizados buscamos en el explorador de objetos el nombre de la tabla realizamos clic derecho y escogemos la opcioacuten Edit Top 200 Rows

Y procedemos a ingresar datos para probarTambieacuten se puede imponer la integridad de datos restringiendo el uso de valores nulos en una columna (las palabras clave null o not null ) y proporcionando valores predeterminados para columnas (la claacuteusula default )

25 Diagramas de bases de datosLos diagramas de bases de datos se utiliza para visualizar las tablas graacuteficamente y para poder establecer las relaciones

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 27

Para crear un diagrama hacemos clic en el explorador de objetos hacemos clic en el nombre de la base de datos y escogemos Database Diagrams hacemos clic derecho escogemos new Database Diagrams

Nos aparece el siguiente mensaje realizamos un clic dentro del botoacuten Yes

Volvemos hacer clic derechos y volvemos a escoger New Data Base Diagram

Aparece la siguiente ventana en pantalla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 28

Seleccionamos todas y escogemos AddNos aparece la siguiente ventana

En el caso de tener una relacioacuten muchos a muchos debemos romper la relacioacuten con una tercera tabla para esto desde el mismo Database Diagram hacemos clic derecho en un lugar en blanco y escogemos new table llenos las columnas con los campos y tipos de datos respectivosDebemos tomar en cuenta que en las tablas a donde va la relacioacuten tiene que tener su respectiva llave foraacutenea y para poder establecer la relacioacuten

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 29

arrastramos desde el campo principal hacia la llave foraacutenea es decir de la tabla padre a la hijaQuedando las relaciones asiacute

Finalmente cerramos la base de datos nos aparece la siguiente ventana

pidiendo guardar el Database Diagram le demos un nombre y realizamos clic

en el botoacuten OK

252 Ejercicios

Los diagramas del ejercicio 1 y 2 del capiacutetulo anterior pasar al modelo

relacional en SQLSERVER 2008

Los ejercicios 5 y 6 los ejercicios de la prueba pasarlos a sql server

Transformar el siguiente modelo entidad relacioacuten al modelo relacional

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 30

CAPIacuteTULO III

Aplicar las diferentes sentencias y modos en lenguaje SQL

para tratamiento de la informacioacuten almacenada en las

diferentes tablas de la base de datos

31 Lenguaje de definicioacuten de datosLas sentencias DDL son CREATE ALTER y DROP Siempre se usan estas

sentencias junto con el tipo de objeto y el nombre del objeto

CREATE

Crea una base de datos o un objeto

Sintaxis

Create database nombre on grupo_base de datos filegroup

Ejemplo

USE mastergoIF DB_ID (Ncalificaciones) IS NULL BEGIN create database calificaciones on primary( name = calificaciones filename = Ccalificacionescalificacionesmdf

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 31

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 10: Base de Datos

Problema 2 Artiacuteculos y encargosUna base de datos para una pequentildea empresa debe contener informacioacuten acerca de clientes artiacuteculos y pedidos Hasta el momento se registran los siguientes datos en documentos variosbull Para cada cliente Nuacutemero de cliente (uacutenico) Direcciones de enviacuteo (varias por cliente) Saldo Liacutemite de creacutedito (depende del cliente pero en ninguacuten caso debe superar los 3000000 pts) Descuentobull Para cada artiacuteculo Nuacutemero de artiacuteculo (uacutenico) Faacutebricas que lo distribuyen Existencias de ese artiacuteculo en cada faacutebrica Descripcioacuten del artiacuteculobull Para cada pedido Cada pedido tiene una cabecera y el cuerpo del pedido La cabecera estaacute formada por el nuacutemero de cliente direccioacuten de enviacuteo y fecha del pedido El cuerpo del pedido son varias liacuteneas en cada liacutenea se especifican el nuacutemero del artiacuteculo pedido y la cantidadAdemaacutes se ha determinado que se debe almacenar la informacioacuten de las faacutebricas Sin embargo dado el uso de distribuidores se usaraacute Nuacutemero de la faacutebrica (uacutenico) y Teleacutefono de contacto Y se desean ver cuaacutentos artiacuteculos (en total) provee la faacutebrica Tambieacuten por informacioacuten estrateacutegica se podriacutea incluir informacioacuten de faacutebricas alternativas respecto de las que ya fabrican artiacuteculos para esta empresaNota Una direccioacuten se entenderaacute como Nordm Calle Comuna y Ciudad Una fecha incluye horaSe pide hacer el diagrama ER para la base de datos que represente esta informacioacuten

Problema 2 () Sistema de ventas

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 10

Le contratan para hacer una BD que permita apoyar la gestioacuten de un sistema de ventas La empresa necesita llevar un control de proveedores clientes productos y ventasUn proveedor tiene un RUT nombre direccioacuten teleacutefono y paacutegina web Un cliente tambieacuten tiene RUT nombre direccioacuten pero puede tener varios teleacutefonos de contacto La direccioacuten se entiende por calle nuacutemero comuna y ciudadUn producto tiene un id uacutenico nombre precio actual stock y nombre del proveedor Ademaacutes seorganizan en categoriacuteas y cada producto va soacutelo en una categoriacutea Una categoriacutea tiene id nombre y descripcioacutenPor razones de contabilidad se debe registrar la informacioacuten de cada venta con un id fecha cliente descuento y monto final Ademaacutes se debe guardar el precio al momento de la venta la cantidad vendida y el monto total por el producto

Problema 3 CarreterasDisentildear un esquema ER que recoja la organizacioacuten de una base de datos para contener la informacioacuten sobre todas las carreteras del paiacutes sabiendo que se deben cumplir las siguientes especificaciones- Las carreteras estaacuten divididas en varias categoriacuteas (locales comerciales regionales nacionalesautoviacuteas etc)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 11

- Las carreteras se dividen en tramos Un tramo siempre pertenece a una uacutenica carretera y no puede cambiar de carretera- Un tramo puede pasar por varias comunas interesando conocer el Km de la carretera y la comuna donde empieza el tramo y en donde termina- Para los tramos que suponen principio o final de carretera interesa saber si es que la carreteraconcluye fiacutesicamente o es que confluye en otra carretera En este caso interesa conocer con queacutecarretera confluye y en queacute kiloacutemetro tramo y comunaProblema 4 Sistema de vuelosObtener el diagrama ER para un sistema de control de vuelos adaptado a las siguientes reglas degestioacuten (indicar las entidades interrelaciones etc que se deducen de cada una de las reglas)a) De cada aeropuerto se conoce su coacutedigo nombre ciudad y paiacutesb) En cada aeropuerto pueden tomar tierra diversos modelos de aviones (el modelo de un avioacutendetermina su capacidad es decir el nuacutemero de plazasc) En cada aeropuerto existe una coleccioacuten de programas de vuelo En cada programa de vuelo se indica el nuacutemero de vuelo liacutenea aeacuterea y diacuteas de la semana en que existe dicho vuelod) Cada programa de vuelo despega de un aeropuerto y aterriza en otroe) Los nuacutemeros de vuelo son uacutenicos para todo el mundof) En cada aeropuerto hay muacuteltiples aterrizajes y despegues Todos los aeropuertos contemplados estaacuten en activo es decir tienen alguacuten aterrizaje y alguacuten despegueg) Cada vuelo realizado pertenece a un cierto programa de vuelo Para cada vuelo se quiere conocer su fecha plazas vaciacuteas y el modelo de avioacuten utilizadoh) Algunos programas de vuelo incorporan escalas teacutecnicas intermedias entre los aeropuertos de salida y de llegada Se entiende por escala teacutecnica a un aterrizaje y despegue consecutivos sin altas oacute bajas de pasajerosi) De cada vuelo se quieren conocer las escalas teacutecnicas ordenadas asignaacutendole a cada una un nuacutemero de ordenPor ejemplo el programa de vuelo 555 de Iberia con vuelos los lunes y jueves despega de Barajas-Madrid-Espantildea y aterriza en Caudell-Sydney-Australia teniendo las siguientes escalas teacutecnicas 1- Los Pradintildeos-Sao Paulo-Brasil 2-El Emperador-Santiago-Chile y 3-Saint Kitts-Auckland-Nueva Zelanda1048576 iquestQue cambios se produciraacuten en el caso anterior si en las escalas pudiesen bajar o subir pasajerosExplicar coacutemo se podriacutea representar esta nueva situacioacutenProblema 5 () OlimpiacuteadasLas sedes oliacutempicas se dividen en complejos deportivos Los complejos deportivos se subdividen en aquellos en los que se desarrolla un uacutenico deporte y en los polideportivos Los complejos polideportivos tienen aacutereas designadas para cada deporte con un indicador de localizacioacuten (ejemplo centro esquina- NE etc) Un complejo tiene una localizacioacuten un jefe de organizacioacuten individual y un aacuterea total ocupada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 12

Los dos tipos de complejos (deporte uacutenico y polideportivo) tendraacuten diferentes tipos de informacioacuten Para cada tipo de sede se conservaraacute el nuacutemero de complejos junto con su presupuesto aproximadoCada complejo celebra una serie de eventos (ejemplo la pista del estadio puede celebrar muchascarreras distintas) Para cada evento estaacute prevista una fecha duracioacuten nuacutemero de participantes nuacutemero de comisarios Una lista de todos los comisarios se conservaraacute junto con la lista de los eventos en los que esteacute involucrado cada comisario ya sea cumpliendo la tarea de juez u observador Tanto para cada evento como para el mantenimiento se necesitaraacute cierto equipamiento (ejemplo arcos peacutertigas barras paralelas etc)Problema 6 Educando SAEn la Empresa Educando SA se lleva control de sus Bienes y Servicios El intereacutes primario es poder hacer que los Bienes se manejen de forma raacutepida y con el menor grado de error Para esto quien maneja la seccioacuten de Bienes y Suministros plantea las siguientes condiciones del negocio para la construccioacuten de una base de datos10485761048576La Seccioacuten estaacute dividida en tres (3) aacutereas COMPRAS ALMACEN INVENTARIO10485761048576El aacuterea de Compras funciona de la siguiente formao Recibe las solicitudes de compras de las diferentes aacutereas de la empresao Cada solicitud tiene un responsableo Cada solicitud es autorizada por el jefe del aacuterea y posteriormente por el DirectorFinancieroo Quien realiza una solicitud puede ser responsable de uno o varios centros de costos conla salvedad de que eacutel como empleado solo estaacute adscrito a unoo De la solicitud se debe diligenciar la siguiente informacioacuten Nuacutemero de la solicitud (consecutivo) Fecha Responsable (nombre y ceacutedula) Centro de Costos Rubro presupuestal del cual se descargaraacute la compra En cada solicitud se pueden discriminar uno o muchos iacutetems con la siguiente informacioacuten iacutetem nombre del bien cantidad solicitada unidad de medida del bien valor unitario y valor total Cada solicitud debe ser totalizadao Cada bien es identificado por un coacutedigo universal que es uacutenico y es de caraacutecter devolutivo (suministro) o un bien inmuebleo Una vez diligenciada la solicitud es remitida al aacuterea de compras para realizar sucorrespondiente cotizacioacuteno Las cotizaciones son realizadas con uno o varios proveedores de los bienes solicitadoso Una vez la cotizacioacuten definitiva estaacute lista se crea una orden contractual que maneja lasiguiente informacioacuten Nuacutemero de la orden contractual nit y nombre del proveedor al cualse le va a realizar la compra fecha de la orden monto total de la orden fecha de entrega Cada orden puede tener asociado uno o varios iacutetems de la solicitud o solicitudes que van a ser despachadas Cada iacutetem tiene la siguiente informacioacuten nombre del bien cantidad solicitada cantidad despachada unidad de medida del bien valor unitario y valor total

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 13

o La orden de compra es aprobada por el Director Financiero para que sea enviada alproveedor elegido10485761048576El aacuterea de Almaceacuten funciona de la siguiente formao Su funcioacuten principal es recepcionar los bienes que llegan de los proveedores ydistribuirlos a las correspondientes aacutereas que realizaron las solicitudes de compraso Cuando llega un proveedor mercanciacutea este hace una entrega fiacutesica de los bienes loscuales son comparados con la factura que este entrega y con la orden de compracorrespondiente Si esta accioacuten es correcta se registra una entrada de almaceacuten por cadafactura relacionada con la siguiente informacioacuten Nuacutemero de Entrada Fecha Nuacutemero defactura Proveedor Total Bienes Valor Total (los totales deben coincidir con los de lafactura) Adjunto a esta se discriminan los iacutetems recibidos con la siguiente informacioacutennombre del bien cantidad entregadao Cuando el almaceacuten decide despachar los bienes a las diferentes aacutereas solicitantesregistra cada una de las entregas en Salidas de Almaceacuten con la siguiente informacioacutenNuacutemero de Salida Empleado responsable del bien a entregar fecha de salida fecha deentrega Por cada entrega se detalla cada uno de los iacutetems con la siguiente informacioacutennombre del bien cantidad entregadao Una entrada de almaceacuten puede generar muchas salidas de almaceacuten por ejemplo Pueden ingresar 500 pacas de papel higieacutenico pero como se debe repartir entrevarias aacutereas cada una requiere de una salida de almaceacuten10485761048576El aacuterea de inventarios funciona de la siguiente formao Es la encargada de administrar y controlar la ubicacioacuten de los bienes dentro de laempresa por esto antes de que el bien salga del almaceacuten debe ser codificado a traveacutesde un coacutedigo uacutenico que lo haga identificable dentro de la empresao La ubicacioacuten del bien se identifica por la siguiente informacioacuten responsable del bienfecha de entrega direccioacuten del bien (ubicacioacuten)Disentildear modelo ER para la base de datosProblema 7 Torneo de Tenis Grand SlamEl sistema debe memorizar todos los encuentros que se han desarrollado desde que existe el torneo asiacute como las siguientes caracteriacutesticas de estosDescripcioacutenEl Grand Slam se compone de cuatro torneos anuales que se celebran en Gran Bretantildea Estados Unidos Francia y Australia En cada paiacutes se pueden

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 14

desarrollar en distintos lugares (p ej en EE UU Puede desarrollarse en Forest Hill o en Flashing Meadows)Cada partido tiene asociado un premio de consolacioacuten para el perdedor que dependeraacute de la fase en que se encuentre el torneo (p ej el perdedor de octavos de final puede ganar 5000 doacutelares) El ganador de a final recibiraacute el premio correspondiente al torneoCada torneo tiene cinco modalidades Individual masculino individual femenino dobles masculino dobles femenino y dobles mixtosTambieacuten hay que tener en cuenta la nacionalidad de un jugador de forma que acuteeste puede ser apaacutetrida o tener varias nacionalidadesResultados a considerarEl sistema debe dar respuesta a las siguientes preguntas1 Dado un antildeo y un torneo composicioacuten y resultado de los partidos2 Lista de aacuterbitros que participaron en el torneo3 Ganancias percibidas en premios por un jugador a lo largo del torneo4 Lista de entrenadores que han entrenado a un jugador a lo largo del torneo y fechas en las que lo hizo Ejemplos de acceso a la base de datos1 Connors gano Gerulaitis en Roland Garros en 1979 en cuartos de final en individuales masculinos por6-3 4-67-5 6-02 El sentildeor Wilkinson arbitro ese partido3 Alemania ha ganado dos veces las individuales masculinas de Wimbledon Borg ha ganado 2000000de doacutelares a lo largo de su participacioacuten en el Grand Slam4 El ganado de Roland Garros de 1987 ganoacute 20000 doacutelares5 Noah ha jugado cuatro veces en dobles mixtos con MandlikovaProblema 8Se desea crear un sitio web con informacioacuten referente a las peliacuteculas en cartel en las salas de un dudoso cine cercano a la plaza de armasDe cada peliacutecula se almacena una ficha con su tiacutetulo de distribucioacuten su tiacutetulo original su geacutenero el idioma origina si tiene subtiacutetulos en espantildeol o no los paises de origen el antildeo de la produccioacuten la url del sitio web de la peliacutecula la duracioacuten (en horas y minutos) la calificacioacuten (Apta todo puacuteblico+9 antildeos +15 antildeos+18 antildeos) fecha de estreno en Santiago un resumen y un identificador de la peliacutecula De cada peliacutecula interesa conocer la lista de directores y el reparto es decir para cada actor que trabaja el nombre de todos los personajes que interpretaAdemaacutes interesa disponer de informacioacuten sobre los directores y actores que trabajan en cada peliacutecula De ambos se conoce su nombre (que lo identifica) y su nacionalidad Ademaacutes se desea conocer la cantidad de peliacuteculas en las que dirigieron o actuaron Tenga en cuenta que hay personas que cumplen los dos rolesLos cines pueden tener maacutes de una sala y cada semana cada uno de los cines enviacutea la cartelera para dicha semana indicando de detalle de las funciones Para cada funcioacuten se conoce el diacutea de la semana y la hora de comienzo y obviamente la sala y la peliacutecula que exhibe De cada sala se sabe el nombre un nuacutemero que la identifica dentro del cine y la cantidad de butacas que posee De cada cine se conoce el nombre que lo identifica su direccioacuten y teleacutefono para consultas

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 15

Algunos cines cuentan con promociones Estas promociones dependen de la funcioacuten (Ej De lunes a jueves antes de las 18 50 de descuento en la sala tal del cine tal para la peliacutecula cualLa funcioacuten del lunes a las 14 para la peliacutecula tal en la sala cual no se cobra a los escolares con tuacutenica ) De cada promocioacuten se conoce una descripcioacuten y el descuento que aplicaAdemaacutes del resumen de la peliacutecula que se incluye en la ficha interesa mostrar la opinioacuten de las personas que vieron la peliacutecula De cada opinioacuten se conoce el nombre de la persona que la realiza su edad le fecha en que registroacute su opinioacuten la calificacioacuten que le dio a la peliacutecula (Obra Maestra Muy BuenaBuena Regular Mala) y el comentario propiamente dicho A cada opinioacuten se le asigna un nuacutemero que la identifica respecto de la peliacutecula sobre la cual opina

15 Normalizacioacuten151 Primera forma normalUna tabla estaacute en Primera Forma Normal si

Todos los atributos son atoacutemicos Un atributo es atoacutemico si los elementos del dominio son indivisibles miacutenimos

La tabla contiene una llave primaria uacutenica La llave primaria no contiene atributos nulos No debe existir variacioacuten en el nuacutemero de columnas Los Campos no llave deben identificarse por la llave (Dependencia

Funcional) Debe Existir una independencia del orden tanto de las filas como de las

columnas es decir si los datos cambian de orden no deben cambiar sus significados

Una tabla no puede tener muacuteltiples valores en cada columna Los datos son atoacutemicos (Si a cada valor de X le pertenece un valor de Y y viceversa)Esta forma normal elimina los valores repetidos dentro de una BD

152 Segunda Forma Normal (2FN)

Dependencia Funcional Una relacioacuten estaacute en 2FN si estaacute en 1FN y si los atributos que no forman parte de ninguna clave dependen de forma completa de la clave principal Es decir que no existen dependencias parciales (Todos los atributos que no son clave principal deben depender uacutenicamente de la clave principal)

En otras palabras podriacuteamos decir que la segunda forma normal estaacute basada en el concepto de dependencia completamente funcional Una dependencia funcional es completamente funcional si al eliminar los atributos A de X significa que la dependencia no es mantenida esto es que Una dependencia funcional es una dependencia parcial si hay algunos atributos que pueden ser eliminados

de X y la dependencia todaviacutea se mantiene esto es

Por ejemplo DNI ID_PROYECTO HORAS_TRABAJO (con el DNI de un empleado y el ID de un proyecto sabemos cuaacutentas horas de trabajo por semana trabaja un empleado en dicho proyecto) es completamente dependiente dado que ni DNI HORAS_TRABAJO ni ID_PROYECTO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 16

HORAS_TRABAJO mantienen la dependencia Sin embargo DNI ID_PROYECTO NOMBRE_EMPLEADO es parcialmente dependiente dado que DNI NOMBRE_EMPLEADO mantiene la dependencia

153 Tercera Forma Normal (3FN)

La tabla se encuentra en 3FN si es 2FN y si no existe ninguna dependencia funcional transitiva entre los atributos que no son clave

Un ejemplo de este concepto seriacutea que una dependencia funcional X-gtY en un esquema de relacioacuten R es una dependencia transitiva si hay un conjunto de atributos Z que no es un subconjunto de alguna clave de R donde se mantiene X-gtZ y Z-gtY

Por ejemplo la dependencia SSN-gtDMGRSSN es una dependencia transitiva en EMP_DEPT de la siguiente figura Decimos que la dependencia de DMGRSSN el atributo clave SSN es transitiva viacutea DNUMBER porque las dependencias SSNrarrDNUMBER y DNUMBERrarrDMGRSSN son mantenidas y DNUMBER no es un subconjunto de la clave de EMP_DEPT Intuitivamente podemos ver que la dependencia de DMGRSSN sobre DNUMBER es indeseable en EMP_DEPT dado que DNUMBER no es una clave de EMP_DEPT

Formalmente un esquema de relacion estaacute en 3 Forma Normal Elmasri-Navathe[2] si para toda dependencia funcional se cumple al menos una de las siguientes condiciones

es superllave o clave

es atributo primo de esto es si es miembro de alguna clave en

Ademaacutes el esquema debe cumplir necesariamente

Ejemplo

Id estudiante Ci Nombres Apellidos Curso Materia Descripicoacuten01 1803327418 Fransico

FabianCamacho Saltos

4 En Ingeacutes

02 10152465 Carlos Banabeti

Ruales Camacho

5 ES Espantildeol

03

1 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 17

2 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

Id Curso Curso01 Primero02 SegundoId Materia Materia Descripcioacuten01 En Ingleacutes02 MT Matemaacutetica

3 era forma normal

Iddescripcion DescripcioacutenIngleacutesMatemaacutetica

Dada la siguiente tabla normalizarlaIDcliente Ceacutedula Nombres Direccioacuten Proveedor Producto

16 Herramientas para la normalizacioacuten

A continuacioacuten se mencionan algunas herramientas para normalizar una base de datos mediante un proceso automatizado

CAPIacuteTULO IIRealizar diferentes tareas de disentildeo y planificacioacuten sobre la

estructura de tablas

21 Tabla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 18

Id Materia Materia01 En02 MT

Es un conjunto de datos ordenados en filas y columnas

22 Tipos de datossql_variant Puede usarse en columnas paraacutemetros variables y valores devueltos de funciones definidas por el usuariosql_variant permite que estos objetos de base de datos admitan valores de otros tipos de datosxml Capaz de almacenar documentos XML oacute fragmentos XML que es posible utilizar tanto en variables como en campos de tablas y que a diferencia de otros tipos de datos ofrece meacutetodos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 19

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 20

23 Creacioacuten de tablasAntes de aprender sobre la creacioacuten de tablas es necesario conocer los pasos para crear una base de datos en sql server 2008Para crear una base de datos en SQL Server 2008 debemos seguir los siguientes pasos1- Ingresar a SQLServer

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 21

2- En la ventana que nos aparece realizamos clic derecho en donde dice database

3- Nos aparece el siguiente menuacute hacemos clic donde dice New Database

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 22

4- Nos aparece la siguiente ventana

En donde dice Database Name le damos un nombre a la base de datos

5- Luego hacemos clic en

Nos aparece la siguiente ventana

Aquiacute tenemos dos opciones In percent nos permite que si sobrepasa el tamantildeo de la base de datos crezca en porcentajeIn Megabytes nos permite hacer que la base de datos crezca de 1 Megabyte en 1 megabyte si sobrepasa el tamantildeo y listoAhora para crear una tabla seguimos los siguientes pasos1- Hacemos clic en donde dice database buscamos el nombre de nuestra base de datos en la seccioacuten tables realizamos clic derecho con el botoacuten secundario del mouse

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 23

Nos aparece el siguiente menuacute

Hacemos clic en New Table

Y en donde dice Column Name vamos poniendo los campos de las bases de datos con su respectivo tipoAl final hacemos clic en donde estaacute el iacutecono de un diskette nos aparece una ventana pidiendo el nombre de la tabla le asignamos un nombre y realizamos clic en el botoacuten ok24 Creacioacuten de RestriccionesUna restriccioacuten es una condicioacuten que obliga el cumplimiento de ciertas condiciones en la base de datos Algunas no son determinadas por los usuarios sino que son inherentemente definidas por el simple hecho de que la base de datos sea relacional Algunas otras restricciones las puede definir el usuario por ejemplo usar un campo con valores enteros entre 1 y 10

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 24

Las restricciones proveen un meacutetodo de implementar reglas en la base de datos Las restricciones restringen los datos que pueden ser almacenados en las tablas Usualmente se definen usando expresiones que dan como resultado un valor booleano indicando si los datos satisfacen la restriccioacuten o noLas restricciones no son parte formal del modelo relacional pero son incluidas porque juegan el rol de organizar mejor los datos Las restricciones son muy discutidas junto con los conceptos relacionalesPueden crearse los siguientes tipos de restricciones Las restricciones unique y primary key exigen que no haya dos filas en una tabla con los mismos valores en las columnas especificadas Ademaacutes la restriccioacuten primary key requiere que no haya valores nulos en ninguna fila de la columna

241 Crear una restriccioacuten PRIMARY KEYPara crear una restriccioacuten Primary Key realizamos clic en el campo donde

queremos crear la restriccioacuten y luego realizamos clic en el iacutecono 242 Crear una restriccioacuten UNIQUEPara crear una restriccioacuten UNIQUE realizamos clic en el campo donde queremos crear dicha restriccioacuten y luego escogemos el menuacute Table Designe y luego en IndexesKeys

Nos aparece la siguiente ventana en donde dice Type escogemos Unique Key

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 25

Realizamos clic en close y guardamos la tabla

La integridad de referencia ( references ) exige que los datos insertados en columnas especiacuteficas ya tengan datos coincidentes en la tabla y columnas especificadas Las restricciones check limitan los valores de datos insertados en las columnas

243 Agregar una restriccioacuten CHECKRealizamos clic derecho dentro del explorador de objetos en la seccioacuten tables buscamos el nombre de la tabla y buscamos constraints realizamos clic derecho con el botoacuten secundario del mouse y escogemos New Constraint

Nos apareced la siguiente ventana

|

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 26

Realizamos clic en este botoacuten para poder editar la expresioacuten que queremos que tenga restricciones

En la ventana que nos aparece ponemos la expresioacuten deseada y realizamos clic en el botoacuten Ok

Para poder editar la tabla y verificar los cambios realizados buscamos en el explorador de objetos el nombre de la tabla realizamos clic derecho y escogemos la opcioacuten Edit Top 200 Rows

Y procedemos a ingresar datos para probarTambieacuten se puede imponer la integridad de datos restringiendo el uso de valores nulos en una columna (las palabras clave null o not null ) y proporcionando valores predeterminados para columnas (la claacuteusula default )

25 Diagramas de bases de datosLos diagramas de bases de datos se utiliza para visualizar las tablas graacuteficamente y para poder establecer las relaciones

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 27

Para crear un diagrama hacemos clic en el explorador de objetos hacemos clic en el nombre de la base de datos y escogemos Database Diagrams hacemos clic derecho escogemos new Database Diagrams

Nos aparece el siguiente mensaje realizamos un clic dentro del botoacuten Yes

Volvemos hacer clic derechos y volvemos a escoger New Data Base Diagram

Aparece la siguiente ventana en pantalla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 28

Seleccionamos todas y escogemos AddNos aparece la siguiente ventana

En el caso de tener una relacioacuten muchos a muchos debemos romper la relacioacuten con una tercera tabla para esto desde el mismo Database Diagram hacemos clic derecho en un lugar en blanco y escogemos new table llenos las columnas con los campos y tipos de datos respectivosDebemos tomar en cuenta que en las tablas a donde va la relacioacuten tiene que tener su respectiva llave foraacutenea y para poder establecer la relacioacuten

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 29

arrastramos desde el campo principal hacia la llave foraacutenea es decir de la tabla padre a la hijaQuedando las relaciones asiacute

Finalmente cerramos la base de datos nos aparece la siguiente ventana

pidiendo guardar el Database Diagram le demos un nombre y realizamos clic

en el botoacuten OK

252 Ejercicios

Los diagramas del ejercicio 1 y 2 del capiacutetulo anterior pasar al modelo

relacional en SQLSERVER 2008

Los ejercicios 5 y 6 los ejercicios de la prueba pasarlos a sql server

Transformar el siguiente modelo entidad relacioacuten al modelo relacional

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 30

CAPIacuteTULO III

Aplicar las diferentes sentencias y modos en lenguaje SQL

para tratamiento de la informacioacuten almacenada en las

diferentes tablas de la base de datos

31 Lenguaje de definicioacuten de datosLas sentencias DDL son CREATE ALTER y DROP Siempre se usan estas

sentencias junto con el tipo de objeto y el nombre del objeto

CREATE

Crea una base de datos o un objeto

Sintaxis

Create database nombre on grupo_base de datos filegroup

Ejemplo

USE mastergoIF DB_ID (Ncalificaciones) IS NULL BEGIN create database calificaciones on primary( name = calificaciones filename = Ccalificacionescalificacionesmdf

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 31

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 11: Base de Datos

Le contratan para hacer una BD que permita apoyar la gestioacuten de un sistema de ventas La empresa necesita llevar un control de proveedores clientes productos y ventasUn proveedor tiene un RUT nombre direccioacuten teleacutefono y paacutegina web Un cliente tambieacuten tiene RUT nombre direccioacuten pero puede tener varios teleacutefonos de contacto La direccioacuten se entiende por calle nuacutemero comuna y ciudadUn producto tiene un id uacutenico nombre precio actual stock y nombre del proveedor Ademaacutes seorganizan en categoriacuteas y cada producto va soacutelo en una categoriacutea Una categoriacutea tiene id nombre y descripcioacutenPor razones de contabilidad se debe registrar la informacioacuten de cada venta con un id fecha cliente descuento y monto final Ademaacutes se debe guardar el precio al momento de la venta la cantidad vendida y el monto total por el producto

Problema 3 CarreterasDisentildear un esquema ER que recoja la organizacioacuten de una base de datos para contener la informacioacuten sobre todas las carreteras del paiacutes sabiendo que se deben cumplir las siguientes especificaciones- Las carreteras estaacuten divididas en varias categoriacuteas (locales comerciales regionales nacionalesautoviacuteas etc)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 11

- Las carreteras se dividen en tramos Un tramo siempre pertenece a una uacutenica carretera y no puede cambiar de carretera- Un tramo puede pasar por varias comunas interesando conocer el Km de la carretera y la comuna donde empieza el tramo y en donde termina- Para los tramos que suponen principio o final de carretera interesa saber si es que la carreteraconcluye fiacutesicamente o es que confluye en otra carretera En este caso interesa conocer con queacutecarretera confluye y en queacute kiloacutemetro tramo y comunaProblema 4 Sistema de vuelosObtener el diagrama ER para un sistema de control de vuelos adaptado a las siguientes reglas degestioacuten (indicar las entidades interrelaciones etc que se deducen de cada una de las reglas)a) De cada aeropuerto se conoce su coacutedigo nombre ciudad y paiacutesb) En cada aeropuerto pueden tomar tierra diversos modelos de aviones (el modelo de un avioacutendetermina su capacidad es decir el nuacutemero de plazasc) En cada aeropuerto existe una coleccioacuten de programas de vuelo En cada programa de vuelo se indica el nuacutemero de vuelo liacutenea aeacuterea y diacuteas de la semana en que existe dicho vuelod) Cada programa de vuelo despega de un aeropuerto y aterriza en otroe) Los nuacutemeros de vuelo son uacutenicos para todo el mundof) En cada aeropuerto hay muacuteltiples aterrizajes y despegues Todos los aeropuertos contemplados estaacuten en activo es decir tienen alguacuten aterrizaje y alguacuten despegueg) Cada vuelo realizado pertenece a un cierto programa de vuelo Para cada vuelo se quiere conocer su fecha plazas vaciacuteas y el modelo de avioacuten utilizadoh) Algunos programas de vuelo incorporan escalas teacutecnicas intermedias entre los aeropuertos de salida y de llegada Se entiende por escala teacutecnica a un aterrizaje y despegue consecutivos sin altas oacute bajas de pasajerosi) De cada vuelo se quieren conocer las escalas teacutecnicas ordenadas asignaacutendole a cada una un nuacutemero de ordenPor ejemplo el programa de vuelo 555 de Iberia con vuelos los lunes y jueves despega de Barajas-Madrid-Espantildea y aterriza en Caudell-Sydney-Australia teniendo las siguientes escalas teacutecnicas 1- Los Pradintildeos-Sao Paulo-Brasil 2-El Emperador-Santiago-Chile y 3-Saint Kitts-Auckland-Nueva Zelanda1048576 iquestQue cambios se produciraacuten en el caso anterior si en las escalas pudiesen bajar o subir pasajerosExplicar coacutemo se podriacutea representar esta nueva situacioacutenProblema 5 () OlimpiacuteadasLas sedes oliacutempicas se dividen en complejos deportivos Los complejos deportivos se subdividen en aquellos en los que se desarrolla un uacutenico deporte y en los polideportivos Los complejos polideportivos tienen aacutereas designadas para cada deporte con un indicador de localizacioacuten (ejemplo centro esquina- NE etc) Un complejo tiene una localizacioacuten un jefe de organizacioacuten individual y un aacuterea total ocupada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 12

Los dos tipos de complejos (deporte uacutenico y polideportivo) tendraacuten diferentes tipos de informacioacuten Para cada tipo de sede se conservaraacute el nuacutemero de complejos junto con su presupuesto aproximadoCada complejo celebra una serie de eventos (ejemplo la pista del estadio puede celebrar muchascarreras distintas) Para cada evento estaacute prevista una fecha duracioacuten nuacutemero de participantes nuacutemero de comisarios Una lista de todos los comisarios se conservaraacute junto con la lista de los eventos en los que esteacute involucrado cada comisario ya sea cumpliendo la tarea de juez u observador Tanto para cada evento como para el mantenimiento se necesitaraacute cierto equipamiento (ejemplo arcos peacutertigas barras paralelas etc)Problema 6 Educando SAEn la Empresa Educando SA se lleva control de sus Bienes y Servicios El intereacutes primario es poder hacer que los Bienes se manejen de forma raacutepida y con el menor grado de error Para esto quien maneja la seccioacuten de Bienes y Suministros plantea las siguientes condiciones del negocio para la construccioacuten de una base de datos10485761048576La Seccioacuten estaacute dividida en tres (3) aacutereas COMPRAS ALMACEN INVENTARIO10485761048576El aacuterea de Compras funciona de la siguiente formao Recibe las solicitudes de compras de las diferentes aacutereas de la empresao Cada solicitud tiene un responsableo Cada solicitud es autorizada por el jefe del aacuterea y posteriormente por el DirectorFinancieroo Quien realiza una solicitud puede ser responsable de uno o varios centros de costos conla salvedad de que eacutel como empleado solo estaacute adscrito a unoo De la solicitud se debe diligenciar la siguiente informacioacuten Nuacutemero de la solicitud (consecutivo) Fecha Responsable (nombre y ceacutedula) Centro de Costos Rubro presupuestal del cual se descargaraacute la compra En cada solicitud se pueden discriminar uno o muchos iacutetems con la siguiente informacioacuten iacutetem nombre del bien cantidad solicitada unidad de medida del bien valor unitario y valor total Cada solicitud debe ser totalizadao Cada bien es identificado por un coacutedigo universal que es uacutenico y es de caraacutecter devolutivo (suministro) o un bien inmuebleo Una vez diligenciada la solicitud es remitida al aacuterea de compras para realizar sucorrespondiente cotizacioacuteno Las cotizaciones son realizadas con uno o varios proveedores de los bienes solicitadoso Una vez la cotizacioacuten definitiva estaacute lista se crea una orden contractual que maneja lasiguiente informacioacuten Nuacutemero de la orden contractual nit y nombre del proveedor al cualse le va a realizar la compra fecha de la orden monto total de la orden fecha de entrega Cada orden puede tener asociado uno o varios iacutetems de la solicitud o solicitudes que van a ser despachadas Cada iacutetem tiene la siguiente informacioacuten nombre del bien cantidad solicitada cantidad despachada unidad de medida del bien valor unitario y valor total

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 13

o La orden de compra es aprobada por el Director Financiero para que sea enviada alproveedor elegido10485761048576El aacuterea de Almaceacuten funciona de la siguiente formao Su funcioacuten principal es recepcionar los bienes que llegan de los proveedores ydistribuirlos a las correspondientes aacutereas que realizaron las solicitudes de compraso Cuando llega un proveedor mercanciacutea este hace una entrega fiacutesica de los bienes loscuales son comparados con la factura que este entrega y con la orden de compracorrespondiente Si esta accioacuten es correcta se registra una entrada de almaceacuten por cadafactura relacionada con la siguiente informacioacuten Nuacutemero de Entrada Fecha Nuacutemero defactura Proveedor Total Bienes Valor Total (los totales deben coincidir con los de lafactura) Adjunto a esta se discriminan los iacutetems recibidos con la siguiente informacioacutennombre del bien cantidad entregadao Cuando el almaceacuten decide despachar los bienes a las diferentes aacutereas solicitantesregistra cada una de las entregas en Salidas de Almaceacuten con la siguiente informacioacutenNuacutemero de Salida Empleado responsable del bien a entregar fecha de salida fecha deentrega Por cada entrega se detalla cada uno de los iacutetems con la siguiente informacioacutennombre del bien cantidad entregadao Una entrada de almaceacuten puede generar muchas salidas de almaceacuten por ejemplo Pueden ingresar 500 pacas de papel higieacutenico pero como se debe repartir entrevarias aacutereas cada una requiere de una salida de almaceacuten10485761048576El aacuterea de inventarios funciona de la siguiente formao Es la encargada de administrar y controlar la ubicacioacuten de los bienes dentro de laempresa por esto antes de que el bien salga del almaceacuten debe ser codificado a traveacutesde un coacutedigo uacutenico que lo haga identificable dentro de la empresao La ubicacioacuten del bien se identifica por la siguiente informacioacuten responsable del bienfecha de entrega direccioacuten del bien (ubicacioacuten)Disentildear modelo ER para la base de datosProblema 7 Torneo de Tenis Grand SlamEl sistema debe memorizar todos los encuentros que se han desarrollado desde que existe el torneo asiacute como las siguientes caracteriacutesticas de estosDescripcioacutenEl Grand Slam se compone de cuatro torneos anuales que se celebran en Gran Bretantildea Estados Unidos Francia y Australia En cada paiacutes se pueden

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 14

desarrollar en distintos lugares (p ej en EE UU Puede desarrollarse en Forest Hill o en Flashing Meadows)Cada partido tiene asociado un premio de consolacioacuten para el perdedor que dependeraacute de la fase en que se encuentre el torneo (p ej el perdedor de octavos de final puede ganar 5000 doacutelares) El ganador de a final recibiraacute el premio correspondiente al torneoCada torneo tiene cinco modalidades Individual masculino individual femenino dobles masculino dobles femenino y dobles mixtosTambieacuten hay que tener en cuenta la nacionalidad de un jugador de forma que acuteeste puede ser apaacutetrida o tener varias nacionalidadesResultados a considerarEl sistema debe dar respuesta a las siguientes preguntas1 Dado un antildeo y un torneo composicioacuten y resultado de los partidos2 Lista de aacuterbitros que participaron en el torneo3 Ganancias percibidas en premios por un jugador a lo largo del torneo4 Lista de entrenadores que han entrenado a un jugador a lo largo del torneo y fechas en las que lo hizo Ejemplos de acceso a la base de datos1 Connors gano Gerulaitis en Roland Garros en 1979 en cuartos de final en individuales masculinos por6-3 4-67-5 6-02 El sentildeor Wilkinson arbitro ese partido3 Alemania ha ganado dos veces las individuales masculinas de Wimbledon Borg ha ganado 2000000de doacutelares a lo largo de su participacioacuten en el Grand Slam4 El ganado de Roland Garros de 1987 ganoacute 20000 doacutelares5 Noah ha jugado cuatro veces en dobles mixtos con MandlikovaProblema 8Se desea crear un sitio web con informacioacuten referente a las peliacuteculas en cartel en las salas de un dudoso cine cercano a la plaza de armasDe cada peliacutecula se almacena una ficha con su tiacutetulo de distribucioacuten su tiacutetulo original su geacutenero el idioma origina si tiene subtiacutetulos en espantildeol o no los paises de origen el antildeo de la produccioacuten la url del sitio web de la peliacutecula la duracioacuten (en horas y minutos) la calificacioacuten (Apta todo puacuteblico+9 antildeos +15 antildeos+18 antildeos) fecha de estreno en Santiago un resumen y un identificador de la peliacutecula De cada peliacutecula interesa conocer la lista de directores y el reparto es decir para cada actor que trabaja el nombre de todos los personajes que interpretaAdemaacutes interesa disponer de informacioacuten sobre los directores y actores que trabajan en cada peliacutecula De ambos se conoce su nombre (que lo identifica) y su nacionalidad Ademaacutes se desea conocer la cantidad de peliacuteculas en las que dirigieron o actuaron Tenga en cuenta que hay personas que cumplen los dos rolesLos cines pueden tener maacutes de una sala y cada semana cada uno de los cines enviacutea la cartelera para dicha semana indicando de detalle de las funciones Para cada funcioacuten se conoce el diacutea de la semana y la hora de comienzo y obviamente la sala y la peliacutecula que exhibe De cada sala se sabe el nombre un nuacutemero que la identifica dentro del cine y la cantidad de butacas que posee De cada cine se conoce el nombre que lo identifica su direccioacuten y teleacutefono para consultas

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 15

Algunos cines cuentan con promociones Estas promociones dependen de la funcioacuten (Ej De lunes a jueves antes de las 18 50 de descuento en la sala tal del cine tal para la peliacutecula cualLa funcioacuten del lunes a las 14 para la peliacutecula tal en la sala cual no se cobra a los escolares con tuacutenica ) De cada promocioacuten se conoce una descripcioacuten y el descuento que aplicaAdemaacutes del resumen de la peliacutecula que se incluye en la ficha interesa mostrar la opinioacuten de las personas que vieron la peliacutecula De cada opinioacuten se conoce el nombre de la persona que la realiza su edad le fecha en que registroacute su opinioacuten la calificacioacuten que le dio a la peliacutecula (Obra Maestra Muy BuenaBuena Regular Mala) y el comentario propiamente dicho A cada opinioacuten se le asigna un nuacutemero que la identifica respecto de la peliacutecula sobre la cual opina

15 Normalizacioacuten151 Primera forma normalUna tabla estaacute en Primera Forma Normal si

Todos los atributos son atoacutemicos Un atributo es atoacutemico si los elementos del dominio son indivisibles miacutenimos

La tabla contiene una llave primaria uacutenica La llave primaria no contiene atributos nulos No debe existir variacioacuten en el nuacutemero de columnas Los Campos no llave deben identificarse por la llave (Dependencia

Funcional) Debe Existir una independencia del orden tanto de las filas como de las

columnas es decir si los datos cambian de orden no deben cambiar sus significados

Una tabla no puede tener muacuteltiples valores en cada columna Los datos son atoacutemicos (Si a cada valor de X le pertenece un valor de Y y viceversa)Esta forma normal elimina los valores repetidos dentro de una BD

152 Segunda Forma Normal (2FN)

Dependencia Funcional Una relacioacuten estaacute en 2FN si estaacute en 1FN y si los atributos que no forman parte de ninguna clave dependen de forma completa de la clave principal Es decir que no existen dependencias parciales (Todos los atributos que no son clave principal deben depender uacutenicamente de la clave principal)

En otras palabras podriacuteamos decir que la segunda forma normal estaacute basada en el concepto de dependencia completamente funcional Una dependencia funcional es completamente funcional si al eliminar los atributos A de X significa que la dependencia no es mantenida esto es que Una dependencia funcional es una dependencia parcial si hay algunos atributos que pueden ser eliminados

de X y la dependencia todaviacutea se mantiene esto es

Por ejemplo DNI ID_PROYECTO HORAS_TRABAJO (con el DNI de un empleado y el ID de un proyecto sabemos cuaacutentas horas de trabajo por semana trabaja un empleado en dicho proyecto) es completamente dependiente dado que ni DNI HORAS_TRABAJO ni ID_PROYECTO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 16

HORAS_TRABAJO mantienen la dependencia Sin embargo DNI ID_PROYECTO NOMBRE_EMPLEADO es parcialmente dependiente dado que DNI NOMBRE_EMPLEADO mantiene la dependencia

153 Tercera Forma Normal (3FN)

La tabla se encuentra en 3FN si es 2FN y si no existe ninguna dependencia funcional transitiva entre los atributos que no son clave

Un ejemplo de este concepto seriacutea que una dependencia funcional X-gtY en un esquema de relacioacuten R es una dependencia transitiva si hay un conjunto de atributos Z que no es un subconjunto de alguna clave de R donde se mantiene X-gtZ y Z-gtY

Por ejemplo la dependencia SSN-gtDMGRSSN es una dependencia transitiva en EMP_DEPT de la siguiente figura Decimos que la dependencia de DMGRSSN el atributo clave SSN es transitiva viacutea DNUMBER porque las dependencias SSNrarrDNUMBER y DNUMBERrarrDMGRSSN son mantenidas y DNUMBER no es un subconjunto de la clave de EMP_DEPT Intuitivamente podemos ver que la dependencia de DMGRSSN sobre DNUMBER es indeseable en EMP_DEPT dado que DNUMBER no es una clave de EMP_DEPT

Formalmente un esquema de relacion estaacute en 3 Forma Normal Elmasri-Navathe[2] si para toda dependencia funcional se cumple al menos una de las siguientes condiciones

es superllave o clave

es atributo primo de esto es si es miembro de alguna clave en

Ademaacutes el esquema debe cumplir necesariamente

Ejemplo

Id estudiante Ci Nombres Apellidos Curso Materia Descripicoacuten01 1803327418 Fransico

FabianCamacho Saltos

4 En Ingeacutes

02 10152465 Carlos Banabeti

Ruales Camacho

5 ES Espantildeol

03

1 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 17

2 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

Id Curso Curso01 Primero02 SegundoId Materia Materia Descripcioacuten01 En Ingleacutes02 MT Matemaacutetica

3 era forma normal

Iddescripcion DescripcioacutenIngleacutesMatemaacutetica

Dada la siguiente tabla normalizarlaIDcliente Ceacutedula Nombres Direccioacuten Proveedor Producto

16 Herramientas para la normalizacioacuten

A continuacioacuten se mencionan algunas herramientas para normalizar una base de datos mediante un proceso automatizado

CAPIacuteTULO IIRealizar diferentes tareas de disentildeo y planificacioacuten sobre la

estructura de tablas

21 Tabla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 18

Id Materia Materia01 En02 MT

Es un conjunto de datos ordenados en filas y columnas

22 Tipos de datossql_variant Puede usarse en columnas paraacutemetros variables y valores devueltos de funciones definidas por el usuariosql_variant permite que estos objetos de base de datos admitan valores de otros tipos de datosxml Capaz de almacenar documentos XML oacute fragmentos XML que es posible utilizar tanto en variables como en campos de tablas y que a diferencia de otros tipos de datos ofrece meacutetodos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 19

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 20

23 Creacioacuten de tablasAntes de aprender sobre la creacioacuten de tablas es necesario conocer los pasos para crear una base de datos en sql server 2008Para crear una base de datos en SQL Server 2008 debemos seguir los siguientes pasos1- Ingresar a SQLServer

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 21

2- En la ventana que nos aparece realizamos clic derecho en donde dice database

3- Nos aparece el siguiente menuacute hacemos clic donde dice New Database

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 22

4- Nos aparece la siguiente ventana

En donde dice Database Name le damos un nombre a la base de datos

5- Luego hacemos clic en

Nos aparece la siguiente ventana

Aquiacute tenemos dos opciones In percent nos permite que si sobrepasa el tamantildeo de la base de datos crezca en porcentajeIn Megabytes nos permite hacer que la base de datos crezca de 1 Megabyte en 1 megabyte si sobrepasa el tamantildeo y listoAhora para crear una tabla seguimos los siguientes pasos1- Hacemos clic en donde dice database buscamos el nombre de nuestra base de datos en la seccioacuten tables realizamos clic derecho con el botoacuten secundario del mouse

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 23

Nos aparece el siguiente menuacute

Hacemos clic en New Table

Y en donde dice Column Name vamos poniendo los campos de las bases de datos con su respectivo tipoAl final hacemos clic en donde estaacute el iacutecono de un diskette nos aparece una ventana pidiendo el nombre de la tabla le asignamos un nombre y realizamos clic en el botoacuten ok24 Creacioacuten de RestriccionesUna restriccioacuten es una condicioacuten que obliga el cumplimiento de ciertas condiciones en la base de datos Algunas no son determinadas por los usuarios sino que son inherentemente definidas por el simple hecho de que la base de datos sea relacional Algunas otras restricciones las puede definir el usuario por ejemplo usar un campo con valores enteros entre 1 y 10

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 24

Las restricciones proveen un meacutetodo de implementar reglas en la base de datos Las restricciones restringen los datos que pueden ser almacenados en las tablas Usualmente se definen usando expresiones que dan como resultado un valor booleano indicando si los datos satisfacen la restriccioacuten o noLas restricciones no son parte formal del modelo relacional pero son incluidas porque juegan el rol de organizar mejor los datos Las restricciones son muy discutidas junto con los conceptos relacionalesPueden crearse los siguientes tipos de restricciones Las restricciones unique y primary key exigen que no haya dos filas en una tabla con los mismos valores en las columnas especificadas Ademaacutes la restriccioacuten primary key requiere que no haya valores nulos en ninguna fila de la columna

241 Crear una restriccioacuten PRIMARY KEYPara crear una restriccioacuten Primary Key realizamos clic en el campo donde

queremos crear la restriccioacuten y luego realizamos clic en el iacutecono 242 Crear una restriccioacuten UNIQUEPara crear una restriccioacuten UNIQUE realizamos clic en el campo donde queremos crear dicha restriccioacuten y luego escogemos el menuacute Table Designe y luego en IndexesKeys

Nos aparece la siguiente ventana en donde dice Type escogemos Unique Key

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 25

Realizamos clic en close y guardamos la tabla

La integridad de referencia ( references ) exige que los datos insertados en columnas especiacuteficas ya tengan datos coincidentes en la tabla y columnas especificadas Las restricciones check limitan los valores de datos insertados en las columnas

243 Agregar una restriccioacuten CHECKRealizamos clic derecho dentro del explorador de objetos en la seccioacuten tables buscamos el nombre de la tabla y buscamos constraints realizamos clic derecho con el botoacuten secundario del mouse y escogemos New Constraint

Nos apareced la siguiente ventana

|

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 26

Realizamos clic en este botoacuten para poder editar la expresioacuten que queremos que tenga restricciones

En la ventana que nos aparece ponemos la expresioacuten deseada y realizamos clic en el botoacuten Ok

Para poder editar la tabla y verificar los cambios realizados buscamos en el explorador de objetos el nombre de la tabla realizamos clic derecho y escogemos la opcioacuten Edit Top 200 Rows

Y procedemos a ingresar datos para probarTambieacuten se puede imponer la integridad de datos restringiendo el uso de valores nulos en una columna (las palabras clave null o not null ) y proporcionando valores predeterminados para columnas (la claacuteusula default )

25 Diagramas de bases de datosLos diagramas de bases de datos se utiliza para visualizar las tablas graacuteficamente y para poder establecer las relaciones

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 27

Para crear un diagrama hacemos clic en el explorador de objetos hacemos clic en el nombre de la base de datos y escogemos Database Diagrams hacemos clic derecho escogemos new Database Diagrams

Nos aparece el siguiente mensaje realizamos un clic dentro del botoacuten Yes

Volvemos hacer clic derechos y volvemos a escoger New Data Base Diagram

Aparece la siguiente ventana en pantalla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 28

Seleccionamos todas y escogemos AddNos aparece la siguiente ventana

En el caso de tener una relacioacuten muchos a muchos debemos romper la relacioacuten con una tercera tabla para esto desde el mismo Database Diagram hacemos clic derecho en un lugar en blanco y escogemos new table llenos las columnas con los campos y tipos de datos respectivosDebemos tomar en cuenta que en las tablas a donde va la relacioacuten tiene que tener su respectiva llave foraacutenea y para poder establecer la relacioacuten

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 29

arrastramos desde el campo principal hacia la llave foraacutenea es decir de la tabla padre a la hijaQuedando las relaciones asiacute

Finalmente cerramos la base de datos nos aparece la siguiente ventana

pidiendo guardar el Database Diagram le demos un nombre y realizamos clic

en el botoacuten OK

252 Ejercicios

Los diagramas del ejercicio 1 y 2 del capiacutetulo anterior pasar al modelo

relacional en SQLSERVER 2008

Los ejercicios 5 y 6 los ejercicios de la prueba pasarlos a sql server

Transformar el siguiente modelo entidad relacioacuten al modelo relacional

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 30

CAPIacuteTULO III

Aplicar las diferentes sentencias y modos en lenguaje SQL

para tratamiento de la informacioacuten almacenada en las

diferentes tablas de la base de datos

31 Lenguaje de definicioacuten de datosLas sentencias DDL son CREATE ALTER y DROP Siempre se usan estas

sentencias junto con el tipo de objeto y el nombre del objeto

CREATE

Crea una base de datos o un objeto

Sintaxis

Create database nombre on grupo_base de datos filegroup

Ejemplo

USE mastergoIF DB_ID (Ncalificaciones) IS NULL BEGIN create database calificaciones on primary( name = calificaciones filename = Ccalificacionescalificacionesmdf

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 31

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 12: Base de Datos

- Las carreteras se dividen en tramos Un tramo siempre pertenece a una uacutenica carretera y no puede cambiar de carretera- Un tramo puede pasar por varias comunas interesando conocer el Km de la carretera y la comuna donde empieza el tramo y en donde termina- Para los tramos que suponen principio o final de carretera interesa saber si es que la carreteraconcluye fiacutesicamente o es que confluye en otra carretera En este caso interesa conocer con queacutecarretera confluye y en queacute kiloacutemetro tramo y comunaProblema 4 Sistema de vuelosObtener el diagrama ER para un sistema de control de vuelos adaptado a las siguientes reglas degestioacuten (indicar las entidades interrelaciones etc que se deducen de cada una de las reglas)a) De cada aeropuerto se conoce su coacutedigo nombre ciudad y paiacutesb) En cada aeropuerto pueden tomar tierra diversos modelos de aviones (el modelo de un avioacutendetermina su capacidad es decir el nuacutemero de plazasc) En cada aeropuerto existe una coleccioacuten de programas de vuelo En cada programa de vuelo se indica el nuacutemero de vuelo liacutenea aeacuterea y diacuteas de la semana en que existe dicho vuelod) Cada programa de vuelo despega de un aeropuerto y aterriza en otroe) Los nuacutemeros de vuelo son uacutenicos para todo el mundof) En cada aeropuerto hay muacuteltiples aterrizajes y despegues Todos los aeropuertos contemplados estaacuten en activo es decir tienen alguacuten aterrizaje y alguacuten despegueg) Cada vuelo realizado pertenece a un cierto programa de vuelo Para cada vuelo se quiere conocer su fecha plazas vaciacuteas y el modelo de avioacuten utilizadoh) Algunos programas de vuelo incorporan escalas teacutecnicas intermedias entre los aeropuertos de salida y de llegada Se entiende por escala teacutecnica a un aterrizaje y despegue consecutivos sin altas oacute bajas de pasajerosi) De cada vuelo se quieren conocer las escalas teacutecnicas ordenadas asignaacutendole a cada una un nuacutemero de ordenPor ejemplo el programa de vuelo 555 de Iberia con vuelos los lunes y jueves despega de Barajas-Madrid-Espantildea y aterriza en Caudell-Sydney-Australia teniendo las siguientes escalas teacutecnicas 1- Los Pradintildeos-Sao Paulo-Brasil 2-El Emperador-Santiago-Chile y 3-Saint Kitts-Auckland-Nueva Zelanda1048576 iquestQue cambios se produciraacuten en el caso anterior si en las escalas pudiesen bajar o subir pasajerosExplicar coacutemo se podriacutea representar esta nueva situacioacutenProblema 5 () OlimpiacuteadasLas sedes oliacutempicas se dividen en complejos deportivos Los complejos deportivos se subdividen en aquellos en los que se desarrolla un uacutenico deporte y en los polideportivos Los complejos polideportivos tienen aacutereas designadas para cada deporte con un indicador de localizacioacuten (ejemplo centro esquina- NE etc) Un complejo tiene una localizacioacuten un jefe de organizacioacuten individual y un aacuterea total ocupada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 12

Los dos tipos de complejos (deporte uacutenico y polideportivo) tendraacuten diferentes tipos de informacioacuten Para cada tipo de sede se conservaraacute el nuacutemero de complejos junto con su presupuesto aproximadoCada complejo celebra una serie de eventos (ejemplo la pista del estadio puede celebrar muchascarreras distintas) Para cada evento estaacute prevista una fecha duracioacuten nuacutemero de participantes nuacutemero de comisarios Una lista de todos los comisarios se conservaraacute junto con la lista de los eventos en los que esteacute involucrado cada comisario ya sea cumpliendo la tarea de juez u observador Tanto para cada evento como para el mantenimiento se necesitaraacute cierto equipamiento (ejemplo arcos peacutertigas barras paralelas etc)Problema 6 Educando SAEn la Empresa Educando SA se lleva control de sus Bienes y Servicios El intereacutes primario es poder hacer que los Bienes se manejen de forma raacutepida y con el menor grado de error Para esto quien maneja la seccioacuten de Bienes y Suministros plantea las siguientes condiciones del negocio para la construccioacuten de una base de datos10485761048576La Seccioacuten estaacute dividida en tres (3) aacutereas COMPRAS ALMACEN INVENTARIO10485761048576El aacuterea de Compras funciona de la siguiente formao Recibe las solicitudes de compras de las diferentes aacutereas de la empresao Cada solicitud tiene un responsableo Cada solicitud es autorizada por el jefe del aacuterea y posteriormente por el DirectorFinancieroo Quien realiza una solicitud puede ser responsable de uno o varios centros de costos conla salvedad de que eacutel como empleado solo estaacute adscrito a unoo De la solicitud se debe diligenciar la siguiente informacioacuten Nuacutemero de la solicitud (consecutivo) Fecha Responsable (nombre y ceacutedula) Centro de Costos Rubro presupuestal del cual se descargaraacute la compra En cada solicitud se pueden discriminar uno o muchos iacutetems con la siguiente informacioacuten iacutetem nombre del bien cantidad solicitada unidad de medida del bien valor unitario y valor total Cada solicitud debe ser totalizadao Cada bien es identificado por un coacutedigo universal que es uacutenico y es de caraacutecter devolutivo (suministro) o un bien inmuebleo Una vez diligenciada la solicitud es remitida al aacuterea de compras para realizar sucorrespondiente cotizacioacuteno Las cotizaciones son realizadas con uno o varios proveedores de los bienes solicitadoso Una vez la cotizacioacuten definitiva estaacute lista se crea una orden contractual que maneja lasiguiente informacioacuten Nuacutemero de la orden contractual nit y nombre del proveedor al cualse le va a realizar la compra fecha de la orden monto total de la orden fecha de entrega Cada orden puede tener asociado uno o varios iacutetems de la solicitud o solicitudes que van a ser despachadas Cada iacutetem tiene la siguiente informacioacuten nombre del bien cantidad solicitada cantidad despachada unidad de medida del bien valor unitario y valor total

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 13

o La orden de compra es aprobada por el Director Financiero para que sea enviada alproveedor elegido10485761048576El aacuterea de Almaceacuten funciona de la siguiente formao Su funcioacuten principal es recepcionar los bienes que llegan de los proveedores ydistribuirlos a las correspondientes aacutereas que realizaron las solicitudes de compraso Cuando llega un proveedor mercanciacutea este hace una entrega fiacutesica de los bienes loscuales son comparados con la factura que este entrega y con la orden de compracorrespondiente Si esta accioacuten es correcta se registra una entrada de almaceacuten por cadafactura relacionada con la siguiente informacioacuten Nuacutemero de Entrada Fecha Nuacutemero defactura Proveedor Total Bienes Valor Total (los totales deben coincidir con los de lafactura) Adjunto a esta se discriminan los iacutetems recibidos con la siguiente informacioacutennombre del bien cantidad entregadao Cuando el almaceacuten decide despachar los bienes a las diferentes aacutereas solicitantesregistra cada una de las entregas en Salidas de Almaceacuten con la siguiente informacioacutenNuacutemero de Salida Empleado responsable del bien a entregar fecha de salida fecha deentrega Por cada entrega se detalla cada uno de los iacutetems con la siguiente informacioacutennombre del bien cantidad entregadao Una entrada de almaceacuten puede generar muchas salidas de almaceacuten por ejemplo Pueden ingresar 500 pacas de papel higieacutenico pero como se debe repartir entrevarias aacutereas cada una requiere de una salida de almaceacuten10485761048576El aacuterea de inventarios funciona de la siguiente formao Es la encargada de administrar y controlar la ubicacioacuten de los bienes dentro de laempresa por esto antes de que el bien salga del almaceacuten debe ser codificado a traveacutesde un coacutedigo uacutenico que lo haga identificable dentro de la empresao La ubicacioacuten del bien se identifica por la siguiente informacioacuten responsable del bienfecha de entrega direccioacuten del bien (ubicacioacuten)Disentildear modelo ER para la base de datosProblema 7 Torneo de Tenis Grand SlamEl sistema debe memorizar todos los encuentros que se han desarrollado desde que existe el torneo asiacute como las siguientes caracteriacutesticas de estosDescripcioacutenEl Grand Slam se compone de cuatro torneos anuales que se celebran en Gran Bretantildea Estados Unidos Francia y Australia En cada paiacutes se pueden

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 14

desarrollar en distintos lugares (p ej en EE UU Puede desarrollarse en Forest Hill o en Flashing Meadows)Cada partido tiene asociado un premio de consolacioacuten para el perdedor que dependeraacute de la fase en que se encuentre el torneo (p ej el perdedor de octavos de final puede ganar 5000 doacutelares) El ganador de a final recibiraacute el premio correspondiente al torneoCada torneo tiene cinco modalidades Individual masculino individual femenino dobles masculino dobles femenino y dobles mixtosTambieacuten hay que tener en cuenta la nacionalidad de un jugador de forma que acuteeste puede ser apaacutetrida o tener varias nacionalidadesResultados a considerarEl sistema debe dar respuesta a las siguientes preguntas1 Dado un antildeo y un torneo composicioacuten y resultado de los partidos2 Lista de aacuterbitros que participaron en el torneo3 Ganancias percibidas en premios por un jugador a lo largo del torneo4 Lista de entrenadores que han entrenado a un jugador a lo largo del torneo y fechas en las que lo hizo Ejemplos de acceso a la base de datos1 Connors gano Gerulaitis en Roland Garros en 1979 en cuartos de final en individuales masculinos por6-3 4-67-5 6-02 El sentildeor Wilkinson arbitro ese partido3 Alemania ha ganado dos veces las individuales masculinas de Wimbledon Borg ha ganado 2000000de doacutelares a lo largo de su participacioacuten en el Grand Slam4 El ganado de Roland Garros de 1987 ganoacute 20000 doacutelares5 Noah ha jugado cuatro veces en dobles mixtos con MandlikovaProblema 8Se desea crear un sitio web con informacioacuten referente a las peliacuteculas en cartel en las salas de un dudoso cine cercano a la plaza de armasDe cada peliacutecula se almacena una ficha con su tiacutetulo de distribucioacuten su tiacutetulo original su geacutenero el idioma origina si tiene subtiacutetulos en espantildeol o no los paises de origen el antildeo de la produccioacuten la url del sitio web de la peliacutecula la duracioacuten (en horas y minutos) la calificacioacuten (Apta todo puacuteblico+9 antildeos +15 antildeos+18 antildeos) fecha de estreno en Santiago un resumen y un identificador de la peliacutecula De cada peliacutecula interesa conocer la lista de directores y el reparto es decir para cada actor que trabaja el nombre de todos los personajes que interpretaAdemaacutes interesa disponer de informacioacuten sobre los directores y actores que trabajan en cada peliacutecula De ambos se conoce su nombre (que lo identifica) y su nacionalidad Ademaacutes se desea conocer la cantidad de peliacuteculas en las que dirigieron o actuaron Tenga en cuenta que hay personas que cumplen los dos rolesLos cines pueden tener maacutes de una sala y cada semana cada uno de los cines enviacutea la cartelera para dicha semana indicando de detalle de las funciones Para cada funcioacuten se conoce el diacutea de la semana y la hora de comienzo y obviamente la sala y la peliacutecula que exhibe De cada sala se sabe el nombre un nuacutemero que la identifica dentro del cine y la cantidad de butacas que posee De cada cine se conoce el nombre que lo identifica su direccioacuten y teleacutefono para consultas

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 15

Algunos cines cuentan con promociones Estas promociones dependen de la funcioacuten (Ej De lunes a jueves antes de las 18 50 de descuento en la sala tal del cine tal para la peliacutecula cualLa funcioacuten del lunes a las 14 para la peliacutecula tal en la sala cual no se cobra a los escolares con tuacutenica ) De cada promocioacuten se conoce una descripcioacuten y el descuento que aplicaAdemaacutes del resumen de la peliacutecula que se incluye en la ficha interesa mostrar la opinioacuten de las personas que vieron la peliacutecula De cada opinioacuten se conoce el nombre de la persona que la realiza su edad le fecha en que registroacute su opinioacuten la calificacioacuten que le dio a la peliacutecula (Obra Maestra Muy BuenaBuena Regular Mala) y el comentario propiamente dicho A cada opinioacuten se le asigna un nuacutemero que la identifica respecto de la peliacutecula sobre la cual opina

15 Normalizacioacuten151 Primera forma normalUna tabla estaacute en Primera Forma Normal si

Todos los atributos son atoacutemicos Un atributo es atoacutemico si los elementos del dominio son indivisibles miacutenimos

La tabla contiene una llave primaria uacutenica La llave primaria no contiene atributos nulos No debe existir variacioacuten en el nuacutemero de columnas Los Campos no llave deben identificarse por la llave (Dependencia

Funcional) Debe Existir una independencia del orden tanto de las filas como de las

columnas es decir si los datos cambian de orden no deben cambiar sus significados

Una tabla no puede tener muacuteltiples valores en cada columna Los datos son atoacutemicos (Si a cada valor de X le pertenece un valor de Y y viceversa)Esta forma normal elimina los valores repetidos dentro de una BD

152 Segunda Forma Normal (2FN)

Dependencia Funcional Una relacioacuten estaacute en 2FN si estaacute en 1FN y si los atributos que no forman parte de ninguna clave dependen de forma completa de la clave principal Es decir que no existen dependencias parciales (Todos los atributos que no son clave principal deben depender uacutenicamente de la clave principal)

En otras palabras podriacuteamos decir que la segunda forma normal estaacute basada en el concepto de dependencia completamente funcional Una dependencia funcional es completamente funcional si al eliminar los atributos A de X significa que la dependencia no es mantenida esto es que Una dependencia funcional es una dependencia parcial si hay algunos atributos que pueden ser eliminados

de X y la dependencia todaviacutea se mantiene esto es

Por ejemplo DNI ID_PROYECTO HORAS_TRABAJO (con el DNI de un empleado y el ID de un proyecto sabemos cuaacutentas horas de trabajo por semana trabaja un empleado en dicho proyecto) es completamente dependiente dado que ni DNI HORAS_TRABAJO ni ID_PROYECTO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 16

HORAS_TRABAJO mantienen la dependencia Sin embargo DNI ID_PROYECTO NOMBRE_EMPLEADO es parcialmente dependiente dado que DNI NOMBRE_EMPLEADO mantiene la dependencia

153 Tercera Forma Normal (3FN)

La tabla se encuentra en 3FN si es 2FN y si no existe ninguna dependencia funcional transitiva entre los atributos que no son clave

Un ejemplo de este concepto seriacutea que una dependencia funcional X-gtY en un esquema de relacioacuten R es una dependencia transitiva si hay un conjunto de atributos Z que no es un subconjunto de alguna clave de R donde se mantiene X-gtZ y Z-gtY

Por ejemplo la dependencia SSN-gtDMGRSSN es una dependencia transitiva en EMP_DEPT de la siguiente figura Decimos que la dependencia de DMGRSSN el atributo clave SSN es transitiva viacutea DNUMBER porque las dependencias SSNrarrDNUMBER y DNUMBERrarrDMGRSSN son mantenidas y DNUMBER no es un subconjunto de la clave de EMP_DEPT Intuitivamente podemos ver que la dependencia de DMGRSSN sobre DNUMBER es indeseable en EMP_DEPT dado que DNUMBER no es una clave de EMP_DEPT

Formalmente un esquema de relacion estaacute en 3 Forma Normal Elmasri-Navathe[2] si para toda dependencia funcional se cumple al menos una de las siguientes condiciones

es superllave o clave

es atributo primo de esto es si es miembro de alguna clave en

Ademaacutes el esquema debe cumplir necesariamente

Ejemplo

Id estudiante Ci Nombres Apellidos Curso Materia Descripicoacuten01 1803327418 Fransico

FabianCamacho Saltos

4 En Ingeacutes

02 10152465 Carlos Banabeti

Ruales Camacho

5 ES Espantildeol

03

1 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 17

2 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

Id Curso Curso01 Primero02 SegundoId Materia Materia Descripcioacuten01 En Ingleacutes02 MT Matemaacutetica

3 era forma normal

Iddescripcion DescripcioacutenIngleacutesMatemaacutetica

Dada la siguiente tabla normalizarlaIDcliente Ceacutedula Nombres Direccioacuten Proveedor Producto

16 Herramientas para la normalizacioacuten

A continuacioacuten se mencionan algunas herramientas para normalizar una base de datos mediante un proceso automatizado

CAPIacuteTULO IIRealizar diferentes tareas de disentildeo y planificacioacuten sobre la

estructura de tablas

21 Tabla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 18

Id Materia Materia01 En02 MT

Es un conjunto de datos ordenados en filas y columnas

22 Tipos de datossql_variant Puede usarse en columnas paraacutemetros variables y valores devueltos de funciones definidas por el usuariosql_variant permite que estos objetos de base de datos admitan valores de otros tipos de datosxml Capaz de almacenar documentos XML oacute fragmentos XML que es posible utilizar tanto en variables como en campos de tablas y que a diferencia de otros tipos de datos ofrece meacutetodos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 19

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 20

23 Creacioacuten de tablasAntes de aprender sobre la creacioacuten de tablas es necesario conocer los pasos para crear una base de datos en sql server 2008Para crear una base de datos en SQL Server 2008 debemos seguir los siguientes pasos1- Ingresar a SQLServer

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 21

2- En la ventana que nos aparece realizamos clic derecho en donde dice database

3- Nos aparece el siguiente menuacute hacemos clic donde dice New Database

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 22

4- Nos aparece la siguiente ventana

En donde dice Database Name le damos un nombre a la base de datos

5- Luego hacemos clic en

Nos aparece la siguiente ventana

Aquiacute tenemos dos opciones In percent nos permite que si sobrepasa el tamantildeo de la base de datos crezca en porcentajeIn Megabytes nos permite hacer que la base de datos crezca de 1 Megabyte en 1 megabyte si sobrepasa el tamantildeo y listoAhora para crear una tabla seguimos los siguientes pasos1- Hacemos clic en donde dice database buscamos el nombre de nuestra base de datos en la seccioacuten tables realizamos clic derecho con el botoacuten secundario del mouse

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 23

Nos aparece el siguiente menuacute

Hacemos clic en New Table

Y en donde dice Column Name vamos poniendo los campos de las bases de datos con su respectivo tipoAl final hacemos clic en donde estaacute el iacutecono de un diskette nos aparece una ventana pidiendo el nombre de la tabla le asignamos un nombre y realizamos clic en el botoacuten ok24 Creacioacuten de RestriccionesUna restriccioacuten es una condicioacuten que obliga el cumplimiento de ciertas condiciones en la base de datos Algunas no son determinadas por los usuarios sino que son inherentemente definidas por el simple hecho de que la base de datos sea relacional Algunas otras restricciones las puede definir el usuario por ejemplo usar un campo con valores enteros entre 1 y 10

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 24

Las restricciones proveen un meacutetodo de implementar reglas en la base de datos Las restricciones restringen los datos que pueden ser almacenados en las tablas Usualmente se definen usando expresiones que dan como resultado un valor booleano indicando si los datos satisfacen la restriccioacuten o noLas restricciones no son parte formal del modelo relacional pero son incluidas porque juegan el rol de organizar mejor los datos Las restricciones son muy discutidas junto con los conceptos relacionalesPueden crearse los siguientes tipos de restricciones Las restricciones unique y primary key exigen que no haya dos filas en una tabla con los mismos valores en las columnas especificadas Ademaacutes la restriccioacuten primary key requiere que no haya valores nulos en ninguna fila de la columna

241 Crear una restriccioacuten PRIMARY KEYPara crear una restriccioacuten Primary Key realizamos clic en el campo donde

queremos crear la restriccioacuten y luego realizamos clic en el iacutecono 242 Crear una restriccioacuten UNIQUEPara crear una restriccioacuten UNIQUE realizamos clic en el campo donde queremos crear dicha restriccioacuten y luego escogemos el menuacute Table Designe y luego en IndexesKeys

Nos aparece la siguiente ventana en donde dice Type escogemos Unique Key

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 25

Realizamos clic en close y guardamos la tabla

La integridad de referencia ( references ) exige que los datos insertados en columnas especiacuteficas ya tengan datos coincidentes en la tabla y columnas especificadas Las restricciones check limitan los valores de datos insertados en las columnas

243 Agregar una restriccioacuten CHECKRealizamos clic derecho dentro del explorador de objetos en la seccioacuten tables buscamos el nombre de la tabla y buscamos constraints realizamos clic derecho con el botoacuten secundario del mouse y escogemos New Constraint

Nos apareced la siguiente ventana

|

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 26

Realizamos clic en este botoacuten para poder editar la expresioacuten que queremos que tenga restricciones

En la ventana que nos aparece ponemos la expresioacuten deseada y realizamos clic en el botoacuten Ok

Para poder editar la tabla y verificar los cambios realizados buscamos en el explorador de objetos el nombre de la tabla realizamos clic derecho y escogemos la opcioacuten Edit Top 200 Rows

Y procedemos a ingresar datos para probarTambieacuten se puede imponer la integridad de datos restringiendo el uso de valores nulos en una columna (las palabras clave null o not null ) y proporcionando valores predeterminados para columnas (la claacuteusula default )

25 Diagramas de bases de datosLos diagramas de bases de datos se utiliza para visualizar las tablas graacuteficamente y para poder establecer las relaciones

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 27

Para crear un diagrama hacemos clic en el explorador de objetos hacemos clic en el nombre de la base de datos y escogemos Database Diagrams hacemos clic derecho escogemos new Database Diagrams

Nos aparece el siguiente mensaje realizamos un clic dentro del botoacuten Yes

Volvemos hacer clic derechos y volvemos a escoger New Data Base Diagram

Aparece la siguiente ventana en pantalla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 28

Seleccionamos todas y escogemos AddNos aparece la siguiente ventana

En el caso de tener una relacioacuten muchos a muchos debemos romper la relacioacuten con una tercera tabla para esto desde el mismo Database Diagram hacemos clic derecho en un lugar en blanco y escogemos new table llenos las columnas con los campos y tipos de datos respectivosDebemos tomar en cuenta que en las tablas a donde va la relacioacuten tiene que tener su respectiva llave foraacutenea y para poder establecer la relacioacuten

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 29

arrastramos desde el campo principal hacia la llave foraacutenea es decir de la tabla padre a la hijaQuedando las relaciones asiacute

Finalmente cerramos la base de datos nos aparece la siguiente ventana

pidiendo guardar el Database Diagram le demos un nombre y realizamos clic

en el botoacuten OK

252 Ejercicios

Los diagramas del ejercicio 1 y 2 del capiacutetulo anterior pasar al modelo

relacional en SQLSERVER 2008

Los ejercicios 5 y 6 los ejercicios de la prueba pasarlos a sql server

Transformar el siguiente modelo entidad relacioacuten al modelo relacional

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 30

CAPIacuteTULO III

Aplicar las diferentes sentencias y modos en lenguaje SQL

para tratamiento de la informacioacuten almacenada en las

diferentes tablas de la base de datos

31 Lenguaje de definicioacuten de datosLas sentencias DDL son CREATE ALTER y DROP Siempre se usan estas

sentencias junto con el tipo de objeto y el nombre del objeto

CREATE

Crea una base de datos o un objeto

Sintaxis

Create database nombre on grupo_base de datos filegroup

Ejemplo

USE mastergoIF DB_ID (Ncalificaciones) IS NULL BEGIN create database calificaciones on primary( name = calificaciones filename = Ccalificacionescalificacionesmdf

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 31

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 13: Base de Datos

Los dos tipos de complejos (deporte uacutenico y polideportivo) tendraacuten diferentes tipos de informacioacuten Para cada tipo de sede se conservaraacute el nuacutemero de complejos junto con su presupuesto aproximadoCada complejo celebra una serie de eventos (ejemplo la pista del estadio puede celebrar muchascarreras distintas) Para cada evento estaacute prevista una fecha duracioacuten nuacutemero de participantes nuacutemero de comisarios Una lista de todos los comisarios se conservaraacute junto con la lista de los eventos en los que esteacute involucrado cada comisario ya sea cumpliendo la tarea de juez u observador Tanto para cada evento como para el mantenimiento se necesitaraacute cierto equipamiento (ejemplo arcos peacutertigas barras paralelas etc)Problema 6 Educando SAEn la Empresa Educando SA se lleva control de sus Bienes y Servicios El intereacutes primario es poder hacer que los Bienes se manejen de forma raacutepida y con el menor grado de error Para esto quien maneja la seccioacuten de Bienes y Suministros plantea las siguientes condiciones del negocio para la construccioacuten de una base de datos10485761048576La Seccioacuten estaacute dividida en tres (3) aacutereas COMPRAS ALMACEN INVENTARIO10485761048576El aacuterea de Compras funciona de la siguiente formao Recibe las solicitudes de compras de las diferentes aacutereas de la empresao Cada solicitud tiene un responsableo Cada solicitud es autorizada por el jefe del aacuterea y posteriormente por el DirectorFinancieroo Quien realiza una solicitud puede ser responsable de uno o varios centros de costos conla salvedad de que eacutel como empleado solo estaacute adscrito a unoo De la solicitud se debe diligenciar la siguiente informacioacuten Nuacutemero de la solicitud (consecutivo) Fecha Responsable (nombre y ceacutedula) Centro de Costos Rubro presupuestal del cual se descargaraacute la compra En cada solicitud se pueden discriminar uno o muchos iacutetems con la siguiente informacioacuten iacutetem nombre del bien cantidad solicitada unidad de medida del bien valor unitario y valor total Cada solicitud debe ser totalizadao Cada bien es identificado por un coacutedigo universal que es uacutenico y es de caraacutecter devolutivo (suministro) o un bien inmuebleo Una vez diligenciada la solicitud es remitida al aacuterea de compras para realizar sucorrespondiente cotizacioacuteno Las cotizaciones son realizadas con uno o varios proveedores de los bienes solicitadoso Una vez la cotizacioacuten definitiva estaacute lista se crea una orden contractual que maneja lasiguiente informacioacuten Nuacutemero de la orden contractual nit y nombre del proveedor al cualse le va a realizar la compra fecha de la orden monto total de la orden fecha de entrega Cada orden puede tener asociado uno o varios iacutetems de la solicitud o solicitudes que van a ser despachadas Cada iacutetem tiene la siguiente informacioacuten nombre del bien cantidad solicitada cantidad despachada unidad de medida del bien valor unitario y valor total

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 13

o La orden de compra es aprobada por el Director Financiero para que sea enviada alproveedor elegido10485761048576El aacuterea de Almaceacuten funciona de la siguiente formao Su funcioacuten principal es recepcionar los bienes que llegan de los proveedores ydistribuirlos a las correspondientes aacutereas que realizaron las solicitudes de compraso Cuando llega un proveedor mercanciacutea este hace una entrega fiacutesica de los bienes loscuales son comparados con la factura que este entrega y con la orden de compracorrespondiente Si esta accioacuten es correcta se registra una entrada de almaceacuten por cadafactura relacionada con la siguiente informacioacuten Nuacutemero de Entrada Fecha Nuacutemero defactura Proveedor Total Bienes Valor Total (los totales deben coincidir con los de lafactura) Adjunto a esta se discriminan los iacutetems recibidos con la siguiente informacioacutennombre del bien cantidad entregadao Cuando el almaceacuten decide despachar los bienes a las diferentes aacutereas solicitantesregistra cada una de las entregas en Salidas de Almaceacuten con la siguiente informacioacutenNuacutemero de Salida Empleado responsable del bien a entregar fecha de salida fecha deentrega Por cada entrega se detalla cada uno de los iacutetems con la siguiente informacioacutennombre del bien cantidad entregadao Una entrada de almaceacuten puede generar muchas salidas de almaceacuten por ejemplo Pueden ingresar 500 pacas de papel higieacutenico pero como se debe repartir entrevarias aacutereas cada una requiere de una salida de almaceacuten10485761048576El aacuterea de inventarios funciona de la siguiente formao Es la encargada de administrar y controlar la ubicacioacuten de los bienes dentro de laempresa por esto antes de que el bien salga del almaceacuten debe ser codificado a traveacutesde un coacutedigo uacutenico que lo haga identificable dentro de la empresao La ubicacioacuten del bien se identifica por la siguiente informacioacuten responsable del bienfecha de entrega direccioacuten del bien (ubicacioacuten)Disentildear modelo ER para la base de datosProblema 7 Torneo de Tenis Grand SlamEl sistema debe memorizar todos los encuentros que se han desarrollado desde que existe el torneo asiacute como las siguientes caracteriacutesticas de estosDescripcioacutenEl Grand Slam se compone de cuatro torneos anuales que se celebran en Gran Bretantildea Estados Unidos Francia y Australia En cada paiacutes se pueden

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 14

desarrollar en distintos lugares (p ej en EE UU Puede desarrollarse en Forest Hill o en Flashing Meadows)Cada partido tiene asociado un premio de consolacioacuten para el perdedor que dependeraacute de la fase en que se encuentre el torneo (p ej el perdedor de octavos de final puede ganar 5000 doacutelares) El ganador de a final recibiraacute el premio correspondiente al torneoCada torneo tiene cinco modalidades Individual masculino individual femenino dobles masculino dobles femenino y dobles mixtosTambieacuten hay que tener en cuenta la nacionalidad de un jugador de forma que acuteeste puede ser apaacutetrida o tener varias nacionalidadesResultados a considerarEl sistema debe dar respuesta a las siguientes preguntas1 Dado un antildeo y un torneo composicioacuten y resultado de los partidos2 Lista de aacuterbitros que participaron en el torneo3 Ganancias percibidas en premios por un jugador a lo largo del torneo4 Lista de entrenadores que han entrenado a un jugador a lo largo del torneo y fechas en las que lo hizo Ejemplos de acceso a la base de datos1 Connors gano Gerulaitis en Roland Garros en 1979 en cuartos de final en individuales masculinos por6-3 4-67-5 6-02 El sentildeor Wilkinson arbitro ese partido3 Alemania ha ganado dos veces las individuales masculinas de Wimbledon Borg ha ganado 2000000de doacutelares a lo largo de su participacioacuten en el Grand Slam4 El ganado de Roland Garros de 1987 ganoacute 20000 doacutelares5 Noah ha jugado cuatro veces en dobles mixtos con MandlikovaProblema 8Se desea crear un sitio web con informacioacuten referente a las peliacuteculas en cartel en las salas de un dudoso cine cercano a la plaza de armasDe cada peliacutecula se almacena una ficha con su tiacutetulo de distribucioacuten su tiacutetulo original su geacutenero el idioma origina si tiene subtiacutetulos en espantildeol o no los paises de origen el antildeo de la produccioacuten la url del sitio web de la peliacutecula la duracioacuten (en horas y minutos) la calificacioacuten (Apta todo puacuteblico+9 antildeos +15 antildeos+18 antildeos) fecha de estreno en Santiago un resumen y un identificador de la peliacutecula De cada peliacutecula interesa conocer la lista de directores y el reparto es decir para cada actor que trabaja el nombre de todos los personajes que interpretaAdemaacutes interesa disponer de informacioacuten sobre los directores y actores que trabajan en cada peliacutecula De ambos se conoce su nombre (que lo identifica) y su nacionalidad Ademaacutes se desea conocer la cantidad de peliacuteculas en las que dirigieron o actuaron Tenga en cuenta que hay personas que cumplen los dos rolesLos cines pueden tener maacutes de una sala y cada semana cada uno de los cines enviacutea la cartelera para dicha semana indicando de detalle de las funciones Para cada funcioacuten se conoce el diacutea de la semana y la hora de comienzo y obviamente la sala y la peliacutecula que exhibe De cada sala se sabe el nombre un nuacutemero que la identifica dentro del cine y la cantidad de butacas que posee De cada cine se conoce el nombre que lo identifica su direccioacuten y teleacutefono para consultas

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 15

Algunos cines cuentan con promociones Estas promociones dependen de la funcioacuten (Ej De lunes a jueves antes de las 18 50 de descuento en la sala tal del cine tal para la peliacutecula cualLa funcioacuten del lunes a las 14 para la peliacutecula tal en la sala cual no se cobra a los escolares con tuacutenica ) De cada promocioacuten se conoce una descripcioacuten y el descuento que aplicaAdemaacutes del resumen de la peliacutecula que se incluye en la ficha interesa mostrar la opinioacuten de las personas que vieron la peliacutecula De cada opinioacuten se conoce el nombre de la persona que la realiza su edad le fecha en que registroacute su opinioacuten la calificacioacuten que le dio a la peliacutecula (Obra Maestra Muy BuenaBuena Regular Mala) y el comentario propiamente dicho A cada opinioacuten se le asigna un nuacutemero que la identifica respecto de la peliacutecula sobre la cual opina

15 Normalizacioacuten151 Primera forma normalUna tabla estaacute en Primera Forma Normal si

Todos los atributos son atoacutemicos Un atributo es atoacutemico si los elementos del dominio son indivisibles miacutenimos

La tabla contiene una llave primaria uacutenica La llave primaria no contiene atributos nulos No debe existir variacioacuten en el nuacutemero de columnas Los Campos no llave deben identificarse por la llave (Dependencia

Funcional) Debe Existir una independencia del orden tanto de las filas como de las

columnas es decir si los datos cambian de orden no deben cambiar sus significados

Una tabla no puede tener muacuteltiples valores en cada columna Los datos son atoacutemicos (Si a cada valor de X le pertenece un valor de Y y viceversa)Esta forma normal elimina los valores repetidos dentro de una BD

152 Segunda Forma Normal (2FN)

Dependencia Funcional Una relacioacuten estaacute en 2FN si estaacute en 1FN y si los atributos que no forman parte de ninguna clave dependen de forma completa de la clave principal Es decir que no existen dependencias parciales (Todos los atributos que no son clave principal deben depender uacutenicamente de la clave principal)

En otras palabras podriacuteamos decir que la segunda forma normal estaacute basada en el concepto de dependencia completamente funcional Una dependencia funcional es completamente funcional si al eliminar los atributos A de X significa que la dependencia no es mantenida esto es que Una dependencia funcional es una dependencia parcial si hay algunos atributos que pueden ser eliminados

de X y la dependencia todaviacutea se mantiene esto es

Por ejemplo DNI ID_PROYECTO HORAS_TRABAJO (con el DNI de un empleado y el ID de un proyecto sabemos cuaacutentas horas de trabajo por semana trabaja un empleado en dicho proyecto) es completamente dependiente dado que ni DNI HORAS_TRABAJO ni ID_PROYECTO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 16

HORAS_TRABAJO mantienen la dependencia Sin embargo DNI ID_PROYECTO NOMBRE_EMPLEADO es parcialmente dependiente dado que DNI NOMBRE_EMPLEADO mantiene la dependencia

153 Tercera Forma Normal (3FN)

La tabla se encuentra en 3FN si es 2FN y si no existe ninguna dependencia funcional transitiva entre los atributos que no son clave

Un ejemplo de este concepto seriacutea que una dependencia funcional X-gtY en un esquema de relacioacuten R es una dependencia transitiva si hay un conjunto de atributos Z que no es un subconjunto de alguna clave de R donde se mantiene X-gtZ y Z-gtY

Por ejemplo la dependencia SSN-gtDMGRSSN es una dependencia transitiva en EMP_DEPT de la siguiente figura Decimos que la dependencia de DMGRSSN el atributo clave SSN es transitiva viacutea DNUMBER porque las dependencias SSNrarrDNUMBER y DNUMBERrarrDMGRSSN son mantenidas y DNUMBER no es un subconjunto de la clave de EMP_DEPT Intuitivamente podemos ver que la dependencia de DMGRSSN sobre DNUMBER es indeseable en EMP_DEPT dado que DNUMBER no es una clave de EMP_DEPT

Formalmente un esquema de relacion estaacute en 3 Forma Normal Elmasri-Navathe[2] si para toda dependencia funcional se cumple al menos una de las siguientes condiciones

es superllave o clave

es atributo primo de esto es si es miembro de alguna clave en

Ademaacutes el esquema debe cumplir necesariamente

Ejemplo

Id estudiante Ci Nombres Apellidos Curso Materia Descripicoacuten01 1803327418 Fransico

FabianCamacho Saltos

4 En Ingeacutes

02 10152465 Carlos Banabeti

Ruales Camacho

5 ES Espantildeol

03

1 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 17

2 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

Id Curso Curso01 Primero02 SegundoId Materia Materia Descripcioacuten01 En Ingleacutes02 MT Matemaacutetica

3 era forma normal

Iddescripcion DescripcioacutenIngleacutesMatemaacutetica

Dada la siguiente tabla normalizarlaIDcliente Ceacutedula Nombres Direccioacuten Proveedor Producto

16 Herramientas para la normalizacioacuten

A continuacioacuten se mencionan algunas herramientas para normalizar una base de datos mediante un proceso automatizado

CAPIacuteTULO IIRealizar diferentes tareas de disentildeo y planificacioacuten sobre la

estructura de tablas

21 Tabla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 18

Id Materia Materia01 En02 MT

Es un conjunto de datos ordenados en filas y columnas

22 Tipos de datossql_variant Puede usarse en columnas paraacutemetros variables y valores devueltos de funciones definidas por el usuariosql_variant permite que estos objetos de base de datos admitan valores de otros tipos de datosxml Capaz de almacenar documentos XML oacute fragmentos XML que es posible utilizar tanto en variables como en campos de tablas y que a diferencia de otros tipos de datos ofrece meacutetodos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 19

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 20

23 Creacioacuten de tablasAntes de aprender sobre la creacioacuten de tablas es necesario conocer los pasos para crear una base de datos en sql server 2008Para crear una base de datos en SQL Server 2008 debemos seguir los siguientes pasos1- Ingresar a SQLServer

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 21

2- En la ventana que nos aparece realizamos clic derecho en donde dice database

3- Nos aparece el siguiente menuacute hacemos clic donde dice New Database

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 22

4- Nos aparece la siguiente ventana

En donde dice Database Name le damos un nombre a la base de datos

5- Luego hacemos clic en

Nos aparece la siguiente ventana

Aquiacute tenemos dos opciones In percent nos permite que si sobrepasa el tamantildeo de la base de datos crezca en porcentajeIn Megabytes nos permite hacer que la base de datos crezca de 1 Megabyte en 1 megabyte si sobrepasa el tamantildeo y listoAhora para crear una tabla seguimos los siguientes pasos1- Hacemos clic en donde dice database buscamos el nombre de nuestra base de datos en la seccioacuten tables realizamos clic derecho con el botoacuten secundario del mouse

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 23

Nos aparece el siguiente menuacute

Hacemos clic en New Table

Y en donde dice Column Name vamos poniendo los campos de las bases de datos con su respectivo tipoAl final hacemos clic en donde estaacute el iacutecono de un diskette nos aparece una ventana pidiendo el nombre de la tabla le asignamos un nombre y realizamos clic en el botoacuten ok24 Creacioacuten de RestriccionesUna restriccioacuten es una condicioacuten que obliga el cumplimiento de ciertas condiciones en la base de datos Algunas no son determinadas por los usuarios sino que son inherentemente definidas por el simple hecho de que la base de datos sea relacional Algunas otras restricciones las puede definir el usuario por ejemplo usar un campo con valores enteros entre 1 y 10

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 24

Las restricciones proveen un meacutetodo de implementar reglas en la base de datos Las restricciones restringen los datos que pueden ser almacenados en las tablas Usualmente se definen usando expresiones que dan como resultado un valor booleano indicando si los datos satisfacen la restriccioacuten o noLas restricciones no son parte formal del modelo relacional pero son incluidas porque juegan el rol de organizar mejor los datos Las restricciones son muy discutidas junto con los conceptos relacionalesPueden crearse los siguientes tipos de restricciones Las restricciones unique y primary key exigen que no haya dos filas en una tabla con los mismos valores en las columnas especificadas Ademaacutes la restriccioacuten primary key requiere que no haya valores nulos en ninguna fila de la columna

241 Crear una restriccioacuten PRIMARY KEYPara crear una restriccioacuten Primary Key realizamos clic en el campo donde

queremos crear la restriccioacuten y luego realizamos clic en el iacutecono 242 Crear una restriccioacuten UNIQUEPara crear una restriccioacuten UNIQUE realizamos clic en el campo donde queremos crear dicha restriccioacuten y luego escogemos el menuacute Table Designe y luego en IndexesKeys

Nos aparece la siguiente ventana en donde dice Type escogemos Unique Key

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 25

Realizamos clic en close y guardamos la tabla

La integridad de referencia ( references ) exige que los datos insertados en columnas especiacuteficas ya tengan datos coincidentes en la tabla y columnas especificadas Las restricciones check limitan los valores de datos insertados en las columnas

243 Agregar una restriccioacuten CHECKRealizamos clic derecho dentro del explorador de objetos en la seccioacuten tables buscamos el nombre de la tabla y buscamos constraints realizamos clic derecho con el botoacuten secundario del mouse y escogemos New Constraint

Nos apareced la siguiente ventana

|

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 26

Realizamos clic en este botoacuten para poder editar la expresioacuten que queremos que tenga restricciones

En la ventana que nos aparece ponemos la expresioacuten deseada y realizamos clic en el botoacuten Ok

Para poder editar la tabla y verificar los cambios realizados buscamos en el explorador de objetos el nombre de la tabla realizamos clic derecho y escogemos la opcioacuten Edit Top 200 Rows

Y procedemos a ingresar datos para probarTambieacuten se puede imponer la integridad de datos restringiendo el uso de valores nulos en una columna (las palabras clave null o not null ) y proporcionando valores predeterminados para columnas (la claacuteusula default )

25 Diagramas de bases de datosLos diagramas de bases de datos se utiliza para visualizar las tablas graacuteficamente y para poder establecer las relaciones

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 27

Para crear un diagrama hacemos clic en el explorador de objetos hacemos clic en el nombre de la base de datos y escogemos Database Diagrams hacemos clic derecho escogemos new Database Diagrams

Nos aparece el siguiente mensaje realizamos un clic dentro del botoacuten Yes

Volvemos hacer clic derechos y volvemos a escoger New Data Base Diagram

Aparece la siguiente ventana en pantalla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 28

Seleccionamos todas y escogemos AddNos aparece la siguiente ventana

En el caso de tener una relacioacuten muchos a muchos debemos romper la relacioacuten con una tercera tabla para esto desde el mismo Database Diagram hacemos clic derecho en un lugar en blanco y escogemos new table llenos las columnas con los campos y tipos de datos respectivosDebemos tomar en cuenta que en las tablas a donde va la relacioacuten tiene que tener su respectiva llave foraacutenea y para poder establecer la relacioacuten

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 29

arrastramos desde el campo principal hacia la llave foraacutenea es decir de la tabla padre a la hijaQuedando las relaciones asiacute

Finalmente cerramos la base de datos nos aparece la siguiente ventana

pidiendo guardar el Database Diagram le demos un nombre y realizamos clic

en el botoacuten OK

252 Ejercicios

Los diagramas del ejercicio 1 y 2 del capiacutetulo anterior pasar al modelo

relacional en SQLSERVER 2008

Los ejercicios 5 y 6 los ejercicios de la prueba pasarlos a sql server

Transformar el siguiente modelo entidad relacioacuten al modelo relacional

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 30

CAPIacuteTULO III

Aplicar las diferentes sentencias y modos en lenguaje SQL

para tratamiento de la informacioacuten almacenada en las

diferentes tablas de la base de datos

31 Lenguaje de definicioacuten de datosLas sentencias DDL son CREATE ALTER y DROP Siempre se usan estas

sentencias junto con el tipo de objeto y el nombre del objeto

CREATE

Crea una base de datos o un objeto

Sintaxis

Create database nombre on grupo_base de datos filegroup

Ejemplo

USE mastergoIF DB_ID (Ncalificaciones) IS NULL BEGIN create database calificaciones on primary( name = calificaciones filename = Ccalificacionescalificacionesmdf

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 31

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 14: Base de Datos

o La orden de compra es aprobada por el Director Financiero para que sea enviada alproveedor elegido10485761048576El aacuterea de Almaceacuten funciona de la siguiente formao Su funcioacuten principal es recepcionar los bienes que llegan de los proveedores ydistribuirlos a las correspondientes aacutereas que realizaron las solicitudes de compraso Cuando llega un proveedor mercanciacutea este hace una entrega fiacutesica de los bienes loscuales son comparados con la factura que este entrega y con la orden de compracorrespondiente Si esta accioacuten es correcta se registra una entrada de almaceacuten por cadafactura relacionada con la siguiente informacioacuten Nuacutemero de Entrada Fecha Nuacutemero defactura Proveedor Total Bienes Valor Total (los totales deben coincidir con los de lafactura) Adjunto a esta se discriminan los iacutetems recibidos con la siguiente informacioacutennombre del bien cantidad entregadao Cuando el almaceacuten decide despachar los bienes a las diferentes aacutereas solicitantesregistra cada una de las entregas en Salidas de Almaceacuten con la siguiente informacioacutenNuacutemero de Salida Empleado responsable del bien a entregar fecha de salida fecha deentrega Por cada entrega se detalla cada uno de los iacutetems con la siguiente informacioacutennombre del bien cantidad entregadao Una entrada de almaceacuten puede generar muchas salidas de almaceacuten por ejemplo Pueden ingresar 500 pacas de papel higieacutenico pero como se debe repartir entrevarias aacutereas cada una requiere de una salida de almaceacuten10485761048576El aacuterea de inventarios funciona de la siguiente formao Es la encargada de administrar y controlar la ubicacioacuten de los bienes dentro de laempresa por esto antes de que el bien salga del almaceacuten debe ser codificado a traveacutesde un coacutedigo uacutenico que lo haga identificable dentro de la empresao La ubicacioacuten del bien se identifica por la siguiente informacioacuten responsable del bienfecha de entrega direccioacuten del bien (ubicacioacuten)Disentildear modelo ER para la base de datosProblema 7 Torneo de Tenis Grand SlamEl sistema debe memorizar todos los encuentros que se han desarrollado desde que existe el torneo asiacute como las siguientes caracteriacutesticas de estosDescripcioacutenEl Grand Slam se compone de cuatro torneos anuales que se celebran en Gran Bretantildea Estados Unidos Francia y Australia En cada paiacutes se pueden

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 14

desarrollar en distintos lugares (p ej en EE UU Puede desarrollarse en Forest Hill o en Flashing Meadows)Cada partido tiene asociado un premio de consolacioacuten para el perdedor que dependeraacute de la fase en que se encuentre el torneo (p ej el perdedor de octavos de final puede ganar 5000 doacutelares) El ganador de a final recibiraacute el premio correspondiente al torneoCada torneo tiene cinco modalidades Individual masculino individual femenino dobles masculino dobles femenino y dobles mixtosTambieacuten hay que tener en cuenta la nacionalidad de un jugador de forma que acuteeste puede ser apaacutetrida o tener varias nacionalidadesResultados a considerarEl sistema debe dar respuesta a las siguientes preguntas1 Dado un antildeo y un torneo composicioacuten y resultado de los partidos2 Lista de aacuterbitros que participaron en el torneo3 Ganancias percibidas en premios por un jugador a lo largo del torneo4 Lista de entrenadores que han entrenado a un jugador a lo largo del torneo y fechas en las que lo hizo Ejemplos de acceso a la base de datos1 Connors gano Gerulaitis en Roland Garros en 1979 en cuartos de final en individuales masculinos por6-3 4-67-5 6-02 El sentildeor Wilkinson arbitro ese partido3 Alemania ha ganado dos veces las individuales masculinas de Wimbledon Borg ha ganado 2000000de doacutelares a lo largo de su participacioacuten en el Grand Slam4 El ganado de Roland Garros de 1987 ganoacute 20000 doacutelares5 Noah ha jugado cuatro veces en dobles mixtos con MandlikovaProblema 8Se desea crear un sitio web con informacioacuten referente a las peliacuteculas en cartel en las salas de un dudoso cine cercano a la plaza de armasDe cada peliacutecula se almacena una ficha con su tiacutetulo de distribucioacuten su tiacutetulo original su geacutenero el idioma origina si tiene subtiacutetulos en espantildeol o no los paises de origen el antildeo de la produccioacuten la url del sitio web de la peliacutecula la duracioacuten (en horas y minutos) la calificacioacuten (Apta todo puacuteblico+9 antildeos +15 antildeos+18 antildeos) fecha de estreno en Santiago un resumen y un identificador de la peliacutecula De cada peliacutecula interesa conocer la lista de directores y el reparto es decir para cada actor que trabaja el nombre de todos los personajes que interpretaAdemaacutes interesa disponer de informacioacuten sobre los directores y actores que trabajan en cada peliacutecula De ambos se conoce su nombre (que lo identifica) y su nacionalidad Ademaacutes se desea conocer la cantidad de peliacuteculas en las que dirigieron o actuaron Tenga en cuenta que hay personas que cumplen los dos rolesLos cines pueden tener maacutes de una sala y cada semana cada uno de los cines enviacutea la cartelera para dicha semana indicando de detalle de las funciones Para cada funcioacuten se conoce el diacutea de la semana y la hora de comienzo y obviamente la sala y la peliacutecula que exhibe De cada sala se sabe el nombre un nuacutemero que la identifica dentro del cine y la cantidad de butacas que posee De cada cine se conoce el nombre que lo identifica su direccioacuten y teleacutefono para consultas

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 15

Algunos cines cuentan con promociones Estas promociones dependen de la funcioacuten (Ej De lunes a jueves antes de las 18 50 de descuento en la sala tal del cine tal para la peliacutecula cualLa funcioacuten del lunes a las 14 para la peliacutecula tal en la sala cual no se cobra a los escolares con tuacutenica ) De cada promocioacuten se conoce una descripcioacuten y el descuento que aplicaAdemaacutes del resumen de la peliacutecula que se incluye en la ficha interesa mostrar la opinioacuten de las personas que vieron la peliacutecula De cada opinioacuten se conoce el nombre de la persona que la realiza su edad le fecha en que registroacute su opinioacuten la calificacioacuten que le dio a la peliacutecula (Obra Maestra Muy BuenaBuena Regular Mala) y el comentario propiamente dicho A cada opinioacuten se le asigna un nuacutemero que la identifica respecto de la peliacutecula sobre la cual opina

15 Normalizacioacuten151 Primera forma normalUna tabla estaacute en Primera Forma Normal si

Todos los atributos son atoacutemicos Un atributo es atoacutemico si los elementos del dominio son indivisibles miacutenimos

La tabla contiene una llave primaria uacutenica La llave primaria no contiene atributos nulos No debe existir variacioacuten en el nuacutemero de columnas Los Campos no llave deben identificarse por la llave (Dependencia

Funcional) Debe Existir una independencia del orden tanto de las filas como de las

columnas es decir si los datos cambian de orden no deben cambiar sus significados

Una tabla no puede tener muacuteltiples valores en cada columna Los datos son atoacutemicos (Si a cada valor de X le pertenece un valor de Y y viceversa)Esta forma normal elimina los valores repetidos dentro de una BD

152 Segunda Forma Normal (2FN)

Dependencia Funcional Una relacioacuten estaacute en 2FN si estaacute en 1FN y si los atributos que no forman parte de ninguna clave dependen de forma completa de la clave principal Es decir que no existen dependencias parciales (Todos los atributos que no son clave principal deben depender uacutenicamente de la clave principal)

En otras palabras podriacuteamos decir que la segunda forma normal estaacute basada en el concepto de dependencia completamente funcional Una dependencia funcional es completamente funcional si al eliminar los atributos A de X significa que la dependencia no es mantenida esto es que Una dependencia funcional es una dependencia parcial si hay algunos atributos que pueden ser eliminados

de X y la dependencia todaviacutea se mantiene esto es

Por ejemplo DNI ID_PROYECTO HORAS_TRABAJO (con el DNI de un empleado y el ID de un proyecto sabemos cuaacutentas horas de trabajo por semana trabaja un empleado en dicho proyecto) es completamente dependiente dado que ni DNI HORAS_TRABAJO ni ID_PROYECTO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 16

HORAS_TRABAJO mantienen la dependencia Sin embargo DNI ID_PROYECTO NOMBRE_EMPLEADO es parcialmente dependiente dado que DNI NOMBRE_EMPLEADO mantiene la dependencia

153 Tercera Forma Normal (3FN)

La tabla se encuentra en 3FN si es 2FN y si no existe ninguna dependencia funcional transitiva entre los atributos que no son clave

Un ejemplo de este concepto seriacutea que una dependencia funcional X-gtY en un esquema de relacioacuten R es una dependencia transitiva si hay un conjunto de atributos Z que no es un subconjunto de alguna clave de R donde se mantiene X-gtZ y Z-gtY

Por ejemplo la dependencia SSN-gtDMGRSSN es una dependencia transitiva en EMP_DEPT de la siguiente figura Decimos que la dependencia de DMGRSSN el atributo clave SSN es transitiva viacutea DNUMBER porque las dependencias SSNrarrDNUMBER y DNUMBERrarrDMGRSSN son mantenidas y DNUMBER no es un subconjunto de la clave de EMP_DEPT Intuitivamente podemos ver que la dependencia de DMGRSSN sobre DNUMBER es indeseable en EMP_DEPT dado que DNUMBER no es una clave de EMP_DEPT

Formalmente un esquema de relacion estaacute en 3 Forma Normal Elmasri-Navathe[2] si para toda dependencia funcional se cumple al menos una de las siguientes condiciones

es superllave o clave

es atributo primo de esto es si es miembro de alguna clave en

Ademaacutes el esquema debe cumplir necesariamente

Ejemplo

Id estudiante Ci Nombres Apellidos Curso Materia Descripicoacuten01 1803327418 Fransico

FabianCamacho Saltos

4 En Ingeacutes

02 10152465 Carlos Banabeti

Ruales Camacho

5 ES Espantildeol

03

1 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 17

2 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

Id Curso Curso01 Primero02 SegundoId Materia Materia Descripcioacuten01 En Ingleacutes02 MT Matemaacutetica

3 era forma normal

Iddescripcion DescripcioacutenIngleacutesMatemaacutetica

Dada la siguiente tabla normalizarlaIDcliente Ceacutedula Nombres Direccioacuten Proveedor Producto

16 Herramientas para la normalizacioacuten

A continuacioacuten se mencionan algunas herramientas para normalizar una base de datos mediante un proceso automatizado

CAPIacuteTULO IIRealizar diferentes tareas de disentildeo y planificacioacuten sobre la

estructura de tablas

21 Tabla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 18

Id Materia Materia01 En02 MT

Es un conjunto de datos ordenados en filas y columnas

22 Tipos de datossql_variant Puede usarse en columnas paraacutemetros variables y valores devueltos de funciones definidas por el usuariosql_variant permite que estos objetos de base de datos admitan valores de otros tipos de datosxml Capaz de almacenar documentos XML oacute fragmentos XML que es posible utilizar tanto en variables como en campos de tablas y que a diferencia de otros tipos de datos ofrece meacutetodos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 19

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 20

23 Creacioacuten de tablasAntes de aprender sobre la creacioacuten de tablas es necesario conocer los pasos para crear una base de datos en sql server 2008Para crear una base de datos en SQL Server 2008 debemos seguir los siguientes pasos1- Ingresar a SQLServer

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 21

2- En la ventana que nos aparece realizamos clic derecho en donde dice database

3- Nos aparece el siguiente menuacute hacemos clic donde dice New Database

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 22

4- Nos aparece la siguiente ventana

En donde dice Database Name le damos un nombre a la base de datos

5- Luego hacemos clic en

Nos aparece la siguiente ventana

Aquiacute tenemos dos opciones In percent nos permite que si sobrepasa el tamantildeo de la base de datos crezca en porcentajeIn Megabytes nos permite hacer que la base de datos crezca de 1 Megabyte en 1 megabyte si sobrepasa el tamantildeo y listoAhora para crear una tabla seguimos los siguientes pasos1- Hacemos clic en donde dice database buscamos el nombre de nuestra base de datos en la seccioacuten tables realizamos clic derecho con el botoacuten secundario del mouse

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 23

Nos aparece el siguiente menuacute

Hacemos clic en New Table

Y en donde dice Column Name vamos poniendo los campos de las bases de datos con su respectivo tipoAl final hacemos clic en donde estaacute el iacutecono de un diskette nos aparece una ventana pidiendo el nombre de la tabla le asignamos un nombre y realizamos clic en el botoacuten ok24 Creacioacuten de RestriccionesUna restriccioacuten es una condicioacuten que obliga el cumplimiento de ciertas condiciones en la base de datos Algunas no son determinadas por los usuarios sino que son inherentemente definidas por el simple hecho de que la base de datos sea relacional Algunas otras restricciones las puede definir el usuario por ejemplo usar un campo con valores enteros entre 1 y 10

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 24

Las restricciones proveen un meacutetodo de implementar reglas en la base de datos Las restricciones restringen los datos que pueden ser almacenados en las tablas Usualmente se definen usando expresiones que dan como resultado un valor booleano indicando si los datos satisfacen la restriccioacuten o noLas restricciones no son parte formal del modelo relacional pero son incluidas porque juegan el rol de organizar mejor los datos Las restricciones son muy discutidas junto con los conceptos relacionalesPueden crearse los siguientes tipos de restricciones Las restricciones unique y primary key exigen que no haya dos filas en una tabla con los mismos valores en las columnas especificadas Ademaacutes la restriccioacuten primary key requiere que no haya valores nulos en ninguna fila de la columna

241 Crear una restriccioacuten PRIMARY KEYPara crear una restriccioacuten Primary Key realizamos clic en el campo donde

queremos crear la restriccioacuten y luego realizamos clic en el iacutecono 242 Crear una restriccioacuten UNIQUEPara crear una restriccioacuten UNIQUE realizamos clic en el campo donde queremos crear dicha restriccioacuten y luego escogemos el menuacute Table Designe y luego en IndexesKeys

Nos aparece la siguiente ventana en donde dice Type escogemos Unique Key

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 25

Realizamos clic en close y guardamos la tabla

La integridad de referencia ( references ) exige que los datos insertados en columnas especiacuteficas ya tengan datos coincidentes en la tabla y columnas especificadas Las restricciones check limitan los valores de datos insertados en las columnas

243 Agregar una restriccioacuten CHECKRealizamos clic derecho dentro del explorador de objetos en la seccioacuten tables buscamos el nombre de la tabla y buscamos constraints realizamos clic derecho con el botoacuten secundario del mouse y escogemos New Constraint

Nos apareced la siguiente ventana

|

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 26

Realizamos clic en este botoacuten para poder editar la expresioacuten que queremos que tenga restricciones

En la ventana que nos aparece ponemos la expresioacuten deseada y realizamos clic en el botoacuten Ok

Para poder editar la tabla y verificar los cambios realizados buscamos en el explorador de objetos el nombre de la tabla realizamos clic derecho y escogemos la opcioacuten Edit Top 200 Rows

Y procedemos a ingresar datos para probarTambieacuten se puede imponer la integridad de datos restringiendo el uso de valores nulos en una columna (las palabras clave null o not null ) y proporcionando valores predeterminados para columnas (la claacuteusula default )

25 Diagramas de bases de datosLos diagramas de bases de datos se utiliza para visualizar las tablas graacuteficamente y para poder establecer las relaciones

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 27

Para crear un diagrama hacemos clic en el explorador de objetos hacemos clic en el nombre de la base de datos y escogemos Database Diagrams hacemos clic derecho escogemos new Database Diagrams

Nos aparece el siguiente mensaje realizamos un clic dentro del botoacuten Yes

Volvemos hacer clic derechos y volvemos a escoger New Data Base Diagram

Aparece la siguiente ventana en pantalla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 28

Seleccionamos todas y escogemos AddNos aparece la siguiente ventana

En el caso de tener una relacioacuten muchos a muchos debemos romper la relacioacuten con una tercera tabla para esto desde el mismo Database Diagram hacemos clic derecho en un lugar en blanco y escogemos new table llenos las columnas con los campos y tipos de datos respectivosDebemos tomar en cuenta que en las tablas a donde va la relacioacuten tiene que tener su respectiva llave foraacutenea y para poder establecer la relacioacuten

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 29

arrastramos desde el campo principal hacia la llave foraacutenea es decir de la tabla padre a la hijaQuedando las relaciones asiacute

Finalmente cerramos la base de datos nos aparece la siguiente ventana

pidiendo guardar el Database Diagram le demos un nombre y realizamos clic

en el botoacuten OK

252 Ejercicios

Los diagramas del ejercicio 1 y 2 del capiacutetulo anterior pasar al modelo

relacional en SQLSERVER 2008

Los ejercicios 5 y 6 los ejercicios de la prueba pasarlos a sql server

Transformar el siguiente modelo entidad relacioacuten al modelo relacional

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 30

CAPIacuteTULO III

Aplicar las diferentes sentencias y modos en lenguaje SQL

para tratamiento de la informacioacuten almacenada en las

diferentes tablas de la base de datos

31 Lenguaje de definicioacuten de datosLas sentencias DDL son CREATE ALTER y DROP Siempre se usan estas

sentencias junto con el tipo de objeto y el nombre del objeto

CREATE

Crea una base de datos o un objeto

Sintaxis

Create database nombre on grupo_base de datos filegroup

Ejemplo

USE mastergoIF DB_ID (Ncalificaciones) IS NULL BEGIN create database calificaciones on primary( name = calificaciones filename = Ccalificacionescalificacionesmdf

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 31

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 15: Base de Datos

desarrollar en distintos lugares (p ej en EE UU Puede desarrollarse en Forest Hill o en Flashing Meadows)Cada partido tiene asociado un premio de consolacioacuten para el perdedor que dependeraacute de la fase en que se encuentre el torneo (p ej el perdedor de octavos de final puede ganar 5000 doacutelares) El ganador de a final recibiraacute el premio correspondiente al torneoCada torneo tiene cinco modalidades Individual masculino individual femenino dobles masculino dobles femenino y dobles mixtosTambieacuten hay que tener en cuenta la nacionalidad de un jugador de forma que acuteeste puede ser apaacutetrida o tener varias nacionalidadesResultados a considerarEl sistema debe dar respuesta a las siguientes preguntas1 Dado un antildeo y un torneo composicioacuten y resultado de los partidos2 Lista de aacuterbitros que participaron en el torneo3 Ganancias percibidas en premios por un jugador a lo largo del torneo4 Lista de entrenadores que han entrenado a un jugador a lo largo del torneo y fechas en las que lo hizo Ejemplos de acceso a la base de datos1 Connors gano Gerulaitis en Roland Garros en 1979 en cuartos de final en individuales masculinos por6-3 4-67-5 6-02 El sentildeor Wilkinson arbitro ese partido3 Alemania ha ganado dos veces las individuales masculinas de Wimbledon Borg ha ganado 2000000de doacutelares a lo largo de su participacioacuten en el Grand Slam4 El ganado de Roland Garros de 1987 ganoacute 20000 doacutelares5 Noah ha jugado cuatro veces en dobles mixtos con MandlikovaProblema 8Se desea crear un sitio web con informacioacuten referente a las peliacuteculas en cartel en las salas de un dudoso cine cercano a la plaza de armasDe cada peliacutecula se almacena una ficha con su tiacutetulo de distribucioacuten su tiacutetulo original su geacutenero el idioma origina si tiene subtiacutetulos en espantildeol o no los paises de origen el antildeo de la produccioacuten la url del sitio web de la peliacutecula la duracioacuten (en horas y minutos) la calificacioacuten (Apta todo puacuteblico+9 antildeos +15 antildeos+18 antildeos) fecha de estreno en Santiago un resumen y un identificador de la peliacutecula De cada peliacutecula interesa conocer la lista de directores y el reparto es decir para cada actor que trabaja el nombre de todos los personajes que interpretaAdemaacutes interesa disponer de informacioacuten sobre los directores y actores que trabajan en cada peliacutecula De ambos se conoce su nombre (que lo identifica) y su nacionalidad Ademaacutes se desea conocer la cantidad de peliacuteculas en las que dirigieron o actuaron Tenga en cuenta que hay personas que cumplen los dos rolesLos cines pueden tener maacutes de una sala y cada semana cada uno de los cines enviacutea la cartelera para dicha semana indicando de detalle de las funciones Para cada funcioacuten se conoce el diacutea de la semana y la hora de comienzo y obviamente la sala y la peliacutecula que exhibe De cada sala se sabe el nombre un nuacutemero que la identifica dentro del cine y la cantidad de butacas que posee De cada cine se conoce el nombre que lo identifica su direccioacuten y teleacutefono para consultas

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 15

Algunos cines cuentan con promociones Estas promociones dependen de la funcioacuten (Ej De lunes a jueves antes de las 18 50 de descuento en la sala tal del cine tal para la peliacutecula cualLa funcioacuten del lunes a las 14 para la peliacutecula tal en la sala cual no se cobra a los escolares con tuacutenica ) De cada promocioacuten se conoce una descripcioacuten y el descuento que aplicaAdemaacutes del resumen de la peliacutecula que se incluye en la ficha interesa mostrar la opinioacuten de las personas que vieron la peliacutecula De cada opinioacuten se conoce el nombre de la persona que la realiza su edad le fecha en que registroacute su opinioacuten la calificacioacuten que le dio a la peliacutecula (Obra Maestra Muy BuenaBuena Regular Mala) y el comentario propiamente dicho A cada opinioacuten se le asigna un nuacutemero que la identifica respecto de la peliacutecula sobre la cual opina

15 Normalizacioacuten151 Primera forma normalUna tabla estaacute en Primera Forma Normal si

Todos los atributos son atoacutemicos Un atributo es atoacutemico si los elementos del dominio son indivisibles miacutenimos

La tabla contiene una llave primaria uacutenica La llave primaria no contiene atributos nulos No debe existir variacioacuten en el nuacutemero de columnas Los Campos no llave deben identificarse por la llave (Dependencia

Funcional) Debe Existir una independencia del orden tanto de las filas como de las

columnas es decir si los datos cambian de orden no deben cambiar sus significados

Una tabla no puede tener muacuteltiples valores en cada columna Los datos son atoacutemicos (Si a cada valor de X le pertenece un valor de Y y viceversa)Esta forma normal elimina los valores repetidos dentro de una BD

152 Segunda Forma Normal (2FN)

Dependencia Funcional Una relacioacuten estaacute en 2FN si estaacute en 1FN y si los atributos que no forman parte de ninguna clave dependen de forma completa de la clave principal Es decir que no existen dependencias parciales (Todos los atributos que no son clave principal deben depender uacutenicamente de la clave principal)

En otras palabras podriacuteamos decir que la segunda forma normal estaacute basada en el concepto de dependencia completamente funcional Una dependencia funcional es completamente funcional si al eliminar los atributos A de X significa que la dependencia no es mantenida esto es que Una dependencia funcional es una dependencia parcial si hay algunos atributos que pueden ser eliminados

de X y la dependencia todaviacutea se mantiene esto es

Por ejemplo DNI ID_PROYECTO HORAS_TRABAJO (con el DNI de un empleado y el ID de un proyecto sabemos cuaacutentas horas de trabajo por semana trabaja un empleado en dicho proyecto) es completamente dependiente dado que ni DNI HORAS_TRABAJO ni ID_PROYECTO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 16

HORAS_TRABAJO mantienen la dependencia Sin embargo DNI ID_PROYECTO NOMBRE_EMPLEADO es parcialmente dependiente dado que DNI NOMBRE_EMPLEADO mantiene la dependencia

153 Tercera Forma Normal (3FN)

La tabla se encuentra en 3FN si es 2FN y si no existe ninguna dependencia funcional transitiva entre los atributos que no son clave

Un ejemplo de este concepto seriacutea que una dependencia funcional X-gtY en un esquema de relacioacuten R es una dependencia transitiva si hay un conjunto de atributos Z que no es un subconjunto de alguna clave de R donde se mantiene X-gtZ y Z-gtY

Por ejemplo la dependencia SSN-gtDMGRSSN es una dependencia transitiva en EMP_DEPT de la siguiente figura Decimos que la dependencia de DMGRSSN el atributo clave SSN es transitiva viacutea DNUMBER porque las dependencias SSNrarrDNUMBER y DNUMBERrarrDMGRSSN son mantenidas y DNUMBER no es un subconjunto de la clave de EMP_DEPT Intuitivamente podemos ver que la dependencia de DMGRSSN sobre DNUMBER es indeseable en EMP_DEPT dado que DNUMBER no es una clave de EMP_DEPT

Formalmente un esquema de relacion estaacute en 3 Forma Normal Elmasri-Navathe[2] si para toda dependencia funcional se cumple al menos una de las siguientes condiciones

es superllave o clave

es atributo primo de esto es si es miembro de alguna clave en

Ademaacutes el esquema debe cumplir necesariamente

Ejemplo

Id estudiante Ci Nombres Apellidos Curso Materia Descripicoacuten01 1803327418 Fransico

FabianCamacho Saltos

4 En Ingeacutes

02 10152465 Carlos Banabeti

Ruales Camacho

5 ES Espantildeol

03

1 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 17

2 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

Id Curso Curso01 Primero02 SegundoId Materia Materia Descripcioacuten01 En Ingleacutes02 MT Matemaacutetica

3 era forma normal

Iddescripcion DescripcioacutenIngleacutesMatemaacutetica

Dada la siguiente tabla normalizarlaIDcliente Ceacutedula Nombres Direccioacuten Proveedor Producto

16 Herramientas para la normalizacioacuten

A continuacioacuten se mencionan algunas herramientas para normalizar una base de datos mediante un proceso automatizado

CAPIacuteTULO IIRealizar diferentes tareas de disentildeo y planificacioacuten sobre la

estructura de tablas

21 Tabla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 18

Id Materia Materia01 En02 MT

Es un conjunto de datos ordenados en filas y columnas

22 Tipos de datossql_variant Puede usarse en columnas paraacutemetros variables y valores devueltos de funciones definidas por el usuariosql_variant permite que estos objetos de base de datos admitan valores de otros tipos de datosxml Capaz de almacenar documentos XML oacute fragmentos XML que es posible utilizar tanto en variables como en campos de tablas y que a diferencia de otros tipos de datos ofrece meacutetodos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 19

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 20

23 Creacioacuten de tablasAntes de aprender sobre la creacioacuten de tablas es necesario conocer los pasos para crear una base de datos en sql server 2008Para crear una base de datos en SQL Server 2008 debemos seguir los siguientes pasos1- Ingresar a SQLServer

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 21

2- En la ventana que nos aparece realizamos clic derecho en donde dice database

3- Nos aparece el siguiente menuacute hacemos clic donde dice New Database

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 22

4- Nos aparece la siguiente ventana

En donde dice Database Name le damos un nombre a la base de datos

5- Luego hacemos clic en

Nos aparece la siguiente ventana

Aquiacute tenemos dos opciones In percent nos permite que si sobrepasa el tamantildeo de la base de datos crezca en porcentajeIn Megabytes nos permite hacer que la base de datos crezca de 1 Megabyte en 1 megabyte si sobrepasa el tamantildeo y listoAhora para crear una tabla seguimos los siguientes pasos1- Hacemos clic en donde dice database buscamos el nombre de nuestra base de datos en la seccioacuten tables realizamos clic derecho con el botoacuten secundario del mouse

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 23

Nos aparece el siguiente menuacute

Hacemos clic en New Table

Y en donde dice Column Name vamos poniendo los campos de las bases de datos con su respectivo tipoAl final hacemos clic en donde estaacute el iacutecono de un diskette nos aparece una ventana pidiendo el nombre de la tabla le asignamos un nombre y realizamos clic en el botoacuten ok24 Creacioacuten de RestriccionesUna restriccioacuten es una condicioacuten que obliga el cumplimiento de ciertas condiciones en la base de datos Algunas no son determinadas por los usuarios sino que son inherentemente definidas por el simple hecho de que la base de datos sea relacional Algunas otras restricciones las puede definir el usuario por ejemplo usar un campo con valores enteros entre 1 y 10

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 24

Las restricciones proveen un meacutetodo de implementar reglas en la base de datos Las restricciones restringen los datos que pueden ser almacenados en las tablas Usualmente se definen usando expresiones que dan como resultado un valor booleano indicando si los datos satisfacen la restriccioacuten o noLas restricciones no son parte formal del modelo relacional pero son incluidas porque juegan el rol de organizar mejor los datos Las restricciones son muy discutidas junto con los conceptos relacionalesPueden crearse los siguientes tipos de restricciones Las restricciones unique y primary key exigen que no haya dos filas en una tabla con los mismos valores en las columnas especificadas Ademaacutes la restriccioacuten primary key requiere que no haya valores nulos en ninguna fila de la columna

241 Crear una restriccioacuten PRIMARY KEYPara crear una restriccioacuten Primary Key realizamos clic en el campo donde

queremos crear la restriccioacuten y luego realizamos clic en el iacutecono 242 Crear una restriccioacuten UNIQUEPara crear una restriccioacuten UNIQUE realizamos clic en el campo donde queremos crear dicha restriccioacuten y luego escogemos el menuacute Table Designe y luego en IndexesKeys

Nos aparece la siguiente ventana en donde dice Type escogemos Unique Key

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 25

Realizamos clic en close y guardamos la tabla

La integridad de referencia ( references ) exige que los datos insertados en columnas especiacuteficas ya tengan datos coincidentes en la tabla y columnas especificadas Las restricciones check limitan los valores de datos insertados en las columnas

243 Agregar una restriccioacuten CHECKRealizamos clic derecho dentro del explorador de objetos en la seccioacuten tables buscamos el nombre de la tabla y buscamos constraints realizamos clic derecho con el botoacuten secundario del mouse y escogemos New Constraint

Nos apareced la siguiente ventana

|

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 26

Realizamos clic en este botoacuten para poder editar la expresioacuten que queremos que tenga restricciones

En la ventana que nos aparece ponemos la expresioacuten deseada y realizamos clic en el botoacuten Ok

Para poder editar la tabla y verificar los cambios realizados buscamos en el explorador de objetos el nombre de la tabla realizamos clic derecho y escogemos la opcioacuten Edit Top 200 Rows

Y procedemos a ingresar datos para probarTambieacuten se puede imponer la integridad de datos restringiendo el uso de valores nulos en una columna (las palabras clave null o not null ) y proporcionando valores predeterminados para columnas (la claacuteusula default )

25 Diagramas de bases de datosLos diagramas de bases de datos se utiliza para visualizar las tablas graacuteficamente y para poder establecer las relaciones

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 27

Para crear un diagrama hacemos clic en el explorador de objetos hacemos clic en el nombre de la base de datos y escogemos Database Diagrams hacemos clic derecho escogemos new Database Diagrams

Nos aparece el siguiente mensaje realizamos un clic dentro del botoacuten Yes

Volvemos hacer clic derechos y volvemos a escoger New Data Base Diagram

Aparece la siguiente ventana en pantalla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 28

Seleccionamos todas y escogemos AddNos aparece la siguiente ventana

En el caso de tener una relacioacuten muchos a muchos debemos romper la relacioacuten con una tercera tabla para esto desde el mismo Database Diagram hacemos clic derecho en un lugar en blanco y escogemos new table llenos las columnas con los campos y tipos de datos respectivosDebemos tomar en cuenta que en las tablas a donde va la relacioacuten tiene que tener su respectiva llave foraacutenea y para poder establecer la relacioacuten

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 29

arrastramos desde el campo principal hacia la llave foraacutenea es decir de la tabla padre a la hijaQuedando las relaciones asiacute

Finalmente cerramos la base de datos nos aparece la siguiente ventana

pidiendo guardar el Database Diagram le demos un nombre y realizamos clic

en el botoacuten OK

252 Ejercicios

Los diagramas del ejercicio 1 y 2 del capiacutetulo anterior pasar al modelo

relacional en SQLSERVER 2008

Los ejercicios 5 y 6 los ejercicios de la prueba pasarlos a sql server

Transformar el siguiente modelo entidad relacioacuten al modelo relacional

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 30

CAPIacuteTULO III

Aplicar las diferentes sentencias y modos en lenguaje SQL

para tratamiento de la informacioacuten almacenada en las

diferentes tablas de la base de datos

31 Lenguaje de definicioacuten de datosLas sentencias DDL son CREATE ALTER y DROP Siempre se usan estas

sentencias junto con el tipo de objeto y el nombre del objeto

CREATE

Crea una base de datos o un objeto

Sintaxis

Create database nombre on grupo_base de datos filegroup

Ejemplo

USE mastergoIF DB_ID (Ncalificaciones) IS NULL BEGIN create database calificaciones on primary( name = calificaciones filename = Ccalificacionescalificacionesmdf

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 31

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 16: Base de Datos

Algunos cines cuentan con promociones Estas promociones dependen de la funcioacuten (Ej De lunes a jueves antes de las 18 50 de descuento en la sala tal del cine tal para la peliacutecula cualLa funcioacuten del lunes a las 14 para la peliacutecula tal en la sala cual no se cobra a los escolares con tuacutenica ) De cada promocioacuten se conoce una descripcioacuten y el descuento que aplicaAdemaacutes del resumen de la peliacutecula que se incluye en la ficha interesa mostrar la opinioacuten de las personas que vieron la peliacutecula De cada opinioacuten se conoce el nombre de la persona que la realiza su edad le fecha en que registroacute su opinioacuten la calificacioacuten que le dio a la peliacutecula (Obra Maestra Muy BuenaBuena Regular Mala) y el comentario propiamente dicho A cada opinioacuten se le asigna un nuacutemero que la identifica respecto de la peliacutecula sobre la cual opina

15 Normalizacioacuten151 Primera forma normalUna tabla estaacute en Primera Forma Normal si

Todos los atributos son atoacutemicos Un atributo es atoacutemico si los elementos del dominio son indivisibles miacutenimos

La tabla contiene una llave primaria uacutenica La llave primaria no contiene atributos nulos No debe existir variacioacuten en el nuacutemero de columnas Los Campos no llave deben identificarse por la llave (Dependencia

Funcional) Debe Existir una independencia del orden tanto de las filas como de las

columnas es decir si los datos cambian de orden no deben cambiar sus significados

Una tabla no puede tener muacuteltiples valores en cada columna Los datos son atoacutemicos (Si a cada valor de X le pertenece un valor de Y y viceversa)Esta forma normal elimina los valores repetidos dentro de una BD

152 Segunda Forma Normal (2FN)

Dependencia Funcional Una relacioacuten estaacute en 2FN si estaacute en 1FN y si los atributos que no forman parte de ninguna clave dependen de forma completa de la clave principal Es decir que no existen dependencias parciales (Todos los atributos que no son clave principal deben depender uacutenicamente de la clave principal)

En otras palabras podriacuteamos decir que la segunda forma normal estaacute basada en el concepto de dependencia completamente funcional Una dependencia funcional es completamente funcional si al eliminar los atributos A de X significa que la dependencia no es mantenida esto es que Una dependencia funcional es una dependencia parcial si hay algunos atributos que pueden ser eliminados

de X y la dependencia todaviacutea se mantiene esto es

Por ejemplo DNI ID_PROYECTO HORAS_TRABAJO (con el DNI de un empleado y el ID de un proyecto sabemos cuaacutentas horas de trabajo por semana trabaja un empleado en dicho proyecto) es completamente dependiente dado que ni DNI HORAS_TRABAJO ni ID_PROYECTO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 16

HORAS_TRABAJO mantienen la dependencia Sin embargo DNI ID_PROYECTO NOMBRE_EMPLEADO es parcialmente dependiente dado que DNI NOMBRE_EMPLEADO mantiene la dependencia

153 Tercera Forma Normal (3FN)

La tabla se encuentra en 3FN si es 2FN y si no existe ninguna dependencia funcional transitiva entre los atributos que no son clave

Un ejemplo de este concepto seriacutea que una dependencia funcional X-gtY en un esquema de relacioacuten R es una dependencia transitiva si hay un conjunto de atributos Z que no es un subconjunto de alguna clave de R donde se mantiene X-gtZ y Z-gtY

Por ejemplo la dependencia SSN-gtDMGRSSN es una dependencia transitiva en EMP_DEPT de la siguiente figura Decimos que la dependencia de DMGRSSN el atributo clave SSN es transitiva viacutea DNUMBER porque las dependencias SSNrarrDNUMBER y DNUMBERrarrDMGRSSN son mantenidas y DNUMBER no es un subconjunto de la clave de EMP_DEPT Intuitivamente podemos ver que la dependencia de DMGRSSN sobre DNUMBER es indeseable en EMP_DEPT dado que DNUMBER no es una clave de EMP_DEPT

Formalmente un esquema de relacion estaacute en 3 Forma Normal Elmasri-Navathe[2] si para toda dependencia funcional se cumple al menos una de las siguientes condiciones

es superllave o clave

es atributo primo de esto es si es miembro de alguna clave en

Ademaacutes el esquema debe cumplir necesariamente

Ejemplo

Id estudiante Ci Nombres Apellidos Curso Materia Descripicoacuten01 1803327418 Fransico

FabianCamacho Saltos

4 En Ingeacutes

02 10152465 Carlos Banabeti

Ruales Camacho

5 ES Espantildeol

03

1 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 17

2 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

Id Curso Curso01 Primero02 SegundoId Materia Materia Descripcioacuten01 En Ingleacutes02 MT Matemaacutetica

3 era forma normal

Iddescripcion DescripcioacutenIngleacutesMatemaacutetica

Dada la siguiente tabla normalizarlaIDcliente Ceacutedula Nombres Direccioacuten Proveedor Producto

16 Herramientas para la normalizacioacuten

A continuacioacuten se mencionan algunas herramientas para normalizar una base de datos mediante un proceso automatizado

CAPIacuteTULO IIRealizar diferentes tareas de disentildeo y planificacioacuten sobre la

estructura de tablas

21 Tabla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 18

Id Materia Materia01 En02 MT

Es un conjunto de datos ordenados en filas y columnas

22 Tipos de datossql_variant Puede usarse en columnas paraacutemetros variables y valores devueltos de funciones definidas por el usuariosql_variant permite que estos objetos de base de datos admitan valores de otros tipos de datosxml Capaz de almacenar documentos XML oacute fragmentos XML que es posible utilizar tanto en variables como en campos de tablas y que a diferencia de otros tipos de datos ofrece meacutetodos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 19

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 20

23 Creacioacuten de tablasAntes de aprender sobre la creacioacuten de tablas es necesario conocer los pasos para crear una base de datos en sql server 2008Para crear una base de datos en SQL Server 2008 debemos seguir los siguientes pasos1- Ingresar a SQLServer

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 21

2- En la ventana que nos aparece realizamos clic derecho en donde dice database

3- Nos aparece el siguiente menuacute hacemos clic donde dice New Database

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 22

4- Nos aparece la siguiente ventana

En donde dice Database Name le damos un nombre a la base de datos

5- Luego hacemos clic en

Nos aparece la siguiente ventana

Aquiacute tenemos dos opciones In percent nos permite que si sobrepasa el tamantildeo de la base de datos crezca en porcentajeIn Megabytes nos permite hacer que la base de datos crezca de 1 Megabyte en 1 megabyte si sobrepasa el tamantildeo y listoAhora para crear una tabla seguimos los siguientes pasos1- Hacemos clic en donde dice database buscamos el nombre de nuestra base de datos en la seccioacuten tables realizamos clic derecho con el botoacuten secundario del mouse

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 23

Nos aparece el siguiente menuacute

Hacemos clic en New Table

Y en donde dice Column Name vamos poniendo los campos de las bases de datos con su respectivo tipoAl final hacemos clic en donde estaacute el iacutecono de un diskette nos aparece una ventana pidiendo el nombre de la tabla le asignamos un nombre y realizamos clic en el botoacuten ok24 Creacioacuten de RestriccionesUna restriccioacuten es una condicioacuten que obliga el cumplimiento de ciertas condiciones en la base de datos Algunas no son determinadas por los usuarios sino que son inherentemente definidas por el simple hecho de que la base de datos sea relacional Algunas otras restricciones las puede definir el usuario por ejemplo usar un campo con valores enteros entre 1 y 10

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 24

Las restricciones proveen un meacutetodo de implementar reglas en la base de datos Las restricciones restringen los datos que pueden ser almacenados en las tablas Usualmente se definen usando expresiones que dan como resultado un valor booleano indicando si los datos satisfacen la restriccioacuten o noLas restricciones no son parte formal del modelo relacional pero son incluidas porque juegan el rol de organizar mejor los datos Las restricciones son muy discutidas junto con los conceptos relacionalesPueden crearse los siguientes tipos de restricciones Las restricciones unique y primary key exigen que no haya dos filas en una tabla con los mismos valores en las columnas especificadas Ademaacutes la restriccioacuten primary key requiere que no haya valores nulos en ninguna fila de la columna

241 Crear una restriccioacuten PRIMARY KEYPara crear una restriccioacuten Primary Key realizamos clic en el campo donde

queremos crear la restriccioacuten y luego realizamos clic en el iacutecono 242 Crear una restriccioacuten UNIQUEPara crear una restriccioacuten UNIQUE realizamos clic en el campo donde queremos crear dicha restriccioacuten y luego escogemos el menuacute Table Designe y luego en IndexesKeys

Nos aparece la siguiente ventana en donde dice Type escogemos Unique Key

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 25

Realizamos clic en close y guardamos la tabla

La integridad de referencia ( references ) exige que los datos insertados en columnas especiacuteficas ya tengan datos coincidentes en la tabla y columnas especificadas Las restricciones check limitan los valores de datos insertados en las columnas

243 Agregar una restriccioacuten CHECKRealizamos clic derecho dentro del explorador de objetos en la seccioacuten tables buscamos el nombre de la tabla y buscamos constraints realizamos clic derecho con el botoacuten secundario del mouse y escogemos New Constraint

Nos apareced la siguiente ventana

|

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 26

Realizamos clic en este botoacuten para poder editar la expresioacuten que queremos que tenga restricciones

En la ventana que nos aparece ponemos la expresioacuten deseada y realizamos clic en el botoacuten Ok

Para poder editar la tabla y verificar los cambios realizados buscamos en el explorador de objetos el nombre de la tabla realizamos clic derecho y escogemos la opcioacuten Edit Top 200 Rows

Y procedemos a ingresar datos para probarTambieacuten se puede imponer la integridad de datos restringiendo el uso de valores nulos en una columna (las palabras clave null o not null ) y proporcionando valores predeterminados para columnas (la claacuteusula default )

25 Diagramas de bases de datosLos diagramas de bases de datos se utiliza para visualizar las tablas graacuteficamente y para poder establecer las relaciones

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 27

Para crear un diagrama hacemos clic en el explorador de objetos hacemos clic en el nombre de la base de datos y escogemos Database Diagrams hacemos clic derecho escogemos new Database Diagrams

Nos aparece el siguiente mensaje realizamos un clic dentro del botoacuten Yes

Volvemos hacer clic derechos y volvemos a escoger New Data Base Diagram

Aparece la siguiente ventana en pantalla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 28

Seleccionamos todas y escogemos AddNos aparece la siguiente ventana

En el caso de tener una relacioacuten muchos a muchos debemos romper la relacioacuten con una tercera tabla para esto desde el mismo Database Diagram hacemos clic derecho en un lugar en blanco y escogemos new table llenos las columnas con los campos y tipos de datos respectivosDebemos tomar en cuenta que en las tablas a donde va la relacioacuten tiene que tener su respectiva llave foraacutenea y para poder establecer la relacioacuten

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 29

arrastramos desde el campo principal hacia la llave foraacutenea es decir de la tabla padre a la hijaQuedando las relaciones asiacute

Finalmente cerramos la base de datos nos aparece la siguiente ventana

pidiendo guardar el Database Diagram le demos un nombre y realizamos clic

en el botoacuten OK

252 Ejercicios

Los diagramas del ejercicio 1 y 2 del capiacutetulo anterior pasar al modelo

relacional en SQLSERVER 2008

Los ejercicios 5 y 6 los ejercicios de la prueba pasarlos a sql server

Transformar el siguiente modelo entidad relacioacuten al modelo relacional

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 30

CAPIacuteTULO III

Aplicar las diferentes sentencias y modos en lenguaje SQL

para tratamiento de la informacioacuten almacenada en las

diferentes tablas de la base de datos

31 Lenguaje de definicioacuten de datosLas sentencias DDL son CREATE ALTER y DROP Siempre se usan estas

sentencias junto con el tipo de objeto y el nombre del objeto

CREATE

Crea una base de datos o un objeto

Sintaxis

Create database nombre on grupo_base de datos filegroup

Ejemplo

USE mastergoIF DB_ID (Ncalificaciones) IS NULL BEGIN create database calificaciones on primary( name = calificaciones filename = Ccalificacionescalificacionesmdf

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 31

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 17: Base de Datos

HORAS_TRABAJO mantienen la dependencia Sin embargo DNI ID_PROYECTO NOMBRE_EMPLEADO es parcialmente dependiente dado que DNI NOMBRE_EMPLEADO mantiene la dependencia

153 Tercera Forma Normal (3FN)

La tabla se encuentra en 3FN si es 2FN y si no existe ninguna dependencia funcional transitiva entre los atributos que no son clave

Un ejemplo de este concepto seriacutea que una dependencia funcional X-gtY en un esquema de relacioacuten R es una dependencia transitiva si hay un conjunto de atributos Z que no es un subconjunto de alguna clave de R donde se mantiene X-gtZ y Z-gtY

Por ejemplo la dependencia SSN-gtDMGRSSN es una dependencia transitiva en EMP_DEPT de la siguiente figura Decimos que la dependencia de DMGRSSN el atributo clave SSN es transitiva viacutea DNUMBER porque las dependencias SSNrarrDNUMBER y DNUMBERrarrDMGRSSN son mantenidas y DNUMBER no es un subconjunto de la clave de EMP_DEPT Intuitivamente podemos ver que la dependencia de DMGRSSN sobre DNUMBER es indeseable en EMP_DEPT dado que DNUMBER no es una clave de EMP_DEPT

Formalmente un esquema de relacion estaacute en 3 Forma Normal Elmasri-Navathe[2] si para toda dependencia funcional se cumple al menos una de las siguientes condiciones

es superllave o clave

es atributo primo de esto es si es miembro de alguna clave en

Ademaacutes el esquema debe cumplir necesariamente

Ejemplo

Id estudiante Ci Nombres Apellidos Curso Materia Descripicoacuten01 1803327418 Fransico

FabianCamacho Saltos

4 En Ingeacutes

02 10152465 Carlos Banabeti

Ruales Camacho

5 ES Espantildeol

03

1 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 17

2 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

Id Curso Curso01 Primero02 SegundoId Materia Materia Descripcioacuten01 En Ingleacutes02 MT Matemaacutetica

3 era forma normal

Iddescripcion DescripcioacutenIngleacutesMatemaacutetica

Dada la siguiente tabla normalizarlaIDcliente Ceacutedula Nombres Direccioacuten Proveedor Producto

16 Herramientas para la normalizacioacuten

A continuacioacuten se mencionan algunas herramientas para normalizar una base de datos mediante un proceso automatizado

CAPIacuteTULO IIRealizar diferentes tareas de disentildeo y planificacioacuten sobre la

estructura de tablas

21 Tabla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 18

Id Materia Materia01 En02 MT

Es un conjunto de datos ordenados en filas y columnas

22 Tipos de datossql_variant Puede usarse en columnas paraacutemetros variables y valores devueltos de funciones definidas por el usuariosql_variant permite que estos objetos de base de datos admitan valores de otros tipos de datosxml Capaz de almacenar documentos XML oacute fragmentos XML que es posible utilizar tanto en variables como en campos de tablas y que a diferencia de otros tipos de datos ofrece meacutetodos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 19

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 20

23 Creacioacuten de tablasAntes de aprender sobre la creacioacuten de tablas es necesario conocer los pasos para crear una base de datos en sql server 2008Para crear una base de datos en SQL Server 2008 debemos seguir los siguientes pasos1- Ingresar a SQLServer

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 21

2- En la ventana que nos aparece realizamos clic derecho en donde dice database

3- Nos aparece el siguiente menuacute hacemos clic donde dice New Database

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 22

4- Nos aparece la siguiente ventana

En donde dice Database Name le damos un nombre a la base de datos

5- Luego hacemos clic en

Nos aparece la siguiente ventana

Aquiacute tenemos dos opciones In percent nos permite que si sobrepasa el tamantildeo de la base de datos crezca en porcentajeIn Megabytes nos permite hacer que la base de datos crezca de 1 Megabyte en 1 megabyte si sobrepasa el tamantildeo y listoAhora para crear una tabla seguimos los siguientes pasos1- Hacemos clic en donde dice database buscamos el nombre de nuestra base de datos en la seccioacuten tables realizamos clic derecho con el botoacuten secundario del mouse

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 23

Nos aparece el siguiente menuacute

Hacemos clic en New Table

Y en donde dice Column Name vamos poniendo los campos de las bases de datos con su respectivo tipoAl final hacemos clic en donde estaacute el iacutecono de un diskette nos aparece una ventana pidiendo el nombre de la tabla le asignamos un nombre y realizamos clic en el botoacuten ok24 Creacioacuten de RestriccionesUna restriccioacuten es una condicioacuten que obliga el cumplimiento de ciertas condiciones en la base de datos Algunas no son determinadas por los usuarios sino que son inherentemente definidas por el simple hecho de que la base de datos sea relacional Algunas otras restricciones las puede definir el usuario por ejemplo usar un campo con valores enteros entre 1 y 10

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 24

Las restricciones proveen un meacutetodo de implementar reglas en la base de datos Las restricciones restringen los datos que pueden ser almacenados en las tablas Usualmente se definen usando expresiones que dan como resultado un valor booleano indicando si los datos satisfacen la restriccioacuten o noLas restricciones no son parte formal del modelo relacional pero son incluidas porque juegan el rol de organizar mejor los datos Las restricciones son muy discutidas junto con los conceptos relacionalesPueden crearse los siguientes tipos de restricciones Las restricciones unique y primary key exigen que no haya dos filas en una tabla con los mismos valores en las columnas especificadas Ademaacutes la restriccioacuten primary key requiere que no haya valores nulos en ninguna fila de la columna

241 Crear una restriccioacuten PRIMARY KEYPara crear una restriccioacuten Primary Key realizamos clic en el campo donde

queremos crear la restriccioacuten y luego realizamos clic en el iacutecono 242 Crear una restriccioacuten UNIQUEPara crear una restriccioacuten UNIQUE realizamos clic en el campo donde queremos crear dicha restriccioacuten y luego escogemos el menuacute Table Designe y luego en IndexesKeys

Nos aparece la siguiente ventana en donde dice Type escogemos Unique Key

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 25

Realizamos clic en close y guardamos la tabla

La integridad de referencia ( references ) exige que los datos insertados en columnas especiacuteficas ya tengan datos coincidentes en la tabla y columnas especificadas Las restricciones check limitan los valores de datos insertados en las columnas

243 Agregar una restriccioacuten CHECKRealizamos clic derecho dentro del explorador de objetos en la seccioacuten tables buscamos el nombre de la tabla y buscamos constraints realizamos clic derecho con el botoacuten secundario del mouse y escogemos New Constraint

Nos apareced la siguiente ventana

|

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 26

Realizamos clic en este botoacuten para poder editar la expresioacuten que queremos que tenga restricciones

En la ventana que nos aparece ponemos la expresioacuten deseada y realizamos clic en el botoacuten Ok

Para poder editar la tabla y verificar los cambios realizados buscamos en el explorador de objetos el nombre de la tabla realizamos clic derecho y escogemos la opcioacuten Edit Top 200 Rows

Y procedemos a ingresar datos para probarTambieacuten se puede imponer la integridad de datos restringiendo el uso de valores nulos en una columna (las palabras clave null o not null ) y proporcionando valores predeterminados para columnas (la claacuteusula default )

25 Diagramas de bases de datosLos diagramas de bases de datos se utiliza para visualizar las tablas graacuteficamente y para poder establecer las relaciones

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 27

Para crear un diagrama hacemos clic en el explorador de objetos hacemos clic en el nombre de la base de datos y escogemos Database Diagrams hacemos clic derecho escogemos new Database Diagrams

Nos aparece el siguiente mensaje realizamos un clic dentro del botoacuten Yes

Volvemos hacer clic derechos y volvemos a escoger New Data Base Diagram

Aparece la siguiente ventana en pantalla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 28

Seleccionamos todas y escogemos AddNos aparece la siguiente ventana

En el caso de tener una relacioacuten muchos a muchos debemos romper la relacioacuten con una tercera tabla para esto desde el mismo Database Diagram hacemos clic derecho en un lugar en blanco y escogemos new table llenos las columnas con los campos y tipos de datos respectivosDebemos tomar en cuenta que en las tablas a donde va la relacioacuten tiene que tener su respectiva llave foraacutenea y para poder establecer la relacioacuten

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 29

arrastramos desde el campo principal hacia la llave foraacutenea es decir de la tabla padre a la hijaQuedando las relaciones asiacute

Finalmente cerramos la base de datos nos aparece la siguiente ventana

pidiendo guardar el Database Diagram le demos un nombre y realizamos clic

en el botoacuten OK

252 Ejercicios

Los diagramas del ejercicio 1 y 2 del capiacutetulo anterior pasar al modelo

relacional en SQLSERVER 2008

Los ejercicios 5 y 6 los ejercicios de la prueba pasarlos a sql server

Transformar el siguiente modelo entidad relacioacuten al modelo relacional

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 30

CAPIacuteTULO III

Aplicar las diferentes sentencias y modos en lenguaje SQL

para tratamiento de la informacioacuten almacenada en las

diferentes tablas de la base de datos

31 Lenguaje de definicioacuten de datosLas sentencias DDL son CREATE ALTER y DROP Siempre se usan estas

sentencias junto con el tipo de objeto y el nombre del objeto

CREATE

Crea una base de datos o un objeto

Sintaxis

Create database nombre on grupo_base de datos filegroup

Ejemplo

USE mastergoIF DB_ID (Ncalificaciones) IS NULL BEGIN create database calificaciones on primary( name = calificaciones filename = Ccalificacionescalificacionesmdf

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 31

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 18: Base de Datos

2 forma normal

Id estudiante

Ci Pnombre snombre Apellido paterno

Apellido materno

Curso Materia Descripicoacuten

01 1803327418 Fransisco Fabiaacuten Camacho

Saltos 4 En Ingeacutes

02 10152465 Carlos Benabeti Ruales Camacho 5 ES Espantildeol03

Id Curso Curso01 Primero02 SegundoId Materia Materia Descripcioacuten01 En Ingleacutes02 MT Matemaacutetica

3 era forma normal

Iddescripcion DescripcioacutenIngleacutesMatemaacutetica

Dada la siguiente tabla normalizarlaIDcliente Ceacutedula Nombres Direccioacuten Proveedor Producto

16 Herramientas para la normalizacioacuten

A continuacioacuten se mencionan algunas herramientas para normalizar una base de datos mediante un proceso automatizado

CAPIacuteTULO IIRealizar diferentes tareas de disentildeo y planificacioacuten sobre la

estructura de tablas

21 Tabla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 18

Id Materia Materia01 En02 MT

Es un conjunto de datos ordenados en filas y columnas

22 Tipos de datossql_variant Puede usarse en columnas paraacutemetros variables y valores devueltos de funciones definidas por el usuariosql_variant permite que estos objetos de base de datos admitan valores de otros tipos de datosxml Capaz de almacenar documentos XML oacute fragmentos XML que es posible utilizar tanto en variables como en campos de tablas y que a diferencia de otros tipos de datos ofrece meacutetodos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 19

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 20

23 Creacioacuten de tablasAntes de aprender sobre la creacioacuten de tablas es necesario conocer los pasos para crear una base de datos en sql server 2008Para crear una base de datos en SQL Server 2008 debemos seguir los siguientes pasos1- Ingresar a SQLServer

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 21

2- En la ventana que nos aparece realizamos clic derecho en donde dice database

3- Nos aparece el siguiente menuacute hacemos clic donde dice New Database

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 22

4- Nos aparece la siguiente ventana

En donde dice Database Name le damos un nombre a la base de datos

5- Luego hacemos clic en

Nos aparece la siguiente ventana

Aquiacute tenemos dos opciones In percent nos permite que si sobrepasa el tamantildeo de la base de datos crezca en porcentajeIn Megabytes nos permite hacer que la base de datos crezca de 1 Megabyte en 1 megabyte si sobrepasa el tamantildeo y listoAhora para crear una tabla seguimos los siguientes pasos1- Hacemos clic en donde dice database buscamos el nombre de nuestra base de datos en la seccioacuten tables realizamos clic derecho con el botoacuten secundario del mouse

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 23

Nos aparece el siguiente menuacute

Hacemos clic en New Table

Y en donde dice Column Name vamos poniendo los campos de las bases de datos con su respectivo tipoAl final hacemos clic en donde estaacute el iacutecono de un diskette nos aparece una ventana pidiendo el nombre de la tabla le asignamos un nombre y realizamos clic en el botoacuten ok24 Creacioacuten de RestriccionesUna restriccioacuten es una condicioacuten que obliga el cumplimiento de ciertas condiciones en la base de datos Algunas no son determinadas por los usuarios sino que son inherentemente definidas por el simple hecho de que la base de datos sea relacional Algunas otras restricciones las puede definir el usuario por ejemplo usar un campo con valores enteros entre 1 y 10

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 24

Las restricciones proveen un meacutetodo de implementar reglas en la base de datos Las restricciones restringen los datos que pueden ser almacenados en las tablas Usualmente se definen usando expresiones que dan como resultado un valor booleano indicando si los datos satisfacen la restriccioacuten o noLas restricciones no son parte formal del modelo relacional pero son incluidas porque juegan el rol de organizar mejor los datos Las restricciones son muy discutidas junto con los conceptos relacionalesPueden crearse los siguientes tipos de restricciones Las restricciones unique y primary key exigen que no haya dos filas en una tabla con los mismos valores en las columnas especificadas Ademaacutes la restriccioacuten primary key requiere que no haya valores nulos en ninguna fila de la columna

241 Crear una restriccioacuten PRIMARY KEYPara crear una restriccioacuten Primary Key realizamos clic en el campo donde

queremos crear la restriccioacuten y luego realizamos clic en el iacutecono 242 Crear una restriccioacuten UNIQUEPara crear una restriccioacuten UNIQUE realizamos clic en el campo donde queremos crear dicha restriccioacuten y luego escogemos el menuacute Table Designe y luego en IndexesKeys

Nos aparece la siguiente ventana en donde dice Type escogemos Unique Key

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 25

Realizamos clic en close y guardamos la tabla

La integridad de referencia ( references ) exige que los datos insertados en columnas especiacuteficas ya tengan datos coincidentes en la tabla y columnas especificadas Las restricciones check limitan los valores de datos insertados en las columnas

243 Agregar una restriccioacuten CHECKRealizamos clic derecho dentro del explorador de objetos en la seccioacuten tables buscamos el nombre de la tabla y buscamos constraints realizamos clic derecho con el botoacuten secundario del mouse y escogemos New Constraint

Nos apareced la siguiente ventana

|

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 26

Realizamos clic en este botoacuten para poder editar la expresioacuten que queremos que tenga restricciones

En la ventana que nos aparece ponemos la expresioacuten deseada y realizamos clic en el botoacuten Ok

Para poder editar la tabla y verificar los cambios realizados buscamos en el explorador de objetos el nombre de la tabla realizamos clic derecho y escogemos la opcioacuten Edit Top 200 Rows

Y procedemos a ingresar datos para probarTambieacuten se puede imponer la integridad de datos restringiendo el uso de valores nulos en una columna (las palabras clave null o not null ) y proporcionando valores predeterminados para columnas (la claacuteusula default )

25 Diagramas de bases de datosLos diagramas de bases de datos se utiliza para visualizar las tablas graacuteficamente y para poder establecer las relaciones

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 27

Para crear un diagrama hacemos clic en el explorador de objetos hacemos clic en el nombre de la base de datos y escogemos Database Diagrams hacemos clic derecho escogemos new Database Diagrams

Nos aparece el siguiente mensaje realizamos un clic dentro del botoacuten Yes

Volvemos hacer clic derechos y volvemos a escoger New Data Base Diagram

Aparece la siguiente ventana en pantalla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 28

Seleccionamos todas y escogemos AddNos aparece la siguiente ventana

En el caso de tener una relacioacuten muchos a muchos debemos romper la relacioacuten con una tercera tabla para esto desde el mismo Database Diagram hacemos clic derecho en un lugar en blanco y escogemos new table llenos las columnas con los campos y tipos de datos respectivosDebemos tomar en cuenta que en las tablas a donde va la relacioacuten tiene que tener su respectiva llave foraacutenea y para poder establecer la relacioacuten

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 29

arrastramos desde el campo principal hacia la llave foraacutenea es decir de la tabla padre a la hijaQuedando las relaciones asiacute

Finalmente cerramos la base de datos nos aparece la siguiente ventana

pidiendo guardar el Database Diagram le demos un nombre y realizamos clic

en el botoacuten OK

252 Ejercicios

Los diagramas del ejercicio 1 y 2 del capiacutetulo anterior pasar al modelo

relacional en SQLSERVER 2008

Los ejercicios 5 y 6 los ejercicios de la prueba pasarlos a sql server

Transformar el siguiente modelo entidad relacioacuten al modelo relacional

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 30

CAPIacuteTULO III

Aplicar las diferentes sentencias y modos en lenguaje SQL

para tratamiento de la informacioacuten almacenada en las

diferentes tablas de la base de datos

31 Lenguaje de definicioacuten de datosLas sentencias DDL son CREATE ALTER y DROP Siempre se usan estas

sentencias junto con el tipo de objeto y el nombre del objeto

CREATE

Crea una base de datos o un objeto

Sintaxis

Create database nombre on grupo_base de datos filegroup

Ejemplo

USE mastergoIF DB_ID (Ncalificaciones) IS NULL BEGIN create database calificaciones on primary( name = calificaciones filename = Ccalificacionescalificacionesmdf

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 31

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 19: Base de Datos

Es un conjunto de datos ordenados en filas y columnas

22 Tipos de datossql_variant Puede usarse en columnas paraacutemetros variables y valores devueltos de funciones definidas por el usuariosql_variant permite que estos objetos de base de datos admitan valores de otros tipos de datosxml Capaz de almacenar documentos XML oacute fragmentos XML que es posible utilizar tanto en variables como en campos de tablas y que a diferencia de otros tipos de datos ofrece meacutetodos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 19

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 20

23 Creacioacuten de tablasAntes de aprender sobre la creacioacuten de tablas es necesario conocer los pasos para crear una base de datos en sql server 2008Para crear una base de datos en SQL Server 2008 debemos seguir los siguientes pasos1- Ingresar a SQLServer

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 21

2- En la ventana que nos aparece realizamos clic derecho en donde dice database

3- Nos aparece el siguiente menuacute hacemos clic donde dice New Database

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 22

4- Nos aparece la siguiente ventana

En donde dice Database Name le damos un nombre a la base de datos

5- Luego hacemos clic en

Nos aparece la siguiente ventana

Aquiacute tenemos dos opciones In percent nos permite que si sobrepasa el tamantildeo de la base de datos crezca en porcentajeIn Megabytes nos permite hacer que la base de datos crezca de 1 Megabyte en 1 megabyte si sobrepasa el tamantildeo y listoAhora para crear una tabla seguimos los siguientes pasos1- Hacemos clic en donde dice database buscamos el nombre de nuestra base de datos en la seccioacuten tables realizamos clic derecho con el botoacuten secundario del mouse

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 23

Nos aparece el siguiente menuacute

Hacemos clic en New Table

Y en donde dice Column Name vamos poniendo los campos de las bases de datos con su respectivo tipoAl final hacemos clic en donde estaacute el iacutecono de un diskette nos aparece una ventana pidiendo el nombre de la tabla le asignamos un nombre y realizamos clic en el botoacuten ok24 Creacioacuten de RestriccionesUna restriccioacuten es una condicioacuten que obliga el cumplimiento de ciertas condiciones en la base de datos Algunas no son determinadas por los usuarios sino que son inherentemente definidas por el simple hecho de que la base de datos sea relacional Algunas otras restricciones las puede definir el usuario por ejemplo usar un campo con valores enteros entre 1 y 10

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 24

Las restricciones proveen un meacutetodo de implementar reglas en la base de datos Las restricciones restringen los datos que pueden ser almacenados en las tablas Usualmente se definen usando expresiones que dan como resultado un valor booleano indicando si los datos satisfacen la restriccioacuten o noLas restricciones no son parte formal del modelo relacional pero son incluidas porque juegan el rol de organizar mejor los datos Las restricciones son muy discutidas junto con los conceptos relacionalesPueden crearse los siguientes tipos de restricciones Las restricciones unique y primary key exigen que no haya dos filas en una tabla con los mismos valores en las columnas especificadas Ademaacutes la restriccioacuten primary key requiere que no haya valores nulos en ninguna fila de la columna

241 Crear una restriccioacuten PRIMARY KEYPara crear una restriccioacuten Primary Key realizamos clic en el campo donde

queremos crear la restriccioacuten y luego realizamos clic en el iacutecono 242 Crear una restriccioacuten UNIQUEPara crear una restriccioacuten UNIQUE realizamos clic en el campo donde queremos crear dicha restriccioacuten y luego escogemos el menuacute Table Designe y luego en IndexesKeys

Nos aparece la siguiente ventana en donde dice Type escogemos Unique Key

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 25

Realizamos clic en close y guardamos la tabla

La integridad de referencia ( references ) exige que los datos insertados en columnas especiacuteficas ya tengan datos coincidentes en la tabla y columnas especificadas Las restricciones check limitan los valores de datos insertados en las columnas

243 Agregar una restriccioacuten CHECKRealizamos clic derecho dentro del explorador de objetos en la seccioacuten tables buscamos el nombre de la tabla y buscamos constraints realizamos clic derecho con el botoacuten secundario del mouse y escogemos New Constraint

Nos apareced la siguiente ventana

|

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 26

Realizamos clic en este botoacuten para poder editar la expresioacuten que queremos que tenga restricciones

En la ventana que nos aparece ponemos la expresioacuten deseada y realizamos clic en el botoacuten Ok

Para poder editar la tabla y verificar los cambios realizados buscamos en el explorador de objetos el nombre de la tabla realizamos clic derecho y escogemos la opcioacuten Edit Top 200 Rows

Y procedemos a ingresar datos para probarTambieacuten se puede imponer la integridad de datos restringiendo el uso de valores nulos en una columna (las palabras clave null o not null ) y proporcionando valores predeterminados para columnas (la claacuteusula default )

25 Diagramas de bases de datosLos diagramas de bases de datos se utiliza para visualizar las tablas graacuteficamente y para poder establecer las relaciones

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 27

Para crear un diagrama hacemos clic en el explorador de objetos hacemos clic en el nombre de la base de datos y escogemos Database Diagrams hacemos clic derecho escogemos new Database Diagrams

Nos aparece el siguiente mensaje realizamos un clic dentro del botoacuten Yes

Volvemos hacer clic derechos y volvemos a escoger New Data Base Diagram

Aparece la siguiente ventana en pantalla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 28

Seleccionamos todas y escogemos AddNos aparece la siguiente ventana

En el caso de tener una relacioacuten muchos a muchos debemos romper la relacioacuten con una tercera tabla para esto desde el mismo Database Diagram hacemos clic derecho en un lugar en blanco y escogemos new table llenos las columnas con los campos y tipos de datos respectivosDebemos tomar en cuenta que en las tablas a donde va la relacioacuten tiene que tener su respectiva llave foraacutenea y para poder establecer la relacioacuten

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 29

arrastramos desde el campo principal hacia la llave foraacutenea es decir de la tabla padre a la hijaQuedando las relaciones asiacute

Finalmente cerramos la base de datos nos aparece la siguiente ventana

pidiendo guardar el Database Diagram le demos un nombre y realizamos clic

en el botoacuten OK

252 Ejercicios

Los diagramas del ejercicio 1 y 2 del capiacutetulo anterior pasar al modelo

relacional en SQLSERVER 2008

Los ejercicios 5 y 6 los ejercicios de la prueba pasarlos a sql server

Transformar el siguiente modelo entidad relacioacuten al modelo relacional

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 30

CAPIacuteTULO III

Aplicar las diferentes sentencias y modos en lenguaje SQL

para tratamiento de la informacioacuten almacenada en las

diferentes tablas de la base de datos

31 Lenguaje de definicioacuten de datosLas sentencias DDL son CREATE ALTER y DROP Siempre se usan estas

sentencias junto con el tipo de objeto y el nombre del objeto

CREATE

Crea una base de datos o un objeto

Sintaxis

Create database nombre on grupo_base de datos filegroup

Ejemplo

USE mastergoIF DB_ID (Ncalificaciones) IS NULL BEGIN create database calificaciones on primary( name = calificaciones filename = Ccalificacionescalificacionesmdf

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 31

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 20: Base de Datos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 20

23 Creacioacuten de tablasAntes de aprender sobre la creacioacuten de tablas es necesario conocer los pasos para crear una base de datos en sql server 2008Para crear una base de datos en SQL Server 2008 debemos seguir los siguientes pasos1- Ingresar a SQLServer

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 21

2- En la ventana que nos aparece realizamos clic derecho en donde dice database

3- Nos aparece el siguiente menuacute hacemos clic donde dice New Database

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 22

4- Nos aparece la siguiente ventana

En donde dice Database Name le damos un nombre a la base de datos

5- Luego hacemos clic en

Nos aparece la siguiente ventana

Aquiacute tenemos dos opciones In percent nos permite que si sobrepasa el tamantildeo de la base de datos crezca en porcentajeIn Megabytes nos permite hacer que la base de datos crezca de 1 Megabyte en 1 megabyte si sobrepasa el tamantildeo y listoAhora para crear una tabla seguimos los siguientes pasos1- Hacemos clic en donde dice database buscamos el nombre de nuestra base de datos en la seccioacuten tables realizamos clic derecho con el botoacuten secundario del mouse

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 23

Nos aparece el siguiente menuacute

Hacemos clic en New Table

Y en donde dice Column Name vamos poniendo los campos de las bases de datos con su respectivo tipoAl final hacemos clic en donde estaacute el iacutecono de un diskette nos aparece una ventana pidiendo el nombre de la tabla le asignamos un nombre y realizamos clic en el botoacuten ok24 Creacioacuten de RestriccionesUna restriccioacuten es una condicioacuten que obliga el cumplimiento de ciertas condiciones en la base de datos Algunas no son determinadas por los usuarios sino que son inherentemente definidas por el simple hecho de que la base de datos sea relacional Algunas otras restricciones las puede definir el usuario por ejemplo usar un campo con valores enteros entre 1 y 10

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 24

Las restricciones proveen un meacutetodo de implementar reglas en la base de datos Las restricciones restringen los datos que pueden ser almacenados en las tablas Usualmente se definen usando expresiones que dan como resultado un valor booleano indicando si los datos satisfacen la restriccioacuten o noLas restricciones no son parte formal del modelo relacional pero son incluidas porque juegan el rol de organizar mejor los datos Las restricciones son muy discutidas junto con los conceptos relacionalesPueden crearse los siguientes tipos de restricciones Las restricciones unique y primary key exigen que no haya dos filas en una tabla con los mismos valores en las columnas especificadas Ademaacutes la restriccioacuten primary key requiere que no haya valores nulos en ninguna fila de la columna

241 Crear una restriccioacuten PRIMARY KEYPara crear una restriccioacuten Primary Key realizamos clic en el campo donde

queremos crear la restriccioacuten y luego realizamos clic en el iacutecono 242 Crear una restriccioacuten UNIQUEPara crear una restriccioacuten UNIQUE realizamos clic en el campo donde queremos crear dicha restriccioacuten y luego escogemos el menuacute Table Designe y luego en IndexesKeys

Nos aparece la siguiente ventana en donde dice Type escogemos Unique Key

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 25

Realizamos clic en close y guardamos la tabla

La integridad de referencia ( references ) exige que los datos insertados en columnas especiacuteficas ya tengan datos coincidentes en la tabla y columnas especificadas Las restricciones check limitan los valores de datos insertados en las columnas

243 Agregar una restriccioacuten CHECKRealizamos clic derecho dentro del explorador de objetos en la seccioacuten tables buscamos el nombre de la tabla y buscamos constraints realizamos clic derecho con el botoacuten secundario del mouse y escogemos New Constraint

Nos apareced la siguiente ventana

|

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 26

Realizamos clic en este botoacuten para poder editar la expresioacuten que queremos que tenga restricciones

En la ventana que nos aparece ponemos la expresioacuten deseada y realizamos clic en el botoacuten Ok

Para poder editar la tabla y verificar los cambios realizados buscamos en el explorador de objetos el nombre de la tabla realizamos clic derecho y escogemos la opcioacuten Edit Top 200 Rows

Y procedemos a ingresar datos para probarTambieacuten se puede imponer la integridad de datos restringiendo el uso de valores nulos en una columna (las palabras clave null o not null ) y proporcionando valores predeterminados para columnas (la claacuteusula default )

25 Diagramas de bases de datosLos diagramas de bases de datos se utiliza para visualizar las tablas graacuteficamente y para poder establecer las relaciones

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 27

Para crear un diagrama hacemos clic en el explorador de objetos hacemos clic en el nombre de la base de datos y escogemos Database Diagrams hacemos clic derecho escogemos new Database Diagrams

Nos aparece el siguiente mensaje realizamos un clic dentro del botoacuten Yes

Volvemos hacer clic derechos y volvemos a escoger New Data Base Diagram

Aparece la siguiente ventana en pantalla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 28

Seleccionamos todas y escogemos AddNos aparece la siguiente ventana

En el caso de tener una relacioacuten muchos a muchos debemos romper la relacioacuten con una tercera tabla para esto desde el mismo Database Diagram hacemos clic derecho en un lugar en blanco y escogemos new table llenos las columnas con los campos y tipos de datos respectivosDebemos tomar en cuenta que en las tablas a donde va la relacioacuten tiene que tener su respectiva llave foraacutenea y para poder establecer la relacioacuten

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 29

arrastramos desde el campo principal hacia la llave foraacutenea es decir de la tabla padre a la hijaQuedando las relaciones asiacute

Finalmente cerramos la base de datos nos aparece la siguiente ventana

pidiendo guardar el Database Diagram le demos un nombre y realizamos clic

en el botoacuten OK

252 Ejercicios

Los diagramas del ejercicio 1 y 2 del capiacutetulo anterior pasar al modelo

relacional en SQLSERVER 2008

Los ejercicios 5 y 6 los ejercicios de la prueba pasarlos a sql server

Transformar el siguiente modelo entidad relacioacuten al modelo relacional

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 30

CAPIacuteTULO III

Aplicar las diferentes sentencias y modos en lenguaje SQL

para tratamiento de la informacioacuten almacenada en las

diferentes tablas de la base de datos

31 Lenguaje de definicioacuten de datosLas sentencias DDL son CREATE ALTER y DROP Siempre se usan estas

sentencias junto con el tipo de objeto y el nombre del objeto

CREATE

Crea una base de datos o un objeto

Sintaxis

Create database nombre on grupo_base de datos filegroup

Ejemplo

USE mastergoIF DB_ID (Ncalificaciones) IS NULL BEGIN create database calificaciones on primary( name = calificaciones filename = Ccalificacionescalificacionesmdf

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 31

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 21: Base de Datos

23 Creacioacuten de tablasAntes de aprender sobre la creacioacuten de tablas es necesario conocer los pasos para crear una base de datos en sql server 2008Para crear una base de datos en SQL Server 2008 debemos seguir los siguientes pasos1- Ingresar a SQLServer

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 21

2- En la ventana que nos aparece realizamos clic derecho en donde dice database

3- Nos aparece el siguiente menuacute hacemos clic donde dice New Database

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 22

4- Nos aparece la siguiente ventana

En donde dice Database Name le damos un nombre a la base de datos

5- Luego hacemos clic en

Nos aparece la siguiente ventana

Aquiacute tenemos dos opciones In percent nos permite que si sobrepasa el tamantildeo de la base de datos crezca en porcentajeIn Megabytes nos permite hacer que la base de datos crezca de 1 Megabyte en 1 megabyte si sobrepasa el tamantildeo y listoAhora para crear una tabla seguimos los siguientes pasos1- Hacemos clic en donde dice database buscamos el nombre de nuestra base de datos en la seccioacuten tables realizamos clic derecho con el botoacuten secundario del mouse

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 23

Nos aparece el siguiente menuacute

Hacemos clic en New Table

Y en donde dice Column Name vamos poniendo los campos de las bases de datos con su respectivo tipoAl final hacemos clic en donde estaacute el iacutecono de un diskette nos aparece una ventana pidiendo el nombre de la tabla le asignamos un nombre y realizamos clic en el botoacuten ok24 Creacioacuten de RestriccionesUna restriccioacuten es una condicioacuten que obliga el cumplimiento de ciertas condiciones en la base de datos Algunas no son determinadas por los usuarios sino que son inherentemente definidas por el simple hecho de que la base de datos sea relacional Algunas otras restricciones las puede definir el usuario por ejemplo usar un campo con valores enteros entre 1 y 10

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 24

Las restricciones proveen un meacutetodo de implementar reglas en la base de datos Las restricciones restringen los datos que pueden ser almacenados en las tablas Usualmente se definen usando expresiones que dan como resultado un valor booleano indicando si los datos satisfacen la restriccioacuten o noLas restricciones no son parte formal del modelo relacional pero son incluidas porque juegan el rol de organizar mejor los datos Las restricciones son muy discutidas junto con los conceptos relacionalesPueden crearse los siguientes tipos de restricciones Las restricciones unique y primary key exigen que no haya dos filas en una tabla con los mismos valores en las columnas especificadas Ademaacutes la restriccioacuten primary key requiere que no haya valores nulos en ninguna fila de la columna

241 Crear una restriccioacuten PRIMARY KEYPara crear una restriccioacuten Primary Key realizamos clic en el campo donde

queremos crear la restriccioacuten y luego realizamos clic en el iacutecono 242 Crear una restriccioacuten UNIQUEPara crear una restriccioacuten UNIQUE realizamos clic en el campo donde queremos crear dicha restriccioacuten y luego escogemos el menuacute Table Designe y luego en IndexesKeys

Nos aparece la siguiente ventana en donde dice Type escogemos Unique Key

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 25

Realizamos clic en close y guardamos la tabla

La integridad de referencia ( references ) exige que los datos insertados en columnas especiacuteficas ya tengan datos coincidentes en la tabla y columnas especificadas Las restricciones check limitan los valores de datos insertados en las columnas

243 Agregar una restriccioacuten CHECKRealizamos clic derecho dentro del explorador de objetos en la seccioacuten tables buscamos el nombre de la tabla y buscamos constraints realizamos clic derecho con el botoacuten secundario del mouse y escogemos New Constraint

Nos apareced la siguiente ventana

|

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 26

Realizamos clic en este botoacuten para poder editar la expresioacuten que queremos que tenga restricciones

En la ventana que nos aparece ponemos la expresioacuten deseada y realizamos clic en el botoacuten Ok

Para poder editar la tabla y verificar los cambios realizados buscamos en el explorador de objetos el nombre de la tabla realizamos clic derecho y escogemos la opcioacuten Edit Top 200 Rows

Y procedemos a ingresar datos para probarTambieacuten se puede imponer la integridad de datos restringiendo el uso de valores nulos en una columna (las palabras clave null o not null ) y proporcionando valores predeterminados para columnas (la claacuteusula default )

25 Diagramas de bases de datosLos diagramas de bases de datos se utiliza para visualizar las tablas graacuteficamente y para poder establecer las relaciones

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 27

Para crear un diagrama hacemos clic en el explorador de objetos hacemos clic en el nombre de la base de datos y escogemos Database Diagrams hacemos clic derecho escogemos new Database Diagrams

Nos aparece el siguiente mensaje realizamos un clic dentro del botoacuten Yes

Volvemos hacer clic derechos y volvemos a escoger New Data Base Diagram

Aparece la siguiente ventana en pantalla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 28

Seleccionamos todas y escogemos AddNos aparece la siguiente ventana

En el caso de tener una relacioacuten muchos a muchos debemos romper la relacioacuten con una tercera tabla para esto desde el mismo Database Diagram hacemos clic derecho en un lugar en blanco y escogemos new table llenos las columnas con los campos y tipos de datos respectivosDebemos tomar en cuenta que en las tablas a donde va la relacioacuten tiene que tener su respectiva llave foraacutenea y para poder establecer la relacioacuten

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 29

arrastramos desde el campo principal hacia la llave foraacutenea es decir de la tabla padre a la hijaQuedando las relaciones asiacute

Finalmente cerramos la base de datos nos aparece la siguiente ventana

pidiendo guardar el Database Diagram le demos un nombre y realizamos clic

en el botoacuten OK

252 Ejercicios

Los diagramas del ejercicio 1 y 2 del capiacutetulo anterior pasar al modelo

relacional en SQLSERVER 2008

Los ejercicios 5 y 6 los ejercicios de la prueba pasarlos a sql server

Transformar el siguiente modelo entidad relacioacuten al modelo relacional

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 30

CAPIacuteTULO III

Aplicar las diferentes sentencias y modos en lenguaje SQL

para tratamiento de la informacioacuten almacenada en las

diferentes tablas de la base de datos

31 Lenguaje de definicioacuten de datosLas sentencias DDL son CREATE ALTER y DROP Siempre se usan estas

sentencias junto con el tipo de objeto y el nombre del objeto

CREATE

Crea una base de datos o un objeto

Sintaxis

Create database nombre on grupo_base de datos filegroup

Ejemplo

USE mastergoIF DB_ID (Ncalificaciones) IS NULL BEGIN create database calificaciones on primary( name = calificaciones filename = Ccalificacionescalificacionesmdf

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 31

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 22: Base de Datos

2- En la ventana que nos aparece realizamos clic derecho en donde dice database

3- Nos aparece el siguiente menuacute hacemos clic donde dice New Database

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 22

4- Nos aparece la siguiente ventana

En donde dice Database Name le damos un nombre a la base de datos

5- Luego hacemos clic en

Nos aparece la siguiente ventana

Aquiacute tenemos dos opciones In percent nos permite que si sobrepasa el tamantildeo de la base de datos crezca en porcentajeIn Megabytes nos permite hacer que la base de datos crezca de 1 Megabyte en 1 megabyte si sobrepasa el tamantildeo y listoAhora para crear una tabla seguimos los siguientes pasos1- Hacemos clic en donde dice database buscamos el nombre de nuestra base de datos en la seccioacuten tables realizamos clic derecho con el botoacuten secundario del mouse

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 23

Nos aparece el siguiente menuacute

Hacemos clic en New Table

Y en donde dice Column Name vamos poniendo los campos de las bases de datos con su respectivo tipoAl final hacemos clic en donde estaacute el iacutecono de un diskette nos aparece una ventana pidiendo el nombre de la tabla le asignamos un nombre y realizamos clic en el botoacuten ok24 Creacioacuten de RestriccionesUna restriccioacuten es una condicioacuten que obliga el cumplimiento de ciertas condiciones en la base de datos Algunas no son determinadas por los usuarios sino que son inherentemente definidas por el simple hecho de que la base de datos sea relacional Algunas otras restricciones las puede definir el usuario por ejemplo usar un campo con valores enteros entre 1 y 10

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 24

Las restricciones proveen un meacutetodo de implementar reglas en la base de datos Las restricciones restringen los datos que pueden ser almacenados en las tablas Usualmente se definen usando expresiones que dan como resultado un valor booleano indicando si los datos satisfacen la restriccioacuten o noLas restricciones no son parte formal del modelo relacional pero son incluidas porque juegan el rol de organizar mejor los datos Las restricciones son muy discutidas junto con los conceptos relacionalesPueden crearse los siguientes tipos de restricciones Las restricciones unique y primary key exigen que no haya dos filas en una tabla con los mismos valores en las columnas especificadas Ademaacutes la restriccioacuten primary key requiere que no haya valores nulos en ninguna fila de la columna

241 Crear una restriccioacuten PRIMARY KEYPara crear una restriccioacuten Primary Key realizamos clic en el campo donde

queremos crear la restriccioacuten y luego realizamos clic en el iacutecono 242 Crear una restriccioacuten UNIQUEPara crear una restriccioacuten UNIQUE realizamos clic en el campo donde queremos crear dicha restriccioacuten y luego escogemos el menuacute Table Designe y luego en IndexesKeys

Nos aparece la siguiente ventana en donde dice Type escogemos Unique Key

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 25

Realizamos clic en close y guardamos la tabla

La integridad de referencia ( references ) exige que los datos insertados en columnas especiacuteficas ya tengan datos coincidentes en la tabla y columnas especificadas Las restricciones check limitan los valores de datos insertados en las columnas

243 Agregar una restriccioacuten CHECKRealizamos clic derecho dentro del explorador de objetos en la seccioacuten tables buscamos el nombre de la tabla y buscamos constraints realizamos clic derecho con el botoacuten secundario del mouse y escogemos New Constraint

Nos apareced la siguiente ventana

|

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 26

Realizamos clic en este botoacuten para poder editar la expresioacuten que queremos que tenga restricciones

En la ventana que nos aparece ponemos la expresioacuten deseada y realizamos clic en el botoacuten Ok

Para poder editar la tabla y verificar los cambios realizados buscamos en el explorador de objetos el nombre de la tabla realizamos clic derecho y escogemos la opcioacuten Edit Top 200 Rows

Y procedemos a ingresar datos para probarTambieacuten se puede imponer la integridad de datos restringiendo el uso de valores nulos en una columna (las palabras clave null o not null ) y proporcionando valores predeterminados para columnas (la claacuteusula default )

25 Diagramas de bases de datosLos diagramas de bases de datos se utiliza para visualizar las tablas graacuteficamente y para poder establecer las relaciones

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 27

Para crear un diagrama hacemos clic en el explorador de objetos hacemos clic en el nombre de la base de datos y escogemos Database Diagrams hacemos clic derecho escogemos new Database Diagrams

Nos aparece el siguiente mensaje realizamos un clic dentro del botoacuten Yes

Volvemos hacer clic derechos y volvemos a escoger New Data Base Diagram

Aparece la siguiente ventana en pantalla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 28

Seleccionamos todas y escogemos AddNos aparece la siguiente ventana

En el caso de tener una relacioacuten muchos a muchos debemos romper la relacioacuten con una tercera tabla para esto desde el mismo Database Diagram hacemos clic derecho en un lugar en blanco y escogemos new table llenos las columnas con los campos y tipos de datos respectivosDebemos tomar en cuenta que en las tablas a donde va la relacioacuten tiene que tener su respectiva llave foraacutenea y para poder establecer la relacioacuten

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 29

arrastramos desde el campo principal hacia la llave foraacutenea es decir de la tabla padre a la hijaQuedando las relaciones asiacute

Finalmente cerramos la base de datos nos aparece la siguiente ventana

pidiendo guardar el Database Diagram le demos un nombre y realizamos clic

en el botoacuten OK

252 Ejercicios

Los diagramas del ejercicio 1 y 2 del capiacutetulo anterior pasar al modelo

relacional en SQLSERVER 2008

Los ejercicios 5 y 6 los ejercicios de la prueba pasarlos a sql server

Transformar el siguiente modelo entidad relacioacuten al modelo relacional

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 30

CAPIacuteTULO III

Aplicar las diferentes sentencias y modos en lenguaje SQL

para tratamiento de la informacioacuten almacenada en las

diferentes tablas de la base de datos

31 Lenguaje de definicioacuten de datosLas sentencias DDL son CREATE ALTER y DROP Siempre se usan estas

sentencias junto con el tipo de objeto y el nombre del objeto

CREATE

Crea una base de datos o un objeto

Sintaxis

Create database nombre on grupo_base de datos filegroup

Ejemplo

USE mastergoIF DB_ID (Ncalificaciones) IS NULL BEGIN create database calificaciones on primary( name = calificaciones filename = Ccalificacionescalificacionesmdf

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 31

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 23: Base de Datos

4- Nos aparece la siguiente ventana

En donde dice Database Name le damos un nombre a la base de datos

5- Luego hacemos clic en

Nos aparece la siguiente ventana

Aquiacute tenemos dos opciones In percent nos permite que si sobrepasa el tamantildeo de la base de datos crezca en porcentajeIn Megabytes nos permite hacer que la base de datos crezca de 1 Megabyte en 1 megabyte si sobrepasa el tamantildeo y listoAhora para crear una tabla seguimos los siguientes pasos1- Hacemos clic en donde dice database buscamos el nombre de nuestra base de datos en la seccioacuten tables realizamos clic derecho con el botoacuten secundario del mouse

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 23

Nos aparece el siguiente menuacute

Hacemos clic en New Table

Y en donde dice Column Name vamos poniendo los campos de las bases de datos con su respectivo tipoAl final hacemos clic en donde estaacute el iacutecono de un diskette nos aparece una ventana pidiendo el nombre de la tabla le asignamos un nombre y realizamos clic en el botoacuten ok24 Creacioacuten de RestriccionesUna restriccioacuten es una condicioacuten que obliga el cumplimiento de ciertas condiciones en la base de datos Algunas no son determinadas por los usuarios sino que son inherentemente definidas por el simple hecho de que la base de datos sea relacional Algunas otras restricciones las puede definir el usuario por ejemplo usar un campo con valores enteros entre 1 y 10

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 24

Las restricciones proveen un meacutetodo de implementar reglas en la base de datos Las restricciones restringen los datos que pueden ser almacenados en las tablas Usualmente se definen usando expresiones que dan como resultado un valor booleano indicando si los datos satisfacen la restriccioacuten o noLas restricciones no son parte formal del modelo relacional pero son incluidas porque juegan el rol de organizar mejor los datos Las restricciones son muy discutidas junto con los conceptos relacionalesPueden crearse los siguientes tipos de restricciones Las restricciones unique y primary key exigen que no haya dos filas en una tabla con los mismos valores en las columnas especificadas Ademaacutes la restriccioacuten primary key requiere que no haya valores nulos en ninguna fila de la columna

241 Crear una restriccioacuten PRIMARY KEYPara crear una restriccioacuten Primary Key realizamos clic en el campo donde

queremos crear la restriccioacuten y luego realizamos clic en el iacutecono 242 Crear una restriccioacuten UNIQUEPara crear una restriccioacuten UNIQUE realizamos clic en el campo donde queremos crear dicha restriccioacuten y luego escogemos el menuacute Table Designe y luego en IndexesKeys

Nos aparece la siguiente ventana en donde dice Type escogemos Unique Key

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 25

Realizamos clic en close y guardamos la tabla

La integridad de referencia ( references ) exige que los datos insertados en columnas especiacuteficas ya tengan datos coincidentes en la tabla y columnas especificadas Las restricciones check limitan los valores de datos insertados en las columnas

243 Agregar una restriccioacuten CHECKRealizamos clic derecho dentro del explorador de objetos en la seccioacuten tables buscamos el nombre de la tabla y buscamos constraints realizamos clic derecho con el botoacuten secundario del mouse y escogemos New Constraint

Nos apareced la siguiente ventana

|

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 26

Realizamos clic en este botoacuten para poder editar la expresioacuten que queremos que tenga restricciones

En la ventana que nos aparece ponemos la expresioacuten deseada y realizamos clic en el botoacuten Ok

Para poder editar la tabla y verificar los cambios realizados buscamos en el explorador de objetos el nombre de la tabla realizamos clic derecho y escogemos la opcioacuten Edit Top 200 Rows

Y procedemos a ingresar datos para probarTambieacuten se puede imponer la integridad de datos restringiendo el uso de valores nulos en una columna (las palabras clave null o not null ) y proporcionando valores predeterminados para columnas (la claacuteusula default )

25 Diagramas de bases de datosLos diagramas de bases de datos se utiliza para visualizar las tablas graacuteficamente y para poder establecer las relaciones

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 27

Para crear un diagrama hacemos clic en el explorador de objetos hacemos clic en el nombre de la base de datos y escogemos Database Diagrams hacemos clic derecho escogemos new Database Diagrams

Nos aparece el siguiente mensaje realizamos un clic dentro del botoacuten Yes

Volvemos hacer clic derechos y volvemos a escoger New Data Base Diagram

Aparece la siguiente ventana en pantalla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 28

Seleccionamos todas y escogemos AddNos aparece la siguiente ventana

En el caso de tener una relacioacuten muchos a muchos debemos romper la relacioacuten con una tercera tabla para esto desde el mismo Database Diagram hacemos clic derecho en un lugar en blanco y escogemos new table llenos las columnas con los campos y tipos de datos respectivosDebemos tomar en cuenta que en las tablas a donde va la relacioacuten tiene que tener su respectiva llave foraacutenea y para poder establecer la relacioacuten

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 29

arrastramos desde el campo principal hacia la llave foraacutenea es decir de la tabla padre a la hijaQuedando las relaciones asiacute

Finalmente cerramos la base de datos nos aparece la siguiente ventana

pidiendo guardar el Database Diagram le demos un nombre y realizamos clic

en el botoacuten OK

252 Ejercicios

Los diagramas del ejercicio 1 y 2 del capiacutetulo anterior pasar al modelo

relacional en SQLSERVER 2008

Los ejercicios 5 y 6 los ejercicios de la prueba pasarlos a sql server

Transformar el siguiente modelo entidad relacioacuten al modelo relacional

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 30

CAPIacuteTULO III

Aplicar las diferentes sentencias y modos en lenguaje SQL

para tratamiento de la informacioacuten almacenada en las

diferentes tablas de la base de datos

31 Lenguaje de definicioacuten de datosLas sentencias DDL son CREATE ALTER y DROP Siempre se usan estas

sentencias junto con el tipo de objeto y el nombre del objeto

CREATE

Crea una base de datos o un objeto

Sintaxis

Create database nombre on grupo_base de datos filegroup

Ejemplo

USE mastergoIF DB_ID (Ncalificaciones) IS NULL BEGIN create database calificaciones on primary( name = calificaciones filename = Ccalificacionescalificacionesmdf

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 31

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 24: Base de Datos

Nos aparece el siguiente menuacute

Hacemos clic en New Table

Y en donde dice Column Name vamos poniendo los campos de las bases de datos con su respectivo tipoAl final hacemos clic en donde estaacute el iacutecono de un diskette nos aparece una ventana pidiendo el nombre de la tabla le asignamos un nombre y realizamos clic en el botoacuten ok24 Creacioacuten de RestriccionesUna restriccioacuten es una condicioacuten que obliga el cumplimiento de ciertas condiciones en la base de datos Algunas no son determinadas por los usuarios sino que son inherentemente definidas por el simple hecho de que la base de datos sea relacional Algunas otras restricciones las puede definir el usuario por ejemplo usar un campo con valores enteros entre 1 y 10

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 24

Las restricciones proveen un meacutetodo de implementar reglas en la base de datos Las restricciones restringen los datos que pueden ser almacenados en las tablas Usualmente se definen usando expresiones que dan como resultado un valor booleano indicando si los datos satisfacen la restriccioacuten o noLas restricciones no son parte formal del modelo relacional pero son incluidas porque juegan el rol de organizar mejor los datos Las restricciones son muy discutidas junto con los conceptos relacionalesPueden crearse los siguientes tipos de restricciones Las restricciones unique y primary key exigen que no haya dos filas en una tabla con los mismos valores en las columnas especificadas Ademaacutes la restriccioacuten primary key requiere que no haya valores nulos en ninguna fila de la columna

241 Crear una restriccioacuten PRIMARY KEYPara crear una restriccioacuten Primary Key realizamos clic en el campo donde

queremos crear la restriccioacuten y luego realizamos clic en el iacutecono 242 Crear una restriccioacuten UNIQUEPara crear una restriccioacuten UNIQUE realizamos clic en el campo donde queremos crear dicha restriccioacuten y luego escogemos el menuacute Table Designe y luego en IndexesKeys

Nos aparece la siguiente ventana en donde dice Type escogemos Unique Key

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 25

Realizamos clic en close y guardamos la tabla

La integridad de referencia ( references ) exige que los datos insertados en columnas especiacuteficas ya tengan datos coincidentes en la tabla y columnas especificadas Las restricciones check limitan los valores de datos insertados en las columnas

243 Agregar una restriccioacuten CHECKRealizamos clic derecho dentro del explorador de objetos en la seccioacuten tables buscamos el nombre de la tabla y buscamos constraints realizamos clic derecho con el botoacuten secundario del mouse y escogemos New Constraint

Nos apareced la siguiente ventana

|

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 26

Realizamos clic en este botoacuten para poder editar la expresioacuten que queremos que tenga restricciones

En la ventana que nos aparece ponemos la expresioacuten deseada y realizamos clic en el botoacuten Ok

Para poder editar la tabla y verificar los cambios realizados buscamos en el explorador de objetos el nombre de la tabla realizamos clic derecho y escogemos la opcioacuten Edit Top 200 Rows

Y procedemos a ingresar datos para probarTambieacuten se puede imponer la integridad de datos restringiendo el uso de valores nulos en una columna (las palabras clave null o not null ) y proporcionando valores predeterminados para columnas (la claacuteusula default )

25 Diagramas de bases de datosLos diagramas de bases de datos se utiliza para visualizar las tablas graacuteficamente y para poder establecer las relaciones

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 27

Para crear un diagrama hacemos clic en el explorador de objetos hacemos clic en el nombre de la base de datos y escogemos Database Diagrams hacemos clic derecho escogemos new Database Diagrams

Nos aparece el siguiente mensaje realizamos un clic dentro del botoacuten Yes

Volvemos hacer clic derechos y volvemos a escoger New Data Base Diagram

Aparece la siguiente ventana en pantalla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 28

Seleccionamos todas y escogemos AddNos aparece la siguiente ventana

En el caso de tener una relacioacuten muchos a muchos debemos romper la relacioacuten con una tercera tabla para esto desde el mismo Database Diagram hacemos clic derecho en un lugar en blanco y escogemos new table llenos las columnas con los campos y tipos de datos respectivosDebemos tomar en cuenta que en las tablas a donde va la relacioacuten tiene que tener su respectiva llave foraacutenea y para poder establecer la relacioacuten

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 29

arrastramos desde el campo principal hacia la llave foraacutenea es decir de la tabla padre a la hijaQuedando las relaciones asiacute

Finalmente cerramos la base de datos nos aparece la siguiente ventana

pidiendo guardar el Database Diagram le demos un nombre y realizamos clic

en el botoacuten OK

252 Ejercicios

Los diagramas del ejercicio 1 y 2 del capiacutetulo anterior pasar al modelo

relacional en SQLSERVER 2008

Los ejercicios 5 y 6 los ejercicios de la prueba pasarlos a sql server

Transformar el siguiente modelo entidad relacioacuten al modelo relacional

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 30

CAPIacuteTULO III

Aplicar las diferentes sentencias y modos en lenguaje SQL

para tratamiento de la informacioacuten almacenada en las

diferentes tablas de la base de datos

31 Lenguaje de definicioacuten de datosLas sentencias DDL son CREATE ALTER y DROP Siempre se usan estas

sentencias junto con el tipo de objeto y el nombre del objeto

CREATE

Crea una base de datos o un objeto

Sintaxis

Create database nombre on grupo_base de datos filegroup

Ejemplo

USE mastergoIF DB_ID (Ncalificaciones) IS NULL BEGIN create database calificaciones on primary( name = calificaciones filename = Ccalificacionescalificacionesmdf

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 31

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 25: Base de Datos

Las restricciones proveen un meacutetodo de implementar reglas en la base de datos Las restricciones restringen los datos que pueden ser almacenados en las tablas Usualmente se definen usando expresiones que dan como resultado un valor booleano indicando si los datos satisfacen la restriccioacuten o noLas restricciones no son parte formal del modelo relacional pero son incluidas porque juegan el rol de organizar mejor los datos Las restricciones son muy discutidas junto con los conceptos relacionalesPueden crearse los siguientes tipos de restricciones Las restricciones unique y primary key exigen que no haya dos filas en una tabla con los mismos valores en las columnas especificadas Ademaacutes la restriccioacuten primary key requiere que no haya valores nulos en ninguna fila de la columna

241 Crear una restriccioacuten PRIMARY KEYPara crear una restriccioacuten Primary Key realizamos clic en el campo donde

queremos crear la restriccioacuten y luego realizamos clic en el iacutecono 242 Crear una restriccioacuten UNIQUEPara crear una restriccioacuten UNIQUE realizamos clic en el campo donde queremos crear dicha restriccioacuten y luego escogemos el menuacute Table Designe y luego en IndexesKeys

Nos aparece la siguiente ventana en donde dice Type escogemos Unique Key

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 25

Realizamos clic en close y guardamos la tabla

La integridad de referencia ( references ) exige que los datos insertados en columnas especiacuteficas ya tengan datos coincidentes en la tabla y columnas especificadas Las restricciones check limitan los valores de datos insertados en las columnas

243 Agregar una restriccioacuten CHECKRealizamos clic derecho dentro del explorador de objetos en la seccioacuten tables buscamos el nombre de la tabla y buscamos constraints realizamos clic derecho con el botoacuten secundario del mouse y escogemos New Constraint

Nos apareced la siguiente ventana

|

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 26

Realizamos clic en este botoacuten para poder editar la expresioacuten que queremos que tenga restricciones

En la ventana que nos aparece ponemos la expresioacuten deseada y realizamos clic en el botoacuten Ok

Para poder editar la tabla y verificar los cambios realizados buscamos en el explorador de objetos el nombre de la tabla realizamos clic derecho y escogemos la opcioacuten Edit Top 200 Rows

Y procedemos a ingresar datos para probarTambieacuten se puede imponer la integridad de datos restringiendo el uso de valores nulos en una columna (las palabras clave null o not null ) y proporcionando valores predeterminados para columnas (la claacuteusula default )

25 Diagramas de bases de datosLos diagramas de bases de datos se utiliza para visualizar las tablas graacuteficamente y para poder establecer las relaciones

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 27

Para crear un diagrama hacemos clic en el explorador de objetos hacemos clic en el nombre de la base de datos y escogemos Database Diagrams hacemos clic derecho escogemos new Database Diagrams

Nos aparece el siguiente mensaje realizamos un clic dentro del botoacuten Yes

Volvemos hacer clic derechos y volvemos a escoger New Data Base Diagram

Aparece la siguiente ventana en pantalla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 28

Seleccionamos todas y escogemos AddNos aparece la siguiente ventana

En el caso de tener una relacioacuten muchos a muchos debemos romper la relacioacuten con una tercera tabla para esto desde el mismo Database Diagram hacemos clic derecho en un lugar en blanco y escogemos new table llenos las columnas con los campos y tipos de datos respectivosDebemos tomar en cuenta que en las tablas a donde va la relacioacuten tiene que tener su respectiva llave foraacutenea y para poder establecer la relacioacuten

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 29

arrastramos desde el campo principal hacia la llave foraacutenea es decir de la tabla padre a la hijaQuedando las relaciones asiacute

Finalmente cerramos la base de datos nos aparece la siguiente ventana

pidiendo guardar el Database Diagram le demos un nombre y realizamos clic

en el botoacuten OK

252 Ejercicios

Los diagramas del ejercicio 1 y 2 del capiacutetulo anterior pasar al modelo

relacional en SQLSERVER 2008

Los ejercicios 5 y 6 los ejercicios de la prueba pasarlos a sql server

Transformar el siguiente modelo entidad relacioacuten al modelo relacional

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 30

CAPIacuteTULO III

Aplicar las diferentes sentencias y modos en lenguaje SQL

para tratamiento de la informacioacuten almacenada en las

diferentes tablas de la base de datos

31 Lenguaje de definicioacuten de datosLas sentencias DDL son CREATE ALTER y DROP Siempre se usan estas

sentencias junto con el tipo de objeto y el nombre del objeto

CREATE

Crea una base de datos o un objeto

Sintaxis

Create database nombre on grupo_base de datos filegroup

Ejemplo

USE mastergoIF DB_ID (Ncalificaciones) IS NULL BEGIN create database calificaciones on primary( name = calificaciones filename = Ccalificacionescalificacionesmdf

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 31

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 26: Base de Datos

Realizamos clic en close y guardamos la tabla

La integridad de referencia ( references ) exige que los datos insertados en columnas especiacuteficas ya tengan datos coincidentes en la tabla y columnas especificadas Las restricciones check limitan los valores de datos insertados en las columnas

243 Agregar una restriccioacuten CHECKRealizamos clic derecho dentro del explorador de objetos en la seccioacuten tables buscamos el nombre de la tabla y buscamos constraints realizamos clic derecho con el botoacuten secundario del mouse y escogemos New Constraint

Nos apareced la siguiente ventana

|

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 26

Realizamos clic en este botoacuten para poder editar la expresioacuten que queremos que tenga restricciones

En la ventana que nos aparece ponemos la expresioacuten deseada y realizamos clic en el botoacuten Ok

Para poder editar la tabla y verificar los cambios realizados buscamos en el explorador de objetos el nombre de la tabla realizamos clic derecho y escogemos la opcioacuten Edit Top 200 Rows

Y procedemos a ingresar datos para probarTambieacuten se puede imponer la integridad de datos restringiendo el uso de valores nulos en una columna (las palabras clave null o not null ) y proporcionando valores predeterminados para columnas (la claacuteusula default )

25 Diagramas de bases de datosLos diagramas de bases de datos se utiliza para visualizar las tablas graacuteficamente y para poder establecer las relaciones

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 27

Para crear un diagrama hacemos clic en el explorador de objetos hacemos clic en el nombre de la base de datos y escogemos Database Diagrams hacemos clic derecho escogemos new Database Diagrams

Nos aparece el siguiente mensaje realizamos un clic dentro del botoacuten Yes

Volvemos hacer clic derechos y volvemos a escoger New Data Base Diagram

Aparece la siguiente ventana en pantalla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 28

Seleccionamos todas y escogemos AddNos aparece la siguiente ventana

En el caso de tener una relacioacuten muchos a muchos debemos romper la relacioacuten con una tercera tabla para esto desde el mismo Database Diagram hacemos clic derecho en un lugar en blanco y escogemos new table llenos las columnas con los campos y tipos de datos respectivosDebemos tomar en cuenta que en las tablas a donde va la relacioacuten tiene que tener su respectiva llave foraacutenea y para poder establecer la relacioacuten

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 29

arrastramos desde el campo principal hacia la llave foraacutenea es decir de la tabla padre a la hijaQuedando las relaciones asiacute

Finalmente cerramos la base de datos nos aparece la siguiente ventana

pidiendo guardar el Database Diagram le demos un nombre y realizamos clic

en el botoacuten OK

252 Ejercicios

Los diagramas del ejercicio 1 y 2 del capiacutetulo anterior pasar al modelo

relacional en SQLSERVER 2008

Los ejercicios 5 y 6 los ejercicios de la prueba pasarlos a sql server

Transformar el siguiente modelo entidad relacioacuten al modelo relacional

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 30

CAPIacuteTULO III

Aplicar las diferentes sentencias y modos en lenguaje SQL

para tratamiento de la informacioacuten almacenada en las

diferentes tablas de la base de datos

31 Lenguaje de definicioacuten de datosLas sentencias DDL son CREATE ALTER y DROP Siempre se usan estas

sentencias junto con el tipo de objeto y el nombre del objeto

CREATE

Crea una base de datos o un objeto

Sintaxis

Create database nombre on grupo_base de datos filegroup

Ejemplo

USE mastergoIF DB_ID (Ncalificaciones) IS NULL BEGIN create database calificaciones on primary( name = calificaciones filename = Ccalificacionescalificacionesmdf

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 31

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 27: Base de Datos

Realizamos clic en este botoacuten para poder editar la expresioacuten que queremos que tenga restricciones

En la ventana que nos aparece ponemos la expresioacuten deseada y realizamos clic en el botoacuten Ok

Para poder editar la tabla y verificar los cambios realizados buscamos en el explorador de objetos el nombre de la tabla realizamos clic derecho y escogemos la opcioacuten Edit Top 200 Rows

Y procedemos a ingresar datos para probarTambieacuten se puede imponer la integridad de datos restringiendo el uso de valores nulos en una columna (las palabras clave null o not null ) y proporcionando valores predeterminados para columnas (la claacuteusula default )

25 Diagramas de bases de datosLos diagramas de bases de datos se utiliza para visualizar las tablas graacuteficamente y para poder establecer las relaciones

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 27

Para crear un diagrama hacemos clic en el explorador de objetos hacemos clic en el nombre de la base de datos y escogemos Database Diagrams hacemos clic derecho escogemos new Database Diagrams

Nos aparece el siguiente mensaje realizamos un clic dentro del botoacuten Yes

Volvemos hacer clic derechos y volvemos a escoger New Data Base Diagram

Aparece la siguiente ventana en pantalla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 28

Seleccionamos todas y escogemos AddNos aparece la siguiente ventana

En el caso de tener una relacioacuten muchos a muchos debemos romper la relacioacuten con una tercera tabla para esto desde el mismo Database Diagram hacemos clic derecho en un lugar en blanco y escogemos new table llenos las columnas con los campos y tipos de datos respectivosDebemos tomar en cuenta que en las tablas a donde va la relacioacuten tiene que tener su respectiva llave foraacutenea y para poder establecer la relacioacuten

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 29

arrastramos desde el campo principal hacia la llave foraacutenea es decir de la tabla padre a la hijaQuedando las relaciones asiacute

Finalmente cerramos la base de datos nos aparece la siguiente ventana

pidiendo guardar el Database Diagram le demos un nombre y realizamos clic

en el botoacuten OK

252 Ejercicios

Los diagramas del ejercicio 1 y 2 del capiacutetulo anterior pasar al modelo

relacional en SQLSERVER 2008

Los ejercicios 5 y 6 los ejercicios de la prueba pasarlos a sql server

Transformar el siguiente modelo entidad relacioacuten al modelo relacional

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 30

CAPIacuteTULO III

Aplicar las diferentes sentencias y modos en lenguaje SQL

para tratamiento de la informacioacuten almacenada en las

diferentes tablas de la base de datos

31 Lenguaje de definicioacuten de datosLas sentencias DDL son CREATE ALTER y DROP Siempre se usan estas

sentencias junto con el tipo de objeto y el nombre del objeto

CREATE

Crea una base de datos o un objeto

Sintaxis

Create database nombre on grupo_base de datos filegroup

Ejemplo

USE mastergoIF DB_ID (Ncalificaciones) IS NULL BEGIN create database calificaciones on primary( name = calificaciones filename = Ccalificacionescalificacionesmdf

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 31

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 28: Base de Datos

Para crear un diagrama hacemos clic en el explorador de objetos hacemos clic en el nombre de la base de datos y escogemos Database Diagrams hacemos clic derecho escogemos new Database Diagrams

Nos aparece el siguiente mensaje realizamos un clic dentro del botoacuten Yes

Volvemos hacer clic derechos y volvemos a escoger New Data Base Diagram

Aparece la siguiente ventana en pantalla

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 28

Seleccionamos todas y escogemos AddNos aparece la siguiente ventana

En el caso de tener una relacioacuten muchos a muchos debemos romper la relacioacuten con una tercera tabla para esto desde el mismo Database Diagram hacemos clic derecho en un lugar en blanco y escogemos new table llenos las columnas con los campos y tipos de datos respectivosDebemos tomar en cuenta que en las tablas a donde va la relacioacuten tiene que tener su respectiva llave foraacutenea y para poder establecer la relacioacuten

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 29

arrastramos desde el campo principal hacia la llave foraacutenea es decir de la tabla padre a la hijaQuedando las relaciones asiacute

Finalmente cerramos la base de datos nos aparece la siguiente ventana

pidiendo guardar el Database Diagram le demos un nombre y realizamos clic

en el botoacuten OK

252 Ejercicios

Los diagramas del ejercicio 1 y 2 del capiacutetulo anterior pasar al modelo

relacional en SQLSERVER 2008

Los ejercicios 5 y 6 los ejercicios de la prueba pasarlos a sql server

Transformar el siguiente modelo entidad relacioacuten al modelo relacional

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 30

CAPIacuteTULO III

Aplicar las diferentes sentencias y modos en lenguaje SQL

para tratamiento de la informacioacuten almacenada en las

diferentes tablas de la base de datos

31 Lenguaje de definicioacuten de datosLas sentencias DDL son CREATE ALTER y DROP Siempre se usan estas

sentencias junto con el tipo de objeto y el nombre del objeto

CREATE

Crea una base de datos o un objeto

Sintaxis

Create database nombre on grupo_base de datos filegroup

Ejemplo

USE mastergoIF DB_ID (Ncalificaciones) IS NULL BEGIN create database calificaciones on primary( name = calificaciones filename = Ccalificacionescalificacionesmdf

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 31

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 29: Base de Datos

Seleccionamos todas y escogemos AddNos aparece la siguiente ventana

En el caso de tener una relacioacuten muchos a muchos debemos romper la relacioacuten con una tercera tabla para esto desde el mismo Database Diagram hacemos clic derecho en un lugar en blanco y escogemos new table llenos las columnas con los campos y tipos de datos respectivosDebemos tomar en cuenta que en las tablas a donde va la relacioacuten tiene que tener su respectiva llave foraacutenea y para poder establecer la relacioacuten

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 29

arrastramos desde el campo principal hacia la llave foraacutenea es decir de la tabla padre a la hijaQuedando las relaciones asiacute

Finalmente cerramos la base de datos nos aparece la siguiente ventana

pidiendo guardar el Database Diagram le demos un nombre y realizamos clic

en el botoacuten OK

252 Ejercicios

Los diagramas del ejercicio 1 y 2 del capiacutetulo anterior pasar al modelo

relacional en SQLSERVER 2008

Los ejercicios 5 y 6 los ejercicios de la prueba pasarlos a sql server

Transformar el siguiente modelo entidad relacioacuten al modelo relacional

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 30

CAPIacuteTULO III

Aplicar las diferentes sentencias y modos en lenguaje SQL

para tratamiento de la informacioacuten almacenada en las

diferentes tablas de la base de datos

31 Lenguaje de definicioacuten de datosLas sentencias DDL son CREATE ALTER y DROP Siempre se usan estas

sentencias junto con el tipo de objeto y el nombre del objeto

CREATE

Crea una base de datos o un objeto

Sintaxis

Create database nombre on grupo_base de datos filegroup

Ejemplo

USE mastergoIF DB_ID (Ncalificaciones) IS NULL BEGIN create database calificaciones on primary( name = calificaciones filename = Ccalificacionescalificacionesmdf

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 31

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 30: Base de Datos

arrastramos desde el campo principal hacia la llave foraacutenea es decir de la tabla padre a la hijaQuedando las relaciones asiacute

Finalmente cerramos la base de datos nos aparece la siguiente ventana

pidiendo guardar el Database Diagram le demos un nombre y realizamos clic

en el botoacuten OK

252 Ejercicios

Los diagramas del ejercicio 1 y 2 del capiacutetulo anterior pasar al modelo

relacional en SQLSERVER 2008

Los ejercicios 5 y 6 los ejercicios de la prueba pasarlos a sql server

Transformar el siguiente modelo entidad relacioacuten al modelo relacional

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 30

CAPIacuteTULO III

Aplicar las diferentes sentencias y modos en lenguaje SQL

para tratamiento de la informacioacuten almacenada en las

diferentes tablas de la base de datos

31 Lenguaje de definicioacuten de datosLas sentencias DDL son CREATE ALTER y DROP Siempre se usan estas

sentencias junto con el tipo de objeto y el nombre del objeto

CREATE

Crea una base de datos o un objeto

Sintaxis

Create database nombre on grupo_base de datos filegroup

Ejemplo

USE mastergoIF DB_ID (Ncalificaciones) IS NULL BEGIN create database calificaciones on primary( name = calificaciones filename = Ccalificacionescalificacionesmdf

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 31

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 31: Base de Datos

CAPIacuteTULO III

Aplicar las diferentes sentencias y modos en lenguaje SQL

para tratamiento de la informacioacuten almacenada en las

diferentes tablas de la base de datos

31 Lenguaje de definicioacuten de datosLas sentencias DDL son CREATE ALTER y DROP Siempre se usan estas

sentencias junto con el tipo de objeto y el nombre del objeto

CREATE

Crea una base de datos o un objeto

Sintaxis

Create database nombre on grupo_base de datos filegroup

Ejemplo

USE mastergoIF DB_ID (Ncalificaciones) IS NULL BEGIN create database calificaciones on primary( name = calificaciones filename = Ccalificacionescalificacionesmdf

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 31

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 32: Base de Datos

size = 3 Mb maxsize = unlimited )

log on ( name = calificacione_log filename = cCalificacionescalificacionesldf size = 1 Mb maxsize = unlimited ) ENDElseBegin print La base ya existeEndGo

Uso de create para crear una tabla

Sintaxis

CREATE TABLE table_name ( lt column_definition gt | lt table_constraint gt [ n ] ) Ejemplos

Use calificacionesgoCreate table alumno

( codalumno char(3) NOT NULL PRIMARY KEY cedula varchar(11) NOT NULL UNIQUE nombre varchar(30) NULL apellido varchar (30) NULL )Go

UseALTERModifica la estructura de una base de datos o de un objetoSintaxisAlter Objeto Modify propiedaduse mastergoALTER DATABASE notas SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE notas MODIFY NAME = calificacionesGOALTER DATABASE calificaciones

SET MULTI_USERGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 32

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 33: Base de Datos

use calificacionesAlter table alumno add direccion varchar(30)go use calificacionesgoalter table alumno alter column nombre varchar(40)go

DROPElimina una base de datos o un objetoLos permisos necesarios para ejecutar estas sentencias sonPertenecer al roles sysadmin o dbcreator y db_owner o a db_ddladminRoles de Servidor Descripcioacuten

Sysadmin Puede realizar cualquier actividad en SQL

Server

Dbcreator Puede crear modificar y borrar una base de

datos

Rol de base de datos Descripcioacuten

db_owner Tiene todos los permisos en la base de datos

db_ddladmin Puede usar todas las sentencias DDL pero no

usar GRANT REVOKE o DENY

Es recomendable no utilizar diferentes cuentas para ejecutar sentencias DDL ya que el performance de SQL Server se ve degradado por eso es mucho mejor si todos los objetos tienen el mismo owner si en cambio se tienen objetos con diferentes owners como por ejemplo el de una vista y una tabla SQL Server debe de validar los permisos para ambos antes de que el usuario pueda acceder a la vista32 Lenguaje de control de datosDespueacutes de utilizar las sentencias DDL para crear objetos la siguiente tarea es asegurarlos Las sentencias DCL asignan permisos a usuarios en especiacutefico o a roles de bases de datos

GRANTAsigna permisos a usuarios o roles para poder acceder a una base de datos o ejecutar sentencias SQLDENYEvita que un usuario o role ingrese a una base de datos o alguno de sus objetos o de ejecutar una o varias sentencias SQLREVOKE

33 Lenguaje de manipulacioacuten de datosAhora que hemos creado objetos mediante sentecias DDL y asignado permisos sobre estos objetos con sentencias DCL ahora vamos a ver como trabajar con estos objetos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 33

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 34: Base de Datos

SELECTDespliega informacioacuten de una o varias tablasUPDATEModificar uno o maacutes registros de una tablaDELETEEliminar uno o maacutes registros de una tablaPor default solo los miembros de sysadmin o dbcreator db_owner db_datawriter o db_datareader pueden ejecutar sentencias DML pero como se vio con las sentencias DCL estos permisos puede ser otorgados a usuarios en especiacutefico

INSERT INTO Me permite ingresar datos en una tabla

UNION Para unir tablas34 Caracteriacutesticas de la programacioacuten

Estructuras de control en Transact SQLEstructura condicional IFLa estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO) y ejecutar las operaciones contenidas en el bloque formado por BEGIN END

IF (ltexpresiongt) BEGIN

END

ELSE IF (ltexpresiongt) BEGIN

ENDELSE

BEGIN

END

Ejemplo de la estructura condicional IF

DECLARE Web varchar(100) diminutivo varchar(3)

SET diminutivo = DJK

IF diminutivo = DJK

BEGIN PRINT wwwdevjokercom

END ELSE

BEGIN PRINT Otra Web (peor)

END

La estructura IF admite el uso de subconsultas

DECLARE coPais intdescripcion varchar(255)set coPais = 5

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 34

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 35: Base de Datos

set descripcion = EspantildeaIF

EXISTS(SELECT FROM PAISES WHERE CO_PAIS = coPais)

BEGINUPDATE PAISES

SET DESCRIPCION = descripcionWHERE CO_PAIS = coPais

ENDELSE

BEGININSERT INTO PAISES

(CO_PAIS DESCRIPCION) VALUES(coPais descripcion)

END

Estructura condicional CASELa estructura condicional CASE permite evaluar una expresion y devolver un valor u otroLa sintaxis general de case es

CASE ltexpresiongt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltvalor_expresiongt THEN ltvalor_devueltogt ELSE ltvalor_devueltogt -- Valor por defecto

END

Ejemplo de CASE DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE diminutivo WHEN DJK THEN wwwdevjokercom WHEN ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones

CASE WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt WHEN ltexpresiongt = ltvalor_expresiongt THEN ltvalor_devueltogt

ELSE ltvalor_devueltogt -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN wwwdevjokercom WHEN diminutivo = ALM THEN wwwaleamediacom

ELSE wwwdevjokercom END)

PRINT Web

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 35

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 36: Base de Datos

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas DECLARE Web varchar(100)

diminutivo varchar(3) SET diminutivo = DJK

SET Web = (CASE

WHEN diminutivo = DJK THEN (SELECT web FROM WEBS WHERE id=1) WHEN diminutivo = ALM THEN (SELECT web FROM WEBS WHERE id=2)

ELSE wwwdevjokercom END)

PRINT Web

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdaderoEs el uacutenico tipo de bucle del que dispone Transact SQL

WHILE ltexpresiongt BEGIN END

Un ejemplo del bucle WHILE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1

PRINT Iteracion del bucle + cast(contador AS varchar) END

Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE

DECLARE contador int SET contador = 0

WHILE (contador lt 100) BEGIN

SET contador = contador + 1IF (contador 2 = 0)

CONTINUE PRINT Iteracion del bucle + cast(contador AS varchar)

END

El bucle se dejaraacute de repetir con la instruccioacuten BREAK

DECLARE contador int SET contador = 0 WHILE (1 = 1)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 36

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 37: Base de Datos

BEGIN SET contador = contador + 1

IF (contador 50 = 0) BREAK

PRINT Iteracion del bucle + cast(contador AS varchar) END

Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas

DECLARE coRecibo int WHILE EXISTS (SELECT FROM RECIBOS

WHERE PENDIENTE = S)-- Ojo la subconsulta se ejecuta -- una vez por cada iteracion

-- del bucle BEGIN

SET coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = S)

UPDATE RECIBOS SET PENDIENTE = N

WHERE CO_RECIBO = coRecibo END

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de erroresActualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores

DECLARE divisor int dividendo int resultado int SET dividendo = 100 SET divisor = 0

SET resultado = dividendodivisor

IF ERROR gt 0 GOTO error

PRINT No hay error

RETURNerror

PRINT Se ha producido una division por cero

35 Funciones351 Sum La funcioacuten sum() retorna la suma de los valores que contiene el

campo especificado Si queremos saber la cantidad total de libros que tenemos

disponibles para la venta debemos sumar todos los valores del campo

cantidad

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 37

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 38: Base de Datos

Sintaxis

Sum (valores a sumar)

Ejemplo

select sum(cantidad) from libros

352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se

puede usar la opcioacuten DISTINCT para solamente contar los valores distintos

Count (Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT101) WITH NOWAITSELECT COUNT(PRICE) as CuentaFROM T1 RAISERROR(Contar los valores Distinto con COUNT101) WITH NOWAITSELECT COUNT(DISTINCT PRICE) as Cuenta_DistintaFROM T1

353 COUNTBIG

Igual que COUNT pero regresa un BIGINT

Sintaxis

CountBig( Valores a contar)

Ejemplo

RAISERROR(Contar los valores con COUNT_BIG Regrasa un BIGINT101) WITH NOWAITSELECT COUNT_BIG(PRICE) as Cuenta_BIGINTFROM T1354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintosSintaxisAVG(Valores)

Ejemplo

RAISERROR(El promedio101) WITH NOWAITSELECT AVG(PRICE) as PromedioFROM T1 RAISERROR(El promedio por categoria101) WITH NOWAITSELECT CATEGORY

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 38

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 39: Base de Datos

AVG(DISTINCT PRICE) as Promedio_por_CategoriaFROM T1GROUP BY CATEGORY

354 Min

Regresa el valor miacutenimo de todos los valores del SELECT

Sintaxis

Min (Valores)

Ejemplo

RAISERROR(El valor minimo en la tabla101) WITH NOWAITSELECT MIN(PRICE) as MinimoFROM T1

355 MAX

Regresa el Valor maacuteximo de todos los valores del SELECT

Ejemplo

RAISERROR(El valor Maximo en la tabla101) WITH NOWAITSELECT MAX(PRICE) as MaximoFROM T1

356 STDEV

Regresa la desviacioacuten estaacutendar de una muestra de todos los valores del SELECT

Sintaxis

Stdev(valores)

Ejemplo

RAISERROR(Calcular la desviacioacuten estandar de los valores en la tabla101) WITH NOWAITSELECT STDEV(PRICE) as DesviacioacutenEstandarFROM T1

357 STDEVP

Regresa la desviacioacuten estaacutendar de todos los valores del SELECT

Sintaxis

Stdevp(valores)

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 39

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 40: Base de Datos

RAISERROR(Calcular la desviacioacuten estandar P de los valores en la tabla101) WITH NOWAITSELECT STDEVP(PRICE) as DesviacioacutenEstandarPFROM T1

357 VAR

Regresa la variacioacuten de una muestra de todos los valores del SELECT

Sintaxis

Var(valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten de los valores en la tabla101) WITH NOWAITSELECT VAR(PRICE) as VariacioacutenFROM T1

358 VARP

Regresa la variacioacuten de todos los valores del SELECT

Sintaxis

Varp (Valores)

Ejemplo

RAISERROR(Calcular la Variacioacuten P de los valores en la tabla101) WITH NOWAITSELECT VARP(PRICE) as VariacioacutenPFROM T1

359 GROUPINGUsado con el GROUP BY y ROLLUP se puede ver el nivel de los resultadosEjemploRAISERROR(Usar GROUPING para agrupar categoriacuteas 101) WITH NOWAITRAISERROR(El ROLLUP nos da el Total de todos los valores101) WITH NOWAITSELECT SUM(PRICE) as PRECIO GROUPING(Category) as CategoriacuteaFROM T1GROUP BY CATEGORYWITH ROLLUP

3510 CHECKSUM AGGRegresa la suma de verificacioacuten de todos los valores del SELECTEjemploRAISERROR(El todos los valores en la tabla101) WITH NOWAITSELECT CHECKSUM_AGG(cast(PRICE as int)) as CHECKSUMAGGFROM T1

3511 FUNCIONES DE CADENA

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 40

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 41: Base de Datos

ASCII (Transact-SQL)

Devuelve el valor de coacutedigo ASCII del caraacutecter situado maacutes a la izquierda de una expresioacuten de caracteres

SintaxisASCII ( character_expression )EjemploSET TEXTSIZE 0SET NOCOUNT ON-- Create the variables for the current character string position -- and for the character stringDECLARE position int string char(15)-- Initialize the variablesSET position = 1SET string = Du monde entierWHILE position lt= DATALENGTH(string) BEGIN SELECT ASCII(SUBSTRING(string position 1)) CHAR(ASCII(SUBSTRING(string position 1))) SET position = position + 1 ENDSET NOCOUNT OFFGO

LEFT (Transact-SQL)

Devuelve la parte izquierda de una cadena de caracteres con el nuacutemero de caracteres especificado SintaxisLEFT ( character_expression integer_expression )Ejemplos

USE AdventureWorks2012GOSELECT LEFT(Name 5) FROM ProductionProductORDER BY ProductIDGO

LEN (Transact-SQL)

Devuelve el nuacutemero de caracteres de la expresioacuten de cadena especificada excluidos los espacios en blanco finales

SintaxisLEN ( string_expression )

Ejemplo

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 41

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 42: Base de Datos

GOSELECT LEN(FirstName) AS Length FirstName LastName FROM SalesvIndividualCustomerWHERE CountryRegionName = AustraliaGO

LOWER (Transact-SQL)

Devuelve una expresioacuten de caracteres despueacutes de convertir en minuacutesculas los datos de caracteres en mayuacutesculas

SintaxixLOWER ( character_expression )

UPPER (Transact-SQL)

Devuelve una expresioacuten de caracteres con datos de caracteres en minuacutesculas convertidos a mayuacutesculas

SintaxisUPPER ( character_expression )Ejemplos de UPPER y LOWER

USE AdventureWorks2012GOSELECT UPPER(RTRIM(LastName)) + + FirstName AS NameFROM PersonPersonORDER BY LastNameGO

LTRIM (Transact-SQL)

Devuelve una expresioacuten de caracteres tras quitar todos los espacios iniciales en blanco

SintaxisLTRIM ( character_expression )EjemplosDECLARE string_to_trim varchar(60)SET string_to_trim = Five spaces are at the beginning of this stringSELECT Here is the string without the leading spaces + LTRIM(string_to_trim)GO

RTRIM (Transact-SQL)

Devuelve una cadena de caracteres despueacutes de truncar todos los espacios en blanco finales

Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 42

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 43: Base de Datos

RTRIM ( character_expression )

Ejemplos

DECLARE string_to_trim varchar(60)SET string_to_trim = Four spaces are after the period in this sentence SELECT string_to_trim + Next stringSELECT RTRIM(string_to_trim) + Next stringGO

SUBSTRING (Transact-SQL)

Devuelve parte de una expresioacuten de caracteres binaria de texto

SUBSTRING ( expression start length )EjemplosUSE AdventureWorks2012GOSELECT LastName SUBSTRING(FirstName 1 1) AS InitialFROM PersonPersonWHERE LastName like BarlORDER BY LastName

3512 FUNCIONES DE FECHA Y HORA

Funciones de fecha y hora del sistema

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

SYSDATETIME SYSDATETIME () Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que se estaacute

ejecutando la

instancia de SQL

ServerEl ajuste de

zona horaria no estaacute

incluido

datetime2(7) No

determinist

a

SYSDATETIMEOFFSE

T

SYSDATETIMEOFFSET ( ) Devuelve un valor

datetimeoffset(7)

que contiene la fecha

y hora del equipo en

el que la instancia de

SQL Server se estaacute

ejecutandoEl ajuste

de zona horaria estaacute

datetimeoffset

(7)

No

determinist

a

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 43

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 44: Base de Datos

incluido

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor

datetime2(7) que

contiene la fecha y

hora del equipo en el

que la instancia de

SQL Server se estaacute

ejecutandoLa fecha

y hora se devuelven

como hora universal

coordinada (UTC)

datetime2(7) No

determinist

a

Funciones de fecha y hora del sistema de precisioacuten baja

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

CURRENT_TIMESTAM

P

CURRENT_TIMESTAM

P

Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoEl ajuste de zona horaria no

estaacute incluido

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7) que

contiene la fecha y hora del equipo en el

que la instancia de SQL Server se estaacute

ejecutandoLa fecha y hora se devuelven

como una hora universal coordinada

(UTC)

datetime No

determinista

Funciones que obtienen partes de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminism

o

DATENAM

E

DATENAME ( datepart date ) Devuelve una cadena de caracteres que

representa el datepart especificado de la

fecha especificada

nvarchar No

determinista

DATEPART DATEPART ( datepart date ) Devuelve un entero que representa el

datepart especificado del date

int No

determinista

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 44

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 45: Base de Datos

especificado

DAY DAY ( date ) Devuelve un entero que representa la

parte del diacutea de date especificado

int Determinista

MONTH MONTH ( date ) Devuelve un entero que representa la

parte del mes de un date especificado

int Determinista

YEAR YEAR ( date ) Devuelve un entero que representa la

parte del antildeo de un date especificado

int Determiniacutestico

Funciones que obtienen valores de fecha y hora de sus partes

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEFROMPARTS DATEFROMPARTS ( year

month day )

Devuelve un valor

de tipo date para

el antildeo mes y diacutea

especificados

date Determiniacutestico

DATETIME2FROMPART

S

DATETIME2FROMPARTS (

year month day hour minute

seconds fractions precision )

Devuelve un valor

datetime2 para la

fecha y la hora

especificadas y

con la precisioacuten

indicada

datetime

2(precision)

Determiniacutestico

DATETIMEFROMPARTS DATETIMEFROMPARTS ( year

month day hour minute seconds

milliseconds )

Devuelve un valor

datetime para la

fecha y la hora

especificadas

datetime Determiniacutestico

DATETIMEOFFSETFRO

MPARTS

DATETIMEOFFSETFROMPART

S ( year month day hour minute

seconds fractions hour_offset

minute_offset precision )

Devuelve un valor

datetimeoffset

para la fecha y la

hora

especificadas y

con los

desplazamientos y

la precisioacuten

indicados

datetime(precision) Determiniacutestico

SMALLDATETIMEFROM

PARTS

SMALLDATETIMEFROMPART

S ( year month day hour minute )

Devuelve un valor

smalldatetime

para la fecha y la

hora

especificadas

smalldatetime Determiniacutestico

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 45

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 46: Base de Datos

TIMEFROMPARTS TIMEFROMPARTS ( hour

minute seconds fractions

precision )

Devuelve un valor

time para la hora

especificada y con

la precisioacuten

indicada

time(precision) Determiniacutestico

Funciones que obtienen diferencias de fecha y hora

Funcioacuten Sintaxis Valor devuelto Tipo de datos devuelto

Determinismo

DATEDIF

F

DATEDIFF ( datepart

startdate enddate )

Devuelve el nuacutemero de liacutemites

datepart de fecha y hora entre dos

fechas especificadas

int Determinista

Funciones que modifican valores de fecha y horaFuncioacuten Sintaxis Valor devuelto Tipo de datos

devueltoDeterminismo

DATEADD DATEADD (datepart

number date )

Devuelve un nuevo valor

datetime agregando un

intervalo al datepart

especificado del date

indicado

El tipo de datos del

argumento date

Determiniacutestico

EOMONTH EOMONTH ( start_date

[ month_to_add ] )

Devuelve el uacuteltimo diacutea

del mes que contiene la

fecha especificada con

un desplazamiento

opcional

El tipo de valor

devuelto es start_date

o datetime2(7)

Determiniacutestico

SWITCHOFFSET SWITCHOFFSET

(DATETIMEOFFSET

time_zone)

SWITCH OFFSET

cambia el ajuste de zona

horaria de un valor

DATETIMEOFFSET y

conserva el valor UTC

datetimeoffset con la

precisioacuten fraccionaria

de

DATETIMEOFFSET

Determinista

TODATETIMEOFFSET TODATETIMEOFFSET

(expression time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un valor

datetimeoffsetEl valor

datetime2 se interpreta en

la hora local para el valor

time_zone especificado

datetimeoffset con la

precisioacuten fraccionaria

del argumento

datetime

Determinista

3513 Funciones de conversion de unidades

CAST y CONVERT (Transact-SQL)Convierte una expresioacuten de un tipo de datos en otro en SQL Server 2012Sintaxis

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 46

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 47: Base de Datos

CAST ( expression AS data_type [ ( length ) ] )SintaxisCONVERT ( data_type [ ( length ) ] expression [ style ] )

Estilos de fecha y hora

Cuando expression es un tipo de datos de fecha u hora style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0SQL Server admite el formato de fecha en estilo aacuterabe mediante el algoritmo kuwaitiacute

Sin el siglo (aa) (1) Con el siglo (aaaa) Estaacutendar Entradasalida (3)

- 0 oacute 100 (12) Predeterminado mes dd aaaa hhmiAM (o PM)

1 101 EE UU mmddaaaa

2 102 ANSI aammdd

3 103 BritaacutenicoFranceacutes ddmmaaaa

4 104 Alemaacuten ddmmaa

5 105 Italiano dd-mm-aa

6 106(1) - dd mes aa

7 107(1) - Mes dd aa

8 108 - hhmiss

- 9 oacute 109 (12) Valor predeterminado + mes dd aaaa hhmissmmmam (o p

10 110 EE UU mm-dd-aa

11 111 JAPOacuteN aammdd

12 112 ISO Aammddaaaammdd

- 13 oacute 113 (12) Europeo predeterminado + dd mes aaaa hhmissmmm(24h)

14 114 - hhmissmmm(24h)

- 20 oacute 120 (2) ODBC canoacutenico aaaa-mm-dd hhmiss(24h)

- 21 oacute 121 (2) ODBC canoacutenico (con aaaa-mm-dd hhmissmmm(24h)

- 126 (4) ISO8601 aaaa-mm-ddThhmissmmm (sin

- 127(6 7) ISO8601 con zona horaria Z aaaa-mm-ddThhmissmmmZ(sin espacios)

- 130 (12) Hijri (5) dd mes aaaa hhmissmmmam

- 131 (2) Hijri (5) ddmmaa hhmissmmmam

Estos valores de estilo devuelven resultados no deterministasIncluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo)

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 47

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 48: Base de Datos

Los valores predeterminados (style0 o 100 9 o 109 13 o 113 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa)

Entrada cuando se convierte en datetime salida cuando se convierte en datos de caracteres

Disentildeado para usarse con XMLPara convertir datos datetime o smalldatetime en datos de caracteres el formato de salida es el descrito en la tabla anterior

Solo se admite en la conversioacuten de datos de caracteres a datetime o smalldatetimeCuando se convierten datos de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o smalldatetime el componente de hora no especificado se establece en 000000000 y el componente de fecha no especificado se establece en 1900-01-01

El indicador opcional de zona horaria Z se usa para facilitar la asignacioacuten de valores XML de tipo datetime que contienen informacioacuten de zona horaria a valores de tipo datetime de SQL Server que no tienen zona horariaZ es el indicador para la zona horaria UTC-0Las otras zonas horarias se indican con un desplazamiento de HHMM en sentido + o -Por ejemplo 2006-12-12T234512-0800

Cuando se convierten datos de caracteres de tipo smalldatetime los estilos que incluyen segundos o milisegundos muestran ceros en dichas posicionesPuede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varcharCuando se convierte en datetimeoffset a partir de datos de caracteres con un estilo que incluye una hora se anexa un ajuste de zona horaria al resultado

Estilos float y realCuando expression es float o real style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Un maacuteximo de 6 diacutegitosUtiliacutecelo en notacioacuten cientiacutefica

cuando proceda

1 Siempre 8 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

2 Siempre 16 diacutegitosUtiliacutecelo siempre en notacioacuten cientiacutefica

126 128 129 Se incluye por razones heredadas y podriacutea quedar desusado en

una versioacuten futura

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 48

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 49: Base de Datos

Estilos money y smallmoneyCuando expression es money o smallmoneystyle puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0

Valor Resultado

0 (valor

predeterminado)

Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 423598

1 Separadores de millar cada tres diacutegitos a la izquierda del separador decimal y dos

diacutegitos a la derecha del separador decimal por ejemplo 351092

2 Sin separadores de millar cada tres diacutegitos a la izquierda del separador decimal y

cuatro diacutegitos a la derecha del separador decimal por ejemplo 42359819

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xmlCuando expression es xml style puede ser uno de los valores que se muestran en la tabla siguienteOtros valores se procesan como 0Valor Resultado

0 (valor

predeterminado)

Utiliza el comportamiento de anaacutelisis predeterminado que descarta los espacios en blanco

insignificantes y no permite un subconjunto DTD interno

1 Conserva los espacios en blanco insignificantesEsta configuracioacuten establece el control

xmlspace predeterminado de modo que se comporte igual que si se hubiera especificado

xmlspace=preserve

2 Habilita el procesamiento limitado de subconjuntos DTD internos

Si estaacute habilitado el servidor puede utilizar la siguiente informacioacuten proporcionada en un

subconjunto DTD interno para realizar operaciones de anaacutelisis que no se validan

Se aplican los valores predeterminados de los atributos

Las referencias a entidades internas se resuelven y se ampliacutean

Se comprobaraacute la correccioacuten sintaacutectica del modelo de contenido DTD

El analizador pasaraacute por alto los subconjuntos DTD externosTampoco evaluacutea la declaracioacuten

XML para ver si el atributo standalone estaacute establecido en yes o no pero analiza la instancia

XML como si se tratase de un documento independiente

3 Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los

subconjuntos DTD internos

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 49

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 50: Base de Datos

Estilos binariosCuando expression es binary(n) varbinary(n) char(n) o varchar(n) style puede ser uno de los valores que se muestran en la tabla siguienteLos valores de estilos que no se enumeran en la tabla devuelven un error

Valor Salida

0

(predeterminado)

Traduce caracteres ASCII a bytes binarios o bytes binarios a caracteres ASCIICada

caraacutecter o byte se convierte con una proporcioacuten 11

Si data_type es un tipo binario los caracteres 0x se agregan a la izquierda del

resultado

1 2 Si data_type es un tipo binario la expresioacuten debe ser de caracteresexpression se

debe componer de un nuacutemero par de diacutegitos hexadecimales (0 1 2 3 4 5 6 7 8 9

A B C D E F a b c d e f)Si style se establece en 1 los caracteres 0x deben ser

los dos primeros caracteres de la expresioacutenSi la expresioacuten contiene un nuacutemero

impar de caracteres o si alguno de los caracteres no es vaacutelido se produce un error

Si la longitud de la expresioacuten convertida es mayor que la longitud de data_type el

resultado se truncaraacute a la derecha

Los data_types de longitud fija que sean mayores que el resultado convertido

tendraacuten ceros agregados a la derecha del resultado

Si data_type es un tipo de caracteres la expresioacuten debe ser binariaCada caraacutecter

binario se convierte en dos caracteres hexadecimalesSi la longitud de la expresioacuten

convertida es mayor que la longitud de data_type se truncaraacute a la derecha

Si data_type es un tipo de caracteres de tamantildeo fijo y la longitud del resultado

convertido es menor que la longitud de data_type los espacios se agregan a la

derecha de la expresioacuten convertida para mantener un nuacutemero par de diacutegitos

hexadecimales

Los caracteres 0x se agregaraacuten a la izquierda del resultado convertido para style 1

Conversiones impliacutecitas

Las conversiones impliacutecitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERTLas conversiones expliacutecitas son aquellas conversiones que requieren la especificacioacuten de las funciones CAST o CONVERTEn la siguiente ilustracioacuten se muestran todas las conversiones de tipos de datos expliacutecitas e impliacutecitas permitidas para los tipos de datos proporcionados por el sistema de SQL ServerIncluyen xml bigint y

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 50

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 51: Base de Datos

sql_variantNo existe una conversioacuten impliacutecita en la asignacioacuten del tipo de datos sql_variant pero siacute hay una conversioacuten impliacutecita en sql_variant

Al convertir entre datetimeoffset y los tipos de caracteres char varchar nchar y nvarchar la parte del ajuste de zona horaria convertida siempre debe tener diacutegitos dobles para HH y MM por ejemplo -0800

Tipos de datos de valor grandeLos tipos de datos de valor grande tienen el mismo comportamiento de conversioacuten impliacutecito y expliacutecito que sus equivalentes maacutes pequentildeos especialmente los tipos de datos varchar nvarchar y varbinaryNo obstante se deben tener en cuenta las siguientes directrices

La conversioacuten de datos image en varbinary(max) y viceversa es una conversioacuten impliacutecita al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max)

La conversioacuten de tipos de datos de valor grande como varchar(max) en un tipo de datos equivalente maacutes pequentildeo como varchar es una conversioacuten impliacutecita aunque se produciraacute truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos maacutes pequentildeo

La conversioacuten de varchar nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma impliacutecita

La conversioacuten del tipo de datos sql_variant en los tipos de datos de valor grande es una conversioacuten expliacutecita

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant

xml Data Type

Cuando se convierte de forma expliacutecita o impliacutecita el tipo de datos xml en un tipo de datos de cadena o binario el contenido del tipo de datos xml se serializa en funcioacuten de un conjunto de reglasPara obtener informacioacuten sobre estas reglas vea Definir la serializacioacuten de datos XMLPara obtener informacioacuten sobre la conversioacuten de otros tipos de datos al tipo de datos xml vea Crear instancias de datos XML

Tipos de datos text e image

No se admite la conversioacuten automaacutetica de los tipos de datos text e imagePuede convertir expliacutecitamente datos text en datos de caracteres y datos image en binary o varbinary pero la longitud maacutexima es de 8000 bytesSi intenta una conversioacuten incorrecta como la de una expresioacuten de caracteres que incluye letras en un tipo int SQL Server devuelve un mensaje de error

Intercalacioacuten de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra la salida tiene la misma intercalacioacuten y etiqueta de intercalacioacuten que la entradaSi la entrada no es una cadena de caracteres la

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 51

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 52: Base de Datos

salida tiene la intercalacioacuten predeterminada de la base de datos y una etiqueta de intercalacioacuten coaccionable-predeterminadaPara obtener maacutes informacioacuten

Para asignar otra intercalacioacuten a la salida aplique la claacuteusula COLLATE a la expresioacuten de resultado de las funciones CAST o CONVERTPor ejemploSELECT CAST(abc AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultadosAl convertir expresiones de caracteres o binarias (char nchar nvarchar varchar binary o varbinary) en una expresioacuten de un tipo de datos diferente los datos se pueden truncar se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostradoLas conversiones en char varchar nchar nvarchar binary y varbinary se truncan excepto aquellas que se muestran en la siguiente tablaDe tipo de datos En tipo de datos Resultado

int smallint o tinyint char

varchar

nchar E

nvarchar E

money smallmoney numeric decimal float o real char E

varchar E

nchar E

nvarchar E

= Resultado demasiado corto para ser mostradoE = Error devuelto porque el resultado es demasiado corto para ser mostrado

SQL Server garantiza que solo las conversiones circulares las conversiones que convierten un tipo de datos en otro y despueacutes vuelven a convertirlo en el tipo de datos original devolveraacuten los mismos valores en versiones diferentesEn el siguiente ejemplo se muestra una conversioacuten circular

DECLARE myval decimal (5 2)SET myval = 19357SELECT CAST(CAST(myval AS varbinary(20)) AS decimal(105))-- Or using CONVERTSELECT CONVERT(decimal(105) CONVERT(varbinary(20) myval))

En el siguiente ejemplo se muestra una expresioacuten resultante demasiado corta para ser mostrada

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 52

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 53: Base de Datos

USE AdventureWorks2012GOSELECT pFirstName pLastName SUBSTRING(pTitle 1 25) AS Title CAST(eSickLeaveHours AS char(1)) AS [Sick Leave]FROM HumanResourcesEmployee e JOIN PersonPerson p ON eBusinessEntityID = pBusinessEntityIDWHERE NOT eBusinessEntityID gt5

Al convertir tipos de datos que difieren en los decimales algunas veces el valor resultante se trunca y otras se redondeaEn la siguiente tabla se muestra el comportamiento

De En Comportamiento

numeric numeric Redondeo

numeric int Truncar

numeric money Redondear

money int Redondear

money numeric Redondeo

float int Truncamiento

float numeric Redondeo

La conversioacuten de los valores float que utilizan la notacioacuten cientiacutefica a decimal o numeric se

restringe uacutenicamente a los valores con una precisioacuten de 17 diacutegitosCualquier valor con una

precisioacuten mayor de 17 se redondea a cero

float datetim

e

Redondeo

datetim

e

int Redondeo

Por ejemplo el resultado de la siguiente conversioacuten es 10

SELECT CAST(106496 AS int)

Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen el valor se redondeaPor ejemplo el resultado de la siguiente conversioacuten es $103497

SELECT CAST(103496847 AS money)

SQL Server devuelve un mensaje de error cuando se convierten datos char nchar varchar o nvarchar no numeacutericos en los tipos de datos int float

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 53

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 54: Base de Datos

numeric o decimalSQL Server tambieacuten devuelve un error cuando se convierte una cadena vaciacutea ( ) en los tipos de datos numeric o decimal

Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores-- Use CASTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CAST(ListPrice AS int) LIKE 3GO

-- Use CONVERTUSE AdventureWorks2012GOSELECT SUBSTRING(Name 1 30) AS ProductName ListPriceFROM ProductionProductWHERE CONVERT(int ListPrice) LIKE 3GO

USE AdventureWorks2012GOSELECT CAST(ROUND(SalesYTDCommissionPCT 0) AS int) AS ComputedFROM SalesSalesPerson WHERE CommissionPCT = 0GO

En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012GOSELECT The list price is + CAST(ListPrice AS varchar(12)) AS ListPriceFROM ProductionProductWHERE ListPrice BETWEEN 35000 AND 40000GO

En el siguiente ejemplo se utiliza CAST en la lista de seleccioacuten para convertir la columna Name en una columna de tipo char(10)

USE AdventureWorks2012GOSELECT DISTINCT CAST(pName AS char(10)) AS Name sUnitPriceFROM SalesSalesOrderDetail AS s JOIN ProductionProduct AS p ON sProductID = pProductIDWHERE Name LIKE Long-Sleeve Logo Jersey MGO

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 54

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 55: Base de Datos

En el siguiente ejemplo se convierte la columna SalesYTD de tipo money en una de tipo int y a continuacioacuten en una de tipo char(20) para que se pueda utilizar con la claacuteusula LIKE

USE AdventureWorks2012GOSELECT pFirstName pLastName sSalesYTD sBusinessEntityIDFROM PersonPerson AS p JOIN SalesSalesPerson AS s ON pBusinessEntityID = sBusinessEntityIDWHERE CAST(CAST(sSalesYTD AS int) AS char(20)) LIKE 2GO

En el ejemplo siguiente se muestra la fecha y la hora actuales se utiliza CAST para cambiarlas a un tipo de datos de caraacutecter y a continuacioacuten se utiliza CONVERT para mostrar la fecha y la hora en el formato ISO 8901

SELECT GETDATE() AS UnconvertedDateTime CAST(GETDATE() AS nvarchar(30)) AS UsingCast CONVERT(nvarchar(30) GETDATE() 126) AS UsingConvertTo_ISO8601 GO

El siguiente ejemplo es lo opuesto aproximadamente del ejemplo anteriorEn el ejemplo se muestra la fecha y la hora como datos de caraacutecter se utiliza CAST para cambiar los datos de caraacutecter al tipo de datos datetime y a continuacioacuten se utiliza CONVERT para cambiar los datos de caraacutecter al tipo de datos datetime

SELECT 2006-04-25T155059997 AS UnconvertedText CAST(2006-04-25T155059997 AS datetime) AS UsingCast CONVERT(datetime 2006-04-25T155059997 126) AS UsingConvertFrom_ISO8601 GO

Ejercicios1- Utilizando Sql crearse una base de datos llamad producto dentro de esa

base crearse 3 tablas y relacionarlas como se muestra en la figura utilizando

Transact SQL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 55

ProductosProveedores Vende

Son vendidos

m n

m

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 56: Base de Datos

2- Utilizando sentencias SQL ingresar tres datos en cada una de las

tablas

3- Mostrar todos los datos de la tabla proveedores

4- Mostrar todos los datos de la tabla productos cuyo precio sea mayor

a 300

5- Mostrar todos los productos de nombre arroz trigo avena

6- Mostrar los productos agrupados por nombre cuyo promedio del

precio sea mayor a 24

7- Unir la tabla proveedores y clientes

8- Mostrar la tabla proveedores y clientes cuyos nombres sean iguales

9- Insertar un campo en la tabla proveedores

10- Borrar una fila de la tabla clientes

11- Actualizar una fila de la tabla clientes

12- Borrar la tabla proveedores

CAPIacuteTULO IV

Trabajar con los diferentes tipos de iacutendices conociendo las

ventajas y desventajas de su uso en funcioacuten del objetivo

buscado

41 Iacutendices

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 56

Clientes

n

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 57: Base de Datos

El iacutendice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones permitiendo un raacutepido acceso a los registros de una tabla en una base de datos Al aumentar draacutesticamente la velocidad de acceso se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes buacutesquedas

42 Mantenimiento de iacutendices

Una vez creados los iacutendices debe mantenerlos para asegurar que su rendimiento sea oacuteptimo Con el tiempo los datos se fragmentan La fragmentacioacuten de los datos debe administrarse en funcioacuten del entorno de la organizacioacuten

SQL Server proporciona el Asistente para optimizacioacuten de iacutendices que hace un seguimiento automaacutetico del uso de los iacutendices y ayuda a mantener y crear iacutendices con un rendimiento oacuteptimo

Tambieacuten puede utilizar diversas opciones y herramientas como ayuda para volver a generar los iacutendices y comprobar su optimizacioacuten

Coacutemo se produce la fragmentacioacuten La fragmentacioacuten se produce al modificar los datos Por ejemplo cuando se agregan o se eliminan filas de una tabla o cuando cambian los valores de las columnas indizadas SQL Server ajusta las paacuteginas de iacutendice para adaptarlas a los cambios y mantener el almacenamiento de los datos indizados Este ajuste de las paacuteginas de iacutendice se conoce como divisioacuten de paacuteginas El proceso de divisioacuten aumenta el tamantildeo de la tabla y el tiempo necesario para procesar las consultas

Meacutetodos para administrar la fragmentacioacuten En SQL Server hay dos meacutetodos para administrar la fragmentacioacuten El primero consiste en quitar y volver a crear un iacutendice agrupado y especificar un valor con la opcioacuten FILLFACTOR El segundo consiste en volver a generar un iacutendice y especificar un valor de FILLFACTOR

Los valores de FILLFACTOR estaacuten comprendidos entre el 1 y el 100 por cien

El valor de FILLFACTOR predeterminado es 0 Este valor llena las paacuteginas de iacutendice del nivel de hoja al 100 por cien y deja sitio para el tamantildeo maacuteximo de una entrada de iacutendice en las paacuteginas de iacutendice no situadas en el nivel de hoja No puede especificar expliacutecitamente un valor de FILLFACTOR = 0

El valor de FILLFACTOR predeterminado puede modificarse en el servidor mediante el procedimiento almacenado de sistema sp_configure

La tabla del sistema sysindexes almacena el valor de FILLFACTOR aplicado por uacuteltima vez y otra informacioacuten del iacutendice

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 57

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 58: Base de Datos

El valor de FILLFACTOR se especifica en porcentajes El porcentaje determina cuaacutento deben llenarse las paacuteginas del nivel de hoja Por ejemplo un valor de FILLFACTOR de 65 llena un 65 por ciento de cada paacutegina del nivel de hoja y deja libre un 35 por ciento del espacio de paacutegina para nuevas filas El tamantildeo de la fila influye en el nuacutemero de filas que caben en la paacutegina para el porcentaje de FILLFACTOR especificado

Utilice la opcioacuten FILLFACTOR en las tablas en las que se insertan muchas filas o cuando los valores de clave de un iacutendice agrupado se modifican con frecuencia

43 Iacutendices agrupados y no agrupadosIacutendices agrupadosUn INDICE AGRUPADO es similar a una guiacutea telefoacutenica los registros con el mismo valor de campo se agrupan juntos Un iacutendice agrupado determina la secuencia de almacenamiento de los registros en una tabla

Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un ordenUna tabla soacutelo puede tener UN iacutendice agrupadoEl tamantildeo medio de un iacutendice agrupado es aproximadamente el 5 del tamantildeo de la tablaPara crear un iacutendice agrupado utilizar la siguiente sintaxisCreate clustered index [nombre] on [tabla] ([campos])Iacutendices no agrupados

Un INDICE NO AGRUPADO es como el iacutendice de un libro los datos se almacenan en un lugar diferente al del iacutendice los punteros indican el lugar de almacenamiento de los elementos indizados en la tablaUn iacutendice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente con campos en los que los datos son uacutenicosUna tabla puede tener hasta 249 iacutendices no agrupados

Si no se especifica un tipo de iacutendice de modo predeterminado seraacute no agrupado

Los campos de tipo text ntext e image no se pueden indizar

Para crear un iacutendice no agrupado basta con omitir la palabra reservada clustered

44 Creacioacuten de iacutendices

La sintaxis para crear un iacutendice es la siguienteCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON ltobjectgt ( column_name [ ASC | DESC ] [ n ] )

[ WITH ltbackward_compatible_index_optiongt [ n ] ]

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 58

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 59: Base de Datos

[ ON filegroup_name | default ]

EjemploCREATE INDEX IX_ProductVendor_VendorID ON PurchasingProductVendor (BusinessEntityID)

45 Vistas

Una vista es una alternativa para mostrar datos de varias tablas Una vista es como una tabla virtual que almacena una consulta Los datos accesibles a traveacutes de la vista no estaacuten almacenados en la base de datos como un objeto

Entonces una vista almacena una consulta como un objeto para utilizarse posteriormente Las tablas consultadas en una vista se llaman tablas base En general se puede dar un nombre a cualquier consulta y almacenarla como una vista

46 Creacioacuten de vistas

Para crear una vista se utiliza la siguiente sintaxis

create view [nombre] as hellip

Ejemplo

Create view provclie

As select clientenombre proveedornombre

from proveedor cliente

Ejercicios

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 59

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 60: Base de Datos

Utilizando sentencias sql crear la base de datos correspondiente al

diagrama de la figura

Crear un iacutendice agrupado para cada tabla

Crear un iacutendice no agrupado para cada tabla

Crer una vista que incluya el nombre la direccioacuten y el teleacutefono del profesor

Crear una vista que contenga los datos de la tabla departamento y curso

CAPIacuteTULO V

Realizar tareas de administracioacuten de bases de datos mediante

el uso de triggers

51TriggersUn trigger (o disparador) en una Base de datos es un procedimiento que se ejecuta cuando se cumple una condicioacuten establecida al realizar una operacioacuten Dependiendo de la base de datos los triggers pueden ser de insercioacuten (INSERT) actualizacioacuten (UPDATE) o borrado (DELETE)

52 Creacioacuten de triggersLa sintaxis para crear un trigger es la siguienteCREATE TRIGGER [ schema_name ]trigger_name

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 60

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 61: Base de Datos

ON table | view [ WITH ltdml_trigger_optiongt [ n ] ] FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] [ NOT FOR REPLICATION ] AS sql_statement [ ] [ n ] | EXTERNAL NAME ltmethod specifier [ ] gt EjemploCREATE TRIGGER dboMovimientosDelete ON dboMovimientosFOR DELETEASBEGINmdash No retorna el mensaje de cantidad de registros afectadosSET NOCOUNT ON UPDATE dboArticulosSET STOCK = STOCK ndash TPARCIALFROM dboArticulos AINNER JOIN( SELECT ARTICULO_IDSUM(CASE WHEN TIPO=rsquoIrsquo THEN CANTIDAD ELSE -CANTIDAD END)AS PARCIAL FROM DELETEDGROUP BY ARTICULO_ID) TONAID = TARTICULO_IDEND53 Procedimientos almacenadosUn procedimiento almacenado (stored procedure en ingleacutes) es un programa (o procedimiento) el cual es almacenado fiacutesicamente en una base de datos Su implementacioacuten variacutea de un gestor de bases de datos a otro La ventaja de un procedimiento almacenado es que al ser ejecutado en respuesta a una peticioacuten de usuario es ejecutado directamente en el motor de bases de datos el cual usualmente corre en un servidor separado Como tal posee acceso directo a los datos que necesita manipular y soacutelo necesita enviar sus resultados de regreso al usuario deshacieacutendose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes54 Trabajar con procedimientos almacenadosUSE AdventureWorks2012GOCREATE PROCEDURE HumanResourcesuspGetEmployeesTest2 LastName nvarchar(50) FirstName nvarchar(50) AS SET NOCOUNT ON SELECT FirstName LastName Department FROM HumanResourcesvEmployeeDepartmentHistory WHERE FirstName = FirstName AND LastName = LastName AND EndDate IS NULL

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 61

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 62: Base de Datos

GO

Crear una tabla con los campos nuacutemero cuadrado y cubo el momento que

inserto un nuacutemero automaacuteticamente debe calcular el cuadrado y el cubo

Crear una tabla alumno y respaldo el momento que se borre una fila de la

tabla alumno automaacuteticamente debe pasarse a la tabla respaldo

BIBLIOGRAFIacuteA GABILLAUD Jeacuterome 2009 SQL Server 2008 SQL Transact SQL

Ediciones ENI Pags 109189225229239Este libro sobre SQL Server estaacute dirigido tanto a estudiantes de informaacutetica que deseen aprender el lenguaje SQL con SQL Server como a informaacuteticos que deseen actualizar sus competencias en SQL Server 2008 para comprender y controlar las funciones que complementan a esta nueva versioacuten

HOTEK Mike 2009 SQL Server 2008 Microsoft SQL Server 2008 Grupo Anayala Comercial Pags 12-2056-89145-204

Este libro es una guiacutea paso a paso para crear aplicaciones con SQL Server 2008 Trata en profundidad sus temas esenciales con ejemplos de coacutedigo que fomentan el dominio iacutentegro de las teacutecnicas Microsoft Consiga la orientacioacuten praacutectica que necesita para crear soluciones de bases de datos que solucionen problemas reales en el mundo profesional CHARTE Francisco 2009 SQL Server 2008 Anaya Multimedia Pags

57125213-256Esta guiacutea estaacute dirigida a los usuarios que comienzan a trabajar con SQL Server 2008 Con ella podraacute desde instalar SQL Server 2008 hasta publicar sus bases de datos para hacerlas accesibles a traveacutes de Internet pasando por el disentildeo de informes o creacioacuten de procedimientos almacenados Los primeros capiacutetulos se centran en las tareas de administracioacuten del servidor y la creacioacuten de bases de datos tablas vistas e iacutendices

COLES Michael 2008 Pro t-Sql 2008 Springer ndash Verlag New York Pags 3-40 80-132Este libro tiene teacutecnicas avanzadas abarcando todo lo que debe saber un administrador de base de datos SQL SERVER

PEREZ Ceacutesar 2009 Domine Microsoft SQL ndash Server 2008 Ra- Ma Pags 10-56 60-90En este libro se presenta un anaacutelisis profundo de la base de datos Microsoft SQL Server 2008 en su versioacuten Enterprise Edition Se comienza tratando la instalacioacuten del programa la introduccioacuten del trabajo en los distintos entornos de la base de datos y el desarrollo amplio del modelo entidad-relacioacuten a traveacutes de Transact SQL que se trata detalladamente

ANEXOS

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 62

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten
Page 63: Base de Datos

Videos Tutoriales Textos complementarios Paacuteginas de internet

MOacuteDULO DE CONTENIDOS DE GESTOR DE BASE DE DATOS II 63

  • 121 Tamantildeo de la base de datos
  • 132 Campos y registros
  • Relaciones uno a uno
  • Relaciones uno a varios
  • Relaciones Varios a Varios
    • 152 Segunda Forma Normal (2FN)
    • 153 Tercera Forma Normal (3FN)
    • La estructura IF admite el uso de subconsultas
    • Estructura condicional CASE
      • Ejemplo de CASE
      • El mismo ejemplo aplicando esta sintaxis
      • Otro aspecto muy interesante de CASE es que permite el uso de subconsultas
        • Bucle WHILE
          • El bucle WHILE se repite mientras expresion se evalue como verdadero
          • Es el uacutenico tipo de bucle del que dispone Transact SQL
          • Un ejemplo del bucle WHILE
          • Podemos pasar a la siguiente iteracioacuten del bucle utilizando CONTINUE
          • El bucle se dejaraacute de repetir con la instruccioacuten BREAK
          • Tambieacuten podemos utilizar el bucle WHILE conuntamente con subconsultas
            • Estructura GOTO
              • La sentencia goto nos permite desviar el flujo de ejecucioacuten hacia una etiqueta Fueacute muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema ERROR para el control de errores
              • Actualmente se desaconseja el uso GOTO recomendandose el uso de TRY - CATCH para la gestion de errores
                • 352 Count Regresa la cuneta de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para solamente contar los valores distintos
                • Count (Valores a contar)
                • 353 COUNTBIG
                • 354 AVG Regresa el promedio de todos los valores del SELECT Tambieacuten se puede usar la opcioacuten DISTINCT para calcular el promedio de los valores distintos
                • Sintaxis
                • AVG(Valores)
                • 354 Min
                • 355 MAX
                • 356 STDEV
                • 357 STDEVP
                • 357 VAR
                • 358 VARP
                • 359 GROUPING
                • 3510 CHECKSUM AGG
                  • ASCII (Transact-SQL)
                  • LEFT (Transact-SQL)
                  • LEN (Transact-SQL)
                  • LOWER (Transact-SQL)
                  • UPPER (Transact-SQL)
                  • LTRIM (Transact-SQL)
                  • RTRIM (Transact-SQL)
                  • SUBSTRING (Transact-SQL)
                    • Funciones de fecha y hora del sistema de precisioacuten baja
                    • Funciones que obtienen partes de fecha y hora
                    • Funciones que obtienen valores de fecha y hora de sus partes
                    • Funciones que obtienen diferencias de fecha y hora
                    • Funciones que modifican valores de fecha y hora
                      • 3513 Funciones de conversion de unidades
                      • CAST y CONVERT (Transact-SQL)
                        • Estilos de fecha y hora
                        • Estilos float y real
                        • Estilos money y smallmoney
                        • Estilos xml
                        • Estilos binarios
                        • Conversiones impliacutecitas
                        • Tipos de datos de valor grande
                        • xml Data Type
                        • Tipos de datos text e image
                        • Intercalacioacuten de salida
                        • Truncar y redondear resultados
                        • Determinadas conversiones de fecha y hora son no deterministas en SQL Server 2005 y versiones posteriores
                          • Coacutemo se produce la fragmentacioacuten
                          • Meacutetodos para administrar la fragmentacioacuten