Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Manual 2012-II Base de Datos Laboratorio (0031)

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 147

Base de Datos Laboratorio

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

NDICE
Presentacin Red de contenidos Unidad de aprendizaje 1: Fundamentos de SQL Server 2008R2 1.1 Tema 1 : Introduccin a las bases de datos

Pgina

5 6

8 8 11 13 15 15 15 23 30 30 38

1.1.1. : Lenguaje estructurado de consultas (SQL) 1.1.2. : Importancia de la base de datos 1.1.3. : SQL Server 2008R2 1.2 Tema 2 1.2.1. : Creacin de bases de datos
Definicin de base de datos

1.2.2. : Crear una base de datos 1.2.3. : Identificacin de los tipos de datos empleados en SQL Server
2008R2.

1.3 Tema 3

: Restricciones e integridad referencial

1.3.1. : Creacin de tablas e integridad de relacin 1.3.2. : Implementacin de restricciones Unidad de aprendizaje 2 : Manipulacin de datos 2.1 Tema 4 : Sentencias DML 2.1.1. : Insercin de datos: INSERT 2.1.2. : Actualizacin de datos: UPDATE 2.1.3.
Eliminacin de datos: DELETE

47 47 49 50

Unidad de aprendizaje 3 : Implementacin de Consultas 3.1 Tema 5 : Recuperacin de datos 55 55 55 61 63 68 69 69

3.1.1. : Introduccin a las consultas 3.1.2. : Uso del SELECT ALIAS - INNER JOIN 3.1.3. : Funciones para el manejo de fechas 3.1.4. : Manipulacin de consultas condicionales 3.1.5. 3.2 Tema 6
Ejercicios de aplicacin

: Agrupamiento de datos

3.2.1. : Empleo de GROUP BY, HAVING

CIBERTEC

CARRERAS PROFESIONALES

3.2.2. : Empleo de funciones agregadas 3.3 Tema 7 : Combinacin de tablas 3.3.1. : Combinaciones internas 3.3.2. : Combinaciones externas Unidad de aprendizaje 4 : Sub Consultas anidadas y correlacionadas,
Creacin de Vistas

72 75 79 81

4.1 Tema 8

: Subconsultas

93 93 96 97 97 99

4.1.1. : Subconsultas anidadas 4.1.2. : Subconsultas correlacionadas 4.2 Tema 9 : Vistas

4.2.1. : Vistas multitabla 4.2.2. : Clasificacion de las vistas Unidad de aprendizaje 5 : Diagramador de SQL Server 2008R2 5.1 Tema 10 : Diagramador de SQL Server 2008R2 5.1.1. : Uso del diagramador de base de datos de SQL Server
2008R2

111 111

Unidad de aprendizaje 6 : Introduccin a la programacin en Transact / SQL 6.1 Tema 11 : Introduccin a la programacin en SQL SERVER 2008R2 6.1.1. : Declaracin de variables locales 6.1.2. : Procedimientos almacenados 129 129 131

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

Presentacin

Base de Datos es un curso que pertenece a la Escuela de Tecnologas de Informacin y se dicta en las carreras de Administracin y Sistemas, Computacin e Informtica y Redes y Comunicaciones. El presente manual ha sido desarrollado para que los alumnos del curso de Base de Datos laboratorio puedan aplicar los conocimientos adquiridos en el curso de teora. Todo ello, en conjunto, le permitir implementar una base de datos relacional previamente diseada. El manual para el curso ha sido diseado bajo la modalidad de unidades de aprendizaje. En cada una de ellas, hallar los logros, que debe alcanzar al final de la unidad; el tema tratado, el cual ser ampliamente desarrollado; y los contenidos, que debe desarrollar, es decir, los temas y subtemas. Por ltimo, encontrar actividades y/o autoevaluaciones que deber desarrollar en cada sesin, que le permitirn reforzar lo aprendido en la clase. El curso es eminentemente prctico. Se inicia con la creacin de la base de datos DEPARTAMENTOS usando el lenguaje Transact/SQL en el manejador de base de datos relacional SQL Server 2008R2. Se presenta el script que permite su creacin, luego, su estructura que incluye tablas, llaves primarias y forneas, y restricciones. Posteriormente, se efecta la manipulacin de datos (Data Manipulation Lenguaje DML) para hacer uso de comandos que se emplean en la insercin, modificacin y eliminacin de los mismos. Una vez creada la base de datos y efectuada la insercin de registros, se ingresa a la etapa de las consultas (SELECT), las cuales parten de las ms sencillas, una sola tabla, hasta su relacin con otras tablas con el empleo del comando INNER JOIN y filtros (WHERE) con condiciones (and, mayor, menor, igual, etc.). Finalmente, en la ltima parte del manual se realizan consultas multitablas empleando funciones agrupadas, para luego grabarlas en una vista. Tambin, se ha considerado una introduccin a la creacin y manipuleo de procedimientos almacenados.

CIBERTEC

CARRERAS PROFESIONALES

Red de contenidos

SQL-SERVER - 2008

IMPLEMENTACIN

DDL Lenguaje de Definicin de Datos

DML Lenguaje de Manipulacin de Datos

CREATE

ALTER

DROP

INSERT

UPDATE

DELETE

SELECT

Database Table Constraint View Procedure

Database Table View Procedure

Database Table Constraint View Procedure

From Where Group by Having Order by

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

UNIDAD DE APRENDIZAJE

FUNDAMENTOS DE SQL SERVER 2008R2


LOGRO DE LA UNIDAD DE APRENDIZAJE
Al terminar la unidad, los alumnos construirn una base de datos relacional utilizando el gestor de base de datos SQL Server 2008R2 y los comandos del Lenguaje de Definicin de Datos (DDL), asegurando la integridad de los datos mediante el empleo de restricciones tomando como caso un proceso de negocio real.

TEMARIO
1.1. Tema 1: Introduccin a las bases de datos (1 hora)
1.1.1. 1.1.2. 1.1.3. Lenguaje estructurado de consultas (SQL) Importancia de la base de datos SQL Server 2008R2

1.2. Tema 2: Creacin de bases de datos (2 horas)


1.2.1. 1.2.2. 1.2.3. Definicin de base de datos Crear una base de datos Identificacin de los tipos de datos empleados en SQL Server 2008R2.

1.3. Tema 3: Restricciones e integridad referencial (3 horas)


1.3.1. Creacin de tablas e integridad de relacin. Implementacin de restricciones

ACTIVIDADES PROPUESTAS
Comprenden la visin general del curso. Deducen la importancia de la existencia de las bases de datos. Emplean los procedimientos necesarios para crear una base de datos. Identifican los tipos de datos que se emplean en el SQL SERVER 2008R2.

CIBERTEC

CARRERAS PROFESIONALES

1.1.

TEMA 1: Introduccin a las bases de datos

1.1.1. Lenguaje estructurado de consultas (SQL) El lenguaje de consulta estructurado (SQL) es un lenguaje de base de datos normalizado, utilizado por los diferentes motores de bases de datos para realizar determinadas operaciones sobre los datos o sobre la estructura de los mismos. Pero como sucede con cualquier sistema de normalizacin, hay excepciones para casi todo. De hecho, cada motor de bases de datos tiene sus peculiaridades y lo hace diferente de otro motor; por lo tanto, el lenguaje SQL normalizado (ANSI) no nos servir para resolver todos los problemas, aunque s se puede asegurar que cualquier sentencia escrita en ANSI ser interpretable por cualquier motor de datos. 1.1.1.1. Historia del lenguaje estructurado La historia de SQL empieza en 1974 con la definicin, por parte de Donald Chamberlin y de otras personas que trabajaban en los laboratorios de investigacin de IBM, de un lenguaje para la especificacin de las caractersticas de las bases de datos que adoptaban el modelo relacional. Este lenguaje se llamaba SEQUEL (Structured English Query Language ) y se implement en un prototipo llamado SEQUEL-XRM entre 1974 y 1975. Las experimentaciones con ese prototipo condujeron, entre 1976 y 1977, a una revisin del lenguaje (SEQUEL/2) que, a partir de ese momento, cambi de nombre por motivos legales y se convirti en SQL. El prototipo (System R), basado en este lenguaje, se adopt y utiliz internamente en IBM y lo adoptaron algunos de sus clientes elegidos. Gracias al xito de este sistema, que no estaba todava comercializado, otras compaas empezaron a desarrollar sus productos relacionales basados en SQL. A partir de 1981, IBM comenz a entregar sus productos relacionales y, en 1983, empez a vender DB2. En el curso de los aos ochenta, numerosas compaas (por ejemplo Oracle y Sybase, slo por citar algunas) comercializaron productos basados en SQL, que se convierte en el estndar industrial de hecho por lo que respecta a las bases de datos relacionales. En 1986, el ANSI adopt SQL (sustancialmente adopt el dialecto SQL de IBM) como estndar para los lenguajes relacionales y en 1987 se transform en estndar ISO. Esta versin del estndar va con el nombre de SQL/86. En los aos siguientes, ste ha sufrido diversas revisiones que han conducido primero a la versin SQL/89 y, posteriormente, a la actual SQL/92. El hecho de tener un estndar definido por un lenguaje para bases de datos relacionales abre potencialmente el camino a la intercomunicacin entre todos los productos que se basan en l. Desde el punto de vista prctico, por desgracia las cosas fueron de otro modo. Efectivamente, en general cada productor adopta e implementa, en la propia base de datos slo el corazn del lenguaje SQL (el as llamado Entry level o al mximo el Intermediate level), y lo extiende de manera individual segn la propia visin que cada cual tenga del mundo de las bases de datos. Actualmente, est en marcha un proceso de revisin del lenguaje por parte de los comits ANSI e ISO, que debera terminar en la definicin de lo que en

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

este momento se conoce como SQL3. Las caractersticas principales de esta nueva encarnacin de SQL deberan ser su transformacin en un lenguaje stand-alone (mientras ahora se usa como lenguaje hospedado en otros lenguajes) y la introduccin de nuevos tipos de datos ms complejos que permitan, por ejemplo, el tratamiento de datos multimedia. 1.1.1.2. Componentes del SQL El lenguaje SQL est compuesto por comandos, clusulas, operadores y funciones de agregado. Estos elementos se combinan en las instrucciones para crear, actualizar y manipular las bases de datos. Existen dos (2) tipos de comandos SQL: Los comandos del Lenguaje de Definicin de Datos (DDL) que permiten crear y definir nuevas bases de datos, campos e ndices. Los comandos del Lenguaje de Manipulacin de Datos (DML) que permiten modificar y generar consultas para insertar, modificar o eliminar, as como, ordenar, filtrar y extraer datos de la base de datos.

1.1.1.2.1. Comandos del DDL Comando CREATE DROP ALTER 1.1.1.2.2. Comandos del DML Comando SELECT INSERT UPDATE DELETE 1.1.1.2.3. Clusulas Comando FROM WHERE GROUP BY HAVING ORDER BY Descripcin Utilizada para especificar la tabla de la cual se van a seleccionar los registros Utilizada para especificar las condiciones que deben reunir los registros que se van a seleccionar Utilizada para separar los registros seleccionados en grupos especficos Utilizada para expresar la condicin que debe satisfacer cada grupo Utilizada para ordenar los registros seleccionados de acuerdo con un orden especfico Descripcin Utilizado para consultar registros de la base de datos que satisfagan un criterio determinado Utilizado para ingresar registros de datos en la base de datos en una nica operacin Utilizado para modificar los valores de los campos y registros especificados Utilizado para eliminar registros de una tabla de una base de datos Descripcin Utilizado para crear nuevas tablas, campos e ndices Empleado para eliminar tablas e ndices Utilizado para modificar las tablas y agregar campos o cambiar la definicin de los campos.

CIBERTEC

CARRERAS PROFESIONALES

10

1.1.1.2.4. Operadores Lgicos Comando AND OR NOT Descripcin Es el "y" lgico. Evala dos condiciones y devuelve un valor de verdad slo si ambas son ciertas Es el "o" lgico. Evala dos condiciones y devuelve un valor de verdad si alguna de las dos es cierta Negacin lgica. Devuelve el valor contrario de la expresin

1.1.1.2.5. Operadores de Comparacin Comando < > <> <= >= = BETWEEN LIKE In Descripcin Menor que Mayor que Distinto de Menor igual que Mayor igual que Igual que Utilizado para especificar un intervalo de valores Utilizado en la comparacin de un modelo Utilizado para especificar registros de una base de datos

1.1.1.3. Funciones para el manejo de fechas y funcin de conversin

Funcin GETDATE() DAY(fecha) MONTH(fecha) YEAR(fecha)

Descripcin Devuelve la fecha del da Devuelve un entero que representa el da (da del mes) de la fecha especificada Devuelve un entero que representa el mes de la fecha especificada Devuelve un entero que representa la parte del ao de la fecha especificada Devuelve el nmero de lmites datepart de fecha y hora entre dos fechas especificadas.
DATEDIFF ( parte , fechaInicio , fechaFin)

DATEDIFF(parte,fi,ff) Devuelve un entero que representa el parmetro parte especificado (dia, mes o ao) del parmetro DATEPART (parte,fecha) fecha especificada. Convierte una expresin de un tipo de datos en otro. CONVERT
CONVERT ( tipodedato [ ( lengitud ) ] , expresin [ , stilo ] )

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

11

1.1.1.4 Funciones de agregado Las funciones de agregado se usan dentro de una clusula SELECT, en grupos de registros para devolver un nico valor que se aplica a un grupo de registros. Comando AVG(exp) COUNT(exp) SUM(exp) MAX(exp) MIN(exp) Descripcin Se emplea para calcular el promedio de los valores de un campo determinado. Se emplea para devolver la cantidad de registros de la seleccin. Se emplea para devolver la suma de todos los valores de un campo determinado. Se emplea para devolver el valor ms alto de un campo o expresin especificada. Se emplea para devolver el valor ms bajo de un campo o expresin especificada.

1.1.2. IMPORTANCIA DE LA BASE DE DATOS Las bases de datos son importantes porque permiten almacenar grandes cantidades de informacin en forma estructurada, consistente e ntegra y dan la posibilidad a un desarrollador de utilizarlas mediante programas (aplicaciones); adems, les proporciona a stos una herramienta bajo la cual puedan reducir considerablemente el tiempo del proceso de bsqueda en profundidad de los datos almacenados. 1.1.2.1. Implementacin de las base de datos con SQL SERVER SQL Server es un sistema administrador para Bases de Datos relacionales basadas en la arquitectura Cliente / Servidor (RDBMS) que usa Transact SQL para mandar peticiones entre un cliente y el SQL Server.

1.1.2.1.1. Arquitectura Cliente / Servidor SQL Server usa la arquitectura Cliente / Servidor para separar la carga de trabajo en tareas que se ejecuten en computadoras tipo Servidor y tareas que se ejecuten en computadoras tipo Cliente:

CIBERTEC

CARRERAS PROFESIONALES

12

El Cliente es responsable de la parte lgica y de presentar la informacin al usuario. Generalmente, el cliente ejecuta en una o ms computadoras Cliente, aunque tambin puede ejecutarse en una computadora que cumple las funciones de Servidor con SQL Server. SQL Server administra bases de datos y distribuye los recursos disponibles del servidor tales como memoria, operaciones de disco, etc. Entre las mltiples peticiones. La arquitectura Cliente/Servidor permite desarrollar aplicaciones para realizarlas en una variedad de ambientes. SQL Server 2008R2 trabaja con dos (2) tipos de bases de datos:

OLTP (Online Transaction Processing) Son bases de datos caracterizadas por mantener una gran cantidad de usuarios conectados concurrentemente realizando ingreso y/o modificacin de datos. Por ejemplo: entrada de pedidos en lnea, inventario, contabilidad o facturacin.

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

13

OLAP (OnLine Analytical Processing) Son bases de datos que almacenan grandes cantidades de datos que sirven para la toma de decisiones, como por ejemplo las aplicaciones de anlisis de ventas.

1.1.2.1.2. Sistema administrador para bases de datos Relacionales (RDBMS) El RDBMS es responsable de: Mantener las relaciones entre la informacin y la base de datos. Asegurarse de que la informacin sea almacenada correctamente, es decir, que las reglas que definen las relaciones ente los datos no sean violadas. Recuperar toda la informacin en un punto conocido en caso de que el sistema falle.

1.1.2.2. TRANSACT SQL ste es una versin de SQL (Structured Query Languaje) usada como lenguaje de programacin para SQL Server. SQL es un conjunto de comandos que permite especificar la informacin que se desea restaurar o modificar. Con Transact SQL se puede tener acceso a la informacin, realizar bsquedas, actualizar y administrar sistemas de bases de datos relacionales. Aunque se denomine SQL, debido a que el propsito general es recuperar datos, realmente SQL nos brinda muchas ms opciones. Es una herramienta mucho ms interesante. Podemos utilizar ms funciones de las que el DBMS (Database Management System - Sistema de Gestin de base de datos) nos proporciona. 1.1.3. SQL SERVER 2008R2 Esta ltima versin del SQL Server Database Engine (Motor de base de datos de SQL Server) incluye nuevas caractersticas y mejoras que aumentan la eficacia y la productividad de los arquitectos, los programadores y los administradores que disean, desarrollan y mantienen sistemas de almacenamiento de datos.

CIBERTEC

CARRERAS PROFESIONALES

14

Las ediciones disponibles de SQL Server 2008R2 son: SQL Server 2008R2 Enterprise. Con soporte de escalabilidad de clase enterprise, data-warehousing, seguridad, anlisis avanzado y reportera. SQL Server 2008 Standard. Para aplicaciones departamentales. SQL Server 2008 Workgroup. Para aplicaciones branch (sucursales). SQL Server 2008 Web. Para aplicaciones web. Diseada para ser de bajo costo, tener alta disponibilidad y a gran escala. SQL Server 2008 Developer. Similar a la versin Enterprise, pero se licencia nicamente para efectos de desarrollo de aplicaciones y es por cada desarrollador. SQL Server 2008 Express. GRATUITA. Para aplicaciones de escritorio y efectos de aprendizaje. SQL Server Compact 3.5. GRATUITA. Para aplicaciones mviles.

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

15

1.2. 1.2.1.

TEMA 2: CREACIN DE BASES DE DATOS Definicin de base de datos Una base de datos es un contenedor de objetos relacionados entre s, de manera lgica y coherente. Estos objetos incluyen los orgenes de datos, dimensiones compartidas y funciones de base de datos.

1.2.2. Crear una base de datos 1.2.2.1. Componentes de una base de datos Para crear una base de datos, determine el nombre de la base de datos, el propietario (el usuario que crea la base de datos), su tamao, y los archivos y grupos de archivos utilizados para almacenarla. Antes de crear una base de datos, considere lo siguiente: a) De forma predeterminada, tienen permiso para crear una base de datos las funciones fijas del servidor sysadmin y dbcreator, aunque se puede otorgar permisos a otros usuarios. b) El usuario que crea la base de datos se convierte en su propietario. c) En un servidor, pueden crearse hasta 32.767 bases de datos. Se utilizan tres (03) tipos de archivos para almacenar una base de datos:

Base de datos
Archivo de Datos primario .mdf Archivo de Datos Secundario .ndf

Archivo de Registro .Idf

Archivos principales Estos archivos contienen la informacin de inicio para la base de datos. Este archivo se utiliza tambin para almacenar datos. Cada base de datos tiene un nico archivo principal. Tiene extensin .MDF. Archivos secundarios Estos archivos contienen todos los datos que no caben en el archivo de datos principal. No es necesario que las bases de datos tengan archivos de datos secundarios si el archivo principal es lo suficientemente grande como

CIBERTEC

CARRERAS PROFESIONALES

16

para contener todos los datos. Algunas bases de datos pueden ser muy grandes y necesitar varios archivos de datos secundarios o utilizar archivos secundarios en unidades de disco distintas, de modo que los datos estn distribuidos en varios discos. Tiene extensin .NDF. Registro de transacciones Estos archivos contienen la informacin de registro que se utiliza para recuperar la base de datos. Debe haber al menos un archivo de registro de transacciones para cada base de datos, aunque puede haber ms de uno. El tamao mnimo para un archivo de registro es 512 kilobytes (KB). Tiene extensin .LDF. Importante: Los archivos de datos y de registro de transacciones de Microsoft SQL Server 2008R2 no deben colocarse en sistemas de archivos comprimidos ni en una unidad de red remota, como un directorio de red compartido. Cuando se crea una base de datos, todos los archivos que la componen se llenan con ceros que suplantan los datos de los archivos ya eliminados que hubieran quedado en el disco. Aunque esto provoque que el proceso de creacin de los archivos sea ms largo, es mejor, pues as se evita que el sistema operativo tenga que llenar los archivos con ceros cuando se escriban por primera vez datos en los archivos durante las operaciones habituales con la base de datos. De esta manera, se mejora el rendimiento de las operaciones cotidianas. Es recomendable especificar el tamao mximo de crecimiento del archivo. De ese modo se evita que se agote el espacio disponible en el disco al agregar datos. Para especificar un tamao mximo para el archivo, utilice el parmetro MAXSIZE de la instruccin CREATE DATABASE o bien la opcin Limitar crecimiento de archivo a (MB) cuando utilice el cuadro de dilogo Propiedades del Administrador corporativo de SQL Server para crear la base de datos. Despus de crear una base de datos, se recomienda crear una copia de seguridad de la base de datos MASTER. 1.2.1.2. Creacin de una base de datos SERVER 2008R2 usando la herramienta de SQL

Para crear una base de datos, se deben seguir los siguientes pasos: a) Expanda un grupo de servidores y, a continuacin, un servidor. b) Con el botn secundario del mouse (ratn) en bases de datos y, a continuacin, en nueva base de datos. Escriba un nombre para la nueva base de datos.

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

17

c) Haga clic Observacin: Los archivos de registro de transacciones y de la base de datos principal se crean utilizando el nombre de base de datos que ha especificado como prefijo, por ejemplo, newdb_Data.mdf y newwdb_Log.ldf. Los tamaos iniciales de estos archivos son los mismos que los tamaos predeterminados especificados para la base de datos MODEL. El archivo principal contiene las tablas del sistema para la base de datos. 1. Para cambiar los valores predeterminados del nuevo archivo de base de datos principal, haga clic en la ficha General. Para cambiar los valores predeterminados correspondientes al nuevo archivo de registro de transacciones, haga clic en la ficha Registro de transacciones. 2. Para cambiar los valores predeterminados proporcionados en las columnas Nombre de archivo, Ubicacin, Tamao inicial (megabytes) y Grupo de archivos (no aplicable para el registro de transacciones), haga clic en la celda apropiada para cambiar y escribir el nuevo valor. 3. Para especificar cmo debe crecer el archivo, haga clic en una de estas opciones: 3.1. Para permitir que el archivo actualmente seleccionado crezca cuando sea necesario ms espacio para los datos, haga clic en Crecimiento automtico del archivo. 3.2. Para especificar que el archivo debe crecer en incrementos fijos, haga clikc en megabytes y especifique un valor. 3.3. Para especificar que el archivo debe crecer en un porcentaje de su tamao actual, haga clic en por porcentaje y especifique un valor.

CIBERTEC

CARRERAS PROFESIONALES

18

3.4. Para especificar el lmite de tamao del archivo, haga clic en una de estas opciones: 3.4.1. 3.4.2. Para que el archivo crezca tanto como sea necesario, haga clic en No limitar el crecimiento de los archivos. Para especificar el tamao mximo que se debe permitir que alcance el archivo, haga clic en Limitar crecimiento de archivo a (megabytes) y especifique un valor.

Nota: El tamao mximo de una base de datos est determinado por la cantidad de espacio de disco disponible y los lmites de licencia establecidos por la versin de SQL Server que utilice.

1.2.1.3. Cmo crear una base de datos usando TRANSACT/SQL? ACTIVIDAD 3.4.1 Crear una base de datos sin especificar los archivos Este ejemplo crea una base de datos llamada bd_ejemplo, automticamente se crean los archivos principal y de registro de transacciones correspondientes en la carpeta asignada por defecto, por ejemplo en: C:\Program Files\Microsoft SQL Server\MSSQL\Data Debido a que la instruccin no tiene elementos <filespec>, el archivo principal de la base de datos toma el tamao del archivo principal de la base de datos MODEL. El registro de transacciones toma el tamao del archivo del registro de transacciones de la base de datos MODEL. Como no se ha especificado el prmetro MAXSIZE, los archivos pueden crecer hasta llenar todo el espacio disponible en el disco. CREATE DATABASE bd_ejemplo Go

NOTA: Puede usar el comando sp_ helpDB para presentar informacin acerca de la base de datos especificada o de todas las bases de datos. Sintaxis: SP_HELPDB [Nombre de la base de datos] Ejemplo: SP_HELPDB bd_ejemplo

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

19

CIBERTEC

CARRERAS PROFESIONALES

20

1.2.1.4. ESPECIFICANDO LAS PROPIEDADES CONFORMA UNA BASE DE DATOS:

PARA CADA

ARCHIVO

QUE

Para el archivo primario, los archivos secundarios y los archivos de registro de transacciones se pueden especificar las siguientes propiedades: NAME: FILENAME: Nombre lgico del archivo. Nombre fsicio, en el cual se debe especificar la ruta (ubicacin) donde ser creado el archivo. SIZE: MAXSIZE: Tamao inicial, por defecto est dado en megabytes. Tamao mximo.

FILEGROWTH: Crecimiento del archivo.

ACTIVIDAD 1.2.4.1.1 : Crear una base de datos individual En este ejemplo se crea una base de datos llamada DEPARTAMENTOS en la carpeta D:\Data\ y se especifica un nico archivo. El archivo especificado se convierte en el archivo principal y se crea automticamente un archivo de registro de transacciones de 1 megabytes. Como no se especifican la unidad en el parmetro SIZE del archivo principal, se asigna por defecto en megabytes. Ya que no existe <filespec> para el archivo de registro de transacciones, ste no tiene el parmetro MAXSIZE y puede crecer hasta llenar todo el espacio disponible en el disco.

CREATE DATABASE Departamentos ON ( NAME = Departamentos_Data , FILENAME = 'D:\Data\Departamentos_Data.mdf' , SIZE = 4 , MAXSIZE = 10 , FILEGROWTH = 1 ) GO

ACTIVIDAD 1.2.4.1.2 : Crear una base de datos sin especificar tamao (size), ni mximo tamao (maxsize), ni crecimiento (filegrowth) Esta actividad crea una base de datos llamada Departamentos2. El archivo departamentos2_Data se convierte en el archivo principal, con un tamao igual al tamao del archivo principal de la base de datos MODEL. El archivo de registro de transacciones se crea automticamente y es un 25 por ciento del tamao del archivo principal, o 512 kilobytes, el que sea mayor. Como no se ha especificado MAXSIZE, los archivos pueden crecer hasta llenar todo el espacio disponible en el disco.

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

21

CREATE DATABASE Departamentos2 ON (NAME = Departamentos2_Data, FILENAME = 'D:\ Data \Departamentos2_Data.mdf' )

GO

ACTIVIDAD 1.2.4.1.3: Crear una base de datos especificando dos archivos, archivo de datos y archivo de transacciones Esta actividad crea una base de datos llamada Departamentos3 en la carpeta D:\Data\, su archivo principal contar con un tamao inicial de 40 megabytes, un tamao mximo de 100 megabytes y un crecimiento de 1 megabytes. Su archivo de registro contar con un tamao inicial de 5 megabytes, un tamao mximo de 40 megabytes y un crecimiento de 10%.

CREATE DATABASE Departamentos3 ON (NAME = Departamentos3_Data, FILENAME = 'D:\ Data \Departamentos3_Data.mdf', SIZE = 40, MAXSIZE = 100, FILEGROWTH = 1 ) LOG ON (NAME = Departamentos3_Log, FILENAME = 'D:\ Data \Departamentos3_Log.ldf', SIZE = 5, MAXSIZE = 40, FILEGROWTH = 10% ) GO

ACTIVIDAD 1.2.4.1.4 Crear una base de datos especificando el archivo de datos, un archivo secundario y un archivo de transacciones: Esta actividad crea una base de datos llamada Departamentos3 en la carpeta D:\DATA\, su archivo principal contar con un tamao inicial de 15MB, un tamao mximo de 200 megabytes y un crecimiento de 20%. Su archivo secundario contar con un tamao inicial de 10 megabytes, un tamao mximo de 80 megabytes y un crecimiento de 2 megabytes. Su archivo de registro contar con un tamao inicial de 10 megabytes, un tamao mximo de 70 megabytes y un crecimiento de 5 megabytes.

CIBERTEC

CARRERAS PROFESIONALES

22

CREATE DATABASE Departamentos4 ON (NAME = Departamentos4_Data, FILENAME = 'D:\ Data \Departamentos4_Data.mdf', SIZE = 15, MAXSIZE = 200, FILEGROWTH = 20% )

(NAME = Departamentos4_Sec, FILENAME = 'D:\ Data \Departamentos4_Sec.ndf', SIZE = 10, MAXSIZE = 80, FILEGROWTH = 2 ) LOG ON (NAME = Departamentos4_Log, FILENAME = 'D:\ Data \Departamentos4_Log.ldf', SIZE = 10, MAXSIZE = 70, FILEGROWTH = 5 ) GO

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

23

1.2.3 TIPOS DE DATOS Los tipos de datos definen el valor de datos que se permite en cada columna. SQL Server proporciona varios tipos de datos diferentes. Ciertos tipos de datos comunes tienen varios tipos de datos de SQL Server asociados. Se debe elegir los tipos de datos adecuados que permitan optimizar el rendimiento y conservar el espacio en el disco.

1.2.3.1. Categoras de tipos de datos del sistema La siguiente tabla asocia los tipos de datos comunes con los tipos de datos del sistema proporcionados por SQL Server. La tabla incluye los sinnimos de los tipos de datos por compatibilidad con ANSI1. Tipos de datos comunes Entero Numrico Exacto Numrico Aproximado Moneda Fecha y hora Tipos de datos del sistema de SQL Server Int bigint smallint, tinyint decimal[(p[,s])] numeric[(p[,s])] float[(n)] real money, smallmoney datetime, smalldatetime char[(n)] varchar[(n)] Sinmino ANSI Nmero de Bytes 4 8 2,1 2-17 8 4 8,4 8 4 0-8000

Integer Dec double precisin, float[(n)] para n=8-15 float[(n)] para n=1-7 character [(n)] char VARYING[(n)] character VARYING[(n)] -

Carcter text nchar[(n)] nvarchar[(n)] ntext binary [(n)] varbinary [(n)] Image

Caracteres Unicote

0-2 GB 0-8000 (4000 caracteres) 0-2 GB 0-8000

Binario Imagen

binary VARYING[(n)] -

0 a 2 GB

Nota: SQL SERVER 2008R2 agrega nuevos tipos de datos. Estos nuevos tipos de datos permiten una mejora en el almacenamiento y en el trabajo con tipos de datos fecha y hora, incluyendo mltiples zonas horarias y clculos mejorados. Estos nuevos tipos de datos son: datetime2, date, time y datetimeoffset.

American Nacional Standards Institute

CIBERTEC

CARRERAS PROFESIONALES

24

1.2.4. ACTIVIDADES PROPUESTAS Usando TRANSACT/SQL, cree las siguientes bases de datos:

1. VENTAS1, en la carpeta D:\DATABASE\, considerando que el archivo principal tiene tamao de 20 megabytes, un tamao mximo de 80 megabytes y un incremento de 10 megabytes.

2. VENTAS2, en la carpeta D:\MSSQL\DATA\, considerando

que el archivo

principal tiene tamao de 20 megabytes, un tamao mximo de 80 megabytes y un incremento de 10 megabytes. Por otro lado, considere que el archivo de transacciones tiene tamao de 3 megabytes, un tamao mximo de 13 megabytes y un incremento del 15%.

3. VENTAS3, en la carpeta D:\CIBERMARANATA\DATOS\, configuracin:

con la siguiente

Archivo de datos: un tamao inicial de 20 megabytes, mximo de 120 megabytes y un factor de crecimiento de 5%, Archivo secundario: un tamao inicial de 10 megabytes, mximo de 50 megabytes y un factor de crecimiento de 2 megabytes, Archivo de transacciones: un tamao inicial de 4 megabytes, mximo de 75 megabytes y un factor de crecimiento de 2%.

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

25

Caso: VENTAS Se ha diseado una base de datos para el control de las ventas realizadas en una empresa, como se detalla en el siguiente diagrama:

1. Cree la base de datos Ventas indicando propiedades para el archivo primario, un archivo secundario y un archivo de registro.

2. Identificar los tipos de datos que le corresponde a los campos de las tablas EMPLEADO, BOLETA y PRODUCTO. 3. Cree la base de datos para su proyecto de investigacin, el cual tendr definida la ruta para la creacin de los archivos y la especificacin de los tres (3) archivos (archivo de registro, archivo secundario y archivo de transacciones).

CIBERTEC

CARRERAS PROFESIONALES

26

1.2.4.1. ACTIVIDADES ADICIONALES Los ejemplos mostrados a continuacin han sido tomados de la Ayuda en Lnea del Microsft SQL 2008R2. A. Cree una base de datos sin especificar archivos En este ejemplo se crea la base de datos mytest, y el archivo principal y de registro de transacciones correspondientes. Debido a que la instruccin no tiene elementos <filespec>, el archivo de la base de datos principal tiene el tamao del archivo principal de la base de datos model. El registro de transacciones se establece en el mayor de estos valores: 512 KB o el 25% del tamao del archivo de datos principal. Como no se ha especificado MAXSIZE, los archivos pueden crecer hasta llenar todo el espacio disponible en el disco.
USE master; GO IF DB_ID (N'mytest') IS NOT NULL DROP DATABASE mytest; GO CREATE DATABASE mytest; GO -- Verify the database files and sizes SELECT name, size, size*1.0/128 AS [Size in MBs] FROM sys.master_files WHERE name = N'mytest'; GO

B. Cree una base de datos que especifica los archivos de datos y de registro de transacciones: En el ejemplo siguiente se crea la base de datos Sales (Ventas). Debido a que no se utiliza la palabra clave PRIMARY, el archivo (Sales_dat) se convierte en el archivo principal. Como no se especifica megabytes ni kilobytes en el parmetro SIZE del archivo Sales_dat, se utiliza megabytes y el tamao se asigna en megabytes. El tamao del archivo Sales_log se asigna en megabytes porque el sufijo MB se ha indicado explcitamente en el parmetro SIZE.
USE master; GO IF DB_ID (N'Sales') IS NOT NULL DROP DATABASE Sales; GO -- Get the SQL Server data path DECLARE @data_path nvarchar (256);

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

27

SET @data_path = (SELECT SUBSTRING (physical_name, 1, CHARINDEX(N'master.mdf', LOWER (physical_name)) - 1) FROM master.sys.master_files WHERE database_id = 1 AND file_id = 1); -- execute the CREATE DATABASE statement EXECUTE ('CREATE DATABASE Sales ON (NAME = Sales_dat, FILENAME = '''+ @data_path + 'saledat.mdf'', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5) LOG ON (NAME = Sales_log, FILENAME = '''+ @data_path + 'salelog.ldf'', SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = 5MB)' ); GO

C. Cree una base de datos mediante la especificacin de mltiples archivos de datos y de registro de transacciones: En el ejemplo siguiente se crea la base de datos Archive, que tiene tres archivos de datos de 100 megabytes y dos archivos de registro de transacciones de 100 megabytes. El archivo principal es el primer archivo de la lista y se especifica explcitamente con la palabra clave PRIMARY. Los archivos de registro de transacciones se especifican a continuacin de las palabras clave LOG ON. Tenga en cuenta las extensiones usadas para los archivos en la opcin FILENAME: .mdf se usa para archivos de datos principales, .ndf para archivos de datos secundarios y .ldf para archivos de registro de transacciones.
USE master; GO IF DB_ID (N'Archive') IS NOT NULL DROP DATABASE Archive; GO -- Get the SQL Server data path DECLARE @data_path nvarchar(256); SET @data_path = (SELECT SUBSTRING(physical_name, 1, CHARINDEX(N'master.mdf', LOWER(physical_name)) - 1)

CIBERTEC

CARRERAS PROFESIONALES

28

FROM master.sys.master_files WHERE database_id = 1 AND file_id = 1); -- execute the CREATE DATABASE statement EXECUTE ('CREATE DATABASE Archive ON PRIMARY (NAME = Arch1, FILENAME = '''+ @data_path + 'archdat1.mdf'', SIZE = 100MB, MAXSIZE = 200, FILEGROWTH = 20), ( NAME = Arch2, FILENAME = '''+ @data_path + 'archdat2.ndf'', SIZE = 100MB, MAXSIZE = 200, FILEGROWTH = 20), ( NAME = Arch3, FILENAME = '''+ @data_path + 'archdat3.ndf'', SIZE = 100MB, MAXSIZE = 200, FILEGROWTH = 20) LOG ON (NAME = Archlog1, FILENAME = '''+ @data_path + 'archlog1.ldf'', SIZE = 100MB, MAXSIZE = 200, FILEGROWTH = 20), (NAME = Archlog2, FILENAME = '''+ @data_path + 'archlog2.ldf'', SIZE = 100MB, MAXSIZE = 200, FILEGROWTH = 20)' ); GO

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

29

Al ejecutar el cdigo anterior, se mostrar lo siguiente:

CIBERTEC

CARRERAS PROFESIONALES

30

1.3.

Tema 3: Restricciones e integridad referencial

1.3.1. Creacin de tablas e integridad de relacin. 1.3.1.2. Definicin de una tabla Una tabla es una coleccin de datos sobre una entidad (Persona, Lugar, Cosa) especfica, que tiene un nmero discreto de atributos designados (por ejemplo cantidad o tipo). Las tablas son los objetos principales de SQL Server y del modelo relacional en general. Las tablas son fciles de entender, ya que son prcticamente iguales a las listas que utiliza de manera cotidiana. En SQL Server una tabla suele denominarse tabla de base, para hacer nfasis sobre dnde se almacenan los datos. La utilizacin de << Tabla de base >>, tambin distingue la tabla de una vista (View), (una tabla virtual que es una consulta interna de una tabla base.) Conforme se utiliza la base de datos con frecuencia se encontrar conveniente definir tablas propias para almacenar datos personales o datos extrados de otras tablas. Los atributos de los datos de una tabla (tamao, color, cantidad, fecha, etc.) toman la forma de columnas con nombre en la tabla. Las columnas de la tabla recin creada se definen en el cuerpo de las sentencias CREATE TABLE. La definicin de las columnas aparece en una lista separada por comas e incluida entre parntesis. La definicin de la columna determina el orden de izquierda a derecha de la columna en la tabla.

a.

Nombre de columna:
Pueden ser iguales a los nombre de las columnas de otras tablas, pero no pueden tener el nombre de una columna existente en la misma tabla.

b. c.

Tipo de datos
Identifica la clase de datos que la columna almacenar.

Datos requeridos:
Si la columna contiene datos requeridos se debe especificar si la columna no acepta valores nulos. La clusula NOT NULL impide que aparezcan valores NULL en la columna. Por defecto se admiten valores NULL. Las

tablas suelen estar relacionadas con otras tablas.

1.3.1.3.

Clave Primaria y Clave Fornea


El principio fundamental del modelo relacional, es que cada fila de una tabla es en cierta medida exclusiva y puede distinguirse de alguna forma de cualquier otra fila de la tabla. La combinacin de todas las columnas de una tabla puede utilizarse como un identificador exclusivo, pero en la prctica el identificador suele ser mucho como la combinacin de unas pocas columnas y, a menudo, es simplemente una columna, a la cual se le denomina Primary Key o Clave Primaria.

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

31

Una Clave Fornea o Foreign Key es una o varias columnas de una tabla cuyos valores deben ser iguales a los de una restriccin Primary Key en otra tabla. SQL Server impone de manera automtica la integridad referencial mediante la utilizacin de Foreign Key y a esta caracterstica se le denomina integridad referencial declarativa. 1.3.1.4. Definicin de relaciones El trmino "relaciones" usualmente se refiere a las relaciones entre claves forneas y primarias, y entre tablas. Estas relaciones deben ser definidas porque determinan qu columnas son o no claves primarias o claves forneas. A continuacin, veamos los tipos de relacin que pueden existir entre las tablas: 1.3.1.4.1. Relacin Uno-a-Varios: La relacin uno a varios (uno a muchos), es el tipo de relacin ms comn. En este tipo de relacin, una fila de la tabla A puede tener varias columnas coincidentes en la tabla B, pero una fila de la tabla B slo puede tener una fila coincidente en la tabla A. Por ejemplo, las tablas Editor y Libro tienen una relacin uno a varios: cada editor produce muchos ttulos, pero cada Libro procede de un nico editor. Una relacin de uno a varios slo se crea si una de las columnas relacionadas es una clave principal o tiene una restriccin nica (una restriccin nica impide que el campo tenga valores repetidos). El lado de la clave principal de una relacin de uno a varios se indica con un smbolo de llave, mientras que el lado de la clave externa de una relacin se indica con un smbolo de infinito. En el ejemplo tenemos: Un estado lo es de muchos usuarios pero un usuario tiene nicamente un estado. Primary Key

Primary Key

Foreing Key

CIBERTEC

CARRERAS PROFESIONALES

32

A continuacin, se muestra la relacin uno a muchos en una relacin recursiva. Un contrato puede ser la extensin de otro contrato y un contrato puede tener muchas extensiones.

1.3.1.4.2. Relaciones de varios a varios En las relaciones de varios a varios (muchos a muchos), una fila de la tabla A puede tener varias filas coincidentes en la tabla B, y viceversa. Para crear una relacin de este tipo, defina una tercera tabla, denominada tabla de unin, cuya clave principal est formada por las claves externas de las tablas A y B. Por ejemplo, la tabla Autor y la tabla Libro tienen una relacin de varios a varios definida por una relacin de uno a varios entre cada de estas tablas y la tabla Autor_Libro. La clave principal de la tabla Autor_Libro es la combinacin de la columna cod_aut (la clave principal de la tabla Autor) y la columna cod_lib (la clave principal de la tabla Libro). Otro ejemplo: Un contrato puede registrar muchos departamentos y un departamento puede estar registrado en muchos contratos. Para poder implementar esta relacin compleja debemos adicionar una tabla de detalle (DetalleContrato).

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

33

1.3.1.4.3. Relaciones de uno a uno En una relacin de uno a uno, una fila de la tabla A no puede tener ms de una fila coincidente en la tabla B y viceversa. Una relacin de uno a uno se crea si las dos columnas relacionadas son claves principales o tienen restricciones nicas. Este tipo de relacin no es comn porque la mayor parte de la informacin relacionada de esta manera estara en una tabla. Se puede utilizar una relacin de uno a uno para: Dividir una tabla con muchas columnas Aislar parte de una tabla por razones de seguridad Almacenar datos que no se deseen conservar y se puedan eliminar fcilmente con tan slo suprimir la tabla Almacenar informacin aplicable nicamente a un subconjunto de la tabla principal. Implementar entidades especializaciones. del tipo Generalizacin con sus

El lado de la clave principal de una relacin de uno a uno se indica con un smbolo de llave. El lado de la clave externa tambin se indica con un smbolo de llave. El ejemplo, a continuacin, muestra a la tabla USUARIO (generalizacin) relacionndose con la tabla PROPIETARIO (especializacin 1) y la tabla INQUILINO (especializacin 2), de uno a uno.

Ahora que ya conoce el concepto de tablas y el concepto de relaciones, empezar a implementar algunas tablas para distintos casos.

CIBERTEC

CARRERAS PROFESIONALES

34

1.3.1.5.

ACTIVIDADES A DESARROLLAR EN CLASE

Se desea implementar una base de datos para el control de contratos de departamentos entre diferentes edificios. Para ello se cuenta con el siguiente diagrama:

Usando TRANSACT/SQL, cree las siguientes bases de datos: 1. Cree la base de datos Departamentos 2. Active la base de datos Departamentos 3. Cree las tablas mostradas 4. Agregue las llaves Primarias (ADD PRIMARY KEY) 5. Agregue las llaves Forneas y Relaciones (ADD FOREIGN KEY REFERENCES)

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

35

SOLUCIN: Implemente las tablas, las llaves primarias, las llaves forneas y las relaciones paso a paso: SCRIPT EN TRANSACT/SQL SQL SERVER 2008R2
CREATE DATABASE DEPARTAMENTOS GO USE DEPARTAMENTOS

CREATE TABLE CONTRATO ( COD_CONT PROP_COD_USUA INQ_COD_USUA FEC_FIRMA REFERENCIA COD_EST COD_CONT_ORIG )

char(6) NOT NULL, char(6) NULL, char(6) NULL, datetime NOT NULL, varchar(100) NULL, char(6) NOT NULL, char(6) NOT NULL

CREATE TABLE DEPARTAMENTOS ( COD_EDIF char(6) NOT NULL, COD_DEP char(6) NOT NULL, AREA_TOTAL_DEP decimal NOT NULL, AREA_CONSTRUIDA_DEP decimal NOT NULL, NUM_AMB_DEP int NOT NOT NULL, PISO_DEP int NOT NOT NULL, PRECIO_ALQXMES_DEP money NOT NULL, COD_EST char(6) NULL ) CREATE TABLE DETALLECONTRATO ( COD_EDIF char(6) NOT NULL, COD_DEP varchar(6) NOT NULL, COD_CONT char(6) NOT NULL, FEC_INI_ALQ datetime NOT NULL, FEC_FIN_ALQ datetime NOT NULL ) CREATE TABLE EDIFICIOS ( COD_EDIF char(6) NOT NULL, NOM_EDIF varchar(60) NOT NULL, DIRECC_EDIF varchar(60) NOT NULL, CODPOSTAL_EDIF varchar(4) NOT NULL, AREA_TOTAL_EDIF decimal NOT NULL, AREA_CONSTRUIDA_EDIF decimal NOT NULL, REFERENCIA_EDIF varchar(100) NULL, COD_EST char(6) NOT NULL ) CREATE TABLE ESTADO ( COD_EST DESC_EST )

char(6) NOT NULL, varchar(20) NOT NULL

CIBERTEC

CARRERAS PROFESIONALES

36

CREATE TABLE FAMILIARES ( COD_FAMI COD_USUA NOM_FAMI APEPATER_FAMI APEMATER_FAMI GRADO_PARENTES_FAMI )

char(6) NOT NULL, char(6) NOT NULL, varchar(25) NOT NULL, varchar(25) NOT NULL, varchar(25) NOT NULL, varchar(50) NOT NULL

CREATE TABLE INQUILINO ( COD_USUA NOM_AVAL_INQ APELL_AVAL HABER_BAS_INQ EST_CIVIL_INQ LUG_TRAB_INQ )

char(6) NOT NULL, varchar(30) NOT NULL, char(30) NOT NULL, int NOT NULL, char(1) NULL, varchar(50) NULL

CREATE TABLE PROPIETARIO ( COD_USUA char(6) NOT NULL, TIPO _PROP varchar(30) NOT NULL , TELEFONO_PROP char(10) ) CREATE TABLE USUARIO ( COD_USUA NOM_USUA APEPATER_USUA APEMATER_USUA FEC_NAC_USUA FEC_REG_USUA TIPO_DOC_USUA NUM_DOC_USUA COD_EST )

char(6) NOT NULL, varchar(25) NOT NULL, varchar(25) NOT NULL, varchar(25) NOT NULL, datetime NULL, datetime NULL, varchar(20) NOT NULL, char(8) NOT NULL, char(6) NOT NULL

Agregando las llaves primarias a todas las tablas


NONCLUSTERED: Crea un ndice en el que el orden lgico de los valores de clave determina el orden fsico de las filas correspondientes de la tabla.

ALTER TABLE CONTRATO ADD PRIMARY KEY NONCLUSTERED (COD_CONT) ALTER TABLE DEPARTAMENTOS ADD PRIMARY KEY NONCLUSTERED (COD_EDIF, COD_DEP) ALTER TABLE DETALLECONTRATO ADD PRIMARY KEY NONCLUSTERED (COD_EDIF, COD_DEP, COD_CONT) ALTER TABLE EDIFICIOS ADD PRIMARY KEY NONCLUSTERED (COD_EDIF) ALTER TABLE ESTADO ADD PRIMARY KEY NONCLUSTERED (COD_EST) ALTER TABLE FAMILIARES ADD PRIMARY KEY NONCLUSTERED (COD_FAMI, COD_USUA) ALTER TABLE INQUILINO ADD PRIMARY KEY NONCLUSTERED (COD_USUA)

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

37

ALTER TABLE PROPIETARIO ADD PRIMARY KEY NONCLUSTERED (COD_USUA) ALTER TABLE USUARIO ADD PRIMARY KEY NONCLUSTERED (COD_USUA)

Agregando llaves Forneas y relacionando tablas

-- SE CREA LA RELACIN RECURSIVA. ALTER TABLE CONTRATO ADD FOREIGN KEY (INQ_COD_USUA) REFERENCES INQUILINO, FOREIGN KEY (COD_CONT_ORIG) REFERENCES CONTRATO

-- SE CREAN LAS RELACIONES DEL RESTO DE TABLAS. ALTER TABLE CONTRATO ADD FOREIGN KEY (PROP_COD_USUA) REFERENCES PROPIETARIO ALTER TABLE CONTRATO ADD FOREIGN KEY (COD_EST) REFERENCES ESTADO ALTER TABLE DEPARTAMENTOS ADD FOREIGN KEY (COD_EDIF) REFERENCES EDIFICIOS ALTER TABLE DEPARTAMENTOS ADD FOREIGN KEY (COD_EST) REFERENCES ESTADO ALTER TABLE DETALLECONTRATO ADD FOREIGN KEY (COD_CONT) REFERENCES CONTRATO ALTER TABLE DETALLECONTRATO ADD FOREIGN KEY (COD_EDIF, COD_DEP) REFERENCES DEPARTAMENTOS ALTER TABLE EDIFICIOS ADD FOREIGN KEY (COD_EST) REFERENCES ESTADO ALTER TABLE FAMILIARES ADD FOREIGN KEY (COD_USUA) REFERENCES INQUILINO ALTER TABLE INQUILINO ADD FOREIGN KEY (COD_USUA) REFERENCES USUARIO ALTER TABLE PROPIETARIO ADD FOREIGN KEY (COD_USUA) REFERENCES USUARIO ALTER TABLE USUARIO ADD FOREIGN KEY (COD_EST) REFERENCES ESTADO

CIBERTEC

CARRERAS PROFESIONALES

38

1.3.2 Implementacin de restricciones 1.3.2.1. Definicin y uso de los DEFAULTS


Un DEFAULT es un valor por defecto que se puede asignar en un campo cuando el valor de este campo no es insertado en el registro. Las definiciones DEFAULT se pueden utilizar de las siguientes maneras: 1.3.2.1.1. Generarlo cuando se crea la tabla, durante el proceso de definicin de la misma.

CREATE TABLE PROPIETARIO ( COD_USUA TIPO_PROP TELEFONO_PROP ) char(6) NOT NULL, varchar(30) NOT NULL char(11) DEFAULT DESCONOCIDO

1.3.2.1.2. Agregar a una tabla ya existente. Cada columna de una tabla puede contener una sola definicin DEFAULT.

ALTER TABLE CONTRATO ADD DEFAULT DESCONOCIDO FOR TELEFONO_PR

Pueden realizarse modificaciones o eliminaciones, si ya existen definiciones DEFAULT. Por ejemplo, puede modificar el valor que se inserta en una columna cuando no se escribe ningn valor. No se puede crear definiciones DEFAULT para columnas definidas con: Una propiedad IDENTITY2 Una definicin DEFAULT o un objeto DEFAULT ya existentes Cuando se agrega una definicin DEFAULT a una columna existente en una tabla, SQL Server 2008R2 aplica de forma predeterminada el nuevo valor predeterminado slo a las nuevas filas de datos que se agregan a la tabla. Los datos existentes que se insertan mediante la definicin DEFAULT anterior no se ven afectados. No obstante, cuando agregue una nueva columna a una tabla ya existente, puede especificar que SQL Server inserte
2

Crea una columna de identidad en una tabla. Esta propiedad se usa con las instrucciones CREATE TABLE y ALTER TABLE del lenguaje Transact/SQL. Su sintaxis es IDENTITY [(valor inicial, incremento)], donde el valor inicial es el valor entero a partir del cual empezar a contar el campo identity y el incremento es el valor que se agrega al valor de identidad de la fila anterior. Si no se coloca nada se asume que los dos valores son 1. Esta funcin ser detallada en el punto 1.6.

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

39

en la nueva columna el valor predeterminado (especificado mediante la definicin DEFAULT) en vez de un valor NULL para las filas existentes en la tabla. El DEFAULT crea un objeto denominado predeterminado. Cuando se enlaza a una columna o tipo de datos definido por el usuario, un valor predeterminado especifica un valor que debe insertarse en la columna a la que est enlazada el objeto (o en todas las columnas, que estn asociadas al tipo de datos en el caso de un tipo de datos definido por el usuario) cuando no se proporciona explcitamente un valor durante la insercin. Los valores predeterminados, que son una caracterstica de compatibilidad con versiones anteriores, realizan algunas de las mismas funciones que las definiciones predeterminadas creadas mediante la palabra clave DEFAULT de las instrucciones ALTER o CREATE TABLE. Las definiciones predeterminadas son el mtodo preferido y estndar para restringir los datos de columna, debido a que la definicin se almacena con la tabla y se quita automticamente cuando se quita sta. Sin embargo, un valor predeterminado es til cuando se utiliza mltiples veces en mltiples columnas. 1.3.2.1.3. Crear un objeto DEFAULT Crea un objeto denominado valor predeterminado. Cuando se enlaza a un tipo de datos de columna o de alias, un valor predeterminado especifica un valor que debe insertarse en la columna a la que est enlazada el objeto (o en todas las columnas, en el caso de un tipo de datos de alias) si no se proporciona explcitamente un valor durante la insercin. CREATE DEFAULT nombre_default AS <Expresin> 1.3.2.1.3.1. Argumentos Nombre_default Es el nombre del valor predeterminado. Los nombres predeterminados deben cumplir las reglas de los identificadores. Especificar el nombre del propietario del valor predeterminado es opcional. Expresin Una expresin contiene slo valores constantes (no puede contener el nombre de ninguna columna u otros objetos de base de datos). Se puede utilizar cualquier constante, funcin integrada o expresin matemtica. Incluya las constantes de caracteres y fechas entre comillas simples ('); las constantes de moneda, de enteros y de signo flotante no necesitan comillas. Los datos binarios deben precederse de 0x y los datos de moneda deben precederse de un signo de dlar ($). El valor predeterminado debe ser compatible con el tipo de datos de la columna.

CIBERTEC

CARRERAS PROFESIONALES

40

Ejemplo: A. Crear un valor predeterminado Este ejemplo crea un valor predeterminado de carcter denominado 'desconocido'. CREATE DEFAULT telefono AS 'desconocido B. Enlazar un valor predeterminado Este ejemplo enlaza el valor predeterminado creado en el ejemplo A. El valor predeterminado slo entra en efecto si no hay ninguna entrada en la columna Telfono de la tabla ALUMNO. Observe que la falta de entrada no es lo mismo que un valor NULL explcito. SP_BINDEFAULT telefono, 'propietario.telefono_usu' Importante: Esta caracterstica se quitar en una versin futura de Microsoft SQL Server. Evite utilizar esta caracterstica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente la utilizan. En su lugar, use definiciones predeterminadas creadas con la palabra clave DEFAULT de ALTER TABLE o CREATE TABLE desarrollados inicialmente.

1.3.2.2.

Definicin y uso del CHECK CONSTRAINT


Es importante imponer la integridad de dominio, asegurar que slo puedan existir entradas de los tipos o rangos esperados para una columna determinada). SQL Server impone la integridad de dominio a travs del Check Constraint. Una columna puede tener cualquier nmero de restricciones CHECK y la condicin puede incluir varias expresiones lgicas combinadas con AND y OR. Por ello, las restricciones CHECK para una columna se validan en el orden en que se crean. La condicin de bsqueda debe dar como resultado una expresin booleana y no puede hacer referencia a otra tabla. Una restriccin CHECK, en el nivel de columna, slo puede hacer referencia a la columna restringida y una restriccin CHECK, en el nivel de tabla, slo puede hacer referencia a columnas de la misma tabla. Las restricciones CHECK y las reglas sirven para la misma funcin de validacin de los datos durante las instrucciones INSERT y DELETE. Cuando hay una regla y una o ms restricciones CHECK para una columna o columnas, se evalan todas las restricciones. Sintaxis: ALTER TABLE tabla ADD CONSTRAINT nombre_check CHECK (condicin)

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

41

Nombre_check Es el nombre del check constraint Condicin Es una expresin que contiene slo valores constantes (aqu es necesario contener el nombre de alguna columna como parte de la condicin). Ejemplo A. Crear un check constraint que valide las descripciones de la tabla estado ALTER TABLE ESTADO ADD CONSTRAINT CHKDESC_EST CHECK ( DESC_EST IN ('OPERATIVO', 'INOPERATIVO', 'REGULAR')

B. Crear un check constraint desde la creacin de la tabla ESTADO


CREATE TABLE ESTADO ( COD_EST DESC_EST ) char(6) NOT NULL, varchar(20) NOT NULL CHECK ( DESC_EST IN ( 'OPERATIVO', 'INOPERATIVO', 'REGULAR' ) )

1.3.2.3.

Definicin y uso del IDENTITY


Crea una columna de identidad en una tabla. Esta propiedad se usa con las instrucciones CREATE TABLE y ALTER TABLE de Transact-SQL.

Sintaxis:
IDENTITY [ (inicio , incremento) ] Argumentos: Inicio: es el valor que se utiliza para la primera fila cargada en la tabla. Incremento: se trata del valor incremental que se agrega al valor de identidad de la anterior fila cargada.

CIBERTEC

CARRERAS PROFESIONALES

42

Debe especificar tanto el valor de inicializacin como el incremento, o bien ninguno de los dos. Si no se especifica ninguno, el valor predeterminado es (1,1). Ejemplo: --Se activa la base de datos Ventas; luego, se verifica si existe la tabla --new_empleados para eliminarla y proceder a su creacin. USE Ventas IF OBJECT_ID ('dbo.new_empleados', 'U') IS NOT NULL DROP TABLE new_empleados GO CREATE TABLE new_empleados ( id_Emp int IDENTITY(1,1), nombreEmp varchar (20) not null, apePatEmp varchar(30) not null apeMatEmp varchar(30) not null sexo char(1) not null ) --Se ingresan datos a la tabla new_empleados INSERT new_empleados ( nombreEmp, apePatEmp, apeMatEmp, sexo) VALUES ('Lidia', 'Sanchez', 'Vargas', F) INSERT new_empleados ( nombreEmp, apePatEmp, apeMatEmp, sexo) VALUES ('Alfredo', 'Escalante', 'Sifuentes', M)

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

43

1.3.2.4.

ACTIVIDADES PROPUESTAS

Caso: VENTAS Se ha diseado una base de datos para el control de las ventas realizadas en una empresa, como se detalla en el siguiente diagrama:

Se solicita: 1. Cree la base de datos Ventas y luego actvela. 2. Cree las tablas de la base de datos VENTAS, las llaves primarias y forneas deben ser creadas dentro de la generacin de la tabla. 3. Cree las siguientes restricciones: a. Asigne el valor por defecto NO REGISTRA en el campo CORREO_E de la tabla CLIENTE. b. El precio del producto, de la tabla PRODUCTO, debe ser mayor igual a cero (0) pero menor o igual a mil nuevos soles (1000). c. La fecha de nacimiento del empleado debe ser menor a la fecha actual (obtener la fecha de sistema). d. Por defecto establezca el valor TIPO01 en el campo COD_TIPO_PROD de la tabla Producto. e. Cree la tabla CLIENTE_BAK con los mismos campos de la tabla CLIENTE. Aplique la restriccin IDENTITY al campo que ser llave primaria e ingrese 3 registros.

CIBERTEC

CARRERAS PROFESIONALES

44

Resumen

Recuerde que SQL Server es un sistema de administracin de bases de datos relacionales (RDBMS: Relational Database Management System) Cliente/Servidor de alto rendimiento y se ha diseado para admitir un elevado volumen de procesamiento de transacciones (como las de entrada de pedidos en lnea, inventario, facturacin o contabilidad), adems de aplicaciones de almacn de datos y de ayuda en la toma de decisiones (como aplicaciones de anlisis de ventas) sobre redes basadas en el sistema operativo Microsoft. Cuando se crea una nueva base de datos, por defecto se generan dos archivos mdf (datos) y ldf (registro). Los tipos de datos definen el valor de datos que se permite en cada columna. SQL Server proporciona varios tipos de datos diferentes. Recuerde siempre que las tablas son el corazn de las bases de datos relacionales en general y de SQL Server en particular. Las restricciones de integridad aseguran que la clave primaria identifique unvocamente a cada entidad representada de la base de datos y adems aseguran que las relaciones entre entidades de la base de datos se preserven durante las actualizaciones. Si desea saber ms acerca de estos temas, puede consultar las siguientes pginas: http://msdn.microsoft.com/es-es/library/bb500433.aspx Instalacin rpida de SQL Server 2008 R2 http://mredison.wordpress.com/2008/05/27/tutorial-creacin-de-una-bddesdescript-sql-server-2008/ Tutorial sobre la creacin de una base de datos en SQL. http://technet.microsoft.com/es-es/library/ms175198.aspx Libro en pantalla de SQL Server 2008R2 - creacin de una base de datos en SQL. http://msdn.microsoft.com/es-es/library/ms176061.aspx Libros en pantalla de SQL Server 2008R2 Ejemplos. http://technet.microsoft.com/es-es/library/ms174979.aspx Tutorial para investigar el comando Create Table. http://technet.microsoft.com/es-es/library/ms186775.aspx/ Tutorial para investigar la propiedad Identidad (Identity) http://technet.microsoft.com/es-es/library/ms190273.aspx Tutorial para investigar el comando Alter para tablas que han sido creadas

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

45

CIBERTEC

CARRERAS PROFESIONALES

46

UNIDAD DE APRENDIZAJE

MODIFICACIN
DATOS

DEL CONTENIDO DE UNA BASE DE

LOGRO DE LA UNIDAD DE APRENDIZAJE


Al terminar la unidad, los alumnos modificarn el contenido de una base de datos mediante la aplicacin de las tres sentencias del Lenguaje de Manipulacin de Datos (DML) haciendo uso de datos de prueba de un proceso de negocio real.

TEMARIO
2.1 Tema 4: Sentencias DML 2.1.1 Insercin de datos: INSERT 2.1.2 Actualizacin de datos: UPDATE 2.1.3 Eliminacin de datos: DELETE

ACTIVIDADES PROPUESTAS
Emplean comandos SQL para ingresar, modificar o eliminar datos. Emplean los comandos CREATE y DROP para el uso de ndices.

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

47

2.1 Tema 4: Sentencias DML


2.1.1. Sentencia INSERT La sentencia INSERT se utiliza para aadir registros a las tablas de la base de datos. El formato de la sentencia es:

INSERT INTO Nombre_tabla [(nombre_columna1, nombre_columna n..)] VALUES (expr1, expr2, expr n...)

nombre_columna1,

Nombre_Tabla es nicamente el nombre de la tabla donde se desea ingresar los nuevos datos. Nombre_Columna es una lista opcional de nombres de campo en los que se insertarn valores en el mismo nmero y orden que se especificarn en la clusula VALUES. Si no se especifica la lista de campos, los valores de expr en la clusula VALUES deben ser tantos como campos tenga la tabla y en el mismo orden que se definieron al crear la tabla. Expr es una lista de expresiones o valores constantes, separados por comas, para dar valor a los distintos campos del registro que se aadir a la tabla. Las cadenas de caracteres debern estar encerradas entre comillas. 2.1.1.1. Insertar un nico registro Aada un registro a la tabla USUARIO

A. Especificando todos los campos a ingresar. INSERT INTO USUARIO ( COD_USUA, NOM_USUA, APEPATER_USUA, APEMATER_USUA, FEC_NAC_USUA, FEC_REG_USUA, TIPO_DOC_USUA, NUM_DOC_USUA, COD_EST) VALUES (U00001, LUIS, PEREZ, PRADO, 25/02/1989, 02/01/2009, DNI, 23453894, ACTIVO)

Cada sentencia INSERT aade un nico registro a la tabla. En el ejemplo se han especificado los nueve (09) campos con sus respectivos valores. Si no se ingresara valores a un campo, este se cargar con el valor DEFAULT o NULL (siempre y cuando haya sido especificado en la estructura de la tabla). Un valor nulo NULL- no significa blancos o ceros, sino que el campo nunca ha tenido un valor.

B. Especificando nicamente los valores de los campos.

INSERT INTO USUARIO VALUES (U00001, LUIS, PEREZ, PRADO,


25/02/1989, 02/01/2009, DNI, 23453894, ACTIVO)

El ejemplo anterior muestra que podra especificarse nicamente los valores cuando se ingresen en todos los campos de tabla. Si no se especifica la lista de

CIBERTEC

CARRERAS PROFESIONALES

48

campos, los valores en la clusula VALUES deben ser tantos como campos tenga la tabla y en el mismo orden que se definieron al crear la tabla. Si se va a ingresar parcialmente los valores en una tabla, se debe especificar el nombre de los campos a ingresar, como en el ejemplo A. 2.1.1.2 Insertar Mltiples Registros Adems, existe la posibilidad de agregar mltiples registros con ayuda del comando SELECT anteriormente explicado. Veamos un ejemplo: Se tiene la tabla USUARIOS con los siguientes datos:
COD_USUA NOM_USUA APEPATER_USUA APEMATER_USUA FEC_NAC_USUA FEC_REG_USUA COD_EST

U00001 U0002 U0003 U0004 U0005 U0005 U0006 U0007

LUIS JUAN MIGUEL ANA CARLOS MARTHA MILAGROS LUISA

PEREZ MARTELL PAEZ LOZA ARIES MARES LLOSA GRADOS

PRADO TANTAS CONNOR LAOS CERPA MARAVI CORDOVA DEL AGUILA

25/02/1939 12/01/1979 12/108/1958 22/05/1945 12/01/1979 21/07/1977 05/02/1975 03/11/1988

01/01/1970 01/01/1970 01/01/1980 01/01/1970 01/01/1980 01/01/1980 01/01/1970 01/01/1970

ACTIVO ACTIVO INACTIVO ACTIVO INACTIVO INACTIVO ACTIVO ACTIVO

Tambin, tenemos una nueva tabla EJEMPLO, que ha sido creada por nosotros. Adems, contiene los mismos campos o columnas de la tabla USUARIO. ACTIVIDAD 2.1.1.3 Trasladar todos los clientes de la tabla USUARIO, que tengan COD_EST=ACTIVO, a nuestra nueva tabla EJEMPLO. La respuesta sera la siguiente:

INSERT INTO EJEMPLO (COD_USUA, NOM_USUA, APEPATER_USUA, APEMATER_USUA, FEC_NAC_USUA, FEC_REG_USUA, COD_EST) SELECT COD_USUA, NOM_USUA, APEPATER_USUA, APEMATER_USUA, FEC_NAC_USUA, FEC_REG_USUA, COD_EST FROM USUARIO WHERE COD_EST=ACTIVO Como se puede observar, es posible combinar el comando INSERT con las consultas de Seleccin para agregar datos especficos sin tener la necesidad de realizarlo uno por uno.

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

49

2.1.1.3 Crear una tabla a partir de una consulta Utilice la siguiente sintaxis para la creacin de una tabla con datos a partir de una consulta: SELECT * INTO NOMBRENUEVATABLA FROM TABLAEXISTENTE Por ejemplo: SELECT * INTO CLIENTESBAK FROM TB_CLIENTES

2.1.2. Sentencia UPDATE La sentencia UPDATE se utiliza para cambiar el contenido de los registros de una tabla de la base de datos. Su formato es:

UPDATE Nombre_tabla SET nombre_columna1 = expr1, nombre_columna2 = expr2, ... [WHERE { condicin }] Nombre_Tabla es nicamente el nombre de la tabla donde se desea ingresar los nuevos datos. Nombre_columna es el nombre de columna o campo cuyo valor se desea cambiar. En una misma sentencia UPDATE pueden actualizarse varios campos de cada registro de la tabla. Expr es el nuevo valor que se desea asignar al campo que le precede. La expresin puede ser un valor constante o una subconsulta. Las cadenas de caracteres debern estar encerradas entre comillas. Las subconsultas entre parntesis. La clusula WHERE sigue el mismo formato que la vista en la sentencia SELECT y determina qu registros se modificarn.

ACTIVIDAD 2.1.2.1: se le solicita fijar un precio nico para todos los DEPARTAMENTOS. No se utiliza la clusula WHERE.

UPDATE DEPARTAMENTOS SET PRECIO_ALQxMES_DEP = 2000

CIBERTEC

CARRERAS PROFESIONALES

50

ACTIVIDAD 2.1.2.2 : subir el precio de alquiler por mes de un departamento de la tabla de DEPARTAMENTOS en un 10% de aquellos que tengan ms de 100 metros de rea construida:

UPDATE DEPARTAMENTOS SET PRECIO_ALQxMES_DEP = PRECIO_ALQxMES_DEP * 1.1 WHERE AREA_TOTAL_DEP > 100

ACTIVIDAD 2.1.2.3: se le solicita fijar la fecha de registro de un usuario (en la tabla USUARIO) de todos aquellos usuarios que tengan la fecha de registro vaca (nula) a la fecha actual, se escribira:

UPDATE USUARIO SET FEC_REG_USUA = TODAY() WHERE FEC_REG_USUA IS NULL

ACTIVIDAD 2.1.2.4: se le solicita asignar precio a todos los libros que no lo tienen. Ese precio ser el resultante de calcular la media entre los libros que s lo tenan. El ejemplo utilizar una subconsulta:

UPDATE DEPARTAMENTOS SET PRECIO_ALQXMES_DEP = ( SELECT AVG(PRECIO_ALQXMES_DEP) FROM DEPARTAMENTOS WHERE PRECIO_ALQXMES_DEP IS NOT NULL ) WHERE PRECIO IS NULL

2.1.3. DELETE DELETE es especialmente til cuando se desea eliminar varios registros. En una instruccin DELETE con mltiples tablas debe incluir el nombre de tabla (Tabla.*). Si especifica ms de una tabla para eliminar registros, todas deben tener una relacin de muchos a uno. Si desea eliminar todos los registros de una tabla, eliminar la propia tabla es ms eficiente que ejecutar una consulta de borrado. Se puede utilizar DELETE para eliminar registros de una nica tabla o desde varios lados de una relacin uno a muchos. Las operaciones de eliminacin en cascada en una consulta nicamente eliminan desde varios lados de una relacin. Por ejemplo,

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

51

en la base de datos VENTAS, la relacin entre las tablas Clientes y Pedidos, la tabla Pedidos es la parte de muchos, por lo que las operaciones en cascada slo afectarn a la tabla Pedidos. Una consulta de borrado elimina los registros completos, no nicamente los datos en campos especficos. Si desea eliminar valores en un campo especificado, crea una consulta de actualizacin que cambie los valores a Null. Una vez que se han eliminado los registros utilizando una consulta de borrado, no puede deshacer la operacin. Si desea saber qu registros se eliminarn, primero examine los resultados de una consulta de seleccin que utilice el mismo criterio y despus ejecute la consulta de borrado. Mantenga copias de seguridad de sus datos en todo momento. Si elimina los registros equivocados podr recuperarlos desde las copias de seguridad. El formato de la sentencia es:

DELETE FROM Nombre_Tabla [WHERE { condicin }]

Nombre_Tabla es nicamente el nombre de la tabla donde se desea borrar los datos. La clusula WHERE sigue el mismo formato que la vista en la sentencia SELECT y determina qu registros se borrarn. Cada sentencia DELETE borra los registros que cumplen la condicin impuesta o todos si no se indica clusula WHERE.

ACTIVIDAD 2.1.3.1: con esta actividad, se borraran todos los registros de la tabla FAMILIARES cuyo grado de parentesco sea ESPOSA.

DELETE FROM FAMILIARES WHERE GRADO_PARENTES_FAMI=ESPOSA

CIBERTEC

CARRERAS PROFESIONALES

52

2.1.4. ACTIVIDADES A DESARROLLAR EN CLASE Usando TRANSACT/SQL, realice las siguientes actividades en la base de datos VENTAS: 1 2 3 4 5 Inserte tres (3) registros a todas las tablas. Actualice la descripcin del distrito con cdigo L01 por LIMA 01. Inserte el empleado con cdigo EMP1010 , asegrese que resida en el distrito con cdigo L01. Elimine el distrito con descripcin LIMA 01. Es factible realzar esta actividad? Explique. Cree una tabla llamada Copia_Empleado con la misma estructura de la tabla Empleado e Inserte a la tabla Copia_Empleado, todos los empleados de la tabla EMPLEADO, cuyo ao de ingreso se encuentre entre los aos 2006 y 2008. Utilice la siguiente sintaxis para la creacin de una tabla con datos a partir de una consulta : SELECT * INTO NOMBRENUEVATABLA FROM TABLAEXISTENTE 6 Actualice el campo CORREO_E de la tabla CLIENTES de todos los clientes que no tengan correo electrnico (valor NO REGISTRA). Actualice el campo fecha de ingreso y el telfono del empleado con cdigo EMP1001. La fecha de ingreso actualcela por la fecha actual y el campo telfono por el nmero 2471111.

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

53

CIBERTEC

CARRERAS PROFESIONALES

54

UNIDAD DE APRENDIZAJE

3
IMPLEMENTACIN DE CONSULTAS
LOGROS DE LA UNIDAD DE APRENDIZAJE Al terminar la unidad, los alumnos recuperan informacin de una base de datos con el empleo de comandos SQL haciendo uso de mltiples formas con el uso de algunas condiciones de comparacin y funciones para el manejo de campos tipo fecha. Obtienen registros originados por la seleccin de uno o varios grupos haciendo uso de las funciones agrupamiento y columna procedentes de dos o ms tablas.

TEMARIO
3.1 Tema 5: Recuperacin de datos 3.1.1 Introduccin a las consultas. 3.1.2 Uso del SELECT, FROM, WHERE, ORDER BY, INNER JOIN. 3.1.3 Funciones para el manejo de fechas : DAY(), MONTH(), YEAR(), DATEDIFF(), DATEPART() 3.1.4 Manipulacin de consultas condicionales. Uso de condicionales IF EXISTS, AND, y operadores lgicos >, <, =, <>, BETWEEN, IN, OR, NOT, DISTINCT, LIKE. 3.1.5 Ejercicios de aplicacin 3.2 Tema 6: Agrupamiento de datos 3.2.1 Empleo de GROUP BY, HAVING 3.2.2 Empleo de SUM, MIN, MAX, AVG, COUNT. 3.3 Tema 7: Combinacin de tablas 3.3.1 Combinaciones internas 3.3.2 Combinaciones externas

ACTIVIDADES PROPUESTAS
Generan consultas sencillas a la base de datos con el comando SELECT, INNER JOIN y el uso de funciones para el manejo de fechas. Emplean operadores lgicos y condicionales en las consultas SQL a la base de datos. Determinan la necesidad de agrupar la salida de datos de una seleccin. Emplean funciones para calcular la suma, promedio, mnimo, mximo y cantidad de un rango de datos. Emplean combinaciones externas y cruzadas entre tablas para determinar ocurrencias o no.

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

55

3.1 Tema 5 : Recuperacin de datos 3.1.1 Introduccin a las consultas


El lenguaje de consulta estructurado (SQL) es un lenguaje de base de datos normalizado, utilizado por el motor de base de datos de Microsoft. SQL se utiliza para crear objetos QueryDef, como el argumento de origen del mtodo OpenRecordSet y como la propiedad RecordSource del control de datos. Tambin se puede utilizar con el mtodo Execute para crear y manipular directamente las bases de datos DEPARTAMENTOS y crear consultas SQL de paso, para manipular bases de datos remotas cliente - servidor. Las consultas de seleccin se utilizan para indicar al motor de datos que devuelva informacin de las bases de datos. Esta informacin es devuelta en forma de conjunto de registros que se pueden almacenar en un objeto recordset. Este conjunto de registros es modificable. 3.1.2 Uso del comando SELECT ALIAS - INNER JOIN 3.1.2.1 Comando SELECT La sintaxis bsica de una consulta de seleccin es la siguiente: SELECT Campos FROM Tabla En donde campos es la lista de campos que se deseen recuperar y tabla es el origen de los mismos, por ejemplo: SELECT * FROM CONTRATO Esta consulta devuelve un recordset con todos los campos de la tabla CONTRATO. SELECT COD_CONT, PRO_COD_USUA FROM CONTRATO Esta consulta devuelve un recordset con PRO_COD_USUA de la tabla CONTRATO. 3.1.2.1.1 Ordenar los registros Adicionalmente se puede especificar el orden en que se desean recuperar los registros de las tablas mediante la clusula ORDER BY (Lista de Campos). En donde Lista de campos representa los campos a ordenar. Ejemplo: SELECT * FROM USUARIO ORDER BY APEPATER_USUA los campos COD_CONT y

CIBERTEC

CARRERAS PROFESIONALES

56

Esta consulta devuelve todos los campos de la tabla USUARIO ordenados por el campo apellido paterno del usuario. Se pueden ordenar los registros por ms de un campo, como por ejemplo: SELECT APEPATER_FAMI, APEMATER_FAMI, NOM_FAMI FROM FAMILIARES ORDER BY APEPATER_FAMI, APEMATER_FAMI Incluso, se puede especificar el orden de los registros: ascendente mediante la clusula (ASC -se toma este valor por defecto) descendente (DESC) SELECT COD_CONT, FEC_INI_ALQ, FEC_FIN_ALQ FROM DETALLECONTRATO ORDER BY COD_CONT ASC,FEC_INI_ALQ DESC

3.1.2.1.2. CONSULTAS CON PREDICADO El predicado se incluye entre la clusula y el primer nombre del campo a recuperar, los posibles predicados son los siguientes: Predicado ALL TOP DISTINCT Descripcin Devuelve todos los campos de la tabla Devuelve un determinado nmero de registros de la tabla Omite los registros cuyos campos seleccionados coincidan totalmente Omite los registros duplicados que estn borrados en la totalidad del registro y no slo en los campos seleccionados

DISTINCTROW

3.1.2.1.2.1. ALL Si no se incluye ninguno de los predicados se asume ALL. El motor de base de datos selecciona todos los registros que cumplen las condiciones de la instruccin SQL. No es conveniente abusar de este predicado ya que obligamos al motor de la base de datos a analizar la estructura de la tabla para averiguar los campos que contiene. Por ello, es mucho ms rpido indicar el listado de campos deseados. SELECT ALL * FROM FAMILIARES SELECT * FROM FAMILIARES

3.1.2.1.2.2. TOP Devuelve un cierto nmero de registros que entran al principio o al final de un rango especificado por una clusula ORDER BY. Supongamos que queremos

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

57

recuperar los nombres de los cinco (05) primeros recordset de la tabla familiares ordenados por apellido paterno en forma descendente:

SELECT TOP 5

APEPATER_FAMI, APEMATER_FAMI, NOM_FAMI

FROM FAMILIARES ORDER BY APEPATER_FAMI DESC Si no se incluye la clusula ORDER BY, la consulta devolver un conjunto arbitrario de cinco (05) registros de la tabla familiares. El predicado TOP no elige entre valores iguales.

3.1.2.1.2.3.

TOP PERCENT

Se puede utilizar la palabra reservada PERCENT para devolver un cierto porcentaje de registros que estn al principio o al final de un rango especificado por la clusula ORDER BY. Supongamos que en lugar de los cinco (05) primeros familiares, deseamos el veinte por ciento (20%) por ciento de la tabla de familiares: SELECT TOP 20 PERCENT APEPATER_FAMI, APEMATER_FAMI, NOM_FAMI

FROM FAMILIARES ORDER BY APEPATER_FAMI DESC El valor que va a continuacin de TOP debe ser un Integer sin signo. TOP no afecta a la posible actualizacin de la consulta. 3.1.2.1.2.4. DISTINCT

Omite los registros que contienen datos duplicados en los campos seleccionados. Para que los valores de cada campo listado en la instruccin SELECT se incluyan en la consulta deben ser nicos. Por ejemplo, varios edificios listados en la tabla edificios pueden tener el mismo nombre. Si dos registros contienen Los Cipreses en el campo nombre, la siguiente instruccin SQL devuelve un nico registro: SELECT DISTINCT NOM_EDIF FROM EDIFICIOS En otras palabras, el predicado DISTINCT devuelve aquellos registros cuyos campos indicados en la clusula SELECT posean un contenido diferente. El resultado de una consulta que utiliza DISTINCT no es actualizable y no refleja los cambios subsiguientes realizados por otros usuarios.

CIBERTEC

CARRERAS PROFESIONALES

58

3.1.2.1.2.5. DISTINCTROW Devuelve los registros diferentes de una tabla. A diferencia del predicado anterior que slo se fijaba en el contenido de los campos seleccionados, ste lo hace en el contenido del registro completo, independientemente de los campos indicados en la clusula SELECT. SELECT DISTINCTROW NOM_FAMI, APEPATER_FAMI, APEMATER_FAMI FROM FAMILIARES Si la tabla empleados contiene dos registros: Antonio Lpez y Marta Lpez el ejemplo del predicado DISTINCT devuelve un nico registro con el valor Lpez en el campo Apellido ya que busca no duplicados en dicho campo. Este ltimo ejemplo devuelve dos registros con el valor Lpez en el apellido ya que se buscan no duplicados en el registro completo. 3.1.2.2. ALIAS

En determinadas circunstancias es necesario asignar un nombre a alguna columna determinada de un conjunto devuelto, otras veces por simple capricho o por otras circunstancias. Para resolver todas ellas tenemos la palabra reservada AS que se encarga de asignar el nombre que deseamos a la columna deseada. Tomado como referencia el ejemplo anterior podemos hacer que la columna devuelta por la consulta, en lugar de llamarse apellido (igual que el campo devuelto) se llame Empleado. En este caso, procederamos de la siguiente forma: SELECT DISTINCTROW NOM_FAMI AS nombre_del_Familiar FROM FAMILIARES

3.1.2.3. CONSULTAS DE UNIN INTERNAS ( INNER) Las vinculaciones entre tablas se realizan mediante la clusula INNER que combina registros de dos tablas siempre que haya concordancia de valores en un campo comn. Su sintaxis es de la siguiente forma: SELECT campos FROM tb1 INNER JOIN tb2 ON tb1.campo1 comp tb2.campo2 En donde: tb1, tb2 Son los nombres de las tablas desde las que se combinan los registros. campo1, campo2 Son los nombres de los campos que se combinan. Si no son numricos, los campos deben ser del mismo tipo de datos y contener el mismo tipo de datos, pero no tienen que tener el mismo nombre.

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

59

comp Es cualquier operador de comparacin relacional: =, <, >, <=, >=, o <>. Se puede utilizar una operacin INNER JOIN en cualquier clusula FROM. Esto crea una combinacin por equivalencia, conocida tambin como unin interna. Las combinaciones aqu son las ms comunes; stas combinan los registros de dos tablas siempre que haya concordancia de valores en un campo comn a ambas tablas. Se puede utilizar INNER JOIN con las tablas DEPARTAMENTOS y EMPLEADOS para seleccionar todos los empleados de cada departamento. Por el contrario, para seleccionar todos los DEPARTAMENTOS (incluso si alguno de ellos no tiene ningn empleado asignado) se emplea LEFT JOIN o todos los empleados (incluso si alguno no est asignado a ningn departamento), en este caso RIGHT JOIN. Si se intenta combinar campos que contengan datos Memo u Objeto OLE3, se produce un error. Se pueden combinar dos campos numricos cualesquiera, incluso si son de diferente tipo de datos. Por ejemplo, puede combinar un campo Numrico para el que la propiedad Size de su objeto Field est establecida como Entero, y un campo Contador. El ejemplo siguiente muestra cmo podra combinar las tablas EDIFICIOS y DEPARTAMENTOS basndose en el campo COD_EDIF.: SELECT EDIFICIOS.NOM_EDIF, DEPARTAMENTOS.COD_DEP, DEPARTAMENTOS.AREA_TOTAL_DEP FROM EDIFICIOS INNER JOIN DEPARTAMENTOS ON EDIFICIOS.COD_EDIF = DEPARTAMENTOS.COD_EDIF Usando alias : SELECT E.NOM_EDIF as Nombre Edificio, D.COD_DEP as Cdigo dep., D.AREA_TOTAL_DEP as rea total dep. FROM EDIFICIOS AS E INNER JOIN DEPARTAMENTOS AS D ON E.COD_EDIF = D.COD_EDIF En el ejemplo anterior, COD_EDIF es el campo combinado, pero no est incluido en la salida de la consulta ya que no se considera en la instruccin SELECT. Para incluir el campo combinado, se debe agregar el nombre del campo en la
3

Un objeto OLE (Object Linking and Embedding) significa el estndar de vinculacin e incrustacin de objetos. OLE es un entorno unificado de servicios basados en objetos con la capacidad de personalizar esos servicios y de ampliar la arquitectura a travs de servicios personalizados, con la finalidad global de permitir una integracin entre los componentes. OLE proporciona un estndar consistente que permite a los objetos, aplicaciones y componentes ActiveX, comunicarse entre s con la finalidad de usar el cdigo de los dems. Los objetos no necesitan conocer por anticipado en qu objetos se van a comunicar, ni su cdigo necesita estar escrito en el mismo lenguaje.

CIBERTEC

CARRERAS PROFESIONALES

60

instruccin SELECT, en este caso EDIFICIOS.COD_EDIF o E.COD_EDIF, si usa alias. Tambin, se pueden enlazar varias clusulas ON en una instruccin JOIN, utilizando la sintaxis siguiente: SELECT campos FROM tabla1 INNER JOIN tabla2 ON tb1.campo1 comp tb2.campo1 and ON tb1.campo2 comp tb2.campo2)] Tambin, puede anidar instrucciones JOIN utilizando la siguiente sintaxis:

SELECT campos FROM tabla1 INNER JOIN tabla2 ON tb1.campo1 comp tb2.campo2 INNER JOIN tabla3 ON tb2.campo2 comp tb3.campo3)]

Un LEFT JOIN o un RIGHT JOIN puede anidarse dentro de un INNER JOIN, pero un INNER JOIN no puede anidarse dentro de un LEFT JOIN o un RIGHT JOIN.

Ejemplo: SELECT USUARIO.NOM_USUA, CONTRATO.FEC_FIRMA FROM PROPIETARIO INNER JOIN CONTRATO ON PROPIETARIO.COD_USUA = CONTRATO.PROP_COD_USUA INNER JOIN USUARIO ON USUARIO.COD_USUA = PROPIETARIO.COD_USUA . Si se emplea la clusula INNER en la consulta se seleccionarn slo aquellos registros de la tabla de la que hayamos escrito a la izquierda de INNER JOIN que contengan al menos un registro de la tabla que hayamos escrito a la derecha. Para solucionar esto tenemos dos clusulas que sustituyen a la palabra clave INNER, estas clusulas son LEFT y RIGHT. LEFT toma todos los registros de la tabla de la izquierda aunque no tengan ningn registro en la tabla de la izquierda. RIGHT realiza la misma operacin pero al contrario, toma todos los registros de la tabla de la derecha aunque no tenga ningn registro en la tabla de la izquierda.

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

61

3.1.3. Funciones para el manejo de fechas

Funcin GETDATE() DAY(fecha) MONTH(fecha) YEAR(fecha)

Descripcin Devuelve la fecha del da Devuelve un entero que representa el da (da del mes) de la fecha especificada Devuelve un entero que representa el mes de la fecha especificada Devuelve un entero que representa la parte del ao de la fecha especificada Devuelve el nmero de lmites datepart de fecha y hora entre dos fechas especificadas.
DATEDIFF ( parte , fechaInicio , fechaFin)

DATEDIFF(parte,fi,ff) Devuelve un entero que representa el parmetro parte especificado (dia, mes o ao) del parmetro DATEPART(parte,fecha) fecha especificada.

3.1.3.1.

Muestre el cdigo, el apellido y la edad de los usuarios

SELECT COD_USUA, APEPATER_USUA, DATEDIFF(YY,FEC_NAC_USUA,GETDATE()) 'EDAD DEL USUARIO' FROM USUARIO 3.1.3.2. Muestre el cdigo y los meses transcurridos desde la firma del contrato

SELECT COD_CONT, DATEDIFF(MM,FEC_FIRMA,GETDATE()) AS 'MESES TRANSCURRIDOS' FROM CONTRATO 3.1.3.3. Muestre el cdigo del contrato, el da, mes y ao en que se firm el contrato

--SOLUCION 1 SELECT COD_CONT, FEC_FIRMA, DATEPART(DD,FEC_FIRMA) AS DIA , DATEPART(MM,FEC_FIRMA) AS MES , DATEPART(YY,FEC_FIRMA) AS AO FROM CONTRATO --SOLUCION 2 SELECT COD_CONT, FEC_FIRMA, DAY(FEC_FIRMA) AS DIA, MONTH(FEC_FIRMA) AS MES, YEAR(FEC_FIRMA) AS AO FROM CONTRATO

CIBERTEC

CARRERAS PROFESIONALES

62

3.1.3.4.

Muestre el cdigo del contrato, el da, mes y ao en que se firm el contrato

SELECT

COD_CONT, DATEPART(DW,FEC_FIRMA) AS 'DIA DE LA SEMANA (1-7)', DATEPART(DD,FEC_FIRMA) AS 'DIA DEL CONTRATO (1-31)', DAY(FEC_FIRMA) AS 'DIA DEL CONTRATO (1-31)', DATENAME(DW,FEC_FIRMA) AS 'NOMBRE DEL DIA (MONDAY-SUNDAY)' FROM CONTRATO

3.1.3.5. ACTIVIDADES A DESARROLLAR EN CLASE Usando TRANSACT/SQL, realice las siguientes actividades: De la base de datos VENTAS 1. 2. Muestre los 5 primeros productos ms caros. Muestre todos los datos del 20% de los clientes del tipo persona jurdica registrada, ordenada por su razn social de manera ascendente. 3. Muestre la descripcin de todos los empleados registrados y la descripcin del distrito donde residen. 4. Muestre la descripcin de todos los clientes que hayan nacido entre los meses de febrero y marzo. 5. 6. Muestre los datos de las boletas con sus detalles emitidos entre los aos 2007 y 2009. Muestre los datos de todos los clientes que tienen correo electrnico, ordenados por el apellido paterno del cliente que residen en los distritos de Lince, San Isidro y Jess Maria.

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

63

3.1.4. Manipulacin de consultas condicionales 3.1.4.1. Consultas con el comando exists

El predicado EXISTS (con la palabra reservada NOT opcional) se utiliza en comparaciones de verdadero o falso para determinar si la subconsulta devuelve algn registro. Supongamos que se desea determinar el rea total de un departamento en un edificio: SELECT DEPARTAMENTOS.AREA_TOTAL_DEP FROM DEPARTAMENTOS WHERE EXISTS ( SELECT * FROM EDIFICIOS WHERE EDIFICIOS.COD_DEP = DEPARTAMENTOS. COD_DEP )

3.1.4.2. Criterios de seleccin Anteriormente se vio la forma de recuperar los registros de las tablas, las formas empleadas devolvan todos los registros de la mencionada tabla. A lo largo de esta sesin se estudiarn las posibilidades de filtrar los registros con el fin de recuperar solamente aquellos que cumplan unas condiciones preestablecidas. Antes de comenzar el desarrollo de esta sesin hay que recalcar tres detalles de vital importancia. El primero de ellos es que cada vez que se desee establecer una condicin referida a un campo de texto la condicin de bsqueda debe ir encerrada entre comillas simples; la segunda es que no se posible establecer condiciones de bsqueda en los campos memo y la tercera hace referencia a las fechas. Las fechas se deben escribir siempre en formato mm-dd-aa en donde mm representa el mes, dd el da y aa el ao. Se debe tomar en cuenta los separadores (guin), no siendo til la separacin habitual de la barra (/), por lo que se debe utilizar el guin (-) y adems la fecha debe ir encerrada entre almohadillas (#). Por ejemplo si deseamos referirnos al da 3 de Septiembre de 1995 deberemos hacerlo de la siguiente forma; #09-03-95# #9-3-95#. 3.1.4.3. Operadores lgicos

Los operadores lgicos soportados por SQL son: AND, OR, XOR, Eqv, Imp, Is y Not. A excepcin de los dos ltimos todos poseen la siguiente sintaxis: <expresin1> operador <expresin2>

En donde expresin1 y expresin2 son las condiciones a evaluar, el resultado de la operacin vara en funcin del operador lgico. La tabla adjunta muestra los diferentes posibles resultados:

CIBERTEC

CARRERAS PROFESIONALES

64

<expresin1> Verdad Verdad Falso Falso Verdad Verdad Falso Falso Verdad Verdad Falso Falso Verdad Verdad Falso Falso Verdad Verdad Verdad Falso Falso Falso Null Null Null

Operador AND AND AND AND OR OR OR OR XOR XOR XOR XOR Eqv Eqv Eqv Eqv Imp Imp Imp Imp Imp Imp Imp Imp Imp

<expresin2> Falso Verdad Verdad Falso Falso Verdad Verdad Falso Verdad Falso Verdad Falso Verdad Falso Verdad Falso Verdad Falso Null Verdad Falso Null Verdad Falso Null

Resultado Falso Verdad Falso Falso Verdad Verdad Verdad Falso Falso Verdad Verdad Falso Verdad Falso Falso Verdad Verdad Falso Null Verdad Verdad Verdad Verdad Null Null

Si a cualquiera de las anteriores condiciones le anteponemos el operador NOT el resultado de la operacin ser el contrario al devuelto sin el operador NOT. El ltimo operador denominado Is se emplea para comparar dos variables de tipo objeto <Objeto1> Is <Objeto2>. Este operador devuelve verdad si los dos objetos son iguales.

SELECT NOM_AVAL_INQ, EST_CIVIL_INQ FROM INQUILINO WHERE HABER_BAS_INQ>500 AND HABER_BAS_INQ<1000

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

65

SELECT NOM_AVAL_INQ, EST_CIVIL_INQ FROM WHERE INQUILINO ( HABER_BAS_INQ>=500 AND HABER_BAS_INQ<=1000 ) OR EST_CIVIL_INQ=C --"casado" ---SELECT * FROM DEPARTAMENTOS WHERE NOT COD_DEP ="301" ---SELECT COD_DEP, FROM WHERE

NUM_AMB_DEP, AREA_TOTAL_DEP

DEPARTAMENTOS (NUM_AMB_DEP>=1 AND NUM_AMB_DEP<=3) OR (AREA_TOTAL_DEP>100 AND AREA_TOTAL_DEP<150)

3.1.4.4.

Intervalos de valores - BETWEEN

Para indicar que deseamos recuperar los registros segn el intervalo de valores de un campo, emplearemos el operador Between cuya sintaxis es de la siguiente manera: campo [Not] Between valor1 And valor2 (la condicin Not es opcional) En este caso la consulta devolvera los registros que contengan un "campo" con el valor incluido en el intervalo valor1, valor2 (ambos inclusive). Si anteponemos la condicin Not devolver aquellos valores no incluidos en el intervalo. SELECT NOM_AVAL_INQ, EST_CIVIL_INQ FROM INQUILINO WHERE HABER_BAS_INQ Between 500 AND 1000

--Equivalente usando el operador lgico AND SELECT NOM_AVAL_INQ, EST_CIVIL_INQ FROM INQUILINO WHERE HABER_BAS_INQ >= 500 AND HABER_BAS_INQ <= 1000

(Devuelve los haberes bsicos entre 500 y 1000; se considera el intervalo)

CIBERTEC

CARRERAS PROFESIONALES

66

3.1.4.5.

El operador LIKE

Se utiliza para comparar una expresin de cadena con un modelo en una expresin SQL. Su sintaxis es de la siguiente manera: expresin Like modelo En donde, expresin es una cadena modelo o campo contra el que se compara expresin. Se puede utilizar el operador Like para encontrar valores en los campos que coincidan con el modelo especificado. De acuerdo con el modelo empleado, se puede especificar un valor completo (Ana Mara) o se pueden utilizar caracteres comodn como los reconocidos por el sistema operativo para encontrar un rango de valores (Like An%). El operador Like se puede utilizar en una expresin para comparar un valor de un campo con una expresin de cadena. Por ejemplo, si introduce Like C% en una consulta SQL, la consulta devuelve todos los valores de campo que comiencen por la letra C. En una consulta con parmetros, puede hacer que el usuario escriba el modelo que se va a utilizar. El ejemplo siguiente devuelve los datos que comienzan con la letra P seguido de cualquier letra entre A y F y de tres dgitos:

Like 'P[A-F]###' Este ejemplo devuelve los campos cuyo contenido empiece con una letra de la A a la D seguidas de cualquier cadena.

Like '[A-D]%' En la tabla siguiente se muestra cmo utilizar el operador Like para comprobar expresiones con diferentes modelos.

Tipo de coincidencia Varios caracteres Carcter especial Varios caracteres Un solo carcter Un solo dgito Rango de caracteres

Modelo Planteado 'a%a' 'a[*]a' 'ab%' 'a?a' 'a#a' '[a-z]'

Coincide 'aa', 'aBa', 'aBBBa' 'a*a' 'abcdefg', 'abc', ab 'aaa', 'a3a', 'aBa' 'a0a', 'a1a', 'a2a' 'f', 'p', 'j'

No coincide 'aBC' 'aaa' 'cab', 'aab' 'aBBBa' 'aaa', 'a10a' '2', '&'

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

67

Tipo de coincidencia Fuera de un rango Distinto de un dgito Combinada

Modelo Planteado '[!a-z]' '[!0-9]' 'a[!b-m]#'

Coincide '9', '&', '%' 'A', 'a', '&', '~' 'An9', 'az0', 'a99'

No coincide 'b', 'a' '0', '1', '9' 'abc', 'aj0'

3.1.4.6.

El operador IN

Este operador devuelve aquellos registros cuyo campo indicado coincide con alguno de los en una lista. Su sintaxis es la siguiente: expresin [Not] In(valor1, valor2, . . .)

Ejemplo: SELECT FROM WHERE NOM_FAMI, APEPATER_FAMI, APEMATER_FAMI FAMILIARES APEPATER_FAMI IN ("PEREZ","CABANILLAS",SANCHEZ)

3.1.4.7.

LA CLUSULA WHERE

La clusula WHERE puede usarse para determinar qu registros de las tablas enumeradas en la clusula FROM aparecern en los resultados de la instruccin SELECT. Despus de escribir esta clusula se deben especificar las condiciones expuestas en los puntos anteriores de la presente sesin. Si no se emplea esta clusula, la consulta devolver todas las filas de la tabla. WHERE es opcional, pero cuando aparece debe ir a continuacin de FROM.

SELECT FROM WHERE

COD_DEP, AREA_TOTAL_DEP, AREA_CONSTRUIDA_DEP DEPARTAMENTOS NUM_AMB_DEP>3

SELECT FROM WHERE

COD_DEP, AREA_TOTAL_DEP, AREA_CONSTRUIDA_DEP DEPARTAMENTOS AREA_CONSTRUIDA_DEP>=150 AND NUM_AMB_DEP>3

CIBERTEC

CARRERAS PROFESIONALES

68

3.1.5. Ejercicios de aplicacin

Usando TRANSACT/SQL, realice las siguientes actividades en la base de datos VENTAS: 1. Muestre los datos de los productos cuyo precio se encuentra entre 1 y 18.5, cuya descripcin del producto empiece con las letras A a la D. 2. Muestre todos los datos de los clientes del tipo persona natural registrados cuyo telfono empiece con los dgitos 247 y su correo termine con @hotmail.com, ordenados por su apellido paterno de manera ascendente y en coincidencias por su apellido materno de manera descendente. 3. Muestre la descripcin de todos los empleados registrados y la descripcin del distrito donde residen pero nicamente muestre a los que residen en los distritos de Magdalena, San Isidro y Miraflores. 4. Muestre la descripcin de todos los clientes que hayan nacido entre el mes de enero y abril. Use la clusula BETWEEN. 5. Muestre los datos de las boletas con sus detalles emitidos entre los aos 2007 y 2011. Use la clusula BETWEEN. 6. Muestre las boletas emitidas por los vendedores con apellido paterno ALVA, GOMEZ o PEREZ. Ordenado por fecha de emisin de las boletas, en

coincidencias ordenarlo por apellido del vendedor.

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

69

3.2.

Tema 6 : Agrupamiento de datos

3.2.1. Empleo de GROUP BY y HAVING Combina los registros con valores idnticos, en la lista de campos especificados, en un nico registro. Para cada registro, se crea un valor sumario si se incluye una funcin SQL agregada, como SUM o COUNT (como veremos despus), en la instruccin SELECT. Su sintaxis es la siguiente:

SELECT CAMPOS FROM TABLA WHERE CRITERIO GROUP BY CAMPOS DEL GRUPO

3.2.1.1. GROUP BY Es opcional. Los valores de resumen se omiten si no existe una funcin SQL agregada en la instruccin SELECT. Los valores NULL en los campos GROUP BY se agrupan y no se omiten. No obstante, los valores NULL no se evalan en ninguna de las funciones SQL agregadas. Se utiliza la clusula WHERE para excluir aquellas filas que no desea agrupar, y la clusula HAVING para filtrar los registros una vez agrupados. A menos que contenga un dato Memo, un campo de la lista de campos GROUP BY puede referirse a cualquier campo de las tablas que aparecen en la clusula FROM, incluso si el campo no esta incluido en la instruccin SELECT, siempre y cuando esta instruccin incluya al menos una funcin SQL agregada. Todos los campos de la lista de campos de la instruccin SELECT deben incluirse en la clusula GROUP BY o como argumentos de una funcin SQL agregada. ACTIVIDAD 3.2.1.1.1 SELECT COD_EDIF, COUNT(COD_DEP) FROM DEPARTAMENTOS GROUP BY COD_EDIF

Una vez que GROUP BY ha combinado los registros, HAVING muestra cualquier registro agrupado por la clusula GROUP BY que satisfaga las condiciones de la clusula HAVING. HAVING es similar a WHERE, determina qu registros se seleccionan. Una vez que los registros se han agrupado utilizando GROUP BY, HAVING determina cules de

CIBERTEC

CARRERAS PROFESIONALES

70

ellos se van a mostrar. El siguiente ejemplo lista a los edificios que poseen ms de 22 departamentos. ACTIVIDAD 3.2.1.1.2

SELECT COD_EDIF, COUNT(COD_DEP) FROM DEPARTAMENTOS GROUP BY COD_EDIF HAVING COUNT(COD_DEP) > 22

Ejemplo prctico: Supongamos que tenemos los siguientes datos de la tabla DEPARTAMENTOS

COD_EDIF EDF001 EDF001 EDF002 EDF003 EDF003

COD_DEP DEP101 DEP102 DEP202 DEP103 DEP304

PRECIO_ALQXMES_DEP 200 250 200 230 190

Supongamos adems DETALLECONTRATO COD_CONT CNT001 CNT001 CNT002 CNT003 CNT003

que

tenemos

los

siguientes

datos

de

la

tabla

COD_EDIF EDF001 EDF001 EDF002 EDF003 EDF003

COD_DEP DEP101 DEP102 DEP202 DEP103 DEP304

FEC_INI_ALQ 11/04/2008 22/05/2007 01/07/2007 02/03/2008 01/05/2007

FEC_FIN_ALQ 10/04/2010 22/08/2009 01/08/2009 02/06/2009 01/08/2009

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

71

ACTIVIDAD 3.2.1.1.3
Se solicita mostrar el nmero de contrato y el monto acumulado por cada contrato.

SELECT DET.COD_CONT, MONTO=SUM(DEP.PRECIO_ALQXMES_DEP * (DATEDIFF(MM,DET.FEC_INI_ALQ,DET.FEC_FIN_ALQ))) FROM DEPARTAMENTOS DEP, DETALLECONTRATO DET WHERE DEP.COD_EDIF.=DET.COD_EDIF. AND DEP.COD_DEP=DET.COD_DEP GROUP BY DET.COD_CONT

ACTIVIDAD 3.2.1.1.4. Haciendo uso de la clusula HAVING se filtran los datos agrupados obtenidos y se muestra solamente los que tengan un MONTO ACUMULADO mayor de 1,000 soles. La solucin sera la siguiente:

SELECT DET.COD_CONT, MONTO=SUM(DEP.PRECIO_ALQXMES_DEP * DATEDIFF ( MM,DET.FEC_INI_ALQ,DET.FEC_FIN_ALQ ) ) FROM DEPARTAMENTOS DEP, DETALLECONTRATO DET WHERE DEP.COD_EDIF.=DET.COD_EDIF. AND DEP.COD_DEP=DET.COD_DEP GROUP BY DET.COD_CONT HAVING SUM(DEP.PRECIO_ALQXMES_DEP * DATEDIFF(MM,DET.FEC_INI_ALQ,DET.FEC_FIN_ALQ)) > 1000

CIBERTEC

CARRERAS PROFESIONALES

72

3.2.2. Empleo de funciones agregadas 3.2.2.1. Funcin SUM Devuelve la suma del conjunto de valores contenido en un campo especfico de una consulta. Su sintaxis es:

SELECT SUM (EXPR) FROM TABLA

En donde EXPR debe ser un valor numrico y representa el nombre del campo que contiene los datos que desean sumarse o una expresin que realiza un clculo utilizando los datos de dichos campos. Los operandos de EXPR pueden incluir el nombre de un campo de una tabla, una constante o una funcin (la cual puede ser intrnseca o definida por el usuario pero no otras de las funciones agregadas de SQL). ACTIVIDAD 3.2.2.1.1 Mostrar el total de rea construida por cdigo de edificio. SELECT COD_EDIF, SUM(AREA_CONSTRUIDA_DEP) AS AREATOTALCONSTRUIDA FROM DEPARTAMENTOS GROUP BY COD_EDIF

3.2.2.2 Funcin AVG Calcula la media aritmtica de un conjunto de valores CONTENIDO en un campo especificado de una consulta. Su sintaxis es la siguiente:

SELECT AVG(EXPR) FROM TABLA

En donde EXPR representa el campo que contiene los datos numricos para los que se desea calcular la media o una expresin que realiza un clculo utilizando los datos de dicho campo. La media calculada por AVG es la media aritmtica (la suma de los valores dividido por el nmero de valores). La funcin AVG no incluye ningn campo NULL en el clculo.

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

73

ACTIVIDAD 3.2.2.2.1 Calcular la edad promedio de los usuarios. SELECT AVG(DATEDIFF(YY,FEC_NAC_USUA,GETDATE())) AS EDADPROMEDIO FROM USUARIO

3.2.2.3 Funciones MIN y MAX Devuelven el mnimo o el mximo de un conjunto de valores CONTENIDO en un campo especifico de una consulta. Su sintaxis es la siguiente:

SELECT MIN(EXPR) FROM TABLA --SELECT MAX(EXPR) FROM TABLA --SELECT MIN(EXPR) , MAX(EXPR) FROM TABLA

En donde EXPR es el campo sobre el que se desea realizar el clculo. EXPR puede incluir el nombre de un campo de una tabla, una constante o una funcin (la cual puede ser intrnseca o definida por el usuario pero no otras de las funciones agregadas de SQL). ACTIVIDAD 3.2.2.3.1 Calcular el haber mnimo y el haber mximo de los inquilinos.

3.2.2.4. Funcin COUNT Calcula el nmero de registros devueltos por una consulta. Su sintaxis es la siguiente:

SELECT COUNT(EXPR) FROM TABLA

CIBERTEC

CARRERAS PROFESIONALES

74

En donde EXPR contiene el nombre del campo que desea contar. Los operandos de EXPR pueden incluir el nombre de un campo de una tabla, una constante o una funcin (la cual puede ser intrnseca o definida por el usuario pero no otras de las funciones agregadas de SQL). Puede contar cualquier tipo de datos, incluso texto. Aunque EXPR puede realizar un clculo sobre un campo, COUNT simplemente cuenta el nmero de registros sin tener en cuenta qu valores se almacenan en los registros. La funcin COUNT no cuenta los registros que tienen campos NULL a menos que EXPR sea el carcter comodn asterisco (*). Si utiliza un asterisco, COUNT calcula el nmero total de registros, incluyendo aquellos que contienen campos NULL. COUNT(*) es considerablemente ms rpido que COUNT(Campo). No se debe poner el asterisco entre dobles comillas ('*'). Para contar sin repetir los valores considerar la siguiente sintaxis:

SELECT COUNT (distinct campo) FROM TABLA

ACTIVIDAD 3.2.2.4.1 Mostrar la cantidad de usuarios registrados.

SELECT COUNT(*) AS TOTAL FROM USUARIO

Si EXPR identifica a mltiples campos, la funcin COUNT cuenta un registro slo si al menos uno de los campos no es NULL. Si todos los campos especificados son NULL, no se cuenta el registro. Hay que separar los nombres de los campos con +

SELECT COUNT(NOM_USUA + APEPATER_USUA) AS TOTAL FROM USUARIO

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

75

3.2.2.5.

ACTIVIDADES A DESARROLLAR EN CLASE

Usando TRANSACT/SQL, realice las siguientes actividades: En la base de datos DEPARTAMENTOS. 1. Para cada inquilino muestre su nombre, apellido paterno y apellido materno y el nmero de familiares que posee. SELECT U.NOM_USUA, U.APEPATER_USUA, COUNT(F.COD_FAMI) as NUMERO_FAMI FROM INQUILINO I INNER JOIN USUARIO U ON U.COD_USUA=I.COD_USUA INNER JOIN FAMILIARES F ON I.COD_USUA=F.COD_USUA GROUP BY U.NOM_USUA, U.APEPATER_USUA

2. Muestre el contrato de menor monto.

SELECT TOP 1 DET.COD_CONT, MONTO=SUM(DEP.PRECIO_ALQXMES_DEP * (DATEDIFF(MM,DET.FEC_INI_ALQ,DET.FEC_FIN_ALQ))) FROM DEPARTAMENTOS DEP INNER JOIN DETALLECONTRATO DET ON DEP.COD_EDIF.=DET.COD_EDIF AND DEP.COD_DEP=DET.COD_DEP GROUP BY DET.COD_CONT ORDER BY MONTO ASC Algunas veces se desea recuperar los valores de estas funciones solamente para grupos que satisfacen ciertas condiciones. Para hacer esto, SQL provee la clusula HAVING, la cual puede aparecer junto con la clusula GROUP BY. HAVING provee una condicin sobre el grupo de duplas asociadas con cada valor de los atributos agrupados y, en el resultado, aparecen solamente los grupos que satisfacen esta condicin. Por ejemplo.

CIBERTEC

CARRERAS PROFESIONALES

76

3. Listar el nombre del edificio, rea total y rea construida del edificio, de aquellos edificios que tienen al menos cinco (05) departamentos por piso.

SELECT E.NOM_EDIF, E.AREA_TOTAL_EDIF, E.AREA_CONSTRUIDA_EDIF, COUNT(D.COD_DEP) FROM EDIFICIOS E INNER JOIN DEPARTAMENTOS D ON E.COD_EDIF=D.COD_EDIF GROUP BY E.NOM_EDIF, E.AREA_TOTAL_EDIF, E.AREA_CONSTRUIDA_EDIF HAVING COUNT(D.COD_DEP) >= 5

4. Para el edificio de nombre LOS ANGELES, muestre el rea total construida por piso. SELECT D.PISO_DEP, SUM(D.AREA_COSNTRUIDA_DEP) AS TOTALCONSTRUIDO FROM EDIFICIOS E INNER JOIN DEPARTAMENTOS D ON E. COD_EDIF = D. COD_EDIF AND E.NOM_EDIF= 'LOS ANGELES' GROUP BY D.PISO_DEP

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

77

3.2.2.6.

ACTIVIDADES PROPUESTAS

En la base de datos VENTAS, efecte lo siguiente:

1. Muestre el producto ms caro y el producto ms barato. 2. Muestre el total de boletas emitidas en el ao 2011. 3. Muestre la cantidad de boletas emitidas por vendedor (nombre y apellido paterno) en el primer trimestre del 2012. 4. Muestre los datos de los vendedores que han emitido 10 o ms boletas en el ao 2012. 5. Muestre el monto total vendido por cada vendedor (nombre y apellido paterno) pero nicamente los montos superiores a 1000 nuevos soles. 6. Muestre el total de productos vendidos por producto (cdigo y descripcin del producto) en el ao 2012.

CIBERTEC

CARRERAS PROFESIONALES

78

3.3.

Tema 7: Combinacin de tablas

Las condiciones de combinacin se pueden especificar en las clusulas FROM o WHERE, aunque se recomienda que se especifiquen en la clusula FROM. Las clusulas WHERE y HAVING pueden contener tambin condiciones de bsqueda para filtrar an ms las filas seleccionadas por las condiciones de combinacin. Las combinaciones se pueden clasificar en: COMBINACIONES INTERNAS (la operacin de combinacin tpica, que usa algunos operadores de comparacin como = o <>). En este tipo se incluyen las combinaciones equivalentes y las combinaciones naturales. Las combinaciones internas usan un operador de comparacin para hacer coincidir las filas de dos tablas segn los valores de las columnas comunes de cada tabla. COMBINACIONES EXTERNAS. Puede ser una combinacin externa izquierda, derecha o completa. Las combinaciones externas se especifican en la clusula FROM con uno de los siguientes conjuntos de palabras clave: LEFT JOIN o LEFT OUTER JOIN El conjunto de resultados de una combinacin externa izquierda incluye todas las filas de la tabla de la izquierda especificada en la clusula LEFT OUTER, y no slo aquellas en las que coincidan las columnas combinadas. Cuando una fila de la tabla de la izquierda no tiene filas coincidentes en la tabla de la derecha, la fila asociada del conjunto de resultados contiene valores NULL en todas las columnas de la lista de seleccin que procedan de la tabla de la derecha. RIGHT JOIN o RIGHT OUTER JOIN Una combinacin externa derecha es el inverso de una combinacin externa izquierda. Se devuelven todas las filas de la tabla de la derecha. Cada vez que una fila de la tabla de la derecha no tenga correspondencia en la tabla de la izquierda, se devuelven valores NULL para la tabla de la izquierda. FULL JOIN o FULL OUTER JOIN Una combinacin externa completa devuelve todas las filas de las tablas de la izquierda y la derecha. Cada vez que una fila no tenga coincidencia en la otra tabla, las columnas de la lista de seleccin de la otra tabla contendrn valores NULL. Cuando haya una coincidencia entre las tablas, la fila completa del conjunto de resultados contendr los valores de datos de las tablas base. COMBINACIONES CRUZADAS Las combinaciones cruzadas devuelven todas las filas de la tabla izquierda y, cada fila de la tabla izquierda se combina con todas las filas de la tabla de la derecha. Las combinaciones cruzadas se llaman tambin productos cartesianos.

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

79

Por ejemplo, a continuacin, se muestra una combinacin cruzada:

SELECT COD_USUA, NOM_AVAL_INQ, COD_CONT FROM INQULINO CROSS JOIN CONTRATO ORDER BY NOM_AVAL_INQ DESC

Las tablas o vistas de la clusula FROM se pueden especificar en cualquier orden en las combinaciones internas o externas completas; sin embargo, el orden especificado de las tablas o vistas s es importante si utiliza una combinacin externa izquierda o derecha. 3.3.1. COMBINACIONES INTERNAS 3.3.1.1. INNER JOIN Una combinacin interna es aqulla en la que los valores de las columnas que se estn combinando se comparan mediante un operador de comparacin. En el estndar SQL, las combinaciones internas se pueden especificar en las clusulas FROM o WHERE. ste es el nico tipo de combinacin que SQL SERVER 2000 admite en la clusula WHERE. Las combinaciones internas especificadas en la clusula WHERE se conocen como combinaciones internas al estilo antiguo. Esta consulta de Transact SQL es un ejemplo de una combinacin interna:

SELECT * FROM INQUILINO AS I INNER JOIN FAMILIARES AS F ON I.COD_USUA = F.COD_USUA ORDER BY I.HABER_BAS DESC

Esta combinacin interna se conoce como una combinacin equivalente. Devuelve todas las columnas de ambas tablas y slo devuelve las filas en las que haya un valor igual en la columna de la combinacin. Es equivalente a la siguiente consulta:

SELECT * FROM INQUILINO I , FAMILIARES F WHERE I.COD_USUA = F.COD_USUA ORDER BY I.HABER_BAS DESC

CIBERTEC

CARRERAS PROFESIONALES

80

Comprobando los resultados en el analizador de consultas, observamos que la columna COD_USUA aparece dos veces. Puesto que no tiene sentido repetir la misma informacin, se puede eliminar una de estas dos columnas idnticas si se cambia la lista de seleccin. El resultado se llama combinacin natural. La consulta anterior de Transact SQL se puede volver a formular para que forme una combinacin natural. Por ejemplo:

SELECT I.*, F.NOM_FAMI, F.APEPATER_FAMI, F.GRADO_PARENTES_FAMI FROM INQUILINO I , FAMILIARES F WHERE I.COD_USUA = F.COD_USUA ORDER BY I.HABER_BAS DESC

En el ejemplo anterior, FAMILIARES.COD_USUA no aparece en los resultados. 4.1.1 Combinaciones con el operador no igual La combinacin no igual (< >) se usa con poca frecuencia. Como regla general, las combinaciones no igual slo tienen sentido cuando se usan con una auto combinacin. En el siguiente ejemplo de Transact SQL, se usa una combinacin no igual que se combina con una auto combinacin para buscar todas las filas de la tabla DEPARTAMENTOS en la que dos o ms filas tengan el mismo COD_EDIF pero distintos nmeros de COD_DEP (es decir, edificios con ms de un departamento):

SELECT DISTINCT D1.COD_DEP, D1.COD_EDIF FROM DEPARTAMENTOS D1 INNER JOIN DEPARTAMENTOS D2 ON D1.COD_EDIF = D2.COD_EDIF WHERE D1.COD_DEP <> D2.COD_DEP ORDER BY D1.COD_DEP NOTA: La expresin NOT column_name = column_name es equivalente a column_name < > column_name.

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

81

3.3.2. COMBINACIONES EXTERNAS Las combinaciones internas slo devuelven filas cuando hay una fila de ambas tablas, como mnimo, que coincide con la condicin de la combinacin. Las combinaciones internas eliminan las filas que no coinciden con alguna fila de la otra tabla. Sin embargo, las combinaciones externas devuelven todas las filas de una de las tablas o vistas mencionadas en la clusula FROM, como mnimo, siempre que tales filas cumplan con alguna de las condiciones de bsqueda de WHERE o HAVING. Todas las filas se recuperarn de la tabla izquierda a la que se haya hecho referencia con una combinacin externa izquierda, y de la tabla derecha a la que se haya hecho referencia con una combinacin externa derecha. En una combinacin externa completa, se devuelven todas las filas de ambas tablas. SQL Server 2008R2 utiliza las siguientes palabras clave para las combinaciones externas especificadas en una clusula FROM: LEFT OUTER JOIN o LEFT JOIN RIGHT OUTER JOIN o RIGHT JOIN FULL OUTER JOIN o FULL JOIN SQL Server admite tanto la sintaxis de combinaciones externas como la sintaxis heredada para especificar las combinaciones externas que se basan en la utilizacin de los operadores *= y =* en la clusula WHERE. Ejemplo prctico: asumiendo que se tiene los siguientes datos de la tabla DEPARTAMENTOS COD_EDIF EDF001 EDF001 EDF002 EDF003 EDF003 EDF004 COD_DEP DEP101 DEP102 DEP202 DEP103 DEP304 DEP101 PRECIO_ALQXMES_DEP 200 250 200 230 190 200

Supongamos, adems, que tenemos los siguientes datos de la DETALLECONTRATO COD_CONT CNT001 CNT001 COD_EDIF EDF001 EDF001 COD_DEP DEP101 DEP102 FEC_INI_ALQ 11/04/2008 22/05/2008 FEC_FIN_ALQ 11/07/2008 22/08/2008

tabla

CIBERTEC

CARRERAS PROFESIONALES

82

CNT002 CNT003 CNT003

EDF002 EDF003 EDF003

DEP202 DEP103 DEP304

01/07/2008 02/03/2008 01/05/2008

01/08/2008 02/06/2008 01/08/2008

3.3.2.1. LEFT JOIN (Utilizado en combinaciones exteriores izquierdas) El operador de combinacin exterior izquierda, LEFT JOIN, indica que todas las filas de la primera tabla se deben incluir en los resultados, con independencia si hay datos coincidentes en la segunda tabla.

SELECT DET.COD_CONT, DEP.COD_EDIF, DEP.COD_DEP, DEP.PRECIO_ALQXMES_DEP FROM DETALLECONTRATO DET LEFT JOIN DEPARTAMENTOS DEP ON DET.COD_EDIF = DEP.COD_EDIF AND DET.COD_DEP=DEP.COD_DEP ORDER BY DET.COD_EDIF ASC, DET.COD_DEP ASC

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

83

El siguiente es el conjunto de resultados: COD_CONT CONT001 CONT001 CONT002 CONT003 CONT003 COD_EDIF EDF001 EDF001 EDF002 EDF003 EDF003 COD_DEP DEP101 DEP102 DEP202 DEP103 DEP304 PRECIO_ALQXMES_DEP 200 250 200 230 190

Observamos que, para este ejempo, hay coincidencia para todas las filas. Ello se produce porque la tabla DETALLECONTRATO es una tabla dbil (Entidad Dbil del diagrama entidad relacin), pues depende de DEPARTAMENTOS y CONTRATO. 3.3.2.1.1. LEFT JOIN - IS NULL Utilizaremos la condicin IS NULL para filtrar nicamente los registros de la tabla de la izquierda que no tengan coincidencia con la tabla de la derecha. Por ejemplo:

Solicitamos la lista de estados que no han sido asignados a los usuarios. SELECT E.* FROM ESTADO AS E LEFT JOIN USUARIO AS U ON E.COD_EST = U.COD_EST WHERE U.COD_USUA IS NULL GO

CIBERTEC

CARRERAS PROFESIONALES

84

3.3.2.2.

RIGHT JOIN (Utilizado en combinaciones exteriores derecha) El operador de combinacin exterior derecha, RIGHT JOIN, indica que todas las filas de la segunda tabla se deben incluir en los resultados, con independencia si hay datos coincidentes en la primera tabla. Para incluir todos los departamentos en los resultados, sin tener en cuenta si hay algn departamento en la tabla DETALLECONTRATO, use una combinacin externa derecha. A continuacin, se muestra la consulta de Transact SQL y los resultados de la combinacin externa derecha:

SELECT DET.COD_CONT, DEP.COD_EDIF, DEP.COD_DEP, DEP.PRECIO_ALQXMES_DEP FROM DETALLECONTRATO DET RIGHT JOIN DEPARTAMENTOS DEP ON DET.COD_EDIF = DEP.COD_EDIF AND DET.COD_DEP=DEP.COD_DEP ORDER BY DET.COD_EDIF ASC, DET.COD_DEP ASC

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

85

El siguiente es el conjunto de resultados: COD_CONT CONT001 CONT001 CONT002 CONT003 CONT003 NULL COD_EDIF EDF001 EDF001 EDF002 EDF003 EDF003 EDF004 COD_DEP DEP101 DEP102 DEP202 DEP103 DEP304 DEP101 PRECIO_ALQXMES_DEP 200 250 200 230 190 200

Observamos que el departamento DEP101 del edificio EDF004 no est en ningn contrato, pero es listado a raz del operador RIGHT JOIN. Es lgico que, como el departamento no est en ningn contrato, ste sea nulo. 3.3.2.2.1. RIGHT JOIN - IS NULL Utilizaremos la condicin IS NULL para filtrar nicamente los registros de la tabla de la derecha que no tengan coincidencia con la tabla de la izquierda. Por ejemplo:

Solicitamos la lista de estados que no han sido asignados a los usuarios. SELECT E.* FROM USUARIO AS U RIGHT JOIN ESTADO AS E ON E.COD_EST = U.COD_EST WHERE U.COD_USUA IS NULL GO

CIBERTEC

CARRERAS PROFESIONALES

86

3.3.2.3.

FULL JOIN (Utilizado en combinaciones externas completas) Para retener la informacin que no coincida al incluir las filas no coincidentes en los resultados de una combinacin, utilice una combinacin externa completa. SQL Server 2000 proporciona el operador de combinacin externa completa, FULL JOIN, que incluye todas las filas de ambas tablas, con independencia de que la otra tabla tenga o no un valor coincidente. En forma prctica, podemos decir que FULL JOIN es una combinacin de LEFT JOIN y RIGHT JOIN.

SELECT DET.COD_CONT, DEP.COD_EDIF, DEP.COD_DEP, DEP.PRECIO_ALQXMES_DEP FROM DETALLECONTRATO DET FULL JOIN DEPARTAMENTOS DEP ON DET.COD_EDIF = DEP.COD_EDIF AND DET.COD_DEP=DEP.COD_DEP ORDER BY DET.COD_EDIF ASC, DET.COD_DEP ASC

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

87

El siguiente es el conjunto de resultados: COD_CONT CONT001 CONT001 CONT002 CONT003 CONT003 NULL COD_EDIF EDF001 EDF001 EDF002 EDF003 EDF003 EDF004 COD_DEP DEP101 DEP102 DEP202 DEP103 DEP304 DEP101 PRECIO_ALQXMES_DEP 200 250 200 230 190 200

Se aprecia que las cinco (05) primeras filas, se obtuvieron usando LEFT JOIN y las seis (06) ltimas filas se obtuvieron usando RIGHT JOIN, es decir FULL JOIN combina ambos resultados. 3.3.2.4. CROSS JOIN (Utilizado en combinaciones externas completas) Se emplea cross join cuando se quieran combinar todos los registros de una tabla con cada registro de otra tabla. Se puede usar un cross join si se quiere una manera rpida de enviar una tabla con informacin. Este tipo de joins tambin se les conoce como producto cartesiano. SELECT DET.COD_CONT, DEP.COD_EDIF, DEP.COD_DEP, DEP.PRECIO_ALQXMES_DEP FROM DETALLECONTRATO CROSS JOIN DEPARTAMENTOS ORDER BY DET.COD_EDIF ASC, DET.COD_DEP ASC

CIBERTEC

CARRERAS PROFESIONALES

88

3.3.3. ACTIVIDADES PROPUESTAS Caso: VENTAS 1. Muestre el nombre y apellido paterno de los empleados que no han emitido ninguna boleta. Use el operador LEFT JOIN. 2. Muestre el nombre de los productos que no se han vendido. Ordenado por descripcin del producto. Use el operador RIGHT JOIN. 3. Muestre los datos de las boletas y el nombre del producto de las boletas emitidas en el primer trimestre del ao 2012. ordenado por fecha de boleta y en coincidencias ordenarlo por cdigo de cliente, de manera ascendente.

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

89

Resumen
La instruccin Select se utiliza para expresar una consulta SQL. Toda sentencia Select produce una tabla de resultados que contiene una o ms columnas y cero o ms filas. La clusula From especifica la (s) tabla (s) que contiene (n) los datos a recuperar de una consulta. La clusula Where selecciona las filas a incluir en los resultados aplicando una condicin de bsqueda a las filas de la base de datos. La clusula Order by especifica que los resultados de la consulta deben ser ordenados en sentido ascendente o descendente, basndose en los valores de una o ms columnas. Si desea saber ms acerca de estos temas, puede consultar las siguientes pginas: Cada vez que haga una consulta haciendo referencia a un valor numrico, la comparacin ser escrita de la siguiente manera: WHERE CAMPO (=, >,<, etc) VALOR Cada vez que haga una consulta haciendo referencia a un valor no numrico, la comparacin ser escrita de la siguiente manera: WHERE CAMPO (=, >,<, etc) ' VALOR ' Adems, debe indicar los apostrofes al inicio y al final del texto a comparar. Es posible hacer una comparacin a nmeros guardados en formato CHAR, VARCHAR, (es decir, texto). Lo nico que debemos tomar en cuenta es que cada nmero es representado por valores ASCII y en realidad es el valor de carcter ASCII el que prima para realizar un ordenamiento. Por ejemplo: Campo X (nmero guardados en formato numrico) 2 25 10 1 7 Si desea realizar un ordenamiento de menor siguiente manera: Campo X (nmero guardados en formato numrico) 1 2 Campo Y (nmero guardados en formato texto) 2 25 10 1 7 a mayor, el resultado sera de la

Campo Y (nmero guardados en formato texto) 1 10

CIBERTEC

CARRERAS PROFESIONALES

90

7 10 25

2 25 7

El cdigo de los caracteres ASCII para los nmeros son los siguientes: Cdigo nmero 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 56 8 57 9

Una condicin de bsqueda puede seleccionar filas mediante comparacin de valores, mediante comparacin de un valor con rango o un grupo de valores, por correspondencia con un patrn de cadena o por comprobacin de valores NULL. Las condiciones de bsqueda simples pueden combinarse mediante AND, OR y NOT para formar condiciones de bsqueda ms complejas. En una consulta multitabla, las tablas que contienen los datos son designadas en la clusula FROM. Cada fila de resultados es una combinacin de datos procedentes de una nica fila en cada una de las tablas, y es la nica fila que extrae sus datos de esa combinacin particular. Las consultas multitablas ms habituales utilizan las relaciones padre / hijo creadas por las claves primarias y claves forneas. Una tabla puede componerse consigo misma; las auto composiciones requieren el uso de alias. Si desea saber ms acerca de estos temas, puede consultar las siguientes pginas: http://www.aulaclic.es/sql/t_3_5.htm Tutorial para el uso de UNIONES EXTERNAS http://www.aulaclic.es/sql/t_3_4.htm Tutorial para el uso de inner join http://technet.microsoft.com/es-es/library/ms174420.aspx Tutorial para el uso de la funcin datepart() http://technet.microsoft.com/es-es/library/ms189794.aspx Tutorial para el uso de la funcin datediff() http://technet.microsoft.com/es-es/library/ms187922.aspx Tutorial para el uso del operador BETWEEN http://technet.microsoft.com/es-es/library/ms179859.aspx Tutorial para el uso del operador LIKE

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

91

CIBERTEC

CARRERAS PROFESIONALES

92

UNIDAD DE APRENDIZAJE

SUB CONSULTAS ANIDADAS CREACIN DE VISTAS


LOGROS DE LA UNIDAD DE APRENDIZAJE

Y CORRELACIONADAS,

Al terminar la unidad, los alumnos emplean los resultados de una consulta como parte de otra en una base de datos de un proceso de negocio real. Asimismo, mejoran el procesamiento y la integridad de una base de datos utilizando vistas sencillas. Luego, crean y emplean vistas complejas de subconjunto, agrupadas y compuestas en una base de datos de un proceso de negocio real.

TEMARIO
4.1.
4.1.1. 4.1.2.

Tema 8: Subconsultas
Subconsultas anidadas. Subconsultas correlacionadas.

4.2.
4.2.1. 4.2.2.

Tema 9: Vistas
Vistas multitabla. Vistas con subconsultas

ACTIVIDADES PROPUESTAS
Utilizan los resultados de una consulta como parte de otra. Comprenden que las subconsultas hacen ms fcil la escritura de la sentencia Select, descomponiendo una consulta en partes. Desarrollan vistas sencillas y complejas a varias tablas.

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

93

4.1.Tema 8: Subconsultas 4.1.1. Subconsultas Anidadas Una subconsulta es una consulta SELECT que devuelve un valor nico y est anidada en una instruccin SELECT, INSERT, UPDATE o DELETE, o dentro de otra subconsulta. Una subconsulta se puede utilizar en cualquier parte en la que se permita una expresin. En este ejemplo, se utiliza una subconsulta con la idea de listar a todos los inquilinos que tienen hermanos:

SELECT COD_USUA, HABER_BAS_INQ FROM INQUILINO WHERE COD_USUA IN ( SELECT COD_USUA FROM FAMILIARES WHERE GRADO_PARENTES_FAMI = 'HERMANO' )

Se llama tambin subconsulta a una consulta o seleccin interna, mientras que la instruccin que contiene una subconsulta tambin es conocida como consulta o seleccin externa. Muchas de las instrucciones Transact SQL que incluyen subconsultas se pueden formular tambin como combinaciones. Otras preguntas se pueden formular slo con subconsultas. En Transact SQL, normalmente no hay diferencias de rendimiento entre una instruccin que incluya una subconsulta y una versin equivalente que no lo haga. Sin embargo, en algunos casos en los que se debe comprobar la existencia de algo, una combinacin produce mejores resultados. De lo contrario, la consulta anidada debe ser procesada para cada resultado de la consulta externa con el fin de asegurar la eliminacin de los duplicados. En tales casos, la utilizacin de combinaciones producira los mejores resultados. Esto es un ejemplo que muestra una subconsulta SELECT y una combinacin SELECT que devuelve el mismo conjunto de resultados:

1.

SELECT COD_USUA, HABER_BAS_INQ FROM INQUILINO WHERE COD_USUA IN ( SELECT COD_USUA FROM FAMILIARES WHERE GRADO_PARENTES_FAMI = 'HERMANO ' )

CIBERTEC

CARRERAS PROFESIONALES

94

2.

SELECT I.COD_USUA, I.HABER_BAS_INQ FROM INQUILINO I, FAMILIARES F WHERE I.COD_USUA = F.COD_USUA AND F.GRADO_PARENTES_FAMI = 'HERMANO '

Una subconsulta anidada en la instruccin externa SELECT tiene los siguientes componentes: Una consulta SELECT normal, que incluye los componentes normales de la lista de seleccin. Una clusula normal FROM que incluye uno o ms nombres de tablas o vistas. Una clusula opcional WHERE. Una clusula opcional GROUP BY. Una clusula opcional HAVING. La consulta SELECT de una subconsulta se incluye siempre entre parntesis. No puede incluir una clusula COMPUTE y slo puede incluir una clusula ORDER BY cuando se especifica tambin una clusula TOP. Una subconsulta puede anidarse dentro de la clusula WHERE o HAVING de una instruccin externa SELECT, INSERT, UPDATE o DELETE, o dentro de otra subconsulta. Se puede disponer de hasta 32 niveles de anidamiento, aunque el lmite vara dependiendo de la memoria disponible y de la complejidad del resto de las expresiones de la consulta. Las consultas individuales puede que no admitan anidamientos por encima de 32 niveles. Una subconsulta puede aparecer en cualquier parte en la que se pueda usar una expresin, si devuelve un valor individual. Si una tabla aparece slo en una subconsulta y no en la consulta externa, las columnas de esa tabla no se pueden incluir en el resultado (la lista de seleccin de la consulta externa). Las instrucciones que incluyen una subconsulta normalmente tienen uno de estos formatos: WHERE expresin [NOT] IN (subconsulta) WHERE expresin_de_comparacion [ANY | ALL] (subconsulta) WHERE [NOT] EXISTS (subconsulta)

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

95

En algunas instrucciones, la subconsulta se puede evaluar como si fuera una consulta independiente. Conceptualmente, los resultados de la subconsulta se sustituyen en la consulta externa. Hay tres (03) tipos bsicos de subconsultas, con las cuales se realizan las siguientes operaciones: Operan en listas incorporadas con IN, o en aquellas que modific un operador de comparacin mediante ANY u ALL. Se introducen con un operador de comparacin sin modificar y deben devolver un valor individual. Son pruebas de existencia que se introducen con EXISTS.

4.1.1.1. ALL El predicado ALL se utiliza para recuperar nicamente aquellos registros de la consulta principal que satisfacen la comparacin con todos los registros recuperados en la subconsulta. Si se cambia ANY por ALL en el ejemplo anterior, la consulta devolver nicamente todos los datos de los inquilinos cuyo haber bsico es mayor que el de todos los inquilinos cuto estado civil es soltero. Esto es mucho ms restrictivo. 4.1.1.2. IN El predicado IN se emplea para recuperar nicamente aquellos registros de la consulta principal para los que algunos registros de la subconsulta contienen un valor igual. El siguiente ejemplo lista a los edificios que tengan departamentos desocupados: SELECT * FROM EDIFICIOS WHERE COD_EDIF IN (SELECT COD_EDIF FROM DEPARTAMENTOS WHERE COD_EST IN (SELECT COD_EST FROM ESTADO WHERE DESC_EST='DESOCUPADO' )) Inversamente se puede utilizar NOT IN para recuperar nicamente aquellos registros de la consulta principal para los que no hay ningn registro de la subconsulta que contenga un valor igual. 4.1.1.3 EXISTS El predicado EXISTS (con la palabra reservada NOT opcional) se utiliza en comparaciones de verdadero / falso para determinar si la subconsulta devuelve algn registro. Se puede utilizar, tambin, alias del nombre de la tabla en una subconsulta para referirse a tablas listadas en la clusula FROM fuera de la subconsulta. El siguiente ejemplo lista a los propietarios que han firmado contratos de alquiler.

CIBERTEC

CARRERAS PROFESIONALES

96

SELECT * FROM PROPIETARIOS WHERE EXISTS (SELECT * FROM CONTRATO WHERE PROP_COD_USUA= PROPIETARIO.COD_USUA)

El siguiente ejemplo lista a los edificios que tengan departamentos desocupados SELECT * FROM EDIFICIOS WHERE EXISTS (SELECT * FROM DEPARTAMENTOS WHERE COD_EDIF=EDIFICIOS.COD_EDIF AND EXISTS (SELECT * FROM ESTADO WHERE COD_EST=DEPARTAMENTOS.COD_EST AND DESC_EST='DESOCUPADO' ))

4.1.2. SUBCONSULTAS CORRELACIONADAS Se pueden evaluar muchas consultas mediante la ejecucin de la subconsulta una vez y la sustitucin del valor o valores resultantes en la clusula WHERE de la consulta externa. En las consultas que incluyen una subconsulta correlacionada (conocida tambin como una subconsulta repetida), la subconsulta depende de la consulta externa para sus valores. Esto significa que la subconsulta se ejecuta varias veces, una vez por cada fila que pueda ser seleccionada por la consulta externa. Esta consulta busca el cdigo del contrato y la fecha de firma del mismo para todos aquellos contratos suscritos con inquilinos con estado civil soltero.

SELECT COD_CONT, FEC_FIRMA FROM CONTRATO WHERE 'SOLTERO' IN (SELECT EST_CIVIL_INQ FROM INQUILINO WHERE COD_USUA = CONTRATO.INQ_COD_USUA)

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

97

Al contrario que la mayor parte de las subconsultas mostradas anteriormente, la subconsulta de esta instruccin no se puede resolver con independencia de la consulta principal. Necesita un valor para CONTRATO.INQ_COD_USUA, pero este valor es una variable. Cambia a medida que Microsoft SQL Server examina distintas filas de la tabla CONTRATO. . 4.2. Tema 9 : VISTAS 4.2.1. Vistas multitabla Una vista se puede considerar como una tabla virtual o una consulta almacenada. Los datos accesibles a travs de una vista no estn almacenados en un objeto distinto de la base de datos. Lo que est almacenado en la base de datos es una instruccin SELECT. El resultado de la instruccin SELECT forma la tabla virtual que la vista devuelve. El usuario puede utilizar dicha tabla virtual haciendo referencia al nombre de la vista en instrucciones Transact SQL, de la misma forma en que se hace referencia a las tablas. Una vista no puede contener ORDER BY pero s lo puede incluir al usar la vista. Las vistas se utilizan para alguna de estas funciones, o para todas: Restringir el acceso del usuario a filas concretas de una tabla Por ejemplo, permitir que un empleado slo vea las filas que guardan su trabajo en una tabla de seguimiento de actividad laboral Restringir el acceso del usuario a columnas especficas Por ejemplo, permitir que los empleados que no trabajen en el departamento de nminas vean las columnas de nombre, oficina, telfono y departamento de la tabla de empleados, pero no permitir que vean las columnas con los datos de salario u otra informacin personal Combinar columnas de varias tablas de forma que parezcan una sola tabla Agregar informacin en lugar de presentar los detalles Por ejemplo, presentar la suma de una columna o el valor mximo o mnimo de una columna. Las vistas se crean definiendo la instruccin SELECT que recupera los datos presentados por la vista. Las tablas de datos a las que hace referencia la instruccin SELECT se conocen como las tablas base para la vista. En este ejemplo, MONTOXCONTRATO es una vista que selecciona datos de dos tablas base para presentar una tabla virtual de datos frecuentemente utilizados:

CIBERTEC

CARRERAS PROFESIONALES

98

CREATE VIEW MONTOXCONTRATO AS SELECT DET.COD_CONT, MONTO=SUM(DEP.PRECIO_ALQXMES_DEP * (DATEDIFF(MM,DET.FEC_INI_ALQ,DET.FEC_FIN_ALQ))) FROM DEPARTAMENTOS DEP, DETALLECONTRATO DET WHERE DEP.COD_EDIF.=DET.COD_EDIF. AND DEP.COD_DEP=DET.COD_DEP GROUP BY DET.COD_CONT

Una vez creada, se puede hacer referencia a TITLEVIEW en las instrucciones de la misma forma que se hace referencia a una tabla:

SELECT * FROM MONTOXCONTRATO

4.2.1.1. Ventajas de las vistas: Seguridad: cada usuario puede acceder a la base de datos nicamente a travs de un pequeo conjunto de vistas que contienen los datos especficos que el usuario est autorizado a ver, restringiendo as el acceso al usuario a datos almacenados. Simplicidad de consulta: una vista puede extraer datos de varias tablas diferentes y presentarlos como una nica tabla haciendo que las consultas multitablas se formulen como consultas de una sola tabla con respecto a al vista. Simplicidad estructurada: las vistas pueden dar a un usuario una visin personalizada de la estructura de la base de datos presentando esta como un conjunto de tablas virtuales que tienen sentido para ese usuario. Aislamiento frente al cambio: una vez vista puede presentar una imagen consistente inalterada de la estructura de la base datos, incluso si las tablas fuente subyacentes, se dividen. Integridad de datos: si los datos se acceden y se introducen a travs de una vista, el DBMS puede comprobar automticamente los datos para asegurarse de que satisfacen restricciones de integridad especficas.

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

99

4.2.1.2. Desventajas de las vistas Rendimiento: las vistas crean la apariencia de una tabla pero el DBMS debe traducir las consultas con respecto a la vista de consultas y con respecto a las tablas fuentes subyacentes. Si la vista se define mediante una consulta multitabla compleja, entonces una consulta sencilla con respecto a la vista se convierte en una composicin complicada y puede tardar mucho tiempo en completarse. Restricciones de actualizacin: cuando un usuario trata de actualizar filas de una vista, el DBMS debe traducir la peticin de una actualizacin sobre las filas de las tablas fuentes subyacentes. Esto es posible para vistas sencillas, pero para vistas ms complejas no pueden ser actualizadas; son slo de lectura . 4.2.2. CLASIFICACIN DE LAS VISTAS 4.2.2.1. Vistas horizontales Un uso comn de las vistas es restringir el acceso de un usuario a nicamente filas seleccionadas de una tabla. Por ejemplo, en la base de datos ejemplo, supongamos que se desea que los propietarios vean las filas de la tabla CONTRATO correspondientes a ciertos meses (ejemplo imaginario). Para lograr esto, se pueden definir dos vistas del modo siguiente: CREATE VIEW VERCONTRATOSMESESIMPARES SELECT * FROM CONTRATO WHERE DATEPART(MM,FEC_FIRMA) IN (1,3,5,7,9,11)

CREATE VIEW VERCONTRATOSMESESPARES SELECT * FROM CONTRATO WHERE DATEPART(MM,FEC_FIRMA) IN (2,4,6,8,10,12)

Ahora se puede dar a cada propietario permiso para acceder a la vista VERCONTRATOSMESESIMPARES o bien a la vista VERCONTRATOSMESESPARES y negarles el permiso para acceder a la otra vista y a la propia tabla CONTRATO. Una vista como VERCONTRATO se denomina normalmente vista horizontal. Una vista horizontal divide horizontalmente la tabla fuente para crea la vista.

CIBERTEC

CARRERAS PROFESIONALES

100

4.2.2.2. VISTAS VERTICALES Otro uso habitual de las vistas es restringir el acceso de un usuario a slo ciertas columnas de una tabla INQUILINOS, por ejemplo en nuestra base de datos.
CODUSUA USU001 USU002 USU003 USU004 USU005 USU006 NOMAVALINQ ANGEL DIANA MARCELO ZOILA GABRIEL IGOR APELL_AVAL HABER_BAS_INQ EST_CIVIL_INQ LIRA 1100 SOLTERO VEGA 3500 SOLTERO TORRES 1900 CASADO AGREDA 2500 SOLTERO DEL RIO 3000 SOLTERO ROJAS 1000 SOLTERO

Se desea crear una vista que muestre el cdigo, nombre y apellido del aval de todos los inquilinos existentes, para que unos ciertos usuarios tengan acceso slo a columnas especficas. Entonces, la vista se realizar de la siguiente manera.

CREATE VIEW VERINQUILINOS AS SELECT CODUSUA, NOM_AVAL_INQ, APELL_AVAL FROM INQUILINO

Mostrar: COD_USUA USU001 USU002 USU003 USU004 USU005 USU006 NOM_AVAL_INQ ANGEL DIANA MARCELO ZOILA GABRIEL IGOR APELL_AVAL LIRA VEGA TORRES AGREDA DEL RIO ROJAS

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

101

4.2.2.3. ACTIVIDADES En la base de datos DEPARTAMENTOS: o Muestre el nombre, apellido paterno y apellido materno de los inquilinos que tienes el haber bsico ms alto y ms bajo.

SELECT NOM_USUA, APEPATER_USUA, APEMATER_USUA FROM USUARIO WHERE COD_USUA IN (SELECT COD_USUA FROM INQUILINO WHERE HABER_BAS_INQ IN (SELECT MAX(HABER_BAS_INQ) FROM INQUILINO) OR HABER_BAS_INQ IN (SELECT MIN(HABER_BAS_INQ) FROM INQUILINO))

Muestre el nombre y apellido paterno de los propietarios que no tienen contratos

SELECT NOM_USUA, APEPATER_USUA FROM USUARIO WHERE COD_USUA IN (SELECT COD_USUA FROM PROPIETARIO WHERE COD_USUA NOT IN (SELECT PROP_COD_USUA FROM CONTRATO)

CIBERTEC

CARRERAS PROFESIONALES

102

Muestre el nombre, direccin y rea total del los edificios que tienen departamentos ubicados en el piso 7.

SELECT NOM_EDIF, DIRECC_EDIF, AREA_TOTAL_EDIF FROM EDIFICIOS WHERE EXISTS (SELECT * FROM DEPARTAMENTOS

WHERE COD_EDIF=EDIFICIOS.COD_EDIF AND PISO_DEP=7

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

103

4.2.2.4.

ACTIVIDADES PROPUESTAS

Caso: VENTAS

1.

Muestre el nombre y apellido de los empleados que no emitieron ninguna boleta en el segundo trimestre de 2012. Muestre la descripcin de los productos que se no se han vendido en el mes de diciembre de 2011. Cree una vista que muestre los datos de todos los empleados que no hayan emitido alguna boleta. Luego, efecte una consulta sobre dicha vista, para mostrar el menor y el mayor ao de ingreso de dichos empleado. Emplee etiquetas (alias de campo) para el encabezado del listado de campo. Cree una vista que muestre los datos de los productos vendidos en el ao 2011. Luego, efecte una consulta a dicha vista para listar aquellos productos cuya letra inicial de su descripcin se encuentra entre la A y la F. Cree una vista que muestre los datos de los productos vendidos. Luego, mediante una consulta a dicha vista, muestre los productos cuya descripcin empiezan con la letra P o contenga la cadena SA y que hayan sido vendidos en el segundo trimestre del ao 2012.

2.

3.

4.

5.

4.2.2.5. VISTAS CON SUBCONJUNTOS FILA / COLUMNA Cuando se define una vista SQL, no restringe a divisiones puramente horizontales o verticales de unas tablas. De hecho, el lenguaje SQL no incluye la nocin de vistas horizontales y verticales. Estos conceptos ayudan a visualizar cmo la vista presenta la informacin a partir de la tabla fuente tanto por la dimensin horizontal como por la vertical. Ejemplo Se tiene la tabla USUARIO y se desea mostrar una vista que obtenga solamente el cdigo, nombre y apellido paterno de los usuarios que hayan nacido despus del ao 1980.

CREATE VIEW USUR_LISTA AS SELECT COD_USUA, NOM_USUA, APEPATER_USUA FROM USUARIO WHERE year(FEC_NAC_USUA) > 1980

CIBERTEC

CARRERAS PROFESIONALES

104

La informacin devuelta sera: CDIGO U00001 U00002 U00003 NOMBRE CARLOS ENRIQUE PABLO APELLIDO SUREZ SORIA VERA

Los datos visibles a travs de esta vista son un subconjunto fila / columna de la tabla USUARIO. Slo las columnas explcitamente designadas en la lista de seleccin de la vista y las filas que satisfacen la condicin de bsqueda son visibles a travs de la vista.

4.2.2.6.

VISTAS AGRUPADAS La consulta especificada en una definicin de vista puede incluir una clusula GROUP BY. Este tipo de vista se denomina agrupada, ya que los datos visibles a travs de ella son el resultado de una consulta agrupada. Las vistas agrupadas efectan la misma funcin que las consultas agrupadas; agrupan filas relacionadas de datos y producen una fila de resultados de consulta para cada grupo sumando los datos de ese grupo. Una vista agrupada rene estos resultados de la consulta en una vista virtual y permite efectuar consultas adicionales sobre ella.

Ejemplos: a) Cree una vista que muestre el cdigo, nombre y apellido paterno, as como el nmero de familiares que tienen cada inquilino. CREATE VIEW INQUILINO_FAMILIAR AS SELECT I.COD_USUA, U.NOM_USUA, U.APEPATER_USUA, COUNT(*) AS 'NMERO DE FAMILIARES' FROM INQUILINO I INNER JOIN USUARIO U ON I.COD_USUA = U.COD_USUA INNER JOIN FAMILIARES F ON I.COD_USUA = F.COD_USUA GROUP BY I.COD_USUA, U.NOM_USUA, U.APEPATER_USUA

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

105

b) Cree una vista que muestre el cdigo, nombre, direccin del edificio, cdigo y piso del departamento, as como la cantidad de veces que haya sido alquilado cada departamento. Sin embargo slo se mostrarn aquellos departamentos que hayan sido alquilados ms de tres (03) veces. CREATE VIEW DEPARTAMENTO_ALQUILER AS SELECT E.COD_EDIF, E.NOM_EDIF, E.DIRECC_EDIF, D.COD_DEP, D.PISO_DEP, COUNT(*) AS 'NMERO VECES' FROM EDIFICIOS E INNER JOIN DEPARTAMENTOS D ON E.COD_EDIF = D.COD_EDIF INNER JOIN DETALLECONTRATO C ON D.COD_EDIF = C.COD_EDIF AND D.COD_DEP = C.COD_DEP GROUP BY E.COD_EDIF, E.NOM_EDIF, E.DIRECC_EDIF, D.COD_DEP, D.PISO_DEP HAVING COUNT(*) > 3

CIBERTEC

CARRERAS PROFESIONALES

106

c) Cree una vista que muestre el cdigo, nombre y apellido del inquilino, as como el nmero de veces que alquilo un departamento. Sin embargo, slo se mostrarn aquellos inquilinos que hayan alquilado ms de cuatro (04) veces un departamento. CREATE VIEW INQUILINO_DEPARTAMENTO AS SELECT I.COD_USUA, U.NOM_USUA, U.APEPATER_USUA, COUNT(*) AS 'NMERO VECES' FROM INQUILINO I INNER JOIN USUARIO U ON I.COD_USUA = U.COD_USUA INNER JOIN CONTRATO C ON I.COD_USUA = C.INQ_COD_USUA INNER JOIN DETALLECONTRATO D ON C.COD_CONT = D.COD_CONT GROUP BY I.COD_USUA, U.NOM_USUA, U.APEPATER_USUA HAVING COUNT(*) > 4 d) Cree una vista que muestre el cdigo, nombre del propietario, as como el nmero de contratos que haya realizado en los ltimos 4 meses. Sin embargo, slo se mostrarn aquellos propietarios que hayan generado ms de tres (03) contratos. CREATE VIEW INQUILINO_CONTRATO AS SELECT P.COD_USUA, U.NOM_USUA, U.APEPATER_USUA, COUNT(*) AS 'NMERO DE CONTRATOS' FROM PROPIETARIO P INNER JOIN USUARIO U ON P.COD_USUA = U.COD_USUA INNER JOIN CONTRATO C ON P.COD_USUA = C.PROP_COD_USUA WHERE DATEDIFF(MM,C.FEC_FIRMA,GETDATE())<=4 GROUP BY P.COD_USUA, U.NOM_USUA, U.APEPATER_USUA HAVING COUNT(*) >3

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

107

4.2.2.7. VISTAS COMPUESTAS Una de las razones ms frecuentes para utilizar vistas compuestas es simplificar las consultas multitablas. Para ello, hay que especificar una consulta de dos o tres tablas en la definicin de una vista. Se puede crear una vista compuesta que extrae datos de dos o tres tablas diferentes y presenta los resultados de la consulta como nica tabla virtual. Una vez definida la vista, con frecuencia, se puede utilizar como una consulta simple de una sola tabla. Ejemplos: a) Muestre el cdigo y fecha firma del contrato, as como el cdigo, nombre y apellido paterno de todos los propietarios cuyo nombre contenga en la tercera posicin la letra igual a N y que los contratos hayan sido generados entre noviembre 2004 y abril 2008. La informacin debe ser ordenada por en nombre del propietario en forma descendente. CREATE VIEW PROPIETARIO_LISTA AS SELECT U.COD_USUA, U.NOM_USUA, U.APEPATER_USUA, C.COD_CONT, C.FEC_FIRMA FROM USUARIO U INNER JOIN PROPIETARIO P ON U.COD_USUA = P.COD_USUA INNER JOIN CONTRATO C ON P.COD_USUA = C.PROP_COD_USUA WHERE U.NOM_USUA LIKE '__N%' AND C.FEC_FIRMA BETWEEN '01/11/2004' AND '30/04/2008' ORDER BY U.NOM_USUA DESC

b) Muestre el cdigo, nombre y direccin del edificio, cdigo y piso del departamento, as como la fecha de inicio y fin que fue alquilado de todos los departamentos que hayan sido alquilado en los ltimos ocho (08) meses y que se encuentren ubicados en SAN ISIDRO. CREATE VIEW EDIFICIO_DEPARTAMENTO AS SELECT E.COD_EDIF, E.NOM_EDIF, E.DIRECC_EDIF, D.COD_DEP, T.FEC_INI_ALQ, T.FEC_FIN_ALQ FROM EDIFICIOS E INNER JOIN DEPARTAMENTOS D ON E.COD_EDIF = D.COD_EDIF INNER JOIN DETALLECONTRATO T ON D.COD_EDIF = T.COD_EDIF AND D.COD_DEP = T.COD_DEP WHERE DATEDIFF(YY,T.FEC_INI_ALQ,GETDATE())<=8 AND E.DIRECC_EDIF LIKE '%SAN ISIDRO%'

CIBERTEC

CARRERAS PROFESIONALES

108

c) Muestre el total y el promedio de las areas construidas de los departamentos cuyo inicio de alquiler se produjo a partir del centsimo da del ao 2008. El resultado debe estar clasificado por el nombre del edificio y slo debe incluir aquellos cuyo total de rea construida sea mayor a 400. --Creacin de la vista Create View vwDptos2008100 As Select E.Nom_Edif 'Edificio', Sum(D.Area_Construida_Dep) 'Suma', Avg(D.Area_Construida_Dep) 'Promedio' From Departamentos D Inner Join Edificios E On E.Cod_Edif = D.Cod_Edif Inner Join DetalleContrato DC On DC.Cod_Edif = D.Cod_Edif And DC.Cod_Dep = D.Cod_Dep Where (DatePart(yy,DC.Fec_Ini_Alq) = 2008 And DatePart(dy,DC.Fec_Ini_Alq) >= 100) Or DatePart(yy,DC.Fec_Ini_Alq) > 2004 Group By E.Nom_Edif Having Sum(D.Area_Construida_Dep) > 400 -- Fin de la vista -- Ejecutar la vista Select * From vwContratos2004100 -- Recuperar el texto de una vista sp_helptext vwContratos2008100 -- Modificacion de la vista con ENCRIPTACION Alter View vwContratos2008100 With Encryption As Select E.Nom_Edif 'Edificio', Sum(D.Area_Construida_Dep) 'Suma', Avg(D.Area_Construida_Dep) 'Promedio' From Departamentos D Inner Join Edificios E On E.Cod_Edif = D.Cod_Edif Inner Join DetalleContrato DC On DC.Cod_Edif = D.Cod_Edif And DC.Cod_Dep = D.Cod_Dep Where (DatePart(dy,DC.Fec_Ini_Alq)>=100 And DatePart(yy,DC.Fec_Ini_Alq) = 2004) Or DatePart(yy,DC.Fec_Ini_Alq) > 2008 Group By E.Nom_Edif --Having Sum(D.Area_Construida_Dep) > 400 -- Fin de la vista -- Recuperar el texto de una vista sp_helptext vwContratos2008100

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

109

Resumen

Consulta dentro de una consulta. Las subconsultas aparecen dentro de una de la condiciones de bsqueda. Cuando aparece una subconsulta en la clusula WHERE, los resultados de la subconsulta se utilizan para seleccionar las filas individuales que contribuyen a los datos de los resultados de la consulta. Cuando una subconsulta aparece en la clusula HAVING, los resultados de la subconsulta se utilizan para seleccionar los grupos de filas que contribuyen con datos a los resultados de la consulta. Una subconsulta puede incluir una referencia externa a una tabla en cualquiera de las consultas que la contienen, enlazando las subconsulta con la fila actual de esa consulta. Si desea saber ms acerca de estos temas, puede consultar las siguientes pginas: http://technet.microsoft.com/es-es/library/ms187956.aspx Tutorial para la creacin de vistas

CIBERTEC

CARRERAS PROFESIONALES

110

UNIDAD DE APRENDIZAJE

DIAGRAMADOR DE BASE DE DATOS


LOGROS DE LA UNIDAD DE APRENDIZAJE
Al trmino de la unidad, el alumno disea, crea e importa la estructura de una base de datos con el empleo de una herramienta CASE para un proceso de negocio real.

TEMARIO

5.1. Tema 10: Diagramador de SQL Server 2008 5.1.1. Uso del diagramador de base de datos de SQL Server 2008

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

111

5.1. Tema 10: Diagramador de SQL Server 2008R2 5.1.1. Uso del diagramador de base de datos de SQL Server 2008R2 5.1.1.1. Crear una base de datos

a. En el Explorador de objetos, conctese a una instancia del SQL Server Database Engine (Motor de base de datos de SQL Server) y expndala. b. Haga clic con el botn secundario en Bases de datos y, a continuacin, en Nueva base de datos.

c. En Nueva base de datos, especifique un nombre de base de datos.

d. Si desea crear la base de datos aceptando todos los valores predeterminados, haga clic en Aceptar; de lo contrario, contine con siguientes los pasos opcionales. e. Para cambiar el nombre de nombre del propietario, haga clic en () para seleccionar otro.

CIBERTEC

CARRERAS PROFESIONALES

112

f.

Para cambiar los valores predeterminados de los archivos de datos y de registro de transacciones principales, en la cuadrcula Archivos de la base de datos, haga clic en la celda correspondiente y especifique el nuevo valor. g. Para cambiar opciones de base de datos, seleccione la pgina Opciones y modifique las opciones de la base de datos. h. Para crear la base de datos, haga clic en Aceptar. 5.1.1.2. CREAR TABLAS

a. Seleccione la base de datos NEPTUNOCIBERTEC2009, carpeta tablas, men contextual y agregue campo por campo especificando el tipo de dato, longitud y definir si el campo ser null o not null.

b. Establezca la llave primaria, para ello, pulse el men contextual y elija la primera opcin. Automticamente se desactivar la casilla de permitir valores nulos.

c. Guarde la tabla e ingrsele un nombre.

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

113

La tabla aparecer en el explorador de objetos:

CIBERTEC

CARRERAS PROFESIONALES

114

5.1.1.3.

Propiedades de un campo/atributo:

5.1.1.4.

Generacin de restricciones:

DEFAULT: Establece un valor por defecto. Puede definir un valor por defecto usando las propiedades de los atributos:

CHECK: Garantiza el ingreso de datos vlidos.

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

115

Las restricciones aparecern en la siguiente carpeta:

EJERCICIO: Crear la tabla PROVEEDORES segn se muestra a continuacin:

CIBERTEC

CARRERAS PROFESIONALES

116

5.1.1.5.

CREAR LLAVES FORNEAS

Tenemos dos tablas creadas, PRODUCTOS y PROVEEDORES. La llave fornea la definiremos en la tabla Productos.

a. Seleccionamos de la tabla PRODUCTOS, a continuacin la carpeta claves y


pulsamos el botn derecho del mouse:

b. Pulse el botn ().

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

117

c. Coloque el nombre de relacin mostrada y seleccione la llave primaria y llave


fornea de las tablas proveedores y productos respectivamente.

d. Pulse el botn Aceptar. e. Pulse el botn Cerrar

CIBERTEC

CARRERAS PROFESIONALES

118

f. Actualice la carpeta Claves y aparecer la llave fornea.

El resultado de establecer la llave fornea es la siguiente:

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

119

5.1.1.6.

GENERAR UN SCRIPT EN TRANSACT-SQL

Para crear scripts de Transact-SQL puede utilizar el Asistente para generar scripts de SQL Server o el Explorador de objetos.

Para abrir el Asistente para generar scripts, previamente asegrese de guardar todos los cambios en la creacin de tablas: a. En el Explorador de objetos, expanda Bases de datos, haga clic con el botn secundario en la base de datos NeptunoCibertec2009, seleccione Tareas y, a continuacin, haga clic en Generar scripts. b. Siga las instrucciones del asistente para incluir los objetos de la base de datos en la script.

c. Pulse el botn siguiente :

CIBERTEC

CARRERAS PROFESIONALES

120

d. Seleccione la base de datos a la cual generar el script

e. Seleccione las opciones a generar

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

121

f.

El script se generar en una nueva ventana.

g. Puede verificar las opciones seleccionadas.

CIBERTEC

CARRERAS PROFESIONALES

122

h. Pulse el botn finalizar y empezar el proceso de generacin.

i.

Pulse el botn Cerrar.

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

123

j.

A continuacin se muestra el cdigo generado por SQL SERVER 2008.

Hacer notar al alumno que al cdigo generado por SQLServer hay que ponerle la validacin IF EXISTS, porque de correr nuevamente el script generado puede generar error. Por ejemplo: IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[NombreTabla]') AND type in (N'U')) DROP TABLE [dbo].[NombreTabla] GO

CIBERTEC

CARRERAS PROFESIONALES

124

Puede proceder a comprobar dicho cdigo, ejecutndolo.

A continuacin se muestra la base de datos NeptunoCibertec2011 completa, genere este diagrama usando el diagramador de bases de datos del SQL Server 2008.

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

125

5.1.1.7.

ACTIVIDADES PROPUESTAS

1. Cree el modelo fsico y lgico de la base de datos VENTAS mediante el diagramador de base de datos de SQL Server 2008 .

CIBERTEC

CARRERAS PROFESIONALES

126

Resumen

Las vistas permiten redefinir la estructura de una base de datos proporcionando a cada usuario una vista personalizada de la estructura y los contenidos de la base de datos. Una vista es una tabla virtual definida mediante una consulta. La vista parece contener filas y columnas de datos, al igual que una tabla real, pero los datos visibles a travs de la vista son los resultados de la consulta. Una vista puede ser un subconjunto simple fila / columna de una nica tabla. Puede mostrar resultados obtenidos de funciones de agrupamiento o puede extraer los datos de dos o ms tablas. Si desea saber ms acerca de estos temas, puede consultar las siguientes pginas: http://technet.microsoft.com/es-es/library/ms187956.aspx Tutorial para la creacin de vistas

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

127

CIBERTEC

CARRERAS PROFESIONALES

128

UNIDAD DE APRENDIZAJE

INTRODUCCIN SERVER 2008

A LA

PROGRAMACIN

EN

SQL

LOGRO DE LA UNIDAD DE APRENDIZAJE


Al terminar la unidad, los alumnos implementan instrucciones SQL y de programacin mediante procedimientos almacenados para optimizar las operaciones (insert, delete y update) de registros en una base de datos.

TEMARIO
6.1. Tema 11: Programacin avanzada para base de datos

ACTIVIDADES PROPUESTAS
Emplean herramientas de control de flujo para desarrollar programas. Utilizan los programas desarrollados desde un procedimiento almacenado creado. Ejecutan los procedimientos almacenados y analizan los resultados.

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

129

6.1. Tema 11: Introduccin a la programacin en SQL SERVER 2008R2 Transact/SQL permite agrupar una serie de instrucciones como lote, ya sea de forma interactiva o desde un archivo operativo. Tambin, se puede utilizar estructuras de control de flujo por Transact/SQL para conectar las instrucciones utilizando estructuras de tipo de programacin. Transact/SQL proporciona palabras clave especiales llamadas lenguaje de control de flujo que permiten controlar el flujo de ejecucin de las instrucciones. El lenguaje de control de flujo se puede utilizar en instrucciones sencillas, lotes, procedimientos almacenados y disparadores.

6.1.1. Declaracin de variables locales Una variable es una entidad a la que se asigna un valor. Este valor puede cambiar durante el lote o el procedimiento almacenado donde se utiliza la variable. SQL Server tiene dos tipos de variables: locales y globales. Las variables locales estn definidas por el usuario, mientras que las variables globales las suministra el sistema y estn predefinidas. Las variables locales se declaran, nombran y escriben mediante la palabra clave declare, y reciben un valor inicial mediante una instruccin select o set. Dichas variables deben declararse, reciben un valor y utilizarse en su totalidad dentro del mismo lote o procedimiento. Los nombres de las variables locales deben empezar con el smbolo @. A cada variable local se le debe asignar un tipo de dato definido por el usuario o un tipo de dato suministrado por el sistema distinto de text, image o sysname.

DECLARE @ NOMBRE_DE_VARIABLE TIPODEDATO [, @ NOMBRE_DE_VARIABLE TIPODEDATO ]

DECLARACIN: DECLARE @ APEPATER_USUA DECLARE @ COD_EST DECLARE @ PISO_DEP DECLARE @ FEC_FIRMA ASIGNACIN e) Mostrar el apellido paterno del Usuario cuyo cdigo sea igual a U00001. Usando set y print: Declare @APEPATER_USUA varchar(25) VARCHAR(25) CHAR(06) INTEGER DATETIME

-- Obtener el Dato Set @APEPATER_USUA = APEPATER_USUA

CIBERTEC

CARRERAS PROFESIONALES

130

From Usuario Where COD_USUA = 'U000001' -- Mostrar el Dato Print @APEPATER_USUA

Usando Select: Declare @APEPATER_USUA varchar(25)

-- Obtener el Dato Select @APEPATER_USUA = APEPATER_USUA From Usuario Where COD_USUA = 'U000001' -- Mostrar el Dato Select @APEPATER_USUA

f) Mostrar el Haber Bsico del inquilino cuyo cdigo de usuario es igual a U00002 Declare @HABER_BAS_INQ float -- Obtener el Haber Bsico Select @HABER_BAS_INQ = HABER_BAS_INQ From INQUILINO Where COD_USUA = 'U00002' -- Mostrar el Dato Select @HABER_BAS_INQ g) Mostrar el Nmero de departamentos que tiene el Edificio cuyo cdigo es igual a E00001 Declare @NUM_DEPARTAMENTOS integer -- Obtener el Nmero de Departamentos Select @NUM_DEPARTAMENTOS = count(*) From EDIFICIOS E inner Join DEPARTAMENTOS D on E.COD_EDIF = D.COD_EDIF Where E.COD_EDIF = 'E00001' -- Mostrar el Dato Select @NUM_DEPARTAMENTOS 6.1.1.1. Declaracin de variables globales

Las variables globales son variables predefinidas suministradas por el sistema. Se distinguen de las variables locales por tener dos smbolos @. Estas son algunas variables globales del servidor:

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

131

Variable @@error

Variables globales de SQL Server Contenido Contiene 0 si la ltima transaccin se ejecut de forma correcta; en caso contrario, contiene el ltimo nmero de error generado por el sistema. La variable global @@error se utiliza generalmente para verificar el estado de error de un proceso ejecutado. Contiene el ltimo valor insertado en una columna IDENTITY mediante una instruccin insert Devuelve la Versin del SQL Server

@@identity

@@Version

@@SERVERNAME Devuelve el Nombre del Servidor @@LANGUAGE Devuelve el nombre del idioma en uso

6.1.2. PROCEDIMIENTOS ALMACENADOS Los procedimientos almacenados son grupos formados por instrucciones SQL y el lenguaje de control de flujo. Cuando se ejecuta un procedimiento, se prepara un plan de ejecucin para que la subsiguiente ejecucin sea muy rpida. Los procedimientos almacenados pueden: Incluir parmetros Llamar a otros procedimientos Devolver un valor de estado a un procedimiento de llamada o lote para indicar el xito o el fracaso del mismo y la razn de dicho fallo. Devolver valores de parmetros a un procedimiento de llamada o lote Ejecutarse en SQL Server remotos La posibilidad de escribir procedimientos almacenados mejora notablemente la potencia, eficacia y flexibilidad de SQL. Los procedimientos compilados mejoran la ejecucin de las instrucciones y lotes de SQL de forma dramtica. Adems los procedimientos almacenados pueden ejecutarse en otro SQL Server si el servidor del usuario y el remoto estn configurados para permitir logins remotos. Los procedimientos almacenados se diferencian de las instrucciones SQL ordinarias y de lotes de instrucciones SQL en que estn precompilados. La primera vez que se ejecuta un procedimiento, el procesador de consultas SQL Server lo analiza y prepara un plan de ejecucin que se almacena en forma definitiva en una tabla de sistema, Posteriormente, el procedimiento se ejecuta segn el plan almacenado. Puesto que ya se ha realizado la mayor parte del trabajo de procesamiento de consultas, los procedimientos almacenados se ejecutan casi de forma instantnea.

CIBERTEC

CARRERAS PROFESIONALES

132

Los procedimientos almacenados se crean con CREATE PROCEDURE. Para ejecutar un procedimiento almacenado, ya sea un procedimiento del sistema o uno definido por el usuario, use el comando EXECUTE. Tambin, puede utilizar el nombre del procedimiento almacenado solo, siempre que sea la primera palabra de una instruccin o lote.

6.1.2.1.

USO DEL LENGUAJE DE CONTROL DE FLUJO

El lenguaje de control de flujo se puede utilizar con instrucciones interactivas, en lotes y en procedimientos almacenados. El control de flujo y las palabras clave relacionadas y sus funciones son: Control de flujo y palabras clave relacionadas Funcin Define una ejecucin condicional Define una ejecucin alternativa cuando la condicin if es falsa BEGIN Comienzo de un bloque de instrucciones END Final de un bloque de instrucciones WHILE Repite la ejecucin de instrucciones mientras la condicin es verdadera BREAK Sale del final del siguiente bucle while ms exterior CONTINUE Reinicio del bucle while DECLARE Declara variables locales RETURN Sale de forma incondicional PRINT Imprime un mensaje definido por el usuario o una variable local en la pantalla del usuario /*COMENTARIO*/ Inserta un comentario en cualquier punto de una instruccin SQL --COMENTARIO Inserta una lnea de comentario en cualquier punto de una instruccin SQL CASE Permite que se muestre un valor alternativo CREATE / ALTER / DROP PROCEDURE

Palabra Clave IF ..ELSE

6.1.2.2.

Sintaxis para crear un procedimiento almacenado:

CREATE PROCEDURE NOMBRE_PROCEDIMIENTO AS CONSULTA_SQL

Sintaxis para modificar un procedimiento almacenado:

ALTER PROCEDURE NOMBRE_PROCEDIMIENTO AS CONSULTA_SQL Sintaxis para eliminar un procedimiento almacenado:

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

133

DROP PROCEDURE NOMBRE_PROCEDIMIENTO

Ejemplos: a) Cree un procedimiento almacenado que muestre todos los edificios. CREATE PROCEDURE LISTAR_EDIFICIOS AS Select * From EDIFICIOS

Como se aprecia, el procedimiento mostrado no tiene parmetros de entrada y para ejecutarlo deber usar una de las siguientes sentencias: EXECUTE LISTAR_EDIFICIOS EXEC LISTAR_EDIFICIOS LISTAR_EDIFICIOS Ahora veamos cmo se define un procedimiento almacenado con parmetros. b) Cree un procedimiento almacenado que permita buscar los datos de un Usuario. El procedimiento tiene los siguientes parmetros de entrada: Nombre y Apellido Paterno. CREATE PROCEDURE BUSCAR_USUARIO @NOM_USUA varchar(25) , @APEPATER_USUA varchar(25) AS Select * From USUARIO Where NOM_USUA = @NOM_USUA and APEPATER_USUA = @APEPATER_USUA Para ejecutarlo EXECUTE BUSCAR_USUARIO 'ENRIQUE','VERA' Como se aprecia el procedimiento almacenado recibe dos parmetros y realiza una bsqueda exacta dado el Nombre y Apellido del Usuario.

CIBERTEC

CARRERAS PROFESIONALES

134

c) Modifique el procedimiento anterior para que la bsqueda del Usuario sea por una secuencia de caracteres y no en forma exacta. ALTER PROCEDURE BUSCAR_USUARIO @NOM_USUA varchar(25), @APEPATER_USUA varchar(25) AS Select * From USUARIO Where NOM_USUA like '%' + @NOM_USUA + '%' and APEPATER_USUA like '%' + @APEPATER_USUA + '%' Para ejecutarlo EXECUTE BUSCAR_USUARIO 'EN','VE' La sentencia ALTER PROCEDURE permite modificar el contenido del procedimiento almacenado y la sentencia LIKE permite hacer la bsqueda por una secuencia de caracteres.

d) Cree un procedimiento almacenado que muestre el cdigo, nombre y direccin del edificio as como el cdigo, nmero de ambiente y piso del departamento. El procedimiento recibir como parmetro de entrada el cdigo del edificio. Se debe considerar que el parmetro de entrada tendr un valor por defecto igual a vaco. Create procedure BUSCAR_DEPARTAMENTOS @COD_EDIF char(6) = '' AS Select E.COD_EDIF, E.NOM_EDIF, E.DIRECC_EDIF, D.COD_DEP, D.NUM_AMB_DEP, D.PISO_DEP From EDIFICIOS E inner join DEPARTAMENTOS D on E.COD_EDIF = D.COD_EDIF Where E.COD_EDIF = @COD_EDIF Para ejecutarlo EXECUTE BUSCAR_DEPARTAMENTOS 'E00001' En el parmetro de entrada @COD_EDIF, se ha definido un valor por defecto igual a vaco. El procedimiento almacenado tomara este valor cuando no se defina un valor al momento de ejecutarse. EXECUTE BUSCAR_DEPARTAMENTOS e) Elimine el procedimiento almacenado BUSCAR_USUARIO Drop procedure BUSCAR_USUARIO

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

135

6.1.2.3.

IFELSE

La palabra clave IF con o sin la compaa ELSE se utiliza para introducir una condicin que determina si se ejecutar la instruccin siguiente. La instruccin SQL se ejecuta si la condicin se cumple, es decir, si devuelve TRUE (verdadero) La palabra clave ELSE introduce una instruccin SQL alternativa que se ejecuta cuando la condicin IF devuelva FALSE (falso).

A continuacin se presenta su sintaxis:

IF (condicin) BEGIN EXPRESIN SQL END ELSE BEGIN EXPRESIN SQL END

Ejemplos: a) Cree un procedimiento almacenado el cual reciba como parmetros dos cdigos de edificios y el programa deber evaluarlos e indicar que edificio tiene la mayor, menor o igual cantidad de departamentos. Create procedure VERIFICAR_NUMERO_DEPARTAMENTOS @COD_EDIF1 char(6), @COD_EDIF2 char(6) AS -- Variables Declare Declare

@NUM_DEPARTAMENTOS1 integer @NUM_DEPARTAMENTOS2 integer

-- Obtener el nmero de departamentos del Edificio 1 Select @NUM_DEPARTAMENTOS1 = count(*) From EDIFICIOS E inner join DEPARTAMENTOS D on E.COD_EDIF = D.COD_EDIF Where E.COD_EDIF = @COD_EDIF1 -- Obtener el nmero de departamentos del Edificio 2

CIBERTEC

CARRERAS PROFESIONALES

136

Select @NUM_DEPARTAMENTOS2 = count(*) From EDIFICIOS E inner join DEPARTAMENTOS D on E.COD_EDIF = D.COD_EDIF Where E.COD_EDIF = @COD_EDIF2 -- Verificar el Nmero de Departamentos If @NUM_DEPARTAMENTOS1 = @NUM_DEPARTAMENTOS2 Select 'Los Edificios tienen la misma cantidad de departamentos' Else If @NUM_DEPARTAMENTOS1 > @NUM_DEPARTAMENTOS2 Select 'El Edificio 1 tiene la mayor cantidad de departamentos' Else Select 'El Edificio 2 tiene la mayor cantidad de departamentos'

Para ejecutarlo EXECUTE VERIFICAR_NUMERO_DEPARTAMENTOS 'E00001', E00002 6.1.2.4. RETURN

La palabra clave RETURN sale de un lote o procedimiento de forma incondicional y puede usarse en cualquier momento de un lote o procedimiento.

RETURN

6.1.2.5.

BEGINEND

Las palabras clave BEGIN y END se utilizan para englobar una serie de instrucciones a fin de que sean tratadas como una unidad por las estructuras de control de flujo como ifelse. Una serie de instrucciones por begin y end se denomina bloque de instrucciones. La sintaxis de beginend es:

BEGIN BLOQUE DE INSTRUCCIONES END

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

137

Ejemplos: a) Cree un procedimiento almacenado que permita el ingreso de datos de un usuario. El procedimiento tendr los siguientes parmetros de entrada: cdigo, nombre, apellido paterno, apellido materno, fecha de nacimiento, fecha de registro, tipo de documento, nmero de documento y cdigo de estado. Considere las siguientes condiciones antes de ingresar un usuario: El cdigo del usuario debe ser nico No deber ingresar usuarios cuya edad sea menor de 18 aos CREATE PROCEDURE INSERTA_USUARIO @COD_USUA char(6), @NOM_USUA varchar(25), @APEPATER_USUA varchar(25), @APEMATER_USUA varchar(25), @FEC_NAC_USUA datetime, @FEC_REG_USUA datetime, @TIPO_DOC_USUA varchar(20), @NUM_DOC_USUA char(8), @COD_EST char(6) AS -- Verificar que el Usuario sea nico If Exists( Select * From Usuario Where COD_USUA = @COD_USUA ) Begin Select 'Ya existe un Usuario con el mismo Cdigo' Return End -- Verificar la Edad del Usuario If datediff(yy,@FEC_NAC_USUA,getdate())<18 Begin Select 'La edad del Usuario debe ser mayor a 18 aos' Return End -- Insertar los datos del Usuario Insert into USUARIO ( COD_USUA, NOM_USUA, APEPATER_USUA, APEMATER_USUA, FEC_NAC_USUA, FEC_REG_USUA, TIPO_DOC_USUA, NUM_DOC_USUA, COD_EST ) Values ( @COD_USUA,

CIBERTEC

CARRERAS PROFESIONALES

138

@NOM_USUA, @APEPATER_USUA, @APEMATER_USUA, @FEC_NAC_USUA, @FEC_REG_USUA, @TIPO_DOC_USUA, @NUM_DOC_USUA, @COD_EST ) b) Cree un procedimiento almacenado que permita modificar los datos de un inquilino. El procedimiento tendr los siguientes parmetros de entrada: cdigo de usuario, nombre de aval, apellido del aval, Haber bsico, estado civil y lugar de trabajo del inquilino. As mismo, slo se podrn modificar aquellos inquilinos cuyo Haber bsico sea menor a 600 soles. CREATE PROCEDURE MODIFICA_INQUILINO @COD_USUA char(6), @NOM_AVAL_INQ varchar(30), @APELL_AVAL char(30), @HABER_BAS_INQ float, @EST_CIVIL_INQ char(1), @LUG_TRAB_INQ varchar(50) AS -- Variables Declare @HABER_BAS_INQ_ACTUAL float -- Obtener el Haber Bsico Actual del Inquilino Select @HABER_BAS_INQ_ACTUAL = HABER_BAS_INQ From INQUILINO Where COD_USUA = @COD_USUA -- Verificar el Haber Bsico del Inquilino If @HABER_BAS_INQ_ACTUAL>600 Begin Select 'El Haber Bsico del Inquilino debe ser menor a 600 soles' Return End -- Actualizar los Datos Update INQUILINO Set COD_USUA = @COD_USUA, NOM_AVAL_INQ = @NOM_AVAL_INQ, APELL_AVAL = @APELL_AVAL, HABER_BAS_INQ = @HABER_BAS_INQ, EST_CIVIL_INQ = @EST_CIVIL_INQ, LUG_TRAB_INQ = @LUG_TRAB_INQ Where COD_USUA = @COD_USUA

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

139

c) Cree un procedimiento almacenado que permita eliminar los datos de un Contrato. El procedimiento tendr como parmetro de entrada el cdigo del contrato. Tome en cuenta las siguientes consideraciones antes de eliminar un producto: Slo se podrn eliminar contratos que hayan sido generados en los ltimos cuatro meses. Deber verificar que el contrato no tenga detalle de contrato. CREATE PROCEDURE ELIMINAR_CONTRATO @COD_CONT char(6) AS --Variables Declare @FEC_FIRMA datetime -- Obtener la Fecha de Firma Select @FEC_FIRMA = FEC_FIRMA From CONTRATO Where COD_CONT = @COD_CONT -- Verificar la Antigedad del Contrato If datediff(mm,@FEC_FIRMA,getdate())>4 Begin Select 'La antigedad del Contrato no debe ser mayor a 4 meses' Return End -- Verificar que el Contrato no se encuentre asociado algn Detalle If Exists( Select * From DETALLECONTRATO Where COD_CONT = @COD_CONT ) Begin Select 'El Contrato tiene su Detalle por lo tanto no puede ser eliminado' Return End -- Eliminar los Datos Delete from CONTRATO Where COD_CONT = @COD_CONT 6.1.2.6. WHILE

WHILE se utiliza para definir una condicin para la ejecucin repetida de una instruccin o un bloque de instrucciones. Las instrucciones se ejecutan reiteradamente siempre que la condicin especificada es verdadera. La sintaxis de WHILE es: WHILE BOOLEAN_EXPRESION EXPRESION_SQL

CIBERTEC

CARRERAS PROFESIONALES

140

BREAK y CONTINUE controlan el funcionamiento de las instrucciones dentro de un bucle while. BREAK permite salir del bucle while. CONTINUE hace que el bucle while se inicie de nuevo. La sintaxis de BREAK y CONTINUE es:

WHILE BOOLEAN_EXPRESION BEGIN EXPRESION_SQL [ EXPRESION_SQL] BREAK [ EXPRESION_SQL] CONTINUE [ EXPRESION_SQL] END

6.1.2.7.

CASE

La funcin CASE es una expresin especial de Transact SQL que permite que se muestre un valor alternativo dependiendo de una columna. Este cambio es temporal, con lo que no hay cambios permanentes en los datos.

La funcin CASE est compuesta de: La palabra CASE El nombre de la columna que se va transformar Clusulas WHEN que se especifican las expresiones que se van a buscar y clusulas THEN que especifican las expresiones que las van a reemplazar La palabra END Una clusula AS opcional que define un alias de la funcin CASE

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

141

Ejemplo: Select COD_USUA, NOM_USUA, APEPATER_USUA, APEMATER_USUA, Case Month(FEC_NAC_USUA) When 1 Then 'Enero' When 2 Then 'Febrero' When 3 Then 'Marzo' When 4 Then 'Abril' When 5 Then 'Mayo' When 6 Then 'Junio' When 7 Then 'Julio' When 8 Then 'Agosto' When 9 Then 'Septiembre' When 10 Then 'Octubre' When 11 Then 'Noviembre' When 12 Then 'Diciembre' End As Mes_Nacimiento From USUARIO

3.9 Crear un sp que permita incrementar el haber bsico de un inquilino en funcin de su estado civil (20% para casados o viudos y 10% para los solteros y divorciados). Asimismo, si el inquilino tiene una comisin aumentar su haber con ese monto. Create Procedure spIncHaberInquilino @Inquilino Char(6), @Comision Numeric(10,2) = Null --Parmetro con valor por defecto As Begin -- Inicio del sp -- Validar que el cdigo y la descripcion no sean nulas If( @Inquilino Is Null ) Begin Print 'El cdigo del inquilino no puede ser NULO!!!' Return End -- Validar si el inquilino existe If Not Exists(Select * From Inquilino Where Cod_Usua = @Inquilino) Begin Print 'Actualizacion cancelada. El inquilino no existe.' Return End -- Variables locales para el proceso Declare @HaberBasico Int Declare @EstadoCivil Char(1) Declare @IncrementoPorEstadoCivil Int -- Determinar valores del inquilino Select @HaberBasico = Haber_Bas_Inq,

CIBERTEC

CARRERAS PROFESIONALES

142

@EstadoCivil = Est_Civil_Inq From Inquilino Where Cod_Usua = @Inquilino -- Determinar porcentaje de incremento If(@EstadoCivil In ('C','V')) Set @IncrementoPorEstadoCivil = @HaberBasico * 0.20 Else Set @IncrementoPorEstadoCivil = @HaberBasico * 0.10 -- Eliminar el departamento Update Inquilino Set Haber_Bas_Inq = Haber_Bas_Inq + @IncrementoPorEstadoCivil + IsNull(@Comision,0) Where Cod_Usua = @Inquilino End -- Fin del spIncHaberInquilino

-- Ejecutar el spIncHaberInquilino Select * From Inquilino Where Cod_Usua = 'USU002' Exec spIncHaberInquilino 'USU002' Select * From Inquilino Where Cod_Usua = 'USU002' Select * From Inquilino Where Cod_Usua = 'USU002' Exec spIncHaberInquilino 'USU002', 1 Select * From Inquilino Where Cod_Usua = 'USU002'

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

143

6.1.2.8.

Procedimiento almacenado para pginas de datos

Cuando se tiene que mostrar una serie numerosa de resultados en una pgina web, es necesario mostrar estos de poco en poco. Para ello, se utiliza la paginacin, dividir los resultados en grupos y mostrarlos en distintas pginas. Una parte fundamental es la consulta a la base de datos, la cual tiene que ser eficiente. 6.1.2.8.1. Funcin ROW_NUMBER ( ) Devuelve el nmero secuencial de una fila de una particin de un conjunto de resultados, comenzando con 1 para la primera fila de cada particin. Sintaxis: ROW_NUMBER ( ) Argumentos <partition_by_clause> Divide el conjunto de resultados generado por la clusula FROM en particiones a las que se aplica la funcin ROW_NUMBER. <order_by_clause> Determina el orden en el que se asigna el valor ROW_NUMBER a las filas de una particin.Un entero no puede representar una columna cuando se usa la clusula <order_by_clause> en una funcin de categora. OVER ( [ <partition_by_clause> ] <order_by_clause> )

Tipos de valor devueltos

bigint
Nota La clusula ORDER BY determina la secuencia en la que se asigna a las filas el ROW_NUMBER nico correspondiente en una particin especificada.

6.1.2.8.2.

Funcin CEILING()

Devuelve el entero ms pequeo mayor o igual que la expresin numrica especificada. Sintaxis CEILING ( numeric_expression )

CIBERTEC

CARRERAS PROFESIONALES

144

6.1.2.8.3. Ejemplo1 (Versin no recomendada) Create Procedure ListaDptosPaginacion_Ejemplo1 @PageSize int, -- Tamao de la pg(Cantidad de registros a devolver) @PageNumber int As Begin -- Seleccionar los datos que se desean observar pero agregndoles el nmero de -- fila Select Top ( @PageSize) * -- Obtiene todos los campos de la consulta cruda (RawData) From ( Select Row_Number() Over (Order By Dep.Cod_Edif, Dep.Cod_Dep)-1 As RowNum, -- Agrega el nmero de fila a cada registro Dep.Cod_Edif As IDEdif, Dep.Cod_Dep As IDDpto, Edi.Nom_Edif As NombreEdif, Dep.Area_Total_Dep As AreaTotalEdif, Dep.Area_Construida_Dep As AreaContruidaDpto, Dep.Precio_AlqXMes_Dep As PrecioAlquilerDpto From Departamentos As Dep Inner Join Edificios As Edi On Dep.Cod_Edif = Edi.Cod_Edif ) As RawData Where RowNum >= @PageSize * (@PageNumber - 1) Order By RowNum End; -- Ejecutar el procedimiento almacenado ---------------------------------------------------------Exec ListaDptosPaginacion_Ejemplo1 50, 1 -- Pgina que se desea devolver

6.1.2.8.4. Ejemplo2 (Versin recomendada) Create Procedure ListaDptosPaginacion_Ejemplo2 @PageSize int, -- Tamao de la pgina (Cantidad de registros a -- devolver) @PageNumber int, -- Pgina que se desea devolver @PageMax int output -- Parmetro de salida que devolver el total de -- pginas de la consulta base As Begin --Seleccionar los datos que se desean observar pero agregndoles el nmero de --fila Select *, -- Obtiene todos los campos de la consulta cruda (RawData) Row_Number() Over (Order By IDEdif, IDDpto)-1 As RowNum

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

145

- Agrega el nmero de fila a cada registro Into #Data -- Almacena el resultado en una tabla temporal From ( Select Dep.Cod_Edif As IDEdif, Dep.Cod_Dep As IDDpto, Edi.Nom_Edif As NombreEdif, Dep.Area_Total_Dep As AreaTotalEdif, Dep.Area_Construida_Dep As AreaContruidaDpto, Dep.Precio_AlqXMes_Dep As PrecioAlquilerDpto From Departamentos As Dep Inner Join Edificios As Edi On Dep.Cod_Edif = Edi.Cod_Edif ) As RawData -- Obtenemos los registros de la pgina solicitada Select * From #Data Where Ceiling(RowNum/@PageSize)+1 = @PageNumber Order By RowNum -- Obtenemos el nmero de pginas de la data cruda Select @PageMax =(Max(RowNum)/@PageSize)+1 From #Data; End;

-- Ejecutar el procedimiento almacenado ---------------------------------------------------------Declare @pages Int Exec ListaDptosPaginacion_Ejemplo2 50, 1, @pages Output Print @pages

CIBERTEC

CARRERAS PROFESIONALES

146

6.1.1.1.9.5.

ACTIVIDADES PROPUESTAS

En la base de datos VENTAS: 1. Cree un procedimiento almacenado que permita buscar los datos de un producto. El procedimiento tiene como parmetro de entrada el cdigo del producto. 2. Cree un procedimiento almacenado que muestre los datos de las boletas con su monto total por boleta. El procedimiento recibir como parmetro de entrada el cdigo del vendedor que emiti dicha boleta. 3. Cree un procedimiento almacenado que muestre el detalle de una boleta. El procedimiento recibir como parmetro de entrada el cdigo de dicha boleta. 4. Cree un procedimiento almacenado que permita ingresar datos a la tabla PRODUCTO y que reciba como parmetros de entrada los datos para cada campo. Considere que el cdigo del producto es un valor generado por el procedimiento almacenado y tiene la forma tal como PRO001. Adicionalmente, verifique que no se ingresen dos productos con la misma descripcin, y si esto ocurriera, muestre un mensaje que indique Ya existe un producto con la misma descripcin. Los mensajes de error debern ser invocados desde otro procedimiento almacenado. 5. Cree un procedimiento almacenado que permita el ingreso de datos de un empleado. El procedimiento tendr como parmetros de entrada todos los campos de la tabla empleado. Tome en cuenta las siguientes condiciones antes de ingresar un empleado: El cdigo del empleado debe ser nico. No deber permitir ingresar empleados cuya edad sea menor a 18 aos. No deber permitir ingresar empleados con el email repetido. Si existieran errores se mostrarn los mensajes correspondientes. 6. Cree un procedimiento almacenado que permita actualizar el stock mnimo de un producto. El procedimiento tendr los siguientes parmetros de entrada: cdigo del producto y el stock mnimo a actualizar. Considere las siguientes condiciones antes de modificar un producto: No permitir registrar stocks negativos. Slo puede modificarse aquellos productos con un stock actual menor a 100 unidades. Si existieran errores se mostrarn los mensajes correspondientes.

7. Cree un procedimiento almacenado que permita eliminar un distrito. El


procedimiento tendr como parmetro de entrada el cdigo del distrito. Un distrito ser eliminado siempre y cuando no este asociado a algn empleado o cliente.

CARRERAS PROFESIONALES

CIBERTEC

BASE DE DATOS LABORATORIO

147

Resumen

En est seccin se han explicado las extensiones de programacin que van ms all de las implementaciones tpicas de SQL y que hacen de Transact SQL un lenguaje de programacin especializado. Las instrucciones de Transact/SQL pueden agruparse en procesos o lotes, permanecer en la base de datos, ejecutarse repetidamente en forma de procedimientos almacenados. Los procedimientos almacenados de Transact/SQL pueden ser bastante complejos y pueden llegar a ser una parte importante del cdigo fuente de su aplicacin. Si desea saber ms acerca de estos temas, puede consultar las siguientes pginas: http://technet.microsoft.com/es-es/library/ms187926.aspx Tutorial para la creacin de procedimientos almacenados

http://www.devjoker.com/contenidos/Tutorial-de-TransactSQL/238/Procedimientos-almacenados-en-Transact-SQL.aspx
Tutorial para la creacin de procedimientos almacenados http://technet.microsoft.com/es-es/library/ms186755.aspx Tutorial para la creacin de funciones

CIBERTEC

CARRERAS PROFESIONALES

También podría gustarte