Introduccion A SQL Server 2000 (Buen Manual)
Introduccion A SQL Server 2000 (Buen Manual)
Introduccion A SQL Server 2000 (Buen Manual)
ISTEMAS UNI
SQL Server es un Sistema de Gestión de Bases de Datos Relaciónales (SGBDR), desarrollado por
Microsoft, que permite, como su propio nombre indica, la gestión de un entorno de bases de datos
relacional. SQL Server abarca, tanto el área de diseño, como la de administración, proporcionando
un interfaz bastante amigable con el usuario.
¿Por qué se llama SQL Server?. Pues bien, se llama SQL porque utiliza este lenguaje para la
definición y manejo de los datos, y se llama Server porque dispone de una parte servidora que se
encarga de atender a los procesos clientes, que son los que realizan las peticiones a éste; es decir,
sigue una arquitectura cliente/servidor.
SQL Server utiliza una extensión al SQL estándar, que se denomina Transact SQL. Esto quiere
decir que soporta el SQL de ANSI, pero además se le han añadido ciertas funciones adicionales,
no contempladas en el estándar, y que son específicas para este producto, es decir, si ejecutamos
una sentencia del conjunto adicional (Transact SQL) en otro SGBRD, éste no la entendería.
NUEVAS CARACTERÍSTICAS
Entre las nuevas características que ofrece SQL-Server 2000, cabe destacar las siguientes:
Su sintaxis es similar a la que nos ofrece el HTML, es decir, un conjunto de etiquetas que
definen la estructura de los datos.
<cliente>
<nombre>Pepe</nombre>
<apellidos>Lopez</apellidos>
<telefono>912345678</telefono>
</cliente>
FUNCIONES DE USUARIO
Una funcionalidad nueva que aparece en esta versión del SGBD es la de permitir al
usuario definir sus propias funciones. De esta forma se pueden definir funciones que
oculten parte de la complejidad que puede entrañar una consulta, no sólo para la
posterior reutilización de la misma, sino también teniendo en cuenta la abstracción
para otros programadores que puedan precisar su uso.
INDEXACIÓN DE VISTAS
Esta funcionalidad permite optimizar la ejecución de vistas que actúan sobre la base
de datos, creando índices sobre los resultados de ejecución de la misma, que son
almacenados en la base de datos. El usuario no debe preocuparse de la actualización
de los datos, sino que éstos son indexados automáticamente cada vez que se
actualicen.
NUEVOS TRIGGERS
SQL-Server 2000 soporta dos nuevos tipos de triggers, que son INSTEAD OF y que
sustituye el comportamiento de ciertos comandos, como por ejemplo insert, update o
delete, y AFTER, que se ejecuta una vez concluida la acción que lo ha
desencadenado.
CARACTERÍSTICAS DE SEGURIDAD Y
CIFRADO DE DATOS
SQL-Server 2000 utiliza Kerberos como servidor de autenticación, para acreditar el acceso al
servidor que se realiza desde el cliente, así como diversas técnicas de seguridad.
PERSONAL EDITION
La versión Personal Edition de SQL Server está diseñada para pequeñas bases de datos a
las que se accede localmente en un sistema cliente. SQL Server 2000 Personal Edition no
permite que otros equipos obtengan acceso a la base de datos.
STANDARD EDITION
SQL Server 2000 Standar Edition es una de las dos ediciones servidoras de SQL Server
2000. La versión Standar Edition funciona de la misma forma que la versión Enterprise
Edition, excepto que sólo se puede acceder a un máximo de cuatro CPUs y 4 GB de memoria
con la versión Standar Edition.
ENTERPRISE EDITION
La versión Enterprise Edition de SQL Server soporta todas las características y la
funcionalidad de todas las versiones de Windows 2000. SQL Server 2000 Enterprise Edition
requiere Windows 2000 Advanced Server o Windows 2000 Datacenter. Además, SQL
Server 2000 Enterprise Edition soporta clústeres de conmutación por error y vistas
distribuidas actualizables.
En este caso, puesto que queremos instalar los componentes cliente en nuestro
equipo local, sólo nos permite la selección de esta opción.
9. Dejamos marcados los que vienen por defecto y pulsamos el botón Next (siguiente),
para acceder a la página de la Figura, tras la cual el sistema empezará a instalar los
componentes seleccionados y, tras unos minutos, mostrará la pantalla final en la cual
se nos informa de la conclusión del proceso de instalación, como muestra la Figura
Las pautas clave para elegir el hardware adecuado para SQL Server son las siguientes:
• Procesador: SQL Server 2000 sólo se ejecuta en máquinas Intel x86 o compatibles;
no funcionará con procesadores Motorola MIPS R4000, PowerPC o DEC Alpha. SQL
Server logra unas altas prestaciones en las pruebas comparativas con Intel Pentium III
Xeon a 733 MHz y AMD Athlon a 1000 MHz. Ambos procesadores constituyen un
buen punto de partida para un sistema SQL Server medio. Puede lograr importantes
mejoras en el rendimiento con una gran cantidad de memoria caché interna del
procesador. La mayoría de los procesadores Xeon vienen con 512 KB, 1 MB o 2 MB
de memoria caché interna del procesador, y 2 MB de memoria caché permiten
conseguir un rendimiento general mucho mejor.
• MSSQLServer
• SQLServerAgent
(MSDTC),
• Microsoft Search.
EL ADMINISTRADOR DE SERVICIOS
El Administrador de servicios es una pequeña aplicación que permanece activa en la Bandeja
de íconos de la barra de Tareas de Windows de la computadora donde está instalado SQL
Server. Haciendo doble clic en este icono aparece la ventana del Administrador de servicios.
En ella es posible seleccionar cualquiera de los servicios de SQLServer para ver su estado o
para iniciarlo, detenerlo o ponerlo en pausa
Mediante el ícono del Administrador de servicios en la barra de Tareas se activa la ventana del mismo. Una vez
abierta, se puede utilizar para ver el estado de los servicios de SQL Server, así como iniciarlos, detenerlos o
ponerlos en pausa.
SERVICIO MSSQLSERVER
Este servicio es el motor de la Base de Datos. Este es el componente que procesa
todas las declaraciones de Transact-SQL y administra todos los archivos que definen
a la Base de Datos dentro del Servidor.
SERVICIO SQLSERVERAGENT
El Agente SQL Server admite funciones que permiten programar trabajos para ejecutarse en
forma periódica en Microsoft SQL Server 2000 o notificar a los administradores de sistemas
acerca de los problemas que han tenido lugar con el servidor. Los componentes del Agente
SQL Server que implementan dichas funciones son:
• Trabajos
Objetos definidos que constan de uno o más pasos para llevarse a cabo. Los pasos
son las instrucciones Transact-SQL que se van a ejecutar. Por ejemplo, se pueden
programar trabajos como crear copias de seguridad para que se ejecuten a horas
específicas o a intervalos regulares.
• Alertas
• Operadores
Pero antes de utilizar este servicio tenemos que instalarlo. El motor de texto se ejecuta como
un servicio denominado Microsoft Search en Windows NT Server, Windows 2000 y Windows
2003 Server y también se puede instalar durante la instalación del SQL Server (No está
disponible para la versión SQL Server Personal)
Para saber si este servicio está instalado en nuestro equipo la manera más sencilla es recurrir
al ‘Administrador de Servicios’ del SQL Server
Entre las diferencias existentes entre este servicio y las búsquedas que utilizan el operador
LIKE podemos citar las siguientes:
La utilización del servicio Microsoft Search tendrá dos vertientes. En primer lugar
tenemos que crear los índices de texto en las tablas deseadas y llenarlos, y en
segundo lugar el servicio realizará las búsquedas y devolverá conjuntos de resultados
adecuados al criterio de búsqueda.
EL ENTERPRISE MANNAGER-ADMINISTRADOR
CORPORATIVO
El ADMINISTRADOR CORPORATIVO es la herramienta más completa para configurar y
administrar la instalación de SQL Server. Mientras el Administrador de servicios permite
solamente iniciar, hacer una pausa o detener un servicio.
• Registrar el servidor.
• Crear alertas y configurar SQL Server para que se comunique con los
administradores de sistema a través de correo electrónico.
2. Pulse clic en el botón Siguiente de la primera pantalla del asistente aparece otra pantalla
en la cual se debe ingresar el nombre del servidor que se desea registrar.
La elección en este caso depende de las políticas de seguridad que se hayan establecido
en la red. Pero generalmente (incluso en el caso de que el servidor corra localmente) se
debe seleccionar la segunda opción, que indica que se utilice Autenticación SQL Server,
o sea, que el nombre de usuario y password que se empleen para conectarse a la base
se validarán contra la lista de usuarios habilitados por SQL Server (la otra opción
determina que se validen contra los usuarios habilitados por Windows NT).
3. Hecho esto, se puede pulsar click en Siguiente y pasar al próximo paso,en el cual se
debe determinar si la conexión se hará automáticamente con un nombre de usuario y
password específicos o si éstos se solicitarán cada vez que se haga la conexión.
En caso de que se elija la primera opción, se puede optar por seleccionar el usuario
SA–por system administrator, se supone–, sin password, que se define por defecto en
las instalaciones nuevas de SQL Server .Lógicamente, si la base de datos requiere un
mínimo de seguridad para evitar el acceso de usuarios no autorizados, la primera
medida a tomar consiste en crear un nuevo usuario con los mismos derechos que SA,
pero con otro nombre y otra password, e inmediatamente eliminar el usuario SA.
4. En el paso siguiente hay que seleccionar un grupo de servidores bajo el cual se colocará
el nuevo registro de servidor. Esta agrupación es útil en empresas que cuentan con gran
cantidad de servidores reunidos por sectores (por ejemplo, Producción, Ventas,
Administración, etc.). Salvo
estos casos, se puede registrar
el nuevo servidor bajo el grupo
que se crea por defecto; si no
aparece ninguno, se puede crear
un grupo dándole el nombre que
uno desee
ACCEDER AL SERVIDOR EN EL
ADMINISTRADOR CORPORATIVO
Una vez que se haya registrado con éxito el servidor utilizando Administrador corporativo, se
puede acceder a todas sus propiedades, bases de datos y objetos. Para ver las propiedades
y objetos del servidor recién registrado, en primer lugar hay que expandir el grupo de
servidores en el panel izquierdo de la ventana de Administrador corporativo. Aparece una
lista de todos los servidores del grupo. A continuación expandir el nombre del servidor para
que se muestren todas sus propiedades y objetos.
Las fichas aparecen reagrupadas en archivos, cada uno de los cuales contiene en general las
fichas de un sólo tipo, las de los proveedores o las de los productos. Este sistema recibe el
nombre de base de datos, que no es ninguna otra cosa más que una colección de
informaciones tales como el catálogo de los ficheros de una biblioteca, un listín telefónico o
una enciclopedia. Los programas de gestión de base de datos (Database) están programados
para realizar operaciones que nos permiten acceder y, eventualmente, modificar los datos
almacenados. Estas operaciones consisten en:Introducción, cancelación, modificación y
búsqueda de informacion a partir de los criterios seleccionados por el usuario de orden,
clasificación e impresión de los listados, por ejemplo, bajo el formato de etiquetas adhesivas
para sobres
MASTER
La base de datos Master registra toda la información de nivel de sistema para el
servidor SQL Server.
Esto incluye:
La base de datos Master es absolutamente crítica para los datos, por le que debería
mantener siempre una copia de seguridad de la misma. La mayor parte de los
procedimientos almacenados del sistema también se guardan en esta base de datos,
junto a los mensajes de error.
MSBD
Su uso principal es el almacenamiento de la información que emplea el agente SQL Server,
como programación de trabajos, definición de operadores y alertas. La información de la
copia de seguridad también se almacena en esta base de datos, y se emplea en la
restauración de la base de datos.
MODEL
Es una base de datos plantilla, que se emplea cada vez que se crea una nueva base de
datos. Los contenidos de la base Model se copian a la nueva base. Si se desea que
determinados objetos, permisos, usuarios se creen automáticamente cada vez que se crea
una base de datos, pueden incluirse en esta base.
TEMP
Algunas veces SQL Server necesita crear tablas temporales internas (o tablas de trabajo)
para determinadas operaciones. Entre dichas operaciones se incluye la ordenación, las
operaciones multitabla, el tratamiento de cursores, etc. Estas tablas temporales se borran tan
pronto como el conjunto de resultados se devuelve a la aplicación cliente, o cuando se cierra
el cursor. Almacena todas las tablas y procedimientos almacenados temporales. Esta base de
crea de nuevo cada vez que se inicia SQL Server, por lo que no tiene sentido crear copias de
seguridad de esta.
Cada base de datos dispone de un conjunto de tablas que la describen. Estas tablas se
denominan Catálogo de la base de datos. La base de datos MASTER tiene un conjunto
adicional de tablas que describen la instalación de SQL Server. Este conjunto se denomina
Catálogo del sistema.
Además de tablas, también hay Vistas del Sistema, y Procedimientos almacenados del
Sistema.
Una Base de Datos se crea sobre un conjunto de archivos de base de datos. La forma
en la que se almacene va a afectar en gran media al rendimiento (velocidad) de
respuesta ante consultas y actualizaciones.
Todas las páginas tienen una disposición similar. Todas tienen una cabecera de página de 96
bytes, y un cuerpo que, en consecuencia, ocupa 8.096 bytes. La información almacenada en
la cabecera y en el cuerpo depende del tipo de página.
El administrador de una base de datos, con sus privilegios, puede examinar el contenido de
una página mediante el comando DBCC PAGE.
Un índice agrupado ordena la tabla de acuerdo a la clave del índice. Los índices no
agrupados (también llamados árboles binarios) apuntan a las filas de datos.
Todas las bases de datos deben crearse con, al menos, un archivos de datos y un archivo
de registro, y los archivos no pueden ser utilizados por más de una base de datos, esto es,
las bases de datos no pueden compartir archivos. La lista siguiente describe los tres tipos
de archivos que puede usar una base de datos:
Una base de datos simple podría tener un archivo de datos principal, que sea
suficientemente grande corno para contener todos los datos y objetos y un archivo de
registro de transacciones. Una base de datos más compleja podría tener un archivo de
datos principal, cinco archivos de datos secundarios y dos archivos de registro de
transacciones. Entonces, ¿cómo podrían estar los datos repartidos entre todos los archivos
de datos? La respuesta es que se pueden utilizar grupos de archivos para ordenar los
datos.
GRUPOS DE ARCHIVOS
Los grupos de archivos permiten agrupar archivos con propósitos administrativos y de
emplazamiento de datos.
Los grupos de archivos pueden mejorar el rendimiento de la base de datos permitiendo
que se cree una base de datos repartida entre múltiples discos o servidores .Se pueden
crear tablas e índices en discos específicos mediante el uso de grupos de archivos,
permitiendo de esta manera dirigir la E/S de una cierta tabla o índice a los discos de uno o
varios servidores.
Hay tres tipos de grupos de archivos. Las características principales de estos grupos de
archivos se resumen en la siguiente lista:
3. Grupo de archivos predeterminado: Guarda todas las páginas para las tablas e
índices que no tienen un grupo de archivos especificado al crearse. El grupo de
archivos predeterminado es, de manera predeterminada, el grupo de archivos
principal.
REGLAS Y RECOMENDACIONES
Se debe tener una estrategia bien desarrollada para el uso de archivos y grupos de archivos
antes de crear la base de datos. Para ello se deben conocer las siguientes reglas de SQL
Server 2000:
1. Los archivos y grupos de archivos no pueden ser usados por más de una base de
datos.
2. Un archivo sólo puede ser miembro de un grupo de archivos.
3. Los datos y la información del registro de transacciones no pueden formar parte del
mismo archivo.El espacio de registro siempre se gestiona de manera separada del
espacio de datos. Los archivos de registro de transacciones no son nunca parte de un
grupo de archivos.
4. Una vez se crea un archivo como parte de una base de datos, no puede moverse a
otro Grupo de archivos. Si se quiere mover un archivo, hay que borrarlo y volverlo a
crear.
Además de estas reglas, hay modos específicos de uso de archivos y grupos de archivos
que ayudan a diseñar la base de datos:
6. Colocar los archivos de registro siempre en discos distintos de los discos que
contengan archivos de datos, tal y como mencionó anteriormente.
8. Crear los archivos y grupos de archivos entre tantos discos físicos como haya
disponibles para permitir una mayor cantidad de E/S de disco paralela y maximizar el
rendimiento.
9. Poner las tablas diferentes que se usen en una misma consulta en discos físicos
diferentes, si es posible, para permitir E/S paralela de disco mientras el motor de
búsqueda encuentra los datos.
• El asistente coloca todos los archivos de datos que crea en una sola unidad de disco
en la carpeta que se le especifique. No se puede poner archivos de datos en
posiciones físicas diferentes (ni en unidades diferentes ni en carpetas diferentes) si se
utiliza el asistente .Debido a estas limitaciones, el Asistente para creación de bases
de datos es la mejor elección si sólo se necesita un archivo de datos principal y un
archivo de registro de transacciones en la base de datos. (Por otra parte, siempre se
pueden añadir archivos y grupos de archivos a la base de datos posteriormente si se
necesitan.)
Se muestra la pantalla Dar nombre a los archivos de base de datos. En esta pantalla
se puede escribir el nombre y tamaño inicial para cada uno de los archivos de base de
datos. El archivo principal de la base de datos se crea automáticamente y se le da el
nombre de la base de datos como prefijo en su nombre. Se puede aceptar este nombre o
escribir uno diferente
7. Pulsar Siguiente para continuar.Aparece la pantalla Dar nombre a los archivos del
registro de transacciones. Esta pantalla parece igual a la pantalla Dar nombre a los
archivos de base de datos, pero esta versión es para el archivo de registro. Ha de
tenerse cuidado de no confundir las pantallas.
Tal y como se hizo en el paso 4 para los archivos de base de datos, escribir el nombre
y tamaño inicial para el registro de transacciones. (Recuérdese que un registro de
transacciones contiene una grabación de todas las modificaciones de la base de datos
para posibilitar la recuperación en caso de un fallo de sistema.)
2. Se abre la ventana
Propiedades de la base de
datos, con la pestaña General en
primer plano, como se ve en la
figura siguiente. Escribir el
nombre de la base de datos en el
cuadro Nombre.
Una vez se hayan definido tantos archivos como se desee, pulsar Aceptar. SQL Server
creará la base de datos. Volver al Administrador corporativo y pulsar la carpeta Bases de
datos del servidor al que se ha añadido la base de datos. En el panel derecho del
Administrador corporativo se verá que SQL Server ha añadido un icono para esa base
de datos.
1. En el Administrador corporativo, expandir (pulsando los signos más) las listas del
grupo SQL Server, el nombre del servidor en que reside la base de datos y la carpeta
Bases de datos.
2. Pulsar el nombre de la base de datos que se desee para mostrar los objetos que
contienen la base de datos.
Para crear una tabla considere la siguiente lista da un esquema de estas decisiones de
diseño:
Para definir una tabla se debe decidir qué columnas definir y qué tipo de datos, como por
ejemplo datos de caracteres o numéricos, se permite que haya en cada columna. También se
debe decidir sobre un rango permisible a esos datos -por ejemplo, podría decidirse permitir
hasta 30 caracteres o números.
3. Escribir el nombre del nuevo tipo de datos en el cuadro de texto Nombre, como se
muestra en la siguiente figura.
Para crear una tabla de base de datos utilizando el Administrador corporativo hay que
seguir estos pasos:
1. En el Administrador corporativo, desplegar un grupo SQL Server y a continuación
expandir un servidor.
2. Desplegar la carpeta Bases de datos para ver las bases de datos disponibles.
3. Expandir la base de datos en que se desee trabajar
4. Pulsar con el botón derecho del ratón la carpeta Tablas y elegir Nueva tabla en el
menú de contexto que aparece. Aparece la ventana Tabla nueva, como se muestra
(maximizada) en la figura siguiente.
5. Definir cada una de las columnas de la tabla de la base de datos -trabajando fila por
fila - escribiendo el nombre en la columna Nombre de columna, eligiendo el tipo de
datos del menú desplegable de la columna Tipo de datos, eligiendo la longitud
cuando sea aplicable (como para tipos de datos de caracteres) y presionando la tecla
Mayúsculas (o la barra espaciadora) o pulsando en la columna Permitir valores
nulos si el dato no es obligatorio.
VALOR PREDETERMINADO
Muestra el valor predeterminado para la columna seleccionada cuando se inserta en la tabla
una fila con un valor nulo para esta columna.
PRECISIÓN
Muestra el número máximo de dígitos para los valores de la columna seleccionada.
ESCALA
Muestra el número máximo de dígitos que pueden aparecer a la derecha de la coma decimal
para los valores de la columna seleccionada.
INICIALIZACIÓN DE IDENTIDAD
Muestra el valor de inicialización de una columna de identidad. Esta opción sólo se aplica a
las columnas cuya opción Identidad se ha establecido como Sí o Sí (no disponible para
duplicación).
INCREMENTO DE IDENTIDAD
Muestra el valor de incremento de una columna de identidad. Esta opción sólo se aplica a las
columnas cuya opción Identidad se ha establecido como Sí o Sí (no disponible para
duplicación).
ES ROWGUID
Muestra si SQL Server utiliza la columna como una columna ROWGUID. Este valor se puede
establecer como Sí sólo para una columna de identidad.
ROWGUIDCOL es una propiedad que puede asignar a una columna con valores
uniqueidentifier, un tipo de datos de SQL Server 2000 que define un entero de 128 bits
garantizado como único. Como tal, el uso de una columna rowguid como clave principal es
una alternativa segura al uso de una columna de identidad para garantizar la exclusividad.
FÓRMULA
Muestra la fórmula para una columna calculada.
INDIZADO
Muestra si existe un índice en la columna. Los valores posibles son:
• No No existe un índice en la columna.
• Sí (con duplicados) Existe un índice no único en la columna.
• Sí (sin duplicados) Existe un índice único en la columna.
6. En la parte inferior de la ventana hay una ficha etiquetada «Columnas». Esta ficha
permite cambiar algunos atributos de la columna seleccionada en la parte superior.
Por ejemplo, se ha seleccionado la columna IdProducto y a continuación se ha
asignado una descripción y un valor predeterminado de 0 para ella en la ficha
Columnas de debajo, como se muestra en la figura anterior.
SQL Server genera automáticamente un valor de fila para esa columna, basándose en un
valor inicial y un valor de incremento.
VALORES PREDETERMINADOS
Utilice un valor prederminado para asignar un valor por defecto a un campo de una tabla por
ejemplo Si tiene un campo llamado sexo su tabla Empleados puede predeteminar su campo
Sexo en el valor “Masculino”.
Microsoft SQL Server 2000 permite definir un valor predeterminado para cada columna de
tabla. No se puede definir un valor predeterminado para las columnas que tengan el tipo de
timestamp o las propiedades IDENTITY o ROWGUIDCOL, ya que dichas columnas deben
tener valores únicos.
1. Seleccione la tabla de su base de datos con clic derecho y luego Abrir tabla y luego
Devolver todas las filas
2. Pulsar Siguiente para visualizar la pantalla Seleccionar tablas para agregar mostrada
en la siguiente figura. Hay que seleccionar las tablas que se desean incluir en el
1. Con el puntero situado sobre el selector de fila, haga clic y arrástrelo hasta la tabla
relacionada.
2. Suelte el botón del mouse. Aparece el cuadro de diálogo Crear relación y se intenta hacer
coincidir las columnas seleccionadas con las columnas de los mismos nombre y tipo de
datos de la tabla relacionada.
Por ejemplo en esta relacion si la propiedad Eliminar en Cascada esta activada hara que si
se elimina una Categoria de la tabla Categorias tambien se eliminen todos los productos en
la tabla Productos que pertenezcan a dicha categoria
USO DE ÍNDICES
¿QUÉ ES UN ÍNDICE?
Los índices son una de las herramientas disponibles más potentes para el diseñador de
bases de datos. Cuando se utiliza un índice de una tabla de la base de datos para buscar una
fila de datos, SQL Server puede determinar rápidamente dónde se almacenan los datos y
recuperarlos inmediatamente. Así, los índices de tabla de la base de datos son muy parecidos
a los índices de los libros (ambos proporcionan un acceso rápido a grandes cantidades de
información).
CLAVES DE LOS ÍNDICES
Una clave de índice designa la columna o columnas que se utilizan para generar el índice. La
clave del índice es el valor que permite buscar rápidamente la fila que contiene los datos que
se están buscando, de igual forma a como una entrada del índice en un libro apunta a un
tema concreto del texto.
ÍNDICES SIMPLES
Un índice simple es un índice que se define en una sola columna de la tabla. Un índice simple
puede ser efectivo dependiendo del tipo de datos que se están ordenando, del número de
elementos únicos de la columna .En otros casos se necesita un índice compuesto.
• Por ejemplo, si se está indexando una libreta de direcciones con miles de nombres y
direcciones, la columna Distrito no es una buena candidata para un índice simple ya
que podría haber muchas entradas del mismo Distrito.Sin embargo, al añadir las
columnas Dirección y Distrito al índice, por tanto creando un índice compuesto, se
puede hacer que cada entrada sea casi única. Este paso puede ser útil si se usan
consultas que buscan filas a través de la dirección.
ÍNDICES COMPUESTOS
Un índice compuesto es un índice que se define en más de una columna. Se puede acceder a
un índice compuesto usando una o más claves de índice. Con SQL Server 2000, un índice
puede abarcar hasta 16 columnas y sus columnas clave pueden ser de hasta 900 bytes
ÍNDICES ÚNICOS
Un índice único contiene solamente una fila de datos por cada clave del índice (en otras
palabras, los valores de la clave del índice no pueden aparecer en el índice más de una vez)
SQL Server obliga a que se cumpla la propiedad de unicidad (UNIQUE) de un índice de una
columna o combinación de columnas que constituyen la clave del índice. SQL no permite que
se inserte en la base de datos un valor de clave duplicado. Si se intenta hacer, se produce un
error. SQL Server crea índices únicos cuando se crea o una restricción PRIMARY KEY (clave
Primaria) o una restricción UNIQUE en la tabla. Por ejemplo el campo NumeroRuc podria ser
un indice UNICO ya que el numero de RUC es unico para cada cliente
ÍNDICES NO ÚNICOS
Un índice no único trabaja de la misma forma que un índice único, salvo que puede contener
valores duplicados en los valores que los conforman. Todos los valores duplicados se
recuperan si cumplen los criterios especificados en la instrucción de consulta Por ejemplo el
campo Apellidos en una tabla Clientes podria ser un INDICE NOUNICO ya que muchos
clientes podrian tener el mismo apellido y hasta el mismo Nombre
Un índice no único no es tan eficiente como un índice único debido a que necesita
procesamiento adicional (operaciones adicionales de entrada/salida) para recuperar los datos
requeridos. Pero debido a que algunas aplicaciones necesitan utilizar claves duplicadas,
algunas veces es imposible crear un índice único. En estos casos, un índice no único
frecuentemente es mejor que no tener ningún índice.
TIPOS DE ÍNDICES
Hay dos tipos de índices índices agrupados e índices no agrupados.
ÍNDICES AGRUPADOS
Como se ha mencionado, un índice agrupado es un índice que almacena los datos de la fila
actual de la tabla en sus nodos hoja, de forma ordenada, como se muestra en la figura
siguiente.
Orden Fisico
• Otra ventaja de los índices agrupados es que los datos recuperados están ordenados
según el orden del índice. Por ejemplo, si se crea un índice agrupado a partir de las
columnas Direccion, Distrito y Pais y una consulta que selecciona todos los valores
para los que Distrito es “San isidro”, la salida resultante está ordenada según Pais y
Distrito en el orden en que se haya definido en el índice
• Una desventaja del uso de un índice agrupado es que el acceso a la tabla siempre es
a través del índice, lo que puede provocar una sobrecarga adicional.
• Debido a que los datos reales se almacenan en el índice agrupado, no se puede crear
más de un índice agrupado en una tabla
INDICES NO AGRUPADOS
A diferencia de los índices agrupados, los índices no agrupados no contienen los datos
reales de la tabla en sus datos. Los indices pueden contener uno o dos tipos de
información de ubicación de filas de datos
Orden Logico
CREACIÓN DE ÍNDICES
La creación de índices no es difícil. Se pueden crear índices agrupados o no agrupados casi
del mismo modo usando los asistentes que suministra el Administrador corporativo
1. Abra el Diseñador de tablas para la tabla que desee indizar, haga clic con el botón
secundario del mouse en el Diseñador de tablas y elija Índices y claves en el menú
contextual.
2. Elija Nuevo. El cuadro Índice seleccionado muestra el nombre asignado por el sistema
al índice nuevo.
3. En el tercer paso se nos solicita el destino de los datos. Dado que la opción por
defecto –Microsoft OLE DB Provider for SQL Server– es la que usaremos, vamos a
ingresar directamente la información solicitada en la parte inferior de la ventana; los
consabidos nombre de servidor y datos de autenticación. La diferencia con las
ocasiones anteriores en
las que establecimos
una conexión con el
servidor consiste en
que esta vez le
pediremos que nos
conecte con una base
nueva, no con una
preexistente. Para
hacer esto, en la lista
desplegable titulada
Base de datos
seleccionamos la
opción <nuevo>
Si bien estos tamaños son flexibles (es decir, SQL Server expandirá los archivos a
medida que le vayan quedando chicos), es bueno hacer una estimación del tamaño
requerido en función de la suma de los tamaños de cada tabla, calculando el tamaño
de registro y multiplicándolo por el número de registros en la tabla. A eso hay que
agregarle un espacio prudencial para almacenar índices.
Para el ejemplo que nos ocupa, ingrese NeptunoBD como nombre para la nueva base, y
asígnele un espacio de 5 MB para el archivo
de datos y 1 MB para el archivo de registro.
Es habitual asignar al archivo de registro
(que contiene las transacciones en curso
hasta el momento en que se les hace un
commit) un 20 por ciento del tamaño
establecido para los datos.
El paso siguiente consiste, simplemente, en
decidir si se van a copiar las tablas íntegras
de la base de datos de origen o si se
utilizarán instrucciones SQL para definir los
conjuntos de datos a migrar .En el primer
caso, seleccione Copiar las tablas de la
base de datos de origen.
• En la primera, el Asistente coloca nombres de tabla que coinciden con los de la base
de origen. También muestra un ícono para cada tabla, que, si tiene una estrella en la
esquina superior izquierda, indica que la tabla se creará durante la migración
• En la columna Transformar aparecen botones con puntos suspensivos para cada tabla
seleccionada. Si presiona cualquiera de ellos, tendrá la oportunidad de modificar la
forma en que el asistente migrará los datos de la tabla correspondiente. Por ejemplo,
puede deseleccionar ciertas columnas de ciertas tablas para que no se incluyan en la
migración, o hacer que se aplique una conversión a un tipo de datos diferente para
alguna columna. Pero en este ejemplo dejaremos las opciones de transformación tal
como las infiere el Asistente.
• Es posible volver a crear toda la base de datos a partir de una copia de seguridad de
base de datos en un solo paso; para ello, restaure la base de datos. El proceso de
restauración sobrescribe la base de datos existente o crea la base de datos si no
existe. El estado de la base de datos restaurada será el mismo que el de la base de
datos en el momento en que terminó la copia de seguridad,
2. Expanda Bases de datos, haga clic con el botón secundario del mouse en la base de
datos, seleccione Todas las tareas y, a continuación, haga clic en Copia de seguridad
de la base de datos.
2. Expanda Bases de datos, haga clic con el botón secundario del mouse en la base de
datos, seleccione Todas las tareas y, a continuación, haga clic en Restaurar base de
datos.
6. En la lista Restaurar, haga clic en la copia de seguridad de base de datos que desea
restaurar
2. SQL Server puede tener hasta dos mil millones de tablas por cada base de datos
4. El número de filas y el tamaño total de la tabla está limitado solamente por el espacio
de almacenamiento disponible.
5. El número máximo de bytes por fila es de 8.060. Si se crean tablas con columnas
varchar, nvarchar o varbinary en las que el ancho total definido excede de 8.060
bytes, se crea la tabla, pero aparece un mensaje de advertencia. Al intentar insertar
más de 8.060 bytes en tal fila o actualizar una fila de tal forma que su tamaño total de
fila exceda de 8.060, se genera un mensaje de error y no se puede realizar la
instrucción
El lenguaje SQL contiene instrucciones que se ajustan las dos principales categorías de
programación: DDL y DML. Se verán estas categorías de lenguaje en las siguientes
secciones.
DDL
DDL se utiliza para definir y administrar objetos bases de datos tales como bases de datos,
tablas y vistas. Las instrucciones DDL usualmente incluyen instrucciones CREATE, ALTER
y DROP para cada objeto. Por ejemplo, las instrucciones CREATE TABLE, ALTER TABLE
y DROP TABLE se utilizan para crear una tabla, modificar sus propiedades (agregar o
borrar columnas, por ejemplo) y eliminar una tabla, respectivamente.
DML
DML se utiliza para manipular los datos contenidos en los objetos base de datos. Para ello
se utilizan instrucciones tales como INSERT, SELECT, UPDATE y DELETE. Estas
instrucciones permiten seleccionar filas de datos mediante la realización de consultas,
insertar nuevas filas de datos, modificar las filas de datos existentes y borrar filas de datos
no deseadas, respectivamente.
DELETE PRODUCTOS WHERE NOMBREPRODUCTO LIKE “A%”
T-SQL
SQL es una mejora del lenguaje de programación SQL estándar. Es el lenguaje principal
utilizado para comunicaciones entre aplicaciones y SQL Server. T-SQL proporciona las
posibilidades DDL y DML de SQL estándar además de funciones extendidas,
procedimientos almacenados del sistema y con construcciones de programación (tales
como IF y WHILE) con el fin de permitir mayor flexibilidad en la programación. Las
capacidades de T-SQL continúan creciendo con las versiones nuevas de SQL Server
CREATE PROCEDURE LISTAR PRODUCTOS @ORDEN
AS
IF @ORDEN=’ASC’
BEGIN
SELECT * FROM PRODUCTOS ORDER BY NOMBREPRODUCTO
END
Para ejecutar el Analizador de consultas SQL hay que seguir los siguientes pasos:
1. En el Menu Inicio elija Programas y luego Elija Microsoft SQL SERVER y Analizador
de Consultas
EL proceso es muy sencillo, como ejemplo creamos una base de datos llamada Ventas con
un tamaño de 10 MB y limitada a 50 MB y un incremento de 5 MB. El registro de
transacciones lo creamos con un tamaño de 5MB y limitado a 25 y un incremento de la base
de datos de 5 MB
NAME = Nombre_del_archivo_lógico,
FILENAME = Nombre_del_archivo_en_el_sistema (path completo)
SIZE = TAMAÑO (inicial)
MAXSIZE = (tamaño_máximo | UNLIMITED)
(Tamaño máximo que puede tener la base de datos, UNLIMITED = tamaño
ilimitado)
FILEGROWTH = Incremento del archivo (crecimiento en MB)
USE master
GO
USE MASTER
GO
SP_ATTACH_DB 'PRUEBAS','D:\PRUEBAS.MDF','D:\PRUEBAS.LDF'
GO
SP_HELPDB 'PRUEBAS'
• Ahora hay que repetir este procedimiento para todas las bases de datos de usuario
que tengamos
MOVER MASTER
10. También podemos cambiar de la misma manera la ubicación de los registros de error
11. Detenemos el SQL Server
12. Copiamos "master.mdf" y "masterlog.ldf" a la nueva localización
13. Reiniciamos el SQL Server
Con esto debería estar todo listo y nuestro servidor debería funcionar perfectamente pero
ahora con todos los ficheros de bases de datos en "D:\" como queríamos.
Sólo recordar una cosa más. Estos cambios son una operación de alto riesgo y tener copias
de seguridad de TODO antes de empezar es imprescindible.
CREACIÓN DE TABLAS
Para crear una tabla en su base de datos utilice el comando CREATE TABLE
(Crea una nueva tabla llamada Empleados con dos campos, uno llamado Nombre de tipo
VarChar y longitud 25 y otro llamado apellidos con longitud 50).
CREATE TABLE
Empleados (
Nombre VARCHAR (10),
Apellidos VARCHAR,
FechaNacimiento DATETIME
)
CONSTRAINT
Índicegeneral
UNIQUE (
Nombre, Apellidos, FechaNacimiento)
Resultado:
Tabla Empleados
Nombre Apellidos FechaNacimiento
(Crea una nueva tabla llamada Empleados con un campo Nombre de tipo texto (Varchar) y
longitud 10, otro con llamado Apellidos de tipo texto (Varchar) y longitud predeterminada (50)
y uno más llamado FechaNacimiento de tipo Fecha/Hora.(Datetime) También crea un índice
único - no permite valores repetidos - formado por los tres campos.)
• Se puede generar un campo que sera el producto de una operación entre otros campos
Por ejemplo PROMEDIO es el producto del calculo de la suma de N1+N2+N3
Este ejemplo crea una tabla MATRICULAS y lo añade al grupo existente GP_MATRICULAS
------------------------------------------------------------------------------------------------------------------
CREATE TABLE PRODUCTOS
(IDPRODUCTO INT IDENTITY NOT NULL PRIMARY KEY,NOMBREPRODUCTO
VARCHAR(50),
IDPROVEEDOR INT REFERENCES PROVEEDORES(IDPROVEEDOR)
ON UPDATE CASCADE
ON DELETE CASCADE,
IDCATEGORIA INT REFERENCES CATEGORIAS(IDCATEGORÍA)
ON UPDATE CASCADE
ON DELETE CASCADE,
CANTIDADPORUNIDAD INT,PRECIOUNIDAD MONEY,UNIDADESENEXISTENCIA
INT,
UNIDADESENPEDIDO INT,NIVELNUEVOPEDIDO TINYNT,SUSPENDIDO BIT)
-------------------------------------------------------------------------------------------------------------------------
2. En este segundo ejemplo se crea una tabla PEDIDOS la cual se relaciona con las tablas
CLIENTES y EMPLEADOS que ya existen
EJEMPLO :
SP_HELP CURSOS
Ejemplos
-- Inserciones validas
INSERT INTO empleado VALUES (1,"Joe Brown",65000)
INSERT INTO empleado VALUES (2,"Mary Smith",75000)
-- Deshabilitar la restricción
ALTER TABLE empleado NOCHECK CONSTRAINT salario
INSERT INTO empleado VALUES (3,"Pat Jones",105000)
-- Habilitar la restricción
ALTER TABLE empleado CHECK CONSTRAINT salario
INSERT INTO empleado VALUES (4,"Eric James",110000)
Esta sentencia permite añadir una clave primaria en tabla, por los campos cod1 y cod2.
Para crear un índice en la tabla todos, denominado Código, por el campo cod_cliente, se
debe especificar el Código fuente
Sí además queremos que el índice no admita valores nulos, se debe ejecutar el Código fuente
Si desea hacer una selección de los registros de la tabla Empleados utilizando uno de sus
indices creados en el ejemplo anterior haga lo siguiente:
El numero 2 hace referencia al indice por el campo NOMBRE y el numero 3 por el campo
APELLIDOS .El numero 1 esta reservado para el IDPRODUCTO que es la clave primaria
Para obtener informacion acerca de los indices que tiene su tabla ejecute el procedimiento
almacenado SP_HELPINDEX Ejemplo:
LA SENTENCIA INSERT
La otra gran sentencia de manipulación de datos es INSERT. Si SELECT nos permitía
recuperar datos, INSERT nos va a permitir añadirlos al esquema, es decir, con esta sentencia
podemos añadir información a la base de datos. Recordemos que estamos en el modelo
relacional, por lo que la información se añadirá a una tabla en forma de filas. Si sólo
queremos insertar un valor para un atributo, el resto de los de la tabla deberá contener el
valor nulo (NULL). Sin embargo, habrá ciertas ocasiones en que esto no será posible, cuando
el atributo esté definido como NO NULO, en cuyo caso deberemos especificar un valor para
éste. La sintaxis de esta sentencia es:
Donde tabla especifica la tabla en la cual se añadirá la fila, atributos es una lista de atributos
separados por comas que determinan los atributos para los cuales se darán valores, y valores
específicos los valores que se darán para estos atributos, separados por comas.
Por ejemplo, si queremos añadir un nuevo cliente a nuestra base de datos, deberemos
ejecutar el Código
.
INSERT INTO clientes (idcliente,nombre,apellidos)
VALUES ('409-99-9876', 'Pepe', 'Perez')
La razón es que no hemos dado valor al atributo idcontacto, que ha sido definido como no
nulo. Por lo tanto, rectificamos el Código fuente, para dar un valor al Código fuente 56.
LA SENTENCIA UPDATE
UPDATE tabla
SET atributo1 = valor1 , atributo2 = valor2, ...
WHERE condición donde tabla especifica la tabla donde se encuentran las filas que
queremos actualizar, condición especifica la condición que se debe cumplir para actualizar las
filas, y lo que viene a continuación de
SET especifica la asignación de los nuevos valores a los atributos. Por lo tanto se
actualizarán todas las filas que cumplan la condición especificada. Si queremos cambiar el
nombre al cliente que hemos insertado en el anterior apartado, deberemos escribir el Código
fuente :
Elevar los precios de los productos en 10% pero solo aquellos que pertenezcan a la Categoria
2 (Bebidas)
UPDATE PRODUCTOS
SET PRECIOUNIDAD = PRECIOUNIDAD+(PRECIOUNIDAD*010)
WHERE IDCATEGORIA=2
Lo que quiere decir que la fila ha sido actualizada con éxito. Podemos comprobarlo
ejecutando el Código fuente
SELECT *
FROM Productos
WHERE idcategoria = 2
LA SENTENCIA DELETE
El objeto de la sentencia DELETE es el de borrar filas de una tabla. Para poder borrar filas en
una tabla se deben cumplir las condiciones de seguridad determinadas por el administrador y
deben de cumplirse también las reglas de integridad referencial. La sintaxis es la siguiente:
Donde tabla especifica la tabla sobre la cual queremos borrar las filas, y condición especifica
la condición que se debe cumplir para que se borren las filas. Si omitimos la condición, se
borrarán todas las filas de la tabla, es decir, la sentencia que aparece en el Código fuente
borra todas las filas de la tabla Pedidos
Por ejemplo, si queremos borrar una fila que hemos creado en la tabla Pedidos, deberemos
ejecutar el Código fuente obteniendo el siguiente resultado:
lo que viene a decir que la fila se ha borrado. Para comprobarlo, ejecutamos la sentencia que
muestra el Código fuente. cuyo resultado es: (0 row(s) affected), lo que quiere decir que la fila
no se encuentra en la tabla, es decir, ha sido borrada.
EMPLEADOS
CATEGORIAS
CLIENTES
PROVEEDORES
PEDIDOS
DETALLES DE PEDIDOS
Su sintaxis es la siguiente:
• SELECT <atributos>: permite hacer una proyección de las tablas, es decir, seleccionar
los campos que deseamos recuperar de la base de datos, separados por comas. Si se
especifica el símbolo *, se obtendrán todos los campos de la tabla.
• FROM <tablas>: permite especificar la tabla de la cual se desean obtener los datos. Si
se especifica más de una tabla, éstas irán separadas por comas.
• HAVING <condición>: establece una condición para los atributos obtenidos como
resultado de la aplicación de funciones escalares.
SELECT IDPEDIDO,IDCLIENTE,FECHAPEDIDO,FECHAENTREGA,CARGO
FROM PEDIDOS WHERE FECHAPEDIDO BETWEEN ‘18/06/95’ AND ‘25/12/97’
8. Mostrar los productos cuyo nombre empiezen con las letras “Que”
15. Mostrar los productos que tengan un precio menor o igual a 50 y su stock se
encuentre entre 60 y 80
16. Mostrar los clientes cuyo pais sea igual alemania o francia
18. Mostrar los pedidos del cliente cuyo codigo es ‘Anton’ o ‘bonap’ y la fecha de los
pedidos sea mayor a 11/5/95
LA UNIÓN DE TABLAS
Esta operación se utiliza cuando tenemos dos tablas con las mismas columnas y queremos
obtener una nueva tabla con las filas de la primera y las filas de la segunda. En este caso la
tabla resultante tiene las mismas columnas que la primera tabla (que son las mismas que
las de la segunda tabla).
Por ejemplo tenemos una tabla de libros nuevos y una tabla de libros antiguos y queremos
una lista con todos los libros que tenemos. En este caso las dos tablas tienen las mismas
columnas, lo único que varía son las filas, además queremos obtener una lista de libros (las
columnas de una de las tablas) con las filas que están tanto en libros nuevos como las que
están en libros antiguos, en este caso utilizaremos este tipo de operación.
Cuando hablamos de tablas pueden ser tablas reales almacenadas en la base de datos o
tablas lógicas (resultados de una consulta), esto nos permite utilizar la operación con más
frecuencia ya que pocas veces tenemos en una base de datos tablas idénticas en cuanto a
columnas. El resultado es siempre una tabla lógica.
Por ejemplo queremos en un sólo listado los productos cuyas existencias sean iguales a
cero y también los productos que aparecen en pedidos del año 90. En este caso tenemos
unos productos en la tabla de productos y los otros en la tabla de pedidos, las tablas no
tienen las mismas columnas no se puede hacer una union de ellas pero lo que interesa
realmente es el identificador del producto (idfab,idproducto), luego por una parte sacamos
los códigos de los productos con existencias cero (con una consulta), por otra parte los
códigos de los productos que aparecen en pedidos del año 90 (con otra consulta), y luego
unimos estas dos tablas lógicas.
El operador que permite realizar esta operación es el operador UNION.
A diferencia de la unión la composición permite obtener una fila con datos de las dos tablas,
esto es muy útil cuando queremos visualizar filas cuyos datos se encuentran en dos tablas.
Por ejemplo queremos listar los pedidos con el nombre del representante que ha hecho el
pedido, pues los datos del pedido los tenemos en la tabla de pedidos pero el nombre del
representante está en la tabla de empleados y además queremos que aparezcan en la
misma línea; en este caso necesitamos componer las dos tablas (Nota: en el ejemplo
expuesto a continuación, hemos seleccionado las filas que nos interesan).
SELECT *
FROM PEDIDOS,CLIENTES
WHERE PEDIDOS.IDCLIENTE=CLIENTES.IDCLIENTE
EL INNER JOIN
El INNER JOIN es otro tipo de composición de tablas, permite emparejar filas de distintas
tablas de forma más eficiente que con el producto cartesiano cuando una de las columnas
de emparejamiento está indexada. Ya que en vez de hacer el producto cartesiano completo
y luego seleccionar la filas que cumplen la condición de emparejamiento, para cada fila de
una de las tablas busca directamente en la otra tabla las filas que cumplen la condición, con
lo cual se emparejan sólo las filas que luego aparecen en el resultado.
La sintaxis es la siguiente:
Ejem:
SELECT *
FROM PEDIDOS
INNER JOIN CLIENTES ON PEDIDOS.IDCLIENTE = CLIENTES.IDCLIENTE
tabla1 y tabla2 son especificaciones de tabla (nombre de tabla con alias o no, nombre de
consulta guardada), de las tablas cuyos registros se van a combinar.
Pueden ser las dos la misma tabla, en este caso es obligatorio definir al menos un alias de
tabla.
col1, col2 son las columnas de emparejamiento.
Observar que dentro de la cláusula ON los nombres de columna deben ser nombres
cualificados (llevan delante el nombre de la tabla y un punto).
Las columnas de emparejamiento deben contener la misma clase de datos, las dos de tipo
texto, de tipo fecha etc... los campos numéricos deben ser de tipos similares. Por ejemplo,
se puede combinar campos AutoNumérico(IDENTIDAD) y INT puesto que son tipos
similares, sin embargo, no se puede combinar campos de tipo INT y FLOAT. Además las
columnas no pueden ser de tipo TEXT ni IMAGE
COMP representa cualquier operador de comparación ( =, <, >, <=, >=, o <> ) y se utiliza
para establecer la condición de emparejamiento.
Se pueden definir varias condiciones de emparejamiento unidas por los operadores AND y
OR poniendo cada condición entre paréntesis. Ejemplo:
SELECT *
FROM PROVEEDORES INNER JOIN PRODUCTOS ON PRODUCTOS
PROVEEDORES.IDPROVEEDOR AND PROVEEDORES.IDPROVEEDOR =
PRODUCTOS.IDPROVEEDOR
Por ejemplo:
SELECT *
FROM (PEDIDOS INNER JOIN CLIENTES ON PEDIDOS.IDCLIENTE =
CLIENTES.IDCLIENTE) INNER JOIN EMPLEADOS ON PEDIDOS.IDEMPLEADO =
EMPLEADOS.IDEMPLEADO
En vez de tabla1 hemos escrito un INNER JOIN completo, también podemos escribir:
SELECT *
FROM CLIENTES INNER JOIN (PEDIDOS INNER JOIN EMPLEADOS ON
PEDIDOS.IDEMPLEADO = EMPLEADOS.IDEMPLEADO) ON PEDIDOS.IDCLIENTE =
CLIENTES.IDCLIENTE
Empleados
Oficinas
Clientes Productos
Clientes
Observar que hemos cualificado el nombre de columna oficina ya que ese nombre aparece
en las dos tablas de la FROM.
Con esta sentencia los empleados que no tienen una oficina asignada (un valor nulo en el
campo oficina de la tabla empleados) no aparecen en el resultado ya que la condición
empleados.oficina = oficinas.oficina será siempre nula para esos empleados.
La descripción de la sintaxis es la misma que la del INNER JOIN (ver página anterior), lo
único que cambia es la palabra INNER por LEFT (izquierda en inglés).
Esta operación consiste en añadir al resultado del INNER JOIN las filas de la tabla de la
izquierda que no tienen correspondencia en la otra tabla, y rellenar en esas filas los campos
de la tabla de la derecha con valores nulos.
Ejemplo:
SELECT *
FROM EMPLEADOS LEFT JOIN OFICINAS ON EMPLEADOS.OFICINA =
OFICINAS.OFICINA
Con el ejemplo anterior obtenemos una lista de los empleados con los datos de su oficina, y
el empleado 110 que no tiene oficina aparece con sus datos normales y los datos de su
oficina a nulos.
La sintaxis del RIGHT JOIN es la siguiente:
Esta operación consiste en añadir al resultado del INNER JOIN las filas de la tabla de la
derecha que no tienen correspondencia en la otra tabla, y rellenar en esas filas los campos
de la tabla de la izquierda con valores nulos.
Ejemplo:
SELECT *
FROM empleados RIGHT JOIN oficinas ON empleados.oficina = oficinas.oficina
Con el ejemplo anterior obtenemos una lista de los empleados con los datos de su oficina, y
además aparece una fila por cada oficina que no está asignada a ningún empleado con los
datos del empleado a nulos.
Una operación LEFT JOIN o RIGHT JOIN se puede anidar dentro de una operación INNER
JOIN, pero una operación INNER JOIN no se puede anidar dentro de LEFT JOIN o RIGHT
JOIN. Los anidamientos de JOIN de distinta naturaleza no funcionan siempre, a veces
depende del orden en que colocamos las tablas, en estos casos lo mejor es probar y si no
permite el anudamiento, cambiar el orden de las tablas ( y por tanto de los JOINs) dentro de
la cláusula FROM.
Por ejemplo podemos tener:
SELECT *
FROM CLIENTES INNER JOIN (EMPLEADOS LEFT JOIN OFICINAS ON
EMPLEADOS.OFICINA = OFICINAS.OFICINA) ON CLIENTES.REPCLIE =
EMPLEADOS.NUMCLIE
Combinamos empleados con oficinas para obtener los datos de la oficina de cada
empleado, y luego añadimos los clientes de cada representante, así obtenemos los clientes
que tienen un representante asignado y los datos de la oficina del representante asignado.
Si hubiéramos puesto INNER en vez de LEFT no saldrían los clientes que tienen el
empleado 110 (porque no tiene oficina y por tanto no aparece en el resultado del LEFT JOIN
y por tanto no entrará en el cálculo del INNER JOIN con clientes).
CON WHERE
SELECT
PRODUCTOS.NOMBREPRODUCTO,PRODUCTOS.PRECIOUNIDAD,CATEGORIAS
.NOMBRECATEGORIA,PROVEEDORES.NOMBRECOMPAÑIA,STOCK FROM
PRODUCTOS,CATEGORÍAS,PROVEEDORES
WHERE PRODUCTOS.IDCATEGORIA=CATEGORIAS.IDCATEGORIA AND
PRODUCTOS.IDPROVEEDOR=PROVEEDORES.IDPROVEEDOR
SELECT
PEDIDOS.IDPEDIDO,PEDIDOS.FECHAPEDIDO,CLIENTES.NOMBRECOMPAÑIA,E
MPLEADOS.APELLIDOS+ ‘ ‘ + EMPLEADOS.NOMBRE,PEDIDOS.CARGO
FROM PEDIDOS
INNER JOIN CLIENTES ON PEDIDOS.IDCLIENTE=CLIENTES.IDCLIENTE
INNER JOIN EMPLEADOS ON
PEDIDOS.IDEMPLEADO=EMPLEADOS.IDEMPLEADO
DATEADD
Devuelve un valor datetime nuevo que se basa en la suma de un intervalo a la fecha
especificada.
Sintaxis
DATEADD ( partedeFecha , numero, Fecha )
DATEDIFF
Devuelve el número de dias,meses o años que han transcurrido entre dos fechas
especificadas.
Sintaxis
DATEDIFF ( parteFecha , Fechainicial , fechafinal )
SELECT NOMBRE,APELLIDOS,
DATEDIFF(YEAR,FECHANACIMIENTO,GETDATE()) AS EDAD FROM
EMPLEADOS
DATENAME
Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la
fecha especificada.
Sintaxis
DATENAME (parteFecha , fecha )
En este ejemplo se extrae el nombre del mes de la fecha devuelta por GETDATE.
SELECT
IDPEDIDO,FECHAPEDIDO,FECHAENVIO,FECHAENTREGA,DATENAME(MONTH,
FECHAPEDIDO) AS MESPEDIDO FROM PEDIDOS
DATEPART
Devuelve un entero que representa la parte de la fecha especificada de la fecha indicada.
Sintaxis
DATEPART ( parteFecha , fecha )
La función GETDATE devuelve la fecha actual; sin embargo, la fecha completa no es siempre
la información que se necesita para la comparación (a menudo, sólo se compara una parte de
la fecha). En este ejemplo se muestra la salida de GETDATE y la de DATEPART.
Sintaxis
DAY ( fecha )
MONTH
Devuelve un entero que representa el mes de una fecha especificada.
Sintaxis
MONTH ( Fecha )
NumeroMes
------------
3
YEAR
Devuelve un entero que representa la parte de año de la fecha especificada.
Sintaxis
YEAR ( Fecha )
NumeroAño
------------
1998
ROUND
Devuelve una expresión numérica, redondeada a la longitud o precisión especificada.
Sintaxis
ROUND ( numero , longitud )
Ejemplos Resultado
ROUND(748.58, -1) 750.00
ROUND(748.58, -2) 700.00
ROUND(748.58, -3) 1000.00
ROUND(123.4545, 2) 123.4500
ROUND(123.45, -2) 100.00
CEILING
Devuelve un numero entero más pequeño mayor o igual que la expresión numérica dada.
Sintaxis
CEILING ( expressionNumerica )
Este ejemplo muestra valores numéricos positivos, negativos y cero con la función CEILING.
FLOOR
Devuelve el numero entero más grande menor o igual que la expresión numérica dada.
Sintaxis
FLOOR ( expresionNumerica )
Este ejemplo muestra valores numéricos positivos, negativos y valores de moneda con la
función FLOOR.
Resultado es igual a 8
SQRT
Devuelve la raíz cuadrada de la expresión especificada.
Sintaxis
SQRT ( expressionNumerica )
SELECT SQRT(@myvalue)
Devuelve 4
UPPER
Convierte de minúsculas a mayúsculas
Sintaxis
UPPER (expressionTexto)
Ejemplos
LOWER
Convierte de mayúsculas a minusculas
Sintaxis
LOWER ( expressionTexto )
Muestra los nombres de los clientes en minusculas
SELECT LOWER(NOMBRECOMPAÑIA) FROM CLIENTES
Sintaxis
LEFT ( expressionTexto,numeroCaracteres )
RIGHT
Extrae caracteres empezando por el lado derecho de la cadena de caracteres
Sintaxis
RIGHT ( expressionTexto , numeroCaracteres)
LEN
Devuelve el número de caracteres de la expresión de cadena dada, excluidos los espacios
finales en blanco.
Sintaxis
LEN ( expressionTexto )
Ejemplo :
SELECT NOMBREPRODUCTO,LEN(NOMBREPRODUCTO) AS
TOTALCARACTERES FROM PRODUCTOS
Sintaxis
SUBSTRING ( expressionTexto , Posicion inicial , numeroCaracteres)
REPLACE
Reemplaza por una tercera expresión todas las apariciones de la segunda expresión de
cadena proporcionada en la primera expresión de cadena.
Sintaxis
REPLACE ( 'expressionTexto1' , 'expressionTexto2' , ‘expressionTexto3' )
SELECT REPLACE('abcdefghicde','cde','xxx')
PATINDEX
Devuelve la posición inicial de la primera aparición de un patrón en la expresión especificada
o ceros si el patrón no se encuentra, con todos los tipos de datos de texto y caracteres.
Sintaxis
PATINDEX ( '%pattern%' , expression )
En este ejemplo se busca la posición en que comienza el patrón "secas" en una fila
específica de la columna NombreProducto de la tabla Productos
-----------
7
STUFF
Elimina el número de caracteres especificado e inserta otro conjunto de caracteres en un
punto de inicio indicado.
Sintaxis
STUFF (expressionTexto , PosInicial , longitud , expressiontexto )
STR
Devuelve datos de tipo carácter obtenidos a partir de datos numéricos.
Sintaxis
STR ( expressionNumerica )
SELECT STR(123.45, 6, 1)
SPACE
Devuelve una cadena de espacios repetidos.
Sintaxis
SPACE ( expressionNumero )
CHAR
Una función de cadena que convierte un código ASCII int en un carácter.
Sintaxis
CHAR ( expresionNumerica )
ASCII
Devuelve el código ASCII del carácter más a la izquierda de una expresión de caracteres.
Sintaxis
ASCII ( expressionTexto )
SELECT ASCII(‘A’)
Devuelve 65
REPLICATE
Repite una expresión de caracteres un número especificado de veces.
Sintaxis
REPLICATE ( expressionTexto , numeroVeces )
En este ejemplo se duplica el nombre de cada Empleado dos veces.
SELECT REPLICATE(Nombre, 2)
FROM Empleados
ORDER BY nombre
---------------------------
The precio es 19.99
The precio es 11.95
Este ejemplo convierte una columna de tipo int (la columna idPedido) en una columna de tipo
char(20) para poder utilizarla en una cláusula LIKE.
Mostrar los pedidos cuyo el mes de la fechaPedido sea igual Agosto y el numero de pedido
empieze en los numeros 12
SELECT IDPEDIDO,FECHAPEDIDO
FROM PEDIDOS
WHERE CAST(IDPEDIDO AS CHAR(20)) LIKE '12%'
AND MONTH(FECHAPEDIDO) = 8
GO
Si desea obtener solo la fecha en formato Dia Mes Año sin incluir la hora actual haga lo
siguiente
SELECT CONVERT(VARCHAR(8),GETDATE(),3)
SELECT CONVERT(VARCHAR(10),GETDATE(),103)
SET DATEFIRST
Establece como primer día de la semana un número del 1 al 7.
Sintaxis
SET DATEFIRST { number | @number_var }
Es un entero que indica el primer día de la semana y puede tener uno de los valores
siguientes.
Valor Primer día de la
semana:
1 Lunes
2 Martes
3 Miércoles
4 Jueves
5 Viernes
6 Sábado
7 (predeterminado, Domingo
Inglés EE.UU.)
Puede utilizar la función @@DATEFIRST para conocer el valor actual de SET DATEFIRST.
SELECT @@DATEFIRST
SET DATEFIRST 7
GO
SELECT CAST('1/1/99' AS DATETIME), DATEPART(DW, '1/1/99')
SET DATEFORMAT
Determina el orden de las partes de la fecha (mes/día/año) para escribir datos de tipo
datetime o smalldatetime.
Sintaxis
En este ejemplo se usan distintos formatos de fecha para tratar cadenas de fecha con
formatos diferentes.
/* Establecemos el formato en Año Dia mes y hacemos lo mismo que el Ejemplo Anterior
SET IDENTITY_INSERT
Permite insertar valores explícitos en la columna identidad(Autonumerica) de una tabla.Por
ejemplo la tabla PRODUCTOS tiene el campo idproducto como clave primaria y es una
columna con la propiedad identidad establecida en si
Ejemplos
En este ejemplo se crea una tabla con una columna de identidad y se muestra cómo se
puede usar la opción SET IDENTITY_INSERT para llenar un hueco en los valores de
identidad causado por una instrucción DELETE.
Ahora si queremos insertar un nuevo registro con el codigo numero 7 que fue
eliminado no sera posible porque SQL SERVER nos enviara el sgte error
SET LANGUAGE
Especifica el idioma de entorno de la sesión. El idioma de la sesión determina los formatos de
datetime y los mensajes del sistema.utilice la funcion @@LANGUAGE Para averiguar el
nombre del idioma en uso.
Sintaxis
SET NOCOUNT { ON | OFF }
Cuando SET NOCOUNT es ON, no se devuelve el número de filas afectado por una
instrucción Transact-SQL. Cuando SET NOCOUNT es OFF, sí se devuelve ese número.
Este ejemplo en el Analizador de consultas de SQLse impide que aparezca el mensaje con el
número de filas afectadas.
GO
SELECT IDPEDIDO FROM PEDIDOS
GO
SET NOCOUNT ON
GO
SELECT IDPEDIDO FROM PEDIDOS
GO
/*PARA REESTABLECERLO DESACTIVE EL COMANDO EN OFF*/
SET NOCOUNT OFF
GO
SET ROWCOUNT
Hace que Microsoft SQL Server deje de procesar la consulta cuando se haya devuelto el
número de filas especificado.
SET ROWCOUNT 4
GO
UPDATE PEDIDOS SET CARGO = 7.5 WHERE CARGO >= 10
GO
La Tabla muestra un resumen con las variables globales que nos pueden resultar de utilidad:
SELECT NOMBRE,
APELLIDOS,
FECHANACIMIENTO,
DATEDIFF(YEAR,FECHANACIMIENTO,GETDATE()) AS EDAD,
FECHACONTRATACION,
DATEDIFF(YEAR,FECHACONTRATACION,GETDATE()) AS [TIEMPO SERVICIO]
FROM EMPLEADOS
1. Mostrar los dias Transcurridos entre la fecha de Pedido y la Fecha de entrega de todos los
Pedidos entregados al pais de Alemania
SELECT IDPEDIDO,
FECHAPEDIDO,
FECHAENTREGA,
DATEDIFF(DAY,FECHAPEDIDO,FECHAENTREGA) AS [DIAS TRANSCURRIDOS],
FROM PEDIDOS
WHERE PAÍS=”ALEMANIA”
SELECT IDPRODUCTO,
NOMBREPRODUCTO,
PRECIOUNIDAD,
PRECIOUNIDAD*.010 AS INCREMENTO,
PRECIOUNIDAD+(PRECIOUNIDAD)*.010 AS [PRECIO INCREMENTADO]
FROM PRODUCTOS
FUNCION SUM
Realiza una suma de toda una columna para todas las filas accedidas mediante una consulta
SQL.
La anterior consulta obtiene la suma del precio para todas las filas de la tabla pedido, ya que
no hemos especificado ninguna condición en la cláusula WHERE.
Si ahora queremos obtener la suma total de todos los pedidos realizados por el cliente cuyo
código es "ANTON", debemos realizar la misma consulta, pero especificando una condición
para obtener únicamente las filas cuyo cod_cliente es "ANTON":
FUNCION COUNT
Cuenta todas las filas de las tablas accedidas mediante una consulta SQL.
Por ejemplo, si tenemos una tabla cliente, con todos los clientes de una empresa de servicios,
con los atributos idCliente, nombre, apellidos, dirección, y queremos saber todos los clientes
que tenemos, deberemos realizar un count, para obtener todas el número de filas de la tabla
ejecutamos el Código fuente
En el anterior ejemplo, al existir el mismo número de filas, sea cual sea el atributo que
seleccionemos, podríamos haber escogido cualquier otro. En general, se suele escribir el
Código fuente
Si ahora queremos saber el número de clientes que viven en Madrid, deberemos realizar un
conteo de todas las filas con la condición de que el atributo ciudad sea Madrid.
Y si queremos saber cuantos Productos tenemos, cuyo precio es mayor de 20, deberemos
realizar lo mismo, pero especificando esta condición en la cláusula WHERE. Al resultado de la
búsqueda le llamaremos Caros.
Si por ejemplo tenemos una tabla de materiales, con los atributos cod_material, descripción,
precio y cantidad _ pedida, y queremos saber la cantidad media pedida de todos los
materiales, deberemos realizar una media aritmética, teniendo en cuenta todas las filas de la
tabla:
La anterior sentencia, internamente, realiza primero una suma de todos los valores, y a
continuación la divide por el número total de filas accedidas, es decir, realiza la media
aritmética.
Volviendo a nuestra cultural base de datos SUPERMERCADOSNEPTUNO, si queremos
saber la media del precio de los títulos que tenemos disponibles, deberemos ejecutar el
Código fuente
FUNCION MAX
Obtiene el máximo valor del atributo especificado, de entre todas las filas seleccionadas
mediante la sentencia SQL.
Para nuestro ejemplo, si queremos saber cual es el libro más caro, ejecutaremos el Código
fuente
FUNCION MIN
Obtiene el mínimo valor del atributo especificado, de entre todas las filas seleccionadas
mediante la sentencia SQL. Si queremos saber cual es el PRODUCTOS más barato de
nuestra base de datos, deberemos ejecutar el Código fuente
SELECT IDPEDIDO,CANTIDAD,NOMBREPRODUCTO,[DETALLES DE
PEDIDOS].PRECIOUNIDAD,CANTIDAD*[DETALLES DE PEDIDOS].PRECIOUNIDAD AS
TOTAL FROM [DETALLES DE PEDIDOS]
INNER JOIN PRODUCTOS ON [DETALLES DE
PEDIDOS].IDPRODUCTO=PRODUCTOS.IDPRODUCTO
WHERE IDPEDIDO=10250
COMPUTE SUM(CANTIDAD*[DETALLES DE PEDIDOS].PRECIOUNIDAD)
Ejemplos
SELECT NOMBRECOMPAÑÍA,
YEAR(FECHAPEDIDO) AS AÑO,
SUM(CANTIDAD*PRECIOUNIDAD) AS [TOTAL COMPRAS]
FROM CLIENTES
INNER JOIN PEDIDOS ON CLIENTES.IDCLIENTE=PEDIDOS.IDCLIENTE
INNER JOIN [DETALLES DE PEDIDOS] ON PEDIDOS.IDPEDIDO=[DETALLES DE
PEDIDOS].IDPEDIDO
WHERE YEAR(FECHAPEDIDO)=1995
GROUP BY NOMBRECOMPAÑÍA,YEAR(FECHAPEDIDO)
Ejemplo:usando SUPERMERCADOSNEPTUNO
Mostrar los productos que tengan un precio mayor al precio promedio de todos los productos
SELECT IDPRODUCTO,NOMBREPRODUCTO,PRECIOUNIDAD
FROM PRODUCTOS
WHERE PRECIOUNIDAD>(SELECT AVG(PRECIOUNIDAD) FROM PRODUCTOS)
Ejemplo:usando BDVENTAS
En este caso se listan las oficinas cuyo objetivo sea superior A TODAS las sumas
• Este ejemplo obtiene lo mismo que el ejemplo del test IN.Observa que delante de
EXISTS no va ningún nombre de columna.
• En la subconsulta se pueden poner las columnas que queramos en la lista de
selección (hemos utilizado el *).Hemos añadido una condición adicional al WHERE, la
de la referencia externa para que la oficina que se compare sea la oficina del
empleado
NOTA. Cuando se trabaja con tablas muy voluminosas el test EXISTS suele dar mejor
rendimiento que el test IN.
3. Mostrar los productos que se hayan vendido con un descuento igual al 25%
5. Mostrar a los empleados que tengan un salario igual al salario promedio de todos los
empleados
SELECT APELLIDOS,NOMBRE,TITULO,SALARIO
6. Obtiene una lista con el nombre,cargo y salario de todos los agentes de ventascuyo
salario es mayor que el de todos los jefes y directores
SELECT APELLIDOS,NOMBRE,CARGO,SALARIO
FROM EMPLEADOS
WHERE CARGO LIKE ‘AGENTE VENT*’
AND SALARIO ALL(SELECT SALARIO
FROM EMPLEADOS
WHERE CARGO LIKE ‘JEFE*’) OR CARGO LIKE
‘*DIRECTOR*’)
7. Obtiene una lista de las compañías y los contactos de todos los clientes que han realizado
un pedido en el segundo trimestre de 1995
SELECT DISTINCT
NOMBRECONTACTO,NOMBRECOMPAÑIA,CARGOCONTACTO,TELEFONO
FROM CLIENTES
WHERE IDCLIENTE IN(SELECT DISTINCT IDCLIENTE FROM PEDIDOS
WHERE FECHAPEDIDO<’07/01/95’)
TIPOS DE FUNCIONES
El servidor 2000 del SQL utiliza estos tipos de funciones:
Los tres tipos de funciones aceptan parámetros de cualquier tipo. Las funciones escalares
devuelven un solo valor, tabla en linea y Multisentencias devuelben un tipo de dato tabla.
I. FUNCIONES ESCALARES
Las funciones escalares vuelven un tipo de los datos tal como int, money, varchar, real, etc.
Pueden ser utilizadas en cualquier lugar incluso incorporada dentro de sentencias SQL. La
sintaxis para una función escalar es la siguiente:
<instrucciones>
RETURN expresionEscalar
END
EJEMPLO:
EJEMPLO :Modificando la funcion SUMA. Para que acepte valores con decimales vamos a
cambiar los tipos INT por FLOAT
SELECT DBO.SUMA(12.5,2.7)
EJEMPLOS DE FUNCIONES
CREATE FUNCTION EDAD(
@FECHANACIMIENTO DATETIME,
@FECHAACTUAL DATETIME)
RETURNS TINYINT
AS
BEGIN
DECLARE @EDAD TINYINT
SET @EDAD=DATEDIFF(YEAR,@FECHANAC,@FECHAACT)
RETURN @EDAD
END
SET @INTERES=@MONTO*@INTERES
SET @MONTOCUOTA=@MONTO/@CUOTA
RETURN (@MONTOCUOTA+@PAGOINTERES)
END
Ejemplo:
En realidad, una vista se almacena simplemente como una instrucción SQL previamente
definida. Cuando se accede a la vista, el optimizador de consultas de SQL Server une la
instrucción SQL que se ejecuta en ese momento con la consulta que se use para definir la
vista.
EJEMPLO :
CREATE VIEW ProductosMasCaros
AS
BEGIN
SELECT TOP 5 NOMBREPRODUCTO,PRECIOUNIDAD,UNIDADESENEXISTENCIA
FROM PRODUCTOS
ORDER BY PRECIOUNIDAD DESC
END
• Otra ventaja de usar vistas es que una vista puede tener un nivel diferente de
seguridad del que posea la tabla subyacente. La consulta que define la vista se
ejecuta con el nivel de seguridad que posea el usuario que crea la vista. De esta
manera, se puede crear una vista que enmascare los datos que no se quieran mostrar
a ciertas clases de usuarios.
• Limitación de la base de datos: Solamente se puede crear una vista de una tabla en la
base de datos a la que el creador de la vista está accediendo.
• Limitación de niveles en las vistas anidadas: Las vistas se pueden crear sobre otras
vistas (en otras palabras, se puede crear una vista que acceda a otras vistas). Las
vistas se pueden anidar hasta 32 niveles.
Segunda Vista:
CREATE VIEW MEJORCLIENTEAÑO
AS
SELECT AÑO AS FECHA, NOMBRECOMPAÑÍA, TOTAL
FROM TOTALPEDIDOSANUALES
WHERE STR(AÑO) + STR(TOTAL)
IN (SELECT STR(AÑO) + STR(MAX(TOTAL))
FROM TOTALPEDIDOSANUALES
GROUP BY AÑO )
IF expresion_logica
sentencia1
[ELSE sentencia2]
Si deseamos obtener los títulos almacenados cuando éstos superen las 10 unidades, y el
número de ellos cuando no lo superen, ejecutaremos el Código fuente
SELECT NombreCompañía,
CASE Ciudad
WHEN 'CA' THEN 'California'
WHEN 'KS' THEN 'Kansas'
WHEN 'TN' THEN 'Tennessee'
WHEN 'OR' THEN 'Oregon'
WHEN 'MI' THEN 'Michigan'
WHEN 'IN' THEN 'Indiana'
WHEN 'MD' THEN 'Maryland'
WHEN 'UT' THEN 'Utah'
END AS NombreCiudad
FROM Clientes
ORDER BY NombreCompañía
En este caso se comprueba el valor del atributo Ciudad, y si este es igual a CA, se devolverá
California, si es OR se devolverá Oregon, y en otro caso se devolverá el literal 'Otro'.
WHILE expresion_logica
Sentencia
[BREAK]
[CONTINUE]
EJEMPLO
En este ejemplo, si el promedio de precio es menor de 30 $, el bucle WHILE dobla los precios
y, a continuación, selecciona el precio máximo. Si el precio máximo es menor o igual que 50
$, el bucle WHILE se reinicia y dobla los precios de nuevo. Este bucle continúa la duplicación
de precios hasta que el precio máximo sea mayor que 50 $ y, a continuación, sale del bucle
WHILE e imprime un mensaje
Los procedimientos almacenados son conjuntos de sentencias en leguaje Transact SQL que
pueden almacenarse en el propio servidor. Los procedimientos almacenados de SQL Server,
son más potentes, porque permiten almacenar funciones y procedimientos compuestos por
varias instrucciones, introducir saltos, bucles, etc. También se pueden compilar procedimiento
escritos en lenguaje C, para ampliar su potencia modularmente.
Por ejemplo, podemos crear un procedimiento para recuperar el nombre de un Cliente, cuyo
código se pasa por parámetro.
Pasando los argumentos nombrados. En este caso no hace falta que los parámetros vayan
en el mismo orden.
Ejemplo 2:
Primero contamos todas las filas de la tabla clientes, realizando un SELECT * FROM clientes.
A continuación devolvemos en el parámetro @clientes el valor obtenido, utilizando
@@ROWCOUNT.
Acto seguido se realiza lo mismo para la tabla Productos. Nótese como la forma de asignar
un valor a un atributo es mediante una sentencia SELECT, igualando el parámetro al valor.
La función @@ROWCOUNT devuelve el número de filas que se han seleccionado. Es
equivalente a la sentencia que aparece en el Código fuente
SELECT COUNT(*) FROM Productos
Se podría sustituir por Código fuente
Tras ejecutar las anteriores sentencias, obtendremos como resultado el siguiente listado:
EXECUTE
Ejecuta una función definida por el usuario que devuelve valores escalares, un procedimiento
del sistema, un procedimiento almacenado definido por el usuario o un procedimiento
almacenado extendido.
SET @TABLE='CLIENTES'
Observe las distintas formas en las que se puede utilizar la palabra clave DEFAULT
Sino se especifica el valor del parametro se asume entonces el valor por defecto es decir se
tomara entonces el valor “ARGENTINA”
Así, si escribimos sp_who, obtendremos una lista con todos los usuarios conectados,
Si queremos obtener una lista con todas las tablas del sistema, disponemos de otro
procedimiento almacenado denominado sp_tables. Del mismo modo, si deseamos conocer
Por ejemplo, para listar los atributos de la tabla Categorias ejecutamos sp_columns
Categorias, y obtenemos el resultado de la Figura
XP_CMDSHELL
Ejecuta una cadena de comandos como comando del sistema operativo y devuelve el
resultado como filas de texto.
USE MASTER
EXECUTE XP_CMDSHELL 'DIR C: *.EXE'
MAS EJEMPLOS
1. Este procedimiento permite insertar un registro a la tabla empleados pero antes verifica si
existe algun empleado con el mismo nombre y apellido en ese caso lo rechaza no se toma en
cuenta el campo idempleado porque es autonumerico
VALUES(@APELLIDOS,@NOMBRE,@CARGO,@FECHANACIMIENTO,@FECHACONTRATACION,@DIRECCION,@CIUDA
D,
@PAIS,@FONO)
END
GO
EXECUTE INSERTAEMPLEADO ‘CHAVEZ VIERA’,’HENRY’,’DOCENTE’,’22/09/71’,’23/09/98’,’JR.NAPOLES 300 URB.FIORI
SMP’,’LIMA’,’PERU’,’5340806’
Go
EXEC ELIMINAEMPLEADO 2
GO
EXEC VERDETALLES 10248
AS
SET NOCOUNT ON
Una transacción es un conjunto de operaciones que van a ser tratadas como una única
unidad.
La transacción más simple en SQL Server es una única sentencia SQL. Por ejemplo una
sentencia como esta:
Por supuesto este tipo de transacciones no requieren de nuestra intervención puesto que el
sistema se encarga de todo. Sin embargo si hay que realizar varias operaciones y queremos
que sean tratadas como una unidad tenemos que crear esas transacciones de manera
explícita.
La sentencia que se utiliza para indicar el comienzo de una transacción es ‘BEGIN TRAN’. Si
alguna de las operaciones de una transacción falla hay que deshacer la transacción en su
totalidad para volver al estado inicial en el que estaba la base de datos antes de empezar.
Esto se consigue con la sentencia ‘ROLLBACK TRAN’.
Si todas las operaciones de una transacción se completan con éxito hay que marcar el fin de
una transacción para que la base de datos vuelva a estar en un estado consistente con la
sentencia ‘COMMIT TRAN’.
USE SUPERMERCADOSNEPTUNO
DECLARE @Error int
--Declaramos una variable que utilizaremos para almacenar un posible código de error
BEGIN TRAN
--Iniciamos la transacción
UPDATE Productos SET PrecioUnidad=2.5 WHERE NombreProducto =’Queso de cabra’
--Ejecutamos la primera sentencia
SET @Error=@@ERROR
--Si ocurre un error almacenamos su código en @Error
--y saltamos al trozo de código que deshara la transacción. Si, eso de ahí es un
--GOTO, el demonio de los programadores, pero no pasa nada por usarlo
--cuando es necesario
IF (@Error<>0) GOTO TratarError
--Si la primera sentencia se ejecuta con éxito, pasamos a la segunda
UPDATE Productos SET PrecioUnidad=2.5 WHERE NombreProducto=’Queso de cabra’
SET @Error=@@ERROR
Como se puede ver para cada sentencia que se ejecuta miramos si se ha producido o no un
error, y si detectamos un error ejecutamos el bloque de código que deshace la transacción.
Hay una interpretación incorrecta en cuanto al funcionamiento de las transacciones que esta
bastante extendida. Mucha gente cree que si tenemos varias sentencias dentro de una
transacción y una de ellas falla, la transacción se aborta en su totalidad. ¡Nada más lejos de
la realidad! Si tenemos dos sentencias dentro de una transacción.
USE SUPERMERCADOSNEPTUNO
BEGIN TRAN
UPDATE PRODUCTOS
SET PRECIOUNIDAD=2.5 WHERE NOMBREPRODUCTO=’QUESO CABRA’
UPDATE PRODUCTOS
SET PRECIOUNIDAD=2.5 WHERE NOMBREPRODUCTO=’QUESO CABRA’
COMMIT TRAN
Estas dos sentencias se ejecutarán como una sola. Si por ejemplo en medio de la transacción
(después del primer update y antes del segundo) hay un corte de electricidad, cuando el SQL
Server se recupere se encontrará en medio de una transacción y, o bien la termina o bien la
deshace, pero no se quedará a medias.El error está en pensar que si la ejecución de la
primera sentencia da un error se cancelará la transacción. El SQL Server sólo se preocupa
de ejecutar las sentencias, no de averiguar si lo hacen correctamente o si la lógica de la
transacción es correcta. Eso es cosa nuestra. Por eso en el ejemplo que tenemos más arriba
para cada sentencia de nuestro conjunto averiguamos si se ha producido un error y si es así
actuamos en consecuencia cancelando toda la operación.
GO
INSERTADETALLE 20572,2,10,3
• INSERCIÓN
• BORRADO
• ACTUALIZACIÓN
Donde acción especifica el evento que debe ocurrir para que se dispare el trigger, y que
puede ser:
• UPDATE: actualización.
• INSERT: inserción.
• DELETE: borrado.
Con esto conseguimos dos cosas, actualizar el nombre del cliente cuyo código es el
especificado a Miguel, y obtener el mensaje que se muestra como ejecución del trigger de
actualización.
Sin embargo, los triggers en SQL Server tienen una serie de limitaciones:
1. No se puede disparar un trigger dentro de otro trigger, ya que daría lugar a un bucle
infinito
2. Por esta razón, un trigger no puede ejecutar instrucciones DDL (lenguaje de definición
de datos)
MODIFICAR UN TRIGGER
Para modificar un trigger, deberemos ejecutar la sentencia ALTER TRIGGER
Sentencias
Las palabras reservadas DELETE, INSERT y UPDATE corresponden a cada una de las
acciones para las cuales se puede definir un desencadenador dentro de la tabla especificada.
El bloque de sentencias permite prácticamente cualquier tipo de ellas dentro del lenguaje T-
SQL, pero con ciertas limitaciones. Por ejemplo, no se podrá utilizar la sentencia select, ya
que un trigger no puede devolver datos al usuario, sino que simplemente se ejecuta para
cambiar o comprobar los datos que se van a insertar, actualizar o borrar.
TIPOS DE DESENCADENADORES
SQL-Server permite la definición de varios tipos de triggers, entre los cuales cabe destacar los
siguientes:
• DESENCADENADORES MÚLTIPLES:
Para una misma tabla, se pueden definir distintos triggers para la misma acción, es
decir, si definimos un trigger para insert, y resulta que dicha tabla ya tenía definido un
trigger para esa misma acción, se ejecutarán ambos triggers cuando ocurra dicho
evento sobre la tabla.
• DESENCADENADORES RECURSIVOS:
Se permite la recursividad entre las llamadas a los triggers, es decir, un trigger puede
llamar a su vez a otro, bien de forma directa, bien de forma indirecta.
• DESENCADENADORES ANIDADOS:
si un trigger cambia una tabla en la que se encuentra definido otro trigger, se provoca
la llamada de este último que, si a su vez vuelve a modificar otra tabla, puede provocar
la ejecución de otro trigger, y así sucesivamente. Si se supera el nivel de anidamiento
permitido, se cancelará la ejecución de los triggers.
EJEMPLOS
1. Veamos a continuación algunos ejemplos que complementen lo visto hasta ahora. El
siguiente código, muestra la forma de enviar un mensaje de correo electrónico a una persona,
cuando se añade una nueva oferta.
2. Sin embargo, si queremos que se envíe el mensaje cada vez que se cambia algo en la
tabla de ofertas, deberemos reescribir el trigger para las acciones update y delete, como se
muestra en el siguiente código.
IF @STOCK>@CANTIDAD
BEGIN
UPDATE PRODUCTOS SET STOCK=STOCK-@CANTIDAD
WHERE
IDPRODUCTO=@IDPROD
PRINT 'SE DESCARGO EL STOCK'
END
ELSE
BEGIN
ROLLBACK
PRINT 'LA CANTIDAD DEBE SER MENOR AL STOCK'
ENDEND
DESHABILITAR UN TRIGGER
Para DESHABILITAR un triger se hace de la siguiente manera
Las aplicaciones necesitan procesar el conjunto de resultados de una fila o bloque de filas de
una vez. Los cursores son una extensión lógica para conjuntos de resultados que permiten a
las aplicaciones trabajar con el conjunto de resultados fila por fila.
Microsoft SQL Server 2000 admite varios mecanismos para especificar cursores:
FORWARD_ONLY
Especifica que el cursor sólo se puede desplazar desde la primera a la última fila. FETCH
NEXT es la única opción de recuperación aceptada. Si se especifica FORWARD_ONLY sin
las palabras clave STATIC, KEYSET o DYNAMIC, el cursor funciona como un cursor
DYNAMIC. Cuando no se especifica FORWARD_ONLY ni tampoco SCROLL,
FORWARD_ONLY es la opción predeterminada
STATIC
Define un cursor que hace una copia temporal de los datos que utiliza. Todas las peticiones al
cursor se responden desde esta tabla temporal de tempdb; por ello, las modificaciones
realizadas en las tablas base no se reflejarán en los datos obtenidos en las recuperaciones
realizadas en el cursor y además este cursor no admite modificaciones.
KEYSET
Especifica que la pertenencia y el orden de las filas del cursor se fijan al abrir éste. El
conjunto de claves que identifica de forma única las filas está integrado en una tabla de
tempdb conocida como KEYSET. Los cambios en valores que no sean claves de las tablas
base, ya sean realizados por el propietario del cursor o confirmados por otros usuarios, son
visibles cuando el propietario se desplaza por el cursor. Las inserciones realizadas por otros
usuarios no son visibles (no es posible hacer inserciones a través de un cursor de servidor
Transact-SQL). Si se elimina una fila, el intento de recuperarla obtendrá un valor de -2 en
@@FETCH_STATUS. Las actualizaciones de los valores de claves desde fuera del cursor se
asemejan a la eliminación de la fila antigua seguida de la inserción de la nueva. La fila con los
DYNAMIC
Define un cursor que, al desplazarse por él, refleja en su conjunto de resultados todos los
cambios realizados en los datos de las filas.
EJEMPLOS CURSORES
El conjunto de resultados generado al abrir este cursor contiene todas las filas y todas las
columnas de la tabla EMPLEADOS de la base de datos SUPERMERCADOSNEPTUNO. Este
cursor se puede actualizar, y todas las actualizaciones y eliminaciones se representan en las
recuperaciones realizadas contra el cursor. FETCH NEXT es la única recuperación disponible
debido a que no se ha especificado la opción SCROLL.
‘Cierra temporalmente el cursor para ser reabierto con una instrucción OPEN
CLOSE CUR_EMPLEADOS
UN CURSOR ACTUALIZABLE
DECLARE CUR_CLIENTES CURSOR
FOR SELECT * FROM CLIENTES
OPEN CUR_CLIENTES
FETCH NEXT FROM CUR_CLIENTES
WHILE @@FETCH_STATUS=0
BEGIN
FETCH NEXT FROM CUR_CLIENTES INTO @IDCLIENTE,@NOMBRECOMPAÑIA, @PAIS
PRINT @IDCLIENTE + ' ' +@NOMBRECOMPAÑIA + ‘ ‘+ @PAIS
END
3. En el cuadro de diálogo Archivo nueva base de datos, haga clic en una ubicación en el
cuadro Guardar en y especifique un nombre en el cuadro Nombre de archivo. Compruebe
que aparece Proyectos de Microsoft Access en el cuadro Guardar como tipo y,
finalmente, haga clic en Crear.
2. Crear la tabla oficinas con su clave principal y su clave foránea ( la columna dir contiene
el código de empleado del director de la oficina luego es un campo que hace referencia
a un empleado luego es clave foránea y hace referencia a la tabla empleados).
______________________________________________________________________
4. Crear la tabla clientes también con todas sus claves y sin la columna limitecredito.
______________________________________________________________________
4. Crear la tabla pedidos sin clave principal, con la clave foránea que hace referencia a los
productos, la que hace referencia a clientes y la que indica el representante (empleado)
que ha realizado el pedido.
______________________________________________________________________
6 Añadir a la tabla empleados las claves foráneas que le faltan. (Si no tienes claro cuales
son te lo decimos ahora: la columna oficina indica la oficina donde trabaja el empleado y
la columna director indica quién dirige al empleado, su jefe inmediato).
______________________________________________________________________
CONSULTAS SIMPLES
1. Obtener una lista de todos los productos indicando para cada uno su idfab,
idproducto, descripción, precio y precio con I.G.V. incluido (es el precio anterior
aumentado en un 16%).
5. Obtener las oficinas ordenadas por orden alfabético de región y dentro de cada
región por ciudad, si hay más de una oficina en la misma ciudad, aparecerá primero
la que tenga el número de oficina mayor.
7. Listar las cuatro líneas de pedido más caras (las de mayor importe).
8. Obtener las mismas columnas que en el ejercicio 2 pero sacando unicamente las 5
líneas de pedido de menor precio unitario.
9. Listar los números de los empleados que tienen una oficina asignada.
11. Listar los datos de las oficinas de las regiones del norte y del este (tienen que
aparecer primero las del norte y después las del este).
1. Listar las oficinas del este indicando para cada una de ellas su número, ciudad, números
y nombres de sus empleados. Hacer una versión en la que aparecen sólo las que tienen
empleados, y hacer otra en las que aparezcan las oficinas del este que no tienen
empleados.
______________________________________________________________________
2. Listar los pedidos mostrando su número, importe, nombre del cliente, y el límite de
crédito del cliente correspondiente (todos los pedidos tienen cliente y representante).
______________________________________________________________________
3. Listar los datos de cada uno de los empleados, la ciudad y región en donde trabaja.
______________________________________________________________________
4. Listar las oficinas con objetivo superior a 600.000 pts indicando para cada una de ellas
el nombre de su director.
______________________________________________________________________
10. Listar los pedidos superiores a 25.000 pts, incluyendo el nombre del empleado que tomó
el pedido y el nombre del cliente que lo solicitó.
______________________________________________________________________
11. Hallar los empleados que realizaron su primer pedido el mismo día en que fueron
contratados.
______________________________________________________________________
12. Listar los empleados con una cuota superior a la de su jefe; para cada empleado sacar
sus datos y el número, nombre y cuota de su jefe.
______________________________________________________________________
13. Listar los códigos de los empleados que tienen una línea de pedido superior a 10.000 ptas
o que tengan una cuota inferior a 10.000 pts.
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
4. ¿Cuál es el importe total de los pedidos realizados por el empleado Vicente Pantalla?
______________________________________________________________________
5. Hallar en qué fecha se realizó el primer pedido (suponiendo que en la tabla de pedidos
tenemos todos los pedidos realizados hasta la fecha).
______________________________________________________________________
______________________________________________________________________
7. Listar cuántos empleados están asignados a cada oficina, indicar el número de oficina y
cuántos hay asignados.
______________________________________________________________________
8. Para cada empleado, obtener su número, nombre, e importe vendido por ese empleado
a cada cliente indicando el número de cliente.
______________________________________________________________________
9. Para cada empleado cuyos pedidos suman más de 30.000 ptas, hallar su importe medio
de pedidos. En el resultado indicar el número de empleado y su importe medio de
pedidos.
______________________________________________________________________
10. Listar de cada producto, su descripción, precio y cantidad total pedida, incluyendo sólo
los productos cuya cantidad total pedida sea superior al 75% del stock; y ordenado por
cantidad total pedida.
______________________________________________________________________
11. Saber cuántas oficinas tienen empleados con ventas superiores a su cuota, no queremos
saber cuales sino cuántas hay.
13. Añadir una nueva oficina para la ciudad de Madrid, con el número de oficina 30,
con un objetivo de 100000 y región Centro.
______________________________________________________________________
______________________________________________________________________