Vous êtes sur la page 1sur 93

El

Lenguaje SQL .1 Introduccin

SQL SERVER 2008

Los ficheros que contienen scripts para que sean procesados por el servidor de base de

datos deben ser escritos en el lenguaje SQ. Estos ficheros deben tener la extensin .sql, y son de texto plano que se pueden escribir con cualquier editor de texto o dentro de la aplicacin SQL Server Management Studio, ejecutando la opcin nueva consulta.

Se genera una ventana en la que podemos escribir nuestro script tal y como se muestra en la siguiente figura

y que luego podremos ejecutar mediante la opcin Ejecutar que se encuentra en la barra.

.2 Generalidades del Lenguaje Los comentarios dentro de los scripts se pueden poner de dos maneras, a saber: 1

SQL SERVER 2008

Comentarios de una lnea, en este caso el comentario se debe comenzar con un doble

guin (--) . Comentarios de varias lneas, se que escriben de la misma forma que en el lenguaje C++, con la secuencia: /* . */ Un ejemplo de su uso es el que se muestra a continuacin:

Cada comando debe finalizar con el caracter ';'. Los procedimientos propios del sql server (que se reconocen porque su nombre

empieza por sp_) se ejecutan mediante la sentencia exec de la siguiente forma: exec sp_nombre_del_procedimiento parametros Un ejemplo es el que se muestra a continuacin

Siempre despus de cada bloque de operaciones independientes se debe usar la

sentencia go. Indica a las utilidades de SQL Server el final de un lote de instrucciones. 2

SQL SERVER 2008

.3 Comandos bsicos para el manejo de los objetos de una base de datos En SQL existen comandos para la creacin y manipulacin de los datos y tambin para

la administracin del servidor. Comenzaremos a ver los relacionados con la manipulacin de los datos. .3.1 Creacin de Bases de Datos Este punto se explica como crear una BD mediante las herramientas grficas y tambin

a travs del comando de SQL. .3.1.1 Creacin de BD mediante el Management Studio Una vez que nos hallamos conectado al servidor de BD realizamos las siguientes

operaciones: Situados en el explorador de objetos, hacemos clic con el botn derecho sobre la carpeta de bases de datos y escogemos la opcin de Nueva base de datos

En la ventana de Nueva base de datos, seleccionamos la ficha General y realizamos los siguientes pasos: Introducimos el nombre de la BD en el cuadro de texto. Este ser tambin el nombre lgico de los ficheros que se van a crear. Indicamos el tamao inicial para el fichero de la base de datos y del fichero log que registrara los eventos sobre la BD. 3

SQL SERVER 2008

Indicamos la forma como queremos que aumente estos ficheros Indicamos la ruta de acceso para los ficheros que se van a crear. Y por ltimo podemos indicar el nombre de los ficheros que se van a a crear.

Hacemos clic en el botn aceptar y se generan dos ficheros con extensiones .mdf (la base de datos) y .ldf (el fichero log).

SQL SERVER 2008

.3.1.2 Creacin de BD mediante comandos El comando para crear una base de datos es CREATE DATABASE. Se debe indicar (ver figura de abajo), el nombre de la base de datos, el nombre lgico del fichero de datos, la ruta y nombre del fichero fsico en los que se almacenar. Adems podr indicarse el tamao inicial y mximo que tendr ese fichero, as como tambin el comportamiento de crecimiento del mismo. Si queremos tambin podemos dar esta informacin para el fichero de registros.

Se debe tener en cuenta, que cada vez que se cree una nueva BD se debe usar la BD

master (del sistema) que es donde se almacena la informacin de todas las BD. Para ver un ejemplo revisemos el fichero ej001_crear_bd.sql de la carpeta Ejemplos. Es buena poltica verificar la existencia de la base de datos antes de crearla, para ello, se usa la funcin db_id() que devuelve NULL si la base de datos no existe. En el caso de que querer borrar la BD, el comando que permite borrarla una es DROP DATABASE. La instruccin que permite hacerlo es la siguiente

SQL SERVER 2008

Para verificar los datos de la base de datos creada podemos usar el procedimiento sp_helpdb que muestra la informacin de una base de datos que se usa como se muestra a continuacin:

Para ver ejemplos del uso de estos comandos revisen el fichero ej002_crear_bd_mejorado.sql y ej003_mostrar_informacion_bd.sql de la carpeta Ejemplos. .3.2 Creacin de una tabla dentro de la BD ** comentar .3.2.1 Creacin de una tabla mediante la herramienta grfica ** por completar .3.2.2 Creacin de una tabla mediante comandos .3.2.2.1 Creacin de la tabla y sus campos Para crear una tabla dentro de una BD se usa la sentencia CREATE TABLE en la

que debemos indicar el nombre de la tabla, los campos que la integran y el tipo de datos de cada uno de esos campos. La sintaxis bsica y general para crear una tabla es la siguiente:

Tener en cuenta que estemos usando la BD en la que queremos crear la tabla. El nombre de una tabla debe ser nico dentro de la BD. Cada campo con su tipo debe separarse con comas de los siguientes, excepto el ltimo. 6

SQL SERVER 2008

Cuando se crea una tabla debemos indicar su nombre y definir al menos un campo con su tipo de dato. Si intentamos crear una tabla con un nombre que ya existe, mostrar un mensaje de error indicando que ya hay un objeto en la base de datos con ese nombre y la sentencia no se ejecutar. Para ver un ejemplo revisemos el fichero ej004_crear_tabla.sql de la carpeta Ejemplos. Es buena poltica verificar la existencia de la tabla antes de crearla, para ello, se usa la funcin object_id() que devuelve NULL si la tabla no existe. En el caso de que querer borrarla, el comando que permite hacerlo es DROP TABLE. La instruccin que permite hacerlo es la siguiente

Para verificar los datos de la tabla creada podemos usar el procedimiento sp_columns que muestra la informacin de los campos que conforman la tabla: Para ver las tablas que estn creadas en nuestra BD el comando es sp_tables, la forma de usar es la que se muestra a continuacin: Para ver ejemplos del uso de estos comandos revisen los ficheros ej005_crear_tabla_mejorado.sql y ej006_mostrar_informacion_tabla.sql de la carpeta Ejemplos. .3.2.2.2 Establecer clave primaria Para establecer la clave primaria en una tabla lo podemos hacer de dos formas: aadir una restriccin en el script que crea la tabla aadir una restriccin que modifique la tabla para incluirle la restriccin

Veamos cada uno de ellos

SQL SERVER 2008

Aadir una restriccin en el script que crea la tabla En el momento de crear la tabla justo despus de haber declarado todos los campos se aade la restriccin que establece la clave principal. Es aconsejable dar un nombre a la restriccin, ya que nos ser til si queremos eliminarla o modificarla posteriormente. El formato que debe cumplir la restriccin es el que se muestra a continuacin.

Para ver un ejemplo revisemos el fichero ej007_crear_tabla_clave_01.sql de la carpeta Ejemplos. Aadir un script que modifique la tabla para incluirle la restriccin En esta segunda opcin se crea la tabla y luego se le aade la restriccin de clave principal, mediante el uso del comando ALTER TABLE, tal y como se muestra a continuacin.

Para ver un ejemplo revisemos el fichero ej008_crear_tabla_clave_02.sql de la carpeta Ejemplos. Consideraciones a tener en cuenta con referencia a la clave primaria en SQL SERVER. Sabemos que cuando agregamos una restriccin a una tabla que contiene informacin, SQL Server controla los datos existentes para confirmar que cumplen las exigencias de la restriccin, si no los cumple, la restriccin no se aplica y aparece un mensaje de error. Por ejemplo, si intentamos definir la restriccin "primary key" para "libros" y hay registros con cdigos repetidos o con un valor "null", la restriccin no se establece. Cuando establecamos una clave primaria al definir la tabla, automticamente SQL Server redefina el campo como "not null"; pero al agregar una restriccin "primary key", los campos que son clave primaria DEBEN haber sido definidos "not null" (o ser implcitamente "not null" si se definen como autonumricos). 8

SQL SERVER 2008

SQL Server permite definir solamente una restriccin "primary key" por tabla, que asegura la unicidad de cada registro de una tabla. Si ejecutamos el procedimiento almacenado sp_helpconstraint junto al nombre de la tabla, podemos ver las restricciones "primary key" (y todos los tipos de restricciones) de dicha tabla. Un campo con una restriccin "primary key" puede tener una restriccin "check". Un campo "primary key" tambin acepta una restriccin "default" (excepto si es autonumrico), pero no tiene sentido ya que el valor por defecto solamente podr ingresarse una vez; si intenta ingresarse cuando otro registro ya lo tiene almacenado, aparecer un mensaje de error indicando que se intenta duplicar la clave. Por convencin, cuando demos el nombre a las restricciones "primary key" seguiremos el formato "PK_NOMBRETABLA". Para ver un ejemplo revisemos el fichero ej009_clave_primaria.sql de la carpeta Ejemplos. .3.3 Operaciones bsicas sobre una tabla en una BD Para la realizacin de ejemplos y ejercicios ms completos en donde se probarn

muchas de las opciones que se van a tratar de aqu en adelante, en este punto se explicar brevemente como se insertan, modifican, borran y consultan datos en una tabla. .3.3.1 Insercin de registros .3.3.1.1 Insercin de un registro en una tabla mediante la herramienta grfica ** por completar .3.3.1.2 Insercin de un registro en una tabla mediante el uso de comandos El comando para insertar datos en una tabla es INSERT INTO, el formato para su

utilizacin es el que se muestra a continuacin.

.3.3.2 Modificacin de registros

SQL SERVER 2008

.3.3.2.1 Modificacin de registros en una tabla mediante la herramienta grfica ** por completar .3.3.2.2 Modificacin de registros en una tabla mediante el uso de comandos El comando para modificar datos en una tabla es update ... set, el formato para su

utilizacin es el que se muestra a continuacin.

La opcin WHERE es opcional. Si se quiere modificar ms de un campo, stos han de separarse por comas. Para ver un ejemplo revisemos los ficheros ej010_select.sql, ej011_delete.sql y ej012_update.sql de la carpeta Ejemplos. .3.3.3 Borrado de registros .3.3.3.1 Borrado de registros en una tabla mediante la herramienta grfica ** por completar .3.3.3.2 Borrado de registros en una tabla mediante el uso de comandos El comando para consultar datos en una tabla es delete ... from, el formato para su utilizacin es el que se muestra a continuacin.

La opcin WHERE es opcional. 10

.3.3.4 Consulta de registros

SQL SERVER 2008

.3.3.4.1 Consulta de registros en una tabla mediante la herramienta grfica ** por completar .3.3.4.2 Consulta de registros en una tabla mediante el uso de comandos El comando para consultar datos en una tabla es select ... from, el formato para su utilizacin es el que se muestra a continuacin.

La opcin WHERE es opcional. .3.4 Otras restricciones sobre una tabla en una BD .3.4.1 Valor por defecto de un campo en una tabla (restriccin default) Un campo que permite valores nulos el valor por defecto es NULL. Para campos

declarados "not null", no existe valor por defecto, a menos que se declare explcitamente con la restriccin "default". En relacin a los tipos de datos, se pueden explicitar valores por defecto a todos ellos, excepto los declarados "identity" (autonumrico). Para establecer un valor por defecto a un campo se usa la restriccin DEFAULT. La forma de usar esta restriccin es igual a como se explic en el apartado de la clave primaria. As la forma de declarar un valor por defecto ser

11

SQL SERVER 2008

Si lo hacemos dentro del script que crea la tabla en la BD

Si lo hacemos mediante un script que modifique la tabla. Consideraciones a tener en cuenta con el uso de los valores por defecto. Si al ingresar un nuevo registro, omitimos los valores en aquellos campos para los cuales se han definido valores por defecto, se insertar los valores por defecto. Al visualizar la estructura de la tabla con el procedimiento "sp_columns", la columna "COLUMN_DEF" muestra el valor por defecto del campo. Tambin se puede utilizar default para dar el valor por defecto a los campos en la sentencia de insercin, por ejemplo

Si todos los campos de una tabla tienen valores predeterminados (ya sea por ser autonumricos, permitir valores nulos o tener un valor por defecto), se puede ingresar un registro de la siguiente manera:

12

SQL SERVER 2008

Entonces, la clusula "default" permite especificar el valor por defecto de un campo. Si no se explicita, el valor por defecto es "null", siempre que el campo no haya sido declarado "not null". Los campos para los cuales no se ingresan valores en un "insert" tomarn los valores por defecto: si tiene el atributo "identity": el valor de inicio de la secuencia si es el primero o el siguiente valor de la secuencia, no admite clusula "default"; si permite valores nulos y no tiene clusula "default", almacenar "null"; si est declarado explcitamente "not null", no tiene valor "default" y no tiene el atributo "identity", no hay valor por defecto, as que causar un error y el "insert" no se ejecutar. si tiene clusula "default" (admita o no valores nulos), el valor definido como predeterminado; para campos de tipo fecha y hora, si omitimos la parte de la fecha, el valor predeterminado para la fecha es "01-01-1900" y si omitimos la parte de la hora, "00:00:00". Un campo slo puede tener un valor por defecto. Una tabla puede tener todos sus campos con valores por defecto. Que un campo tenga valor por defecto no significa que no admita valores nulos, puede o no admitirlos. Solamente se permite una restriccin "default" por campo y no se puede emplear junto con la propiedad "identity" (autonumrico). Una tabla puede tener varias restricciones "default" para sus distintos campos. La restriccin "default" acepta valores tomados de funciones del sistema, por ejemplo, podemos establecer que el valor por defecto de un campo de tipo datetime sea "getdate()". Podemos ver informacin referente a las restriciones de una tabla con el procedimiento almacenado "sp_helpcontraint": sp_helpconstraint nombre_de_la_tabla; aparecen varias columnas con la siguiente informacin: 13

SQL SERVER 2008

constraint_type: el tipo de restriccin y sobre qu campo est establecida (DEFAULT on column autor), constraint_name: el nombre de la restriccin (DF_libros_autor), delete_action y update_action: no tienen valores para este tipo de restriccin. status_enabled y status_for_replication: no tienen valores para este tipo de restriccin. constraint_keys: el valor por defecto (Desconocido).

.3.4.2 Verificar los valores que acepta un campo (restriccin check) La restriccin "check" especifica los valores que acepta un campo, evitando que se ingresen valores inapropiados. De la misma forma que las otras restricciones vista hasta ahora, la forma de crear una restriccin check para un campo se hace de esta forma

Si lo hacemos dentro del script que crea la tabla en la BD

Si lo hacemos mediante un script que modifique la tabla Este tipo de restriccin verifica los datos cada vez que se ejecuta una sentencia "insert" o "update", es decir, acta en inserciones y actualizaciones. 14

SQL SERVER 2008

Si la tabla contiene registros que no cumplen con la restriccin que se va a establecer, la restriccin no se puede establecer, hasta que todos los registros cumplan con dicha restriccin. La condicin puede hacer referencia a otros campos de la misma tabla. Por ejemplo, podemos controlar que el precio mayorista no sea mayor al precio minorista: alter table libros add constraint CK_libros_preciominmay

check (preciomay<=preciomin); Por convencin, cuando demos el nombre a las restricciones "check" seguiremos la misma estructura: comenzamos con "CK", seguido del nombre de la tabla, del campo y alguna palabra con la cual podamos identificar fcilmente de qu se trata la restriccin, por si tenemos varias restricciones "check" para el mismo campo. Un campo puede tener varias restricciones restricciones "check" y una restriccin "check" puede incluir varios campos. Las condiciones para restricciones "check" tambin pueden pueden incluir un patrn o una lista de valores. Por ejemplo establecer que cierto campo conste de 4 caracteres, 2 letras y 2 dgitos: ... check (CAMPO like '[A-Z][A-Z][0-9][0-9]'); 15

SQL SERVER 2008

O establecer que cierto campo asuma slo los valores que se listan: ... check (CAMPO in ('lunes','miercoles','viernes')); No se puede aplicar esta restriccin junto con la propiedad "identity". Si un campo permite valores nulos, "null" es un valor aceptado aunque no est incluido en la condicin de restriccin. Si intentamos establecer una restriccin "check" para un campo que entra en conflicto con otra restriccin "check" establecida al mismo campo, SQL Server no lo permite. Pero si establecemos una restriccin "check" para un campo que entra en conflicto con una restriccin "default" establecida para el mismo campo, SQL Server lo permite; pero al intentar ingresar un registro, aparece un mensaje de error. .3.4.3 Agregar una clave alternativa a la tabla (restriccin unique) La restriccin "unique" impide la duplicacin de claves alternas (no primarias), es decir, especifica que dos registros no puedan tener el mismo valor en un campo. Se permiten valores nulos. Se pueden aplicar varias restricciones de este tipo a una misma tabla, y pueden aplicarse a uno o varios campos que no sean clave primaria. Se emplea cuando ya se estableci una clave primaria (como un nmero de legajo) pero se necesita asegurar que otros datos tambin sean nicos y no se repitan (como nmero de documento). 16

La sintaxis general es la siguiente:

SQL SERVER 2008

Si lo hacemos dentro del script que crea la tabla en la BD

Si lo hacemos mediante un script que modifique la tabla. Cuando se agrega una restriccin "unique" sobre un campo de la tabla, se asegura que no se pueda ingresar un valor a ese campo si ya existe. Esta restriccin, si el campo lo permite valores nulos, as que si se ingresa el valor "null" para el campo "documento", se acepta. Por convencin, cuando demos el nombre a las restricciones "unique" seguiremos la misma estructura: "UQ_NOMBRETABLA_NOMBRECAMPO". Recuerde que cuando agregamos una restriccin a una tabla que contiene informacin, SQL Server controla los datos existentes para confirmar que cumplen la condicin de la restriccin, si no los cumple, la restriccin no se aplica y aparece un mensaje de error. SQL Server controla la entrada de datos en inserciones y actualizaciones evitando que se ingresen valores duplicados. 17

SQL SERVER 2008

.3.4.4 Agregar clave ajena a una BD (restriccin foreign key) Como ya sabemos las claves ajenas son las que permiten establecer las relaciones entre las tablas de un BD. Con la restriccin "foreign key" se define un campo (o varios) cuyos valores coinciden con la clave primaria de la misma tabla o de otra, es decir, se define una referencia a un campo con una restriccin "primary key" o "unique" de la misma tabla o de otra. La integridad referencial asegura que se mantengan las referencias entre las claves primarias y las externas. Por ejemplo, controla que si se agrega un cdigo de editorial en la tabla "libros", tal cdigo exista en la tabla "editoriales". Tambin controla que no pueda eliminarse un registro de una tabla ni modificar la clave primaria si una clave externa hace referencia al registro. Por ejemplo, que no se pueda eliminar o modificar un cdigo de "editoriales" si existen libros con dicho cdigo. La sintaxis general es la siguiente:

Si lo hacemos dentro del script que crea la tabla en la BD

Si lo hacemos mediante un script que modifique la tabla. 18

SQL SERVER 2008

Cuando implementamos una restriccin "foreign key" queremos asegurarnos que los campos que forman la clave ajena est asociada con un registro vlido en la tabla referenciada. Cuando agregamos cualquier restriccin a una tabla que contiene informacin, SQL Server controla los datos existentes para confirmar que cumplen con la restriccin, si no los cumple, la restriccin no se aplica y aparece un mensaje de error. Acta en inserciones. Si intentamos ingresar un registro con un valor de clave fornea que no existe en la tabla referenciada, SQL server muestra un mensaje de error. Si al ingresar un registro no colocamos el valor para el campo clave fornea, se almacenar el valor "null", siempre y cuando el campo permita valores nulos. Acta en eliminaciones y actualizaciones. Si intentamos eliminar un registro o modificar un valor de clave primaria de una tabla si una clave fornea hace referencia a dicho registro, SQL Server no lo permite (excepto si se permite la accin en cascada, tema que veremos posteriormente). La cantidad y tipo de datos de los campos especificados luego de "foreign key" DEBEN coincidir con la cantidad y tipo de datos de los campos de la clusula "references". Una tabla puede tener varias restricciones "foreign key". No se puede eliminar una tabla referenciada con una restriccin "foreign key", aparece un mensaje de error. Una restriccion "foreign key" no puede modificarse, debe eliminarse y volverse a crear. 19

SQL SERVER 2008

Para ver informacin acerca de esta restriccin podemos ejecutar el procedimiento almacenado "sp_helpconstraint" junto al nombre de la tabla. Nos muestra el tipo, nombre, la opcin para eliminaciones y actualizaciones, el estado (temas que veremos ms adelante), el nombre del campo y la tabla y campo que referencia. Tambin informa si la tabla es referenciada por una clave fornea. Una tabla puede referenciarse a s misma Acciones en las restricciones foreign key Si intentamos eliminar un registro de la tabla referenciada por una restriccin "foreign key" cuyo valor de clave primaria existe referenciada en la tabla que tiene dicha restriccin, la accin no se ejecuta y aparece un mensaje de error. Esto sucede porque, por defecto, para eliminaciones, la opcin de la restriccin "foreign key" es "no action". Lo mismo sucede si intentamos actualizar un valor de clave primaria de una tabla referenciada por una "foreign key" existente en la tabla principal. La restriccin "foreign key" tiene las clusulas "on delete" y "on update" que son opcionales. Estas clusulas especifican cmo debe actuar SQL Server frente a eliminaciones y modificaciones de las tablas referenciadas en la restriccin. Las opciones para estas clusulas son las siguientes: - "no action": si se intenta borrar un registro de la tabla principal en la que existan registros en la tabla referenciada con el mismo valor de la clave, no se permite el borrado o modificacin. - "cascade": si se intenta borrar un registro de la tabla principal en la que existan registros en la tabla referenciada con el mismo valor de la clave, se propaga el borrado o modificacin a la tabla referenciada.

20

SQL SERVER 2008

- set null: al borrar en la tabla primaria los correspondientes valores en la referenciada se establecen a valor nulo si el campo lo permite. - set default: al borrar en la tabla primaria los correspondientes valores en la referenciada se establece el valor predeterminado si el campo lo tiene definido. La sintaxis general es la siguiente:

Si lo hacemos dentro del script que crea la tabla en la BD

Si lo hacemos mediante un script que modifique la tabla. Sintetizando, si al agregar una restriccin foreign key:

21

SQL SERVER 2008

- no se especifica accin para eliminaciones (o se especifica "no_action"), y se intenta eliminar un registro de la tabla referenciada (editoriales) cuyo valor de clave primaria existe en la tabla principal, la accin no se realiza. - se especifica "cascade" para eliminaciones ("on delete cascade") y elimina un registro de la tabla referenciada cuyo valor de clave primaria existe en la tabla principal, la eliminacin de la tabla referenciada se realiza y se eliminan de la tabla principal todos los registros cuyo valor coincide con el registro eliminado de la tabla referenciada. - no se especifica accin para actualizaciones (o se especifica "no_action"), y se intenta modificar un valor de clave primaria de la tabla referenciada (editoriales) que existe en el campo clave fornea de la tabla principal, la accin no se realiza. - se especifica "cascade" para actualizaciones ("on update cascade") y se modifica un valor de clave primaria de la tabla referenciada que existe en la tabla principal, SQL Server actualiza el registro de la tabla referenciada y todos los registros coincidentes en la tabla principal. Informacin de las restricciones foreign key El procedimiento almacenado "sp_helpconstraint" devuelve las siguientes columnas: - constraint_type: tipo de restriccin. Si es una restriccin de campo (default o check) indica sobre qu campo fue establecida. Si es de tabla (primary key o unique) indica el tipo de ndice creado. Si es una "foreign key" lo indica. - constraint_name: nombre de la restriccin.

22

SQL SERVER 2008

- delete_action: solamente es aplicable para restricciones de tipo "foreign key". Indica si la accin de eliminacin acta, no acta o es en cascada. Indica "n/a" en cualquier restriccin para la que no se aplique; "No Action" si no acta y "Cascade" si es en cascada. - update_action: slo es aplicable para restricciones de tipo "foreign key". Indica si la accin de actualizacin es: No Action, Cascade, or n/a. Indica "n/a" en cualquier restriccin para la que no se aplique. - status_enabled: solamente es aplicable para restricciones de tipo "check" y "foreign key". Indica si est habilitada (Enabled) o no (Disabled). Indica "n/a" en cualquier restriccin para la que no se aplique. - status_for_replication: solamente es aplicable para restricciones de tipo "check" y "foreign key". Indica "n/a" en cualquier restriccin para la que no se aplique. - constraint_keys: Si es una restriccin "default" muestra la condicin de chequeo; si es una restriccin "default", el valor por defecto; si es una "primary key", "unique" o "foreign key" muestra el/ los campos a los que se aplicaron la restriccin. En caso de valores predeterminados y reglas, el texto que lo define. .3.5 Operaciones sobre las restricciones Sabemos que si agregamos una restriccin a una tabla que contiene datos, SQL Server los controla para asegurarse que cumplen con la restriccin; es posible deshabilitar esta comprobacin. Podemos hacerlo al momento de agregar la restriccin a una tabla con datos, incluyendo la opcin "with nocheck" en la instruccin "alter table"; si se emplea esta opcin, los datos no van a cumplir la restriccin.

23

SQL SERVER 2008

Se pueden deshabilitar las restricciones "check" y "foreign key", a las dems se las debe eliminar. La sintaxis bsica al agregar la restricccin "foreign key" es la siguiente: alter table NOMBRETABLA1 with OPCIONDECHEQUEO add constraint NOMBRECONSTRAINT foreign key (CAMPOCLAVEFORANEA) references NOMBRETABLA2 (CAMPOCLAVEPRIMARIA) on update OPCION on delete OPCION; La opcin "with OPCIONDECHEQUEO" especifica si se controlan los datos existentes o no con "check" y "nocheck" respectivamente. Por defecto, si no se especifica, la opcin es "check". En el siguiente ejemplo agregamos una restriccin "foreign key" que controla que todos los cdigos de editorial tengan un cdigo vlido, es decir, dicho cdigo exista en "editoriales". La restriccin no se aplica en los datos existentes pero si en los siguientes ingresos, modificaciones y actualizaciones: alter table libros with nocheck add constraint FK_libros_codigoeditorial

24

foreing key (codigoeditorial) references editoriales(codigo);

SQL SERVER 2008

La comprobacin de restricciones se puede deshabilitar para modificar, eliminar o agregar datos a una tabla sin comprobar la restriccin. La sintaxis general es: alter table NOMBRETABLA OPCIONDECHEQUEO constraint NOMBRERESTRICCION; En el siguiente ejemplo deshabilitamos la restriccin creada anteriormente: alter table libros nocheck constraint FK_libros_codigoeditorial; Para habilitar una restriccin deshabilitada se ejecuta la misma instruccin pero con la clusula "check" o "check all": alter table libros check constraint FK_libros_codigoeditorial; Si se emplea "check constraint all" no se coloca nombre de restricciones, habilita todas las restricciones que tiene la tabla nombrada ("check" y "foreign key").

25

SQL SERVER 2008

Para saber si una restriccin est habilitada o no, podemos ejecutar el procedimiento almacenado "sp_helpconstraint" y entenderemos lo que informa la columna "status_enabled". Entonces, las clusulas "check" y "nocheck" permiten habilitar o deshabilitar restricciones "foreign key" (y "check"). Pueden emplearse para evitar la comprobacin de datos existentes al crear la restriccin o para deshabilitar la comprobacin de datos al ingresar, actualizar y eliminar algn registro que infrinja la restriccin. Podemos eliminar una restriccin "foreign key" con "alter table". La sintaxis bsica es la misma que para cualquier otra restriccin: alter table TABLA drop constraint NOMBRERESTRICCION; Eliminamos la restriccin de "libros": alter table libros drop constraint FK_libros_codigoeditorial; No se puede eliminar una tabla si una restriccin "foreign key" hace referencia a ella. Cuando eliminamos una tabla que tiene una restriccin "foreign key", la restriccin tambin se elimina. 26

.3.6 Tipos de datos bsicos

SQL SERVER 2008

El tipo de dato especifica el tipo de informacin que puede guardar un campo: caracteres, nmeros, etc. Antes de crear una tabla debemos pensar en sus campos y optar por el tipo de dato adecuado para cada uno de ellos. Por ejemplo, si en un campo almacenaremos nmeros enteros, el tipo "float" sera una mala eleccin; si vamos a guardar precios, el tipo "float" es ms adecuado, no as "integer" que no tiene decimales. Otro ejemplo, si en un campo vamos a guardar un nmero telefnico o un nmero de documento, usamos "varchar", no "integer" porque si bien son dgitos, con ellos no realizamos operaciones matemticas. .3.6.1 Campos de tipo texto Para almacenar TEXTO usamos cadenas de caracteres. Las cadenas se colocan entre comillas simples. Podemos almacenar letras, smbolos y dgitos con los que no se realizan operaciones matemticas, por ejemplo, cdigos de identificacin, nmeros de documentos, nmeros telefnicos. Las cadenas se colocan entre comillas simples. Podemos almacenar letras, smbolos y dgitos con los que no se realizan operaciones matemticas, por ejemplo, cdigos de identificacin, nmeros de documentos, nmeros telefnicos. Cuando creamos una tabla y definir sus campos debemos elegir el tipo de dato ms preciso. Por ejemplo, si necesitamos almacenar nombres usamos texto; si un campo numrico almacenar solamente valores enteros el tipo "integer" es ms adecuado que, por ejemplo un "float"; si necesitamos almacenar precios, lo ms lgico es utilizar el tipo "money". Tenemos los siguientes tipos:

27

SQL SERVER 2008

1. varchar(x): define una cadena de caracteres de longitud variable en la cual determinamos el mximo de caracteres con el argumento "x" que va entre parntesis. Si se omite el argumento coloca 1 por defecto. Su rango va de 1 a 8000 caracteres. 2. char(x): define una cadena de longitud fija determinada por el argumento "x". Si se omite el argumento coloca 1 por defecto. Su rango es de 1 a 8000 caracteres. Si la longitud es invariable, es conveniente utilizar el tipo char; caso contrario, el tipo varchar. Ocupa tantos bytes como se definen con el argumento "x". 3. text: guarda datos binarios de longitud variable, puede contener hasta 2000000000 caracteres. No admite argumento para especificar su longitud. 4. nvarchar(x): es similar a "varchar", excepto que permite almacenar caracteres Unicode, su rango va de 0 a 4000 caracteres porque se emplean 2 bytes por cada caracter. 5. nchar(x): es similar a "char" excpeto que acepta caracteres Unicode, su rango va de 0 a 4000 caracteres porque se emplean 2 bytes por cada caracter. 6. ntext: es similar a "text" excepto que permite almacenar caracteres Unicode, puede contener hasta 1000000000 caracteres. No admite argumento para especificar su longitud. En general se usarn los 3 primeros.

28

SQL SERVER 2008

Si intentamos almacenar en un campo una cadena de caracteres de mayor longitud que la definida, aparece un mensaje indicando tal situacin y la sentencia no se ejecuta. Por ejemplo, si definimos un campo de tipo varchar(10) y le asignamos la cadena 'Aprenda PHP' (11 caracteres), aparece un mensaje y la sentencia no se ejecuta. Si ingresamos un valor numrico (omitiendo las comillas), lo convierte a cadena y lo ingresa como tal. Por ejemplo, si en un campo definido como varchar(5) ingresamos el valor 12345, lo toma como si hubisemos tipeado '12345', igualmente, si ingresamos el valor 23.56, lo convierte a '23.56'. Si el valor numrico, al ser convertido a cadena supera la longitud definida, aparece un mensaje de error y la sentencia no se ejecuta. Es importante elegir el tipo de dato adecuado segn el caso, el ms preciso. Para almacenar cadenas que varan en su longitud, es decir, no todos los registros tendrn la misma longitud en un campo determinado, se emplea "varchar" en lugar de "char". Por ejemplo, en campos que guardamos nombres y apellidos, no todos los nombres y apellidos tienen la misma longitud. Para almacenar cadenas que no varan en su longitud, es decir, todos los registros tendrn la misma longitud en un campo determinado, se emplea "char".

29

SQL SERVER 2008

Por ejemplo, definimos un campo "codigo" que constar de 5 caracteres, todos los registros tendrn un cdigo de 5 caracteres, ni ms ni menos. Para almacenar valores superiores a 8000 caracteres se debe emplear "text". Tipo Bytes de almacenamiento

_______________________________________ varchar(x) char(x) text nvarchar(x) 0 a 8K nchar(x) ntext .3.6.2 Campos de tipo numrico Para almacenar valores NUMERICOS SQL Server dispone de varios tipos. Para almacenar valores ENTEROS, por ejemplo, en campos que hacen referencia a cantidades, usamos: 1) integer o int: su rango es de -2000000000 a 2000000000 aprox. El tipo "integer" tiene subtipos: smallint: Puede contener hasta 5 digitos. Su rango va desde 32000 hasta 32000 aprox. 30 0 a 8K 0 a 2GB 0 a 8K 0 a 8K 0 a 2GB

SQL SERVER 2008

- tinyint: Puede almacenar valores entre 0 y 255. - bigint: De 9000000000000000000 hasta 9000000000000000000 aprox. Para almacenar valores numricos EXACTOS con decimales, especificando la cantidad de cifras a la izquierda y derecha del separador decimal, utilizamos: 2) decimal o numeric (t,d): Pueden tener hasta 38 digitos, guarda un valor exacto. El primer argumento indica el total de dgitos y el segundo, la cantidad de decimales. Por ejemplo, si queremos almacenar valores entre -99.99 y 99.99 debemos definir el campo como tipo "decimal(4,2)". Si no se indica el valor del segundo argumento, por defecto es "0". Por ejemplo, si definimos "decimal(4)" se pueden guardar valores entre -9999 y 9999. El rango depende de los argumentos, tambin los bytes que ocupa. Se utiliza el punto como separador de decimales. Si ingresamos un valor con ms decimales que los permitidos, redondea al ms cercano; por ejemplo, si definimos "decimal(4,2)" e ingresamos el valor "12.686", guardar "12.69", redondeando hacia arriba; si ingresamos el valor "12.682", guardar "12.68", redondeando hacia abajo. Para almacenar valores numricos APROXIMADOS con decimales utilizamos: 3) float y real: De 1.79E+308 hasta 1.79E+38. Guarda valores aproximados. 4) real: Desde 3.40E+308 hasta 3.40E+308. Guarda valores aproximados. 31

SQL SERVER 2008

Para almacenar valores MONETARIOS empleamos: 5) money: Puede tener hasta 19 digitos y slo 4 de ellos puede ir luego del separador decimal; entre 900000000000000.5808 aprox y 900000000000000.5807. 6) smallmoney: Entre 200000.3648 y 200000.3647 aprox. Para todos los tipos numricos: - si intentamos ingresar un valor fuera de rango, no lo permite. - si ingresamos una cadena, SQL Server intenta convertirla a valor numrico, si dicha cadena consta solamente de dgitos, la conversin se realiza, luego verifica si est dentro del rango, si es as, la ingresa, sino, muestra un mensaje de error y no ejecuta la sentencia. Si la cadena contiene caracteres que SQL Server no puede convertir a valor numrico, muestra un mensaje de error y la sentencia no se ejecuta. Por ejemplo, definimos un campo de tipo decimal(5,2), si ingresamos la cadena '12.22', la convierte al valor numrico 12.22 y la ingresa; si intentamos ingresar la cadena '1234.56', la convierte al valor numrico 1234.56, pero como el mximo valor permitido es 999.99, muestra un mensaje indicando que est fuera de rango. Si intentamos ingresar el valor '12y.25', SQL Server no puede realizar la conversin y muestra un mensaje de error. Es importante elegir el tipo de dato adecuado segn el caso, el ms preciso. Por ejemplo, si un campo numrico almacenar valores positivos menores a 255, el tipo "int" no es el ms adecuado, conviene el tipo "tinyint", de esta manera usamos el menor espacio de almacenamiento posible. Si vamos a guardar valores monetarios menores a 200000 conviene emplear "smallmoney" en lugar de "money". 32

Tipo

SQL SERVER 2008

Bytes de almacenamiento

_______________________________________ int 4 2 1 8

smallint tinyint bigint decimal float real money 8

2 a 17

4 u 8 4 u 8

smallmoney 4 .3.6.3 Campos de tipo fecha y hora Para almacenar valores de tipo FECHA Y HORA SQL Server dispone de dos tipos: 1) datetime: puede almacenar valores desde 01 de enero de 1753 hasta 31 de diciembre de 9999. 2) smalldatetime: el rango va de 01 de enero de 1900 hasta 06 de junio de 2079. Las fechas se ingresan entre comillas simples. 33

SQL SERVER 2008

Para almacenar valores de tipo fecha se permiten como separadores "/", "-" y ".". SQL Server reconoce varios formatos de entrada de datos de tipo fecha. Para establecer el orden de las partes de una fecha (dia, mes y ao) empleamos "set dateformat". Estos son los formatos: -mdy: 4/15/96 (mes y da con 1 2 dgitos y ao con 2 4 dgitos), -myd: 4/96/15, -dmy: 15/4/1996 -dym: 15/96/4, -ydm: 96/15/4, -ydm: 1996/15/4, Para ingresar una fecha con formato "da-mes-ao", tipeamos: set dateformat dmy; El formato por defecto es "mdy". Todos los valores de tipo "datetime" se muestran en formato "ao-mes-da hora:minuto:segundo .milisegundos", independientemente del formato de ingreso que hayamos seteado. 34

SQL SERVER 2008

Podemos ingresar una fecha, sin hora, en tal caso la hora se guarda como "00:00:00". Por ejemplo, si ingresamos '25-12-01' (ao de 2 dgitos), lo mostrar as: '2001-12-25 00:00:00.000'. Podemos ingresar una hora sin fecha, en tal caso, coloca la fecha "1900-01-01". Por ejemplo, si ingresamos '10:15', mostrar '1900-01-01 10:15.000'. Podemos emplear los operadores relacionales vistos para comparar fechas. Tipo Bytes de almacenamiento

_______________________________________ datetime 8 4

smalldatetime

.3.6.4 Campos de tipo text, ntext e image Los tipos de datos "ntext", "text" e "image" representan tipos de datos de longitud fija y variable en los que se pueden guardar gran cantidad de informacin, caracteres unicode y no unicode y datos binarios. "ntext" almacena datos unicode de longitud variable y el mximo es de aproximadamente 1000000000 caracteres, en bytes, el tamao es el doble de los caracteres ingresados (2 GB). "text" almacena datos binarios no unicode de longitud variable, el mximo es de 2000000000 caracteres aprox. (2 GB). No puede emplearse en parmetros de procedimientos almacenados. 35

SQL SERVER 2008

"image" es un tipo de dato de longitud variable que puede contener de 0 a 2000000000 bytes (2 GB) aprox. de datos binarios. Se emplea para almacenar gran cantidad de informacin o grficos. Se emplean estos tipos de datos para almacenar valores superiores a 8000 caracteres. Ninguno de estos tipos de datos admiten argumento para especificar su longitud, como en el caso de los tipos "char", o "varchar". Como estos tipos de datos tiene gran tamao, SQL Server los almacena fuera de los registros, en su lugar guarda un puntero (de 16 bytes) que apunta a otro sitio que contiene los datos. Para declarar un campo de alguno de estos tipos de datos, colocamos el nombre del campo seguido del tipo de dato: ... NOMBRECAMPO text .... Otras consideraciones importantes: - No pueden definirse variables de estos tipos de datos. - Los campos de estos tipos de datos no pueden emplearse para ndices.

36

SQL SERVER 2008

- La nica restriccin que puede aplicar a estos tipos de datos es "default". - Se pueden asociar valores predeterminados pero no reglas a campos de estos tipos de datos. - No pueden alterarse campos de estos tipos con "alter table". .3.7 Funciones en SQL SERVER SQL Server ofrece varios tipos de funciones para realizar distintas operaciones. .3.7.1 Funciones para el manejo de cadenas Microsoft SQL Server tiene algunas funciones para trabajar con cadenas de caracteres. Estas son algunas: - substring(cadena, inicio, longitud): devuelve una parte de la cadena especificada como primer argumento, empezando desde la posicin especificada por el segundo argumento y de tantos caracteres de longitud como indica el tercer argumento. Ejemplo: select substring('Buenas tardes',8,6); retorna "tardes". - str(numero, longitud, cantidaddecimales): convierte nmeros a caracteres; el primer parmetro indica el valor numrico a convertir, el segundo la longitud del resultado (debe ser mayor o igual a la parte entera del nmero ms el signo si lo tuviese) y el tercero, la cantidad

37

SQL SERVER 2008

de decimales. El segundo y tercer argumento son opcionales y deben ser positivos. String significa cadena en ingls. Ejemplo: se convierte el valor numrico "123.456" a cadena, especificando 7 de longitud y 3 decimales: select str(123.456,7,3); select str(-123.456,7,3); retorna '-123.46'; Si no se colocan el segundo y tercer argumeno, la longitud predeterminada es 10 y la cantidad de decimales 0 y se redondea a entero. Ejemplo: se convierte el valor numrico "123.456" a cadena: select str(123.456); retorna '123'; select str(123.456,3); retorna '123'; 38

SQL SERVER 2008

Si el segundo parmetro es menor a la parte entera del nmero, devuelve asteriscos (*). Ejemplo: select str(123.456,2,3); retorna "**". - stuff(cadena1, inicio, cantidad, cadena2): inserta la cadena enviada como cuarto argumento, en la posicin indicada en el segundo argumento, reemplazando la cantidad de caracteres indicada por el tercer argumento en la cadena que es primer parmetro. Stuff significa rellenar en ingls. Ejemplo: select stuff('abcde',3,2,'opqrs'); retorna "abopqrse". Es decir, coloca en la posicin 2 la cadena "opqrs" y reemplaza 2 caracteres de la primer cadena. Los argumentos numricos deben ser positivos y menor o igual a la longitud de la primera cadena, caso contrario, retorna "null". Si el tercer argumento es mayor que la primera cadena, se elimina hasta el primer carcter. - len(cadena): retorna la longitud de la cadena enviada como argumento. "len" viene de length, que significa longitud en ingls. Ejemplo: select len('Hola'); 39

devuelve 4.

SQL SERVER 2008

- char(x): retorna un caracter en cdigo ASCII del entero enviado como argumento. Ejemplo: select char(65); retorna "A". - left(cadena ,longitud): retorna la cantidad (longitud) de caracteres de la cadena comenzando desde la izquierda, primer caracter. Ejemplo: select left('buenos dias',8); retorna "buenos d". - right(cadena,longitud): retorna la cantidad (longitud) de caracteres de la cadena comenzando desde la derecha, ltimo caracter. Ejemplo: select right('buenos dias',8); retorna "nos dias". -lower(cadena): retornan la cadena con todos los caracteres en minsculas. lower significa reducir en ingls. Ejemplo: 40

select lower('HOLA ESTUDIAnte'); retorna "hola estudiante".

SQL SERVER 2008

-upper(cadena): retornan la cadena con todos los caracteres en maysculas. Ejemplo: select upper('HOLA ESTUDIAnte'); -ltrim(cadena): retorna la cadena con los espacios de la izquierda eliminados. Trim significa recortar. Ejemplo: select ltrim(' Hola '); retorna "Hola ". - rtrim(cadena): retorna la cadena con los espacios de la derecha eliminados. Ejemplo: select rtrim(' Hola '); retorna " Hola". - replace(cadena, cadenareemplazo, cadenareemplazar): retorna la cadena con todas las ocurrencias de la subcadena reemplazo por la subcadena a reemplazar. Ejemplo:

41

SQL SERVER 2008

select replace('xxx.sqlserverya.com','x','w'); retorna "www.sqlserverya.com'. - reverse(cadena): devuelve la cadena invirtiendo el order de los caracteres. Ejemplo: select reverse('Hola'); retorna "aloH". - patindex(patron,cadena): devuelve la posicin de comienzo (de la primera ocurrencia) del patrn especificado en la cadena enviada como segundo argumento. Si no la encuentra retorna 0. Ejemplos: select patindex('%Luis%', 'Jorge Luis Borges'); retorna 7. select patindex('%or%', 'Jorge Luis Borges'); retorna 2.

42

SQL SERVER 2008

select patindex('%ar%', 'Jorge Luis Borges'); retorna 0. - charindex(subcadena, cadena, inicio): devuelve la posicin donde comienza la subcadena en la cadena, comenzando la bsqueda desde la posicin indicada por "inicio". Si el tercer argumento no se coloca, la bsqueda se inicia desde 0. Si no la encuentra, retorna 0. Ejemplos: select charindex('or','Jorge Luis Borges',5); retorna 13. select charindex('or','Jorge Luis Borges'); retorna 2. select charindex('or','Jorge Luis Borges',14); retorna 0. select charindex('or', 'Jorge Luis Borges'); retorna 0.

43

SQL SERVER 2008

- replicate(cadena,cantidad): repite una cadena la cantidad de veces especificada. Ejemplo: select replicate ('Hola',3); retorna "HolaHolaHola"; - space(cantidad): retorna una cadena de espacios de longitud indicada por "cantidad", que debe ser un valor positivo. Ejemplo: select 'Hola'+space(1)+'que tal'; retorna "Hola que tal". Se pueden emplear estas funciones enviando como argumento el nombre de un campo de tipo caracter. .3.7.2 Funciones para el manejo matemtico Las funciones matemticas realizan operaciones con expresiones numricas y retornan un resultado, operan con tipos de datos numricos. Microsoft SQL Server tiene algunas funciones para trabajar con nmeros. Aqu presentamos algunas. 44

SQL SERVER 2008

-abs(x): retorna el valor absoluto del argumento "x". Ejemplo: select abs(-20); retorna 20. -ceiling(x): redondea hacia arriba el argumento "x". Ejemplo: select ceiling(12.34); retorna 13. -floor(x): redondea hacia abajo el argumento "x". Ejemplo: select floor(12.34); retorna 12. - %: %: devuelve el resto de una divisin. Ejemplos: select 10%3; retorna 1. 45

select 10%2; retorna 0.

SQL SERVER 2008

-power(x,y): retorna el valor de "x" elevado a la "y" potencia. Ejemplo: select power(2,3); retorna 8. -round(numero,longitud): retorna un nmero redondeado a la longitud especificada. "longitud" debe ser tinyint, smallint o int. Si "longitud" es positivo, el nmero de decimales es redondeado segn "longitud"; si es negativo, el nmero es redondeado desde la parte entera segn el valor de "longitud". Ejemplos: select round(123.456,1); retorna "123.400", es decir, redondea desde el primer decimal. select round(123.456,2); retorna "123.460", es decir, redondea desde el segundo decimal. 46

select round(123.456,-1);

SQL SERVER 2008

retorna "120.000", es decir, redondea desde el primer valor entero (hacia la izquierda). select round(123.456,-2); retorna "100.000", es decir, redondea desde el segundo valor entero (hacia la izquierda). -sign(x): si el argumento es un valor positivo devuelve 1;-1 si es negativo y si es 0, 0. -square(x): retorna el cuadrado del argumento. Ejemplo: select square(3); retorna 9. -srqt(x): devuelve la raiz cuadrada del valor enviado como argumento. SQL Server dispone de funciones trigonomtricas que retornan radianes. Se pueden emplear estas funciones enviando como argumento el nombre de un campo de tipo numrico. .3.7.3 Funciones para el manejo de fechas y horas Microsoft SQL Server ofrece algunas funciones para trabajar con fechas y horas. Estas son algunas:

47

SQL SERVER 2008

- getdate(): retorna la fecha y hora actuales. Ejemplo: select getdate(); - datepart(partedefecha, fecha): retorna la parte especfica de una fecha, el ao, trimestre, da, hora, etc. Los valores para "partedefecha" pueden ser: year (ao), quarter (cuarto), month (mes), day (dia), week (semana), hour (hora), minute (minuto), second (segundo) y millisecond (milisegundo). Ejemplos: select datepart(month,getdate()); retorna el nmero de mes actual; select datepart(day,getdate()); retorna el da actual; select datepart(hour,getdate()); retorna la hora actual; 48

SQL SERVER 2008

- datename(partedefecha,fecha): retorna el nombre de una parte especfica de una fecha. Los valores para "partedefecha" pueden ser los mismos que se explicaron anteriormente. Ejemplos: select datename(month,getdate()); retorna el nombre del mes actual; select datename(day,getdate()); - dateadd(partedelafecha, numero, fecha): agrega un intervalo a la fecha especificada, es decir, retorna una fecha adicionando a la fecha enviada como tercer argumento, el intervalo de tiempo indicado por el primer parmetro, tantas veces como lo indica el segundo parmetro. Los valores para el primer argumento pueden ser: year (ao), quarter (cuarto), month (mes), day (dia), week (semana), hour (hora), minute (minuto), second (segundo) y millisecond (milisegundo). Ejemplos: select dateadd(day,3,'1980/11/02'); retorna "1980/11/05", agrega 3 das. select dateadd(month,3,'1980/11/02'); retorna "1981/02/02", agrega 3 meses. 49

select dateadd(hour,2,'1980/11/02');

SQL SERVER 2008

retorna "1980/02/02 2:00:00", agrega 2 horas. select dateadd(minute,16,'1980/11/02'); retorna "1980/02/02 00:16:00", agrega 16 minutos. - datediff(partedelafecha, fecha1, fecha2): calcula el intervalo de tiempo (segn el primer argumento) entre las 2 fechas. El resultado es un valor entero que corresponde a fecha2- fecha1. Los valores de "partedelafecha) pueden ser los mismos que se especificaron anteriormente. Ejemplos: select datediff (day,'2005/10/28','2006/10/28'); retorna 365 (das). select datediff(month,'2005/10/28','2006/11/29'); retorna 13 (meses). - day(fecha): retorna el da de la fecha especificada. Ejemplo: select day(getdate()); 50

SQL SERVER 2008

- month(fecha): retorna el mes de la fecha especificada. Ejemplo: select month(getdate()); - year(fecha): retorna el ao de la fecha especificada. Ejemplo: select year(getdate()); Se pueden emplear estas funciones enviando como argumento el nombre de un campo de tipo datetime o smalldatetime. .3.8 Atributos autonumricos (identity) Un campo numrico puede tener un atributo extra "identity". Los valores de un campo con este atributo genera valores secuenciales que se inician en 1 y se incrementan en 1 automticamente. Se utiliza generalmente en campos correspondientes a cdigos de identificacin para generar valores nicos para cada nuevo registro que se inserta. Slo puede haber un campo "identity" por tabla. Para que un campo pueda establecerse como "identity", ste debe ser entero (tambin puede ser de un subtipo de entero o decimal con escala 0, tipos que estudiaremos posteriormente).

51

SQL SERVER 2008

Para que un campo genere sus valores automticamente, debemos agregar el atributo "identity" luego de su definicin al crear la tabla: create table libros( codigo int identity, titulo varchar(40) not null, autor varchar(30), editorial varchar(15), precio float ); Cuando un campo tiene el atributo "identity" no se puede ingresar valor para l, porque se inserta automticamente tomando el ltimo valor como referencia, o 1 si es el primero. Para ingresar registros omitimos el campo definido como "identity", por ejemplo: insert into libros (titulo,autor,editorial,precio) values('El aleph','Borges','Emece',23); Este primer registro ingresado guardar el valor 1 en el campo correspondiente al cdigo. Si continuamos ingresando registros, el cdigo (dato que no ingresamos) se cargar automticamente siguiendo la secuencia de autoincremento. 52

SQL SERVER 2008

No est permitido ingresar el valor correspondiente al campo "identity", por ejemplo: insert into libros (codigo,titulo,autor,editorial,precio) values(5,'Martin Fierro','Jose Hernandez','Paidos',25); generar un mensaje de error. "identity" permite indicar el valor de inicio de la secuencia y el incremento, pero lo veremos posteriormente. Un campo definido como "identity" generalmente se establece como clave primaria. Un campo "identity" no es editable, es decir, no se puede ingresar un valor ni actualizarlo. Un campo de identidad no permite valores nulos, aunque no se indique especificamente. Si ejecutamos el procedimiento "sp_columns()" veremos que en el campo "codigo" en la columna "TYPE_NAME" aparece "int identity" y en la columna "IS_NULLABLE" aparece "NO". Los valores secuenciales de un campo "identity" se generan tomando como referencia el ltimo valor ingresado; si se elimina el ltimo registro ingresado (por ejemplo 3) y luego se inserta otro registro, SQL Server seguir la secuencia, es decir, colocar el valor "4". Otras consideraciones sobre los atributos autonumricos El atributo "identity" permite indicar el valor de inicio de la secuencia y el incremento, para ello usamos la siguiente sintaxis: 53

create table libros( codigo int identity(100,2), titulo varchar(20), autor varchar(30), precio float );

SQL SERVER 2008

Los valores comenzarn en "100" y se incrementarn de 2 en 2; es decir, el primer registro ingresado tendr el valor "100", los siguientes "102", "104", "106", etc. La funcin "ident_seed()" retorna el valor de inicio del campo "identity" de la tabla que nombramos: select ident_seed('libros'); La funcin "ident_incr()" retorna el valor de incremento del campo "identity" de la tabla nombrada: select ident_incr('libros'); Hemos visto que en un campo declarado "identity" no puede ingresarse explcitamente un valor.

54

SQL SERVER 2008

Para permitir ingresar un valor en un campo de identidad se debe activar la opcin "identity_insert": set identity_insert libros on; Es decir, podemos ingresar valor en un campo "identity" seteando la opcin "identity_insert" en "on". Cuando "identity_insert" est en ON, las instrucciones "insert" deben explicitar un valor: insert into libros (codigo,titulo) values (5,'Alicia en el pais de las maravillas'); Si no se coloca un valor para el campo de identidad, la sentencia no se ejecuta y aparece un mensaje de error: insert into libros (titulo,autor, editorial) values ('Matematica estas ahi','Paenza','Paidos'); El atributo "identity" no implica unicidad, es decir, permite repeticin de valores; por ello hay que tener cuidado al explicitar un valor porque se puede ingresar un valor repetido. Para desactivar la opcin "identity_insert" tipeamos: 55

set identity_insert libros off;

SQL SERVER 2008

.3.9 Tipos de datos definidos por el usuario Cuando definimos un campo de una tabla debemos especificar el tipo de datos, sabemos que los tipos de datos especifican el tipo de informacin (caracteres, nmeros, fechas) que pueden almacenarse en un campo. SQL Server proporciona distintos tipos de datos del sistema (char, varchar, int, decimal, datetime, etc.) y permite tipos de datos definidos por el usuario siempre que se basen en los tipos de datos existentes. Se pueden crear y eliminar tipos de datos definidos por el usuario. Se emplean cuando varias tablas deben almacenar el mismo tipo de datos en un campo y se quiere garantizar que todas tengan el mismo tipo y longitud. Para darle un nombre a un tipo de dato definido por el usuario debe considerar las mismas reglas que para cualquier identificador. No puede haber dos objetos con igual nombre en la misma base de datos. .3.9.1 Creacin de tipos de datos definidos por el usuario Para crear un tipo de datos definido por el usuario se emplea el procedimiento almacenado del sistema "sp_addtype". Sintaxis bsica: exec sp_addtype NOMBRENUEVOTIPO, 'TIPODEDATODELSISTEMA', 'OPCIONNULL'; Creamos un tipo de datos definido por el usuario llamado "tipo_documento" que admite valores nulos: exec sp_addtype tipo_documento, 'char(8)', 'null'; 56

SQL SERVER 2008

Ejecutando el procedimiento almacenado "sp_help" junto al nombre del tipo de dato definido por el usuario se obtiene informacin del mismo (nombre, el tipo de dato en que se basa, la longitud, si acepta valores nulos, si tiene valor por defecto y reglas asociadas). Tambin podemos consultar la tabla "systypes" en la cual se almacena informacin de todos los tipos de datos: select name from systypes; .3.9.2 Eliminacin de tipos de datos definidos por el usuario Podemos eliminar un tipo de dato definido por el usuario con el procedimiento almacenado "sp_droptype": exec sp_droptype TIPODEDATODEFINIDOPORELUSUARIO; Eliminamos el tipo de datos definido por el usuario llamado "tipo_documento": exec sp_droptype tipo_documento; Si intentamos eliminar un tipo de dato inexistente, aparece un mensaje indicando que no existe. Los tipos de datos definidos por el usuario se almacenan en la tabla del sistema "systypes".

57

SQL SERVER 2008

Podemos averiguar si un tipo de dato definido por el usuario existe para luego eliminarlo: if exists (select *from systypes where name = 'NOMBRETIPODEDATODEFINIDOPORELUSUARIO') exec sp_droptype TIPODEDATODEFINIDOPORELUSUARIO; Consultamos la tabla "systypes" para ver si existe el tipo de dato "tipo_documento", si es as, lo eliminamos: if exists (select *from systypes where name = 'tipo_documento') exec sp_droptype tipo_documento; No se puede eliminar un tipo de datos definido por el usuario si alguna tabla (u otro objeto) hace uso de l; por ejemplo, si una tabla tiene un campo definido con tal tipo de dato. Si eliminamos un tipo de datos definido por el usuario, desaparecen las asociaciones de las reglas y valores predeterminados, pero tales reglas y valores predeterminados, no se eliminan, siguen existiendo en la base de datos. .3.10 Campos calculados en una base de datos Un campo calculado es un campo que no se almacena fsicamente en la tabla. SQL Server emplea una frmula que detalla el usuario al definir dicho campo para calcular el valor segn otros campos de la misma tabla. 58

Un campo calculado no puede: - definirse como "not null". - ser una subconsulta.

SQL SERVER 2008

- tener restriccin "default" o "foreign key". - Puede ser empleado como llave de un ndice o parte de restricciones "primary key" o "unique" si la expresin que la define no cambia en cada consulta. Creamos un campo calculado denominado "sueldototal" que suma al sueldo bsico de cada empleado la cantidad abonada por los hijos (100 por cada hijo): create table empleados( documento char(8), nombre varchar(10), domicilio varchar(30), sueldobasico decimal(6,2), cantidadhijos tinyint default 0, sueldototal as sueldobasico + (cantidadhijos*100) ); Tambin se puede agregar un campo calculado a una tabla existente: insertarse ni actualizarse.

59

alter table NOMBRETABLA

SQL SERVER 2008

add NOMBRECAMPOCALCULADO as EXPRESION; alter table empleados add sueldototal as sueldo+(cantidadhijos*100); Los campos de los cuales depende el campo calculado no pueden eliminarse, se debe eliminar primero el campo calculado. .3.11 Agregar y eliminar campos de una tabla La instruccin "alter table" permite modificar la estructura de una tabla. Podemos utilizarla para agregar, modificar y eliminar campos de una tabla. Para agregar un nuevo campo a una tabla empleamos la siguiente sintaxis bsica: alter table NOMBRETABLA add NOMBRENUEVOCAMPO DEFINICION; En el siguiente ejemplo agregamos el campo "cantidad" a la tabla "libros", de tipo tinyint, que acepta valores nulos: alter table libros add cantidad tinyint;

60

SQL SERVER 2008

Puede verificarse la alteracin de la estructura de la tabla ejecutando el procedimiento almacenado "sp_columns". SQL Server no permite agregar campos "not null" a menos que se especifique un valor por defecto: alter table libros add autor varchar(20) not null default 'Desconocido'; En el ejemplo anterior, se agreg una restriccin "default" para el nuevo campo, que puede verificarse ejecutando el procedimiento almacenado "sp_helpconstraint". Al agregar un campo puede especificarse que sea "identity" (siempre que no exista otro campo identity). Para eliminar campos de una tabla la sintaxis bsica es la siguiente: alter table NOMBRETABLA drop column NOMBRECAMPO; En el siguiente ejemplo eliminamos el campo "precio" de la tabla "libros": alter table libros drop column precio; 61

SQL SERVER 2008

No pueden eliminarse los campos que son usados por un ndice o tengan restricciones. No puede eliminarse un campo si es el nico en la tabla. Podemos eliminar varios campos en una sola sentencia: alter table libros drop column editorial,edicion; .3.12 Modificar campos de una tabla Hemos visto que "alter table" permite modificar la estructura de una tabla. Tambin podemos utilizarla para modificar campos de una tabla. La sintaxis bsica para modificar un campo existente es la siguiente: alter table NOMBRETABLA alter column CAMPO NUEVADEFINICION; Modificamos el campo "titulo" extendiendo su longitud y para que NO admita valores nulos: alter table libros alter column titulo varchar(40) not null; 62

SQL SERVER 2008

En el siguiente ejemplo alteramos el campo "precio" de la tabla "libros" que fue definido "decimal(6,2) not null" para que no acepte valores nulos: alter table libros alter column precio decimal(6,2) null; SQL Server tiene algunas excepciones al momento de modificar los campos. No permite modificar: - campos de tipo text, image, ntext y timestamp. - un campo que es usado en un campo calculado. - campos que son parte de ndices o tienen restricciones, a menos que el cambio no afecte al ndice o a la restriccin, por ejemplo, se puede ampliar la longitud de un campo de tipo caracter. - agregando o quitando el atributo "identity". - campos que afecten a los datos existentes cuando una tabla contiene registros (ejemplo: un campo contiene valores nulos y se pretende redefinirlo como "not null"; un campo int guarda un valor 300 y se pretende modificarlo a tinyint, etc.). .3.13 Agregar campos y restricciones a una tabla Podemos agregar un campo a una tabla y en el mismo momento aplicarle una restriccin. Para agregar un campo y establecer una restriccin, la sintaxis bsica es la siguiente: 63

alter table TABLA add CAMPO DEFINICION

SQL SERVER 2008

constraint NOMBRERESTRICCION TIPO; Agregamos a la tabla "libros", el campo "titulo" de tipo varchar(30) y una restriccin "unique" con ndice agrupado: alter table libros add titulo varchar(30) constraint UQ_libros_autor unique clustered; Agregamos a la tabla "libros", el campo "codigo" de tipo int identity not null y una restriccin "primary key" con ndice no agrupado: alter table libros add codigo int identity not null constraint PK_libros_codigo primary key nonclustered; Agregamos a la tabla "libros", el campo "precio" de tipo decimal(6,2) y una restriccin "check": alter table libros add precio decimal(6,2) constraint CK_libros_precio check (precio>=0); 64

SQL SERVER 2008

.3.14 Consulta de datos de una tabla (SELECT) Hemos aprendido cmo ver todos los registros de una tabla, empleando la instruccin "select". La sintaxis bsica y general es la siguiente: select * from NOMBRETABLA; El asterisco (*) indica que se seleccionan todos los campos de la tabla. Podemos especificar el nombre de los campos que queremos ver separndolos por comas: select titulo,autor from libros; La lista de campos luego del "select" selecciona los datos correspondientes a los campos nombrados. En el ejemplo anterior seleccionamos los campos "titulo" y "autor" de la tabla "libros", mostrando todos los registros. Los datos aparecen ordenados segn la lista de seleccin, en dicha lista los nombres de los campos se separan con comas. Tambin es posible recuperar algunos registros. Existe una clusula, "where" con la cual podemos especificar condiciones para una consulta "select". Es decir, podemos recuperar algunos registros, slo los que cumplan con ciertas 65

SQL SERVER 2008

condiciones indicadas con la clusula "where". Por ejemplo, queremos ver el usuario cuyo nombre es "Marcelo", para ello utilizamos "where" y luego de ella, la condicin: select nombre, clave from usuarios where nombre='Marcelo'; La sintaxis bsica y general es la siguiente: select NOMBRECAMPO1, ..., NOMBRECAMPOn from NOMBRETABLA where CONDICION; Para las condiciones se utilizan operadores relacionales (tema que trataremos ms adelante en detalle). El signo igual(=) es un operador relacional. Para la siguiente seleccin de registros especificamos una condicin que solicita los usuarios cuya clave es igual a "River": select nombre,clave from usuarios where clave='River'; Si ningn registro cumple la condicin establecida con el "where", no aparecer ningn registro. 66

SQL SERVER 2008

Entonces, con "where" establecemos condiciones para recuperar algunos registros. .3.14.1 Operadores relacionales usados para crear condiciones en el WHERE Los operadores relacionales (o de comparacin) nos permiten comparar dos expresiones, que pueden ser variables, valores de campos, etc. Hemos aprendido a especificar condiciones de igualdad para seleccionar registros de una tabla; por ejemplo: select *from libros where autor='Borges'; Utilizamos el operador relacional de igualdad. Los operadores relacionales vinculan un campo con un valor para que SQL Server compare cada registro (el campo especificado) con el valor dado. Los operadores relacionales son los siguientes: = <> > < >= <= igual distinto mayor menor mayor o igual menor o igual 67

SQL SERVER 2008

Podemos seleccionar los registros cuyo autor sea diferente de "Borges", para ello usamos la condicin: select * from libros where autor<>'Borges'; Podemos comparar valores numricos. Por ejemplo, queremos mostrar los ttulos y precios de los libros cuyo precio sea mayor a 20 pesos: select titulo, precio from libros where precio>20; Queremos seleccionar los libros cuyo precio sea menor o igual a 30: select *from libros where precio<=30; Los operadores relacionales comparan valores del mismo tipo. Se emplean para comprobar si un campo cumple con una condicin. .3.14.2 Operadores lgicos usados para crear condiciones en el WHERE

68

SQL SERVER 2008

Hasta el momento, hemos aprendido a establecer una condicin con "where" utilizando operadores relacionales. Podemos establecer ms de una condicin con la clusula "where", para ello aprenderemos los operadores lgicos. Son los siguientes: - and, significa "y", - or, significa "y/o", - not, significa "no", invierte el resultado - (), parntesis Los operadores lgicos se usan para combinar condiciones. Si queremos recuperar todos los libros cuyo autor sea igual a "Borges" y cuyo precio no supere los 20 pesos, necesitamos 2 condiciones: select *from libros where (autor='Borges') and (precio<=20); Los registros recuperados en una sentencia que une 2 condiciones con el operador "and", cumplen con las 2 condiciones. Queremos ver los libros cuyo autor sea "Borges" y/o cuya editorial sea "Planeta": 69

select *from libros where autor='Borges' or editorial='Planeta';

SQL SERVER 2008

En la sentencia anterior usamos el operador "or"; indicamos que recupere los libros en los cuales el valor del campo "autor" sea "Borges" y/o el valor del campo "editorial" sea "Planeta", es decir, seleccionar los registros que cumplan con la primera condicin, con la segunda condicin o con ambas condiciones. Los registros recuperados con una sentencia que une 2 condiciones con el operador "or", cumplen 1 de las condiciones o ambas. Queremos recuperar los libros que NO cumplan la condicin dada, por ejemplo, aquellos cuya editorial NO sea "Planeta": select *from libros where not editorial='Planeta'; El operador "not" invierte el resultado de la condicin a la cual antecede. Los registros recuperados en una sentencia en la cual aparece el operador "not", no cumplen con la condicin a la cual afecta el "NOT".

70

SQL SERVER 2008

Los parntesis se usan para encerrar condiciones, para que se evalen como una sola expresin. Cuando explicitamos varias condiciones con diferentes operadores lgicos (combinamos "and", "or") permite establecer el orden de prioridad de la evaluacin; adems permite diferenciar las expresiones ms claramente. Por ejemplo, las siguientes expresiones devuelven un resultado diferente: select*from libros where (autor='Borges') or (editorial='Paidos' and precio<20); select *from libros where (autor='Borges' or editorial='Paidos') and (precio<20); Si bien los parntesis no son obligatorios en todos los casos, se recomienda utilizarlos para evitar confusiones. El orden de prioridad de los operadores lgicos es el siguiente: "not" se aplica antes que "and" y "and" antes que "or", si no se especifica un orden de evaluacin mediante el uso de parntesis. El orden en el que se evalan los operadores con igual nivel de precedencia es indefinido, por ello se recomienda usar los parntesis. 71

SQL SERVER 2008

Entonces, para establecer ms de una condicin en un "where" es necesario emplear operadores lgicos. "and" significa "y", indica que se cumplan ambas condiciones; "or" significa "y/o", indica que se cumpla una u otra condicin (o ambas); "not" significa "no", indica que no se cumpla la condicin especificada. .3.14.3 El operadores relacional IS NULL Se emplea el operador "is null" para recuperar los registros en los cuales est almacenado el valor "null" en un campo especfico: select *from libros where editorial is null; Para obtener los registros que no contiene "null", se puede emplear "is not null", esto mostrar los registros con valores conocidos. Siempre que sea posible, emplee condiciones de bsqueda positivas ("is null"), evite las negativas ("is not null") porque con ellas se evalan todos los registros y esto hace ms lenta la recuperacin de los datos. .3.14.4 El operadores relacional BETWEEN Otro operador relacional es "between", trabajan con intervalos de valores. Hasta ahora, para recuperar de la tabla "libros" los libros con precio mayor o igual a 20 y menor o igual a 40, usamos 2 condiciones unidas por el operador lgico "and": select * from libros

72

where precio>=20 and precio<=40;

SQL SERVER 2008

Podemos usar "between" y as simplificar la consulta: select *from libros where precio between 20 and 40; Averiguamos si el valor de un campo dado (precio) est entre los valores mnimo y mximo especificados (20 y 40 respectivamente). "between" significa "entre". Trabaja con intervalo de valores. Este operador se puede emplear con tipos de datos numricos y money (en tales casos incluyen los valores mnimo y mximo) y tipos de datos fecha y hora (incluye slo el valor mnimo). No tiene en cuenta los valores "null". Si agregamos el operador "not" antes de "between" el resultado se invierte, es decir, se recuperan los registros que estn fuera del intervalo especificado. Por ejemplo, recuperamos los libros cuyo precio NO se encuentre entre 20 y 35, es decir, los menores a 20 y mayores a 35: select *from libros where precio not between 20 and 35; 73

SQL SERVER 2008

Siempre que sea posible, emplee condiciones de bsqueda positivas ("between"), evite las negativas ("not between") porque hace ms lenta la recuperacin de los datos. .3.14.5 El operadores relacional IN Se utiliza "in" para averiguar si el valor de un campo est incluido en una lista de valores especificada. En la siguiente sentencia usamos "in" para averiguar si el valor del campo autor est incluido en la lista de valores especificada (en este caso, 2 cadenas). Hasta ahora, para recuperar los libros cuyo autor sea 'Paenza' o 'Borges' usbamos 2 condiciones: select *from libros where autor='Borges' or autor='Paenza'; Podemos usar "in" y simplificar la consulta: select *from libros where autor in('Borges','Paenza'); Para recuperar los libros cuyo autor no sea 'Paenza' ni 'Borges' usbamos: select * from libros where autor<>'Borges' and 74

autor<>'Paenza';

SQL SERVER 2008

Tambin podemos usar "in" anteponiendo "not": select *from libros where autor not in ('Borges','Paenza'); Empleando "in" averiguamos si el valor del campo est incluido en la lista de valores especificada; con "not" antecediendo la condicin, invertimos el resultado, es decir, recuperamos los valores que no se encuentran (coindicen) con la lista de valores. Los valores "null" no se consideran. Recuerde: siempre que sea posible, emplee condiciones de bsqueda positivas ("in"), evite las negativas ("not in") porque con ellas se evalan todos los registros y esto hace ms lenta la recuperacin de los datos. .3.14.6 El operador relacional LIKE. (Bsqueda de patrones) Existe un operador relacional que se usa para realizar comparaciones exclusivamente de cadenas, "like" y "not like". Hemos realizado consultas utilizando operadores relacionales para comparar cadenas. Por ejemplo, sabemos recuperar los libros cuyo autor sea igual a la cadena "Borges": select * 75

from libros where autor='Borges';

SQL SERVER 2008

El operador igual ("=") nos permite comparar cadenas de caracteres, pero al realizar la comparacin, busca coincidencias de cadenas completas, realiza una bsqueda exacta. Imaginemos que tenemos registrados estos 2 libros: "El Aleph", "Borges"; "Antologia poetica", "J.L. Borges"; Si queremos recuperar todos los libros de "Borges" y especificamos la siguiente condicin: select * from libros where autor='Borges'; slo aparecer el primer registro, ya que la cadena "Borges" no es igual a la cadena "J.L. Borges". Esto sucede porque el operador "=" (igual), tambin el operador "<>" (distinto) comparan cadenas de caracteres completas. Para comparar porciones de cadenas utilizamos los operadores "like" y "not like". 76

SQL SERVER 2008

Entonces, podemos comparar trozos de cadenas de caracteres para realizar consultas. Para recuperar todos los registros cuyo autor contenga la cadena "Borges" debemos tipear: select * from libros where autor like "%Borges%"; El smbolo "%" (porcentaje) reemplaza cualquier cantidad de caracteres (incluyendo ningn caracter). Es un caracter comodn. "like" y "not like" son operadores de comparacin que sealan igualdad o diferencia. Para seleccionar todos los libros que comiencen con "M": select * from libros where titulo like 'M%'; Note que el smbolo "%" ya no est al comienzo, con esto indicamos que el ttulo debe tener como primera letra la "M" y luego, cualquier cantidad de caracteres. Para seleccionar todos los libros que NO comiencen con "M": select * from libros 77

where titulo not like 'M%';

SQL SERVER 2008

As como "%" reemplaza cualquier cantidad de caracteres, el guin bajo "_" reemplaza un caracter, es otro caracter comodn. Por ejemplo, queremos ver los libros de "Lewis Carroll" pero no recordamos si se escribe "Carroll" o "Carrolt", entonces tipeamos esta condicin: select * from libros where autor like "%Carrol_"; Otro caracter comodn es [] reemplaza cualquier carcter contenido en el conjunto especificado dentro de los corchetes. Para seleccionar los libros cuya editorial comienza con las letras entre la "P" y la "S" usamos la siguiente sintaxis: select titulo,autor,editorial from libros where editorial like '[P-S]%'; Ejemplos: ... like '[a-cf-i]%': busca cadenas que comiencen con a,b,c,f,g,h o i; ... like '[-acfi]%': busca cadenas que comiencen con -,a,c,f o i; ... like 'A[_]9%': busca cadenas que comiencen con 'A_9'; 78

SQL SERVER 2008

... like 'A[nm]%': busca cadenas que comiencen con 'An' o 'Am'. El cuarto caracter comodn es [^] reemplaza cualquier caracter NO presente en el conjunto especificado dentro de los corchetes. Para seleccionar los libros cuya editorial NO comienza con las letras "P" ni "N" tipeamos: select titulo,autor,editorial from libros where editorial like '[^PN]%'; "like" se emplea con tipos de datos char, nchar, varchar, nvarchar o datetime. Si empleamos "like" con tipos de datos que no son caracteres, SQL Server convierte (si es posible) el tipo de dato a caracter. Por ejemplo, queremos buscar todos los libros cuyo precio se encuentre entre 10.00 y 19.99: select titulo,precio from libros where precio like '1_.%'; Queremos los libros que NO incluyen centavos en sus precios: select titulo,precio from libros where precio like '%.00'; 79

SQL SERVER 2008

Para bsquedas de caracteres comodines como literales, debe incluirlo dentro de corchetes, por ejemplo, si busca: ... like '%[%]%': busca cadenas que contengan el signo '%'; ... like '%[_]%': busca cadenas que contengan el signo '_'; ... like '%[[]%': busca cadenas que contengan el signo '['; .3.14.7 La instruccin ORDER BY. (Ordenar registros) Podemos ordenar el resultado de un "select" para que los registros se muestren ordenados por algn campo, para ello usamos la clusula "order by". La sintaxis bsica es la siguiente: select * from NOMBRETABLA order by CAMPO; Por ejemplo, recuperamos los registros de la tabla "libros" ordenados por el ttulo: select * from libros order by titulo;

80

SQL SERVER 2008

Aparecen los registros ordenados alfabticamente por el campo especificado. Tambin podemos colocar el nmero de orden del campo por el que queremos que se ordene en lugar de su nombre, es decir, referenciar a los campos por su posicin en la lista de seleccin. Por ejemplo, queremos el resultado del "select" ordenado por "precio": select titulo,autor,precio from libros order by 3; Por defecto, si no aclaramos en la sentencia, los ordena de manera ascendente (de menor a mayor). Podemos ordenarlos de mayor a menor, para ello agregamos la palabra clave "desc": select * from libros order by editorial desc; Tambin podemos ordenar por varios campos, por ejemplo, por "titulo" y "editorial": select * from libros order by titulo, editorial; 81

SQL SERVER 2008

Incluso, podemos ordenar en distintos sentidos, por ejemplo, por "titulo" en sentido ascendente y "editorial" en sentido descendente: select * from libros order by titulo asc, editorial desc; Debe aclararse al lado de cada campo, pues estas palabras claves afectan al campo inmediatamente anterior. Es posible ordenar por un campo que no se lista en la seleccin. Se permite ordenar por valores calculados o expresiones. La clusula "order by" no puede emplearse para campos text, ntext e image. .3.14.8 La instruccin DISTINCT. (Eliminacin de duplicados) Con la clusula "distinct" se especifica que los registros con ciertos datos duplicados sean obviadas en el resultado. Por ejemplo, queremos conocer todos los autores de los cuales tenemos libros, si utilizamos esta sentencia: select autor from libros; 82

SQL SERVER 2008

Aparecen repetidos. Para obtener la lista de autores sin repeticin usamos: select distinct autor from libros; Tambin podemos tipear: select autor from libros group by autor; Note que en los tres casos anteriores aparece "null" como un valor para "autor" Si slo queremos la lista de autores conocidos, es decir, no queremos incluir "null" en la lista, podemos utilizar la sentencia siguiente: select distinct autor from libros where autor is not null; Para contar los distintos autores, sin considerar el valor "null" usamos: select count(distinct autor)

83

from libros;

SQL SERVER 2008

Note que si contamos los autores sin "distinct", no incluir los valores "null" pero si los repetidos: select count(autor) from libros; Esta sentencia cuenta los registros que tienen autor. Podemos combinarla con "where". Por ejemplo, queremos conocer los distintos autores de la editorial "Planeta": select distinct autor from libros where editorial='Planeta'; Tambin puede utilizarse con "group by" para contar los diferentes autores por editorial: select editorial, count(distinct autor) from libros group by editorial; La clusula "distinct" afecta a todos los campos presentados. Para mostrar los ttulos y editoriales de los libros sin repetir ttulos ni editoriales, usamos: 84

select distinct titulo,editorial from libros order by titulo;

SQL SERVER 2008

Note que los registros no estn duplicados, aparecen ttulos iguales pero con editorial diferente, cada registro es diferente. La palabra clave "distinct" no est permitida con las clusulas "compute" y "compute by". .3.14.9 La instruccin TOP. (Mostrar los primeros) La palabra clave "top" se emplea para obtener slo una cantidad limitada de registros, los primeros n registros de una consulta. Con la siguiente consulta obtenemos todos los datos de los primeros 2 libros de la tabla: select top 2 * from libros; Es decir, luego del "select" se coloca "top" seguido de un nmero entero positivo y luego se contina con la consulta. Se puede combinar con "order by": select top 3 titulo,autor from libros 85

order by autor;

SQL SERVER 2008

En la consulta anterior solicitamos los ttulos y autores de los 3 primeros libros, ordenados por autor. Cuando se combina con "order by" es posible emplear tambin la clusula "with ties". Esta clusula permite incluir en la seleccin, todos los registros que tengan el mismo valor del campo por el que se ordena, que el ltimo registro retornado si el ltimo registro retornado (es decir, el nmero n) tiene un valor repetido en el registro n+1. Es decir, si el valor del campo por el cual se ordena del ltimo registro retornado (el nmero n) est repetido en los siguientes registros (es decir, el n+1 tiene el mismo valor que n, y el n+2, etc.), lo incluye en la seleccin. Veamos un ejemplo: select top 3 with ties * from libros order by autor; Esta consulta solicita el retorno de los primeros 3 registros; en caso que el registro nmero 4 (y los posteriores), tengan el mismo valor en "autor" que el ltimo registro retornado (nmero 3), tambin aparecern en la seleccin. Si colocamos un valor para "top" que supera la cantidad de registros de la tabla, SQL Server muestra todos los registros. .3.14.10 Campos calculados en el resultado de un SELECT 86

SQL SERVER 2008

Los operadores aritmticos permiten realizar clculos con valores numricos. Son: multiplicacin (*), divisin (/) y mdulo (%), suma (+) y resta (-). Es posible obtener salidas en las cuales una columna sea el resultado de un clculo y no un campo de una tabla. Si queremos ver los ttulos, precio y cantidad de cada libro escribimos la siguiente sentencia: select titulo,precio,cantidad from libros; Si queremos saber el monto total en dinero de un ttulo podemos multiplicar el precio por la cantidad por cada ttulo, pero tambin podemos hacer que SQL Server realice el clculo y lo incluya en una columna extra en la salida: select titulo, precio,cantidad, precio*cantidad from libros; Si queremos saber el precio de cada libro con un 10% de descuento podemos incluir en la sentencia los siguientes clculos: select titulo ,precio , precio-(precio*0.1) from libros; 87

SQL SERVER 2008

Tambin podemos actualizar los datos empleando operadores aritmticos: update libros set precio = precio-(precio*0.1); Todas las operaciones matemticas retornan "null" en caso de error. Ejemplo: select 5/0; Los operadores de concatenacin: permite concatenar cadenas, el ms (+). Para concatenar el ttulo, el autor y la editorial de cada libro usamos el operador de concatenacin ("+"): select titulo+'-'+autor+'-'+editorial from libros; Note que concatenamos adems unos guiones para separar los campos. .3.14.11 Renombrar un campo en el resultado de un SELECT (ALIAS) Una manera de hacer ms comprensible el resultado de una consulta consiste en cambiar los encabezados de las columnas. Por ejemplo, tenemos la tabla "agenda" con un campo "nombre" (entre otros) en el cual se almacena el nombre y apellido de nuestros amigos; queremos que al mostrar la informacin 88

SQL SERVER 2008

de dicha tabla aparezca como encabezado del campo "nombre" el texto "nombre y apellido", para ello colocamos un alias de la siguiente manera: select nombre as NombreYApellido, domicilio,telefono from agenda; Para reemplazar el nombre de un campo por otro, se coloca la palabra clave "as" seguido del texto del encabezado. Si el alias consta de una sola cadena las comillas no son necesarias, pero si contiene ms de una palabra, es necesario colocarla entre comillas simples: select nombre as 'Nombre y apellido', domicilio,telefono from agenda; Un alias puede contener hasta 128 caracteres. Tambin se puede crear un alias para columnas calculadas. La palabra clave "as" es opcional en algunos casos, pero es conveniente usarla.

89

SQL SERVER 2008

Entonces, un "alias" se usa como nombre de un campo o de una expresin. En estos casos, son opcionales, sirven para hacer ms comprensible el resultado; en otros casos, que veremos ms adelante, son obligatorios. .3.14.12 Valores Nulos (IS NULL) "null" significa "dato desconocido" o "valor inexistente". No es lo mismo que un valor "0", una cadena vaca o una cadena literal "null". A veces, puede desconocerse o no existir el dato correspondiente a algn campo de un registro. En estos casos decimos que el campo puede contener valores nulos. Por ejemplo, en nuestra tabla de libros, podemos tener valores nulos en el campo "precio" porque es posible que para algunos libros no le hayamos establecido el precio para la venta. En contraposicin, tenemos campos que no pueden estar vacos jams. Veamos un ejemplo. Tenemos nuestra tabla "libros". El campo "titulo" no debera estar vaco nunca, igualmente el campo "autor". Para ello, al crear la tabla, debemos especificar que dichos campos no admitan valores nulos: create table libros( titulo varchar(30) not null, autor varchar(20) not null, editorial varchar(15) null, precio float 90

);

SQL SERVER 2008

Para especificar que un campo no admita valores nulos, debemos colocar "not null" luego de la definicin del campo. En el ejemplo anterior, los campos "editorial" y "precio" si admiten valores nulos. Cuando colocamos "null" estamos diciendo que admite valores nulos (caso del campo "editorial"); por defecto, es decir, si no lo aclaramos, los campos permiten valores nulos (caso del campo "precio"). Si ingresamos los datos de un libro, para el cual an no hemos definido el precio podemos colocar "null" para mostrar que no tiene precio: insert into libros (titulo,autor,editorial,precio) values('El aleph','Borges','Emece',null); Note que el valor "null" no es una cadena de caracteres, no se coloca entre comillas. Entonces, si un campo acepta valores nulos, podemos ingresar "null" cuando no conocemos el valor. Tambin podemos colocar "null" en el campo "editorial" si desconocemos el nombre de la editorial a la cual pertenece el libro que vamos a ingresar: insert into libros (titulo,autor,editorial,precio) values('Alicia en el pais','Lewis Carroll',null,25); 91

SQL SERVER 2008

Si intentamos ingresar el valor "null" en campos que no admiten valores nulos (como "titulo" o "autor"), SQL Server no lo permite, muestra un mensaje y la insercin no se realiza; por ejemplo: insert into libros (titulo,autor,editorial,precio) values(null,'Borges','Siglo XXI',25); Para ver cules campos admiten valores nulos y cules no, podemos emplear el procedimiento almacenado "sp_columns" junto al nombre de la tabla. Nos muestra mucha informacin, en la columna "IS_NULLABLE" vemos que muestra "NO" en los campos que no permiten valores nulos y "YES" en los campos que si los permiten. Para recuperar los registros que contengan el valor "null" en algn campo, no podemos utilizar los operadores relacionales vistos anteriormente: = (igual) y <> (distinto); debemos utilizar los operadores "is null" (es igual a null) y "is not null" (no es null): select * from libros where precio is null; La sentencia anterior tendr una salida diferente a la siguiente: select * from libros where precio=0;

92

SQL SERVER 2008

Con la primera sentencia veremos los libros cuyo precio es igual a "null" (desconocido); con la segunda, los libros cuyo precio es 0. Igualmente para campos de tipo cadena, las siguientes sentencias "select" no retornan los mismos registros: select * from libros where editorial is null; select * from libros where editorial=''; Con la primera sentencia veremos los libros cuya editorial es igual a "null", con la segunda, los libros cuya editorial guarda una cadena vaca. Entonces, para que un campo no permita valores nulos debemos especificarlo luego de definir el campo, agregando "not null". Por defecto, los campos permiten valores nulos, pero podemos especificarlo igualmente agregando "null".

93

Vous aimerez peut-être aussi