manual administracion de bases de datos i - v0810
TRANSCRIPT
Administración de Base de Datos I 2
Presentación…………………………………………………………………………………………..3
Modulo A
Semana 1: Creación de Base de Datos y Archivos de datos……………….……...4
Semana 2: Creación de Tipos de Datos y Tablas .........……...………….…….28
Semana 3: Creación de Índices e Implementación de consultas.....…..………38
Semana 4: Consultas Multitablas – Subconsultas......……………........….………65
Semana 5: Consultas Agrupadas – Funciones de Grupo - Vistas…….…….....74
Semana 6: Revisión de conocimientos……………………………………..…...……….92
Semana 7: Procedimientos Almacenados I ……………………………………………109
Semana 8: Procedimientos Almacenados II .…………………………………………115
Semana 9: Funciones definidas por el usuario – Trigger…………………121
Bibliografía: ……………………………………………………………………………………………
Administración de Base de Datos I 3
PRESENTACIÓN
Esta guía didáctica es un material de ayuda institucional, perteneciente a las
especialidades de computación, Ingeniería de Software e Ingeniería de Redes y
Comunicaciones tiene por finalidad proporcionar los conocimientos de la
implementación y administración de Base de Datos en su primera parte.
La Organización SISE, líder en la enseñanza tecnológica a nivel superior, promueve
la elaboración de materiales educativos, en concordancia a las exigencias de las
tecnologías de estos tiempos, que permiten la creación de nuevas herramientas de
aprendizaje con el objetivo de facilitar el acceso de los estudiantes a la educación en
el marco del desarrollo tecnológico de la informática de las telecomunicaciones.
Esta guía contiene conceptos relacionados con la planificación en la creación de una
base de datos, así como los objetos contenidos en él, como tablas de datos, índices,
tipos de datos, funciones, procedimientos almacenados y disparadores. También
contiene información sobre las sentencias para el manejo de datos.
En este proceso el alumno aprenderá sentencias SQL (DDL – DML - DCL), que le
permitirá definir, manipular y controlar datos, utilizando el sistemas administrador de
base de datos Microsoft SQL Server.
La implementación de una Base de datos, permitirán que el alumno aplique todos los
conceptos.
Este material en su primera edición, servirá para ayudar a nuestros estudiantes
SISESINOS.
Administración de Base de Datos I 4
Arreglos
Contenidos
- Lección 1: Crear Databases - Lección 2: Crear Filegroups - Lección 3: Crear Schemas
____________________________________________________________________________
Después de completar esta semana, los alumnos serán capaces de:
■ Crear bases de datos.
■ Crear grupos de archivos.
■ Crear esquemas.
Introducción Una de las tareas más fundamentales que un desarrollador de bases de datos
debe realizar es la creación de una base de datos y sus componentes principales, tales como
grupos de archivos y esquemas.
En esta semana, usted aprenderá cómo crear bases de datos, grupos de archivos, esquemas.
Administración de Base de Datos I 5
BASE DE DATOS
Una Base de Datos es un contenedor de Objetos, estos objetos puede ser:
Orígenes de Datos Dimensiones Procedimientos Funciones
Desde el concepto mas simple una base de datos, es un conjunto de datos relevantes, trascendentes para el negocio, que se encuentran ordenados, organizados en estructuras llamadas tablas, estas, a su vez estarán interrelacionadas, todo ello almacenado en un sistema computacional (Server, Storage, Software DBMS).
Para Administrar y gestionar esta estructura a nivel corporativo (transacciones de millones de registros) que se encuentran en un servidor, se necesita un DBMS (Data Base Manager System). Un DBMS, es un programa que permite crear, administrar y gestionar, sistemas de base de datos. Entre los DBMS mas importantes vigentes en el mercado, tenemos:
ORACLE Database 11g Microsoft SQL Server 2008 IBM DB2 SyBase Postgre SQL.
Administración de Base de Datos I 6
Un DBMS, junto al Servidor y Storage (Almacenamiento), conforman el sistema de Base de Datos, que en todo momento debe ofrecer:
Accesibilidad Alta Disponibilidad Seguridad Alto Performance
Todos estos DBMS, utilizan un lenguaje standard, este lenguaje es el SQL. SQL es un acrónimo (Structured Query Language), adoptado como lenguaje de base de datos relacional por ISO (International Standard Organization), desde 1987. El Lenguaje SQL, presenta una serie de comandos, y estos se clasifican en:
DDL (Data Definition Language – Lenguaje de definición de datos) DML (Data Manipulation Language – Lenguaje de manipulación de datos) DCL (Data Control Language – Lenguaje de control de Datos)
DDL DML DCLPara crear Base de datos y
sus objetos
Para manipulación de datos,
transacciones
Para controlar, gestionar,
asegurar informaciónCREATE INSERT GRANT
ALTER DELETE REVOKE
DROP UPDATE BACKUP
SELECT RESTORE Todos estos DBMS, utilizan un lenguaje standard, este lenguaje es el SQL. SQL es un acrónimo (Structured Query Language), adoptado como lenguaje de base de datos relacional por ISO (International Standard Organization), desde 1987.
Administración de Base de Datos I 7
Creación de una Base de Datos:
Es importante saber, que en Microsoft SQL Server 2008, existen las bases de datos del sistema. SQL Server incluye las siguientes bases de datos del sistema.
Base de datos del sistema Descripción
masterRegistra toda la información del sistema para una instancia de SQL
Server.
msdbLa utiliza el Agente SQL Server para programar alertas y trabajos.
model
Se utiliza como plantilla para todas las bases de datos creadas en
la instancia de SQL Server. Las modificaciones hechas a la base de
datos model, como el tamaño de la base de datos, la
intercalación, el modelo de recuperación y otras opciones de base
de datos, se aplicarán a las bases de datos que se creen con
posterioridad.
tempdbÁrea de trabajo que contiene objetos temporales o conjuntos de
resultados intermedios.
. Antes de crear una base de datos considere lo siguiente:
Puede utilizar SQL Server para realizar el procesamiento de transacciones, almacenar y analizar datos y construir nuevas aplicaciones de bases de datos. SQL Server es una familia de productos y tecnologías que se reúne el almacenamiento de datos requisitos de procesamiento de transacciones online (OLTP) y el procesamiento analítico en línea (OLAP) entornos.
Administración de Base de Datos I 8
SQL Server es un sistema de base de datos relacional de gestión de (RDBMS) que: ■ Administra el almacenamiento de datos para las transacciones y el análisis. ■ Almacena los datos en una amplia gama de tipos de datos, incluyendo texto, numérico, extensible Markup Language (XML), y objetos de gran tamaño. ■ Responde a las peticiones de aplicaciones cliente. ■ Utilización de Transact-SQL, XML, SQL Server u otros comandos para enviar solicitudes entre una aplicación cliente y SQL Server. El componente de RDBMS de SQL Server es responsable de: ■ El mantenimiento de las relaciones entre los datos de una base de datos. ■ Asegurar que los datos se almacenan correctamente y que las normas que definen las relaciones entre los datos no sean violados. ■ La recuperación de todos los datos a un punto de coherencia conocido, en el caso de un sistema fallo. Bases de datos OLTP Su función es organizar los datos en tablas relacionales de una base de datos OLTP, reducir la información redundante y aumentar la velocidad de las actualizaciones. SQL Server permite a un gran número de usuarios realizar transacciones y al mismo tiempo cambiar los datos en tiempo real en bases de datos OLTP. Bases de datos OLAP Tecnología OLAP se utiliza para organizar y resumir grandes cantidades de datos para que un analista pueda evaluar los datos de forma rápida y en tiempo real. Microsoft Analysis Server SQL Services organiza estos datos para apoyar una amplia gama de soluciones empresariales, desde presentación de informes empresariales y análisis para el modelado de datos y soporte de decisiones. El usuario que crea la base de datos, se convierte en su propietario En un servidor se puede crear hasta 32,767 bases de datos Las funciones fijas del servidor que tienen permiso para crear base de datos son:
sysadmin (sa) y dbcreator, aunque se puede otorgar permiso a otros usuarios.
Una base de datos tiene una estructura física conformada por archivos, estos pueden ser de 02 tipos: DataFile (Archivo de datos).- Que son de 02 subtipos:
o Primary DataFile.- Archivos de datos primarios, es el principal archivo de datos, es el punto de partida de la base de datos y puntos a los otros archivos de la base de datos. Cada base de datos tiene un archivo de datos principal. La extensión de nombre de archivo recomendado para los archivos de datos primarios es .mdf.
o Secondary DataFile.- Archivos de datos secundarios se componen de todos los
archivos de datos, distinto del archivo de datos principal. Algunas bases de datos pueden no tener los archivos de datos secundarios, mientras que otros tienen varios archivos de datos secundarios. La extensión de nombre de archivo recomendado para archivos de datos secundarios es .ndf.
LogFile (Archivo de registro de transacciones).- Archivos de registro mantienen toda la
información de registro que se utiliza para recuperar la base de datos. Debe haber al menos un archivo de registro para cada base de datos, aunque puede haber más de uno. La extensión de nombre de archivo recomendado para archivos de registro es .ldf.
Administración de Base de Datos I 9
PRIMARY SECONDARY
DATAFILE DATAFILE
(.mdf) (.ndf)
LOGFILE
(.ldf)
BASE DE DATOS
DATAFILE LOGFILE
Cada archivo tiene sus propiedades que son: Name FileName Size MaxSize FileGrowth Al planear una nueva base de datos, usted debe tomar en cuenta varios aspectos. Estos incluyen, pero no se limitan a, lo siguiente: ■ EL propósito de almacenamiento de datos OLTP y bases de datos OLAP son diferentes y, por lo tanto, los requisitos de diseño diferentes. ■ Rendimiento de transacciones. Las Bases de datos OLTP a menudo tienen un alto requerimiento para el número de transacciones que pueden ser procesados por minuto, hora o día. Un diseño eficiente con un nivel apropiado de normalización, índices y datos particiones pueden lograr un nivel muy alto de rendimiento de transacciones. ■ El potencial de crecimiento de almacenamiento de datos física. Grandes cantidades de datos requieren hardware adecuado para la memoria, espacio en disco duro y unidad central de procesamiento (CPU) de potencia. Estimación de la cantidad de datos que almacenará la base de datos sobre meses y años posteriores ayudará a asegurarse de que su base de datos trabaje de manera eficiente. Puede configurar las bases de datos para que los archivos puedan crecer automáticamente hasta un tamaño máximo especificado. Sin embargo, el crecimiento automático de archivos puede afectar al rendimiento.
Administración de Base de Datos I 10
En la mayoría de soluciones de bases de datos basadas en servidor, debe crear la base de datos con archivos de tamaño adecuado, vigilar el uso del espacio, y reasignar más espacio sólo cuando sea necesario. ■ Ubicación del archivo. ¿Dónde colocar los archivos de base de datos puede tener un impacto en rendimiento. Si usted es capaz de utilizar varias unidades de disco, puede extender sus archivos de base de datos a través de más de un disco. Esto permite a SQL Server tener ventaja de las conexiones múltiples y múltiples discos cabezas de lectura y escritura de datos eficaz. Ejemplo de la creación de una base de datos. Puede crear una base de datos utilizando las herramientas visuales en SQL Server Management Studio o el comando DDL Transact-SQL CREATE DATABASE. El siguiente ejemplo muestra cómo crear una base de datos mediante Transact-SQL.
CREATE DATABASE TestDB ON (NAME = 'TestDB_Data', FILENAME = 'D:\DATA\TransactTestDB.mdf', SIZE = 20 MB, FILEGROWTH = 0) LOG ON (NAME = 'TestDB_Log', FILENAME = 'D:\DATA\TestDB_Log.ldf', SIZE = 5 MB, FILEGROWTH = 0)
Transaction Logging
Administración de Base de Datos I 11
Transaction Una transacción es una sola unidad de trabajo en una base de datos. El acrónimo ACID es de uso frecuente para describir las características de una transacción. ACID significa: ■ Atomicidad. Una transacción es una unidad atómica, bien de todas las operaciones definidas en las transacciones se han completado, o ninguno de ellos se completan. ■ Coherencia. Una transacción siempre deja los datos en un estado coherente. ■ Aislamiento (Isolation). Una transacción opera al margen de la actividad de otra base de datos; otra actividad de base de datos concurrentes no tiene ningún efecto sobre la transacción. ■ Durabilidad. Cuando una transacción se confirma, los resultados se almacenan en dispositivos de almacenamiento persistentes y sobrevivirá al fallo del sistema. SQL Server es compatible con transacciones implícitas para las intervenciones individuales que modifican datos y las transacciones explícitas para múltiples sentencias que deben ejecutarse como una unidad. Transaction log SQL Server, registra todas las transacciones en un fichero de transacción de registro para mantener base de datos coherente y para ayudar en la recuperación de un fallo de base de datos. El registro (LOG) es un área de almacenamiento que automáticamente rastrea los cambios en una base de datos. SQL Server graba en el disco las modificaciones, en el LOG están las modificaciones que se realizan antes de escribirlos en la base de datos. Logging process El proceso de registro es el siguiente: 1. La aplicación envía una modificación de datos. 2. Cuando una modificación es ejecutada, las páginas de datos afectados se cargan desde el disco en la caché del búfer, a condición de que las páginas no se encuentran ya en la caché del búfer de una consulta anterior. 3. El LOG registra cada instrucción de modificación de datos como la modificación que se haga. El cambio se registra siempre en el LOG y se escribe en disco antes de que se haga en la base de datos. Este tipo de registro se denomina registro de escritura anticipada. 4. En forma recurrente, el proceso escribe todas las transacciones terminadas a la base de datos en el disco. Si el sistema falla, el proceso de recuperación automático utiliza el registro de transacciones (LOG) a ejecutar todas las transacciones confirmadas y hacer retroceder (RollBack) cualquier transacción incompleta. El registro utiliza marcadores de transacción durante la recuperación automática para determinar el inicio y los puntos de finalización de una transacción. Una transacción se considera completa cuando el marcador BEGIN TRANSACTION tiene un marcador asociado COMMIT TRANSACTION, las páginas de datos se escriben en el disco cuando se produce un CheckPoint.
Administración de Base de Datos I 12
Práctica: Creación de bases de datos Objetivos El objetivo de esta práctica es para que usted pueda crear una base de datos con SQL Server Management Studio y mediante el uso de Transact-SQL. En esta práctica, se utiliza tanto técnicas para crear una nueva base de datos. Preparación Asegúrese de que la máquina virtual se está ejecutando Si una máquina virtual no se ha iniciado, siga los siguientes pasos: 1. Cierre todas las otras máquinas virtuales. 2. Inicie la máquina virtual. Para crear una base de datos utilizando SQL Server Management Studio En el explorador de objetos de Microsoft SQL 2008, señalar el contenedor BASE DE
DATOS, hacer click en el botón secundario, luego elegir la opción NUEVA BASE DE
DATOS, aparecerá la ventana para definir el nombre y propiedades de la Base de Datos a
crear.
Administración de Base de Datos I 13
En el cuadro de diálogo Nueva base de datos, introducir los datos en la tabla siguiente.
Propiedad Valor Nombre de Base de datos testdb Tamaño inicial de testdb 20
1. En la columna de Crecimiento automático de la entrada testdb, haga clic en el botón de puntos suspensivos (...). 2. En el cuadro de Crecimiento automático, en el cuadro de diálogo para testdb, desactive la opción Habilitar Crecimiento automático en la casilla de verificación y, a continuación, haga clic en Aceptar. 3. Cambiar el tamaño inicial de configuración de la entrada TestDB_log a 5 MB. 4. En la columna de Crecimiento automático de la entrada TestDB_log, haga clic en el botón de puntos suspensivos (...). 5. En el Crecimiento automático en el cuadro de diálogo para TestDB_log, desactive la opción Habilitar Crecimiento automático en el cuadro de verificación y haga clic en Aceptar. 6. En el cuadro de diálogo Nueva base de datos, haga clic en Aceptar para crear la base de datos. 7. En Explorador de objetos, expanda la carpeta Bases de datos para verificar que se ha creado la base de datos testdb, y si testdb no aparece, haga clic en la carpeta Bases de datos y haga clic en Actualizar. 8. Mantenga SQL Server Management Studio abierto. Lo utilizará en el siguiente procedimiento.
Administración de Base de Datos I 14
Para crear una base de datos utilizando Transact-SQL Realice los pasos siguientes para crear una base de datos mediante Transact-SQL: 1. En SQL Server Management Studio, haga clic en el botón Nueva consulta en la barra de herramientas. 2. En la nueva ventana, consulta en blanco, escriba el siguiente código de Transact-SQL (el parámetro filename debe ser escrita en una sola línea).
CREATE DATABASE TransactTestDB ON (NAME = 'TransactTestDB', FILENAME = 'C:\Program Files\Microsoft SQL
Server\MSSQL.1\MSSQL\DATA\TransactTestDB.mdf', SIZE = 20 MB, FILEGROWTH = 0)
LOG ON (NAME = 'TransactTestDB_Log', FILENAME = 'C:\Program Files\Microsoft SQL
Server\MSSQL.1\MSSQL\DATA\TransactTestDB_Log.ldf', SIZE = 5 MB, FILEGROWTH = 0)
3. Haga clic en el botón Ejecutar en la barra de herramientas. 4. Cuando el comando se ha completado correctamente, haga clic en la carpeta Bases de datos en el Explorador de objetos, y luego haga clic en Actualizar para comprobar que la base de datos TransactTestDB ha sido creada. Ejemplos A. Crear una base de datos sin especificar archivos En el ejemplo siguiente se crea la base de datos myTest, crea un archivo primario correspondiente y archivo de registro de transacciones.
USE master; 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. Creación de una base de datos que especifica los datos y archivos de registro de transacciones. En el ejemplo siguiente se crea la base de datos de ventas (SALES). El primer archivo (Sales_dat) se convierte en el archivo principal. El archivo Sales_log se asigna en megabytes, porque el sufijo MB se recoja explícitamente en el parámetro de tamaño.
Administración de Base de Datos I 15
USE master; GO CREATE DATABASE Sales ON ( NAME = Sales_dat, FILENAME='C:\saledat.mdf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 ) LOG ON ( NAME = Sales_log, FILENAME = 'C:\salelog.ldf', SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = 5MB ) GO
C. Crear una base de datos mediante la especificación de archivos de datos múltiples y archivos de registro de transacciones
USE master; GO CREATE DATABASE Archive ON PRIMARY (NAME = Arch1, FILENAME = 'D:\SalesData\archdat1.mdf', SIZE = 100MB, MAXSIZE = 200, FILEGROWTH = 20), ( NAME = Arch2, FILENAME = 'D:\SalesData\archdat2.ndf', SIZE = 100MB, MAXSIZE = 200, FILEGROWTH = 20), ( NAME = Arch3, FILENAME = 'D:\SalesData\archdat3.ndf', SIZE = 100MB, MAXSIZE = 200, FILEGROWTH = 20) LOG ON (NAME = Archlog1, FILENAME = 'D:\SalesData\archlog1.ldf', SIZE = 100MB, MAXSIZE = 200, FILEGROWTH = 20), (NAME = Archlog2, FILENAME = 'D:\SalesData\archlog2.ldf', SIZE = 100MB, MAXSIZE = 200, FILEGROWTH = 20) ; GO
Administración de Base de Datos I 16
Creando FILEGROUPS
SQL Server 2008 almacena los datos en archivos de datos que luego pueden ser agrupados en uno o más grupos de archivos. A pesar de una base de datos se puede ejecutar con éxito con un solo grupo de archivos, hay veces en que podría ser ventajoso crear grupos de archivos múltiples. En esta parte, usted aprenderá acerca de grupos de archivos y cómo se puede mejorar el funcionamiento de una base de datos. También aprenderás cómo crear grupos de archivos.
¿Qué es un FILEGROUP?
Un grupo de archivos es una colección lógica de archivos de datos que permite a los administradores administrar todos los archivos dentro del grupo de archivos como un solo tema. La capacidad de controlar la ubicación física de objetos individuales en la base de datos puede proporcionar un número de gestión y ventajas de rendimiento. Por ejemplo, puede utilizar grupos de archivos múltiples para controlar la forma en que el datos en una base de datos se almacena físicamente en dispositivos de almacenamiento y de separar de lectura / escritura de datos a partir de datos de sólo lectura. Tipos de FileGroups SQL Server 2005 tiene un grupo de archivos principal y también puede tener grupos de archivos definidos por el usuario. ■ El grupo de archivos principal contiene el archivo de datos principal con las tablas del sistema. El archivo de datos principal normalmente utiliza la extensión mdf. ■ Un grupo de archivos definido por el usuario se compone de archivos de datos que se agrupan para asignación y fines administrativos. Estos archivos de datos se conocen como archivos de datos secundarios y por lo general utilizan la extensión de la NDF.
Administración de Base de Datos I 17
Ejemplo de escenarios para múltiples grupos de archivos
La ilustración es un ejemplo de cómo puede colocar los archivos de base de datos por separado sobre los discos, como se describe en la siguiente lista: ■ Puede crear grupos de archivos definidos por el usuario en archivos separados que son muy consultados de los que son muy modificadas. En la ilustración, los archivos OrdHist1.ndf y OrdHist2.ndf se colocan en un disco independiente de las tablas Producto, Cliente, y SalesOrderHeader, ya que se consultan para el apoyo a las decisiones con información actualizada de la orden actual. ■ También puede colocar el archivo OrdHist1.ndf y OrdHist2.ndf en discos diferentes si ambos son muy consultado. ■ No se puede colocar los archivos de registro de transacciones en grupos de archivos. No es aplicable. En el ejemplo siguiente de código Transact-SQL, se utiliza la instrucción CREATE DATABASE para aplicar este escenario.
CREATE DATABASE [AdventureWorks] ON PRIMARY ( NAME = N'AdventureWorks_Data', FILENAME = N'C:\AdventureWorks_Data.mdf' ), FILEGROUP [OrderHistoryGroup] ( NAME = N'OrdHist1',
FILENAME = N'D:\OrdHist1.ndf' ), ( NAME = N'OrdHist2',
FILENAME = N'D:\OrdHist2.ndf' ) LOG ON ( NAME = N'AdventureWorks_log',
FILENAME = N'E:\AdventureWorks_log.ldf')
También puede utilizar la instrucción ALTER DATABASE para añadir o eliminar archivos y grupos de archivos en bases de datos existentes. Cuándo crear grupos de archivos Puede crear varios archivos de datos en discos diferentes y crear un grupo de archivos definido por el usuario para contener dichos archivos. Las dos razones principales para el uso de grupos de archivos son para mejorar rendimiento y para controlar la ubicación física de los datos.
Administración de Base de Datos I 18
Uso de archivos múltiples en un grupo de archivos único para el rendimiento
A pesar de que un arreglo de discos independientes (RAID) es una forma que prefiera para mejorar la el rendimiento de una base de datos, puede asignar varios archivos en discos diferentes a un único grupo de archivos para mejorar el rendimiento mediante la aplicación de una forma de creación de bandas de datos en SQL Server. Dado que SQL Server utiliza una estrategia de relleno proporcional al escribir datos en un grupo de archivos, los datos son esencialmente repartidos entre los archivos y, por tanto, a través de la particiones de disco físico. Este enfoque permite un control más preciso a los datos de creación de bandas que se puede lograr cuando se crea un volumen conjunto de bandas en el sistema operativo de Windows o mediante el uso de un controlador de matriz RAID.
Uso de grupos de archivos múltiples para controlar la ubicación de los datos físicos
Para utilizar grupos de archivos para facilitar el mantenimiento o alcanzar objetivos de diseño, usted puede: ■ Almacenar datos de lectura / escritura por separado, para mantener diferentes tipos de disco De E / S por separado. ■ Guarde los índices en discos diferentes de las tablas, que pueden conducir a una mejora rendimiento. ■ Haga copias de seguridad o restaurar archivos individuales o grupos de archivos en lugar de copias de seguridad o restauración una base de datos. La copia de seguridad de archivos o grupos de archivos puede ser necesario para los grandes bases de datos, como estrategia para tener una copia de seguridad y restauración efectiva.
Administración de Base de Datos I 19
Práctica: Creación de grupos de archivos Objetivo
El objetivo de esta práctica es que le permiten crear grupos de archivos el uso de Transact-SQL.
Preparación Asegúrese de que la máquina virtual se está ejecutando Si una máquina virtual no se ha iniciado, siga los siguientes pasos: 1. Cierre todas las otras máquinas virtuales. 2. Inicie la máquina virtual.
Para crear un grupo de archivos mediante el uso de Transact-SQL
Realice los pasos siguientes para crear un grupo de archivos mediante el uso de Transact-SQL: 1. En SQL Server Management Studio, haga clic en el botón Nueva consulta en la barra
de herramientas. 2. En la nueva ventana, consulta en blanco, escriba el siguiente código de Transact-SQL. ALTER DATABASE [TransactTestDB] ADD FILEGROUP [SECONDARY] GO
ALTER DATABASE [TransactTestDB] ADD FILE ( NAME = N'Test2', FILENAME =N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Test2.ndf' ) TO FILEGROUP [SECONDARY] GO
ALTER DATABASE [TransactTestDB] MODIFY FILEGROUP [SECONDARY] DEFAULT GO
3. Haga clic en el botón Ejecutar en la barra de herramientas. 4. Compruebe seleccionando la Base de Datos TransactTestDB, click en botón
secundario (botón derecho) y propiedades. Aquí podrá visualizar los grupos de archivos y cual es el que se encuentra activo o por default.
Administración de Base de Datos I 20
Creando SCHEMA Los desarrolladores que han trabajado con Microsoft .NET Framework o XML se familiarizado con el concepto de espacios de nombres (NameSpace). Un espacio de nombres ayuda a agrupar objetos relacionados, lo que hace que los objetos de la lista sean manejables. SQL Server 2008 utiliza esquemas para aplicar un concepto similar para los objetos de base de datos. En esta lección, obtendrá información acerca de los esquemas de trabajo y cómo ayudan a desarrollar estructuras de base de datos que son fáciles de manejar. También aprenderá a crear sus esquemas de base de datos. ¿Qué es un SCHEMA?
Los objetos en una base de datos (como tablas, vistas y procedimientos almacenados) se crean dentro de un esquema. Es esencial que usted entienda que antes de un esquema, está la planificación y la aplicación en una base de datos de SQL Server 2008.
Un esquema es un espacio de nombres para los objetos de base de datos. En otras palabras, un esquema define un límite en el que todos los nombres son únicos. Dado que los nombres de esquema deben ser único en la base de datos, cada objeto en una base de datos tiene un único nombre en el server.database.schema.object. Dentro de una base de datos, puede acortar a schema.object. La ilustración anterior muestra tres esquemas en la base de datos AdventureWorks en una Instancia de SQL Server denominada Server1. Los esquemas se nombran Person, Sales y dbo. Cada uno de estos esquemas contiene una tabla, y el nombre completo de la tabla incluye el servidor, base de datos, y el nombre de esquema. Por ejemplo, el nombre completo de la tabla ErrorLog en el esquema dbo es: Server1.AdventureWorks.dbo.ErrorLog.
Administración de Base de Datos I 21
En SQL Server 2008, los esquemas proporciona los siguientes beneficios: ■ Una mayor flexibilidad en la organización de los objetos de base de datos en espacios de nombres, ya que el agrupación de objetos en los esquemas no depende de la propiedad de objeto. ■ Simplificación de la gestión de permisos, porque el permiso se puede conceder en el esquema de alcance, así como en los objetos individuales. ■ Mejor capacidad de administración, porque dejar caer un usuario que no requiera el cambiar el nombre de todos los objetos que el usuario posee.
Ejemplo: La base de datos AdventureWorks utiliza los esquemas siguientes para organizar sus objetos de base de datos en espacios de nombres: ■ RecursosHumanos (HumanResources) ■ Persona (Person) ■ Producción (Production) ■ Compra (Purchasing) ■ Ventas (Sales) Por ejemplo, consulte la tabla Employee en el esquema HumanResources como: HumanResources.Employee. El SCHEMA dbo.-
Cada base de datos contiene un esquema llamado dbo. El esquema dbo es el esquema predeterminado para todos los usuarios que no tienen ninguna otra forma explícita de esquema predeterminado. Creando un SCHEMA. Para crear un esquema, utilice Explorador de objetos en SQL Server Management Studio o utilice la sentencia CREATE SCHEMA, como se muestra en el ejemplo siguiente: Use AdventureWorks GO CREATE SCHEMA Sales GO
Administración de Base de Datos I 22
¿Cómo funciona la Resolución Nombre del Objeto?
Cuando una base de datos contiene varios esquemas, el objeto puede convertirse en la resolución de nombres confuso. Por ejemplo, una base de datos puede contener dos tablas llamado orden en dos esquemas diferentes, Sales y dbo. Los nombres de los objetos calificados dentro de la base de datos son inequívocos: Sales.Order y dbo.Order, respectivamente. Sin embargo, el uso de la Orden nombre no cualificado puede producir resultados inesperados. Puede asignar a los usuarios un esquema
SQL Server 2008 utiliza el siguiente proceso para resolver un nombre de objeto no calificado: 1. Si el usuario tiene un esquema predeterminado, SQL Server intenta encontrar el objeto en el predeterminado esquema. 2. Si el objeto no se encuentra en el esquema predeterminado del usuario, o si el usuario no tiene por defecto un esquema, SQL Server intenta encontrar el objeto en el esquema dbo. Por ejemplo, un usuario con el esquema predeterminado persona ejecuta la siguiente instrucción Transact-SQL: SELECT * FROM Contact SQL Server 2008 en primer lugar tratar de resolver el nombre de objeto a Person.Contact. Si el Persona de esquema no contiene un objeto denominado de contacto, SQL Server intentará resolver el nombre de objeto a dbo.Contact. Si un usuario con ningún esquema predeterminado definido ejecuta la misma instrucción, SQL Server inmediatamente resolver el nombre de objeto a dbo.Contact. Se puede asignar un esquema predeterminado a un usuario mediante el uso de la cláusula de la DEFAULT_SCHEMA o CREATE USER o ALTER USER.
Administración de Base de Datos I 23
Por ejemplo, la siguiente instrucción Transact-SQL asigna Sale como el esquema predeterminado del usuario Anders. ALTER USER Anders WITH DEFAULT_SCHEMA = Sales
Práctica: Creación de SCHEMA Objetivo
El objetivo de esta práctica es crear esquemas mediante el uso de Transact-SQL. En esta práctica, se utiliza técnicas para crear un nuevo esquema.
Preparación Asegúrese de que la máquina virtual se está ejecutando Si una máquina virtual no se ha iniciado, siga los siguientes pasos: 1. Cierre todas las otras máquinas virtuales. 2. Inicie la máquina virtual.
Para crear un SCHEMA mediante el uso de Transact-SQL
Realice los pasos siguientes para crear un esquema mediante el comando CREATE de Transact-SQL: 1. En SQL Server Management Studio, haga clic en el botón Nueva consulta en la barra de herramientas. 2. En la nueva ventana, escriba el siguiente código de Transact-SQL. Use TransactTestDB GO CREATE SCHEMA [Marketing] GO 3. Haga clic en el botón Ejecutar en la barra de herramientas. 4. En Explorador de objetos, expanda Bases de datos, TransactTestDB, Seguridad, y esquemas, y confirmar que el esquema Marketing existe.
Administración de Base de Datos I 24
Arreglos
Contenidos
- Lección 1: Crear Tipo de Dato - Lección 2: Crear Tablas
____________________________________________________________________________
Creando Tipo de dato Antes de poder crear una tabla, debe definir los tipos de datos para la tabla. Los tipos de datos especifican el tipo de información (caracteres, números o fechas) que una columna o campo puede contener, y la forma de cómo se almacenan los datos. SQL Server 2005 provee más de 30 tipos de datos del sistema específicos. SQL Server 2005 también es compatible con tipos de datos de alias, que son definidos por el usuario y que están basados en los tipos de datos del sistema.
Administración de Base de Datos I 25
¿Cuáles son los tipos de datos suministrados por el sistema?
Los tipos de datos definen los valores permitidos para cada columna en una tabla de base de datos. SQL Server proporciona un número de tipos de datos. Algunas categorías de tipos de datos que son de uso común en varios lenguajes de programación y tienen asociados los tipos de datos de SQL Server. Usted debe utilizar el tipo de datos más pequeño que satisfaga sus necesidades. Así ahorrará de espacio en disco y proporcionará un mejor rendimiento.
En la tabla siguiente se describe los tipo de datos suministrado por el sistema de SQL Server 2005 e indica los sinónimos de datos estándar tipos usados el American National Standards Institute (ANSI) en sistemas de bases de datos ANSI.
Administración de Base de Datos I 26
Tipos de Tipos de datos del Sinómino ANSI Número de
datos sistema de SQL Bytes
comunes Server
Entero Int Integer Integer
bigint 8
smallint, tinyint 2,1
Numérico decimal[(p[,s])] Dec 2 -17
Exacto numeric[(p[,s])] -
float[(n)] double precisión, 8
Numérico float[(n)] para
Aproximado real n=8-15 4
float[(n)] para n=1-7
money, - 8,4
Moneda smallmoney
datetime, 8
smalldatetime 4
Fecha y hora date 4
time 4
datetime2 8
char[(n)] character [(n)] 0-8000
varchar[(n)] char VARYING[(n)]
Carácter character
VARYING[(n)]
text - 0-2 GB
nchar[(n)] - 0-8000
Caracteres nvarchar[(n)] (4000
Unicote ntext caracteres)
0-2 GB
binary [(n)] 0-8000
Binario varbinary [(n)] binary
VARYING[(n)]
Imagen Image - 0 a 2 GB
XML xml 0–2 GB
Administración de Base de Datos I 27
¿Cuáles son los tipos de datos de alias?
Un tipo de datos de alias es un tipo de datos personalizada basada en un tipo de datos suministrado por el sistema. Un tipo de datos alias o definido por el usuario: ■ Le permite refinar aún más los tipos de datos para garantizar la coherencia cuando se trabaja con elementos de datos comunes en diferentes cuadros o bases de datos. ■ Es definido en una base de datos específica. ■ Debe tener un nombre único dentro de la base de datos. (Pero alias de tipos de datos con diferentes nombres pueden tener la misma definición.) Debe crear un tipo de datos definido por el usuario o alias para definir un conjunto de datos de uso común con un formato específico. Por ejemplo, una columna en la que almacenará un código de país basado en la Organización Internacional de Normalización (ISO) alfa-2 internacional para la abreviatura de nombre del país (como JP para Japón y para la CH Suiza) podría ser definido como char(2). Sin embargo, si el código del país se utilizará regularmente a lo largo de la base de datos, se podría definir un tipo de datos countryCode y se utilizaría en su lugar. Esto hace más fácil de entender las definiciones de objetos en su base de datos. Ejemplo de la creación de un tipo de datos de alias
El siguiente código ejemplo muestra cómo crear un tipo de datos alias llamado countryCode.
CREATE TYPE dbo.CountryCode FROM char(2) NULL
Administración de Base de Datos I 28
Práctica: Creación de tipos de datos
Objetivo
El objetivo de esta práctica es que le permiten crear tipos de alias basado en el tipo de dato proporcionado por el sistema. Puede crear tipos de alias utilizando Explorador de objetos en SQL Server Management Studio o la instrucción CREATE TYPE de Transact-SQL. En esta práctica, se utiliza tanto técnicas para crear tipos de alias en la base de datos AdventureWorks.
Preparación Asegúrese de que la máquina virtual se está ejecutando Si una máquina virtual no se ha iniciado, siga los siguientes pasos: 1. Cierre todas las otras máquinas virtuales. 2. Inicie la máquina virtual.
Para crear un tipo de dato mediante el uso de Transact-SQL
Realice los pasos siguientes para crear un tipo de datos definido por el usuario mediante el uso de Transact-SQL: 1. En SQL Server Management Studio, haga clic en el botón Nueva consulta en la barra de herramientas. 2. En la nueva ventana, consulta en blanco, escriba el siguiente código de Transact-SQL. USE AdventureWorks CREATE TYPE dbo.EmailAddress FROM nvarchar(50) NULL
3. Haga clic en el botón Ejecutar en la barra de herramientas. 4. Cuando el comando se ha completado correctamente, haga clic con el definido por el usuario Tipos de datos, haga clic en la carpeta en Explorador de objetos, y luego en Actualizar para comprobar que el tipo de datos dbo.EmailAddress ha sido añadido a la base de datos.
Administración de Base de Datos I 29
Creación de tablas Después de definir todos los tipos de datos para su base de datos que se requieren, puede crear las tablas necesarias para almacenar los datos. Cuando se crea una tabla, es necesario comprender cómo SQL Server físicamente organiza los datos y cómo definir las columnas para un óptimo almacenamiento y rendimiento. Cuando se crea una tabla, debe especificar el nombre de tabla, nombres de columna y tipos de datos. Los nombres de columna deben ser únicos para una tabla específica. Sin embargo, puede utilizar el mismo nombre de columna en tablas diferentes dentro de la misma base de datos. Debe especificar un conjunto de datos tipo para cada columna. Usted puede tener: ■ Más de 2 mil millones de objetos por base de datos, incluyendo tablas. ■ Hasta 1.024 columnas por tabla. ■ Hasta 8.060 bytes por fila. (Esta longitud máxima aproximada no se aplica a imagen, texto y tipos de datos ntext o columnas definidas mediante con el máximo especificado.)
Administración de Base de Datos I 30
Ejemplo de la creación de una tabla
Puede crear tablas utilizando Explorador de objetos en SQL Server Management Studio o utilizando la instrucción CREATE TABLE de Transact-SQL. El siguiente código de Transact-SQL que se muestra, crea una tabla denominada CustomerOrders en un esquema llamado de Sales. La tabla incluye una columna de tipo identidad. CREATE TABLE Sales.CustomerOrders (OrderID int identity NOT NULL, OrderDate datetime NOT NULL, CustomerID int NOT NULL, Notes nvarchar(200) NULL ) Modificar y eliminar tablas Puede modificar una definición de tabla en Explorador de objetos o mediante el ALTER TABLE Transact-SQL. Por ejemplo, las siguientes sentencias Transact-SQL, muestra cómo agregar una columna y cambiar la aceptación de valores NULL de una columna en la tabla Sales.CustomerOrders definido previamente. ALTER TABLE Sales.CustomerOrders ADD SalesPersonID int NOT NULL GO ALTER TABLE Sales.CustomerOrders ALTER COLUMN Notes nvarchar(200) NOT NULL GO
Para quitar una tabla de la base de datos, puede eliminarla en Explorador de objetos o utilizar la DROP TABLE de Transact-SQL. Ejemplo: En este ejemplo se elimina la tabla titles1 y sus datos y los índices de la base de datos actual. DROP TABLE titles1
En este ejemplo se elimina la tabla autores2 en la base de datos pubs. Puede ser ejecutado desde cualquier base de datos. DROP TABLE pubs.dbo.authors2
Administración de Base de Datos I 31
Práctica: Creación de tablas Objetivo
El objetivo de esta práctica es permitir que te permite crear tablas. Puede crear tablas utilizando Explorador de objetos en SQL Server Management Studio o mediante el CREATE TABLE de Transact-SQL. En esta práctica, utilizará técnicas para crear tablas en la base de datos AdventureWorks. Preparación Asegúrese de que la máquina virtual se está ejecutando Si una máquina virtual no se ha iniciado, siga los siguientes pasos: 1. Cierre todas las otras máquinas virtuales. 2. Inicie la máquina virtual.
Para crear una tabla mediante el uso de Transact-SQL
Realice los pasos siguientes para crear una tabla mediante Transact-SQL: 1. En SQL Server Management Studio, haga clic en el botón Nueva consulta en la barra de herramientas. 2. En la nueva ventana, consulta en blanco, escriba el siguiente código de Transact-SQL. USE AdventureWorks CREATE TABLE Sales.SpecialOffers (SpecialOfferID int IDENTITY PRIMARY KEY NOT NULL, OfferName nvarchar(25) NOT NULL, Description nvarchar(max) NULL ) 3. Haga clic en el botón Ejecutar en la barra de herramientas. 4. Cuando el comando se ha completado correctamente, haga clic en la carpeta tabla del Explorador de objetos, y luego haga clic en Actualizar para comprobar que la tabla Sales.SpecialOffers ha sido añadido a la base de datos. Otros ejercicios: 1. Crear una tabla con dos columnas y una columna de identidad como PRIMARY KEY. CREATE TABLE MyCustomers (CustID int IDENTITY (100,1) PRIMARY KEY, CompanyName nvarchar (50) ) Go 2. Crear una tabla con una columna y una restricción PRIMARY KEY. CREATE TABLE MyCustomers2 (CustID int CONSTRAINT pkCustId PRIMARY KEY ) Go
Administración de Base de Datos I 32
3. Crear una tabla con una columna que haga referencia a una columna de otra tabla. CREATE TABLE MyOrders (OrderID int, CustID int REFERENCES MyCustomers(CustID) )
Administración de Base de Datos I 33
Descripción general de Integridad de Datos La calidad de los datos en su base de datos determinará en gran medida la utilidad y eficacia de las aplicaciones (y personas) que dependen de ella y puede desempeñar un papel importante en el éxito o el fracaso de una organización o empresa comercial. Garantizar la integridad de los datos es un paso crítico en el mantenimiento de datos de alta calidad. Usted debe hacer cumplir la integridad de datos en todos los niveles de una aplicación desde la primera entrada hasta su almacenamiento. Microsoft ® SQL Server ™ 2008 ofrece una variedad de características que simplifican la aplicación de la integridad de los datos. Esta lección comienza con una descripción de los tipos de integridad de los datos que le conciernen como desarrollador de base de datos y un resumen de las características proporcionadas por SQL Server 2008 para satisfacer tales exigencias. A continuación, se examinan en detalle tres de los más ricas y poderosas características de integridad de datos de SQL Server 2008: restricciones, desencadenadores y esquemas XML. Un paso importante en la planificación de base de datos es decidir la mejor manera de hacer cumplir la integridad de los datos. La integridad de datos se refiere a la coherencia y la exactitud de los datos que se almacena en una base de datos. En esta lección, obtendrá información sobre los diferentes tipos de integridad de datos en una base de datos relacional y las opciones proporcionadas por SQL Server 2008 para aplicar la integridad de datos. Tipos de integridad de datos
Administración de Base de Datos I 34
La ejecución de integridad de datos, garantiza la calidad de los datos en la base de datos. Los diversos tipos de integridad de los datos que debe planificar son: ■ La integridad de dominio (o columna) ■ Integridad de entidad ■ Integridad referencial La integridad de dominio.- La integridad de Dominio (o columna) especifica un conjunto de valores de datos que son válidos para una columna y determina si se permite valores nulos. La integridad de entidad.- La integridad de entidad requiere que todas las filas de una tabla tiene un identificador único, conocido como el valor de clave principal. Si el valor de clave principal se puede cambiar, o si toda la fila se puede eliminar, depende del nivel de integridad que exige entre la clave principal y cualquier otra tabla. La integridad referencial.- La integridad referencial asegura que las relaciones entre las claves principales (en la tabla de referencia) y las claves externas (en las tablas de referencia) se mantiene siempre. Una fila en una tabla de referencia no se pueden eliminar, ni la clave principal cambiarse, si un clave externa hace referencia a la fila, a menos que la acción en cascada está permitido. Se puede definir relaciones de integridad referencial dentro de la misma tabla o entre tablas separadas. Implementando Constraints.- Después de completar esta lección, los estudiantes serán capaces de: ■ Describa las restricciones. ■ Definir las restricciones PRIMARY KEY. ■ Definir restricciones DEFAULT. ■ Definir restricciones CHECK. ■ Definir restricciones UNIQUE. ■ Definir las restricciones FOREIGN KEY. ■ Definir integridad referencial en cascada. ■ Identificar razones para deshabilitar las restricciones.
Administración de Base de Datos I 35
¿Cuáles son las Restricciones?
Tipo de Integridad Tipo de Restricción Destino Descripción
Dominio DEFAULT Columna
CHECK Columna
FOREIGN KEY Tabla
NULL Columna
Entidad PRIMARY KEY Tabla
UNIQUE Column
Referencial FOREIGN KEY Tabla
CHECK Columna
Define una columna o combinación de
columnas con valores que coinciden con la
clave principal de la misma u otra tabla.
Especifica los valores de datos que son
aceptables en una columna basada en los
valores de otras columnas de la misma tabla.
Identifica cada fila de manera única, asegura
que los usuarios no ingresen valores
duplicados y también se crea un índice para
mejorar el rendimiento. Los valores nulos no
están permitidos.
Evita la duplicación de la variante (no
principal) llaves y se crea un índice para
mejorar el rendimiento. se permiten valores
Especifica el valor predeterminado para la
columna cuando en una instrucción INSERT
no se proporciona un valor. La restricción
DEFAULT es la alternativa recomendada a
un objeto predeterminado.
Especifica los datos o los valores que son
aceptables en una columna. La restricción
CHECK es la alternativa recomendada a un
objeto de regla.
Especifica los valores que sean aceptables
para actualizar, con base
a los valores de una columna de otra tabla.
Especifica si el valor de una columna puede
ser NULL.
Administración de Base de Datos I 36
Creando Constraint (Restricciones)
Se crea restricciones al crear una tabla mediante la instrucción CREATE TABLE. Una restricción de nivel de columna se aplica a una sola columna y es parte de la columna definición. Una restricción de nivel de tabla puede hacer referencia a uno o más columnas de la tabla. Puede modificar las restricciones en una tabla existente mediante la instrucción ALTER TABLE. Restricción Primary Key Una restricción PRIMARY KEY define una o más columnas de una tabla que constituyen una clave principal. La clave principal identifica de forma única una fila de una tabla y hace cumplir la entidad la integridad de la tabla.
El código siguiente se muestra la instrucción de Transact-SQL utilizada para crear la tabla de la HumanResources.Department de la base de datos AdventureWorks. Considere los siguientes datos antes de implementar una restricción PRIMARY KEY: ■ Una tabla sólo puede tener una restricción PRIMARY KEY. ■ Las columnas incluidas en la restricción PRIMARY KEY no puede aceptar valores nulos. ■ Los valores en las columnas especificadas en la clave principal debe ser único. Si el Restricción PRIMARY KEY contiene más de una columna, duplicados pueden aparecer en una columna, pero la combinación de los valores de todas las columnas de la PRIMARIA definición restricción de clave debe ser único. ■ Una restricción PRIMARY KEY crea un índice único con las columnas especificado como la clave del índice. Por lo tanto, las columnas elegida para la clave principal debe seguir el reglas para crear índices únicos. Puede especificar una agrupado o no agrupado índice. (Clúster es el valor predeterminado si el índice no existe.) No se puede caída del índice que apoya la restricción PRIMARY KEY. Sólo cuando se eliminar la restricción PRIMARY KEY es el índice eliminado. Este índice también permite un acceso rápido a los datos cuando la clave principal se utiliza en las consultas. CREATE TABLE [HumanResources].[Department] ( [DepartmentID] [smallint] IDENTITY(1,1) NOT NULL, [Name] [dbo].[Name] NOT NULL, [GroupName] [dbo].[Name] NOT NULL, [ModifiedDate] [datetime] NOT NULL, CONSTRAINT [PK_Department_DepartmentID] PRIMARY KEY CLUSTERED ([DepartmentID] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] )
Administración de Base de Datos I 37
Restricciones DEFAULT Una restricción DEFAULT introduce un valor en una columna cuando no se especifica en un valor. Considere los siguientes datos antes de implementar una restricción DEFAULT: ■ Una restricción DEFAULT sólo se aplica a las instrucciones INSERT. ■ Cada columna puede tener sólo una restricción DEFAULT. ■ Las columnas con la propiedad de identidad o el tipo de datos RowVersion no puede tener una restricción DEFAULT. CREATE TABLE [Production].[Location]( [LocationID] [smallint] IDENTITY(1,1) NOT NULL, [Name] [dbo].[Name] NOT NULL, [CostRate] [smallmoney] NOT NULL CONSTRAINT [DF_Location_CostRate] DEFAULT ((0.00)), [Availability] [decimal](8, 2) NOT NULL CONSTRAINT [DF_Location_Availability] DEFAULT ((0.00)), [ModifiedDate] [datetime] NOT NULL CONSTRAINT [DF_Location_ModifiedDate] DEFAULT (getdate()) ) Restricciones CHECK
Una restricción CHECK restringe los valores de datos que los usuarios pueden entrar en una determinada columna durante INSERT y UPDATE. Usted aplica las restricciones CHECK en el nivel de columna o tabla.
Considere los siguientes datos antes de implementar una restricción CHECK: ■ Una restricción CHECK verifica los datos cada vez que se ejecuta una instrucción INSERT o UPDATE. ■ Una restricción CHECK puede ser cualquier expresión lógica (booleana) que devuelve TRUE o FALSO. ■ Una restricción CHECK no puede contener subconsultas. ■ Una sola columna puede tener varias restricciones CHECK. ■ Una restricción CHECK no se puede colocar en las columnas con el RowVersion, texto, datos ntext o image tipos. ■ El comprobador de coherencia de base de datos (DBCC) CHECKCONSTRAINTS declaración devolverá las filas que contienen datos que infringe una restricción CHECK. Crea restricciones CHECK utilizando la columna o la cláusula CONSTRAINT de nivel de tabla de las declaraciones CREATE TABLE y ALTER TABLE. El código siguiente se muestra la instrucción de Transact-SQL utilizada para agregar una restricción CHECK para la HumanResources.EmployeeDepartmentHistory mesa de la AdventureWorks base de datos. En el ejemplo se asegura de que el valor de la columna EndDate sea igual o mayor que el valor de la columna StartDate, o que EndDate es NULL. ALTER TABLE [HumanResources].[EmployeeDepartmentHistory] WITH CHECK ADD CONSTRAINT [CK_EmployeeDepartmentHistory_EndDate] CHECK (([EndDate]>=[StartDate] OR [EndDate] IS NULL))
Administración de Base de Datos I 38
Restricciones UNIQUE
Una restricción UNIQUE especifica que dos filas de una columna no puede tener el mismo valor. Una restricción UNIQUE es útil cuando usted ya tiene una clave principal, como un número de empleado, pero quiere garantizar que los identificadores, tales como un número de empleado fiscal, también son únicos. Considere los siguientes datos antes de implementar una restricción UNIQUE: ■ Sólo un valor nulo puede aparecer en una columna con una restricción UNIQUE. ■ Una tabla puede tener varias restricciones UNIQUE, mientras que sólo puede tener una sola clave principal. ■ Una restricción UNIQUE es forzada a través de la creación de un índice único sobre la la columna o columnas especificadas. Este índice no se puede permitir que la tabla superior a los 249 límite de los índices no agrupados. ■ El motor de base de datos devolverá un error si se crea una restricción UNIQUE en una columna que contiene los datos en los que se encuentran los valores duplicados. Considere el uso de una restricción UNIQUE cuando: ■ La tabla contiene columnas que no son parte de la clave primaria, pero que, individualmente o como una unidad, debe contener valores únicos. ■ La lógica empresarial dicta que los datos almacenados en una columna deben ser únicos. ■ Los datos almacenados en una columna tiene la singularidad de los valores naturales que puede contener, como los números de impuestos o el número de pasaporte. Considere el uso de una restricción UNIQUE cuando: ■ La tabla contiene columnas que no son parte de la clave primaria, pero que, individualmente o como una unidad, debe contener valores únicos. ■ La lógica empresarial dicta que los datos almacenados en una columna deben ser únicos. ■ Los datos almacenados en una columna tiene la singularidad de los valores naturales que puede contener, como los números de impuestos o el número de pasaporte. Puede crear restricciones UNIQUE mediante el uso de la cláusula UNIQUE nivel de columna de la CREATE TABLE y ALTER TABLE. El código siguiente se muestra el Transact. CREATE TABLE [HumanResources].[Employee]( [EmployeeID] [int] IDENTITY(1,1) NOT NULL, [NationalIDNumber] [nvarchar](15) NOT NULL UNIQUE NONCLUSTERED, [ContactID] [int] NOT NULL,
…
)
Administración de Base de Datos I 39
Restricciones FOREIGN KEY
Una clave externa es una columna o combinación de columnas que se utiliza para establecer y hacer cumplir una relación entre los datos de dos tablas. Una restricción FOREIGN KEY hace cumplir esta integridad referencial. La restricción FOREIGN KEY define una referencia a una columna con una clave principal o restricción UNIQUE en la misma, u otra tabla. Los valores en la columna de clave externa deben aparecer en la columna de clave principal. Aunque existen referencias a los valores de clave principal, no pueden ser cambiados o borrados. Considere los siguientes datos antes de implementar una restricción FOREIGN KEY: ■ Una restricción FOREIGN KEY proporciona una sola columna o varias columnas de referencia integridad. La cantidad de columnas y tipos de datos que se especifican en el EXTRANJERA Exposición clave debe coincidir con el número de columnas y tipos de datos en REFERENCIAS la cláusula. ■ A diferencia de restricciones PRIMARY KEY o UNIQUE, restricciones FOREIGN KEY no crear índices de forma automática. ■ Por otro usuario para crear una restricción FOREIGN KEY en una tabla que posee, debe conceder ese permiso REFERENCIAS usuario en esa tabla. Esto asegura que no otro usuario puede restringir las operaciones en una tabla que posee mediante la creación de un FOREIGN KEY que hace referencia a su tabla. ■ Una restricción FOREIGN KEY que utiliza sólo la cláusula REFERENCES sin la Cláusula FOREIGN KEY hace referencia a una columna en la misma tabla. Puede crear restricciones FOREIGN KEY mediante el nivel de columna o de nivel de tabla RESTRICCIÓN cláusula de las declaraciones CREATE TABLE y ALTER TABLE. El siguiente código muestra la instrucción Transact-SQL utiliza para agregar una FOREIGN KEY restricción a la tabla de Sales.SalesOrderHeader de la base de datos AdventureWorks. El ejemplo, se crea una restricción FOREIGN KEY nombre FK_SalesOrderHeader_Customer_CustomerID que establece un vínculo referencial entre la columna CustomerID de la tabla Sales.SalesOrderHeader y la columna CustomerID de la tabla Sales.Customer. ALTER TABLE [Sales].[SalesOrderHeader] WITH CHECK ADD CONSTRAINT [FK_SalesOrderHeader_Customer_CustomerID] FOREIGN KEY([CustomerID]) REFERENCES [Sales].[Customer] ([CustomerID]) Consideraciones para la comprobación de restricciones
Usted debe especificar nombres significativos para las restricciones cuando se crean. Los nombres deben ser únicos para el propietario del objeto de base de datos y siga las reglas para los identificadores de SQL Server. Considere los siguientes datos al implementar o modificar las restricciones: ■ Puede crear, cambiar, sin tener que quitar y volver a crear una tabla. ■ Usted debe construir la lógica de comprobación de errores en sus aplicaciones y transacciones para poner a prueba si una restricción ha sido violada. Puede desactivar sólo CHECK y restricciones FOREIGN KEY. Usted puede ser útil desactivar las restricciones cuando: ■ Tiene que ejecutar un trabajo por lotes grandes o importación de datos y desea optimizar rendimiento. Usted necesita estar bien seguros de que los datos se ajusta a las limitaciones apropiadas o ejecutar consultas como parte de el trabajo por lotes para garantizar que los datos son correctos antes de encender las limitaciones de nuevo. ■ Se define una restricción sobre una tabla que ya contiene datos. Como resultado, cada fila de datos sólo es verificado por la restricción.
Administración de Base de Datos I 40
Para deshabilitar la comprobación de restricciones cuando se agrega un CHECK o restricción FOREIGN KEY para una tabla con los datos existentes, incluya la opción WITH NOCHECK en la sentencia ALTER TABLE. Los datos existentes se verificarán únicamente durante las futuras actualizaciones de la columna. En el ejemplo siguiente se crea una restricción FOREIGN KEY en la Tabla Sales.SalesOrderHeader y utiliza la opción WITH NOCHECK para deshabilitar la verificación de los datos existentes. ALTER TABLE [Sales].[SalesOrderHeader] WITH NOCHECK ADD CONSTRAINT [FK_SalesOrderHeader_Customer_CustomerID] FOREIGN KEY([CustomerID]) REFERENCES [Sales].[Customer] ([CustomerID]) Puede desactivar la comprobación de restricciones sobre los actuales restricciones CHECK y FOREIGN KEY de modo que cualquier dato que modificar o agregar a la tabla no está marcada en contra de la restricción. Para deshabilitar una restricción CHECK y FOREIGN KEY, utiliza la sentencia ALTER TABLE y se especifica la opción NOCHECK. Lo contrario sería otra instrucción ALTER TABLE, esta vez con la opción CHECK. En este ejemplo se desactiva la restricción FK_SalesOrderHeader_Customer_CustomerID. ALTER TABLE [Sales].[SalesOrderHeader] NOCHECK CONSTRAINT [FK_SalesOrderHeader_Customer_CustomerID] En este ejemplo se vuelve a habilitar la restricción FK_SalesOrderHeader_Customer_CustomerID. ALTER TABLE [Sales].[SalesOrderHeader] CHECK CONSTRAINT [FK_SalesOrderHeader_Customer_CustomerID]
Administración de Base de Datos I 41
Práctica: Creación de restricciones Objetivo
El objetivo de esta práctica es para que usted pueda crear restricciones mediante el uso de Transact-SQL. Preparación Asegúrese de que la máquina virtual se está ejecutando Si una máquina virtual no se ha iniciado, siga los siguientes pasos: 1. Cierre todas las otras máquinas virtuales. 2. Inicie la máquina virtual.
Para crear una restricción CHECK utilizando Transact-SQL Usted debe realizar los pasos siguientes para crear una restricción CHECK utilizando Transact-SQL: 1. En SQL Server Management Studio, si Explorador de objetos no está visible, haga clic en Objeto Explorer en el menú Ver. 2. En Explorador de objetos, expanda Bases de datos, AdventureWorks, Tablas, HumanResources.Employee, y restricciones para ver las restricciones de la tabla HumanResources.Employee. 3. Haga clic en el botón Nueva consulta en la barra de herramientas. 4. En la nueva ventana, consulta en blanco, escriba el siguiente código de Transact-SQL. USE AdventureWorks GO ALTER TABLE HumanResources.Employee WITH CHECK ADD CONSTRAINT CK_Employee_Gender CHECK ((upper([Gender])='F' OR upper([Gender])='M')) 5. En la barra de herramientas, haga clic en el botón Ejecutar.
6. Cuando el comando se ha completado correctamente, haga clic en el restricciones y luego en Actualizar para comprobar que la restricción CK_Employee_Gender ha sido creada. 7. Haga clic en el botón Nueva consulta en la barra de herramientas. 8. En la nueva ventana, consulta en blanco, escriba el siguiente código de Transact-SQL. USE AdventureWorks GO UPDATE HumanResources.Employee SET Gender = 'Q' WHERE EmployeeID = 1 9. En la barra de herramientas, haga clic en el botón Ejecutar. 10. Compruebe que se devuelve un error porque la actualización en conflicto con la verificación restricción. 11. Mantenga SQL Server Management Studio abierto. Lo utilizará en el siguiente
Administración de Base de Datos I 42
Para crear una restricción Default mediante Transact-SQL Debe realizar los siguientes pasos para crear una restricción DEFAULT mediante Transact-SQL: 1. En SQL Server Management Studio, haga clic en el botón Nueva consulta en la barra de herramientas. 2. En la nueva ventana, consulta en blanco, escriba el siguiente código de Transact-SQL. USE AdventureWorks GO ALTER TABLE HumanResources.Employee ADD CONSTRAINT DF_Employee_ModifiedDate DEFAULT (getdate()) FOR ModifiedDate 3. En la barra de herramientas, haga clic en el botón Ejecutar. 4. Cuando el comando se ha completado correctamente, haga clic en Restricciones haga clic en la carpeta en Explorador de objetos, y luego en Actualizar para comprobar que la restricción DF_Employee_ModifiedDate ha sido creada. 5. Haga clic en el botón Nueva consulta en la barra de herramientas.
Administración de Base de Datos I 43
Contenidos
- Lección 01: Creación de Índices. - Lección 02: Implementación de Consultas
____________________________________________________________________________
Índices
Una vez que haya decidido lo que desea indizar y si desea usar un clúster o
índice no agrupado, debe crear el índice. Muchas opciones están disponibles para usted
cuando se crea un índice, y estos pueden tener un gran impacto en el rendimiento y el
mantenimiento del índice.
En esta lección, obtendrá información sobre cómo crear índices y cómo utilizar algunas de las
opciones de configuración de clave de índice para mejorar la utilidad, rendimiento y facilidad de
mantenimiento los índices que usted cree.
Planificando Índices
Un índice es una colección de páginas relacionadas con una tabla (o vista) se utiliza para
acelerar la recuperación de filas de la tabla o cumplir la unicidad. Microsoft ® SQL Server ™
2008 utiliza los índices para que apunte a la ubicación de una fila en una página de datos en
lugar de tener que mirar a través de todas las páginas de datos de una tabla.
Un índice contiene claves construido a partir de una o más columnas en la tabla. Estas claves
se almacena de tal manera que permite a SQL Server 2008, encontrar los registros asociados
con la clave de los valores de forma rápida y eficiente.
Administración de Base de Datos I 44
En esta lección, obtendrá información sobre las tres opciones fundamentales de indexación
ofrecidos por SQL Server 2008:
Los índices agrupados, índices no agrupados e Índices únicos. Usted aprenderá las
ventajas y desventajas de cada opción y será capaz de identificar cuándo usar cada
opción.
¿Cómo es el Accesos de datos de SQL Server?
SQL accede a los datos en un servidor de dos maneras:
■ Al explorar todas las páginas de datos en una tabla, es llamada una exploración de tabla.
Cuando SQL Server realiza un recorrido de tabla, es el siguiente:
1. Comienza en el principio de la tabla.
2. Explora todas las filas de la tabla.
3. Extrae de las filas que cumplen los criterios de la consulta.
■ Cuando SQL Server utiliza un índice, es el siguiente:
1. Atraviesa la estructura de árbol de índice para encontrar registros que las solicitudes de
consulta.
2. Extrae sólo las filas necesarias que respondan a los criterios de la consulta.
Administración de Base de Datos I 45
¿Qué es un índice Agrupado?
Un tipo de índice agrupado almacena filas de datos de la tabla en el orden basado en la
clave de índice agrupado. El índice agrupado se implementa como un B-tree. Cada página en
un btree se llama un nodo de índice. El nodo superior del árbol B se denomina el nodo raíz. El
nivel inferior de los nodos del índice se denomina el nivel hoja. Cualquier índice de niveles
entre el nodo raíz y los nodos hoja se conocen colectivamente como los nodos intermedios.
Cada página en los niveles intermedio o inferior tiene un puntero a la página anterior y
posterior, formando una lista doblemente enlazada. Esta estructura proporciona un mecanismo
muy eficaz para acelerar el proceso de localización de datos.
En un índice agrupado, la raíz y los nodos intermedios contienen las páginas de índice
explotación filas de índice. Cada fila de índice contiene un valor clave y un puntero a una
intermediatelevel, página en la B-árbol o una fila de datos en el nivel hoja del índice. Las
páginas de cada nivel del índice están vinculadas en una lista doblemente enlazada.
Debido a que un índice agrupado determina el orden en que las filas de tabla se almacenan
realmente, cada tabla sólo puede tener un índice agrupado las filas de la tabla no se puede
almacenar en más de un orden.
Cuando utilizar un índice agrupado
Debido a que sólo puede tener un índice agrupado por tabla, debe asegurarse de que utiliza
que para lograr el máximo beneficio posible. Antes de crear un índice agrupado,
Necesitamos entender cómo se tendrá acceso a los datos. Debido a que un índice agrupado
determina el orden en que SQL Server 2008 almacena las filas de la tabla de datos, agrupados
los índices son más adecuadas para ciertos tipos de datos y patrones de uso.
Los índices agrupados son más eficaces cuando se utilizan para apoyar las consultas que haga
lo siguiente:
■ Devolver un rango de valores mediante el uso de operadores como BETWEEN,>,> =, <, y =.
<. Debido a que la tabla de datos se almacenan físicamente en orden del índice, después de la
fila con el primer valor se encuentra utilizando el índice agrupado, las filas con la consiguiente
indexados. Los valores están garantizados para estar físicamente adyacentes.
■ Retorno de datos ordenados mediante el ORDER BY o GROUP BY. Un índice sobre la
columnas especificadas en la cláusula ORDER BY o GROUP BY puede eliminar la necesidad
de ordenar los datos porque los registros están ya clasificados. Esta mejora el rendimiento de
la consulta.
■ Retorno de datos combinados utilizando cláusulas JOIN, normalmente se trata de un campo
clave externa.
■ Volver conjuntos de resultados grandes
Consideraciones para el uso de índices agrupados
Cuando se define el índice agrupado, debe definir la clave de índice con el menor número
columnas como sea posible.
Administración de Base de Datos I 46
Cuándo no utilizar índices agrupados
Los índices agrupados no son una buena opción cuando:
■ Los datos de las columnas indizadas cambian con frecuencia. Los cambios en un clúster
índice significa que toda la fila de los datos debe ser movido. Esto es una importante
consideración en los sistemas de alto volumen de procesamiento de transacciones en las que
los datos se muy volátiles.
■ La clave de índice son anchas. Las claves anchas, son las claves compuestas de varias
columnas o varias columnas de gran tamaño. Todos los índices no agrupados utilizan los
valores de la clave de la índice agrupado como claves de búsqueda. Los índices no agrupados
definidos en la misma tabla será significativamente mayor.
¿Qué es un índice no agrupado?
Los índices no agrupados tienen la misma estructura de árbol B como los índices agrupados,
excepto que las filas de datos de la tabla subyacente no se han clasificado y almacenado en el
orden basado en su clave no agrupado. En el índice no agrupado, los datos y el índice se
almacenan por separado, y el nivel hoja del índice se compone de páginas de índice en lugar
de páginas de datos.
Una tabla puede tener hasta 249 índices no agrupados. los índices no agrupados se pueden
definir sobre una tabla sin importar si utiliza un índice agrupado o no.
Cuando utilizar un índice No agrupado
Los índices no agrupados son útiles cuando los usuarios requieren múltiples formas de
búsqueda de datos. Por ejemplo, un usuario frecuente puede buscar a través de una base de
datos en busca de una jardinería tanto lo común y los nombres científicos de las plantas. Se
puede crear un índice no agrupado para la recuperación de los nombres científicos y un índice
agrupado para recuperar los nombres comunes.
Creando Índices
Una vez que haya decidido lo que desea indexar y si desea usar un clúster o índice no
agrupado, debe crear el índice. Muchas opciones están disponibles para usted cuando
se crea un índice, y estos pueden tener un gran impacto en el rendimiento y el mantenimiento
del índice.
En esta lección, obtendrá información sobre cómo crear índices y cómo utilizar algunas de las
clave de índice, opciones de configuración para mejorar la utilidad, rendimiento y facilidad de
mantenimiento de los índices que usted cree.
Para crear un índice mediante el uso de Transact-SQL, utilice la instrucción CREATE INDEX.
Sintaxis:
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name ON { table | view } ( column [ ASC | DESC ] [ ,...n ] ) INCLUDE ( column [ ,...n ] ) [WITH [PAD_INDEX = { ON | OFF }] [[,] FILLFACTOR = fillfactor ] [[,] IGNORE_DUP_KEY = { ON | OFF }] [[,] ONLINE = { ON | OFF }] [[,] ALLOW_ROW_LOCKS = { ON | OFF }] [[,] ALLOW_PAGE_LOCKS = { ON | OFF }]] [ON {partition_scheme (column) | filegroup | “default” } ]
Administración de Base de Datos I 47
El código siguiente, crea un índice no agrupado de nombre AK_Employee_LoginID,
ascendente en la columna IdDeInicioDeSesión en la tabla HumanResources.Employee
de la base de datos AdventureWorks.
CREATE NONCLUSTERED INDEX [AK_Employee_LoginID] ON [HumanResources].[Employee] ( [LoginID] ASC)
Ejercicios:
A. Crear un índice simple no agrupados.
En el ejemplo siguiente se crea un índice no agrupado en la columna BusinessEntityID
de la tabla Purchasing.ProductVendor.
USE AdventureWorks2008R2; GO IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_ProductVendor_VendorID') DROP INDEX IX_ProductVendor_VendorID ON Purchasing.ProductVendor; GO CREATE INDEX IX_ProductVendor_VendorID ON Purchasing.ProductVendor (BusinessEntityID); GO
B. Creación de un índice simple no agrupado y compuesto.
En el ejemplo siguiente se crea un índice no agrupado compuesto en la tabla
Sales.SalesPerson por las columnas SalesQuota y SalesYTD.
USE AdventureWorks2008R2 GO IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_SalesPerson_SalesQuota_SalesYTD') DROP INDEX IX_SalesPerson_SalesQuota_SalesYTD ON Sales.SalesPerson ; GO CREATE NONCLUSTERED INDEX IX_SalesPerson_SalesQuota_SalesYTD ON Sales.SalesPerson (SalesQuota, SalesYTD); GO
Administración de Base de Datos I 48
C. Creación de un índice único no agrupado
En el ejemplo siguiente se crea un índice único no agrupado en la columna Name de la
tabla Production.UnitMeasure. El índice permite aplicar la unicidad en los datos
insertados en la columna Name.
USE AdventureWorks2008R2; GO IF EXISTS (SELECT name from sys.indexes WHERE name = N'AK_UnitMeasure_Name') DROP INDEX AK_UnitMeasure_Name ON Production.UnitMeasure; GO CREATE UNIQUE INDEX AK_UnitMeasure_Name ON Production.UnitMeasure(Name); GO
Implementación de Consultas
Las consultas permiten recuperar información de una o varias tablas de datos en forma de registros (tuplas) que se pueden almacenar en un objeto recordset, este conjunto de registros es modificable. Las consultas se implementan con el comando SQL SELECT. Las consultas pueden clasificarse de 02 tipos:
Selección.-
Cuando filtras ciertos registros, esto implica definir una condición con la cláusula WHERE.
columna1 columna2 columna3 columna4 columna5
1
2
3
4
5
6
7
8
TABLA
Proyección.- Cuando se define que columnas o campos se quiere visualizar, esto se escribe después del Comando SELECT.
columna1 columna2 columna3 columna4 columna5
1
2
3
4
5
6
7
8
TABLA
Administración de Base de Datos I 49
OPERADORES RELACIONALES:
> mayor a
< menor a
>= mayor igual a
<= menor igual a
= igual que
<> diferente a
BETWEEN entre (rango)
IN en lista de valores
LIKE comparación con modelo o patrón
OPERADORES RELACIONALES
OPERADORES LÓGICOS:
AND (&&) Y
OR O
NOT Negación
OPERADORES LÓGICOS
SINTAXIS: Sintaxis 1: Consulta Simple:
SELECT lista de campos
FROM nombre de la tabla
Sintaxis 2: Consulta Condicional:
SELECT lista de campos
FROM nombre de la tabla
WHERE condición
Sintaxis 3: Consulta Ordenada:
SELECT lista de campos
FROM nombre de la tabla
ORDER BY criterio
Sintaxis 3: Consulta con predicado:
SELECT predicado lista de campos
FROM nombre de la tabla
Predicado Descripción
ALL Devuelve todos los campos de la tabla
TOP Devuelve un determinado número de registros de la tabla
DISTINCT Omite los registros cuyos campos seleccionados coincidan totalmente
Administración de Base de Datos I 50
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 instrucción 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 más rápido indicar el listado de campos deseados.
USE AdventureWorks2008R2; GO SELECT ALL * FROM HumanResources.Employee; GO
TOP Devuelve un cierto número de registros que entran al principio o al final de un rango especificado por una cláusula ORDER BY. Supongamos que queremos recuperar los nombres de los cinco (05) primeros recordset de la tabla Employee.
USE AdventureWorks2008R2; GO SELECT TOP 5 * FROM HumanResources.Employee; GO
Se puede también hacer uso de la cláusula Top Percent, para indicar un porcentaje.
USE AdventureWorks2008R2; GO SELECT TOP 50 PERCENT * FROM HumanResources.Employee; GO
DISTINCT Omite los registros que contienen datos duplicados en los campos seleccionados. Para que los valores de cada campo listado en la instrucción SELECT se incluyan en la consulta deben ser únicos.
USE AdventureWorks2008R2; GO SELECT DISTINCT JobTitle FROM HumanResources.Employee ORDER BY JobTitle; GO
ALIAS En determinadas circunstancias es necesario asignar un nombre a alguna columna determinada de un conjunto devuelto, otras veces por un tema de entendimiento o por otra circunstancias. Para resolver todas ellas tenemos la palabra reservada AS que se encarga de asignar el nombre que deseamos a la columna deseada. Por ejemplo: En la siguiente consulta se asignó alias a las columnas, inclusive a la tabla.
Administración de Base de Datos I 51
USE AdventureWorks2008R2; GO SELECT Name AS [Nombre de Producto],
ProductNumber As „NumeroProducto‟, ListPrice AS Precio
FROM Production.Product As Producto ORDER BY Name ASC; GO
XML En SQL Server 2008, el resultado de una consulta FOR XML se devuelve siempre
directamente al cliente en forma de texto. Gracias a la compatibilidad con el tipo de datos xml de SQL Server 2008, existe la opción de solicitar la devolución del resultado de una consulta FOR XML como tipo de datos xml especificando la directiva TYPE. Cláusulas:
RAW [('ElementName')] Obtiene el resultado de la consulta y transforma cada fila del conjunto de resultados en un elemento XML con un identificador genérico <row /> como etiqueta del elemento. Opcionalmente, puede especificar un nombre para el elemento de fila cuando se utiliza esta directiva. El XML resultante utilizará el ElementName especificado como el elemento de fila generado para cada fila..
USE AdventureWorks2008R2; GO SELECT ProductModelID, Name FROM Production.ProductModel WHERE ProductModelID=122 or ProductModelID=119 FOR XML RAW; GO
El resultado sería así:
<row ProductModelID="122" Name="All-Purpose Bike Stand" /> <row ProductModelID="119" Name="Bike Wash" />
AUTO Devuelve los resultados de la consulta en un árbol anidado XML sencillo. Cada tabla en la cláusula FROM de la que al menos se presenta una columna en la cláusula SELECT se representa como un elemento XML. A las columnas presentadas en la cláusula SELECT se les asignan los atributos de elemento apropiados.
SELECT Cust.CustomerID, OrderHeader.CustomerID, OrderHeader.SalesOrderID, OrderHeader.Status, Cust.CustomerType FROM Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader WHERE Cust.CustomerID = OrderHeader.CustomerID ORDER BY Cust.CustomerID FOR XML AUTO
Administración de Base de Datos I 52
Éste es el resultado parcial: <Cust CustomerID="1" CustomerType="S"> <OrderHeader CustomerID="1" SalesOrderID="43860" Status="5" /> <OrderHeader CustomerID="1" SalesOrderID="44501" Status="5" /> <OrderHeader CustomerID="1" SalesOrderID="45283" Status="5" /> <OrderHeader CustomerID="1" SalesOrderID="46042" Status="5" /> </Cust>
EXPLICIT Especifica que la forma del árbol XML resultante está definida explícitamente. Con este modo, es necesario escribir las consultas de una cierta manera, de modo que se pueda especificar explícitamente información adicional acerca de la anidación deseada.
PATH
Facilita la mezcla de elementos y atributos, así como la especificación de anidación adicional para representar propiedades complejas. Puede utilizar consultas FOR XML de modo EXPLICIT para construir XML a partir de un conjunto de filas, pero el modo PATH supone una alternativa más simple a las consultas de modo EXPLICIT potencialmente complicadas. El modo PATH, junto con la posibilidad de escribir consultas FOR XML anidadas y la directiva TYPE para devolver instancias de tipo xml, permite escribir consultas de forma más fácil. Ofrece una alternativa para escribir la mayoría de las consultas de modo EXPLICIT. De forma predeterminada, el modo PATH genera un contenedor de elementos <row> para cada fila del conjunto de resultados. También se puede especificar un nombre de elemento. En este caso, el nombre especificado se utilizará como nombre del elemento contenedor. Si se proporciona una cadena vacía (FOR XML PATH ('')), no se generará ningún elemento contenedor.
SELECT ProductModelID, Name FROM Production.ProductModel WHERE ProductModelID=122 or ProductModelID=119 FOR XML PATH ('ProductModel') Go
El XML resultante tendrá un nombre de elemento de fila especificado.
<ProductModel> <ProductModelID>122</ProductModelID> <Name>All-Purpose Bike Stand</Name> </ProductModel> <ProductModel> <ProductModelID>119</ProductModelID> <Name>Bike Wash</Name> </ProductModel>
XMLDATA Especifica que se debe devolver un esquema XDR (XML-Data Reduced) insertado. El esquema se antepone al documento como un esquema insertado. Para obtener un ejemplo funcional, vea Usar el modo RAW.
XMLSCHEMA Devuelve un esquema XML W3C (XSD) insertado. Opcionalmente, puede especificar un URI de espacio de nombres de destino al especificar esta directiva. De este modo, se devuelve el espacio de nombres especificado en el esquema.
Administración de Base de Datos I 53
ELEMENTS Si se especifica la opción ELEMENTS, las columnas se devuelven como subelementos. Sin embargo, se les asignan atributos XML. Esta opción solo se admite en los modos RAW, AUTO y PATH. También puede especificar XSINIL o ABSENT cuando utilice esta directiva. XSINIL especifica que se puede crear un elemento con un atributo xsi:nil establecido en True para los valores de columna NULL. De forma predeterminada, o cuando se especifica ABSENT junto con ELEMENTS, no se crea ningún elemento para los valores NULL.
SELECT ProductModelID, Name FROM Production.ProductModel WHERE ProductModelID=122 or ProductModelID=119 FOR XML RAW, ELEMENTS
TYPE
Especifica que la consulta devuelve los resultados como el tipo xml.
SELECT ContactID, FirstName, LastName, Phone FROM Person.Contact ORDER BY ContactID FOR XML AUTO, TYPE
El resultado sería:
<Contact ContactID="1" FirstName="Syed" LastName="Abbas" Phone="398-555-0132"/> <Contact ContactID="2" FirstName="Catherine" LastName="Abel" Phone="747-555-0171"/> ...
ROOT [('RootName')] Especifica que se puede agregar un solo elemento de nivel superior al XML resultante. También se puede especificar el nombre del elemento raíz que se generará. El valor predeterminado es "root".
SELECT ContactID, FirstName, LastName, Phone FROM Person.Contact ORDER BY ContactID FOR XML AUTO, TYPE, ROOT („Contact‟)
Administración de Base de Datos I 54
Funciones Integradas de SQL Server 2008
SQL Server proporciona numerosas funciones integradas y permite crear funciones definidas
por el usuario. En esta página se muestra una lista de las categorías integradas.
Entre ellas, se tiene a las funciones de agregado, de conversión, de cadena, matemáticas, etc.
Se hará un reconocimiento de las funciones cadena, fecha y conversión,
Funciones de cadena
Estas funciones escalares realizan una operación sobre un valor de cadena de entrada y
devuelven un valor de cadena o un valor numérico:
ASCII Devuelve el valor de código ASCII del carácter situado más a la izquierda de una
expresión de caracteres.
Sintaxis ASCII ( character_expression )
Ejemplo:
Print ASCII(„A‟)
CHAR Devuelve el carácter de un código ASCII.
Sintaxis CHAR ( código_ASCII )
Ejemplo:
Print CHAR(66)
LEFT Devuelve la parte izquierda de una cadena de caracteres según el número de
caracteres especificado
Sintaxis LEFT ( expresión_cadena, número_de_caracteres)
Ejemplo:
USE AdventureWorks2008R2; GO SELECT LEFT(Name, 5) FROM Production.Product ORDER BY ProductID; GO
SELECT LEFT('abcdefg',2) GO
Administración de Base de Datos I 55
LEN Devuelve el número de caracteres de la expresión de cadena especificada, con
exclusión de los espacios al final.
Sintaxis LEN ( expresión_cadena)
Ejemplo:
USE AdventureWorks2008R2; GO SELECT LEN(FirstName) AS Length, FirstName, LastName FROM Sales.vIndividualCustomer WHERE CountryRegionName = 'Australia'; GO
LOWER Devuelve una expresión de cadena especificada, convertida a minúscula.
Sintaxis LOWER ( expresión_cadena)
Ejemplo:
USE AdventureWorks2008R2; GO SELECT LOWER(SUBSTRING(Name, 1, 20)) AS Lower, UPPER(SUBSTRING(Name, 1, 20)) AS Upper, LOWER(UPPER(SUBSTRING(Name, 1, 20))) As LowerUpper FROM Production.Product WHERE ListPrice between 11.00 and 20.00; GO
LTRIM Devuelve una expresión de caracteres tras quitar todos los espacios iniciales en
blanco.
Sintaxis LTRIM ( expresión_cadena)
Ejemplo:
PRINT LTRIM(„ Bienvenido a SQL Developer Edition‟)
NCHAR Devuelve el carácter Unicode correspondiente al código entero dado.
Sintaxis NCHAR ( valor_entero )
Ejemplo:
PRINT NCHAR(248)
Administración de Base de Datos I 56
PATINDEX Devuelve la posición inicial de la primera aparición de un patrón en una expresión
especificada o ceros si el patrón no se encuentra, de todos los textos válidos y tipos de
datos de caracteres.
Sintaxis PATINDEX ( '%patrón%' , expresión )
Ejemplo:
PRINT PATINDEX('%au%','Jose Maurinho')
REPLACE Reemplaza todas las instancias de un valor de cadena especificado por otro valor de
cadena.
Sintaxis REPLACE ( expresión_cadena, patrón_cadena, cadena_a_reemplazar )
Ejemplo:
SELECT REPLACE('abcdefghicde','cde','xxx'); GO
REPLICATE Repite un valor de cadena, un número determinado de veces.
Sintaxis REPLICATE ( expresión_cadena, valor_entero )
Ejemplo:
USE AdventureWorks2008R2; GO SELECT [Name] , REPLICATE('0', 4) + [ProductLine] AS 'Line Code' FROM [Production].[Product] WHERE [ProductLine] = 'T' ORDER BY [Name]; GO
REVERSE Devuelve el inverso de un valor de cadena.
Sintaxis REVERSE ( expresión_cadena)
Administración de Base de Datos I 57
Ejemplo:
USE AdventureWorks2008R2; GO SELECT FirstName, REVERSE(FirstName) AS Reverse FROM Person.Person WHERE BusinessEntityID < 5 ORDER BY FirstName; GO
RIGHT Devuelve la parte derecha de una cadena de caracteres, según el número de
caracteres especificado
Sintaxis
LEFT ( expresión_cadena, número_de_caracteres)
Ejemplo:
USE AdventureWorks2008R2; GO SELECT RIGHT(FirstName, 5) AS 'First Name' FROM Person.Person WHERE BusinessEntityID < 5 ORDER BY FirstName; GO
RTRIM Devuelve una cadena de caracteres después de truncar todos los espacios en blanco
finales.
Sintaxis
RTRIM ( expresión_cadena)
Ejemplo:
PRINT LTRIM(„Excelente Motor de Base de Datos ‟)
SPACE Devuelve una cadena de espacios repetidos.
Sintaxis SPACE ( valor_entero)
Ejemplo:
USE AdventureWorks2008R2; GO SELECT RTRIM(LastName) + ',' + SPACE(2) + LTRIM(FirstName) FROM Person.Person ORDER BY LastName, FirstName; GO
Administración de Base de Datos I 58
STR Devuelve datos de caracteres convertidos a partir de datos numéricos.
Sintaxis STR ( valor_float, longitud, cantidad_decimales)
Ejemplo:
PRINT STR(7559.5670, 7, 2) STUFF
La función STUFF inserta una cadena en otra. Elimina una longitud determinada de
caracteres de la primera cadena a partir de la posición de inicio y, a continuación,
inserta la segunda cadena en la primera, en la posición de inicio.
Sintaxis STUFF ( expresión_cadena, inicio, longitud , expresión_cadena2 )
Ejemplo:
PRINT STUFF('abcdef', 2, 3, 'ijklmn'); GO
SUBSTRING Devuelve una cadena a partir de otra, desde una determinada posición, cierta cantidad
de caracteres.
Sintaxis SUBSTRING ( expresión_cadena, posición_inicial, longitud)
Ejemplo:
PRINT SUBSTRING('Walter Javier',8,4) GO
UNICODE Devuelve el valor entero, según la definición del estándar Unicode, para el primer
carácter de la expresión de entrada.
Sintaxis UNICODE ( carácter_Unicode )
Ejemplo:
PRINT UNICODE('и')
GO
UPPER Devuelve una expresión de caracteres minúsculas convertidos en mayúsculas.
Sintaxis UPPER ( expresión_cadena )
Administración de Base de Datos I 59
Ejemplo:
USE AdventureWorks2008R2; GO SELECT UPPER(RTRIM(LastName)) + ', ' + FirstName AS Name FROM Person.Person ORDER BY LastName; GO
Administración de Base de Datos I 60
Funciones de fecha y hora
En las tablas siguientes se enumeran las funciones de fecha y hora de Transact-SQL.
Funciones que obtienen valores de fecha y hora del sistema Todos los valores de fecha y hora del sistema se derivan del sistema operativo del equipo en el
que se ejecuta la instancia de SQL Server.
Funciones de fecha y hora del sistema de precisión elevada SQL Server 2008 obtiene los valores de fecha y hora utilizando la API de Windows
GetSystemTimeAsFileTime(). La exactitud depende del hardware del equipo y de la versión
de Windows en las que la instancia de SQL Server se esté ejecutando. La precisión de esta
API se fija en 100 nanosegundos. La precisión se puede determinar mediante la API de
Windows GetSystemTimeAdjustment().
Administración de Base de Datos I 61
Función Sintaxis Valor devuelto Tipo de datos
devuelto
Determinismo
http://msdn.microsoft.com/es-
es/library/bb630353.aspx
SYSDATETIME () Devuelve un
valor
datetime2(7) que
contiene la fecha
y hora del equipo
en el que la
instancia de SQL
Server se está
ejecutando. El
ajuste de zona
horaria no está
incluido.
datetime2(7) No
determinista
http://msdn.microsoft.com/es-
es/library/bb677334.aspx
SYSDATETIMEOFFSET
( )
Devuelve un
valor
datetimeoffset(7
) que contiene la
fecha y hora del
equipo en el que
la instancia de
SQL Server se
está ejecutando.
El ajuste de zona
horaria está
incluido.
datetimeoffset(7) No
determinista
http://msdn.microsoft.com/es-
es/library/bb630387.aspx
SYSUTCDATETIME ( ) Devuelve un
valor
datetime2(7) que
contiene la fecha
y hora del equipo
en el que la
instancia de SQL
Server se está
ejecutando. La
fecha y hora se
devuelven como
hora universal
coordinada
(UTC).
datetime2(7) No
determinista
Administración de Base de Datos I 62
Funciones de fecha y hora del sistema de precisión baja
Función Sintaxis Valor
devuelto
Tipo de
datos
devuelto
Determinismo
http://msdn.microsoft.com/es-
es/library/ms188751.aspx
CURRENT_TIMESTAMP Devuelve un
valor
datetime2(7
) que
contiene la
fecha y hora
del equipo
en el que la
instancia de
SQL Server
se está
ejecutando.
El ajuste de
zona horaria
no está
incluido.
datetime No
determinista
GETDATE GETDATE ( ) Devuelve un
valor
datetime2(7
) que
contiene la
fecha y hora
del equipo
en el que la
instancia de
SQL Server
se está
ejecutando.
El ajuste de
zona horaria
no está
incluido.
datetime No
determinista
GETUTCDATE GETUTCDATE ( ) Devuelve un
valor
datetime2(7
) que
contiene la
fecha y hora
datetime No
determinista
Administración de Base de Datos I 63
Funciones que obtienen partes de la fecha y hora
Función Sintaxis Valor devuelto Tipo de
datos
devuelto
Determinismo
DATENAME DATENAME (
datepart , date )
Devuelve una cadena de
caracteres que representa el
datepart especificado de la
fecha especificada.
nvarchar No
determinista
DATEPART DATEPART (
datepart , date )
Devuelve un entero que
representa el datepart
especificado del date
especificado.
int No
determinista
DAY DAY ( date ) Devuelve un entero que
representa la parte del día de
date especificado.
int Determinista
MONTH MONTH ( date ) Devuelve un entero que
representa la parte del mes de
un date especificado.
int Determinista
YEAR YEAR ( date ) Devuelve un entero que
representa la parte del año de
un date especificado.
int Determinista
Funciones que obtienen diferencias de fecha y hora
Función Sintaxis Valor devuelto Tipo de
datos
devuelto
Determinismo
DATEDIFF DATEDIFF (
datepart , startdate
, enddate )
Devuelve el número de límites
datepart de fecha y hora entre
dos fechas especificadas.
int Determinista
Administración de Base de Datos I 64
Funciones que modifican valores de fecha y hora
Función Sintaxis Valor devuelto Tipo de datos
devuelto
Determinismo
DATEADD DATEADD
(datepart , number
, date )
Devuelve un nuevo
valor datetime
agregando un
intervalo al
datepart
especificado del
dateespecificado.
El tipo de datos
del argumento
date.
Determinista
http://msdn.microsoft.com/es-
es/library/bb677244.aspx
SWITCHOFFSET
(DATETIMEOFFSET ,
time_zone)
SWITCH OFFSET
cambia el ajuste de
zona horaria de un
valor
DATETIMEOFFSET y
conserva el valor
UTC.
datetimeoffset
con la precisión
fraccionaria de
DATETIMEOFFSE
T
Determinista
http://msdn.microsoft.com/es-
es/library/bb630335.aspx
TODATETIMEOFFSET
(expression ,
time_zone)
TODATETIMEOFFSET
transforma un valor
datetime2 en un
valor datetimeoffset.
El valor datetime2
se interpreta en la
hora local para el
valor time_zone
especificado.
datetimeoffset
con la precisión
fraccionaria del
argumento
datetime
Determinista
Administración de Base de Datos I 65
Funciones que establecen u obtienen un formato de sesión
Función Sintaxis Valor devuelto Tipo de
datos
devuelto
Determinism
o
http://msdn.microsoft.com/es
-es/library/ms187766.aspx
@@DATEFIRS
T
Devuelve el
valor actual,
para la sesión,
de SET
DATEFIRST.
tinyint No
determinista
http://msdn.microsoft.com/es
-es/library/ms181598.aspx
SET
DATEFIRST {
number |
@number_var }
Establece el
primer día de la
semana en un
número del 1 al
7.
No
aplicabl
e
No aplicable
http://msdn.microsoft.com/es
-es/library/ms189491.aspx
SET
DATEFORMAT {
format |
@format_var }
Determina el
orden de los
componentes de
la fecha
(mes/día/año)
para escribir
datos de tipo
datetime o
smalldatetime.
No
aplicabl
e
No aplicable
http://msdn.microsoft.com/es
-es/library/ms177557.aspx
@@LANGUAG
E
Devuelve el
nombre del
idioma que se
está utilizando
actualmente.
@@LANGUAG
E no es ninguna
función de fecha
u hora. Sin
embargo, la
configuración de
idioma puede
afectar a la
salida de las
funciones de
No
aplicabl
e
No aplicable
Administración de Base de Datos I 66
fecha.
http://msdn.microsoft.com/es
-es/library/ms174398.aspx
SET
LANGUAGE { [
N ] 'language' |
@language_var
}
Establece el
entorno del
idioma de la
sesión y los
mensajes del
sistema. SET
LANGUAGE no
es ninguna
función de fecha
u hora. Sin
embargo, la
configuración de
idioma afecta a
la salida de las
funciones de
fecha.
No
aplicabl
e
No aplicable
Funciones que validan valores de fecha y hora
Función Sintaxis Valor devuelto Tipo de
datos
devuelto
Determinismo
http://msdn.microsoft.com/es-
es/library/ms187347.aspx
ISDATE (
expression
)
Determina si una
expresión de
entrada datetime
o smalldatetime
es un valor de
fecha u hora
válido.
int ISDATE sólo es
determinista si se
utiliza con la
función
CONVERT,
cuando se
especifica el
parámetro de
estilo CONVERT
y cuando el estilo
no es igual a 0,
100, 9 ni 109.
Administración de Base de Datos I 67
Funciones de Conversión
Utilice las funciones CAST y CONVERT para convertir expresiones de un tipo de datos a otro
tipo de datos.
Las funciones CAST y CONVERT también se puede utilizar para obtener una variedad de
formatos de datos especiales y se pueden utilizar en la lista de selección, en la cláusula
WHERE y en cualquier lugar que se permita una expresión.
Sintaxis de CAST:
CAST ( expresión AS nuevo_tipo_dato [( longitud )] )
Sintaxis de CONVERT:
CONVERT ( nuevo_tipo_dato [ ( longitud ) ] , expresión [ , style ]
Ejemplos:
--Usando CAST USE AdventureWorks2008R2; GO SELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPrice FROM Production.Product WHERE CAST(ListPrice AS int) LIKE '3%'; GO
-- Usando CONVERT. USE AdventureWorks2008R2; GO SELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPrice FROM Production.Product WHERE CONVERT(int, ListPrice) LIKE '3%'; GO
Administración de Base de Datos I 68
Arreglos
Contenidos
- Lección 1: Consultas multitablas - Lección 2: Subconsultas
____________________________________________________________________________
Consultas Multitablas La consultas multitablas es un requerimiento fundamental en los negocios de hoy en día, dado a que se quiere obtener información de diferentes tablas y para ello se deben combinar mediante campos comunes que tienen entre ellas.
Mediante el uso de combinaciones, puede recuperar los datos de dos o más tablas basadas en relaciones lógicas entre las tablas. Una condición de combinación define la forma en que las dos tablas están relacionadas en una consulta, por ello se debe: • Especificar la columna de cada tabla que se utilizará para la combinación. Una unión típica, es la condición donde se indica la clave externa de una tabla y la clave asociada en la otra tabla (PK). • Especificar un operador lógico (por ejemplo, = o <>,) para ser utilizado en la comparación de los valores de las columnas.
Administración de Base de Datos I 69
Las vinculaciones entre tablas se realizan mediante la cláusula JOIN que combina registros de dos tablas siempre que haya concordancia de valores en un campo común. Su sintaxis es de la siguiente forma: SELECT lista de campos FROM tb1 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 numéricos, los campos deben ser del mismo tipo de datos y contener el mismo tipo de datos, pero no tienen que tener el mismo nombre.
comp
Es cualquier operador de comparación relacional: =, <, >, <=, >=, o <>. Ejemplo 1: USE AdventureWorks2008R2; GO SELECT * FROM HumanResources.Employee AS e JOIN Person.Contact AS c ON e.ContactID = c.ContactID ORDER BY c.LastName
Se muestra como resultado registros de ambas tablas, de la combinación de los campos ContactID. Ejemplo 2. La combinación no igual (<>) se usa con poca frecuencia. Como regla general, las combinaciones no igual sólo tienen sentido cuando se usan con una autocombinación. Por ejemplo, esta combinación no igual Transact-SQL y la autocombinación se usan para encontrar las subcategorías que tienen al menos dos precios diferentes USE AdventureWorks2008R2; GO SELECT DISTINCT p1.ProductSubcategoryID, p1.ListPrice FROM Production.Product p1 JOIN Production.Product p2 ON p1.ProductSubcategoryID = p2.ProductSubcategoryID AND p1.ListPrice <> p2.ListPrice ORDER BY ProductSubcategoryID; Se puede utilizar una operación INNER JOIN en cualquier cláusula FROM. Esto crea una combinación por equivalencia, conocida también como unión interna. Las combinaciones aquí son las más comunes; éstas combinan los registros de dos tablas siempre que haya concordancia de valores en un campo común 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 ningún empleado asignado) se emplea LEFT JOIN o todos los empleados (incluso si alguno no está asignado a ningún departamento), en este caso RIGHT JOIN.
Administración de Base de Datos I 70
También, puede anidar instrucciones JOIN utilizando la siguiente sintaxis: SELECT campos FROM tabla1 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:
USE AdventureWorks2008R2; GO SELECT Co.FirstName, Co.LastName, Cc.CardType , Cc.CardNumber , Cc.ExpMonth, Cc.ExpYear, CoCc.ModifiedDate FROM Person.Contact Co JOIN Sales.ContactCreditCard CoCc ON Co.ContactID = CoCc.ContactID JOIN Sales.CreditCard Cc ON CoCc.CreditCardID = Cc.CreditCardID WHERE Cc.ExpYear = 2008 and Cc.ExpMonth =12 Las combinaciones se pueden clasificar en:
Combinaciones internas (la operación de combinación típica, que usa algunos operadores de comparación como = o <> ). INNER JOIN En este tipo se incluyen las combinaciones equivalentes y las combinaciones naturales. Las combinaciones internas usan un operador de comparación para hacer coincidir las filas de dos tablas según los valores de las columnas comunes de cada tabla. Un ejemplo sería recuperar todas las filas en las que el número de identificación de estudiante es el mismo en las tablas students y courses. Ejemplo: Recupera los empleados que también son vendedores: USE AdventureWorks; GO SELECT e.EmployeeID FROM HumanResources.Employee AS e INNER JOIN Sales.SalesPerson AS s ON e.EmployeeID = s.SalesPersonID
Administración de Base de Datos I 71
Combinaciones externas. Puede ser una combinación externa izquierda, derecha o completa. Las combinaciones externas se especifican en la cláusula FROM con uno de los siguientes conjuntos de palabras clave:
LEFT JOIN o LEFT OUTER JOIN. El conjunto de resultados de una combinación externa izquierda incluye todas las filas de la tabla de la izquierda especificada en la cláusula LEFT OUTER y no sólo 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 selección que procedan de la tabla de la derecha. Ejemplo: Imagine una combinación de la tabla Product y de la tabla ProductReview en sus columnas ProductID. Los resultados muestran solamente los productos para los que se han escrito revisiones. Para incluir todos los productos, independientemente de si se ha escrito una revisión para alguno de ellos, utilice una combinación externa izquierda. Ésta es la consulta: USE AdventureWorks; GO SELECT p.Name, pr.ProductReviewID FROM Production.Product p LEFT OUTER JOIN Production.ProductReview pr ON p.ProductID = pr.ProductID
RIGHT JOIN o RIGHT OUTER JOIN. Una combinación externa derecha es lo contrario de una combinación 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. Ejemplo 1: Imagine una combinación de la tabla SalesTerritory y de la tabla SalesPerson en sus columnas TerritoryID. Los resultados pueden mostrar cualquier territorio de ventas asignado a un vendedor. El operador ISO de combinación externa derecha, RIGHT OUTER JOIN, indica que todas las filas de la segunda tabla se deben incluir en los resultados, con independencia de si hay datos coincidentes en la primera tabla. Para incluir a todos los vendedores en los resultados, independientemente de si están asignados a un territorio de ventas, utilice una combinación externa derecha ISO. A continuación se muestra la consulta Transact-SQL y los resultados de la combinación externa derecha. USE AdventureWorks; GO SELECT st.Name AS Territory, sp.SalesPersonID FROM Sales.SalesTerritory st RIGHT OUTER JOIN Sales.SalesPerson sp ON st.TerritoryID = sp.TerritoryID
Administración de Base de Datos I 72
Ejemplo 2: Una combinación externa puede restringirse más mediante el uso de un predicado WHERE. Este ejemplo contiene la misma combinación externa derecha, pero sólo incluye los territorios de ventas con un volumen de ventas inferior a 2.000.000 de dólares: USE AdventureWorks; GO SELECT st.Name AS Territory, sp.SalesPersonID FROM Sales.SalesTerritory st RIGHT OUTER JOIN Sales.SalesPerson sp ON st.TerritoryID = sp.TerritoryID WHERE st.SalesYTD < $2000000 FULL JOIN o FULL OUTER JOIN. Una combinación 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 selección de la otra tabla contendrán 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. Ejemplo: Imagine una combinación de la tabla Product y de la tabla SalesOrderDetail en sus columnas ProductID. Los resultados sólo muestran los productos para los que se han efectuado pedidos de venta. El operador de combinación externa completa, FULL OUTER JOIN, indica que todas las filas de ambas tablas se van a incluir en los resultados, con independencia de que haya datos coincidentes en las tablas. Puede incluir una cláusula WHERE con una combinación externa completa para devolver solamente las filas donde no hay datos coincidentes entre las tablas. La siguiente consulta sólo devuelve los productos que no tienen pedidos de venta que coincidan, así como los pedidos de venta que no coinciden con ningún producto (aunque todos los pedidos de venta, en este caso, coincidan con un producto). USE AdventureWorks; GO SELECT p.Name, sod.SalesOrderID FROM Production.Product p FULL OUTER JOIN Sales.SalesOrderDetail sod ON p.ProductID = sod.ProductID WHERE p.ProductID IS NULL OR sod.ProductID IS NULL ORDER BY p.Name ;
Combinaciones cruzadas Las combinaciones cruzadas devuelven todas las filas de la tabla izquierda. Cada fila de la tabla izquierda se combina con todas las filas de la tabla de la derecha. Las combinaciones cruzadas (CROSS JOIN) se llaman también productos cartesianos. Ejemplo 1: Una combinación cruzada que no tenga una cláusula WHERE genera el producto cartesiano de las tablas involucradas en la combinación. El tamaño del conjunto de resultados de un producto cartesiano es igual al número de filas de la primera tabla multiplicado por el número de filas de la segunda tabla. En el siguiente ejemplo se muestra una combinación cruzada de Transact-SQL.
Administración de Base de Datos I 73
USE AdventureWorks; GO SELECT p.SalesPersonID, t.Name AS Territory FROM Sales.SalesPerson p CROSS JOIN Sales.SalesTerritory t ORDER BY p.SalesPersonID;
El conjunto de resultados contiene 170 filas (SalesPerson tiene 17 filas y SalesTerritory tiene 10; 17 multiplicado por 10 es igual a 170).
Ejemplo 2: Sin embargo, si se agrega una cláusula WHERE, la combinación cruzada se comporta como una combinación interna. Por ejemplo, las siguientes consultas Transact-SQL producen el mismo conjunto de resultados. USE AdventureWorks; GO SELECT p.SalesPersonID, t.Name AS Territory FROM Sales.SalesPerson p CROSS JOIN Sales.SalesTerritory t WHERE p.TerritoryID = t.TerritoryID ORDER BY p.SalesPersonID; -- Or USE AdventureWorks; GO SELECT p.SalesPersonID, t.Name AS Territory FROM Sales.SalesPerson p INNER JOIN Sales.SalesTerritory t ON p.TerritoryID = t.TerritoryID ORDER BY p.SalesPersonID;
Administración de Base de Datos I 74
Subconsultas Anidadas Una subconsulta es una consulta que está anidado dentro de un SELECT, INSERT, UPDATE o DELETE, o dentro de otra subconsulta. Una subconsulta puede utilizarse en cualquier lugar se permita una expresión. En este ejemplo se utiliza una subconsulta como una expresión de columna denominada MaxUnitPrice en una instrucción SELECT. USE AdventureWorks2008R2; GO SELECT Ord.SalesOrderID, Ord.OrderDate, (SELECT MAX(OrdDet.UnitPrice) FROM AdventureWorks.Sales.SalesOrderDetail AS OrdDet WHERE Ord.SalesOrderID = OrdDet.SalesOrderID) AS MaxUnitPrice FROM AdventureWorks2008R2.Sales.SalesOrderHeader AS Ord Una subconsulta es también llamado una consulta interna o interior seleccione, mientras que la declaración que contiene una subconsulta también se llama una consulta externa o exterior. SELECT Name FROM AdventureWorks2008R2.Production.Product WHERE ListPrice IN ( SELECT ListPrice FROM AdventureWorks2008R2.Production.Product WHERE Name = 'Chainring Bolts' ); Una subconsulta anidada en la instrucción SELECT externa tiene los siguientes componentes:
• Una consulta regular SELECCIONAR incluidos los componentes lista de selección regular. • Una cláusula FROM periódicos, incluyendo uno o más nombres de tabla o vista. • Una cláusula WHERE opcional. • Una cláusula GROUP BY opcional. • Una cláusula HAVING opcional
La consulta SELECT de una subconsulta es siempre entre paréntesis. No puede incluir una cláusula COMPUTE o FOR BROWSE, y sólo puede incluir una cláusula ORDER BY cuando una cláusula TOP también se especifica. Una subconsulta puede anidarse dentro de la cláusula WHERE o HAVING de una SELECT externa, INSERT, UPDATE o DELETE, o dentro de otra subconsulta. Hasta 32 niveles de anidamiento es posible, aunque el límite varía según la memoria disponible y la complejidad de otras expresiones en la consulta. consultas individuales no pueden apoyar anidación hasta 32 niveles. Una subconsulta puede aparecer en cualquier lugar una expresión puede ser utilizada, si devuelve un valor único. Las declaraciones que incluyen una subconsulta suelen tener uno de estos formatos: •WHERE expression [NOT] IN (subconsulta) •WHERE expression comparison_operator [ANY | ALL] (subconsulta) •WHERE [NOT] EXISTS (subconsulta)
Administración de Base de Datos I 75
Ejemplo 1: La siguiente consulta encuentra el nombre de todos los proveedores cuya calificación crediticia es buena, de quien Adventure Works ordenó por lo menos 20 items, y un promedio de tiempo de entrega inferior a 16 días. Use AdventureWorks2008R2; GO SELECT Name FROM Purchasing.Vendor WHERE CreditRating = 1 AND VendorID IN ( SELECT VendorID FROM Purchasing.ProductVendor WHERE MinOrderQty >= 20 AND AverageLeadTime < 16 ) Ejemplo 2: La siguiente consulta encuentra los nombres de todos los productos de subcategoria rueda (wheels) que Adventure Works hace. USE AdventureWorks2008R2; GO SELECT Name FROM Production.Product WHERE ProductSubcategoryID IN ( SELECT ProductSubcategoryID FROM Production.ProductSubcategory WHERE Name = 'Wheels' ) Ejemplo 3: La siguiente consulta encuentra los nombres de los productos que no han sean ningun tipo de bicicleta. USE AdventureWorks2008R2; GO SELECT Name FROM Production.Product WHERE ProductSubcategoryID NOT IN ( SELECT ProductSubcategoryID FROM Production.ProductSubcategory WHERE Name = 'Mountain Bikes' OR Name = 'Road Bikes' OR Name = 'Touring Bikes' )
Administración de Base de Datos I 76
EXISTS
Especifica una subconsulta para probar la existencia de filas. Ejemplo 1: El siguiente ejemplo muestra dos consultas para buscar tiendas cuyo nombre es el mismo nombre que un vendedor. La primera consulta utiliza EXISTS y el segundo utiliza = ANY USE AdventureWorks2008R2 ; GO SELECT DISTINCT s.Name FROM Sales.Store AS s WHERE EXISTS ( SELECT * FROM Purchasing.Vendor AS v WHERE s.Name = v.Name ) ; GO Usando =ANY USE AdventureWorks2008R2 ; GO SELECT DISTINCT s.Name FROM Sales.Store AS s WHERE s.Name = ANY ( SELECT v.Name FROM Purchasing.Vendor AS v ) ; GO NOT EXISTS funciona al revés como el que existe. La cláusula WHERE de NOT EXISTS se cumple si no se devuelven filas de la subconsulta. El siguiente ejemplo busca los empleados que no están en los departamentos que tienen nombres que empiezan con P. SELECT p.FirstName, p.LastName, e.JobTitle FROM Person.Person AS p JOIN HumanResources.Employee AS e ON e.BusinessEntityID = p.BusinessEntityID WHERE NOT EXISTS (SELECT * FROM HumanResources.Department AS d JOIN HumanResources.EmployeeDepartmentHistory AS edh ON d.DepartmentID = edh.DepartmentID WHERE e.BusinessEntityID = edh.BusinessEntityID AND d.Name LIKE 'P%') ORDER BY LastName, FirstName GO
Administración de Base de Datos I 77
Usando subconsultas con INSERT, DELETE, UPDATE
Subconsultas se pueden anidar en el UPDATE, DELETE, INSERT y SELECT (DML). Ejemplo 1: En el ejemplo siguiente se duplica el valor de la columna ListPrice en la tabla Production.Product. La subconsulta en la cláusula WHERE referencias de la tabla Purchasing.ProductVendor para restringir las filas actualiza en la tabla de productos que sólo los suministrados por VendorID 51
USE AdventureWorks2008R2; GO UPDATE Production.Product SET ListPrice = ListPrice * 2 WHERE ProductID IN ( SELECT ProductID FROM Purchasing.ProductVendor WHERE VendorID = 51 ); GO Aquí está una sentencia equivalente UPDATE, usando una combinación INNER JOIN. USE AdventureWorks2008R2; GO UPDATE Production.Product SET ListPrice = ListPrice * 2 FROM Production.Product AS p INNER JOIN Purchasing.ProductVendor AS pv ON p.ProductID = pv.ProductID AND pv.VendorID = 51; GO Ejemplo 2: La instrucción DELETE muestra la solución con subconsulta eliminando filas de la tabla SalesPersonQuotaHistory basándose en las ventas del año hasta la fecha almacenadas en la tabla SalesPerson. USE AdventureWorks2008R2; GO DELETE FROM Sales.SalesPersonQuotaHistory WHERE BusinessEntityID IN ( SELECT BusinessEntityID FROM Sales.SalesPerson WHERE SalesYTD > 2500000.00 ); GO
Administración de Base de Datos I 78
Ejemplo 3: Usando subconsultas se inserta filas en la nueva tabla dbo.Moneda desde la tabla Sales.Currency. Use AdventureWorks --verifica si existe la tabla Moneda para borrarlo IF OBJECT_ID ('dbo.Moneda', 'U') IS NOT NULL DROP TABLE dbo.Moneda; GO --crea la tabla Moneda Create Table dbo.Moneda ( cod_moneda nchar(3), nom_moneda nvarchar(50) ) GO --Ingresa datos a la tbla moneda desde la tabla Sales.Currency INSERT dbo.Moneda SELECT CurrencyCode, Name FROM Sales.Currency ; GO
Administración de Base de Datos I 79
Arreglos
Contenidos
- Lección 1: Consultas agrupadas - Lección 2: Funciones de grupo - Lección 3: Vistas
____________________________________________________________________________
Consultas agrupadas Se denomina así cuando se agrupa los datos de la tabla origen y produce una única fila resumen por cada grupo formado. Las columnas indicadas en el GROUP BY se llaman columnas de agrupación. Para cada registro, se crea un valor sumario si se incluye una función SQL agregada, como SUM, AVG, MAX, MIN o COUNT (como veremos después), en la instrucción SELECT.
Administración de Base de Datos I 80
Cláusula GROUP BY La cláusula GROUP BY se usa para generar valores de agregado para cada fila del conjunto de resultados. Cuando se usan sin una cláusula GROUP BY, las funciones de agregado sólo devuelven un valor de agregado para una instrucción SELECT. Sintaxis:
SELECT campos_a_agrupar, Funciones_agregado() FROM tabla WHERE condición_campo GROUP BY campos_del_grupo HAVING condición_grupo
Ejemplo: En el ejemplo siguiente se calcula el total de cada pedido de ventas de la base de datos.
USE AdventureWorks; GO SELECT SalesOrderID, SUM(LineTotal) AS SubTotal FROM Sales.SalesOrderDetail sod GROUP BY SalesOrderID ORDER BY SalesOrderID ; GO
Cláusula HAVING Especifica una condición de búsqueda para un grupo o agregado. HAVING sólo se puede utilizar con la instrucción SELECT. Normalmente, HAVING se utiliza en una cláusula GROUP BY. Cuando no se utiliza GROUP BY, HAVING se comporta como una cláusula WHERE. Ejemplo: En el ejemplo siguiente, donde se utiliza una cláusula HAVING simple, se recupera el total de cada SalesOrderID de la tabla SalesOrderDetail que exceda $100000.00.
USE AdventureWorks2008R2 ; GO SELECT SalesOrderID, SUM(LineTotal) AS SubTotal FROM Sales.SalesOrderDetail GROUP BY SalesOrderID HAVING SUM(LineTotal) > 100000.00 ORDER BY SalesOrderID ;
Administración de Base de Datos I 81
Funciones de Grupo
SUM() Devuelve la suma de todos los valores, o sólo los valores distintos, en la expresión. SUM se puede utilizar con columnas numéricas. Los valores nulos se omiten. Ejemplo 1:
USE AdventureWorks2008R2; GO SELECT Color, SUM(ListPrice), SUM(StandardCost) FROM Production.Product WHERE Color IS NOT NULL AND ListPrice != 0.00 AND Name LIKE 'Mountain%' GROUP BY Color ORDER BY Color; GO
Ejemplo 2:
USE AdventureWorks2008R2; GO SELECT Color, ListPrice, StandardCost FROM Production.Product WHERE Color IS NOT NULL AND ListPrice != 0.00 AND Name LIKE 'Mountain%' ORDER BY Color COMPUTE SUM(ListPrice), SUM(StandardCost) BY Color; GO
Ejemplo 3:
USE AdventureWorks2008R2; GO SELECT Color, SUM(ListPrice), SUM(StandardCost) FROM Production.Product GROUP BY Color ORDER BY Color; GO
Administración de Base de Datos I 82
AVG() Devuelve el promedio de los valores de un grupo. Los valores nulos se omiten. Ejemplo 1: El siguiente ejemplo calcula el promedio de horas de vacaciones y la suma de las horas de licencia por enfermedad que los vicepresidentes de Adventure Works haya utilizado. Cada una de estas funciones de agregado produce un valor de resumen único para todas las filas recuperadas.
USE AdventureWorks2008R2; GO SELECT AVG(VacationHours)AS 'Average vacation hours', SUM (SickLeaveHours) AS 'Total sick leave hours' FROM HumanResources.Employee WHERE JobTitle LIKE 'Vice President%';
Ejemplo 2: Cuando se utiliza con una cláusula GROUP BY, cada función de agregado produce un solo valor para cada grupo, en lugar de para toda la tabla. En el ejemplo siguiente produce valores de resumen para cada territorio de ventas. El resumen muestra la bonificación media percibida por el personal de ventas en cada territorio y la suma de las ventas del año hasta la fecha de cada territorio. Su sintaxis es la siguiente:
USE AdventureWorks2008R2; GO SELECT TerritoryID, AVG(Bonus)as 'Promedio de Bonificación', SUM(SalesYTD) as „Ventas por año' FROM Sales.SalesPerson GROUP BY TerritoryID; GO
Ejemplo 3: La instrucción siguiente devuelve el precio de lista promedio de los productos.
USE AdventureWorks2008R2; GO SELECT AVG(DISTINCT ListPrice) FROM Production.Product;
Ejemplo 4: Sin DISTINCT, la función AVG comprueba el precio de lista promedio de todos los productos de la tabla Product.
USE AdventureWorks2008R2; GO SELECT AVG(ListPrice) FROM Production.Product;
Administración de Base de Datos I 83
MAX() Devuelve el valor máximo en la expresión. Ejemplo 1: El ejemplo siguiente devuelve el más alto (máximo) de impuestos.
USE AdventureWorks2008R2; GO SELECT MAX(TaxRate) FROM Sales.SalesTaxRate; GO
Ejemplo 2: La siguiente consulta muestra el precio más alto de los productos por cada color, siempre y cuando el color no sea nulo y nombre del producto contenga la palabra MOUNTAIN.
USE AdventureWorks2008R2; GO SELECT Color, MAX(ListPrice) 'Precio mas aAto' FROM Production.Product WHERE Color IS NOT NULL AND Name LIKE 'Mountain%' GROUP BY Color
MIN().
Devuelve el valor mínimo de la expresión. Ejemplo 1: El ejemplo siguiente devuelve la más baja (mínima) tasa de impuestos.
USE AdventureWorks2008R2; GO SELECT MIN(TaxRate) FROM Sales.SalesTaxRate; GO
Ejemplo 2: El ejemplo visualiza los costos mínimos por cada color
SELECT Color, MIN(StandardCost) As [Costo Mínimo] FROM Production.Product GROUP BY Color
Administración de Base de Datos I 84
COUNT(). Devuelve el número de elementos de un grupo. COUNT funciona como la función COUNT_BIG. La única diferencia entre las dos funciones es su valor de retorno. COUNT siempre devuelve un valor de tipo de datos int. COUNT_BIG siempre devuelve un valor de tipo de datos bigint. Ejemplo 1: El ejemplo siguiente muestra el número de títulos diferentes que un empleado que trabaja en Adventure Works puede contener.
USE AdventureWorks2008R2; GO SELECT COUNT(DISTINCT Title) FROM HumanResources.Employee; GO
Ejemplo 2: El siguiente ejemplo busca el número total de empleados que trabajan en Adventure Works.
USE AdventureWorks2008R2; GO SELECT COUNT(*) FROM HumanResources.Employee; GO
Ejemplo 3: El ejemplo muestra la cantidad de productos por cada color.
SELECT Color, COUNT(Name) As [Cantidad Productos] FROM Production.Product WHERE Color IS NOT NULL GROUP BY Color
Administración de Base de Datos I 85
Vistas Una Vista es una tabla virtual cuyos contenidos (columnas y filas) se definen por una consulta. Utilice esta instrucción para crear una vista de los datos en una o varias tablas de la base de datos. Por ejemplo, una vista puede ser usado para los siguientes fines: • A fin de reforzar, simplificar y personalizar la percepción que cada usuario tiene de la base de datos. • Como un mecanismo de seguridad al permitir a los usuarios acceder a datos a través de la vista, sin conceder los permisos a los usuarios acceder directamente a las tablas base subyacentes. • Para proporcionar una interfaz compatible con versiones anteriores de emular una tabla cuyo esquema ha cambiado.
Creación de una Vista Para crear una vista se utiliza el comando CREATE VIEW. Sintaxis:
CREATE VIEW nombre_esquema.nombre_vista AS SELECT campos FROM tabla WHERE condicion GROUP BY campos_de_agrupamiento HAVING condición_de_grupo
Ejemplo 1: En el ejemplo siguiente se crea una vista utilizando una sentencia SELECT simple. A simple vista es útil cuando una combinación de columnas se consulta con frecuencia. Los datos de este punto de vista proviene de la HumanResources.Employee y las tablas de la base de datos Person.Person AdventureWorks2008R2.
USE AdventureWorks2008R2 ; GO IF OBJECT_ID ('hiredate_view', 'V') IS NOT NULL DROP VIEW hiredate_view ; GO CREATE VIEW hiredate_view AS SELECT p.FirstName, p.LastName, e.BusinessEntityID, e.HireDate FROM HumanResources.Employee e JOIN Person.Person AS p ON e.BusinessEntityID = p.BusinessEntityID ; GO
Administración de Base de Datos I 86
Ejemplo 2: En el ejemplo siguiente se utiliza la opción WITH ENCRYPTION y muestra las columnas calculadas, rebautizada como columnas, y en varias columnas.
USE AdventureWorks2008R2 ; GO IF OBJECT_ID ('Purchasing.PurchaseOrderReject', 'V') IS NOT NULL DROP VIEW Purchasing.PurchaseOrderReject ; GO CREATE VIEW Purchasing.PurchaseOrderReject WITH ENCRYPTION AS SELECT PurchaseOrderID, ReceivedQty, RejectedQty, RejectedQty / ReceivedQty AS RejectRatio, DueDate FROM Purchasing.PurchaseOrderDetail WHERE RejectedQty / ReceivedQty > 0 AND DueDate > CONVERT(DATETIME,'20010630',101) ; GO
Ejemplo 3: El siguiente ejemplo muestra una vista denominada SeattleOnly que hace referencia a cinco tablas y permite que las modificaciones de datos para aplicar únicamente a los empleados que viven en Seattle.
USE AdventureWorks2008R2 ; GO IF OBJECT_ID ('dbo.SeattleOnly', 'V') IS NOT NULL DROP VIEW dbo.SeattleOnly ; GO CREATE VIEW dbo.SeattleOnly AS SELECT p.LastName, p.FirstName, e.JobTitle, a.City, sp.StateProvinceCode FROM HumanResources.Employee e INNER JOIN Person.Person p ON p.BusinessEntityID = e.BusinessEntityID INNER JOIN Person.BusinessEntityAddress bea ON bea.BusinessEntityID = e.BusinessEntityID INNER JOIN Person.Address a ON a.AddressID = bea.AddressID INNER JOIN Person.StateProvince sp ON sp.StateProvinceID = a.StateProvinceID WHERE a.City = 'Seattle' WITH CHECK OPTION ; GO
Administración de Base de Datos I 87
Ejemplo 4: El siguiente ejemplo muestra una definición de la vista que incluye una función integrada. Al utilizar las funciones, debe especificar un nombre de columna para la columna derivada.
USE AdventureWorks2008R2 ; GO IF OBJECT_ID ('Sales.SalesPersonPerform', 'V') IS NOT NULL DROP VIEW Sales.SalesPersonPerform ; GO CREATE VIEW Sales.SalesPersonPerform AS SELECT TOP (100) SalesPersonID, SUM(TotalDue) AS TotalSales FROM Sales.SalesOrderHeader WHERE OrderDate > CONVERT(DATETIME,'20001231',101) GROUP BY SalesPersonID; GO
Modificación de una Vista
Para crear una vista se utiliza el comando ALTER VIEW. Sintaxis:
ALTER VIEW nombre_esquema.nombre_vista AS SELECT campos FROM tabla WHERE condicion GROUP BY campos_de_agrupamiento HAVING condición_de_grupo
Ejemplo: En el ejemplo siguiente se crea una vista que contiene todos los trabajadores y sus fechas de alquiler llamada EmployeeHireDate. Los permisos se conceden a la vista, pero los requisitos son cambiados para seleccionar los empleados cuyo alquiler fechas caen antes de una fecha determinada. Entonces, ALTER VIEW se utiliza para reemplazar la vista.
USE AdventureWorks2008R2 ; GO CREATE VIEW HumanResources.EmployeeHireDate AS SELECT p.FirstName, p.LastName, e.HireDate FROM HumanResources.Employee AS e JOIN Person.Person AS p ON e.BusinessEntityID = p.BusinessEntityID ; GO
La vista debe ser cambiada para incluir sólo los empleados que fueron contratados antes de 1997. Si ALTER VIEW no se utiliza, pero en su lugar la vista se cae y vuelve a crear, el comando GRANT anteriores y cualquier otra declaración que tienen que ver con los permisos correspondientes a este punto de vista hay que volver a entrar.
ALTER VIEW HumanResources.EmployeeHireDate AS SELECT p.FirstName, p.LastName, e.HireDate FROM HumanResources.Employee AS e JOIN Person.Person AS p ON e.BusinessEntityID = p.BusinessEntityID WHERE HireDate < CONVERT(DATETIME,'19980101',101) ; GO
Administración de Base de Datos I 88
Eliminar una vista
Para eliminar una vista se utiliza el comando DROP VIEW. Sintaxis:
DROP VIEW nombre_esquema.nombre_vista
Ejemplo: El siguiente ejemplo se quita la vista Reordenar.
USE AdventureWorks2008R2 ; GO IF OBJECT_ID ('dbo.Reorder', 'V') IS NOT NULL DROP VIEW dbo.Reorder ; GO
Administración de Base de Datos I 89
Arreglos
Contenidos
- Lección 1: Integración de conocimiento. ____________________________________________________________________________
Consultas agrupadas Se denomina así cuando se agrupa los datos de la tabla origen y produce una única fila resumen por cada grupo formado. Las columnas indicadas en el GROUP BY se llaman columnas de agrupación.
Administración de Base de Datos I 90
Arreglos
Contenidos
- Lección 1: Procedimiento almacenados ____________________________________________________________________________
Programación Transact SQL Transact/SQL permite agrupar una serie de instrucciones como lote, ya sea de forma interactiva o desde un archivo operativo. También, se puede utilizar estructuras de control de flujo por Transact/SQL para conectar las instrucciones utilizando estructuras de tipo de programación. Transact/SQL proporciona palabras clave especiales llamadas lenguaje de control de flujo que permiten controlar el flujo de ejecución de las instrucciones. El lenguaje de control de flujo se puede utilizar en instrucciones sencillas, lotes, procedimientos almacenados y disparadores.
Administración de Base de Datos I 91
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 ejecución para que la subsiguiente ejecución sea muy rápida. Los procedimientos almacenados pueden:
Incluir parámetros
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 razón de dicho fallo.
Devolver valores de parámetros 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 ejecución de las instrucciones y lotes de SQL de forma dramática. Además los procedimientos almacenados pueden ejecutarse en otro SQL Server si el servidor del usuario y el remoto están configurados para permitir logins remotos. Los procedimientos almacenados se diferencian de las instrucciones SQL ordinarias y de lotes de instrucciones SQL en que están precompilados. La primera vez que se ejecuta un procedimiento, el procesador de consultas SQL Server lo analiza y prepara un plan de ejecución que se almacena en forma definitiva en una tabla de sistema, Posteriormente, el procedimiento se ejecuta según 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 instantánea. 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. También, puede utilizar el nombre del procedimiento almacenado solo, siempre que sea la primera palabra de una instrucción o lote. En Microsoft SQL Server 2008, existen 02 tipos de procedimientos: Procedimiento almacenado del Sistema (SP) Los procedimientos almacenados del sistema, ya se encuentran definidos y cumplen un propósito específico. Los procedimientos almacenados del sistema se agrupan en las categorías que aparecen en la siguiente tabla.
Categoría Descripción
Procedimientos almacenados de
Active Directory
Se utilizan para registrar instancias de SQL Server y
bases de datos de SQL Server en Active Directory de
Microsoft Windows 2000.
Procedimientos almacenados del
catálogo
Se utilizan para implementar las funciones del
diccionario de datos ODBC y aislar las aplicaciones
ODBC de los cambios en las tablas subyacentes del
Administración de Base de Datos I 92
sistema.
Procedimientos almacenados de
captura de datos modificados
Permiten habilitar, deshabilitar o informar sobre los
objetos de la captura de datos modificados.
Procedimientos almacenados de
cursor
Se utilizan para implementar la funcionalidad de
variable de cursor.
Procedimientos almacenados del
motor de base de datos
Se utilizan para el mantenimiento general del SQL
Server Database Engine (Motor de base de datos de
SQL Server).
Procedimientos almacenados de
Correo electrónico de base de
datos y SQL Mail
Se utilizan para realizar operaciones de correo
electrónico desde una instancia de SQL Server.
Procedimientos almacenados de
planes de mantenimiento de
bases de datos
Se utilizan para configurar las tareas de mantenimiento
fundamentales necesarias para administrar el
rendimiento de las bases de datos.
Procedimientos almacenados de
consultas distribuidas
Se utilizan para implementar y administrar consultas
distribuidas.
Procedimientos almacenados de
la búsqueda de texto completo
Se utilizan para implementar y consultar índices de
texto completo.
Procedimientos almacenados del
trasvase de registros
Se utilizan para establecer, modificar y supervisar las
configuraciones de trasvase de registros.
Procedimientos almacenados de
automatización
Permiten habilitar el uso de objetos de automatización
estándar en un lote estándar de Transact-SQL.
Procedimientos almacenados de
administración basada en
directivas
Se usan para la administración basada en directivas.
Procedimientos almacenados de
replicación
Se utilizan para administrar la replicación.
Procedimientos almacenados de
seguridad
Se utilizan para administrar la seguridad.
Procedimientos almacenados de
SQL Server Profiler
Lo utiliza SQL Server Profiler para supervisar el
rendimiento y la actividad.
Administración de Base de Datos I 93
Procedimientos almacenados del
Agente SQL Server
Los utiliza el Agente SQL Server para administrar
actividades programadas y controladas por eventos.
Procedimientos almacenados de
XML
Se utilizan para la administración del texto XML.
Procedimientos almacenados
extendidos generales
Proporcionan una interfaz de una instancia de SQL
Server a los programas externos para diversas
actividades de mantenimiento.
SQL Server 2008 admite los siguientes procedimientos almacenados del sistema que se utilizan para realizar el mantenimiento general de una instancia de SQL Server.
sp_add_data_file_recover_suspect_db sp_dropmessage
sp_add_log_file_recover_suspect_db sp_droptype
sp_addextendedproc sp_executesql
sp_addextendedproperty sp_getapplock
sp_addmessage sp_getbindtoken
sp_addtype sp_help
sp_addumpdevice sp_helpconstraint
sp_altermessage sp_helpdb
sp_attach_db sp_helpdevice
sp_attach_single_file_db sp_helpextendedproc
sp_autostats sp_helpfile
sp_bindefault sp_helpfilegroup
sp_bindrule sp_helpindex
sp_bindsession sp_helplanguage
Administración de Base de Datos I 94
sp_certify_removable sp_helpserver
sp_clean_db_file_free_space sp_helpsort
sp_clean_db_free_space sp_helpstats
sp_configure sp_helptext
sp_control_plan_guide sp_helptrigger
sp_create_plan_guide sp_indexoption
sp_create_plan_guide_from_handle sp_invalidate_textptr
sp_create_removable sp_lock
sp_createstats sp_monitor
sp_cycle_errorlog sp_procoption
sp_datatype_info sp_recompile
sp_dbcmptlevel sp_refreshview
sp_dbmmonitoraddmonitoring sp_releaseapplock
sp_dbmmonitorchangealert sp_rename
sp_dbmmonitorchangemonitoring sp_renamedb
sp_dbmmonitordropalert sp_resetstatus
sp_dbmmonitordropmonitoring sp_serveroption
sp_dbmmonitorhelpalert sp_setnetname
sp_dbmmonitorhelpmonitoring sp_settriggerorder
sp_dbmmonitorresults sp_spaceused
Administración de Base de Datos I 95
sp_dboption sp_tableoption
sp_dbremove sp_unbindefault
sp_delete_backuphistory sp_unbindrule
sp_depends sp_updateextendedproperty
sp_detach_db sp_updatestats
sp_dropdevice sp_validname
sp_dropextendedproc sp_who
sp_dropextendedproperty
Procedimiento almacenado definido por el Usuario (USP) Son los que crea, define el usuario. Y como todo procedimiento, utiliza variables que son 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 están definidas por el usuario, mientras que las variables globales las suministra el sistema y están predefinidas.
Variables Globales: Las variables globales son variables predefinidas suministradas por el sistema. Se distinguen de las variables locales por tener dos símbolos “@”. Estas son algunas variables globales del servidor:
Variable Contenido
Contiene 0 si la última transacción se ejecutó de forma
correcta; en caso contrario, contiene el último número 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 instrucción insert
@@Version @@Version
@@ServerName Devuelve el Nombre del Servidor
@@Language Devuelve el nombre del idioma en uso
@@error
@@identity
Administración de Base de Datos I 96
Variables Globales: Las variables locales son variables definidas por el usuario. Los nombres de las variables Locales deben empezar con el símbolo “@”. A cada variable local, se le debe asignar un tipo de dato del sistema, exceptuando los tipos
TEXT, IMAGE o SYSNAME.
Las variables locales, se definen con la sentencia DECLARE, se asigna valor con la sentencia SET o SELECT, y se exhibe su valor con la sentencia PRINT o SELECT. Ejemplo:
USE AdventureWorks2008R2 ; GO -- Declaración DECLARE @nombre varchar(20) DECLARE @fechanac datetime DECLARE @sueldo numeric(8,2) -- Asignación SET @nombre='Javier' SET @fechanac='21/02/1980' SET @sueldo=1250.50 -- Impresión de valores PRINT @nombre PRINT @fechanac PRINT @sueldo
O
USE AdventureWorks2008R2 ; GO -- Declaración DECLARE @nombre varchar(20) DECLARE @fechanac datetime DECLARE @sueldo numeric(8,2) -- Asignación SELECT @nombre='Javier' SELECT @fechanac='21/02/1980' SELECT @sueldo=1250.50 -- Impresión de valores PRINT @nombre PRINT @fechanac PRINT @sueldo
Administración de Base de Datos I 97
Las variables también puede asumir un valor resultado de una consulta.
USE AdventureWorks2008R2 ; GO -- Declaración DECLARE @nombre varchar(20) DECLARE @fechanac datetime DECLARE @sueldo numeric(8,2) -- Asignación SET @nombre= (SELECT TOP 1 FirstName + SPACE(1) + LastName FROM Person.Contact ) SET @fechanac=GETDATE() SET @sueldo=(SELECT MAX(Bonus) FROM Sales.SalesPerson ) -- Impresión de valores PRINT „Hola‟ + SPACE(1) + @nombre PRINT „Naciste en la fecha‟ + SPACE(1) + CAST(@fechanac AS varchar(25)) PRINT „Tu sueldo es‟ + SPACE(1) + CAST(@sueldo AS varchar(25))
Administración de Base de Datos I 98
Control de flujo y palabras claves relacionadas.
Palabra Clave Función
IF Define una Ejecución condicional.
BEGIN Comienzo de un bloque de instrucciones
..END Final de un bloque de instrucciones
BREAK Sale del final del siguiente bucle mas exterior
.CONTINUE Reinicio del bucle while
DECLARE Declara variables locales
RETURN Sale de forma incondicional
CASE Permite que se muestre una valor alternativo
-- COMENTARIOInserta una línea de comentario en cualquier punto
de una instrucción SQL.
PRINTImprime un mensaje definido por el usuario o una
variable local en la pantalla del usuario
/* COMENTARIO */Inserta un comentario en cualquier punto de una
instrucción SQL
Control de Flujo y palabras claves Relacionadas
..ELSEDefine una ejecución alternativa cuando la condición
IF es falsa
WHILERepite la ejecución de instrucciones mientras la
condición es verdadera
Administración de Base de Datos I 99
CREATE PROCEDURE.
Crea un procedimiento almacenado. Un procedimiento almacenado es una colección guardada de instrucciones Transact-SQL o una referencia a una aplicación Microsoft. NET Framework Common Language (CLR) método que puede tomar y devolver los parámetros proporcionados por el usuario. Los procedimientos se pueden crear para uso permanente o temporal para el uso dentro de un período de sesiones, procedimiento local temporal, o para el uso temporal en todas las sesiones, procedimiento temporal global. Los procedimientos almacenados también se pueden crear para ejecutarse automáticamente cuando una instancia de SQL Server se inicia. Sintaxis: CREATE PROCEDURE nombre_procedimiento Lista_de_parámetros AS Sentencias T-SQL GO Ejemplo 1: El siguiente procedimiento almacenado devuelve todos los empleados (nombres y apellidos incluidos), sus títulos profesionales, y sus nombres de departamentos desde una vista. Este procedimiento almacenado no utiliza ningún parámetro.
USE AdventureWorks2008R2; GO IF OBJECT_ID ( 'HumanResources.uspGetAllEmployees', 'P' ) IS NOT NULL DROP PROCEDURE HumanResources.uspGetAllEmployees; GO CREATE PROCEDURE HumanResources.uspGetAllEmployees AS SET NOCOUNT ON; SELECT LastName, FirstName, JobTitle, Department FROM HumanResources.vEmployeeDepartment; GO
Para ejecutar, se utiliza el comando EXECUTE (03 formas)
EXECUTE HumanResources.uspGetAllEmployees; GO -- O EXEC HumanResources.uspGetAllEmployees; GO -- O bien, si este procedimiento es la primera instrucción dentro del lote: HumanResources.uspGetAllEmployees;
Administración de Base de Datos I 100
Ejemplo 2: El siguiente procedimiento almacenado devuelve sólo el empleado especificado (nombre y apellido suministrado), su título y su nombre de departamento de una vista. Este procedimiento almacenado acepta coincidencias exactas de los parámetros pasados.
USE AdventureWorks2008R2; GO IF OBJECT_ID ( 'HumanResources.uspGetEmployees', 'P' ) IS NOT NULL DROP PROCEDURE HumanResources.uspGetEmployees; GO CREATE PROCEDURE HumanResources.uspGetEmployees @LastName nvarchar(50), @FirstName nvarchar(50) AS SET NOCOUNT ON; SELECT FirstName, LastName, JobTitle, Department FROM HumanResources.vEmployeeDepartment WHERE FirstName = @FirstName AND LastName = @LastName; GO
El procedimiento almacenado uspGetEmployees se puede ejecutar en las siguientes maneras:
EXECUTE HumanResources.uspGetEmployees N'Ackerman', N'Pilar'; -- Or EXEC HumanResources.uspGetEmployees @LastName = N'Ackerman', @FirstName = N'Pilar'; GO -- Or EXECUTE HumanResources.uspGetEmployees @FirstName = N'Pilar', @LastName = N'Ackerman'; GO -- Or, if this procedure is the first statement within a batch: HumanResources.uspGetEmployees N'Ackerman', N'Pilar';
Ejemplo 3: El siguiente ejemplo muestra cómo puede crear un procedimiento almacenado que devuelve un conjunto de filas de todos los productos que tengan más de un día a la fabricación
CREATE PROC Production.LongLeadProducts AS SELECT Name, ProductNumber FROM Production.Product WHERE DaysToManufacture >= 1 GO
El procedimiento se ejecuta.
EXEC Production.LongLeadProducts
Administración de Base de Datos I 101
ALTER PROCEDURE. Comando utilizado para modificar procedimientos. Sintaxis: ALTER PROCEDURE nombre_procedimiento Lista_de_parámetros AS Sentencias T-SQL_a_modificar GO Ejemplo: En el ejemplo siguiente se crea el procedimiento almacenado uspVendorAllInfo. Este procedimiento devuelve los nombres de todos los proveedores que suministran Adventure Works Cycles, los productos que suministran, sus calificaciones crediticias, y su disponibilidad. Después este procedimiento, se modifica para devolver un conjunto de resultados diferentes.
USE AdventureWorks2008R2; GO IF OBJECT_ID ( 'Purchasing.uspVendorAllInfo', 'P' ) IS NOT NULL DROP PROCEDURE Purchasing.uspVendorAllInfo; GO CREATE PROCEDURE Purchasing.uspVendorAllInfo WITH EXECUTE AS CALLER AS SET NOCOUNT ON; SELECT v.Name AS Vendor, p.Name AS 'Product name', v.CreditRating AS 'Rating', v.ActiveFlag AS Availability FROM Purchasing.Vendor v INNER JOIN Purchasing.ProductVendor pv ON v.BusinessEntityID = pv.BusinessEntityID INNER JOIN Production.Product p ON pv.ProductID = p.ProductID ORDER BY v.Name ASC; GO
Administración de Base de Datos I 102
En el ejemplo siguiente cambia el procedimiento almacenado uspVendorAllInfo (sin la opción EXECUTE AS) para volver sólo a los proveedores que suministran el producto especificado. LEFT y las funciones CASE personalizan la apariencia del conjunto de resultados.
USE AdventureWorks2008R2; GO ALTER PROCEDURE Purchasing.uspVendorAllInfo @Product varchar(25) AS SELECT LEFT(v.Name, 25) AS Vendor, LEFT(p.Name, 25) AS 'Product name', 'Rating' = CASE v.CreditRating WHEN 1 THEN 'Superior' WHEN 2 THEN 'Excellent' WHEN 3 THEN 'Above average' WHEN 4 THEN 'Average' WHEN 5 THEN 'Below average' ELSE 'No rating' END , Availability = CASE v.ActiveFlag WHEN 1 THEN 'Yes' ELSE 'No' END FROM Purchasing.Vendor AS v INNER JOIN Purchasing.ProductVendor AS pv ON v.BusinessEntityID = pv.BusinessEntityID INNER JOIN Production.Product AS p ON pv.ProductID = p.ProductID WHERE p.Name LIKE @Product ORDER BY v.Name ASC; GO
Se ejecuta:
EXEC Purchasing.uspVendorAllInfo N'LL Crankarm'; GO
Administración de Base de Datos I 103
DROP PROCEDURE. Comando utilizado para eliminar procedimientos. Sintaxis: DROP PROCEDURE nombre_procedimiento GO Ejemplo:
DROP PROCEDURE dbo.uspMyProc; GO
Administración de Base de Datos I 104
Arreglos
Contenidos
- Lección 1: Concepto de Parámetros - Lección 2: Validando datos - Lección 3: Invocando otros procedimientos - Lección 4: Optimizando operaciones / Transacciones
____________________________________________________________________________
Parámetros Los parámetros son como variables, que se definen en un procedimiento o función y que permitirán recepcionar un valor para poderlo utilizar dentro de la estructura. También hay parámetros que devolverán un valor.
Administración de Base de Datos I 105
Uso de Parámetros
Ejemplo 1:
USE AdventureWorks; GO CREATE PROCEDURE USP_EmployeeStatusMarital @año smallint AS SELECT * FROM HumanResources.Employee WHERE DATEPART (YY,BirthDate) = @año GO
Ejecutar
EXEC USP_EmployeeStatusMarital 1960
Ejemplo 2:
USE AdventureWorks; GO CREATE PROC USP_SalesMontoTotal @valor1 numeric(10,4), @valor2 numeric(10,4) AS SELECT * FROM Sales.SalesOrderHeader WHERE TotalDue BETWEEN @valor1 AND @valor2 GO
Ejecutar EXEC USP_SalesMontoTotal 9000,9250
Ejemplo 3:
USE AdventureWorks; GO CREATE PROCEDURE USP_Mensaje @cod_mensaje tinyint AS DECLARE @msg varchar(50) SET @msg = CASE @cod_mensaje WHEN 1 THEN 'Dato Incorrecto' WHEN 2 THEN 'Dato no Existe' WHEN 3 THEN 'Dato ya Existe' WHEN 4 THEN 'Dato es Nulo' ELSE 'Código de error no existe' END PRINT @msg GO
Ejecutar EXEC USP_Mensaje 2
Administración de Base de Datos I 106
Validando datos / Invocando a otros procedimientos
Ejemplo 1: El procedimiento almacenado recibe como parámetro los campos de la tabla Sales.Currency, validando que los dato no sean nulos, y que el código no se repita, de ser así, mostrar un mensaje de error invocado desde otro procedimiento y abandonar el procedimiento. Si todo es correcto, ingresar los datos a la tabla.
USE AdventureWorks; GO CREATE PROCEDURE USP_IngresoCurrency @CurrencyCode nchar(3), @Name nvarchar(50), @ModifiedDate DateTime AS IF (@CurrencyCode IS NULL) OR (@Name IS NULL) OR (@ModifiedDate IS NULL) BEGIN EXEC USP_Mensaje 4 RETURN END IF EXISTS (SELECT * FROM Sales.Currency WHERE CurrencyCode = @CurrencyCode) BEGIN EXEC USP_Mensaje 3 RETURN END INSERT Sales.Currency VALUES (@CurrencyCode,@Name, @ModifiedDate) GO
Ejecutar:
EXEC USP_IngresoCurrency 'PPP','TangaMandaPio','12/10/09' Ejemplo 2: En el ejemplo siguiente se crea un procedimiento almacenado con parámetro de salida, que inserta un nuevo departamento en la tabla HumanResources.Department de la base de datos AdventureWorks.
CREATE PROC HumanResources.AddDepartment @Name nvarchar(50), @GroupName nvarchar(50), @DeptID smallint OUTPUT AS INSERT INTO HumanResources.Department (Name, GroupName) VALUES (@Name, @GroupName) SET @DeptID = SCOPE_IDENTITY()
Administración de Base de Datos I 107
El @ DeptID es el parámetro de salida de la identidad del nuevo registro, la función SCOPE_IDENTITY muestra el valor generado automáticamente en el número de identificación. The following example shows how the calling application can store the results of the stored procedure execution using the local variable @dept.
DECLARE @dept int EXEC AddDepartment 'Refunds', '', @dept OUTPUT SELECT @dept
Administración de Base de Datos I 108
Optimizando operaciones o transacciones Ejemplo 1: En el siguiente ejemplo se utiliza una instrucción UPDATE en un procedimiento almacenado. El procedimiento acepta un parámetro de entrada ,@NewHours. El valor del parámetro se utiliza en la instrucción UPDATE para actualizar la columna VacationHours de la tabla HumanResources.Employee. La expresión CASE se utiliza en la cláusula SET para determinar el valor que está establecido para VacationHours condicionalmente. Cuando se paga al empleado cada hora (SalariedFlag = 0), VacationHours se establece en el número actual de horas más el valor especificado en @NewHours; por otra parte, VacationHours se establece en el valor especificado en @NewHours.
USE AdventureWorks2008R2; GO CREATE PROCEDURE HumanResources.Update_VacationHours @NewHours smallint AS SET NOCOUNT ON; UPDATE HumanResources.Employee SET VacationHours = ( CASE WHEN SalariedFlag = 0 THEN VacationHours + @NewHours ELSE @NewHours END ) WHERE CurrentFlag = 1; GO
Ejecutar:
EXEC HumanResources.Update_VacationHours 40; Ejemplo 2: En el siguiente ejemplo, el procedimiento recibe un parámetro monto que deberá ser mayor a 0, de ser así, se elimina datos de la tabla Sales.SalesPersonQuotaHistory, siempre y cuando el campo SalesYTD es mayor al monto ingresado como parámetro
USE AdventureWorks2008R2; GO CREATE PROCEDURE USP_EliminarPersonQuotaHistory @monto numeric(10,2) AS IF @monto IS NULL OR @monto=0 BEGIN EXEC USP_Mensaje 2 RETURN END DELETE FROM Sales.SalesPersonQuotaHistory WHERE BusinessEntityID IN (SELECT BusinessEntityID FROM Sales.SalesPerson WHERE SalesYTD > @monto); GO
Ejecutar:
EXEC HumanResources.Update_VacationHours 40;
Administración de Base de Datos I 109
Arreglos
Contenidos
- Lección 1: Funciones - Lección 2: Trigger
____________________________________________________________________________
Funciones Las funciones son rutinas formado por una o más instrucciones Transact-SQL que puede ser utilizada para encapsular el código para su reutilización. Una función toma cero o más parámetros de entrada y devuelve un valor escalar o una tabla. Los parámetros de entrada puede ser cualquier tipo de datos, excepto TimeStamp, Cursor, o tabla, las funciones no son compatibles con los parámetros de salida. Microsoft SQL Server 2008, dispone de 02 tipos de funciones: Funciones del Sistema de SQL Funciones Definidas por el Usuario. Estas funciones definidas por el usuario solucionarán los problemas de reutilización del código y dará mayor flexibilidad al programar las consultas de SQL. Estas funciones a su vez se clasifican en: Funciones Escalares Función de Tabla en Línea Función de Tabla de MultiSentencia.
Administración de Base de Datos I 110
Funciones Escalares
Las funciones escalares devuelven un tipo de datos tales como int, money, varchar, float, etc. Pueden ser utilizadas en cualquier lugar incluso incorporado dentro de sentencias SQL. Sintaxis: CREATE FUNCTION nombre_función (lista de parámetros) RETURNS tipo_dato_a_devolver AS BEGIN Lógica_de_función --- ----- ------- ---- ------- ------ RETURN dato_a_devolver END Ejemplo 1: En el ejemplo siguiente se crea una función escalar que suma todas las ventas de una determinado producto en la base de datos AdventureWorks y devuelve el total como un int.
CREATE FUNCTION Sales.SumSold (@ProductID int) RETURNS int AS BEGIN DECLARE @ret int SELECT @ret = SUM(OrderQty) FROM Sales.SalesOrderDetail WHERE ProductID = @ProductID IF (@ret IS NULL) SET @ret = 0 RETURN @ret END
Una función definida por el usuario devuelve un valor escalar, se puede invocar en cualquier lugar que permita una expresión del mismo tipo de datos. Los siguientes tabla contiene ejemplos en los que se pueden utilizar funciones escalares.
Área Ejemplo
Consultas ■ Como una expresión en la select_list de una instrucción SELECT. ■ Como una expresión o Expresion_cadena en un caso o
La cláusula HAVING. ■ Como group_by_expression en una cláusula GROUP BY. ■ Como order_by_expression en una cláusula ORDER BY. ■ Como una expresión en la cláusula SET de una instrucción UPDATE. ■ Como una expresión en la cláusula VALUES de una instrucción
INSERTdeclaración.
Tabla definición ■ restricciones CHECK. Las funciones pueden referirse sólo a Columnas en la misma tabla.
■ DEFAULT definiciones. Funciones sólo puede contener constantes.
■ Columnas calculadas. Las funciones pueden referirse sólo a Columnas en la misma tabla.
Administración de Base de Datos I 111
Área Ejemplo
Declaraciones ■ En los operadores de asignación. Transact-SQL ■ En las expresiones de Booleanas de las instrucciones de control de
flujo. ■ En las expresiones CASE.
■ En declaraciones IMPRIMIR (sólo para funciones que devuelven un cadena de caracteres).
Funciones y ■ Como argumentos de la función. Procedimientos ■ En la declaración de un procedimiento almacenado RETURN (sólo Almacenados para funciones escalar que devuelven un entero).
■ En la declaración de un procedimiento almacenado RETURN (sólo para funciones escalar que devuelven un entero).
El ejemplo siguiente realiza una instrucción SELECT que recupera el ProductID, el Nombre, y el resultado de la función SumSold escalar para cada registro de productos en AdventureWorks.
SELECT ProductID, Name, Sales.SumSold(ProductID) AS SumSold FROM Production.Product
Funciones de tabla en linea. Puede utilizar las funciones en línea para conseguir la funcionalidad de puntos de vista con parámetros. Uno de las limitaciones de una vista es que no se les permite incluir un parámetro proporcionado por el usuario.. Por lo general, puede resolver esto proporcionando una cláusula WHERE cuando se llama a la vista. Sin embargo, esto podría requerir la construcción de una cadena para una ejecución dinámica, que puede aumentar la complejidad de la solicitud. Puede alcanzar las funcionalidades de una vista con parámetros mediante el uso de una función en línea con valores de tabla. Considere las siguientes características en línea con valores de tabla de funciones definidas por el usuario. ■ La declaración RETURNS especifica la tabla como el tipo de datos devuelto. ■ El conjunto de resultados de la instrucción SELECT define el formato de una variable de retorno. ■ La cláusula RETURN contiene una sola instrucción SELECT en paréntesis. La instrucción SELECT utilizada en una función en línea está sujeta a las mismas restricciones que las instrucciones SELECT utilizada en las vistas. ■ El cuerpo de la función no tiene por qué ser encerrado en un bloque de BEGIN ... END. Ejemplo 1: En el ejemplo siguiente se crea una función con valores de tabla en línea que devuelve los nombres de empleados de un gerente en particular en la base de datos AdventureWorks.
Administración de Base de Datos I 112
CREATE FUNCTION HumanResources.EmployeesForManager (@ManagerId int) RETURNS TABLE AS RETURN ( SELECT FirstName, LastName FROM HumanResources.Employee Employee INNER JOIN Person.Contact Contact ON Employee.ContactID = Contact.ContactID WHERE ManagerID = @ManagerId )
Invocando a la función:
SELECT * FROM HumanResources.EmployeesForManager(3) -- OR SELECT * FROM HumanResources.EmployeesForManager(6)
Ejemplo 2: El ejemplo siguiente devuelve una función en línea con valores de tabla. Devuelve tres columnas ProductID, Name y el agregado de los totales del año hasta la fecha por tienda como YTD Total, para cada producto vendido a la tienda.
USE AdventureWorks2008R2; GO IF OBJECT_ID (N'Sales.ufn_SalesByStore', N'IF') IS NOT NULL DROP FUNCTION Sales.ufn_SalesByStore; GO CREATE FUNCTION Sales.ufn_SalesByStore (@storeid int) RETURNS TABLE AS RETURN (SELECT P.ProductID, P.Name, SUM(SD.LineTotal) AS 'Total' FROM Production.Product AS P JOIN Sales.SalesOrderDetail AS SD ON SD.ProductID = P.ProductID JOIN Sales.SalesOrderHeader AS SH ON SH.SalesOrderID = SD.SalesOrderID JOIN Sales.Customer AS C ON SH.CustomerID = C.CustomerID WHERE C.StoreID = @storeid GROUP BY P.ProductID, P.Name ); GO
Invocando a la función:
SELECT * FROM Sales.ufn_SalesByStore (602);
Administración de Base de Datos I 113
Funciones de tabla Multisentencias.
Una función con valores de tabla de múltiple sentencia es una combinación de una vista y un procedimiento almacenado. Puede utilizar las funciones definidas por el usuario que devuelven una tabla para reemplazar procedimientos almacenados o vista. Una función con valores de tabla (como un procedimiento almacenado) puede utilizar una lógica compleja y múltiple Transact-SQL para crear una tabla. De la misma manera que utiliza una vista, puede utilizar una función con valores de tabla en la cláusula FROM de una instrucción de Transact-SQL. Considere las siguientes características de funciones de múltiples instrucciones con valores de tabla: ■ La sentencia RETURNS especifica la tabla como los tipos de datos devueltos y define un nombre para la tabla y el formato. ■ BEGIN ... END delimita el cuerpo de la función. Puede utilizar las funciones en línea para conseguir la funcionalidad de puntos de vista con parámetros. Uno de las limitaciones de una vista es que no se les permite incluir un Ejemplo : En el ejemplo siguiente se crea una tabla denominada variable @ tbl_Employees con dos columnas. Los cambios segunda columna en función del parámetro formato solicitado @ valor.
CREATE FUNCTION HumanResources.EmployeeNames (@format nvarchar(9)) RETURNS @tbl_Employees TABLE (EmployeeID int PRIMARY KEY, [Employee Name] nvarchar(100) ) AS BEGIN IF (@format = 'SHORTNAME') INSERT @tbl_Employees SELECT EmployeeID, LastName FROM HumanResources.vEmployee ELSE IF (@format = 'LONGNAME') INSERT @tbl_Employees SELECT EmployeeID, (FirstName + ' ' + LastName) FROM HumanResources.vEmployee RETURN END
Invocando a la función:
SELECT * FROM HumanResources.EmployeeNames('LONGNAME') -- OR SELECT * FROM HumanResources.EmployeeNames('SHORTNAME')
Administración de Base de Datos I 114
Otro ejemplo :
USE AdventureWorks2008R2; GO IF OBJECT_ID (N'dbo.ufn_FindReports', N'TF') IS NOT NULL DROP FUNCTION dbo.ufn_FindReports; GO CREATE FUNCTION dbo.ufn_FindReports (@InEmpID INTEGER) RETURNS @retFindReports TABLE ( EmployeeID int primary key NOT NULL, FirstName nvarchar(255) NOT NULL, LastName nvarchar(255) NOT NULL, JobTitle nvarchar(50) NOT NULL, RecursionLevel int NOT NULL ) --Returns a result set that lists all the employees who report to the --specific employee directly or indirectly.*/ AS BEGIN WITH EMP_cte(EmployeeID, OrganizationNode, FirstName, LastName, JobTitle, RecursionLevel) -- CTE name and columns AS ( SELECT e.BusinessEntityID, e.OrganizationNode, p.FirstName, p.LastName, e.JobTitle, 0 -- Get the initial list of Employees for Manager n FROM HumanResources.Employee e INNER JOIN Person.Person p ON p.BusinessEntityID = e.BusinessEntityID WHERE e.BusinessEntityID = @InEmpID UNION ALL SELECT e.BusinessEntityID, e.OrganizationNode, p.FirstName, p.LastName, e.JobTitle, RecursionLevel + 1 -- Join recursive member to anchor FROM HumanResources.Employee e INNER JOIN EMP_cte ON e.OrganizationNode.GetAncestor(1) = EMP_cte.OrganizationNode INNER JOIN Person.Person p ON p.BusinessEntityID = e.BusinessEntityID ) -- copy the required columns to the result of the function INSERT @retFindReports SELECT EmployeeID, FirstName, LastName, JobTitle, RecursionLevel FROM EMP_cte RETURN END; GO
Invocando
SELECT * FROM HumanResources.EmployeeNames('LONGNAME') -- OR SELECT * FROM HumanResources.EmployeeNames('SHORTNAME')
Administración de Base de Datos I 115
Trigger Un disparador es un tipo especial de procedimiento almacenado que se ejecuta cuando una instrucción INSERT, UPDATE, o DELETE manejan datos de una tabla especificada. Un disparador puede consultar otras tablas y pueden incluir instrucciones complejas Transact-SQL. A menudo se crean disparadores para exigir integridad referencial o coherencia entre los datos relacionados lógicamente en diferentes tablas. Se puede utilizar disparadores para hacer cumplir la lógica de negocio. Un disparador es un objeto de la base de datos. Cuando se crea un disparador, se especifica la tabla y los comandos de modificación de datos que deben “disparar” o activar el disparador. Luego, se indica la acción o acciones que debe llevar a cabo un disparador. Sintaxis 01: CREATE TRIGGER nombre_trigger ON nombre_tabla FOR operación AS ------ ……. GO Sintaxis 02: CREATE TRIGGER nombre_trigger ON nombre_tabla AFTER operación AS ------ ……. GO Sintaxis 03: CREATE TRIGGER nombre_trigger ON nombre_tabla INSTEAD OF operación AS ------ ……. GO
Administración de Base de Datos I 116
Ejemplo 1 : El código siguiente muestra la creación de un disparador INSERT llamado insrtWorkOrder sobre la tabla Production.WorkOrder de la base de datos AdventureWorks. Observa el uso de la tabla insertada a trabajar con los valores que han causado la ejecución del Trigger.
CREATE TRIGGER [insrtWorkOrder] ON [Production].[WorkOrder] AFTER INSERT AS BEGIN SET NOCOUNT ON; INSERT INTO [Production].[TransactionHistory] ( [ProductID] ,[ReferenceOrderID] ,[TransactionType] ,[TransactionDate] ,[Quantity] ,[ActualCost] ) SELECT inserted.[ProductID] ,inserted.[WorkOrderID] ,'W' ,GETDATE(), inserted.[OrderQty] ,0 FROM inserted; END;
Ejemplo 2: El siguiente disparo DML imprime un mensaje en el cliente cuando alguien intenta agregar o cambiar los datos de la tabla de clientes.
USE AdventureWorks2008R2; GO IF OBJECT_ID ('Sales.reminder1', 'TR') IS NOT NULL DROP TRIGGER Sales.reminder1; GO CREATE TRIGGER reminder1 ON Sales.Customer AFTER INSERT, UPDATE AS RAISERROR ('Notify Customer Relations', 16, 10); GO
Administración de Base de Datos I 117
Ejemplo 3: En el ejemplo siguiente se envía un mensaje de correo electrónico a un amigo específico (MaryM) cuando la tabla Customer tiene cambios, se ingresa datos o si se elimina algún registro.
USE AdventureWorks2008R2; GO IF OBJECT_ID ('Sales.reminder2','TR') IS NOT NULL DROP TRIGGER Sales.reminder2; GO CREATE TRIGGER reminder2 ON Sales.Customer AFTER INSERT, UPDATE, DELETE AS EXEC msdb.dbo.sp_send_dbmail @profile_name = 'AdventureWorks2008R2 Administrator', @recipients = '[email protected]', @body = 'Don''t forget to print a report for the sales force.', @subject = 'Reminder'; GO
Administración de Base de Datos I 118
Ejemplo 4: En el ejemplo siguiente se crea un disparador para asegurarse de que la calificación crediticia para el vendedor es bueno cuando se realiza un intento para insertar una nueva orden de compra en la tabla PurchaseOrderHeader. Para obtener la calificación de crédito del Proveedor, deberá hacer referencia. Si la calificación de crédito del proveedor es muy bajo, se muestra un mensaje y la inserción no se ejecuta.
USE AdventureWorks2008R2; GO IF OBJECT_ID ('Purchasing.LowCredit','TR') IS NOT NULL DROP TRIGGER Purchasing.LowCredit; GO /* Este disparador evita una fila que sea insertados en la tabla Purchasing.PurchaseOrderHeader, Cuando la calificación de solvencia del proveedor (Vendor) especificado se establece en 5 (debajo de la media).*/ CREATE TRIGGER Purchasing.LowCredit ON Purchasing.PurchaseOrderHeader AFTER INSERT AS DECLARE @creditrating tinyint, @vendorid int; IF EXISTS (SELECT * FROM Purchasing.PurchaseOrderHeader p JOIN inserted AS i ON p.PurchaseOrderID = i.PurchaseOrderID JOIN Purchasing.Vendor AS v ON v.BusinessEntityID = p.VendorID WHERE v.CreditRating = 5 ) BEGIN RAISERROR ('El proveedor no califica.', 16, 1); ROLLBACK TRANSACTION; RETURN END; GO
Administración de Base de Datos I 119
Ejemplo 5: El código siguiente muestra la creación de un desencadenador INSTEAD OF sobre la tabla HumanResources.Employee de la base de datos AdventureWorks.
CREATE TRIGGER [delEmployee] ON [HumanResources].[Employee] INSTEAD OF DELETE NOT FOR REPLICATION AS BEGIN SET NOCOUNT ON; DECLARE @DeleteCount int; SELECT @DeleteCount = COUNT(*) FROM deleted; IF @DeleteCount > 0 BEGIN RAISERROR („Los empleados no pueden ser borrados..', 10,1); IF @@TRANCOUNT > 0 BEGIN ROLLBACK TRANSACTION; END END; END;
Administración de Base de Datos I 120
Administración de Base de Datos I 121
http://msftdbprodsamples.codeplex.com/releases/view/45907
Administración de Base de Datos I 122
¿Cuáles son los tipos de datos suministrados por el sistema?
http://msdn.microsoft.com/en-us/library/ms190014.aspx