Manual - SQL SERVER
Manual - SQL SERVER
SQL Server
Compilado por:
Jazmin Cabello Pérez,
Julia Basurto Madrid
Compilado por:
Jazmin Cabello Pérez y Julia Basurto Madrid.
Junio 2007
INDICE
2. ARQUITECTURA........................................................................................................................ 8
2.1 Bases de datos del sistema. .................................................................................................. 8
2.2 Tablas del sistema ................................................................................................................. 8
2.3 Principales procedimientos almacenados del sistema............................................................ 9
4. CONSULTAS BÁSICAS............................................................................................................ 27
4.1 Instrucciones para la selección, ordenamiento y agrupación de la información.................... 27
4.2 Instrucciones para la inserción, actualización y borrado de información............................... 30
4.3 Funciones matemáticas, de cadena, fechas y otras. ............................................................ 32
8. TRIGGERS ............................................................................................................................... 55
8.1 Características y beneficios. ................................................................................................ 55
8.2 Observaciones sobre integridad referencial. ........................................................................ 56
8.3 Utilización de los triggers ..................................................................................................... 57
SQL Server 2000 3
CONCEPTOS
B ÁSICOS DE SQL
L as aplicaciones en red son cada día más numerosas y versátiles. En muchos casos, el esquema básico
de operación es una serie de scripts que rigen el comportamiento de una base de datos.
Debido a la diversidad de lenguajes y de bases de datos existentes, la manera de comunicar entre unos y
otras sería realmente complicada de gestionar de no ser por la existencia de estándares que permiten
realizar las operaciones básicas de una forma universal.
Es de eso de lo que trata el Structured Query Language que no es más que un lenguaje estándar de
comunicación con bases de datos. Por tanto es un lenguaje normalizado que permite trabajar con cualquier
tipo de lenguaje (ASP o PHP) en combinación con varios tipos de base de datos (MS Access, SQL Server,
MySQL).
El hecho de que sea estándar no quiere decir que sea idéntico para cada base de datos. En efecto,
determinadas bases de datos implementan funciones específicas que no tienen necesariamente que
funcionar en otras.
Aparte de esta universalidad, el SQL posee otras dos características muy apreciadas. Por una parte,
1
presenta una potencia y versatilidad notables que contrasta, por otra, con su accesibilidad de aprendizaje .
1
Que es y para que sirve el SQL (n.d.). Disponible en URL http://www.desarrolloweb.com/articulos/262.php
4 Compilado por: Jazmin Cabello Pérez, Julia Basurto Madrid
Los requerimientos mínimos del hardware y software para la instalación del programa
PC con procesador Pentium® II/III de 350 MHz.
Tarjeta de video SVGA a 800x600 píxeles (256 colores) o superior.
Ratón.
64 MB de memoria RAM (128MB recomendado).
20 MB de espacio libre en disco en Disco Duro.
Tarjeta de red 10/100 para la conexión por red al equipo servidor de datos (LAN o RAS).
El sistema CADECO® es una aplicación construida para ejecutar en plataformas Windows de 32
bits, por lo que requiere para su funcionamiento el sistema operativo Microsoft® Windows 98 o NT®,
Win2000 Server.
A su vez cada computadora debe tener su correspondiente licencia de cliente tanto para NT como para SQL
2
Server (CALs)
Comandos
Existen dos tipos de comandos SQL:
Los DLL que permiten crear y definir nuevas bases de datos, campos e índices.
Los DML que permiten generar consultas para ordenar, filtrar y extraer datos de la base de datos.
Comandos DLL
Comando Descripción
ALTER Utilizado para modificar las tablas agregando campos o cambiando la definición de los
campos.
2
Requerimientos (n.d.). Disponible en URL http://www.dist-soft.com/page6.html (Abril 2007)
SQL Server 2000 5
Comandos DML
Comando Descripción
SELECT Utilizado para consultar registros de la base de datos que satisfagan un criterio determinado.
INSERT Utilizado para cargar lotes de datos en la base de datos en una única operación.
UPDATE Utilizado para modificar los valores de los campos y registros especificados.
DELETE Utilizado para eliminar registros de una tabla de una base de datos.
Cláusulas
Las cláusulas son condiciones de modificación utilizadas para definir los datos que desea seleccionar o
manipular.
Comando Descripción
WHERE Utilizada para especificar las condiciones que deben reunir los registros que se van a
seleccionar.
HAVING Utilizada para expresar la condición que debe satisfacer cada grupo.
Operadores Lógicos
Operador Uso
AND Es el “y” lógico. Evalúa dos condiciones y devuelve un valor de verdad sólo si ambas son ciertas.
OR Es el “o” lógico. Evalúa dos condiciones y devuelve un valor de verdad si alguna de las dos es
cierta.
Operadores de Comparación
Operador Uso
Funciones de Agregado
Las funciones de agregado se usan dentro de una cláusula SELECT en grupos de registros para devolver
un único valor que se aplica a un grupo de registros.
Comando Descripción
Funcionalidad
El SQL proporciona funcionalidad más allá de la simple consulta (o recuperación) de datos. Asume el papel
de lenguaje de definición de datos (LDD), lenguaje de definición de vistas (LDV) y lenguaje de manipulación
de datos (LMD). Además permite la concesión y denegación de permisos, la implementación de
restricciones de integridad y controles de transacción, y la alteración de esquemas. Las primeras versiones
del SQL incluían funciones propias de lenguaje de definición de almacenamiento (LDA) pero fueron
suprimidas en los estándares más recientes con el fin de mantener el lenguaje sólo a nivel conceptual y
externo.
Modos de uso
El SQL permite fundamentalmente dos modos de uso:
Un uso interactivo, destinado principalmente a los usuarios finales avanzados u ocasionales, en el
que las diversas sentencias SQL se escriben y ejecutan en línea de comandos, o un entorno
semejante.
Un uso integrado, destinado al uso por parte de los programadores dentro de programas escritos
en cualquier lenguaje de programación anfitrión. En este caso el SQL asume el papel de
sublenguaje de datos.
En el caso de hacer un uso embebido del lenguaje se pueden utilizar dos técnicas alternativas de
programación. En una de ellas, en la que el lenguaje se denomina SQL estático, las sentencias utilizadas
no cambian durante la ejecución del programa. En la otra, donde el lenguaje recibe el nombre de SQL
dinámico, se produce una modificación total o parcial de las sentencias en el transcurso de la ejecución del
programa. La utilización de SQL dinámico permite mayor flexibilidad y mayor complejidad en las sentencias,
pero como contra punto se obtiene una eficiencia menor y el uso de técnicas de programación más
complejas en el manejo de memoria y variables.
Optimización
SQL es un lenguaje declarativo, es decir que especifica que es lo que se quiere y no cómo conseguirlo, por
lo que una sentencia no establece explícitamente un orden de ejecución. El orden de ejecución interno de
una sentencia puede afectar gravemente a la eficiencia del SGBD, por lo que se hace necesario que éste
lleve a cabo una optimización antes de la ejecución de la misma. Muchas veces, el uso de índices acelera
una instrucción de consulta, pero ralentiza la actualización de los datos, dependiendo del uso de la
aplicación, se priorizará el acceso indexado o una rápida actualización de la información. La optimización
difiere sensiblemente en cada motor de base de datos y depende de muchos factores. Existe una
ampliación de SQL conocida como FSQL (Fuzzy SQL, SQL difuso) que permite el acceso a bases de datos
difusas, usando la lógica difusa. Este lenguaje ha sido implementado a nivel experimental y está
3
evolucionando rápidamente .
3
SQL (n.d.). Disponible en URL htttp://es.wikipedia.org/wiki/SQL. (Mayo 2007)
8 Compilado por: Jazmin Cabello Pérez, Julia Basurto Madrid
ARQUITECTURA
master Registra toda la información del sistema para una instancia de SQL Server.
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.
Resource Base de datos de sólo lectura que contiene objetos del sistema que se incluyen
con SQL Server 2005. Los objetos del sistema persisten físicamente en la base
de datos Resource, pero aparecen lógicamente en el esquema sys de cada
base de datos.
tempdb Área de trabajo que contiene objetos temporales o conjuntos de resultados
intermedios.
4
Bases de datos del sistema (n.d.). disponible en URL http://msdn2.microsoft.com/es-es/library/ms178028.aspx. (Abril
2007)
SQL Server 2000 9
En la definición de cada campo, debe existir un nombre único, con su tipo de dato correspondiente. Esto es
útil a la hora de manejar varios campos en la tabla, ya que cada nombre de campo debe ser distinto entre
sí.
A los campos se les puede asignar, además, propiedades especiales que afectan a los registros insertados.
El campo puede ser definido como índice o autoincrementable, lo cual permite que en el primer caso los
datos de ese campo cambien solos, de lo contrario son el principal indicador a la hora de ordenar los datos
contenidos.
Cada tabla creada debe tener un nombre único en cada Base de Datos, haciéndola accesible mediante su
nombre o su sinónimo (dependiendo del tipo de base de datos elegida).
La estructura de las tablas viene dado por la forma de un archivo plano, los cuales en un inicio se
5
componían de un modo similar .
byroyalty 581577110
5
Procedimientos almacenados (n.d.). Disponible en URL
http://livedocs.adobe.com/dreamweaver/8_es/using/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=42_rad_
6.htm. (Mayo 2007).
10 Compilado por: Jazmin Cabello Pérez, Julia Basurto Madrid
Usando la información retornada de la tabla SysObjects, el próximo comando SELECT consulta a la tabla
SysComments al usar el número de identificación del procedimiento almacenado ByRoyalty:
SELECT [text] FROM [pubs].[dbo].[SysComments]
WHERE [id] = 581577110
Esta consulta retorna el texto del procedimiento almacenado, cuyo número de identificación es el
581577110.
Usar el procedimiento almacenado de sistema sp_helptext es una mejor opción para mostrar el texto usado
para crear un objeto (tal como un procedimiento almacenado no encriptado), dado el texto es retornado en
múltiples filas.
Métodos para crear procedimientos almacenados
SQL Server provee muchos métodos que se pueden usar para crear un procedimiento almacenado: el
comando Transact-SQL CREATE PROCEDURE, SQL-DMO (usando el objeto StoredProcedure), a través
del árbol de consola del Enterprise Manager, el asistente para crear procedimientos almacenados (al cual
se puede acceder a través del Enterprise Manager).
El comando CREATE PROCEDURE
Se puede usar el comando CREATE PROCEDURE, o su versión abreviada, CREATE PROC, para crear un
procedimiento almacenado en el Query Analyzer o una herramienta de comando como sql. Cuando utiliza
CRETE PROC, se pueden realizar las siguientes tareas:
Especificar agrupamientos de procedimientos almacenados.
Definir parámetros de entrada-salida, sus tipos de datos, y sus valores por defecto. Cuando se
definen parámetros de entrada y salida, estos siempre van precedidos por el signo @, seguido del
nombre del parámetro y luego una designación del tipo de dato. Los parámetros de salida deben
incluir la palabra clave OUTPUT para diferenciarlos de los de entrada.
Usar códigos de retorno para mostrar información acerca del éxito o falla de una tarea.
Controlar si un plan de ejecución debería ser guardado temporalmente (en el caché) para un
procedimiento.
Encriptar el contenido del procedimiento almacenado por razones de seguridad.
Especificar las acciones que deberá tomar el procedimiento almacenado cuando se ejecute.
Proveer de contexto a un procedimiento almacenado
Con la excepción de los procedimientos almacenados temporarios, un procedimiento almacenado se crea
siempre en la base de datos actual. Por lo tanto, siempre se deberá especificar la base de datos actual
usando el comando USE nombre_base seguido por el comando GO antes de crear un procedimiento
almacenado- Se puede usar la lista desplegable Change Database en el Query Analizer para seleccionar la
base de datos actual.
El script siguiente selecciona la base Pubs y luego crea un procedimiento llamado ListAuthorNames (lista de
los nombres de los autores), que pertenece a dbo:
USE Pubs
GO
CREATE PROCEDURE [dbo].[ListAuthorNames]
AS
SELECT [au_fname], [aufname] FROM [pubs].[dbo].[authors]
En necesario observar que el nombre del procedimiento está totalmente calificado en el ejemplo siguiente:
Un nombre de procedimiento almacenado totalmente incluye el nombre de su propietario (en este caso dbo)
y el nombre del procedimiento, ListAuthorNames. Se especifica dbo como propietario, si se quiere asegurar
que la tarea del procedimiento almacenado correrá sin importar la tabla propietaria en la base de datos. El
SQL Server 2000 11
nombre de la base de datos no es parte del nombre totalmente calificado de un procedimiento almacenado
cuando se usa el comando CREATE PROCEDURE.
Crear procedimientos almacenados temporarios
Para crear un procedimiento almacenado temporal local, se agrega adelante del nombre del procedimiento
el símbolo #. Este signo numeral instruye al SQL Server para que cree el procedimiento en la TempDB.
Para crear un procedimiento almacenado temporario global, se agrega adelante del nombre del
procedimiento un doble símbolo numeral ##, que también será creado en la TempDB. SQL Server ignora la
base de datos actual cuando crea un procedimiento temporario. Por definición, un procedimiento
almacenado sólo puede existir en la TempDb. Para crear un procedimiento almacenado directamente en la
TempDB que no es ni local ni global haga que la TempDB sea la base de datos actual y luego cree el
procedimiento. El ejemplo siguiente crea un procedimiento almacenado temporario local, un procedimiento
almacenado temporario global y un procedimiento directamente en la TempDB:
crear un procedimiento temporario local
CREATE PROCEDURE #localtemp
AS
SELECT * from [pubs].[dbo].[authors]
GO
crear un procedimiento temporario global
CREATE PROCEDURE #globaltemp
AS
SELECT * from [pubs].[dbo].[authors]
GO
crear un procedimiento almacenado temporario que sea local en tempdb
USE TEMPDB
GO
CREATE PROCEDURE directtemp
AS
SELECT * from [pubs].[dbo].[authors]
GO
Nombres de bases de datos totalmente calificados son especificados en los comandos SELECT. Si el
procedimiento no se ejecuta en el contexto de una base de datos específica, luego nombre de bases de
datos totalmente calificadas aseguran que se está referenciando a la base de datos apropiada.
En la tercera parte del ejemplo, cuando se crea un procedimiento almacenado temporario directamente en
la base de datos TempDB, se debe hacer a la base de datos TempDB la base actual antes de crearlo, o se
debe calificar totalmente el nombre ([TempDb].[dbo].[directtemp]). Tal como los procedimientos
almacenados del sistema, que se guardan en la base Masters, los procedimientos almacenados
temporarios locales y globales están disponibles para ser usados por su nombre corto (sin importar la base
6
de datos actual )
6
TEMA 2: Creando, ejecutando, modificando y borrando procedimientos almacenados (n.d.). Disponible en URL
http://www.sqlmax.com/centro/moduloIV_2.asp?MX=. (Abril 2007)
CREACIÓN DE BASES
DE D ATOS Y OBJETOS
L a mayoría de los sistemas SQL actuales incluyen un menú, o un botón para crear bases de datos.
Muestran un cuadro de dialogo para que el usuario escriba el nombre de la nueva base de datos, el
nombre de usuario y sus password. Evidentemente, quien desee crear una nueva base de datos debe tener
los privilegios para hacerlo, eso es cuestión del administrador del sistema, él es quien gestiona los
privilegios de los usuarios.
Cuando el sistema SQL no tiene una interfaz visual para crear bases de datos, puede usarse la sentencia
CREATE DATABASE, que tiene la siguiente sintaxis:
CREATE DATABASE nombre_de_la_base_de_datos;
Por ejemplo:
CREATE DATABASE Pagos;
Existen algunas consideraciones a tomarse cuando se crea una base de datos.
Primero, no todos los sistemas dan soporte a esta sentencia de la misma forma, algunos ni siquiera la
toman en cuenta y devuelven un mensaje de error. Es muy probable que aquellos sistemas que no acepten
esta sentencia tengan una forma más visual de construir una base de datos, por ejemplo: InterBase 4.2.
Segundo, muchos sistemas de gestión de bases de datos relacionales permiten especificar un tamaño de
base de datos en términos de espacio en disco duro, como los megabytes. Se necesita entender cómo es
que un sistema de bases de datos almacena datos en disco para estimar un tamaño preciso necesario para
la nueva base de datos.
Algunos sistemas gestionan el espacio sin hacer muchas preguntas y por lo que apartan al usuario de la
necesidad de hacer estas estimaciones.
Tercero, se debe diseñar apropiadamente la base de datos. Antes que nada, los conocimientos teóricos
sobre bases de datos y sobre normalización de bases de datos tienen que estar bien asentados. De no ser
así, seguramente la base de datos fracasara en su desempeño y estructura.
Aspectos a tomar en cuenta cuando se diseña una base de datos:
1. Seguridad
2. Espacio disponible en disco
3. Velocidad en búsquedas
4. Velocidad en actualización de datos
5. Velocidad en carga de tablas vinculadas
6. Soporte del sistema de gestión de bases de datos relacionales para tablas temporales
SQL Server 2000 13
Diccionario de Datos7
Un Diccionario de Datos es una forma de documentación para el diseñador de bases de datos. Su utilidad
básica se describe en las siguientes funciones:
1. Describir el propósito de la BD y quienes serán sus usuarios.
2. Documentar las especificaciones detrás de la BD misma: en qué dispositivo estará almacenada, cuál
será el tamaño estándar de la BD junto con sus archivos lógicos (aquellos que almacenan información
sobre operaciones en algunos sistemas de gestión de BD).
3. Almacenar código fuente de SQL referente a la instalación y desinstalación de la BD, incluida también
documentación respecto al uso de herramientas de importar/exportar.
4. Proveer una detallada descripción de cada tabla dentro de la BD y explicar su propósito en términos
de procesos de negocios.
5. Documentar la estructura interna de cada tabla, incluyendo todos sus campos y sus tipos de datos con
comentarios, todos los índices y todas las vistas.
6. Contener todo el código fuente SQL para todos los procedimientos y triggers.
7. Describir reglas como pueden ser el uso de valores no nulos, valores únicos.
Algunos programas CASE auxilian al diseñador de BD en la creación y mantenimiento de un Diccionario de
Datos.
7
TEMA 2: Creando, ejecutando, modificando y borrando procedimientos almacenados (n.d.). Disponible en URL
http://www.sqlmax.com/centro/moduloIV_2.asp?MX=. (Abril 2007)
14 Compilado por: Jazmin Cabello Pérez, Julia Basurto Madrid
La página de acceso a datos se parece a un formulario pero se guarda en un documento HTML y hace
posible el acceso a la base de datos desde una Intranet o desde Internet.
Informes:
Permiten imprimir la información de base de datos en una forma eficaz y además, permite combinar los
datos de varias tablas en un documento único.
Consultas:
Facilitan la obtención de la información que se quiere ver de las bases de datos y organizarla para su uso
en informes.
Una consulta consiste de uno o más criterios para seleccionar los datos que nos interesan.
DATETIME 8 bytes Un valor de fecha u hora entre los años 100 y 9999.
1 byte por
LONGTEXT De cero a un máximo de 1.2 gigabytes.
carácter
SQL Server 2000 15
Según se
LONGBINARY De cero 1 gigabyte. Utilizado para objetos OLE.
necesite
1 byte por
TEXT De cero a 255 caracteres.
carácter
BINARY VARBINARY
BOOLEAN
LOGICAL
BIT
LOGICAL1
YESNO
BYTE INTEGER1
COUNTER AUTOINCREMENT
CURRENCY MONEY
DATE
DATETIME TIME
TIMESTAMP
FLOAT4
SINGLE IEEESINGLE
REAL
FLOAT
FLOAT8
DOUBLE IEEEDOUBLE
NUMBER
NUMERIC
INTEGER2
SHORT
SMALLINT
INT
LONG INTEGER
INTEGER4
GENERAL
LONGBINARY
OLEOBJECT
LONGCHAR
LONGTEXT MEMO
NOTE
16 Compilado por: Jazmin Cabello Pérez, Julia Basurto Madrid
ALPHANUMERIC
TEXT CHAR - CHARACTER
STRING - VARCHAR
8
Creación de tablas (n.d.). Disponible en URL http://www.astable.org/sql/SQL/node11.html (Abril 2007)
SQL Server 2000 17
Sintaxis
Inputs
action Cualquiera cláusula SQL. new o current pueden aparecer en lugar de una
variable de instancia*** siempre que una variable de instancia sea admisible en
SQL. [10]
Salidas
Descripción
El Postgres rule system permite que una acción alternativa sea realizada en updates, inserts o deletes en
tablas o clases. Actualmente se utilizan reglas para implementar vistas de tablas.
El significado de una regla es que cuando una instancia individual es accedida, actualizada, insertada o
borrada, existe una instancia actual (para consultas, actualizaciones y borrados) y una nueva instancia (para
actualizaciones y añadidos). Si el event especificado en la cláusula ON y la condition especificada en la
cláusula WHERE son verdaderas para la instancia actual la parte action de la regla es ejecutada. Antes, sin
embargo, los valores de los campos de la instancia actual y/o la nueva instancia son sustituidos por
current.attribute-name y new.attribute-name.
La parte action de la regla se ejecuta con el mismo identificador de comando y transacción que el comando
de usuario que causó la activación. [9]
Notas: Es pertinente la precaución con reglas de SQL. Si el mismo nombre de clase o variable de instancia
aparece en el event, la condition y la parte action de la regla, son considerados todos diferentes tuplas.
De forma más precisa, new y current son las únicas tuplas que son compartidas entre cláusulas. Por
ejemplo, las siguientes dos reglas tienen la misma semántica.
Cada regla puede tener el tag opcional INSTEAD. Sin este tag, la action será realizada en adición al
comando de usuario cuando el event en la parte condition de la regla aparezcan. Alternativamente, la parte
action será realizada en lugar del comando del usuario. En este último caso la instead of the user
command. En este caso, la action puede ser la palabra clave NOTHING.
Cuando se elige entre los sistemas de reescritura y reglas de instancia para una aplicación particular de una
regla, recuérdese que en el sistema de reescritura, current se refiere a la relación y algunos cualificadores
mientras que en el sistema de instancias se refiere a una instancia (tupla).
Es muy importante notar que el sistema de reescritura nunca detectará ni procesará reglas circulares. Por
ejemplo, aunque cada una de las siguientes dos reglas con aceptadas por Postgres, el comando de
recogida causará la caída de Postgres. [9]
Ejemplo 1. Ejemplo de combinación circular de reglas.
Es necesario tener permiso de definición de reglas en una clase para poder definir una regla en el. Se debe
utilizar el comando GRANT y REVOKE para modificar estos permisos.
El objeto en una regla SQL no puede ser una referencia a un array y no puede tener parámetros.
Aparte del campo "oid", los atributos del sistema no pueden ser referenciados en ningún lugar en una regla.
Entre otras cosas esto significa que las funciones de instancias (por ejemplo, foo(emp) donde emp es una
clase) no pueden ser llamadas en ningún lugar dentro de una regla.
El sistema almacena el texto de la regla y los planes de consulta como atributos de texto. Esto implica que
la creación de reglas puede fallar si la regla más sus varias internas representaciones exceden algún valor
que es del orden de una página. [9]
Uso
Hacer que Sam obtenga el mismo ajuste de salario que Joe:
Al mismo tiempo que Joe recibe un ajuste de salario, el evento será verdadero y la instancia actual de Joe y
la nueva instancia propuesta están disponibles para las rutinas de ejecución. Por lo tanto, este nuevo salario
es sustituido en la parte de acción de la regla que es subsiguientemente ejecutada. Esto propaga el salario
de Joe a Sam.
Hacer que Bill obtenga el salario de Joe cuando es accedido:
9
Manual del usuario de PostgreSQL (n.d.). Disponible en URL http://es.tldp.org/Postgresql-es/web/navegable/user/sql-createrule.html
(Mayo 2007).
20 Compilado por: Jazmin Cabello Pérez, Julia Basurto Madrid
Constraints
Son reglas que ofrecen una garantía de integridad en la información vinculada.
Existen 5 tipos de constraints:
Primary key
La clave primaria se utiliza para identificar en forma única cada línea en la tabla. Puede ser parte de
un registro real, o puede ser un campo artificial (uno que no tiene nada que ver con el registro real).
Una clave primaria puede consistir en uno o más campos en una tabla. Cuando se utilizan múltiples
campos como clave primaria, se les denomina claves compuestas.
Las claves primarias pueden especificarse cuando se crea la tabla (utilizando CREATE TABLE) o
cambiando la estructura existente de la tabla (utilizando ALTER TABLE).
El siguiente es un ejemplo para la especificación de una clave primaria cuando se crea una tabla en
sql server:
SQL Server:
CREATE TABLE Customer
(SID integer PRIMARY KEY,
Last_Name varchar(30),
First_Name varchar(30));
Foreign key
Una clave externa es un campo (o campos) que señala la clave primaria de otra tabla. El propósito de
la clave externa es asegurar la integridad referencial de los datos. En otras palabras, sólo se permiten
los valores que se esperan que aparezcan en la base de datos.
Por ejemplo, digamos que se tienen dos tablas, una tabla CUSTOMER que incluye todos los datos
del CUSTOMER, y la tabla ÓRDENES que incluye los pedidos del CUSTOMER. La restricción aquí
es que todos los pedidos deben asociarse con un CUSTOMER que ya se encuentra en la tabla
CUSTOMER. En este caso, se coloca una clave externa en la tabla ORDERS y se relaciona con la
SQL Server 2000 21
clave primaria de la tabla CUSTOMER. De esta forma, se asegura que todos los pedidos en la tabla
ORDERS estén relacionados con un CUSTOMER en la tabla CUSTOMER. En otras palabras, la tabla
ORDERS no puede contener información de un CUSTOMER que no se encuentre en la tabla
CUSTOMER.
La estructura de estas dos tablas será la siguiente:
En el ejemplo anterior, la columna Customer_SID en la tabla ORDERS es una clave externa señalando la
columna SID en la tabla CUSTOMER.
A continuación se muestra cómo especificar la clave externa a la hora de crear la tabla ORDERS:
SQL Server:
CREATE TABLE ORDERS
(Order_ID integer primary key,
Order_Date datetime,
Customer_SID integer references CUSTOMER(SID),
Amount double);
Unique key
La restricción UNIQUE asegura que todos los valores en una columna sean distintos.
Por ejemplo, en la siguiente instrucción,
CREATE TABLE Customer
(SID integer Unique,
Last_Name varchar (30),
First_Name varchar(30));
La columna “SID” no puede incluir valores duplicados, mientras dicha restricción no se aplica para
columnas “Last_Name” y “First_Name”.
Una columna que se especifica como clave primaria también puede ser única. Al mismo tiempo, una
columna que es única puede o no ser clave primaria.
Not Null
En forma predeterminada, una columna puede ser NULL. Si no desea permitir un valor NULL en una
columna, querrá colocar una restricción en esta columna especificando que NULL no es ahora un
valor permitido.
Por ejemplo, en la siguiente instrucción,
CREATE TABLE Customer
(SID integer NOT NULL,
Last_Name varchar (30) NOT NULL,
22 Compilado por: Jazmin Cabello Pérez, Julia Basurto Madrid
First_Name varchar(30));
Las columnas “SID” y “Last_Name” no incluyen NULL, mientras que “First_Name” puede incluir
NULL.
Check
La restricción CHECK asegura que todos los valores en una columna cumplan ciertas condiciones.
Por ejemplo, en la siguiente instrucción,
CREATE TABLE Customer
(SID integer CHECK (SID > 0),
Last_Name varchar (30),
First_Name varchar(30));
La columna “SID” sólo debe incluir enteros mayores a 0. Las constraints tienen tres propósitos básicos:
1. Forzar integridad. Una constraint con estado ENABLED evita que, sobre las tablas, puedan
modificarse valores de forma que no se satisfaga la regla de la constraint.
Las constraints pueden estar ENABLED o DISABLED (habilitadas o deshabilitadas). Las constraints
habilitadas cumplen éste propósito. Ningún dato introducido o modificado viola la integridad de la regla
de la constraint. De este modo, sobre una primary key ENABLED no se permite un insert sobre una fila
ya existente. No obstante, si la constraint está en el estado ENABLED NOVALIDATE, no se
permitirán cambios que violen la regla, pero no se verificarán que los datos existentes la cumplan.
2. Validar la información. Una constraint con estado DISABLED VALIDATE realiza una validación
sobre los datos, certificando que la información contenida en las tablas satisface la regla de la
constraint.
Las constraints pueden tener un estado VALIDATE o NOVALIDATE independientemente de si están
ENABLED o DISABLED.
Las constraints con VALIDATE cumplen este propósito 2: la información existente está validada. No
obstante, si la constraint está deshabilitada con DISABLED VALIDATE, no se permitirán cambios sobre
las columnas afectadas, ya que aunque la constraint no está habilitada, certifica que los datos existentes
son válidos y cumplen con la regla de la constraint.
3. Asumir la validez de la información. Una constraint con estado RELY no verifica la información, ni
fuerza la integridad para las modificaciones y asume que los datos introducidos satisfacen la regla de la
constraint.
Entonces, las constraints pueden estar en estado RELY o NORELY (también conocido como BELIEF)
cuando las constraints están en estado DISABLED NOVALIDATE.
Las constraints en ese estado cumplen con este propósito 3: Asumen que la información es correcta y
aportan al optimizador información válida para el uso de vistas materializadas, optimización de se desea,
etc. De este modo, por ejemplo, al optimizador le puede resultar mucho más fácil encontrar tablas FACT
o DIMENSION por las constraints de foreign key entre las tablas.
Las constraints DISABLED NOVALIDATE RELY ni validan la información de la tabla, ni comprueban que
las modificaciones cumplen las reglas de las restricciones.
SQL Server 2000 23
Indices10
Es fácil encontrar bases de datos con tablas cuyo tamaño va aumentando de manera considerable
pudiendo contener hasta millones de registros. En estos casos el acceso a determinada información, puede
ser lento y costoso. Habrá operaciones de consulta que obliguen a recorrer la tabla entera, desde su primer
registro hasta el último, esto repercute directamente en la velocidad de la aplicación, convirtiéndola en una
aplicación lenta y pesada. De ahí la importancia del diseño de la base de datos.
Para acelerar el acceso a la información se cuenta con los índices, un índice almacena una serie de claves
que permite al servidor acelerar sus consultas. El índice no sólo sirve para aumentar la velocidad, sirve
además para fijar un orden en los registros, tener registros únicos, etc., de modo que cuando se modifica el
contenido de una tabla en la cual afecta algún índice, SQL SERVER debe modificar los datos de la tabla y
los índices que afectan a la misma.
Un índice tiene un funcionamiento similar al índice de un libro, guardando parejas de elementos: el elemento
que se desea indexar y su posición en la base de datos. Para buscar un elemento que esté indexado, sólo
hay que buscar en el índice dicho elemento para, una vez encontrado, devolver el registro que se encuentre
en la posición marcada por el índice.
Los índices se pueden construir sobre árboles B, B+, B* o sobre una mezcla de ellos.
Para los índices en SQL
Almacena los datos en páginas de 8 KB
Un header de 96 bytes vincula estas páginas.
Los datos en las páginas se almacenan en orden (según la llave de búsqueda).
El parámetro fill factor se usa para mantener las páginas ordenadas de forma eficiente.
Al crear el índice ordena las páginas de manera tal que cada una deje cierto porcentaje mínimo
desocupado.
Un Árbol-B mantiene el índice de las páginas de datos.
Para crear un índice se usa create index, por ejemplo
create <<modif.>> index mi_indice on tabla atributo
en donde <<modif.>> puede ser unique, clustered, nonclustered.
• unique: virtualmente equivalente a una llave primaria
• clustered: ordena la tabla por el atributo indicado a lo más una por tabla
• nonclustered: no ordena la tabla, pueden ser muchas por tabla.
10
Pérez Rojas, Jorge (2006). Bases de Datos – Indexación y Hashing. Disponible en URL
(http://ing.utalca.cl/~jperez/bd/documentos/indices.pdf. (Mayo 2007).
Índice (bases de datos) (n.d.). Disponible en URL http://es.wikipedia.org/wiki/%C3%8Dndice_(base_de_datos). (Mayo 2007).
11
Manivesa, Cesar. Tablas temporales en el SQL Server. Disponible en URL
http://www.programacion.net/bbdd/articulo/man_tablastemp/. (Mayo 2007).
24 Compilado por: Jazmin Cabello Pérez, Julia Basurto Madrid
posteriormente, guardar resultados parciales, analizar grandes cantidades de filas. Hay muchos casos en
los que se pueden necesitar estas tablas temporales.
Tipos de tablas temporales
Las tablas temporales son de dos tipos en cuanto al alcance la tabla. Tenemos tablas temporales locales y
tablas temporales globales.
#locales: Las tablas temporales locales tienen una # como primer carácter en su nombre y sólo se
pueden utilizar en la conexión en la que el usuario las crea. Cuando la conexión termina la tabla temporal
desaparece.
##globales Las tablas temporales globales comienzan con ## y son visibles por cualquier usuario
conectado al SQL Server. Además, estás tablas desaparecen cuando ningún usuario está haciendo
referencias a ellas, no cuado se desconecta el usuario que la creo.
Temp Realmente hay un tipo más de tablas temporales. Si se crea una tabla dentro de la base de datos
temp es una tabla real en cuanto a que se puede utilizar como cualquier otra tabla en cualquier base de
datos, y es temporal en cuanto a que desaparece en cuanto se apaga el servidor.
Funcionamiento de tablas temporales
Crear una tabla temporal es igual que crear una tabla normal. Por ejemplo:
CREATE TABLE #TablaTemporal (Campo1 int, Campo2 varchar(50))
Y se usan de manera habitual.
INSERT INTO #TalbaTemporal VALUES (1,'Primer campo')
INSERT INTO #TalbaTemporal VALUES (2,'Segundo campo')
SELECT * FROM #TablaTemporal
Como vemos no hay prácticamente limitaciones a la hora de trabajar con tablas temporales (una limitación
es que no pueden tener restricciones FOREING KEY).
Optimizar el uso de tablas temporales
El uso que se le puede dar a este tipo de tablas es infinito, pero siempre teniendo en cuenta unas cuantas
directivas que deben seguirse para que ralenticen el trabajo lo menos posible.
Por ejemplo no es mala costumbre crear las tablas temporales con comandos DDL como en el ejemplo
anterior (CREATE TABLE) y luego rellenarlas comandos INSERT o con INSERT INTO. Es cierto que eso
mismo se puede lograr en un único paso con SELECT INTO, pero esta opción es peor porque los bloqueos
que se adquieren sobre objetos del sistema duran más tiempo.
Como siempre es mejor pedir los campos que se quieren y no poner el típico SELCT * FROM... De la misma
manera es muy recomendable calificar las filas que se quieren y no tener filas que no se van a utilizar en
tablas temporales.
Otra buena costumbre es borrar nosotros nuestras tablas. Es cierto que al acabar la conexión las tablas
temporales locales desaparecen, pero si se tiene un conjunto de sentencias largo y se crea una tabla
temporal al principio y se va a utilizar en el resto del tiempo no tiene sentido tener esa tabla ahí ocupando
espacio y memoria.
Si las tablas temporales son grandes una opción para aumentar el rendimiento es crear un índice que ayude
a recuperar los datos de esa tabla (para tablas pequeñas es un gasto inútil porque nunca se usarán los
índices).
Colocar la base de datos tempdb en un disco dedicado solo para esta función aumentará el rendimiento
global del sistema si se hace un uso intensivo de tablas temporales.
Y por último pero no menos importante, no crear tablas temporales dentro de transacciones ni dentro de
triggers. Ya que la concurrencia de la base de datos sufrirá mucho.
SQL Server 2000 25
3.8 V istas. 12
Creación de vistas
A veces, para obtener datos de varias tablas se construye una sentencia SELECT compleja y, si en otro
momento se necesita realizar esa misma consulta, se tiene que construir de nuevo la sentencia SELECT
anterior. Sería bastante cómodo obtener los datos de una consulta compleja con una simple sentencia
SELECT. Las vistas solucionan ese problema. Mediante una consulta simple de una vista cabe la
posibilidad de obtener datos de una consulta compleja. Una vista es una tabla lógica que permite acceder a
la información de una o varias tablas. No contiene información por si misma, sino que su información está
basada en la que contiene una o varias tablas, llamadas tablas base. Si se suprime una tabla, su vista
asociada se invalida. Las vistas tienen la misma estructura que una tabla: filas y columnas y se tratan de
forma muy semejante. El formato para crear una vista es el siguiente:
CREATE VIEW <nombre_vista>
[( columna1 [,( <columna2) ]]
AS <consulta>
Donde:
nombre_vista es el nombre de la vista.
columna1, columna2,. . . son los nombres de las columnas que contendrá la vista. Si no se ponen,
se asumirán los nombres de las columnas que devuelva la consulta.
AS consulta determinará las columnas y tablas que contendrá la vista.
Ejemplo: Crear por ejemplo una vista que contenga parte de las columnas de una tabla EMPLEADO:
CREATE VIEW DEP_30
AS SELECT APELLIDO, OFICIO, SALARIO FROM EMPLEADO WHERE NRO_DEPT=30
De esta manera, se obtiene una vista que contendrá los datos de las columnas APELLIDO, OFICIO y
SALARIO de las filas cuyo NRO_DEPT sea igual a 30.
Se pudo haber creado dando otros nombres a las columnas:
CREATE VIEW DEP_30 (APELL, OFIC, SAL)
AS SELECT APELLIDO, OFICIO, SALARIO FROM EMPLEADO WHERE NRO_DEPT=30
Se puede visualizar los nombres de las vistas creadas con sus textos de la siguiente manera:
SELECT VIEW_NAME, TEXT FROM USER_VIEWS
Borrado de vistas
Es posible borrar las vistas con la orden DROP VIEW:
DROP VIEW <nombre_vista>
Ejemplo:
DROP VIEW DEP_30
12
Creación y uso de vistas (n.d.). Disponible en URL http://www.astable.org/sql/SQL/node23.html
26 Compilado por: Jazmin Cabello Pérez, Julia Basurto Madrid
L as consultas de selección se utilizan para indicar al motor de datos que devuelve información de las
bases de datos, esta información es devuelta en forma de conjunto de registros que se pueden
almacenar en un objeto recordset. Este conjunto de registros es modificable.
La sintaxis básica de una consulta de selección es la siguiente:
En donde campos es la lista de campos que se deseen recuperar y tabla es el origen de los mismos, por
ejemplo:
Esta consulta devuelve un recordset con el campo nombre y teléfono de la tabla clientes.
Criterios de Selección
Antes de comenzar hay que destacar tres detalles de vital importancia. El primero de ellos es que cada vez
que se desee establecer una condición referida a un campo de texto la condición de búsqueda debe ir
encerrada entre comillas simples; la segunda es que no se posible establecer condiciones de búsqueda en
los campos memo y; la tercera y última hace referencia a las fechas.
Las fechas se deben escribir siempre en formato mm-dd-aa en donde mm representa el mes, dd el día y aa
el año, hay que prestar atención a los separadores -no sirve la separación habitual de la barra (/), hay que
utilizar el guión (-) y además la fecha debe ir encerrada entre almohadillas (#). Por ejemplo si deseamos
referirnos al día 3 de Septiembre de 1995 deberemos hacerlo de la siguiente forma;
#09-03-95# ó #9-3-95#.
Operadores Lógicos
Los operadores lógicos soportados por SQL son: AND, OR, XOR, Eqv, Imp, Is y Not.
A excepción de los dos últimos todos poseen la siguiente sintaxis:
<expresión1> operador <expresión2>
13
Casares, Claudio. Tutorial de SQL. Disponible en URL http://www.asptutor.com/zip/sql.pdf. (Mayo 2007)
28 Compilado por: Jazmin Cabello Pérez, Julia Basurto Madrid
En donde expresión1 y expresión2 son las condiciones a evaluar, el resultado de la operación varía en
función del operador lógico. La tabla adjunta muestra los diferentes posibles resultados:
SELECT * FROM Empleados WHERE Edad > 25 AND Edad < 50;
SELECT * FROM Empleados WHERE (Edad > 25 AND Edad < 50) OR Sueldo = 100;
SELECT * FROM Empleados WHERE NOT Estado = 'Soltero';
SQL Server 2000 29
SELECT * FROM Empleados WHERE (Sueldo > 100 AND Sueldo < 500) OR (Provincia =
'Madrid' AND Estado = 'Casado');
Intervalos de Valores
Para indicar que se desean recuperar los registros según el intervalo de valores de un campo se emplea el
operador Between cuya sintaxis es:
campo [Not] Between valor1 And valor2 (la condición Not es opcional)
En este caso la consulta devolvería los registros que contengan en "campo" un valor incluido en el intervalo
valor1, valor2 (ambos inclusive). Si se antepone la condición Not devolverá aquellos valores no incluidos en
el intervalo.
Agrupación de Información
La sentencia "Select" posibilita agrupar uno o más conjuntos de filas. El agrupamiento se lleva a cabo
mediante la cláusula "GROUP BY" por las columnas especificadas y en el orden especificado. Formato:
SELECT…
FROM…
GROUP BY COLUMNA1, COLUMNA2, COLUMNAN…
HAVING CONDICION
GROUP BY …
30 Compilado por: Jazmin Cabello Pérez, Julia Basurto Madrid
Los datos seleccionados en la sentencia "Select" que lleva el "Group By" deben ser:
Una constante.
Una función de grupo (SUM, COUNT, AVG…)
Una columna expresada en el Group By.
La cláusula Group By sirve para calcular propiedades de uno o más conjuntos de filas. Si se selecciona más
de un conjunto de filas, Group By controla que las filas de la tabla original sean agrupadas en un temporal.
La cláusula Having se emplea para controlar cual de los conjuntos de filas se visualiza. Se evalúa sobre la
tabla que devuelve el Group By. No puede existir sin Group By.
Having es similar al Where, pero trabajo con grupos de filas; pregunta por una característica de grupo, es
decir, pregunta por los resultados de las funciones de grupo, lo cual Where no pude hacer. [14]
un valor así como el valor para dicho campo. Cuando no se especifica dicho campo, se inserta el valor
predeterminado o Null. Los registros se agregan al final de la tabla.
También se puede utilizar INSERT INTO para agregar un conjunto de registros pertenecientes a otra tabla o
consulta utilizando la cláusula SELECT. FROM como se mostró anteriormente en la sintaxis de la consulta
de adición de múltiples registros. En este caso la cláusula SELECT especifica los campos que se van a
agregar en la tabla destino especificada. La tabla destino u origen puede especificar una tabla o una
consulta.
Si la tabla destino contiene una clave principal, hay que asegurarse que es única, y con valores no-Null; si
no es así, no se agregarán los registros. Si se agregan registros a una tabla con un campo Contador, no se
debe incluir el campo Contador en la consulta. Se puede emplear la cláusula IN para agregar registros a
una tabla en otra base de datos.
Se pueden averiguar los registros que se agregarán en la consulta ejecutando primero una consulta de
selección que utilice el mismo criterio de selección y ver el resultado. Una consulta de adición copia los
registros de una o más tablas en otra. Las tablas que contienen los registros que se van a agregar no se
verán afectadas por la consulta de adición. En lugar de agregar registros existentes en otra tabla, se puede
especificar los valores de cada campo en un nuevo registro utilizando la cláusula VALUES. Si se omite la
lista de campos, la cláusula VALUES debe incluir un valor para cada campo de la tabla, de otra forma fallará
INSERT. [14]
Actualización
UPDATE crea una consulta de actualización que cambia los valores de los campos de una tabla
especificada basándose en un criterio específico. Su sintaxis es:
UPDATE Tabla SET Campo1=Valor1, Campo2=Valor2, ... CampoN=ValorN WHERE
Condición;
UPDATE es especialmente útil cuando se desea cambiar un gran número de registros o cuando éstos se
encuentran en múltiples tablas. Puede cambiar varios campos a la vez. El ejemplo siguiente incrementa los
valores Cantidad pedidos en un 10 por ciento y los valores Transporte en un 3 por ciento para aquellos que
se hayan enviado al Reino Unido.:
UPDATE Pedidos SET Pedido = Pedidos * 1.1, Transporte = Transporte * 1.03
WHERE PaisEnvío = 'ES';
UPDATE no genera ningún resultado. Para saber qué registros se van a cambiar, hay que examinar primero
el resultado de una consulta de selección que utilice el mismo criterio y después ejecutar la consulta de
actualización.
Si en una consulta de actualización suprimimos la cláusula WHERE todos los registros de la tabla señalada
serán actualizados.
Borrado
DELETE crea una consulta de eliminación que elimina los registros de una o más de las tablas listadas en la
cláusula FROM que satisfagan la cláusula WHERE. Esta consulta elimina los registros completos, no es
posible eliminar el contenido de algún campo en concreto. Su sintaxis es:
DELETE es especialmente útil cuando se desea eliminar varios registros. En una instrucción DELETE con
múltiples tablas, debe incluir el nombre de tabla (Tabla.*). Si especifica más de una tabla desde la que
eliminar registros, todas deben ser tablas de muchos a uno. Si desea eliminar todos los registros de una
tabla, eliminar la propia tabla es más eficiente que ejecutar una consulta de borrado.
Se puede utilizar DELETE para eliminar registros de una única tabla o desde varios lados de una relación
uno a muchos. Las operaciones de eliminación en cascada en una consulta únicamente eliminan desde
varios lados de una relación. Por ejemplo, en la relación entre las tablas Clientes y Pedidos, la tabla Pedidos
es la parte de muchos por lo que las operaciones en cascada solo afectaran a la tabla Pedidos. Una
consulta de borrado elimina los registros completos, no únicamente los datos en campos específicos. Si
desea eliminar valores en un campo especificado, crear una consulta de actualización que cambie los
valores a Null.
Una vez que se han eliminado los registros utilizando una consulta de borrado, no puede deshacer la
operación. Si se quiere saber qué registros se eliminarán, primero hay que examinar los resultados de una
consulta de selección que utilice el mismo criterio y después ejecutar la consulta de borrado. Se debe tener
copias de seguridad de los datos en todo momento. Si se eliminan los registros equivocados se podrán
recuperar desde las copias de seguridad.
DELETE * FROM Empleados WHERE Cargo = 'Vendedor'. [17, 18]14
LASTDAY (fecha)= Devuelve la fecha del último día del mes que contiene "fecha".
NEXT_DAY (fecha, cad)= Devuelve la fecha del primer día de la semana indicado por
"cad" después de la fecha indicada por "fecha".
14
Álvarez Marañón, Gonzalo (1997 – 2002). Acceso a BD. Disponible en URL http://www.iec.csic.es/criptonomicon /bd/repaso.html.
(Mayo 2007).
SQL Server 2000 33
LPAD (cad1, n[,cad2])= Añade caracteres a la izquierda de la cadena hasta que tiene
una cierta longitud.
RPAD (cad1, n[,cad2])= Añade caracteres a la derecha de la cadena hasta que tiene una
cierta longitud.
Funciones cadenas15:
CONCAT(cadena1,cadena2) Devuelve una cadena resultante de concatenar 'cadena1' y 'cadena2'.
LOWER(ch) Devuelve la cadena 'ch' con todas sus letras convertidas a minúsculas.
UPPER(ch) Devuelve la cadena 'ch' con todas sus letras convertidas a mayúsculas.
15
. Funciones de cadenas de caracteres (n.d.). Disponible en URL http://www.astable.org/sql/SQL/node48.html. (Mayo 2007)
34 Compilado por: Jazmin Cabello Pérez, Julia Basurto Madrid
Funciones aritméticas
ABS(n) Devuelve el valor absoluto de n.
POWER(n, exp) Devuelve la potencia de un número.
AVG(n) Calcula el valor medio de n, ignorando los valores nulos.
SELECT AVG(EDAD) FROM EMPLEADOS
COUNT(* | expresión) Cuenta el número de veces que 'expresión' evalúa algún dato.
SELECT COUNT(*) FROM EMPLEADOS
MAX(expresión) Calcula el valor máximo de 'expresión'.
SELECT MAX(SALARIO) FROM EMPLEADOS
MIN(expresión) Calcula el valor mínimo de 'expresión'.
SELECT MIN(SALARIO) FROM EMPLEADOS
SUM(expresión) Calcula la suma de valores de 'expresión'.
SELECT SUM(SALARIO) FROM EMPLEADOS
DISTINCT En las funciones de grupo se pueden indicar DISTINCT y ALL como argumentos. Su
uso más normal es en COUNT
SELECT COUNT(OFICIO) FROM EMPLEADOS
SELECT COUNT(DISTINCT OFICIO) FROM EMPLEADOS
SELECT SUM
Otras funciones
DUMP( columna ) Retorna información de almacenamiento para la columna indicada.
GREATEST( expr1, expr2 , ... Retorna la expresión mayor.
CONSU LTAS AVA NZADAS
CON SQL 16
U na subconsulta es una instrucción SELECT anidada dentro de otra instrucción SELECT: SELECT
INTO, INSERT INTO, DELETE, o UPDATE o dentro de otra subconsulta. Los formatos para las
instrucciones de subconsultas son las siguientes:
WHERE expression [NOT] IN (subconsulta)
WHERE expression operador_comparacion [ANY | ALL] (subconsulta)
WHERE [NOT] EXISTS (subconsulta )
Una subconsulta puede devolver:
1. Una sola columna o un solo valor en cualquier lugar en donde pueda utilizarse una expresión de
un sólo valor y puede compararse usando los siguientes operadores: =,<,>,<=,>= ,<>,!> y !<.
2. Una sola columna o muchos valores que se pueden utilizar con el operador de comparación de
listas IN en la cláusula WHERE.
3. Muchas filas que pueden utilizarse para comprobar la existencia, usando la palabra EXISTS en la
cláusula WHERE.
Se puede usar el predicado ANY o SOME, para recuperar registros de la consulta principal, que
satisfagan la comparación con cualquier otro registro recuperado en la subconsulta.
Ejemplo: El siguiente ejemplo muestra los titulos que recibieron adelanto superior a la cantidad
adelantada mínima pagada por Algodata Infosystem
USE pubs
go
SELECT title
FROM titles
WHERE advance > ANY
(SELECT advance
FROM publishers INNER JOIN titles
ON titles.pub_id = publishers.pub_id
AND pub_name = ‘Algodata Infosystems’)
En ejemplo anterior se usa el operador de comparación >, es así que, >ALL significa mayor que
cualquier valor; es decir, mayor que el valor máximo. Por ejemplo, >ALL (1, 2, 3,....7) significa mayor
que 7. De manera similar, >ANY significa mayor que, como mínimo, un valor, es decir, mayor que el
mínimo. En consecuencia, >ANY (1, 2, 3, ... 7) significa mayor que 1.
16
Reyes Paredes P.” Subconsultas para SQL Server”. “Cómo aprovechar la funcionalidad de una subconsulta”. 2005.
<http://www.elguille.info/colabora/NET2005/Percynet_Subconsultas_en_SQL_Server.htm> (04/Oct/2005)
36 Compilado por: Jazmin Cabello Pérez, Julia Basurto Madrid
UPDATE
DELETE
SQL Server 2000 37
Rendimiento y resultados
En muchos casos puede usarse una operación de combinación en lugar de una consulta, no obstante
algunas instancias pueden procesarse sólo con una subconsulta. En ocasiones una operación de
combinación puede producir un mejor rendimiento que una subconsulta, pero por lo general se observa
muy poca diferencia en el rendimiento. Sin embargo, el uso de grandes anidamientos de subconsultas
puede afectar seriamente el rendimiento. De manera general la utilización de combinaciones producirá
los mejores resultados. Veamos un ejemplo:
Haciendo uso de una subconsulta podríamos realizar la siguiente consulta:
La subconsulta siempre está encerrada entre paréntesis y a menos que se vaya a ejecutar una
subconsulta correlacionada termina antes de que se procese la consulta externa. Una subconsulta
puede contener otra subconsulta, y esta subconsulta puede, a su vez, contener otra subconsulta, y así
sucesivamente. Los recursos del sistema (como la memoria disponible) limitan el número de
subconsultas que pueden procesarse. Se puede anidar subconsultas hasta 32 niveles, pero esto como
se menciono anteriormente, depende de los recursos disponibles del sistema. He aquí otro “botón” como
ejemplo:
Lista los campos CATEGORYID,CATEGORYNAME de la tabla categorías donde el producto de dicha
categoría tiene los campos UNITPRICE y QUANTITY iguales y además UNITPRICE está entre 4 y 42.
Toda esta información será ordenada descendentemente por el campo CATEGORYNAME.
SELECT CATEGORYID,CATEGORYNAME
FROM CATEGORIES
WHERE CATEGORYID IN
(SELECT CATEGORYID
FROM PRODUCTS
WHERE UNITPRICE IN
(SELECT QUANTITY
FROM [ORDER DETAILS]
WHERE UNITPRICE BETWEEN 40 AND 42)
)
ORDER BY CATEGORYNAME DESC
38 Compilado por: Jazmin Cabello Pérez, Julia Basurto Madrid
Combinación interna.
La combinación interna nos permite mostrar los datos de dos o más tablas a través de una condición
WHERE. Para realizar la consulta combinada entre estas dos tablas debemos escribir una consulta
SELECT en cuya cláusula FROM escribiremos el nombre de las dos tablas, separados por comas, y una
condición WHERE que obligue a que el código de marca de la tabla de coches sea igual al código de la
tabla de marcas.
Lo más sencillo es ver un ejemplo directamente:
SELECT tCoches.matricula,
tMarcas.marca,
tCoches.modelo,
tCoches.color,
tCoches.numero_kilometros,
tCoches.num_plazas
FROM tCoches, tMarcas
WHERE tCoches.marca = tMarcas.codigo
Démonos cuenta que hemos antepuesto el nombre de cada tabla al nombre del campo, esto no es
obligatorio si los nombres de campos no se repiten en las tablas, pero es aconsejable para evitar
conflictos de nombres entre campos. Por ejemplo, si para referirnos al campo marca no anteponemos el
nombre del campo la base de datos no sabe si queremos el campo marca de la tabla tCoches, que
contiene el código de la marca, o el campo marca de la tabla tMarcas, que contiene el nombre de la
marca.
Otra opción es utilizar la cláusula INNER JOIN. Su sintaxis es idéntica a la de una consulta SELECT
habitual, con la particularidad de que en la cláusula FROM sólo aparece una tabla o vista, añadiéndose
el resto de tablas a través de cláusulas.
INNER JOIN . SELECT [ALL | DISTINCT ]
<nombre_campo> [{,<nombre_campo>}]
FROM <nombre_tabla>
[{INNER JOIN <nombre_tabla> ON <condicion_combinacion>}]
[WHERE <condicion> [{ AND|OR <condicion>}]]
[GROUP BY <nombre_campo> [{,<nombre_campo >}]]
SQL Server 2000 39
Esta consulta devolverá todos los registros de la tabla tCoches, independientemente de que tengan
marca o no. En el caso de que el coche no tenga marca se devolverá el valor null para los campos de
la tabla tMarcas.
40 Compilado por: Jazmin Cabello Pérez, Julia Basurto Madrid
Esta consulta devolverá los registros de la tabla tCoches que tengan marca relacionada y todos los
registros de la tabla tMarcas, tengan algún registro en tCoches o no.
Visualmente (la consulta devuelve los datos en azul).
Unión
La cláusula UNION permite unir dos o más conjuntos de resultados en uno detrás del otro como si se
tratase de una única tabla. De este modo podemos obtener los registros de más de una tabla “unidos”.
La sintaxis corresponde a la de varias SELECT unidas a través de UNION, como se muestra a
continuación:
SELECT [ALL | DISTINCT ]
<nombre_campo> [{,<nombre_campo>}]
FROM <nombre_tabla>
[{LEFT|RIGHT OUTER JOIN <nombre_tabla> ON <condicion_combinacion>}]
[WHERE <condicion> [{ AND|OR <condicion>}]]
[GROUP BY <nombre_campo> [{,<nombre_campo >}]]
[HAVING <condicion>[{ AND|OR <condicion>}]]
{
UNION [ALL | DISTINCT ]
SELECT [ALL | DISTINCT ]
<nombre_campo> [{,<nombre_campo>}]
FROM <nombre_tabla>
[{LEFT|RIGHT OUTER JOIN <nombre_tabla> ON <condicion_combinacion>}]
[WHERE <condicion> [{ AND|OR <condicion>}]]
[GROUP BY <nombre_campo> [{,<nombre_campo >}]]
[HAVING <condicion>[{ AND|OR <condicion>}]]
}
SQL Server 2000 41
17
Sánchez Herrarte P. “Consultas combinadas. JOINS”. “Consultas combinadas”. 2005.
<http://www.devjoker.com/asp/ver_contenidos.aspx?co_contenido=17> (22/10/2005)
42 Compilado por: Jazmin Cabello Pérez, Julia Basurto Madrid
TRANSACT SQL Y
PROCEDIMIENTOS
ALMACENADOS
T RANSACT - SQL: Ésta es una versión de SQL (Structured Query Languaje) usada como lenguaje
de programación para SQL Server. SQL es un conjunto de comandos que permite especificar la
información que se desea restaurar o modificar. Con Transact – SQL se puede tener acceso a la
información, realizar búsquedas, actualizar y administrar sistemas de Bases de Datos Relacionales.
Los procedimientos almacenados son un conjunto precompilado de instrucciones Transact-SQL (*)
almacenadas bajo un solo nombre y procesadas como una unidad. Los procedimientos almacenados
pueden recibir parámetros - en base a los cuales realizar distintas acciones - y devolver datos de varias
formas distintas (principalmente como parámetros de salida y como conjuntos de resultados o
Recordsets).
Los procedimientos almacenados están compilados. Traducción básica: El conjunto de instrucciones
que utiliza el equipo para llevar a cabo la operación solicitada se divide hasta el menor nivel posible
disponible en la plataforma en la que está trabajando. (Punto crucial: la velocidad.) La alternativa sería
crear consultas y tareas de mantenimiento de bases de datos que se ejecutaran cada vez que se
enviara la petición, lo que exigiría de su SQL Server mucho más trabajo del necesario.
Hay otras muchas ventajas por utilizar y crear procedimientos almacenados, como la capacidad de
administrar de manera centralizada las tareas reutilizables.
Categoría Instrucciones
18
Ponce T.(2006). SQL.Procedimientos almacenados http://www.mygnet.co/articulos/sql/775/index.php (23/08/2006).
44 Compilado por: Jazmin Cabello Pérez, Julia Basurto Madrid
SET NUMERIC_ROUNDABORT
SET PARSEONLY
SET QUERY_GOVERNOR_COST_LIMIT
SET ROWCOUNT
SET TEXTSIZE
Sentencia GOTO
PL/SQL dispone de la sentencia GOTO. La sentencia GOTO desvía el flujo de ejecución a una
determinada etiqueta.
En PL/SQL las etiquetas se indican del siguiente modo: << etiqueta >>
El siguiente ejemplo ilustra el uso de GOTO.
DECLARE
flag NUMBER;
BEGIN
flag :=1 ;
IF (flag = 1) THEN
GOTO paso2;
END IF;
<<paso1>>
dbms_output.put_line(‘Ejecucion de paso 1’);
<<paso2>>
dbms_output.put_line(‘Ejecucion de paso 2’);
END;
Bucles
En PL/SQL tenemos a nuestra disposición los siguientes iteradores o bucles:
LOOP
WHILE
FOR
El bucle LOOP, se repite tantas veces como sea necesario hasta que se fuerza su salida con la
instrucción EXIT. Su sintaxis es la siguiente
LOOP
Instrucciones
IF (expresion) THEN
19
Herrarte Sánchez Pedro “Estructuras de control en PL/SQL”.” Estructuras de control de flujo”. “2006”
<http://www.devjoker.com/asp/ver_contenidos.aspx?co_contenido=33> (01/04/2006)
Herrarte Sánchez Pedro “Estructuras de control en PL/SQL”.” Estructuras de control de flujo”. “2006”
<http://www.devjoker.com/asp/ver_contenidos.aspx?co_contenido=33> (01/04/2006)
46 Compilado por: Jazmin Cabello Pérez, Julia Basurto Madrid
Instrucciones
EXIT;
END IF;
END LOOP;
El bucle WHILE, se repite mientras que se cumpla expresión.
END LOOP;
En el caso de especificar REVERSE el bucle se recorre en sentido inverso.
20
Libros en pantalla de SQL Server, SET (Transact-SQL) <http://msdn2.microsoft.com/es-
es/library/ms190356.aspx>
SQL Server 2000 47
Máximo en curso para los datos de tipo texto imagen, con un valor
@@TEXTSIZE
por omisión de 4K.
mensaje solicitando el valor de cada uno de los parámetros. Si deseamos ejecutarlas desde una
aplicación hay que asignar primero el valor de los parámetros y después ejecutarlas. Su sintaxis es la
siguiente:
PARAMETERS nombre1 tipo1, nombre2 tipo2, ... , nombreN tipoN Consulta
En donde:
Parte Descripción
nombre Es el nombre del parámetro.
tipo Es el tipo de datos del parámetro.
Puede utilizar nombre pero no tipo de datos en una cláusula WHERE o HAVING.
PARAMETERS Precio_Minimo Currency, Fecha_Inicio DateTime;
SELECT IDPedido, Cantidad FROM Pedidos WHERE Precio > Precio_Minimo
AND FechaPedido >= Fecha_Inicio;
Ejemplo:
PARAMETERS [Escriba los Apellidos:] Text; SELECT * FROM Empleados
WHERE [Escriba los Apellidos:] = [Apellidos];
La ejecución desde la base de datos solicita al usuario los apellidos del empleado y después
muestra los resultados.
Cursores21
Los cursores son una herramienta de SQL que nos permite recorrer el resultado de una consulta SQL y
realizar operaciones en cada paso de ésta.
Es así como nos ayuda a realizar operaciones que de otro modo serían más complejas o irrealizables. A
continuación se coloca el código de un cursor muy simple para el Analizador de Consultas de SQL
Server.
/* Este cursor deja las contraseñas iguales al nombre de usuario.
La tabla Cliente tiene estos tres campos: CliCod, CliUser, CliPass */
• declaramos las variables
declare @cod as int
declare @user as varchar(50)
declare @pass as varchar(50)
• declaramos un cursor llamado “CURSORITO”. El select debe contener sólo los
campos a utilizar.
declare CURSORITO cursor for
select CliCod, CliUser, CliPass from Cliente
open CURSORITO
• Avanzamos un registro y cargamos en las variables los valores encontrados en el
primer registro
fetch next from CURSORITO
into @cod, @user, @pass
while @@fetch_status = 0
21
Matias Thayer “SQL”. “Cursores en SQL Server”, 2005 <http://www.maestrosdelweb.com/editorial/cursql/>. (16.02.2005)
SQL Server 2000 49
begin
update Cliente set CliPass= @user where CliCod=@cod
• Avanzamos otro registro
fetch next from CURSORITO
into @cod, @rut, @nombres
end
• cerramos el cursor
close CURSORITO
deallocate CURSORITO
Asociada a esta idea de anidamiento existe una variable global @@TRANCOUNT que tiene valor 0 si
no existe ningún nivel de anidamiento, 1 si hay una transacción anidada, si estamos en el segundo nivel
de anidamiento y así sucesivamente.
La dificultad de trabajar con transacciones anidadas está en el comportamiento que tienen ahora las
sentencias ‘COMMIT TRAN’ y ‘ROLLBACK TRAN’
ROLLBACK TRAN: Dentro de una transacción anidada esta sentencia deshace todas las
transacciones internas hasta la instrucción BEGIN TRANSACTION más externa.
COMMIT TRAN: Dentro de una transacción anidada esta sentencia únicamente reduce en 1 el
valor de @@TRANCOUNT, pero no “finaliza” ninguna transacción ni “guarda” los cambios. En el
caso en el que @@TRANCOUNT=1 (cuando estamos en la última transacción).
COMMIT TRAN hace que todas las modificaciones efectuadas sobre los datos desde el inicio de
la transacción sean parte permanente de la base de datos, libera los recursos mantenidos por la
conexión y reduce @@TRANCOUNT a 0.
Quizás estos dos gráficos nos ayuden a entender el comportamiento de estas sentencias cuando hay
varios niveles de anidamiento.
CHECK DETALLE
♦
Rosas,Karina. SQL SERVER Bases de datos robustas. Manuales Users. Editorial: MP Ediciones 2005. Buenos Aires, Argentina.
FUNCIONES DEFINIDAS
POR EL USUARIO
IF @iNumber <= 1
SET @i = 1
24
Ferra Jaime “Funciones de usuario multisentencia” <http://www.netveloper.com/contenido2.aspx?IDC=85_0> (18/04/2004)
Funciones SQL Server 2000 http://www.learningsolutions.com.mx/sqlsrvfunciones.cfm
52 Compilado por: Jazmin Cabello Pérez, Julia Basurto Madrid
ELSE
SET @i = @iNumber * dbo.Factorial( @iNumber - 1 )
RETURN (@i)
END
Funciones de tabla en línea
Las funciones de tabla en línea son las funciones que devuelven la salida de una simple declaración
SELECT. La salida se puede utilizar adentro de joins o consultas como si fuera una tabla de estándar.
La sintaxis para una función de tabla en línea es como sigue:
CREATE FUNCTION [owner_name.] function_name
( [{ @parameter_name scalar_parameter_type [ = default]} [,..n]])
RETURNS TABLE
[WITH <function_option>::={SCHEMABINDING | ENCRYPTION}]
RETURN [(] select_statement [)]
DECLARE
SET @PREPROCESSED = 0
SET @PROCESSING = 1
SET @POSTPROCESSED = 2
Llamando Funciones
Hay algunas idiosincrasias de la sintaxis al invocar funciones definidas por el usuario. SQL 2000
proporciona algunas funciones definidas por el usuario a nivel sistema en la base de datos Master.
Estas funciones del sistema se invocan con una sintaxis levemente distinta a las que usted puede crear.
Las funciones del sistema que devuelven una tabla tienen la sintaxis siguiente:
Limitaciones
Las funciones definidas por el usuario tienen algunas restricciones. No todas las sentencias SQL son
válidas dentro de una función. Las listas siguientes enumeran las operaciones válidas e inválidas de las
funciones:
Válido:
Las sentencias de asignación
Las sentencias de Control de Flujo
Sentencias SELECT y modificación de variables locales
Operaciones de cursores sobre variables locales
Sentencias INSERT, UPDATE, DELETE con variables Locales.
Inválidas:
Armar funciones no determinadas como GetDate() Sentencias de modificación o actualización de tablas
o vistas Operaciones CURSOR FETCH que devuelven datos del cliente.
Implicaciones De Performance Usar UDFs afectará la performance de las consultas. El impacto de
performance depende de cómo y de dónde usted utiliza una función definida por el usuario. Usted debe
tener precaución al implementar funciones en sus consultas y realiza pruebas de benchmarking para
asegurar que las ventajas de usar sus funciones exceden los costes de performance.
54 Compilado por: Jazmin Cabello Pérez, Julia Basurto Madrid
La función siguiente valida que un número de serie que sigue un modelo específico y las porciones del
número de serie corresponden con un algoritmo específico para un tipo del producto.
Columnas computadas♦
Las funciones escalares se pueden utilizar para crear columnas calculadas en una definición de tabla.
Los argumentos de las funciones calculadas, columnas de la tabla, constantes, o funciones
incorporadas.
♦
Ferra Jaime “Funciones de usuario multisentencia” <http://www.netveloper.com/contenido2.aspx?IDC=85_0> (18/04/2004)
Funciones SQL Server 2000 http://www.learningsolutions.com.mx/sqlsrvfunciones.cfm
SQL Server 2000 55
TRIGGERS
25
Programación PL/SQL .”TRIGGERS EN PL/SQL”. <http://www.plsql.biz/2007/02/triggers-en-plsql.html>(Febrero 2007)
56 Compilado por: Jazmin Cabello Pérez, Julia Basurto Madrid
use pruebas
go
create table IntegridadPorTriggers(id Int identity(1,1) not null Primary
key, CustomerId nvarchar(5) null)
go
end
else
commit tran
go
insert into IntegridadPorTriggers values('ALFKI')
GO
insert into IntegridadPorTriggers values('ERROR')
GO
26
Programación PL/SQL .”TRIGGERS EN PL/SQL”. <http://www.plsql.biz/2007/02/triggers-en-plsql.html>(Febrero 2007)
58 Compilado por: Jazmin Cabello Pérez, Julia Basurto Madrid
Donde "momento_ejecución" indica cuando se ejecuta el trigger automáticamente. Puede contener los:
valores BEFORE ó AFTER. "evento" indica la operación que provoca la ejecución de este bloque.
Puede contener los valores :INSERT, UPDATE ó DELETE. "old" indica el nombre que se le da al
registro con los valores antiguos que se tenían antes de :la ejecución de la operación que activó el
trigger. Mientras que "new" indica el valor que tiene: actualmente después de dicha operación.
Con la cláusula "WHEN" se puede indicar una restricción que haga que el trigger se ejecute o no. :Por
ejemplo se puede indicar que el trigger se ejecute solo si el campo "campo1" de la tabla tiene :un valor
mayor que 50.
La cláusula "FOR EACH ROW" indica que el trigger es a nivel de registro.
Para eliminar un trigger:
DROP TRIGGER nombre_trigger
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
DR. JUAN RAMÓN DE LA FUENTE
Rector
LIC. ENRIQUE DEL VAL BLANCO
Secretario General
DR. DANIEL BARRERA PÉREZ
Secretario Administrativo
DRA. ROSAURA RUIZ GUTIÉRREZ
Secretaria de Desarrollo Institucional
MTRO. JOSÉ ANTONIO VELA CAPDEVILA
Secretario de Servicios a la Comunidad
MTRO. JORGE ISLAS LÓPEZ
Abogado General
Junio de 2007