Documentos de Académico
Documentos de Profesional
Documentos de Cultura
1. Introducción
SQL Server Express es un producto de base de datos gratis y fácil de utilizar basado
en tecnología SQL Server 2005. El mismo está diseñado para brindar una
plataforma de base de datos que ofrece una simplicidad de uso superior,
permitiendo instalaciones más rápidas en sus escenarios. La facilidad de uso
comienza con una instalación robusta de la interface del usuario grafica (GUI) que
guía al usuario a través del proceso de instalación. Las herramientas GUI que se
encuentran incluidas sin cargo con SQL Server Express incluyen Express Manager
(versión Alfa) y Computer Manager. Estas herramientas simplifican las operaciones
de bases de datos básicas y son para desarrolladores amateurs. El diseño y
desarrollo de aplicaciones de bases de datos se vuelve más sencillo con la
integración de Visual Studio. Además, presenta la habilidad de instalar aplicaciones
de bases de datos al moverlas como archivos Windows típicos. Los servicios y
correcciones también son simples y automatizados.
SQL Server Express utiliza el mismo motor de base de datos confiable y de alta
performance que las otras versiones de SQL Server 2005. También utiliza los
mismos APIs de acceso de datos como ADO .NET, SQL Native Client, y T-SQL. De
hecho, se diferencia del resto de las ediciones de SQL Server 2005 por lo siguiente:
Escenarios Objetivo
SQL Server Express fue desarrollado con dos usos distintivos en mente. El primero
es un producto de servidor, especialmente como servidor Web o servidor de base
de datos. El segundo es un almacén de datos local donde el acceso a los datos de la
aplicación no depende de la red. La facilidad de uso y la simplicidad son los
objetivos claves del diseño.
Los tres escenarios de uso principales para SQL Server Express son:
SQL Server Express brinda una plataforma de base de datos fácil de usar y confiable
que es “rica en características” para cubrir estos escenarios. Se le tiene especial
consideración a la facilidad y confiabilidad de la instalación para hacerlo fácil de
utilizar y distribuir.
El motor de SQL soporta 1CPU, 1GB RAM y 4GB de tamaño de base de datos. Este
mecanismo permite una diferenciación sencilla de otras ediciones de SQL Server
2005 al tener puntos bien definidos. De otra manera, no existe un acelerador de
carga de trabajo y el motor funciona como en las otras ediciones.
SQL Server Express puede instalarse y correr en maquinas con varios procesadores,
pero solo se utiliza una CPU en cualquier momento. De manera interna, el motor
limita el número de hilos del usuario a 1 para que solo se utilice 1 CPU por vez. Las
características como ejecución de consultas paralelas no se soportan debido al
límite de una sola CPU.
Soporte de Replicación
Para crear una base de datos, tiene que determinar el nombre de la base de datos,
el propietario, su tamaño y los archivos y grupos de archivos utilizados para
almacenarla.
Para crear una base de datos, debe, como mínimo, disponer de permiso
CREATE DATABASE, CREATE ANY DATABASE o ALTER ANY DATABASE.
En SQL Server, algunos permisos se establecen en los archivos de datos y de
registro de cada base de datos. Los permisos evitan que los archivos se
modifiquen accidentalmente si residen en un directorio sin restricción de
permisos. Para obtener más información, vea Proteger archivos de datos y de
registro.
El usuario que crea la base de datos se convierte en su propietario.
Pueden crearse hasta 32.767 bases de datos en una instancia de SQL Server.
El nombre de la base de datos debe ajustarse a las reglas establecidas para
los Identificadores.
Todos los objetos definidos por el usuario de la base de datos model se
copiarán en todas las bases de datos recién creadas. Puede agregar a la base
de datos model todos los objetos (tablas, vistas, procedimientos
almacenados, tipos de datos, etc.) que desee incluir en todas las bases de
datos recién creadas.
Se utilizan tres tipos de archivos para almacenar una base de datos. Éstos incluyen
archivos principales, archivos secundarios y registros de transacciones. La base de
datos debe tener un archivo de datos principal y, como mínimo, un archivo de
registro de transacciones. Tiene la opción de crear uno o varios archivos de datos
secundarios así como archivos de registro de transacciones adicionales.
Archivos principales
Archivos secundarios
Estos archivos contienen todos los datos que no caben en el archivo de datos
principal. No es necesario que las bases de datos tengan archivos de datos
secundarios si el archivo principal es lo suficientemente grande como para
contener todos los datos. Algunas bases de datos pueden ser muy grandes y
necesitar varios archivos de datos secundarios o utilizar archivos secundarios
en unidades de disco distintas, de modo que los datos estén distribuidos en
varios discos.
Registros de transacciones
Cuando cree una base de datos, defina el mayor tamaño posible para los archivos
de datos, según la cantidad de datos máxima prevista para la base datos.
Inicialización de archivos
Cuando diseñe una base de datos, debe asegurarse de que realiza todas las
operaciones importantes de forma rápida y correcta. Algunos problemas de
rendimiento se pueden resolver una vez que la base de datos se encuentra en
producción. Sin embargo, otros pueden ser el resultado de un diseño inadecuado y
se pueden solucionar mediante el cambio de la estructura y el diseño de la base de
datos.
Cuando diseña e implementa una base de datos, debe identificar las tablas de gran
tamaño y los procesos más complejos que realizará la base de datos. También debe
prestar una atención especial al rendimiento cuando diseña estas tablas. Además,
debe considerar los efectos que puede tener en el rendimiento el aumento del
número de usuarios con acceso a la base de datos.
Por lo general, cuanto mayor es la base de datos, mayores son los requisitos de
hardware. Sin embargo, entre otros factores determinantes se incluyen el número
de sesiones o usuarios simultáneos, el rendimiento de las transacciones y el tipo de
operaciones que se realicen en la base de datos. Por ejemplo, los requisitos de
hardware de una base de datos que contenga datos que se actualicen con poca
frecuencia (para una biblioteca escolar, por ejemplo) serán inferiores a los requisitos
de un almacén de datos de 1 terabyte que contenga datos de acceso frecuente de
ventas, productos y clientes de una gran compañía. Además de los requisitos de
almacenamiento en disco, se necesitará más memoria y procesadores más rápidos
para que el almacén de datos pueda guardar en la memoria caché más datos y para
que las consultas que hacen referencia a grandes cantidades de datos se puedan
procesar con más rapidez.
El subsistema de E/S, o motor de almacenamiento, es un componente clave de
cualquier base de datos relacional y requiere la mayor parte del planeamiento. Una
implementación correcta de base de datos suele requerir un diseño cuidadoso en
las primeras etapas de un proyecto. Este planeamiento o diseño debería tener en
cuenta lo siguiente:
El tipo de disco que se va a utilizar, por ejemplo, los dispositivos RAID (matriz
redundante de discos independientes).
Cómo se van a colocar los datos en los discos.
El diseño de índices que se va a utilizar con el fin de mejorar el rendimiento
de las consultas para tener acceso a los datos.
Cómo se van a establecer correctamente todos los parámetros de
configuración para que la base de datos obtenga un buen rendimiento.
4. Introducción a Transact SQL
Cuando se desea realizar una aplicación completa para el manejo de una base de
datos relacional, resulta necesario utilizar alguna herramienta que soporte la
capacidad de consulta del SQL y la versatilidad de los lenguajes de programación
tradicionales. Transact SQL es el lenguaje de programación que proporciona SQL
Server para extender el SQL estándar con otro tipo de instrucciones.
SQL Server dispone de varios tipos de datos numéricos. Cuanto mayor sea el
número que puedan almacenar mayor será en consecuencia el espacio utilizado
para almacenarlo. Como regla general se recomienda usar el tipo de dato mínimo
posible. Todos los datos numéricos admiten el valor NULL.
Bit. Una columna o variable de tipo bit puede almacenar el rango de valores de 1
a 0.
Int. Una columna o variable de tipo int puede almacenar el rango de valores -231 a
231-1.
BigInt. Una columna o variable de tipo bigint puede almacenar el rango de valores
-263 a 263-1.
Float. Una columna de datos float puede almacenar el rango de valores -1,79x-
10308 a 1,79x-10308, si la definimos con el valor máximo de precisión. La precisión
puede variar entre 1 y 53.
Money. Almacena valores numéricos monetarios de -263 a 263-1, con una precisión
de hasta diez milésimas de la unidad monetaria.
Varchar(max). Igual que varchar, pero al declararse como max puede almacenar
231-1 bytes.
Nchar(n). Almacena n caracteres en formato UNICODE, dos bytes por cada letra.
Es recomendable utilizar este tipo de datos cuando los valores que vayamos a
almacenar puedan pertenecer a diferente idiomas.
Nvarchar(max). Igual que varchar, pero al declararse como max puede almacenar
231-1 bytes.
Datetime. Almacena fechas con una precisión de milisegundo. Debe usarse para
fechas muy específicas.
SmallDatetime. Almacena fechas con una precisión de minuto, por lo que ocupa la
mitad de espacio de que el tipo datetime, para tablas que puedan llegar a tener
muchos datos es un factor a tener muy en cuenta.
Binary. Se utiliza para almacenar datos binarios de longitud fija, con una longitud
máxima de 8000 bytes.
Varbinary. Se utiliza para almacenar datos binarios de longitud variable, con una
longitud máxima de 8000 bytes. Es muy similar a binary, salvo que varbinary utiliza
menos espacio en disco.
La sentencia SELECT
La sentencia SELECT nos permite consultar los datos almacenados en una tabla
de la base de datos.
FROM FAMILIAS
El uso del asterisco indica que queremos que la consulta devuelva todos los
campos que existen en la tabla.
SELECT *
FROM FAMILIAS
Ahora vamos a realizar una consulta obteniendo además de los datos de familias,
los datos de las categorías y los productos.
SELECT *
FROM FAMILIAS
ON CATEGORIAS.CO_FAMILIA = FAMILIAS.CO_FAMILIA
ON PRODUCTOS.CO_CATEGORIA = CATEGORIAS.CO_CATEGORIA
La combinación se realiza a través de la clausula INNER JOIN, que es una cláusula
exclusiva, es decir las familias que no tengan categorías y productos asociados no
se devolverán.
Si queremos realizar la consulta para que no sea exclusiva, tenemos que utilizar
LEFT JOIN. El uso de la palabra reservada OUTER es opcional.
SELECT *
FROM FAMILIAS
ON CATEGORIAS.CO_FAMILIA = FAMILIAS.CO_FAMILIA
ON PRODUCTOS.CO_CATEGORIA = CATEGORIAS.CO_CATEGORIA
Los registros que no tengan datos relacionados en una consulta LEFT JOIN
devolverán en valor null en los campos que correspondan a las tablas en las que no
tienen dato.
La cláusula WHERE
FROM FAMILIAS
WHERE CO_FAMILIA = 1
SELECT *
FROM FAMILIAS
WHERE CO_FAMILIA = 1
OR CO_FAMILIA = 2
Podemos agrupar varios valores para una condición en la clausula IN:
SELECT *
FROM FAMILIAS
WHERE CO_FAMILIA IN ( 1 , 2)
La clausula WHERE se puede utilizar conjuntamente con INNER JOIN, LEFT JOIN.
SELECT FAMILIAS.CO_FAMILIA,
FAMILIAS.FAMILIA
FROM FAMILIAS
ON CATEGORIAS.CO_FAMILIA = FAMILIAS.CO_FAMILIA
SELECT *
FROM FAMILIAS
SELECT *
FROM FAMILIAS
FROM FAMILIAS
FROM FAMILIAS
FROM FAMILIAS
La cláusula ORDER BY
FROM FAMILIAS
FROM FAMILIAS
Para realizar la inserción individual de filas SQL posee la instrucción INSERT INTO.
La inserción individual de filas es la que más comúnmente utilizaremos. Su sintaxis
es la siguiente:
VALUES
(10, getdate(),getdate()+30, 1)
SELECT PRECIO_UNIDAD,
getdate(),
getdate() + 30,
CO_PRODUCTO
FROM DETALLE_PEDIDO
También podemos forzar a que la inserción se realice con los datos por defecto
establecidos para la tabla (o null si no tienen valores por defecto).
INSERT INTO PRECIOS DEFAULT VALUES
VALUES
(10, getdate(),getdate()+30, 1)
PRINT @Codigo
VALUES
(10, getdate(),getdate()+30, 1)
PRINT @Codigo
Clausula OUTPUT
Las columnas con prefijo DELETED reflejan el valor antes de que se complete la
instrucción UPDATE o DELETE. Es decir, son una copia de los datos "antes" del
cambio.
Las columnas con prefijo INSERTED reflejan el valor después de que se complete
la instrucción UPDATE o INSERT, pero antes de que se ejecuten los
desencadenadores. Es decir, son una copia de los datos "después" del cambio.
( CO_PRECIO int,
PRECIO decimal,
FX_INICIO datetime,
FX_FIN datetime,
CO_PRODUCTO int
VALUES
(10, getdate(),getdate()+30, 1)
Update
UPDATE <nombre_tabla>
SET <campo1> = <valor1>
{[,<campo2> = <valor2>,...,<campoN> = <valorN>]}
[ WHERE <condicion>];
UPDATE CLIENTES
SET
NOMBRE = 'Devjoker',
APELLIDO1 = 'Herrarte',
APELLIDO2 = 'Sánchez'
WHERE CO_CLIENTE = 10
Un aspecto a tener en cuenta, sobre todo si has trabajado con ORACLE, es que
SQL graba los cambios inmediatamente sin necesidad de hacer COMMIT. Por
supuesto podemos gestionar nosotros las transacciones pero es algo que hay que
hacer de forma explicita con la instrucción BEGIN TRAN.
En ocasiones queremos actualizar los datos de una tabla con los datos de otra
(muy común para desnormalizar un modelo de datos).
UPDATE CLIENTES
SET
NOMBRE = FICHERO_CLIENTES.NOMBRE,
APELLIDO1 = FICHERO_CLIENTES.APELLIDO1,
APELLIDO2 = FICHERO_CLIENTES.APELLIDO2
FROM CLIENTES
ON FICHERO_CLIENTES.CO_CLIENTE = CLIENTES.CO_CLIENTE
Clausula OUTPUT
( CO_CLIENTE int ,
NOMBRE varchar(100),
APELLIDO1 varchar(100),
APELLIDO2 varchar(100)
UPDATE CLIENTES
SET
NOMBRE = 'Devjoker',
APELLIDO1 = 'Herrarte',
APELLIDO2 = 'Sánchez'
Las columnas con prefijo INSERTED reflejan el valor después de que se complete
la instrucción UPDATE o INSERT, pero antes de que se ejecuten los
desencadenadores. Es decir, son una copia de los datos "después" del cambio.
DECLARE @FILAS_ACTUALIZADAS TABLE
( CO_CLIENTE int ,
NOMBRE varchar(100),
APELLIDO1 varchar(100),
APELLIDO2 varchar(100)
UPDATE CLIENTES
SET
NOMBRE = 'Devjoker',
APELLIDO1 = 'Herrarte',
APELLIDO2 = 'Sánchez'
Delete
Para ejecutar los ejemplos de este capitulo debemos ejecutar el siguiente script,
que crea la tabla "DATOS" y carga registros en ella.
dato varchar(100),
fx_alta datetime,
constraint PK_DATOS PRIMARY KEY (Id)
GO
DECLARE @i int,
@dato varchar(100)
set @i = 0
BEGIN
SET @i = @i +1
END
GO
DELETE
FROM DATOS
DELETE
FROM DATOS
WHERE Id=12
Cuando borramos datos de una tabla, podemos obtener el número de filas que
han sido afectadas por la instrucción a través de la variable @@RowCount.
DELETE
FROM DATOS
WHERE Id=17
SELECT @@ROWCOUNT
Truncate Table