Sie sind auf Seite 1von 378

1 - Objetivos y alcances del tutorial de Microsoft Sql Server

El curso brinda un concepto terico corto, luego un problema resuelto que invito a ejecutar, modificar y jugar con el mismo. Por ltimo, y lo ms importante, una serie de ejercicios propuestos que nos permitir saber si podemos aplicar el concepto. La nica herramienta que necesitamos inicialmente es este sitio ya que podr ejecutar todos los problemas como son la creacin de tablas, insert, delete, update, definicin de ndices y restricciones, creacin y ejecucin de procedimientos almacenados, vistas, subconsultas, creacin de trigger etc. La nica restriccin es que todos los visitantes de este sitio comparten la misma base de datos llamada: wi520641_sqlserverya (este nombre un poco singular se debe a que las empresas de hosting es la que lo define) Siempre que lancemos un comando SQL en el sitio www.sqlserverya.com.ar estaremos accediendo a la base de datos wi520641_sqlserverya.

2 - Crear una tabla (create table sp_tables - sp_columns - drop table)


Una base de datos almacena su informacin en tablas. Una tabla es una estructura de datos que organiza los datos en columnas y filas; cada columna es un campo (o atributo) y cada fila, un registro. La interseccin de una columna con una fila, contiene un dato especfico, un solo valor. Cada registro contiene un dato por cada columna de la tabla. Cada campo (columna) debe tener un nombre. El nombre del campo hace referencia a la informacin que almacenar. Cada campo (columna) tambin debe definir el tipo de dato que almacenar. Las tablas forman parte de una base de datos. Nosotros trabajaremos con la base de datos llamada wi520641_sqlserverya (este nombre se debe a que las empresas de hosting es la que lo define), que ya he creado en el servidor sqlserverya.com.ar. Para ver las tablas existentes creadas por los usuarios en una base de datos usamos el procedimiento almacenado "sp_tables @table_owner='dbo';":
sp_tables @table_owner='dbo';

El parmetro @table_owner='dbo' indica que solo muestre las tablas de usuarios y no las que crea el SQL Server para administracin interna. Finalizamos cada comando con un punto y coma. Al crear una tabla debemos resolver qu campos (columnas) tendr y que tipo de datos almacenarn cada uno de ellos, es decir, su estructura. La sintaxis bsica y general para crear una tabla es la siguiente:
create table NOMBRETABLA( NOMBRECAMPO1 TIPODEDATO, ... NOMBRECAMPON TIPODEDATO );

La tabla debe ser definida con un nombre que la identifique y con el cual accederemos a ella. Creamos una tabla llamada "usuarios" y entre parntesis definimos los campos y sus tipos:
create table usuarios ( nombre varchar(30), clave varchar(10) );

Cada campo con su tipo debe separarse con comas de los siguientes, excepto el ltimo. Cuando se crea una tabla debemos indicar su nombre y definir al menos un campo con su tipo de dato. En esta tabla "usuarios" definimos 2 campos:

nombre: que contendr una cadena de caracteres de 30 caracteres de longitud, que almacenar el nombre de usuario y clave: otra cadena de caracteres de 10 de longitud, que guardar la clave de cada usuario.

Cada usuario ocupar un registro de esta tabla, con su respectivo nombre y clave. Para nombres de tablas, se puede utilizar cualquier caracter permitido para nombres de directorios, el primero debe ser un caracter alfabtico y no puede contener espacios. La longitud mxima es de 128 caracteres. Si intentamos crear una tabla con un nombre ya existente (existe otra tabla con ese nombre), mostrar un mensaje indicando que ya hay un objeto llamado 'usuarios' en la base de datos y la sentencia no se ejecutar. Esto es muy importante ya que cuando haga los ejercicios en este sitio puede haber otra persona que haya creado una tabla con el nombre que usted especifique.

Para ver la estructura de una tabla usamos el procedimiento almacenado "sp_columns" junto al nombre de la tabla:
sp_columns usuarios;

aparece mucha informacin que no analizaremos en detalle, como el nombre de la tabla, su propietario, los campos, el tipo de dato de cada campo, su longitud, etc.:
...COLUMN_NAME TYPE_NAME LENGHT _______________________________________ nombre varchar 30 clave varchar 10

Para eliminar una tabla usamos "drop table" junto al nombre de la tabla a eliminar:
drop table usuarios;

Si intentamos eliminar una tabla que no existe, aparece un mensaje de error indicando tal situacin y la sentencia no se ejecuta. Para evitar este mensaje podemos agregar a la instruccin lo siguiente:
if object_id('usuarios') is not null drop table usuarios;

En la sentencia precedente especificamos que elimine la tabla "usuarios" si existe.

2 - Crear una tabla (create table sp_tables - sp_columns - drop table)


Problema: Vamos a crear una tabla llamada "usuarios". En primer lugar vamos a eliminar la tabla "usuarios" averiguando si existe (a esto vamos a repetirlo siempre porque puede haber otro usuario que haya creado una tabla con el mismo nombre):
if object_id('usuarios') is not null drop table usuarios;

Recordar que debemos finalizar cada comando con un punto y coma. La tabla "usuarios" contendr los siguientes campos:
- nombre: varchar de 30 caracteres de longitud, - clave: varchar de 10 caracteres de longitud.

Ahora si creamos la tabla:


create table usuarios ( nombre varchar(30), clave varchar(10) );

aparece un mensaje indicando que el comando se complet exitosamente. Veamos las tablas existentes:
sp_tables @table_owner='dbo';

Veamos la estructura de la tabla "usuarios":


sp_columns usuarios;

aparece mucha informacin que no analizaremos en detalle, como el nombre de la tabla, su propietario, los campos y sus tipos de datos, su longitud, etc.:
...COLUMN_NAME TYPE_NAME LENGHT... _______________________________________ nombre varchar 30 clave varchar 10

Intentemos crear una tabla con el mismo nombre, mostrar un mensaje indicando que ya hay un objeto llamado 'usuarios' en la base de datos y la sentencia no se ejecutar:
create table usuarios ( nombre varchar(30), clave varchar(10) );

Eliminemos la tabla:
drop table usuarios;

Verifiquemos si se ha eliminado:
sp_tables @table_owner='dbo';

no debe aparecer la tabla "usuarios".

if object_id('usuarios') is not null drop table usuarios;

create table usuarios ( nombre varchar(30), clave varchar(10) ); sp_tables @table_owner='dbo'; sp_columns usuarios; create table usuarios ( nombre varchar(30), clave varchar(10) );

drop table usuarios; sp_tables @table_owner='dbo'; 2 - Crear una tabla (create table sp_tables - sp_columns - drop table)

Primer problema:
Necesita almacenar los datos de sus amigos en una tabla. Los datos que guardar sern: apellido, nombre, domicilio y telfono. 1- Elimine la tabla "agenda" si existe: if object_id('agenda') is not null drop table agenda; 2- Intente crear una tabla llamada "/agenda": create table /agenda( apellido varchar(30), nombre varchar(20), domicilio varchar(30), telefono varchar(11) ); aparece un mensaje de error porque usamos un caracter invlido ("/") para el nombre. 3- Cree una tabla llamada "agenda", debe tener los siguientes campos: apellido, varchar(30); nombre, varchar(20); domicilio, varchar (30) y telefono, varchar(11): create table agenda( apellido varchar(30), nombre varchar(20), domicilio varchar(30), telefono varchar(11) ); 4- Intente crearla nuevamente. Aparece mensaje de error. 5- Visualice las tablas existentes (sp_tables @table_owner='dbo'). 6- Visualice la estructura de la tabla "agenda" (sp_columns). 7- Elimine la tabla.

8- Intente eliminar la tabla, sin controlar si existe. Debe aparecer un mensaje de error. if object_id('agenda') is not null drop table agenda; create table /agenda( apellido varchar(30), nombre varchar(20), domicilio varchar(30), telefono varchar(11) ); create table agenda( apellido varchar(30), nombre varchar(20), domicilio varchar(30), telefono varchar(11) ); create table agenda( apellido varchar(30), nombre varchar(20), domicilio varchar(30), telefono varchar(11) ); sp_tables @table_owner='dbo'; sp_columns agenda; drop table agenda; drop table agenda;

Segundo problema:
Necesita almacenar informacin referente a los libros de su biblioteca personal. Los datos que guardar sern: ttulo del libro, nombre del autor y nombre de la editorial. 1- Elimine la tabla "libros", si existe: if object_id('libros') is not null drop table libros; 2- Verifique que la tabla "libros" no existe en la base de datos activa (sp_tables @table_owner='dbo'). 3- Cree una tabla llamada "libros". Debe definirse con los siguientes campos: titulo, varchar(20); autor, varchar(30) y editorial, varchar(15). 4- Intente crearla nuevamente. Aparece mensaje de error. 5- Visualice las tablas existentes. 6- Visualice la estructura de la tabla "libros". 7- Elimine la tabla.

8- Intente eliminar la tabla nuevamente. if object_id('libros') is not null drop table libros; sp_tables @table_owner='dbo'; create table libros( titulo varchar(20), autor varchar(30), editorial varchar(15) ); create table libros( titulo varchar(20), autor varchar(30), editorial varchar(15) ); sp_tables @table_owner='dbo'; sp_columns libros; drop table libros; drop table libros;

3 - Insertar y recuperar registros de una tabla (insert into - select)


Un registro es una fila de la tabla que contiene los datos propiamente dichos. Cada registro tiene un dato por cada columna (campo). Nuestra tabla "usuarios" consta de 2 campos, "nombre" y "clave". Al ingresar los datos de cada registro debe tenerse en cuenta la cantidad y el orden de los campos. La sintaxis bsica y general es la siguiente:
insert into NOMBRETABLA (NOMBRECAMPO1, ..., NOMBRECAMPOn) values (VALORCAMPO1, ..., VALORCAMPOn);

Usamos "insert into", luego el nombre de la tabla, detallamos los nombres de los campos entre parntesis y separados por comas y luego de la clusula "values" colocamos los valores para cada campo, tambin entre parntesis y separados por comas. Para agregar un registro a la tabla tipeamos:
insert into usuarios (nombre, clave) values ('Mariano','payaso');

Note que los datos ingresados, como corresponden a cadenas de caracteres se colocan entre comillas simples. Para ver los registros de una tabla usamos "select":
select * from usuarios;

El comando "select" recupera los registros de una tabla. Con el asterisco indicamos que muestre todos los campos de la tabla "usuarios". Es importante ingresar los valores en el mismo orden en que se nombran los campos:
insert into usuarios (clave, nombre) values ('River','Juan');

En el ejemplo anterior se nombra primero el campo "clave" y luego el campo "nombre" por eso, los valores tambin se colocan en ese orden. Si ingresamos los datos en un orden distinto al orden en que se nombraron los campos, no aparece un mensaje de error y los datos se guardan de modo incorrecto. En el siguiente ejemplo se colocan los valores en distinto orden en que se nombran los campos, el valor de la clave (la cadena "Boca") se guardar en el campo "nombre" y el valor del nombre (la cadena "Luis") en el campo "clave":
insert into usuarios (nombre,clave) values ('Boca','Luis');

3 - Insertar y recuperar registros de una tabla (insert into - select)


Problema: Vamos a crear una tabla llamada "usuarios". En primer lugar vamos a eliminar la tabla "usuarios" averiguando si existe (recuerde que debemos repetir siempre esto porque puede haber otro usuario que haya creado una tabla con el mismo nombre en el servidor www.sqlserverya.com.ar:
if object_id('usuarios') is not null drop table usuarios;

Recordar que debemos finalizar cada comando con un punto y coma. Creamos la tabla:
create table usuarios( nombre varchar(30), clave varchar(10)

);

Agregamos un registro a la tabla:


insert into usuarios (nombre, clave) values ('Mariano','payaso');

Veamos si el registro se guard:


select * from usuarios;

Ingresemos otro registro alterando el orden de los campos:


insert into usuarios (clave, nombre) values ('River','Juan');

Veamos cmo SQL Server almacen los datos:


select * from usuarios;

Ingresemos otro registro colocando los valores en distinto orden en que se nombran los campos:
insert into usuarios (nombre,clave) values ('Boca','Luis');

Veamos cmo se guardaron los datos:


select * from usuarios;

Note que la cadena "Boca" se almacen en el campo "nombre" y la cadena "Luis" en el campo "clave".

if object_id('usuarios') is not null drop table usuarios; create table usuarios( nombre varchar(30),

clave varchar(10) ); insert into usuarios (nombre, clave) values ('Mariano','payaso'); select * from usuarios; insert into usuarios (clave, nombre) values ('River','Juan'); select * from usuarios; insert into usuarios (nombre,clave) values ('Boca','Luis');

select * from usuarios; 3 - Insertar y recuperar registros de una tabla (insert into - select)
Primer problema:
Trabaje con la tabla "agenda" que almacena informacin de sus amigos. 1- Elimine la tabla "agenda", si existe: if object_id('agenda') is not null drop table agenda; 2- Cree una tabla llamada "agenda". Debe tener los siguientes campos: apellido (cadena de 30), nombre (cadena de 20), domicilio (cadena de 30) y telefono (cadena de 11): 3- Visualice las tablas existentes para verificar la creacin de "agenda" (sp_tables @table_owner='dbo'). 4- Visualice la estructura de la tabla "agenda" (sp_columns). 5- Ingrese los siguientes registros: insert into agenda (apellido, nombre, domicilio, telefono) values ('Moreno','Alberto','Colon 123','4234567'); insert into agenda (apellido,nombre, domicilio, telefono) values ('Torres','Juan','Avellaneda 135','4458787'); 6- Seleccione todos los registros de la tabla: select * from agenda; 7- Elimine la tabla "agenda": drop table agenda; 8- Intente eliminar la tabla nuevamente (aparece un mensaje de error): drop table agenda; if object_id('agenda') is not null drop table agenda; create table agenda( apellido varchar(30), nombre varchar(20), domicilio varchar(30), telefono varchar(11) ); sp_tables @table_owner='dbo'; sp_columns agenda; insert into agenda (apellido, nombre, domicilio, telefono) values ('Moreno','Alberto','Colon 123','4234567'); insert into agenda (apellido,nombre, domicilio, telefono)

values ('Torres','Juan','Avellaneda 135','4458787'); select * from agenda; drop table agenda; drop table agenda;

Segundo problema:
Trabaje con la tabla "libros" que almacena los datos de los libros de su propia biblioteca. 1- Elimine la tabla "libros", si existe: if object_id('libros') is not null drop table libros; 2- Cree una tabla llamada "libros". Debe definirse con los siguientes campos: titulo (cadena de 20), autor (cadena de 30) y editorial (cadena de 15). 3- Visualice las tablas existentes (sp_tables @table_owner='dbo'). 4- Visualice la estructura de la tabla "libros" (sp_columns). 5- Ingrese los siguientes registros: insert into libros (titulo,autor,editorial) values ('El aleph','Borges','Planeta'); insert into libros (titulo,autor,editorial) values ('Martin Fierro','Jose Hernandez','Emece'); insert into libros (titulo,autor,editorial) values ('Aprenda PHP','Mario Molina','Emece'); 6- Muestre todos los registros (select). if object_id('libros') is not null drop table libros; create table libros ( titulo varchar(20), autor varchar(30), editorial varchar(15) ); sp_tables @table_owner='dbo'; sp_columns libros; insert into libros (titulo,autor,editorial) values ('El aleph','Borges','Planeta'); insert into libros (titulo,autor,editorial) values ('Martin Fierro','Jose Hernandez','Emece'); insert into libros (titulo,autor,editorial) values ('Aprenda PHP','Mario Molina','Emece'); select * from libros;

4 - Tipos de datos bsicos


Ya explicamos que al crear una tabla debemos resolver qu campos (columnas) tendr y que tipo de datos almacenar cada uno de ellos, es decir, su estructura. El tipo de dato especifica el tipo de informacin que puede guardar un campo: caracteres, nmeros, etc. Estos son algunos tipos de datos bsicos de SQL Server (posteriormente veremos otros):

varchar: se usa para almacenar cadenas de caracteres. Una cadena es una secuencia de caracteres. Se coloca entre comillas (simples); ejemplo: 'Hola', 'Juan Perez'. El tipo "varchar" define una cadena de longitud variable en la cual determinamos el mximo de caracteres entre parntesis. Puede guardar hasta 8000 caracteres. Por ejemplo, para almacenar cadenas de hasta 30 caracteres, definimos un campo de tipo varchar(30), es decir, entre parntesis, junto al nombre del campo colocamos la longitud. Si asignamos una cadena de caracteres de mayor longitud que la definida, la cadena no se carga, aparece un mensaje indicando tal situacin y la sentencia no se ejecuta. Por ejemplo, si definimos un campo de tipo varchar(10) e intentamos asignarle la cadena 'Buenas tardes', aparece un mensaje de error y la sentencia no se ejecuta. integer: se usa para guardar valores numricos enteros, de -2000000000 a 2000000000 aprox. Definimos campos de este tipo cuando queremos representar, por ejemplo, cantidades. float: se usa para almacenar valores numricos con decimales. Se utiliza como separador el punto (.). Definimos campos de este tipo para precios, por ejemplo.

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.
Desde casa, Instructor Real, Videos 2 Pagos de USD $99, Inscribete Hoy

Problema: Vamos a crear una tabla llamada "libros". En primer lugar vamos a eliminar la tabla "libros" averiguando si existe:
if object_id('libros') is not null drop table libros;

Para almacenar informacin de los libros de una librera necesitamos los siguientes campos:
-titulo, cadena de caracteres de 20 de longitud, -autor, cadena de caracteres de 15 de longitud, -editorial, caracteres de 10 de longitud, -precio, valor numrico con decimales y -cantidad, valor numrico entero.

Al crear la tabla, entonces, elegimos el tipo de dato ms adecuado para cada campo:
create table libros( titulo varchar(20), autor varchar(15), editorial varchar(10), precio float, cantidad integer );

Note que al especificar el tipo de dato de los campos numricos, no colocamos entre parntesis la longitud. Vemos la estructura de la tabla:
sp_columns libros;

Aparece la siguiente informacin:


...COLUMN_NAME TYPE_NAME LENGHT _______________________________________ titulo varchar 20 autor varchar 15 editorial varchar 10 precio float 8 cantidad int 4

Ingresamos algunos registros:


insert into libros (titulo,autor,editorial,precio,cantidad) values ('El aleph','Borges','Emece',25.50,100); insert into libros (titulo,autor,editorial,precio,cantidad) values ('Matematica estas ahi','Paenza','Siglo XXI',18.8,200);

Note que al ingresar valores numricos (float e integer) no se utilizan comillas y para el separador de decimales se usa el caracter punto(.). Veamos los registros cargados:
select * from libros;

Veamos lo que sucede si intentamos ingresar para el campo "titulo" una cadena de ms de 20 caracteres:

insert into libros (titulo,autor,editorial,precio,cantidad) values ('Alicia en el pais de las maravillas','Lewis Carroll','Atlantida',10,200);

aparece un mensaje de error y la sentencia no se ejecuta. vamos a cortar la cadena para que SQL Server acepte el ingreso del registro:
insert into libros (titulo,autor,editorial,precio,cantidad) values ('Alicia en el pais','Lewis Carroll','Atlantida',10,200);

Veamos los registros cargados:


select * from libros;

if object_id('libros') is not null drop table libros;

create table libros( titulo varchar(20), autor varchar(15), editorial varchar(10), precio float, cantidad integer );

sp_columns libros;

insert into libros (titulo,autor,editorial,precio,cantidad) values ('El aleph','Borges','Emece',25.50,100); insert into libros (titulo,autor,editorial,precio,cantidad) values ('Matematica estas ahi','Paenza','Siglo XXI',18.8,200);

select * from libros;

insert into libros (titulo,autor,editorial,precio,cantidad) values ('Alicia en el pais de las maravillas','Lewis Carroll','Atlantida',10,200);

insert into libros (titulo,autor,editorial,precio,cantidad) values ('Alicia en el pais','Lewis Carroll','Atlantida',10,200);

select * from libros;

Primer problema:
Un videoclub que alquila pelculas en video almacena la informacin de sus pelculas en una tabla llamada "peliculas"; para cada pelcula necesita los siguientes datos: -nombre, cadena de caracteres de 20 de longitud, -actor, cadena de caracteres de 20 de longitud, -duracin, valor numrico entero. -cantidad de copias: valor entero. 1- Elimine la tabla, si existe: if object_id('peliculas')is not null drop table peliculas; 2- Cree la tabla eligiendo el tipo de dato adecuado para cada campo: create table peliculas( nombre varchar(20), actor varchar(20), duracion integer, cantidad integer ); 3- Vea la estructura de la tabla: 4- Ingrese los siguientes registros: insert into peliculas (nombre, actor, duracion, cantidad) values ('Mision imposible','Tom Cruise',128,3); insert into peliculas (nombre, actor, duracion, cantidad) values ('Mision imposible 2','Tom Cruise',130,2); insert into peliculas (nombre, actor, duracion, cantidad) values ('Mujer bonita','Julia Roberts',118,3); insert into peliculas (nombre, actor, duracion, cantidad) values ('Elsa y Fred','China Zorrilla',110,2);

5- Muestre todos los registros.

Ver solucin

if object_id('peliculas')is not null drop table peliculas; create table peliculas( nombre varchar(20), actor varchar(20), duracion integer, cantidad integer ); sp_columns peliculas; insert into peliculas (nombre, actor, duracion, cantidad) values ('Mision imposible','Tom Cruise',128,3); insert into peliculas (nombre, actor, duracion, cantidad) values ('Mision imposible 2','Tom Cruise',130,2); insert into peliculas (nombre, actor, duracion, cantidad) values ('Mujer bonita','Julia Roberts',118,3); insert into peliculas (nombre, actor, duracion, cantidad) values ('Elsa y Fred','China Zorrilla',110,2); select *from peliculas;

Segundo problema:
Una empresa almacena los datos de sus empleados en una tabla "empleados" que guarda los siguientes datos: nombre, documento, sexo, domicilio, sueldobasico.

1- Elimine la tabla, si existe: if object_id('empleados') is not null drop table empleados; 2- Cree la tabla eligiendo el tipo de dato adecuado para cada campo: create table empleados( nombre varchar(20), documento varchar(8), sexo varchar(1), domicilio varchar(30), sueldobasico float ); 3- Vea la estructura de la tabla: 4- Ingrese algunos registros: insert into empleados (nombre, documento, sexo, domicilio, sueldobasico) values ('Juan Perez','22333444','m','Sarmiento 123',500); insert into empleados (nombre, documento, sexo, domicilio, sueldobasico) values ('Ana Acosta','24555666','f','Colon 134',650); insert into empleados (nombre, documento, sexo, domicilio, sueldobasico) values ('Bartolome Barrios','27888999','m','Urquiza 479',800); 5- Seleccione todos los registros.

Ver solucin

if object_id('empleados') is not null drop table empleados; create table empleados( nombre varchar(20), documento varchar(8), sexo varchar(1), domicilio varchar(30), sueldobasico float ); sp_columns empleados; insert into empleados (nombre, documento, sexo, domicilio, sueldobasico) values ('Juan Perez','22333444','m','Sarmiento 123',500); insert into empleados (nombre, documento, sexo, domicilio, sueldobasico) values ('Ana Acosta','24555666','f','Colon 134',650); insert into empleados (nombre, documento, sexo, domicilio, sueldobasico) values ('Bartolome Barrios','27888999','m','Urquiza 479',800); select *from empleados;

5 - Recuperar algunos campos (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.

5 - Recuperar algunos campos (select)


Problema: Trabajamos con la tabla "libros" que almacena los datos de los libros de una librera. Eliminamos la tabla, si existe:
if object_id('libros') is not null drop table libros;

Creamos la tabla:
create table libros( titulo varchar(40), autor varchar(30), editorial varchar(15), precio float, cantidad integer );

Veamos la estructura de la tabla:


sp_columns libros;

Ingresamos algunos registros:


insert into libros (titulo,autor,editorial,precio,cantidad) values ('El aleph','Borges','Emece',25.50,100); insert into libros (titulo,autor,editorial,precio,cantidad) values ('Alicia en el pais de las maravillas','Lewis Carroll','Atlantida',10,200); insert into libros (titulo,autor,editorial,precio,cantidad) values ('Matematica estas ahi','Paenza','Siglo XXI',18.8,200);

Veamos todos los campos la tabla:


select *from libros;

Veamos solamente el ttulo, autor y editorial de todos los libros especificando los nombres de los campos separados por comas:
select titulo,autor,editorial from libros;

Con la siguiente sentencia seleccionamos los ttulos y precios de todos los libros:
select titulo,precio from libros;

Veamos solamente la editorial y la cantidad de libros tipeamos:


select editorial,cantidad from libros;

if object_id('libros') is not null drop table libros;

create table libros( titulo varchar(40), autor varchar(30), editorial varchar(15), precio float, cantidad integer );

sp_columns libros;

insert into libros (titulo,autor,editorial,precio,cantidad) values ('El aleph','Borges','Emece',25.50,100); insert into libros (titulo,autor,editorial,precio,cantidad) values ('Alicia en el pais de las maravillas','Lewis Carroll','Atlantida',10,200); insert into libros (titulo,autor,editorial,precio,cantidad) values ('Matematica estas ahi','Paenza','Siglo XXI',18.8,200);

select *from libros;

select titulo,autor,editorial from libros;

select titulo,precio from libros;

select editorial,cantidad from libros;

5 - Recuperar algunos campos (select)


Primer problema:
Un videoclub que alquila pelculas en video almacena la informacin de sus pelculas en alquiler en una tabla llamada "peliculas". 1- Elimine la tabla, si existe: if object_id('peliculas') is not null drop table peliculas; 2- Cree la tabla: create table peliculas( titulo varchar(20), actor varchar(20), duracion integer, cantidad integer );

3- Vea la estructura de la tabla (sp_columns). 4- Ingrese alos siguientes registros: insert into peliculas (titulo, actor, duracion, cantidad) values ('Mision imposible','Tom Cruise',180,3); insert into peliculas (titulo, actor, duracion, cantidad) values ('Mision imposible 2','Tom Cruise',190,2); insert into peliculas (titulo, actor, duracion, cantidad) values ('Mujer bonita','Julia Roberts',118,3); insert into peliculas (titulo, actor, duracion, cantidad) values ('Elsa y Fred','China Zorrilla',110,2); 5- Realice un "select" mostrando solamente el ttulo y actor de todas las pelculas 6- Muestre el ttulo y duracin de todas las peliculas 7- Muestre el ttulo y la cantidad de copias

Ver solucin

Segundo problema:
Una empresa almacena los datos de sus empleados en una tabla llamada "empleados". 1- Elimine la tabla, si existe: if object_id('empleados') is not null drop table empleados; 2- Cree la tabla: create table empleados( nombre varchar(20), documento varchar(8), sexo varchar(1), domicilio varchar(30), sueldobasico float ); 3- Vea la estructura de la tabla: sp_columns empleados; 4- Ingrese algunos registros: insert into empleados (nombre, documento, sexo, domicilio, sueldobasico) values ('Juan Juarez','22333444','m','Sarmiento 123',500); insert into empleados (nombre, documento, sexo, domicilio, sueldobasico) values ('Ana Acosta','27888999','f','Colon 134',700); insert into empleados (nombre, documento, sexo, domicilio, sueldobasico) values ('Carlos Caseres','31222333','m','Urquiza 479',850); 5- Muestre todos los datos de los empleados 6- Muestre el nombre, documento y domicilio de los empleados 7- Realice un "select" mostrando el documento, sexo y sueldo bsico de todos los empleados

if object_id('empleados') is not null drop table empleados; create table empleados( nombre varchar(20), documento varchar(8), sexo varchar(1), domicilio varchar(30), sueldobasico float ); sp_columns empleados; insert into empleados (nombre, documento, sexo, domicilio, sueldobasico) values ('Juan Juarez','22333444','m','Sarmiento 123',500); insert into empleados (nombre, documento, sexo, domicilio, sueldobasico) values ('Ana Acosta','27888999','f','Colon 134',700); insert into empleados (nombre, documento, sexo, domicilio, sueldobasico) values ('Carlos Caseres','31222333','m','Urquiza 479',850); select *from empleados; select nombre,documento,domicilio from empleados; select documento,sexo,sueldobasico from empleados;

6 - Recuperar algunos registros (where)


Hemos aprendido a seleccionar algunos campos de una tabla. 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 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. Entonces, con "where" establecemos condiciones para recuperar algunos registros. Para recuperar algunos campos de algunos registros combinamos en la consulta la lista de campos y la clusula "where":
select nombre from usuarios where clave='River';

En la consulta anterior solicitamos el nombre de todos los usuarios cuya clave sea igual a "River".

6 - Recuperar algunos registros (where)


Problema: Trabajamos con la tabla "usuarios" que consta de 2 campos: nombre de usuario y clave. Eliminamos la tabla, si existe:
if object_id('usuarios') is not null drop table usuarios;

Creamos la tabla:
create table usuarios ( nombre varchar(30), clave varchar(10) );

Vemos la estructura de la tabla:


sp_columns usuarios;

Ingresamos algunos registros:


insert into usuarios (nombre, clave)

values ('Marcelo','Boca'); insert into usuarios (nombre, clave) values ('JuanPerez','Juancito'); insert into usuarios (nombre, clave) values ('Susana','River'); insert into usuarios (nombre, clave) values ('Luis','River');

Realizamos una consulta especificando una condicin, queremos ver el usuario cuyo nombre es "Leonardo":
select *from usuarios where nombre='Leonardo';

Queremos ver el nombre de los usuarios cuya clave es "River":


select nombre from usuarios where clave='River';

Realizamos un "select" de los nombres de los usuarios cuya clave es "Santi":


select nombre from usuarios where clave='Santi';

No se muestra ningn registro ya que ninguno cumple la condicin Primer problema:


Trabaje con la tabla "agenda" en la que registra los datos de sus amigos. 1- Elimine "agenda", si existe: if object_id('agenda') is not null drop table agenda; 2- Cree la tabla, con los siguientes campos: apellido (cadena de 30), nombre (cadena de 20), domicilio (cadena de 30) y telefono (cadena de 11). 3- Visualice la estructura de la tabla "agenda". 4- Ingrese los siguientes registros: Acosta, Ana, Colon 123, 4234567; Bustamante, Betina, Avellaneda 135, 4458787; Lopez, Hector, Salta 545, 4887788; Lopez, Luis, Urquiza 333, 4545454; Lopez, Marisa, Urquiza 333, 4545454. 5- Seleccione todos los registros de la tabla 6- Seleccione el registro cuyo nombre sea "Marisa" (1 registro) 7- Seleccione los nombres y domicilios de quienes tengan apellido igual a "Lopez" (3 registros)

8- Muestre el nombre de quienes tengan el telfono "4545454" (2 registros) if object_id('agenda') is not null drop table agenda; create table agenda ( apellido varchar(30), nombre varchar(20), domicilio varchar(30), telefono varchar(11) ); sp_columns agenda; insert into agenda(apellido,nombre,domicilio,telefono) values ('Acosta', 'Ana', 'Colon 123', '4234567'); insert into agenda(apellido,nombre,domicilio,telefono) values ('Bustamante', 'Betina', 'Avellaneda 135', '4458787'); insert into agenda(apellido,nombre,domicilio,telefono) values ('Lopez', 'Hector', 'Salta 545', '4887788'); insert into agenda(apellido,nombre,domicilio,telefono) values ('Lopez', 'Luis', 'Urquiza 333', '4545454'); insert into agenda(apellido,nombre,domicilio,telefono) values ('Lopez', 'Marisa', 'Urquiza 333', '4545454'); select *from agenda; select *from agenda where nombre='Marisa'; select nombre,domicilio from agenda where apellido='Lopez'; select nombre from agenda where telefono='4545454';

7 - Operadores relacionales
Los operadores son smbolos que permiten realizar operaciones matemticas, concatenar cadenas, hacer comparaciones. SQL Server tiene 4 tipos de operadores: 1. 2. 3. 4. relacionales (o de comparacin) aritmticos de concatenacin lgicos.

Por ahora veremos solamente los primeros.

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

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. No son los nicos, existen otros que veremos mas adelante. Problema: Trabajamos con la tabla "libros" de una librera.

Eliminamos la tabla "libros", si existe:


if object_id('libros') is not null drop table libros;

La creamos con la siguiente estructura:


create table libros( titulo varchar(30), autor varchar(30), editorial varchar(15), precio float );

Agregamos registros a la tabla:


insert into libros (titulo,autor,editorial,precio) values ('El aleph','Borges','Emece',24.50); insert into libros (titulo,autor,editorial,precio) values ('Martin Fierro','Jose Hernandez','Emece',16.00); insert into libros (titulo,autor,editorial,precio) values ('Aprenda PHP','Mario Molina','Emece',35.40); insert into libros (titulo,autor,editorial,precio) values ('Cervantes y el quijote','Borges','Paidos',50.90);

Seleccionamos los registros cuyo autor sea diferente de 'Borges':


select *from libros where autor<>'Borges';

Seleccionamos los registros cuyo precio supere los 20 pesos, slo el ttulo y precio:
select titulo,precio from libros where precio>20;

Note que el valor con el cual comparamos el campo "precio", como es numrico (float), no se coloca entre comillas. Los libros cuyo precio es menor o igual a 20 pesos no aparece en la seleccin. Recuperamos aquellos libros cuyo precio es menor o igual a 30:
select *from libros where precio<=30;

if object_id('libros') is not null drop table libros;

create table libros( titulo varchar(30), autor varchar(30), editorial varchar(15), precio float );

insert into libros (titulo,autor,editorial,precio) values ('El aleph','Borges','Emece',24.50); insert into libros (titulo,autor,editorial,precio) values ('Martin Fierro','Jose Hernandez','Emece',16.00); insert into libros (titulo,autor,editorial,precio) values ('Aprenda PHP','Mario Molina','Emece',35.40); insert into libros (titulo,autor,editorial,precio) values ('Cervantes y el quijote','Borges','Paidos',50.90);

select *from libros where autor<>'Borges';

select titulo,precio from libros where precio>20;

select *from libros where precio<=30;

Primer problema:
Un comercio que vende artculos de computacin registra los datos de sus artculos en una tabla con ese nombre. 1- Elimine "articulos", si existe: if object_id('articulos') is not null drop table articulos; 2- Cree la tabla, con la siguiente estructura: create table articulos( codigo integer, nombre varchar(20), descripcion varchar(30), precio float, cantidad integer ); 3- Vea la estructura de la tabla (sp_columns). 4- Ingrese algunos registros: insert into articulos (codigo, nombre, descripcion, precio,cantidad) values (1,'impresora','Epson Stylus C45',400.80,20); insert into articulos (codigo, nombre, descripcion, precio,cantidad) values (2,'impresora','Epson Stylus C85',500,30); insert into articulos (codigo, nombre, descripcion, precio,cantidad) values (3,'monitor','Samsung 14',800,10); insert into articulos (codigo, nombre, descripcion, precio,cantidad) values (4,'teclado','ingles Biswal',100,50); insert into articulos (codigo, nombre, descripcion, precio,cantidad) values (5,'teclado','espaol Biswal',90,50); 5- Seleccione los datos de las impresoras (2 registros) 6- Seleccione los artculos cuyo precio sea mayor o igual a 400 (3 registros) 7- Seleccione el cdigo y nombre de los artculos cuya cantidad sea menor a 30 (2 registros) 8- Selecciones el nombre y descripcin de los artculos que NO cuesten $100 (4 registros)

Ver solucin Segundo problema:


Un video club que alquila pelculas en video almacena la informacin de sus pelculas en alquiler en una tabla denominada "peliculas". 1- Elimine la tabla, si existe. 2- Cree la tabla eligiendo el tipo de dato adecuado para cada campo: create table peliculas( titulo varchar(20), actor varchar(20), duracion integer,

cantidad integer ); 3- Ingrese los siguientes registros: insert into peliculas (titulo, actor, duracion, cantidad) values ('Mision imposible','Tom Cruise',120,3); insert into peliculas (titulo, actor, duracion, cantidad) values ('Mision imposible 2','Tom Cruise',180,4); insert into peliculas (titulo, actor, duracion, cantidad) values ('Mujer bonita','Julia R.',90,1); insert into peliculas (titulo, actor, duracion, cantidad) values ('Elsa y Fred','China Zorrilla',80,2); 4- Seleccione las pelculas cuya duracin no supere los 90 minutos (2 registros) 5- Seleccione el ttulo de todas las pelculas en las que el actor NO sea "Tom Cruise" (2 registros) 6- Muestre todos los campos, excepto "duracion", de todas las pelculas de las que haya ms de 2 copias (2 registros)

Ver solucin
if object_id('peliculas') is not null drop table peliculas; create table peliculas( titulo varchar(20), actor varchar(20), duracion integer, cantidad integer ); insert into peliculas (titulo, actor, duracion, cantidad) values ('Mision imposible','Tom Cruise',120,3); insert into peliculas (titulo, actor, duracion, cantidad) values ('Mision imposible 2','Tom Cruise',180,4); insert into peliculas (titulo, actor, duracion, cantidad) values ('Mujer bonita','Julia R.',90,1); insert into peliculas (titulo, actor, duracion, cantidad) values ('Elsa y Fred','China Zorrilla',80,2); select *from peliculas where duracion<=90; select *from peliculas where actor<>'Tom Cruise'; select titulo,actor,cantidad from peliculas where cantidad >2;

8 - Borrar registros (delete)


Para eliminar los registros de una tabla usamos el comando "delete":
delete from usuarios;

Muestra un mensaje indicando la cantidad de registros que ha eliminado. Si no queremos eliminar todos los registros, sino solamente algunos, debemos indicar cul o cules, para ello utilizamos el comando "delete" junto con la clausula "where" con la cual establecemos la condicin que deben cumplir los registros a borrar. Por ejemplo, queremos eliminar aquel registro cuyo nombre de usuario es "Marcelo":
delete from usuarios where nombre='Marcelo';

Si solicitamos el borrado de un registro que no existe, es decir, ningn registro cumple con la condicin especificada, ningn registro ser eliminado. Tenga en cuenta que si no colocamos una condicin, se eliminan todos los registros de la tabla nombrada. Problema: Trabajamos con la tabla "usuarios". Eliminamos la tabla "usuarios", si existe:
if object_id('usuarios') is not null drop table usuarios;

La creamos con la siguiente estructura:


create table usuarios( nombre varchar(30), clave varchar(10) );

Agregamos registros a la tabla:


insert into usuarios (nombre,clave) values ('Marcelo','River'); insert into usuarios (nombre,clave) values ('Susana','chapita'); insert into usuarios (nombre,clave) values ('CarlosFuentes','Boca'); insert into usuarios (nombre,clave)

values ('FedericoLopez','Boca');

Seleccionamos todos los registros:


select *from usuarios;

Vamos a eliminar el registro cuyo nombre de usuario es "Marcelo":


delete from usuarios where nombre='Marcelo';

Veamos el contenido de la tabla:


select * from usuarios;

Intentamos eliminarlo nuevamente:


delete from usuarios where nombre='Marcelo';

Veamos el contenido de la tabla:


select * from usuarios;

Como ningn registro cumple con la condicin no se borran registros. Eliminamos todos los registros cuya clave es 'Boca':
delete from usuarios where clave='Boca';

Veamos el contenido de la tabla:


select * from usuarios;

Eliminemos todos los registros:


delete from usuarios;

Veamos el contenido de la tabla:


select * from usuarios;

No hay registros.
if object_id('usuarios') is not null drop table usuarios;

create table usuarios( nombre varchar(30), clave varchar(10) );

insert into usuarios (nombre,clave) values ('Marcelo','River'); insert into usuarios (nombre,clave) values ('Susana','chapita'); insert into usuarios (nombre,clave) values ('CarlosFuentes','Boca'); insert into usuarios (nombre,clave) values ('FedericoLopez','Boca');

select *from usuarios;

delete from usuarios where nombre='Marcelo';

select * from usuarios;

delete from usuarios where nombre='Marcelo';

select * from usuarios;

delete from usuarios where clave='Boca';

select * from usuarios;

delete from usuarios;

select * from usuarios;

Primer problema:
Trabaje con la tabla "agenda" que registra la informacin referente a sus amigos. 1- Elimine la tabla si existe: if object_id('agenda') is not null drop table agenda; 2- Cree la tabla con los siguientes campos: apellido (cadena de 30), nombre (cadena de 20), domicilio (cadena de 30) y telefono (cadena de 11): create table agenda( apellido varchar(30), nombre varchar(20), domicilio varchar(30), telefono varchar(11) ); 3- Ingrese los siguientes registros (insert into): Alvarez,Alberto,Colon 123,4234567, Juarez,Juan,Avellaneda 135,4458787, Lopez,Maria,Urquiza 333,4545454, Lopez,Jose,Urquiza 333,4545454, Salas,Susana,Gral. Paz 1234,4123456. 4- Elimine el registro cuyo nombre sea "Juan" (1 registro afectado) 5- Elimine los registros cuyo nmero telefnico sea igual a "4545454" (2 registros afectados): 6- Muestre la tabla. 7- Elimine todos los registros (2 registros afectados):

8- Muestre la tabla.

Ver solucin
if object_id('agenda') is not null drop table agenda; create table agenda( apellido varchar(30), nombre varchar(20), domicilio varchar(30), telefono varchar(11) ); insert into agenda (apellido,nombre,domicilio,telefono) values('Alvarez','Alberto','Colon 123','4234567'); insert into agenda (apellido,nombre,domicilio,telefono) values('Juarez','Juan','Avellaneda 135','4458787'); insert into agenda (apellido,nombre,domicilio,telefono) values('Lopez','Maria','Urquiza 333','4545454'); insert into agenda (apellido,nombre,domicilio,telefono) values('Lopez','Jose','Urquiza 333','4545454'); insert into agenda (apellido,nombre,domicilio,telefono) values('Salas','Susana','Gral. Paz 1234','4123456'); delete from agenda where nombre='Juan'; delete from agenda where telefono='4545454'; select * from agenda; delete from agenda; select * from agenda;

Segundo problema:
Un comercio que vende artculos de computacin registra los datos de sus artculos en una tabla con ese nombre. 1- Elimine "articulos", si existe: if object_id('articulos') is not null drop table articulos; 2- Cree la tabla, con la siguiente estructura: create table articulos( codigo integer, nombre varchar(20), descripcion varchar(30), precio float, cantidad integer ); 3- Vea la estructura de la tabla. 4- Ingrese algunos registros: insert into articulos (codigo, nombre, descripcion, precio,cantidad) values (1,'impresora','Epson Stylus C45',400.80,20); insert into articulos (codigo, nombre, descripcion, precio,cantidad) values (2,'impresora','Epson Stylus C85',500,30); insert into articulos (codigo, nombre, descripcion, precio,cantidad) values (3,'monitor','Samsung 14',800,10); insert into articulos (codigo, nombre, descripcion, precio,cantidad) values (4,'teclado','ingles Biswal',100,50); insert into articulos (codigo, nombre, descripcion, precio,cantidad) values (5,'teclado','espaol Biswal',90,50); 5- Elimine los artculos cuyo precio sea mayor o igual a 500 (2 registros) delete from articulos where precio>=500; 7- Elimine todas las impresoras (1 registro) delete from articulos where nombre='impresora'; 8- Elimine todos los artculos cuyo cdigo sea diferente a 4 (1 registro) delete from articulos where codigo<>4; 9- Mostrar la tabla despus que borra cada registro.

Ver solucin

9 - Actualizar registros (update)


Decimos que actualizamos un registro cuando modificamos alguno de sus valores. Para modificar uno o varios datos de uno o varios registros utilizamos "update" (actualizar). Por ejemplo, en nuestra tabla "usuarios", queremos cambiar los valores de todas las claves, por "RealMadrid":
update usuarios set clave='RealMadrid';

Utilizamos "update" junto al nombre de la tabla y "set" junto con el campo a modificar y su nuevo valor. El cambio afectar a todos los registros. Podemos modificar algunos registros, para ello debemos establecer condiciones de seleccin con "where". Por ejemplo, queremos cambiar el valor correspondiente a la clave de nuestro usuario llamado "Federicolopez", queremos como nueva clave "Boca", necesitamos una condicin "where" que afecte solamente a este registro:
update usuarios set clave='Boca' where nombre='Federicolopez';

Si Microsoft SQL Server no encuentra registros que cumplan con la condicin del "where", no se modifica ninguno. Las condiciones no son obligatorias, pero si omitimos la clusula "where", la actualizacin afectar a todos los registros. Tambin podemos actualizar varios campos en una sola instruccin:
update usuarios set nombre='Marceloduarte', clave='Marce' where nombre='Marcelo';

Para ello colocamos "update", el nombre de la tabla, "set" junto al nombre del campo y el nuevo valor y separado por coma, el otro nombre del campo con su nuevo valor. Problema: Trabajamos con la tabla "usuarios". Eliminamos la tabla si existe:
if object_id('usuarios') is not null drop table usuarios;

Creamos la tabla:
create table usuarios( nombre varchar(20), clave varchar(10) );

Ingresamos algunos registros:


insert into usuarios (nombre,clave) values ('Marcelo','River'); insert into usuarios (nombre,clave) values ('Susana','chapita'); insert into usuarios (nombre,clave) values ('Carlosfuentes','Boca'); insert into usuarios (nombre,clave) values ('Federicolopez','Boca');

Cambiaremos los valores de todas las claves, por la cadena "RealMadrid":


update usuarios set clave='RealMadrid';

El cambio afect a todos los registros, vemoslo:


select *from usuarios;

Necesitamos cambiar el valor de la clave del usuario llamado "Federicolopez" por "Boca":
update usuarios set clave='Boca' where nombre='Federicolopez';

Verifiquemos que la actualizacin se realiz:


select *from usuarios;

Vimos que si Microsoft SQL Server no encuentra registros que cumplan con la condicin no se modifican registros:
update usuarios set clave='payaso' where nombre='JuanaJuarez';

Si vemos la tabla veremos que no a cambiado:


select *from usuarios;

Para actualizar varios campos en una sola instruccin empleamos:


update usuarios set nombre='Marceloduarte', clave='Marce' where nombre='Marcelo';

Si vemos la tabla:
select *from usuarios;

if object_id('usuarios') is not null drop table usuarios;

create table usuarios( nombre varchar(20), clave varchar(10) );

insert into usuarios (nombre,clave) values ('Marcelo','River'); insert into usuarios (nombre,clave) values ('Susana','chapita'); insert into usuarios (nombre,clave) values ('Carlosfuentes','Boca'); insert into usuarios (nombre,clave) values ('Federicolopez','Boca');

update usuarios set clave='RealMadrid';

select *from usuarios;

update usuarios set clave='Boca'

where nombre='Federicolopez';

select *from usuarios;

update usuarios set clave='payaso' where nombre='JuanaJuarez';

select *from usuarios;

update usuarios set nombre='Marceloduarte', clave='Marce' where nombre='Marcelo';

select *from usuarios;

Primer problema:
Trabaje con la tabla "agenda" que almacena los datos de sus amigos. 1- Elimine la tabla si existe: if object_id('agenda') is not null drop table agenda; 2- Cree la tabla: create table agenda( apellido varchar(30), nombre varchar(20), domicilio varchar(30), telefono varchar(11) ); 3- Ingrese los siguientes registros (1 registro actualizado): insert into agenda (apellido,nombre,domicilio,telefono) values ('Acosta','Alberto','Colon 123','4234567'); insert into agenda (apellido,nombre,domicilio,telefono) values ('Juarez','Juan','Avellaneda 135','4458787'); insert into agenda (apellido,nombre,domicilio,telefono) values ('Lopez','Maria','Urquiza 333','4545454'); insert into agenda (apellido,nombre,domicilio,telefono)

values ('Lopez','Jose','Urquiza 333','4545454'); insert into agenda (apellido,nombre,domicilio,telefono) values ('Suarez','Susana','Gral. Paz 1234','4123456'); 4- Modifique el registro cuyo nombre sea "Juan" por "Juan Jose" (1 registro afectado) 5- Actualice los registros cuyo nmero telefnico sea igual a "4545454" por "4445566" (2 registros afectados) 6- Actualice los registros que tengan en el campo "nombre" el valor "Juan" por "Juan Jose" (ningn registro afectado porque ninguno cumple con la condicin del "where") 7 - Luego de cada actualizacin ejecute un select que muestre todos los registros de la tabla.

if object_id('agenda') is not null drop table agenda; create table agenda( apellido varchar(30), nombre varchar(20), domicilio varchar(30), telefono varchar(11) ); insert into agenda (apellido,nombre,domicilio,telefono) values ('Acosta','Alberto','Colon 123','4234567'); insert into agenda (apellido,nombre,domicilio,telefono) values ('Juarez','Juan','Avellaneda 135','4458787'); insert into agenda (apellido,nombre,domicilio,telefono) values ('Lopez','Maria','Urquiza 333','4545454'); insert into agenda (apellido,nombre,domicilio,telefono) values ('Lopez','Jose','Urquiza 333','4545454'); insert into agenda (apellido,nombre,domicilio,telefono) values ('Suarez','Susana','Gral. Paz 1234','4123456'); select * from agenda; update agenda set nombre='Juan Jose' where nombre='Juan'; select * from agenda; update agenda set telefono='4445566' where telefono='4545454'; select * from agenda; update agenda set nombre='Juan Jose' where nombre='Juan';

select * from agenda;

Segundo problema:
Trabaje con la tabla "libros" de una librera. 1- Elimine la tabla si existe: if object_id('libros') is not null drop table libros; 2- Crela con los siguientes campos: titulo (cadena de 30 caracteres de longitud), autor (cadena de 20), editorial (cadena de 15) y precio (float): create table libros ( titulo varchar(30), autor varchar(20), editorial varchar(15), precio float ); 3- Ingrese los siguientes registros: insert into libros (titulo, autor, editorial, precio) values ('El aleph','Borges','Emece',25.00); insert into libros (titulo, autor, editorial, precio) values ('Martin Fierro','Jose Hernandez','Planeta',35.50); insert into libros (titulo, autor, editorial, precio) values ('Aprenda PHP','Mario Molina','Emece',45.50); insert into libros (titulo, autor, editorial, precio) values ('Cervantes y el quijote','Borges','Emece',25); insert into libros (titulo, autor, editorial, precio) values ('Matematica estas ahi','Paenza','Siglo XXI',15); 4- Muestre todos los registros (5 registros): select *from libros; 5- Modifique los registros cuyo autor sea igual Paenza" (1 registro afectado) update libros set autor='Adrian Paenza' where autor='Paenza'; a "Paenza", por "Adrian

6- Nuevamente, modifique los registros cuyo autor sea igual por "Adrian Paenza" (ningn registro afectado porque ninguno cumple la condicin) update libros set autor='Adrian Paenza' where autor='Paenza';

a "Paenza",

7- Actualice el precio del libro de "Mario Molina" a 27 pesos (1 registro afectado): update libros set precio=27 where autor='Mario Molina'; 8- Actualice el valor del campo "editorial" por "Emece S.A.", para todos los registros cuya editorial sea igual a "Emece" (3 registros afectados):

update libros set editorial='Emece S.A.' where editorial='Emece'; 9 - Luego de cada actualizacin ejecute un select que mustre todos los registros de la tabla.

Ver solucin
if object_id('libros') is not null drop table libros; create table libros ( titulo varchar(30), autor varchar(20), editorial varchar(15), precio float ); insert into libros (titulo, autor, editorial, precio) values ('El aleph','Borges','Emece',25.00); insert into libros (titulo, autor, editorial, precio) values ('Martin Fierro','Jose Hernandez','Planeta',35.50); insert into libros (titulo, autor, editorial, precio) values ('Aprenda PHP','Mario Molina','Emece',45.50); insert into libros (titulo, autor, editorial, precio) values ('Cervantes y el quijote','Borges','Emece',25); insert into libros (titulo, autor, editorial, precio) values ('Matematica estas ahi','Paenza','Siglo XXI',15); select * from libros; update libros set autor='Adrian Paenza' where autor='Paenza'; select * from libros; update libros set autor='Adrian Paenza' where autor='Paenza'; select * from libros; update libros set precio=27 where autor='Mario Molina'; select * from libros; update libros set editorial='Emece S.A.' where editorial='Emece'; select * from libros;

10 - Comentarios
Para aclarar algunas instrucciones, en ocasiones, necesitamos agregar comentarios. Es posible ingresar comentarios en la lnea de comandos, es decir, un texto que no se ejecuta; para ello se emplean dos guiones (--) al comienzo de la lnea:
select * from libros --mostramos los registros de libros;

en la lnea anterior, todo lo que est luego de los guiones (hacia la derecha) no se ejecuta. Para agregar varias lneas de comentarios, se coloca una barra seguida de un asterisco (/*) al comienzo del bloque de comentario y al finalizarlo, un asterisco seguido de una barra (*/).
select titulo, autor /*mostramos ttulos y nombres de los autores*/ from libros;

todo lo que est entre los smbolos "/*" y "*/" no se ejecuta. Problema: Trabajamos con la tabla "libros" que almacena los datos de los libros de una librera. Eliminamos la tabla, si existe:
if object_id('libros') is not null drop table libros;

Creamos la tabla:
create table libros( titulo varchar(30), autor varchar(20), editorial varchar(15) );

Agregamos un registro:
insert into libros (titulo,autor,editorial) values ('El aleph','Borges','Emece');

Mostramos todos los libros y agregamos un comentario de linea:


select * from libros --mostramos los registros de libros;

vamos a mostrar el ttulo y autor de todos los libros y agregamos un bloque de comentarios:

select titulo, autor /*mostramos ttulos y nombres de los autores*/ from libros;

Note que lo que est entre los smbolos no se ejecuta.


if object_id('libros') is not null drop table libros; create table libros( titulo varchar(30), autor varchar(20), editorial varchar(15) ); insert into libros (titulo,autor,editorial) values ('El aleph','Borges','Emece'); select * from libros --mostramos los registros de libros; select titulo, autor

Problema: Trabajamos con la tabla "libros" que almacena los datos de los libros de una librera. Eliminamos la tabla, si existe:
if object_id('libros') is not null drop table libros;

Creamos la tabla:
create table libros( titulo varchar(30), autor varchar(20), editorial varchar(15) );

Agregamos un registro:
insert into libros (titulo,autor,editorial) values ('El aleph','Borges','Emece');

Mostramos todos los libros y agregamos un comentario de linea:


select * from libros --mostramos los registros de libros;

vamos a mostrar el ttulo y autor de todos los libros y agregamos un bloque de comentarios:
select titulo, autor /*mostramos ttulos y

nombres de los autores*/ from libros;

Note que lo que est entre los smbolos no se ejecuta.


if object_id('libros') is not null drop table libros; create table libros( titulo varchar(30), autor varchar(20), editorial varchar(15) ); insert into libros (titulo,autor,editorial) values ('El aleph','Borges','Emece'); select * from libros --mostramos los registros de libros; select titulo, autor

if object_id('libros') is not null drop table libros;

create table libros( titulo varchar(30), autor varchar(20), editorial varchar(15) );

insert into libros (titulo,autor,editorial) values ('El aleph','Borges','Emece');

select * from libros --mostramos los registros de libros;

select titulo, autor /*mostramos ttulos y nombres de los autores*/ from libros;

11 - Valores null (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 );

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);

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;

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".

11 - Valores null (is null)


Problema:

Trabajamos con la tabla "libros" de una librera. Eliminamos la tabla "libros", si existe:
if object_id('libros') is not null drop table libros;

Creamos la tabla especificando que los campos "titulo" y "autor" no admitan valores nulos:
create table libros( titulo varchar(30) not null, autor varchar(30) not null, editorial varchar(15) null, precio float );

Los campos "editorial" y "precio" si permiten valores nulos; el primero, porque lo especificamos colocando "null" en la definicin del campo, el segundo lo asume por defecto. Agregamos un registro a la tabla con valor nulo para el campo "precio":
insert into libros (titulo,autor,editorial,precio) values('El aleph','Borges','Emece',null);

Recuerde que el valor "null" no es una cadena de caracteres, por lo tanto no se coloca entre comillas. Ingresamos otro registro, con valor nulo para el campo "editorial", campo que admite valores "null":
insert into libros (titulo,autor,editorial,precio) values('Alicia en el pais','Lewis Carroll',null,0);

Veamos lo que sucede si intentamos ingresar el valor "null" en campos que no lo admiten, como "titulo":
insert into libros (titulo,autor,editorial,precio) values(null,'Borges','Siglo XXI',25);

aparece un mensaje y la sentencia no se ejecuta. Para ver cules campos admiten valores nulos y cules no, empleamos el procedimiento almacenado "sp_columns":
sp_columns libros;

nos muestra muchas columnas, una de ellas tiene el encabezado "IS_NULLABLE", vemos que aparece "NO" en los campos que no permiten valores nulos y "YES" en los campos que si los permiten.

Dijimos que el valor "null" no es lo mismo que una cadena vaca. Vamos a ingresar un registro con cadena vaca para el campo "editorial":
insert into libros (titulo,autor,editorial,precio) values('Uno','Richard Bach','',18.50);

Ingresamos otro registro, ahora cargamos una cadena vaca en el campo "titulo":
insert into libros (titulo,autor,editorial,precio) values('','Richard Bach','Planeta',22);

Veamos todos los regiustros ingresados:


select *from libros;

Recuperemos los registros que contengan el valor "null" en el campo "precio":


select *from libros where precio is null;

La sentencia anterior tendr una salida diferente a la siguiente:


select *from libros where precio=0;

Con la primera sentencia veremos los libros cuyo precio es igual a "null" (desconocido); con la segunda, los libros cuyo precio es 0. Recuperemos los libros cuyo nombre de editorial es "null":
select *from libros where editorial is null;

Ahora veamos los libros cuya editorial almacena una cadena vaca:
select *from libros where editorial='';

Para recuperar los libros cuyo precio no sea nulo tipeamos:


select *from libros where precio is not null;

if object_id('libros') is not null drop table libros;

create table libros( titulo varchar(30) not null, autor varchar(30) not null, editorial varchar(15) null, precio float );

insert into libros (titulo,autor,editorial,precio) values('El aleph','Borges','Emece',null);

insert into libros (titulo,autor,editorial,precio) values('Alicia en el pais','Lewis Carroll',null,0);

insert into libros (titulo,autor,editorial,precio) values(null,'Borges','Siglo XXI',25);

sp_columns libros;

insert into libros (titulo,autor,editorial,precio) values('Uno','Richard Bach','',18.50);

insert into libros (titulo,autor,editorial,precio) values('','Richard Bach','Planeta',22);

select *from libros;

select *from libros where precio is null;

select *from libros where precio=0;

select *from libros where editorial is null;

select *from libros where editorial='';

select *from libros where precio is not null;

Primer problema:
Una farmacia guarda informacin referente a sus medicamentos en una tabla llamada "medicamentos". 1- Elimine la tabla, si existe: if object_id('medicamentos') is not null drop table medicamentos; 2- Cree la tabla con la siguiente estructura: create table medicamentos( codigo integer not null, nombre varchar(20) not null, laboratorio varchar(20), precio float, cantidad integer not null ); 3- Visualice la estructura de la tabla "medicamentos": sp_columns medicamentos; note que los campos "codigo", "nombre" y "cantidad", en la columna "IS_NULLABLE" aparece "NO" y en las otras "YES".

4- Ingrese algunos registros con valores "null" para los campos que lo admitan: insert into medicamentos (codigo,nombre,laboratorio,precio,cantidad) values(1,'Sertal gotas',null,null,100); insert into medicamentos (codigo,nombre,laboratorio,precio,cantidad) values(2,'Sertal compuesto',null,8.90,150); insert into medicamentos (codigo,nombre,laboratorio,precio,cantidad) values(3,'Buscapina','Roche',null,200); 5- Vea todos los registros: select *from medicamentos; 6- Ingrese un registro con valor "0" para el precio y cadena vaca para el laboratorio: insert into medicamentos (codigo,nombre, laboratorio,precio,cantidad) values(4,'Bayaspirina','',0,150); 7- Ingrese un registro con valor "0" para el cdigo y cantidad y cadena vaca para el nombre: insert into medicamentos (codigo,nombre,laboratorio,precio,cantidad) values(0,'','Bayer',15.60,0); 8- Muestre todos los registros: select *from medicamentos; 9- Intente ingresar un registro con valor nulo para un campo que no lo admite (aparece un mensaje de error): insert into medicamentos (codigo,nombre,laboratorio,precio,cantidad) values(null,'Amoxidal jarabe','Bayer',25,120); 10- Recupere los registros que contengan valor "null" en el campo "laboratorio", luego los que tengan una cadena vaca en el mismo campo. Note que el resultado es diferente. 11- Recupere los registros que contengan valor "null" en el campo "precio", luego los que tengan el valor 0 en el mismo campo. Note que el resultado es distinto. 12- Recupere los registros cuyo laboratorio no contenga una cadena vaca, luego los que sean distintos de "null". Note que la salida de la primera sentencia no muestra los registros con cadenas vacas y tampoco los que tienen valor nulo; el resultado de la segunda sentencia muestra los registros con valor para el campo laboratorio (incluso cadena vaca). 13- Recupere los registros cuyo precio sea distinto de 0, luego los que sean distintos de "null": Note que la salida de la primera sentencia no muestra los registros con valor 0 y tampoco los que tienen valor nulo; el resultado de la segunda sentencia muestra los registros con valor para el campo precio (incluso el valor 0).

if object_id('medicamentos') is not null drop table medicamentos; create table medicamentos( codigo integer not null, nombre varchar(20) not null, laboratorio varchar(20), precio float, cantidad integer not null ); sp_columns medicamentos; insert into medicamentos (codigo,nombre,laboratorio,precio,cantidad) values(1,'Sertal gotas',null,null,100); insert into medicamentos (codigo,nombre,laboratorio,precio,cantidad) values(2,'Sertal compuesto',null,8.90,150); insert into medicamentos (codigo,nombre,laboratorio,precio,cantidad) values(3,'Buscapina','Roche',null,200); select *from medicamentos; insert into medicamentos (codigo,nombre, laboratorio,precio,cantidad) values(4,'Bayaspirina','',0,150); insert into medicamentos (codigo,nombre,laboratorio,precio,cantidad) values(0,'','Bayer',15.60,0); select *from medicamentos; insert into medicamentos (codigo,nombre,laboratorio,precio,cantidad) values(null,'Amoxidal jarabe','Bayer',25,120); select *from medicamentos where laboratorio is null; select *from medicamentos where laboratorio=''; select *from medicamentos where precio is null; select *from medicamentos where precio=0; select *from medicamentos where laboratorio<>''; select *from medicamentos where laboratorio is not null; select *from medicamentos where precio<>0; select *from medicamentos

where precio is not null;

12 - Clave primaria
Una clave primaria es un campo (o varios) que identifica un solo registro (fila) en una tabla. Para un valor del campo clave existe solamente un registro. Veamos un ejemplo, si tenemos una tabla con datos de personas, el nmero de documento puede establecerse como clave primaria, es un valor que no se repite; puede haber personas con igual apellido y nombre, incluso el mismo domicilio (padre e hijo por ejemplo), pero su documento ser siempre distinto. Si tenemos la tabla "usuarios", el nombre de cada usuario puede establecerse como clave primaria, es un valor que no se repite; puede haber usuarios con igual clave, pero su nombre de usuario ser siempre diferente. Podemos establecer que un campo sea clave primaria al momento de crear la tabla o luego que ha sido creada. Vamos a aprender a establecerla al crear la tabla. Hay 2 maneras de hacerlo, por ahora veremos la sintaxis ms sencilla. Tenemos nuestra tabla "usuarios" definida con 2 campos ("nombre" y "clave"). La sintaxis bsica y general es la siguiente:
create table NOMBRETABLA( CAMPO TIPO, ... primary key (NOMBRECAMPO) );

En el siguiente ejemplo definimos una clave primaria, para nuestra tabla "usuarios" para asegurarnos que cada usuario tendr un nombre diferente y nico:
create table usuarios( nombre varchar(20), clave varchar(10), primary key(nombre) );

Lo que hacemos agregar luego de la definicin de cada campo, "primary key" y entre parntesis, el nombre del campo que ser clave primaria. Una tabla slo puede tener una clave primaria. Cualquier campo (de cualquier tipo) puede ser clave primaria, debe cumplir como requisito, que sus valores no se repitan ni sean nulos. Por ello, al definir un campo como clave primaria, automticamente SQL Server lo convierte a "not null".

Luego de haber establecido un campo como clave primaria, al ingresar los registros, SQL Server controla que los valores para el campo establecido como clave primaria no estn repetidos en la tabla; si estuviesen repetidos, muestra un mensaje y la insercin no se realiza. Es decir, si en nuestra tabla "usuarios" ya existe un usuario con nombre "juanperez" e intentamos ingresar un nuevo usuario con nombre "juanperez", aparece un mensaje y la instruccin "insert" no se ejecuta. Igualmente, si realizamos una actualizacin, SQL Server controla que los valores para el campo establecido como clave primaria no estn repetidos en la tabla, si lo estuviese, aparece un mensaje indicando que se viola la clave primaria y la actualizacin no se realiza.

12 - Clave primaria
Problema: Trabajamos con la tabla "usuarios". Eliminamos la tabla, si existe:
if object_id('usuarios') is not null drop table usuarios;

Creamos la tabla definiendo el campo "nombre" como clave primaria:


create table usuarios( nombre varchar(20), clave varchar(10), primary key(nombre) );

Al campo "nombre" no lo definimos "not null", pero al establecerse como clave primaria, SQL Server lo convierte en "not null", veamos que en la columna "IS_NULLABLE" aparece "NO":
sp_columns usuarios;

Ingresamos algunos registros:


insert into usuarios (nombre, clave) values ('juanperez','Boca'); insert into usuarios (nombre, clave) values ('raulgarcia','River');

Recordemos que cuando un campo es clave primaria, sus valores no se repiten. Intentamos ingresar un valor de clave primaria existente:
insert into usuarios (nombre, clave) values ('juanperez','payaso');

aparece un mensaje de error y la sentencia no se ejecuta. Cuando un campo es clave primaria, sus valores no pueden ser nulos. Intentamos ingresar el valor "null" en el campo clave primaria:
insert into usuarios (nombre, clave) values (null,'payaso');

aparece un mensaje de error y la sentencia no se ejecuta. Si realizamos alguna actualizacin, SQL Server controla que los valores para el campo establecido como clave primaria no estn repetidos en la tabla. Intentemos actualizar el nombre de un usuario colocando un nombre existente:
update usuarios set nombre='juanperez' where nombre='raulgarcia';

aparece un mensaje indicando que se viola la clave primaria y la actualizacin no se realiza.


if object_id('usuarios') is not null drop table usuarios;

create table usuarios( nombre varchar(20), clave varchar(10), primary key(nombre) );

sp_columns usuarios;

insert into usuarios (nombre, clave) values ('juanperez','Boca'); insert into usuarios (nombre, clave) values ('raulgarcia','River');

insert into usuarios (nombre, clave) values ('juanperez','payaso');

insert into usuarios (nombre, clave) values (null,'payaso');

update usuarios set nombre='juanperez' where nombre='raulgarcia';

12 - Clave primaria
Primer problema:
Trabaje con la tabla "libros" de una librera. 1- Elimine la tabla si existe: if object_id('libros') is not null drop table libros; 2- Crela con los siguientes campos, estableciendo como clave primaria el campo "codigo": create table libros( codigo int not null, titulo varchar(40) not null, autor varchar(20), editorial varchar(15), primary key(codigo) ); 3- Ingrese los siguientes registros: insert into libros (codigo,titulo,autor,editorial) values (1,'El aleph','Borges','Emece'); insert into libros (codigo,titulo,autor,editorial) values (2,'Martin Fierro','Jose Hernandez','Planeta'); insert into libros (codigo,titulo,autor,editorial) values (3,'Aprenda PHP','Mario Molina','Nuevo Siglo'); 4- Ingrese un registro con cdigo repetido (aparece un mensaje de error) 5- Intente ingresar el valor "null" en el campo "codigo" 6- Intente actualizar el cdigo del libro "Martin Fierro" a "1" (mensaje de error) if object_id('libros') is not null drop table libros; create table libros(

codigo int not null, titulo varchar(40) not null, autor varchar(20), editorial varchar(15), primary key(codigo) ); insert into libros (codigo,titulo,autor,editorial) values (1,'El aleph','Borges','Emece'); insert into libros (codigo,titulo,autor,editorial) values (2,'Martin Fierro','Jose Hernandez','Planeta'); insert into libros (codigo,titulo,autor,editorial) values (3,'Aprenda PHP','Mario Molina','Nuevo Siglo'); insert into libros (codigo,titulo,autor,editorial) values (2,'Alicia en el pais de las maravillas','Lewis Carroll','Planeta'); insert into libros (codigo,titulo,autor,editorial) values (null,'Alicia en el pais de las maravillas','Lewis Carroll','Planeta'); update libros set codigo=1 where titulo='Martin Fierro';

12 - Clave primaria
Primer problema:
Trabaje con la tabla "libros" de una librera. 1- Elimine la tabla si existe: if object_id('libros') is not null drop table libros; 2- Crela con los siguientes campos, estableciendo como clave primaria el campo "codigo": create table libros( codigo int not null, titulo varchar(40) not null, autor varchar(20), editorial varchar(15), primary key(codigo) ); 3- Ingrese los siguientes registros: insert into libros (codigo,titulo,autor,editorial) values (1,'El aleph','Borges','Emece'); insert into libros (codigo,titulo,autor,editorial) values (2,'Martin Fierro','Jose Hernandez','Planeta'); insert into libros (codigo,titulo,autor,editorial) values (3,'Aprenda PHP','Mario Molina','Nuevo Siglo'); 4- Ingrese un registro con cdigo repetido (aparece un mensaje de error) 5- Intente ingresar el valor "null" en el campo "codigo"

6- Intente actualizar el cdigo del libro "Martin Fierro" a "1" (mensaje de error) if object_id('libros') is not null drop table libros; create table libros( codigo int not null, titulo varchar(40) not null, autor varchar(20), editorial varchar(15), primary key(codigo) ); insert into libros (codigo,titulo,autor,editorial) values (1,'El aleph','Borges','Emece'); insert into libros (codigo,titulo,autor,editorial) values (2,'Martin Fierro','Jose Hernandez','Planeta'); insert into libros (codigo,titulo,autor,editorial) values (3,'Aprenda PHP','Mario Molina','Nuevo Siglo'); insert into libros (codigo,titulo,autor,editorial) values (2,'Alicia en el pais de las maravillas','Lewis Carroll','Planeta'); insert into libros (codigo,titulo,autor,editorial) values (null,'Alicia en el pais de las maravillas','Lewis Carroll','Planeta'); update libros set codigo=1 where titulo='Martin Fierro';

Segundo problema:
Un instituto de enseanza almacena los datos de sus estudiantes en una tabla llamada "alumnos". 1- Elimine la tabla "alumnos" si existe: if object_id('alumnos') is not null drop table alumnos; 2- Cree la tabla con la siguiente estructura intentando establecer 2 campos como clave primaria, el campo "documento" y "legajo" (no lo permite): create table alumnos( legajo varchar(4) not null, documento varchar(8), nombre varchar(30), domicilio varchar(30), primary key(documento), primary key(legajo) ); 3- Cree la tabla estableciendo como clave primaria el campo "documento": create table alumnos( legajo varchar(4) not null, documento varchar(8), nombre varchar(30), domicilio varchar(30), primary key(documento)

); 4- Verifique que el campo "documento" no admite valores nulos: sp_columns alumnos; 5- Ingrese los siguientes registros: insert into alumnos (legajo,documento,nombre,domicilio) values('A233','22345345','Perez Mariana','Colon 234'); insert into alumnos (legajo,documento,nombre,domicilio) values('A567','23545345','Morales Marcos','Avellaneda 348'); 6- Intente ingresar un alumno con nmero de documento existente (no lo permite) 7- Intente ingresar un alumno con documento nulo (no lo permite) if object_id('alumnos') is not null drop table alumnos; create table alumnos( legajo varchar(4) not null, documento varchar(8), nombre varchar(30), domicilio varchar(30), primary key(documento), primary key(legajo) ); create table alumnos( legajo varchar(4) not null, documento varchar(8), nombre varchar(30), domicilio varchar(30), primary key(documento) ); sp_columns alumnos; insert into alumnos (legajo,documento,nombre,domicilio) values('A233','22345345','Perez Mariana','Colon 234'); insert into alumnos (legajo,documento,nombre,domicilio) values('A567','23545345','Morales Marcos','Avellaneda 348'); insert into alumnos (legajo,documento,nombre,domicilio) values('A642','23545345','Gonzalez Analia','Caseros 444'); insert into alumnos (legajo,documento,nombre,domicilio) values('A685',null,'Miranda Carmen','Uspallata 999');

12 - Clave primaria
Primer problema:
Trabaje con la tabla "libros" de una librera. 1- Elimine la tabla si existe: if object_id('libros') is not null

drop table libros; 2- Crela con los siguientes campos, estableciendo como clave primaria el campo "codigo": create table libros( codigo int not null, titulo varchar(40) not null, autor varchar(20), editorial varchar(15), primary key(codigo) ); 3- Ingrese los siguientes registros: insert into libros (codigo,titulo,autor,editorial) values (1,'El aleph','Borges','Emece'); insert into libros (codigo,titulo,autor,editorial) values (2,'Martin Fierro','Jose Hernandez','Planeta'); insert into libros (codigo,titulo,autor,editorial) values (3,'Aprenda PHP','Mario Molina','Nuevo Siglo'); 4- Ingrese un registro con cdigo repetido (aparece un mensaje de error) 5- Intente ingresar el valor "null" en el campo "codigo" 6- Intente actualizar el cdigo del libro "Martin Fierro" a "1" (mensaje de error) if object_id('libros') is not null drop table libros; create table libros( codigo int not null, titulo varchar(40) not null, autor varchar(20), editorial varchar(15), primary key(codigo) ); insert into libros (codigo,titulo,autor,editorial) values (1,'El aleph','Borges','Emece'); insert into libros (codigo,titulo,autor,editorial) values (2,'Martin Fierro','Jose Hernandez','Planeta'); insert into libros (codigo,titulo,autor,editorial) values (3,'Aprenda PHP','Mario Molina','Nuevo Siglo'); insert into libros (codigo,titulo,autor,editorial) values (2,'Alicia en el pais de las maravillas','Lewis Carroll','Planeta'); insert into libros (codigo,titulo,autor,editorial) values (null,'Alicia en el pais de las maravillas','Lewis Carroll','Planeta'); update libros set codigo=1 where titulo='Martin Fierro';

Segundo problema:
Un instituto de enseanza almacena los datos de sus estudiantes en una tabla llamada "alumnos".

1- Elimine la tabla "alumnos" si existe: if object_id('alumnos') is not null drop table alumnos; 2- Cree la tabla con la siguiente estructura intentando establecer 2 campos como clave primaria, el campo "documento" y "legajo" (no lo permite): create table alumnos( legajo varchar(4) not null, documento varchar(8), nombre varchar(30), domicilio varchar(30), primary key(documento), primary key(legajo) ); 3- Cree la tabla estableciendo como clave primaria el campo "documento": create table alumnos( legajo varchar(4) not null, documento varchar(8), nombre varchar(30), domicilio varchar(30), primary key(documento) ); 4- Verifique que el campo "documento" no admite valores nulos: sp_columns alumnos; 5- Ingrese los siguientes registros: insert into alumnos (legajo,documento,nombre,domicilio) values('A233','22345345','Perez Mariana','Colon 234'); insert into alumnos (legajo,documento,nombre,domicilio) values('A567','23545345','Morales Marcos','Avellaneda 348'); 6- Intente ingresar un alumno con nmero de documento existente (no lo permite) 7- Intente ingresar un alumno con documento nulo (no lo permite) if object_id('alumnos') is not null drop table alumnos; create table alumnos( legajo varchar(4) not null, documento varchar(8), nombre varchar(30), domicilio varchar(30), primary key(documento), primary key(legajo) ); create table alumnos( legajo varchar(4) not null, documento varchar(8), nombre varchar(30), domicilio varchar(30), primary key(documento) );

sp_columns alumnos; insert into alumnos (legajo,documento,nombre,domicilio) values('A233','22345345','Perez Mariana','Colon 234'); insert into alumnos (legajo,documento,nombre,domicilio) values('A567','23545345','Morales Marcos','Avellaneda 348'); insert into alumnos (legajo,documento,nombre,domicilio) values('A642','23545345','Gonzalez Analia','Caseros 444'); insert into alumnos (legajo,documento,nombre,domicilio) values('A685',null,'Miranda Carmen','Uspallata 999');

13 - Campo con atributo 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). 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. 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".

3 - Campo con atributo Identity


Problema: Trabajamos con la tabla "libros" de una librera. Eliminamos la tabla "libros", si existe:
if object_id('libros') is not null drop table libros;

Creamos la tabla especificando que el campos "codigo" genere valores secuenciales comenzando en 1 e incrementndose en 1 automticamente:
create table libros( codigo int identity, titulo varchar(40) not null, autor varchar(30), editorial varchar(15), precio float

);

Ingresamos algunos registros, recordando que si un campo tiene el atributo "identity" debemos omitirlo en la insercin:
insert into libros (titulo,autor,editorial,precio) values('El aleph','Borges','Emece',23);

Veamos cmo se almacen:


select *from libros;

Este primer registro ingresado guarda el valor 1 en el campo correspondiente al cdigo. Continuemos ingresando registros:
insert into libros (titulo,autor,editorial,precio) values('Uno','Richard Bach','Planeta',18); insert into libros (titulo,autor,editorial,precio) values('Aprenda PHP','Mario Molina','Siglo XXI',45.60); insert into libros (titulo,autor,editorial,precio) values('Alicia en el pais de maravillas','Lewis Carroll','Paidos',15.50);

Veamos cmo se almacenaron:


select *from libros;

el cdigo (dato que no ingresamos) se carg automticamente siguiendo la secuencia de autoincremento. Intentemos ingresar un valor para el campo "codigo":
insert into libros (codigo,titulo,autor,editorial,precio) values(5,'Martin Fierro','Jose Hernandez','Paidos',25);

generar un mensaje de error. Un campo "identity" tampoco puede ser actualizado. Intentemos cambiar el valor de cdigo de un registro:
update libros set codigo=9 where titulo='Uno';

aparece un mensaje de error. Vamos a ver la estructura de la tabla ejecutando el siguiente procedimiento almacenado:
sp_columns libros;

Note que en el campo "codigo", en la columna "TYPE_NAME" aparece "int identity" y en la columna IS_NULLABLE" aparece "NO", porque un campo "identity" automticamente se convierte en "not null". En el campo "titulo", en la columna "IS_NULLABLE" aparece "NO" porque explcitamente indicamos que el campo fuera "not null". Eliminemos el ltimo registro:
delete from libros where autor='Lewis Carroll';

Ingresamos un quinto registro y luego vemos que en el campo cdigo se guard el valor secuencial sin considerar que el valor "4" ya no existe:
insert into libros (titulo, autor, editorial, precio) values('Martin Fierro','Jose Hernandez','Paidos',25); select *from libros;

if object_id('libros') is not null drop table libros;

create table libros( codigo int identity, titulo varchar(40) not null, autor varchar(30), editorial varchar(15), precio float );

insert into libros (titulo,autor,editorial,precio) values('El aleph','Borges','Emece',23);

select *from libros;

insert into libros (titulo,autor,editorial,precio)

values('Uno','Richard Bach','Planeta',18); insert into libros (titulo,autor,editorial,precio) values('Aprenda PHP','Mario Molina','Siglo XXI',45.60); insert into libros (titulo,autor,editorial,precio) values('Alicia en el pais de maravillas','Lewis Carroll','Paidos',15.50);

select *from libros;

insert into libros (codigo,titulo,autor,editorial,precio) values(5,'Martin Fierro','Jose Hernandez','Paidos',25);

update libros set codigo=9 where titulo='Uno';

sp_columns libros;

delete from libros where autor='Lewis Carroll';

insert into libros (titulo, autor, editorial, precio) values('Martin Fierro','Jose Hernandez','Paidos',25);

select *from libros;

13 - Campo con atributo Identity


Primer problema:
Una farmacia guarda informacin referente a sus medicamentos en una tabla llamada "medicamentos". 1- Elimine la tabla,si existe: if object_id('medicamentos') is not null drop table medicamentos; 2- Cree la tabla con un campo "codigo" que genere valores secuenciales automticamente: create table medicamentos( codigo int identity, nombre varchar(20) not null, laboratorio varchar(20), precio float, cantidad integer ); 3- Visualice la estructura de la tabla "medicamentos": sp_columns medicamentos; 4- Ingrese los siguientes registros: insert into medicamentos (nombre, laboratorio,precio,cantidad) values('Sertal','Roche',5.2,100); insert into medicamentos (nombre, laboratorio,precio,cantidad) values('Buscapina','Roche',4.10,200); insert into medicamentos (nombre, laboratorio,precio,cantidad) values('Amoxidal 500','Bayer',15.60,100); 5- Verifique que SQL Server gener valores para el campo "cdigo" de modo automtico: select *from medicamentos; 6- Intente ingresar un registro con un valor para el campo "codigo" 7- Intente actualizar un valor de cdigo (aparece un mensaje de error) 8- Elimine el registro con codigo "3" (1 registro eliminado) 9- Ingrese un nuevo registro: insert into medicamentos (nombre, laboratorio,precio,cantidad) values('Amoxilina 500','Bayer',15.60,100); 10- Seleccione todos los registros para ver qu valor guard SQL Server en el campo cdigo: select *from medicamentos;

Ver solucin
if object_id('medicamentos') is not null drop table medicamentos; create table medicamentos( codigo int identity,

nombre varchar(20) not null, laboratorio varchar(20), precio float, cantidad integer ); sp_columns medicamentos; insert into medicamentos (nombre, laboratorio,precio,cantidad) values('Sertal','Roche',5.2,100); insert into medicamentos (nombre, laboratorio,precio,cantidad) values('Buscapina','Roche',4.10,200); insert into medicamentos (nombre, laboratorio,precio,cantidad) values('Amoxidal 500','Bayer',15.60,100); select *from medicamentos; insert into medicamentos (codigo,nombre, laboratorio,precio,cantidad) values(4,'Amoxilina 500','Bayer',15.60,100); update medicamentos set codigo=5 where nombre='Bayaspirina'; delete from medicamentos where codigo=3; insert into medicamentos (nombre, laboratorio,precio,cantidad) values('Amoxilina 500','Bayer',15.60,100); select *from medicamentos;

Segundo problema:
Un videoclub almacena informacin sobre sus pelculas en una tabla llamada "peliculas". 1- Elimine la tabla si existe: if object_id('peliculas') is not null drop table peliculas; 2- Crela definiendo un campo "codigo" autoincrementable y como clave primaria: create table peliculas( codigo int identity, titulo varchar(40), actor varchar(20), duracion int, primary key(codigo) ); 3- Ejecute el procedimiento almacenado para visualizar la estructura de la tabla: sp_columns peliculas; 4- Ingrese los siguientes registros: insert into peliculas (titulo,actor,duracion) values('Mision imposible','Tom Cruise',120); insert into peliculas (titulo,actor,duracion) values('Harry Potter y la piedra filosofal','Daniel R.',180); insert into peliculas (titulo,actor,duracion)

values('Harry Potter y la camara secreta','Daniel R.',190); insert into peliculas (titulo,actor,duracion) values('Mision imposible 2','Tom Cruise',120); insert into peliculas (titulo,actor,duracion) values('La vida es bella','zzz',220); 5- Seleccione todos los registros y verifique la carga automtica de los cdigos: select *from peliculas; 6- Intente actualizar el codigo de una pelcula (aparece un mensaje de error) 7- Elimine la pelcula "La vida es bella". 8- Ingrese un nuevo registro. 9- Visualice los registros para ver el valor almacenado en codigo (valor 7): select *from peliculas; if object_id('peliculas') is not null drop table peliculas; create table peliculas( codigo int identity, titulo varchar(40), actor varchar(20), duracion int, primary key(codigo) ); sp_columns peliculas; insert into peliculas (titulo,actor,duracion) values('Mision imposible','Tom Cruise',120); insert into peliculas (titulo,actor,duracion) values('Harry Potter y la piedra filosofal','Daniel R.',180); insert into peliculas (titulo,actor,duracion) values('Harry Potter y la camara secreta','Daniel R.',190); insert into peliculas (titulo,actor,duracion) values('Mision imposible 2','Tom Cruise',120); insert into peliculas (titulo,actor,duracion) values('La vida es bella','zzz',220); select *from peliculas; update peliculas set codigo=7 where codigo=4; delete from peliculas where titulo='La vida es bella'; insert into peliculas (titulo,actor,duracion) values('Elsa y Fred','China Zorrilla',90); select *from peliculas;

14 - Otras caractersticas del atributo Identity


El atributo "identity" permite indicar el valor de inicio de la secuencia y el incremento, para ello usamos la siguiente sintaxis:
create table libros( codigo int identity(100,2), titulo varchar(20), autor varchar(30), precio float );

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. 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:
set identity_insert libros off;

14 - Otras caractersticas del atributo Identity


Problema: Trabajamos con la tabla "libros" de una librera. Eliminamos la tabla "libros", si existe:
if object_id('libros') is not null drop table libros;

Creamos la tabla especificando que el campos "codigo" genere valores secuenciales comenzando en 100 e incrementndose en 2 automticamente:
create table libros( codigo int identity(100,2), titulo varchar(20), autor varchar(30), precio float );

Ingresamos algunos registros, recordando que si un campo tiene el atributo "identity" debemos omitirlo en la insercin:
insert into libros (titulo,autor,precio) values('El aleph','Borges',23); insert into libros (titulo,autor,precio) values('Uno','Richard Bach',18); insert into libros (titulo,autor,precio) values('Aprenda PHP','Mario Molina',45.60);

Veamos cmo se almacenaron:


select *from libros;

el cdigo (dato que no ingresamos) se carg automticamente, inicindose en 100 y siguiendo la secuencia de autoincremento (2). Para saber cul es el valor de inicio del campo "identity" de la tabla "libros" tipeamos:

select ident_seed('libros');

retorna "2". Si intentamos ingresar un valor para el campo "codigo":


insert into libros (codigo,titulo,autor,precio) values(106,'Martin Fierro','Jose Hernandez',25);

generar un mensaje de error. Para permitir ingresar un valor en un campo de identidad activamos la opcin "identity_insert":
set identity_insert libros on;

Recordemos que si "identity_insert" est en ON, la instruccin "insert" DEBE explicitar un valor:
insert into libros (codigo,titulo,autor) values (100,'Matematica estas ahi','Paenza');

Note que ingresamos un valor de cdigo que ya existe; esto est permitido porque el atributo "identity" no implica unicidad. Ingresamos otro registro:
insert into libros (codigo,titulo,autor) values (1,'Ilusiones','Richard Bach');

Note que ingresamos un valor de cdigo menor al valor de inicio de la secuencia, est permitido. 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) values ('Uno','Richard Bach');

Para desactivar la opcin "identity_insert" tipeamos:


set identity_insert libros off;

Intentemos ingresar un valor para el campo "codigo":


insert into libros (codigo,titulo,autor) values (300,'Uno','Richard Bach');

aparece un mensaje de error.

if object_id('libros') is not null drop table libros;

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

insert into libros (titulo,autor,precio) values('El aleph','Borges',23); insert into libros (titulo,autor,precio) values('Uno','Richard Bach',18); insert into libros (titulo,autor,precio) values('Aprenda PHP','Mario Molina',45.60);

select *from libros;

select ident_seed('libros');

insert into libros (codigo,titulo,autor,precio) values(106,'Martin Fierro','Jose Hernandez',25);

set identity_insert libros on;

insert into libros (codigo,titulo,autor) values (100,'Matematica estas ahi','Paenza');

insert into libros (codigo,titulo,autor) values (1,'Ilusiones','Richard Bach');

insert into libros (titulo,autor) values ('Uno','Richard Bach');

set identity_insert libros off;

insert into libros (codigo,titulo,autor) values (300,'Uno','Richard Bach');

14 - Otras caractersticas del atributo Identity


Primer problema:
Una farmacia guarda informacin referente a sus medicamentos en una tabla llamada "medicamentos". 1- Elimine la tabla,si existe: if object_id('medicamentos') is not null drop table medicamentos; 2- Cree la tabla con un campo "codigo" que genere valores secuenciales automticamente comenzando en 10 e incrementndose en 1: create table medicamentos( codigo integer identity(10,1), nombre varchar(20) not null, laboratorio varchar(20), precio float, cantidad integer ); 3- Ingrese los siguientes registros: insert into medicamentos (nombre, laboratorio,precio,cantidad)

values('Sertal','Roche',5.2,100); insert into medicamentos (nombre, laboratorio,precio,cantidad) values('Buscapina','Roche',4.10,200); insert into medicamentos (nombre, laboratorio,precio,cantidad) values('Amoxidal 500','Bayer',15.60,100); 4- Verifique que SQL Server gener valores para el campo "cdigo" de modo automtico: select *from medicamentos; 5- Intente ingresar un registro con un valor para el campo "codigo". 6- Setee la opcin "identity_insert" en "on" 7- Ingrese un nuevo registro sin valor para el campo "codigo" (no lo permite): insert into medicamentos (nombre, laboratorio,precio,cantidad) values('Amoxilina 500','Bayer',15.60,100); 8- Ingrese un nuevo registro con valor para el campo "codigo" repetido. 9- Use la funcin "ident_seed()" para averiguar el valor de inicio del campo "identity" de la tabla "medicamentos" 10- Emplee la funcin "ident_incr()" para saber cul es el valor de incremento del campo "identity" de "medicamentos"

Ver solucin
if object_id('medicamentos') is not null drop table medicamentos; create table medicamentos( codigo integer identity(10,1), nombre varchar(20) not null, laboratorio varchar(20), precio float, cantidad integer ); insert into medicamentos (nombre, laboratorio,precio,cantidad) values('Sertal','Roche',5.2,100); insert into medicamentos (nombre, laboratorio,precio,cantidad) values('Buscapina','Roche',4.10,200); insert into medicamentos (nombre, laboratorio,precio,cantidad) values('Amoxidal 500','Bayer',15.60,100); select *from medicamentos; insert into medicamentos (codigo,nombre, laboratorio,precio,cantidad) values(4,'Amoxilina 500','Bayer',15.60,100); set identity_insert medicamentos on; insert into medicamentos (nombre, laboratorio,precio,cantidad) values('Amoxilina 500','Bayer',15.60,100);

insert into medicamentos (codigo,nombre, laboratorio,precio,cantidad) values(10,'Amoxilina 500','Bayer',15.60,100); select ident_seed('medicamentos'); select ident_incr('medicamentos');

Segundo problema:
Un videoclub almacena informacin sobre sus pelculas en una tabla llamada "peliculas". 1- Elimine la tabla si existe: if object_id('peliculas') is not null drop table peliculas; 2- Crela definiendo un campo "codigo" autoincrementable que comience en 50 y se incremente en 3: create table peliculas( codigo int identity (50,3), titulo varchar(40), actor varchar(20), duracion int ); 3- Ingrese los siguientes registros: insert into peliculas (titulo,actor,duracion) values('Mision imposible','Tom Cruise',120); insert into peliculas (titulo,actor,duracion) values('Harry Potter y la piedra filosofal','Daniel R.',180); insert into peliculas (titulo,actor,duracion) values('Harry Potter y la camara secreta','Daniel R.',190); 4- Seleccione todos los registros y verifique la carga automtica de los cdigos: select *from peliculas; 5- Setee la opcin "identity_insert" en "on" 6- Ingrese un registro con valor de cdigo menor a 50. 7- Ingrese un registro con valor de cdigo mayor al ltimo generado. 8- Averigue el valor de inicio del campo "identity" de la tabla "peliculas". 9- Averigue el valor de incremento del campo "identity" de "peliculas". 10- Intente ingresar un registro sin valor para el campo cdigo. 11- Desactive la opcin se insercin para el campo de identidad. 12- Ingrese un nuevo registro y muestre todos los registros para ver cmo SQL Server sigui la secuencia tomando el ltimo valor del campo como referencia.

Ver solucin

if object_id('peliculas') is not null drop table peliculas; create table peliculas( codigo int identity (50,3), titulo varchar(40), actor varchar(20), duracion int ); insert into peliculas (titulo,actor,duracion) values('Mision imposible','Tom Cruise',120); insert into peliculas (titulo,actor,duracion) values('Harry Potter y la piedra filosofal','Daniel R.',180); insert into peliculas (titulo,actor,duracion) values('Harry Potter y la camara secreta','Daniel R.',190); select *from peliculas; set identity_insert peliculas on; insert into peliculas (codigo,titulo,actor,duracion) values(20,'Mision imposible 2','Tom Cruise',120); insert into peliculas (codigo, titulo,actor,duracion) values(80,'La vida es bella','zzz',220); select ident_seed('peliculas'); select ident_incr('peliculas'); insert into peliculas (titulo,actor,duracion) values('Elsa y Fred','China Zorrilla',90); set identity_insert peliculas off; insert into peliculas (titulo,actor,duracion) values('Elsa y Fred','China Zorrilla',90); select *from peliculas;

15 - Truncate table
Aprendimos que para borrar todos los registro de una tabla se usa "delete" sin condicin "where". Tambin podemos eliminar todos los registros de una tabla con "truncate table". Por ejemplo, queremos vaciar la tabla "libros", usamos:
truncate table libros;

La sentencia "truncate table" vaca la tabla (elimina todos los registros) y conserva la estructura de la tabla.

La diferencia con "drop table" es que esta sentencia borra la tabla, "truncate table" la vaca. La diferencia con "delete" es la velocidad, es ms rpido "truncate table" que "delete" (se nota cuando la cantidad de registros es muy grande) ya que ste borra los registros uno a uno. Otra diferencia es la siguiente: cuando la tabla tiene un campo "identity", si borramos todos los registros con "delete" y luego ingresamos un registro, al cargarse el valor en el campo de identidad, contina con la secuencia teniendo en cuenta el valor mayor que se haba guardado; si usamos "truncate table" para borrar todos los registros, al ingresar otra vez un registro, la secuencia del campo de identidad vuelve a iniciarse en 1. Por ejemplo, tenemos la tabla "libros" con el campo "codigo" definido "identity", y el valor ms alto de ese campo es "2", si borramos todos los registros con "delete" y luego ingresamos un registro, ste guardar el valor de cdigo "3"; si en cambio, vaciamos la tabla con "truncate table", al ingresar un nuevo registro el valor del cdigo se iniciar en 1 nuevamente.

Problema: Trabajamos con la tabla "libros" que almacena los datos de los libros de una librera. Eliminamos la tabla, si existe:
if object_id('libros') is not null drop table libros;

Creamos la tabla:
create table libros( codigo int identity, titulo varchar(30), autor varchar(20), editorial varchar(15), precio float );

Agregamos algunos registros:


insert into libros (titulo,autor,editorial,precio) values ('El aleph','Borges','Emece',25.60); insert into libros (titulo,autor,editorial,precio) values ('Uno','Richard Bach','Planeta',18);

Seleccionamos todos los registros:


select *from libros;

Truncamos la tabla:
truncate table libros;

Ingresamos nuevamente algunos registros:


insert into libros (titulo,autor,editorial,precio) values ('El aleph','Borges','Emece',25.60); insert into libros (titulo,autor,editorial,precio) values ('Uno','Richard Bach','Planeta',18);

Si seleccionamos todos los registros vemos que la secuencia se reinici en 1:


select *from libros;

Eliminemos todos los registros con "delete":


delete from libros;

Ingresamos nuevamente algunos registros:


insert into libros (titulo,autor,editorial,precio) values ('El aleph','Borges','Emece',25.60); insert into libros (titulo,autor,editorial,precio) values ('Uno','Richard Bach','Planeta',18);

Seleccionamos todos los registros y vemos que la secuencia continu:


select *from libros;

if object_id('libros') is not null drop table libros;

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

insert into libros (titulo,autor,editorial,precio) values ('El aleph','Borges','Emece',25.60); insert into libros (titulo,autor,editorial,precio) values ('Uno','Richard Bach','Planeta',18);

select *from libros;

truncate table libros;

insert into libros (titulo,autor,editorial,precio) values ('El aleph','Borges','Emece',25.60); insert into libros (titulo,autor,editorial,precio) values ('Uno','Richard Bach','Planeta',18);

select *from libros;

delete from libros;

insert into libros (titulo,autor,editorial,precio) values ('El aleph','Borges','Emece',25.60); insert into libros (titulo,autor,editorial,precio) values ('Uno','Richard Bach','Planeta',18);

select *from libros;

15 - Truncate table
Primer problema:
Un instituto de enseanza almacena los datos de sus estudiantes en una tabla llamada "alumnos". 1- Elimine la tabla "alumnos" si existe: if object_id('alumnos') is not null drop table alumnos; 2- Cree la tabla con la siguiente estructura: create table alumnos( legajo int identity, documento varchar(8), nombre varchar(30), domicilio varchar(30) ); 3- Ingrese los siguientes registros y mustrelos para ver la secuencia de cdigos: insert into alumnos (documento,nombre,domicilio) values('22345345','Perez Mariana','Colon 234'); insert into alumnos (documento,nombre,domicilio) values('23545345','Morales Marcos','Avellaneda 348'); insert into alumnos (documento,nombre,domicilio) values('24356345','Gonzalez Analia','Caseros 444'); insert into alumnos (documento,nombre,domicilio) values('25666777','Torres Ramiro','Dinamarca 209'); 4- Elimine todos los registros con "delete". 5- Ingrese los siguientes registros y seleccinelos para ver cmo SQL Server gener los cdigos: insert into alumnos (documento,nombre,domicilio) values('22345345','Perez Mariana','Colon 234'); insert into alumnos (documento,nombre,domicilio) values('23545345','Morales Marcos','Avellaneda 348'); insert into alumnos (documento,nombre,domicilio) values('24356345','Gonzalez Analia','Caseros 444'); insert into alumnos (documento,nombre,domicilio) values('25666777','Torres Ramiro','Dinamarca 209'); select *from alumnos; 6- Elimine todos los registros con "truncate table". 7- Ingrese los siguientes registros y muestre todos los registros para ver que SQL Server reinici la secuencia del campo "identity": insert into alumnos (documento,nombre,domicilio) values('22345345','Perez Mariana','Colon 234'); insert into alumnos (documento,nombre,domicilio) values('23545345','Morales Marcos','Avellaneda 348'); insert into alumnos (documento,nombre,domicilio) values('24356345','Gonzalez Analia','Caseros 444'); insert into alumnos (documento,nombre,domicilio) values('25666777','Torres Ramiro','Dinamarca 209');

select *from alumnos; if object_id('alumnos') is not null drop table alumnos; create table alumnos( legajo int identity, documento varchar(8), nombre varchar(30), domicilio varchar(30) ); insert into alumnos (documento,nombre,domicilio) values('22345345','Perez Mariana','Colon 234'); insert into alumnos (documento,nombre,domicilio) values('23545345','Morales Marcos','Avellaneda 348'); insert into alumnos (documento,nombre,domicilio) values('24356345','Gonzalez Analia','Caseros 444'); insert into alumnos (documento,nombre,domicilio) values('25666777','Torres Ramiro','Dinamarca 209'); delete from alumnos; insert into alumnos (documento,nombre,domicilio) values('22345345','Perez Mariana','Colon 234'); insert into alumnos (documento,nombre,domicilio) values('23545345','Morales Marcos','Avellaneda 348'); insert into alumnos (documento,nombre,domicilio) values('24356345','Gonzalez Analia','Caseros 444'); insert into alumnos (documento,nombre,domicilio) values('25666777','Torres Ramiro','Dinamarca 209'); select *from alumnos; truncate table alumnos; insert into alumnos (documento,nombre,domicilio) values('22345345','Perez Mariana','Colon 234'); insert into alumnos (documento,nombre,domicilio) values('23545345','Morales Marcos','Avellaneda 348'); insert into alumnos (documento,nombre,domicilio) values('24356345','Gonzalez Analia','Caseros 444'); insert into alumnos (documento,nombre,domicilio) values('25666777','Torres Ramiro','Dinamarca 209'); select *from alumnos;

Segundo problema:
Un comercio que vende artculos de computacin registra los datos de sus artculos en una tabla con ese nombre. 1- Elimine "articulos", si existe: if object_id('articulos') is not null drop table articulos; 2- Cree la tabla, con la siguiente estructura: create table articulos( codigo integer identity, nombre varchar(20), descripcion varchar(30), precio float

); 3- Ingrese algunos registros: insert into articulos (nombre, descripcion, precio) values ('impresora','Epson Stylus C45',400.80); insert into articulos (nombre, descripcion, precio) values ('impresora','Epson Stylus C85',500); 4- Elimine todos los registros con "truncate table". 5- Ingrese algunos registros y mustrelos para ver que la secuencia de cdigos se reinicia: insert into articulos (nombre, descripcion, precio) values ('monitor','Samsung 14',800); insert into articulos (nombre, descripcion, precio) values ('teclado','ingles Biswal',100); insert into articulos (nombre, descripcion, precio) values ('teclado','espaol Biswal',90); select *from articulos; 6- Elimine todos los registros con "delete". 7- Ingrese algunos registros y mustrelos para ver que la secuencia de cdigos continua: insert into articulos (nombre, descripcion, precio) values ('monitor','Samsung 14',800); insert into articulos (nombre, descripcion, precio) values ('teclado','ingles Biswal',100); insert into articulos (nombre, descripcion, precio) values ('teclado','espaol Biswal',90); select *from articulos;

16 - Otros tipos de datos en SQL Server


Ya explicamos que al crear una tabla debemos elegir la estructura adecuada, esto es, definir los campos y sus tipos ms precisos, segn el caso. El tipo de dato especificado en la definicin de cada campo indica los valores permitidos para cada uno de ellos. Hasta ahora hemos visto 3 tipos de datos: varchar, integer y float. Hay ms tipos, incluso, subtipos. Los valores que podemos guardar son: 1. 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. SQL Server ofrece los siguientes tipos: char, nchar, varchar, nvarchar, text y ntext. 2. NUMEROS: Existe variedad de tipos numricos para representar enteros, decimales, monedas. Para almacenar valores enteros, por ejemplo, en campos que hacen referencia a cantidades, precios, etc., usamos el tipo integer (y sus subtipos: tinyint, smallint y bigint). Para almacenar valores con decimales exactos, utilizamos: numeric o decimal (son equivalentes). Para guardar valores decimales aproximados: float y real. Para almacenar valores monetarios: money y smallmoney. 3. FECHAS y HORAS: para guardar fechas y horas SQL Server dispone de 2 tipos: datetime y smalldatetime. Existen otros tipos de datos que analizaremos en secciones prximas. Entonces, 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". A continuacin analizaremos en detalle cada tipo de dato bsicos.

17 - Tipo de dato (texto)


Ya explicamos que al crear una tabla debemos elegir la estructura adecuada, esto es, definir los campos y sus tipos ms precisos, segn el caso. 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. Tenemos los siguientes tipos: 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.

3. 4.

5. 6.

Ocupa tantos bytes como se definen con el argumento "x". "char" viene de character, que significa caracter en ingls. text: guarda datos binarios de longitud variable, puede contener hasta 2000000000 caracteres. No admite argumento para especificar su longitud. 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. 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. 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. 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". 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) nchar(x) ntext

0 a 8K 0 a 8K 0 a 2GB 0 a 8K 0 a 8K 0 a 2GB

17 - Tipo de dato (texto)


Problema: Un comercio que tiene un stand en una feria registra en una tabla llamada "visitantes" algunos datos de las personas que visitan o compran en su stand para luego enviarle publicidad de sus productos. Eliminamos la tabla "visitantes", si existe:
if object_id('visitantes') is not null drop table visitantes;

Creamos con la siguiente estructura:


create table visitantes( nombre varchar(30), edad integer, sexo char(1), domicilio varchar(30), ciudad varchar(20), telefono varchar(11) );

Los campos "nombre", "domicilio" y "ciudad" almacenarn valores cuya longitud vara, por ello elegimos el tipo "varchar" y le damos a cada uno una longitud mxima estimando su tamao. El campo "sexo" se define de tipo "char", porque necesitamos solamente 1 caracter "f" o "m", que siempre ser fijo. El campo "telefono" tambin se define como varchar porque no todos los nmeros telefnicos tienen la misma longitud. Intentamos ingresar una cadena de mayor longitud que la definida:
insert into visitantes (nombre,edad,sexo,domicilio,ciudad,telefono) values ('Juan Juarez',32,'masc','Avellaneda 789','Cordoba','4234567');

aparece un mensaje de error y la sentencia no se ejecuta Ingresamos un nmero telefnico olvidando las comillas, es decir, como un valor numrico:
insert into visitantes (nombre,edad,sexo,domicilio,ciudad,telefono) values ('Marcela Morales',43,'f','Colon 456','Cordoba',4567890);

lo convierte a cadena, vemoslo:


select *from visitantes;

if object_id('visitantes') is not null drop table visitantes;

create table visitantes( nombre varchar(30), edad integer, sexo char(1), domicilio varchar(30), ciudad varchar(20), telefono varchar(11) );

insert into visitantes (nombre,edad,sexo,domicilio,ciudad,telefono) values ('Juan Juarez',32,'masc','Avellaneda 789','Cordoba','4234567');

insert into visitantes (nombre,edad,sexo,domicilio,ciudad,telefono) values ('Marcela Morales',43,'f','Colon 456','Cordoba',4567890);

select *from visitantes;

17 - Tipo de dato (texto)


Primer problema:
Una concesionaria de autos vende autos usados y almacena los datos de los autos en una tabla llamada "autos". 1- Elimine la tabla "autos" si existe: if object_id('autos') is not null drop table autos;

2- Cree la tabla eligiendo el tipo de dato adecuado para cada campo, estableciendo el campo "patente" como clave primaria: create table autos( patente char(6), marca varchar(20), modelo char(4), precio float, primary key (patente) ); Hemos definido el campo "patente" de tipo "char" y no "varchar" porque la cadena de caracteres siempre tendr la misma longitud (6 caracteres). Lo mismo sucede con el campo "modelo", en el cual almacenaremos el ao, necesitamos 4 caracteres fijos. 3- Ingrese los siguientes registros: insert into autos values('ACD123','Fiat 128','1970',15000); insert into autos values('ACG234','Renault 11','1990',40000); insert into autos values('BCD333','Peugeot 505','1990',80000); insert into autos values('GCD123','Renault Clio','1990',70000); insert into autos values('BCC333','Renault Megane','1998',95000); insert into autos values('BVF543','Fiat 128','1975',20000); 4- Seleccione todos los autos del ao 1990: select *from autos where modelo='1990';

Primer problema:
Una concesionaria de autos vende autos usados y almacena los datos de los autos en una tabla llamada "autos". 1- Elimine la tabla "autos" si existe: if object_id('autos') is not null drop table autos; 2- Cree la tabla eligiendo el tipo de dato adecuado para cada campo, estableciendo el campo "patente" como clave primaria: create table autos( patente char(6), marca varchar(20), modelo char(4), precio float, primary key (patente) ); Hemos definido el campo "patente" de tipo "char" y no "varchar" porque la cadena de caracteres

siempre tendr la misma longitud (6 caracteres). Lo mismo sucede con el campo "modelo", en el cual almacenaremos el ao, necesitamos 4 caracteres fijos. 3- Ingrese los siguientes registros: insert into autos values('ACD123','Fiat 128','1970',15000); insert into autos values('ACG234','Renault 11','1990',40000); insert into autos values('BCD333','Peugeot 505','1990',80000); insert into autos values('GCD123','Renault Clio','1990',70000); insert into autos values('BCC333','Renault Megane','1998',95000); insert into autos values('BVF543','Fiat 128','1975',20000); 4- Seleccione todos los autos del ao 1990: select *from autos where modelo='1990';

if object_id('autos') is not null drop table autos; create table autos( patente char(6), marca varchar(20), modelo char(4), precio float, primary key (patente) ); insert into autos values('ACD123','Fiat 128','1970',15000); insert into autos values('ACG234','Renault 11','1990',40000); insert into autos values('BCD333','Peugeot 505','1990',80000); insert into autos values('GCD123','Renault Clio','1990',70000); insert into autos values('BCC333','Renault Megane','1998',95000); insert into autos values('BVF543','Fiat 128','1975',20000); select *from autos where modelo='1990';

Segundo problema:
Una empresa almacena los datos de sus clientes en una tabla llamada "clientes". 1- Elimine la tabla "clientes" si existe: if object_id('clientes') is not null drop table clientes; 2- Crela eligiendo el tipo de dato ms adecuado para cada campo: create table clientes( documento char(8), apellido varchar(20), nombre varchar(20), domicilio varchar(30), telefono varchar (11) ); 3- Analice la definicin de los campos. Se utiliza char(8) para el documento porque siempre constar de 8 caracteres. Para el nmero telefnico se usar "varchar" y no un tipo numrico porque si bien es un nmero, con l no se realizarn operaciones matemticas. 4- Ingrese algunos registros: insert into clientes values('2233344','Perez','Juan','Sarmiento 980','4342345'); insert into clientes (documento,apellido,nombre,domicilio) values('2333344','Perez','Ana','Colon 234'); insert into clientes values('2433344','Garcia','Luis','Avellaneda 1454','4558877'); insert into clientes values('2533344','Juarez','Ana','Urquiza 444','4789900'); 5- Seleccione todos los clientes de apellido "Perez" (2 registros):

select *from clientes where apellido='Perez';

Ver solucin
if object_id('clientes') is not null drop table clientes; create table clientes( documento char(8), apellido varchar(20), nombre varchar(20), domicilio varchar(30), telefono varchar (11) ); insert into clientes values('2233344','Perez','Juan','Sarmiento 980','4342345'); insert into clientes (documento,apellido,nombre,domicilio) values('2333344','Perez','Ana','Colon 234'); insert into clientes values('2433344','Garcia','Luis','Avellaneda 1454','4558877'); insert into clientes values('2533344','Juarez','Ana','Urquiza 444','4789900'); select *from clientes where apellido='Perez';

18 - Tipo de dato (numrico)


Ya explicamos que al crear una tabla debemos elegir la estructura adecuada, esto es, definir los campos y sus tipos ms precisos, segn el caso. 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. - 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.67", 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+38. Guarda valores aproximados. 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".
Tipo Bytes de almacenamiento _______________________________________ int 4 smallint 2

tinyint bigint decimal float real money smallmoney

1 8 2 a 17 4 u 8 4 u 8 8 4

18 - Tipo de dato (numrico)


Problema: Trabajamos con la tabla "libros" de una librera. Eliminamos la tabla, si existe:
if object_id('libros') is not null drop table libros;

Creamos la tabla con la siguiente estructura:


create table libros( codigo smallint identity, titulo varchar(40) not null, autor varchar(30), editorial varchar(15), precio smallmoney, cantidad tinyint );

Note que definimos el campo "codigo" de tipo "smallint", esto es porque estimamos que no tendremos ms de 30000 libros. Si necesitramos un rango mayor podemos emplear "int". Como en el campo "precio" no almacenaremos valores mayores a 200000, definimos el campo de tipo "smallmoney". Tambin podemos definirlo de tipo "decimal(5,2)" porque el mximo precio no superar los 999.99. El tipo "float" no es el ms adecuado para representar precios porque no es exacto y muestra muchos decimales innecesarios. Como los valores para el campo "cantidad" no superarn los 255, definimos el campo de tipo "tinyint". Si estimamos que tendremos ms cantidad de libros podemos emplear "smallint" que tiene un rango mayor; no es adecuado usar int (cuyo rango llega hasta 4000 millones aprox.), porque ocuparamos ms espacio (4 bytes).

Analicemos la insercin de datos numricos. Intentemos ingresar un valor fuera del rango definido, una cantidad que supera el rango del tipo "tinyint", el valor 260:
insert into libros (titulo,autor,editorial,precio,cantidad) values('El aleph','Borges','Emece',25.60,260);

aparece un mensaje de error y la insercin no se ejecuta. Intentamos ingresar un precio que supera el rango del tipo "smallmoney", el valor 250000:
insert into libros (titulo,autor,editorial,precio,cantidad) values('El aleph','Borges','Emece',250000,100);

aparece un mensaje de error y la instruccin no se ejecuta. Intentamos ingresar una cadena que SQL Server no pueda convertir a valor numrico en el campo "precio" (error):
insert into libros (titulo,autor,editorial,precio,cantidad) values('Uno','Richard Bach','Planeta','a50.30',100);

Ingresamos una cadena en el campo "cantidad":


insert into libros (titulo,autor,editorial,precio,cantidad) values('Uno','Richard Bach','Planeta',50.30,'100');

lo convierte a valor numrico.


if object_id('libros') is not null drop table libros;

create table libros( codigo smallint identity, titulo varchar(40) not null, autor varchar(30), editorial varchar(15), precio smallmoney, cantidad tinyint

);

insert into libros (titulo,autor,editorial,precio,cantidad) values('El aleph','Borges','Emece',25.60,260);

insert into libros (titulo,autor,editorial,precio,cantidad) values('El aleph','Borges','Emece',250000,100);

insert into libros (titulo,autor,editorial,precio,cantidad) values('Uno','Richard Bach','Planeta','a50.30',100);

insert into libros (titulo,autor,editorial,precio,cantidad) values('Uno','Richard Bach','Planeta',50.30,'100');

select * from libros;

18 - Tipo de dato (numrico)


Primer problema:
Un banco tiene registrados las cuentas corrientes de sus clientes en una tabla llamada "cuentas". La tabla contiene estos datos: Nmero de Cuenta Documento Nombre Saldo ______________________________________________________________ 1234 25666777 Pedro Perez 500000.60 2234 27888999 Juan Lopez -250000 3344 27888999 Juan Lopez 4000.50 3346 32111222 Susana Molina 1000 1- Elimine la tabla "cuentas" si existe: if object_id('cuentas') is not null drop table cuentas; 2- Cree la tabla eligiendo el tipo de dato adecuado para almacenar los datos descriptos arriba:

- Nmero de cuenta: entero, no nulo, no puede haber valores repetidos, clave primaria; - Documento del propietario de la cuenta: cadena de caracteres de 8 de longitud (siempre 8), no nulo; - Nombre del propietario de la cuenta: cadena de caracteres de 30 de longitud, - Saldo de la cuenta: valores altos con decimales. 3- Ingrese los siguientes registros: insert into cuentas(numero,documento,nombre,saldo) values('1234','25666777','Pedro Perez',500000.60); insert into cuentas(numero,documento,nombre,saldo) values('2234','27888999','Juan Lopez',-250000); insert into cuentas(numero,documento,nombre,saldo) values('3344','27888999','Juan Lopez',4000.50); insert into cuentas(numero,documento,nombre,saldo) values('3346','32111222','Susana Molina',1000); Note que hay dos cuentas, con distinto nmero de cuenta, de la misma persona. 4- Seleccione todos los registros cuyo saldo sea mayor a "4000" (2 registros) 5- Muestre el nmero de cuenta y saldo de todas las cuentas cuyo propietario sea "Juan Lopez" (2 registros) 6- Muestre las cuentas con saldo negativo (1 registro) 7- Muestre todas las cuentas cuyo nmero es igual o mayor a "3000" (2 registros): select *from cuentas where numero>=3000; if object_id('cuentas') is not null drop table cuentas; create table cuentas( numero int not null, documento char(8), nombre varchar(30), saldo money, primary key (numero) ); insert into cuentas(numero,documento,nombre,saldo) values('1234','25666777','Pedro Perez',500000.60); insert into cuentas(numero,documento,nombre,saldo) values('2234','27888999','Juan Lopez',-250000); insert into cuentas(numero,documento,nombre,saldo) values('3344','27888999','Juan Lopez',4000.50); insert into cuentas(numero,documento,nombre,saldo) values('3346','32111222','Susana Molina',1000); select *from cuentas where saldo<4000; select numero,saldo from cuentas

where nombre='Juan Lopez'; select *from cuentas where saldo<0; select *from cuentas where numero>=3000;

Segundo problema:
Una empresa almacena los datos de sus empleados en una tabla "empleados" que guarda los siguientes datos: nombre, documento, sexo, domicilio, sueldobasico. 1- Elimine la tabla, si existe: if object_id('empleados') is not null drop table empleados; 2- Cree la tabla eligiendo el tipo de dato adecuado para cada campo: create table empleados( nombre varchar(30), documento char(8), sexo char(1), domicilio varchar(30), sueldobasico decimal(7,2),--mximo estimado 99999.99 cantidadhijos tinyint--no superar los 255 ); 3- Ingrese algunos registros: insert into empleados (nombre,documento,sexo,domicilio,sueldobasico,cantidadhijos) values ('Juan Perez','22333444','m','Sarmiento 123',500,2); insert into empleados (nombre,documento,sexo,domicilio,sueldobasico,cantidadhijos) values ('Ana Acosta','24555666','f','Colon 134',850,0); insert into empleados (nombre,documento,sexo,domicilio,sueldobasico,cantidadhijos) values ('Bartolome Barrios','27888999','m','Urquiza 479',10000.80,4); 4- Ingrese un valor de "sueldobasico" con ms decimales que los definidos (redondea los decimales al valor ms cercano 800.89): insert into empleados (nombre,documento,sexo,domicilio,sueldobasico,cantidadhijos) values ('Susana Molina','29000555','f','Salta 876',800.888,3); 5- Intente ingresar un sueldo que supere los 7 dgitos (no lo permite) 6- Muestre todos los empleados cuyo sueldo no supere los 900 pesos (1 registro): 7- Seleccione los nombres de los empleados que tengan hijos (3 registros):

19 - Tipo de dato (fecha y hora)

Ya explicamos que al crear una tabla debemos elegir la estructura adecuada, esto es, definir los campos y sus tipos ms precisos, segn el caso. 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. 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: -myd: -dmy: -dym: -ydm: -ydm: 4/15/96 (mes y da con 1 2 dgitos y ao con 2 4 dgitos), 4/96/15, 15/4/1996 15/96/4, 96/15/4, 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. 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 smalldatetime 4

19 - Tipo de dato (fecha y hora)


Problema: Una empresa almacena los datos de sus empleados en una tabla "empleados". Eliminamos la tabla, si existe:
if object_id('empleados') is not null drop table empleados;

Creamos la tabla eligiendo el tipo de dato adecuado para cada campo:


create table empleados( nombre varchar(20), documento char(8), fechaingreso datetime );

Seteamos el formato de la fecha para que guarde da, mes y ao:


set dateformat dmy;

Ingresamos algunos registros:


insert insert insert insert into into into into empleados empleados empleados empleados values('Ana Gomez','22222222','12-01-1980'); values('Bernardo Huerta','23333333','15-03-81'); values('Carla Juarez','24444444','20/05/1983'); values('Daniel Lopez','25555555','2.5.1990');

El segundo registro ingresado tiene 2 dgitos correspondientes al ao; en el tercero empleamos la barra ('/') como separador y en el cuarto empleamos como separador el punto ('.') y colocamos un slo dgito en la part del da y el mes. Recuperamos los registros:
select *from empleados;

Note que el formato de visualizacin es "y-m-d". Mostramos los datos de los empleados cuya fecha de ingreso es anterior a '01-01-1985':
select *from empleados where fechaingreso<'01-01-1985';

Actualizamos el nombre a "Maria Carla Juarez' del empleado cuya fecha de ingreso es igual a '20/05/1983':
update empleados set nombre='Maria Carla Juarez' where fechaingreso='20.5.83';

Veamos si se actualiz:
select *from empleados;

Borramos los empleados cuya fecha de ingreso es distinta a '20.5.83':


delete from empleados where fechaingreso<>'20/05/1983';

Veamos si se eliminaron:
select *from empleados;

if object_id('empleados') is not null drop table empleados;

create table empleados( nombre varchar(20), documento char(8), fechaingreso datetime );

set dateformat dmy;

insert into empleados values('Ana Gomez','22222222','12-01-1980'); insert into empleados values('Bernardo Huerta','23333333','15-03-81'); insert into empleados values('Carla Juarez','24444444','20/05/1983'); insert into empleados values('Daniel Lopez','25555555','2.5.1990');

select *from empleados;

select *from empleados where fechaingreso<'01-01-1985';

update empleados set nombre='Maria Carla Juarez' where fechaingreso='20.5.83';

select *from empleados;

delete from empleados where fechaingreso<>'20/05/1983';

select *from empleados;

Primer problema:
Una facultad almacena los datos de sus alumnos en una tabla denominada "alumnos". 1- Elimine la tabla, si existe: if object_id('alumnos') is not null drop table alumnos; 2- Cree la tabla eligiendo el tipo de dato adecuado para cada campo: create table alumnos( apellido varchar(30), nombre varchar(30), documento char(8), domicilio varchar(30), fechaingreso datetime, fechanacimiento datetime ); 3- Setee el formato para entrada de datos de tipo fecha para que acepte valores "da-mes-ao": set dateformat 'dmy'; 4- Ingrese un alumno empleando distintos separadores para las fechas: insert into alumnos values('Gonzalez','Ana','22222222','Colon 123','1008-1990','15/02/1972'); 5- Ingrese otro alumno empleando solamente un dgito para da y mes y 2 para el ao: insert into alumnos values('Juarez','Bernardo','25555555','Sucre 456','03-03-1991','15/02/1972'); 6- Ingrese un alumnos empleando 2 dgitos para el ao de la fecha de ingreso y "null" en "fechanacimiento": insert into alumnos values('Perez','Laura','26666666','Bulnes 345','0303-91',null); 7- Intente ingresar un alumno con fecha de ingreso correspondiente a "15 de marzo de 1990" pero en orden incorrecto "03-15-90": insert into alumnos values('Lopez','Carlos','27777777','Sarmiento 1254','03-15-1990',null);

aparece un mensaje de error porque lo lee con el formato da, mes y ao y no reconoce el mes 15. 8- Muestre todos los alumnos que ingresaron antes del '1-1-91'. 1 registro. 9- Muestre todos los alumnos que tienen "null" en "fechanacimiento": select *from alumnos where fechanacimiento is null; 1 registro. 10- Intente ingresar una fecha de ingreso omitiendo los separadores: insert into alumnos values('Rosas','Romina','28888888','Avellaneda 487','03151990',null); No lo acepta. 11- Setee el formato de entrada de fechas para que acepte valores "mesdia-ao". 12- Ingrese el registro del punto 7. if object_id('alumnos') is not null drop table alumnos; create table alumnos( apellido varchar(30), nombre varchar(30), documento char(8), domicilio varchar(30), fechaingreso datetime, fechanacimiento datetime ); set dateformat 'dmy'; insert into alumnos values('Gonzalez','Ana','22222222','Colon 123','1008-1990','15/02/1972'); insert into alumnos values('Juarez','Bernardo','25555555','Sucre 456','03-03-1991','15/02/1972'); insert into alumnos values('Perez','Laura','26666666','Bulnes 345','0303-91',null); insert into alumnos values('Lopez','Carlos','27777777','Sarmiento 1254','03-15-1990',null); select *from alumnos where fechaingreso<'1-1-91'; select *from alumnos where fechanacimiento is null; insert into alumnos values('Rosas','Romina','28888888','Avellaneda 487','03151990',null); set dateformat 'mdy'; insert into alumnos values('Lopez','Carlos','27777777','Sarmiento 1254','03-15-1990',null);

20 - Ingresar algunos campos (insert into)


Hemos aprendido a ingresar registros listando todos los campos y colocando valores para todos y cada uno de ellos luego de "values". Si ingresamos valores para todos los campos, podemos omitir la lista de nombres de los campos. Por ejemplo, si tenemos creada la tabla "libros" con los campos "titulo", "autor" y "editorial", podemos ingresar un registro de la siguiente manera:
insert into libros values ('Uno','Richard Bach','Planeta');

Tambin es posible ingresar valores para algunos campos. Ingresamos valores solamente para los campos "titulo" y "autor":
insert into libros (titulo, autor) values ('El aleph','Borges');

SQL Server almacenar el valor "null" en el campo "editorial", para el cual no hemos explicitado un valor. Al ingresar registros debemos tener en cuenta: - la lista de campos debe coincidir en cantidad y tipo de valores con la lista de valores luego de "values". Si se listan ms (o menos) campos que los valores ingresados, aparece un mensaje de error y la sentencia no se ejecuta. - si ingresamos valores para todos los campos podemos obviar la lista de campos. - podemos omitir valores para los campos que NO hayan sido declarados "not null", es decir, que permitan valores nulos (se guardar "null"); si omitimos el valor para un campo "not null", la sentencia no se ejecuta. - se DEBE omitir el valor para el campo"identity". Salvo que identity_insert este en on. - se pueden omitir valores para campos declarados "not null" siempre que tengan definido un valor por defecto con la clusula "default" (tema que veremos a continuacin).

20 - Ingresar algunos campos (insert into)


Problema: Trabajamos con la tabla "libros" que almacena los datos de los libros de una librera. Eliminamos la tabla, si existe:

if object_id('libros') is not null drop table libros;

Creamos la tabla:
create table libros( codigo int identity, titulo varchar(40) not null, autor varchar(30), editorial varchar(15) );

Si ingresamos valores para todos los campos, podemos omitir la lista de campos:
insert into libros values ('Uno','Richard Bach','Planeta');

Podemos ingresar valores para algunos de los campos:


insert into libros (titulo, autor) values ('El aleph','Borges');

No podemos omitir el valor para un campo declarado "not null", como el campo "titulo":
insert into libros (autor,editorial) values ('Lewis Carroll','Planeta');

aparece un mensaje y la insercin no se realiza. Veamos cmo SQL Server almacen los registros:
select *from libros;

if object_id('libros') is not null drop table libros;

create table libros( codigo int identity, titulo varchar(40) not null, autor varchar(30), editorial varchar(15) );

insert into libros values ('Uno','Richard Bach','Planeta');

insert into libros (titulo, autor) values ('El aleph','Borges');

insert into libros (autor,editorial) values ('Lewis Carroll','Planeta');

select *from libros;

20 - Ingresar algunos campos (insert into)


Primer problema:
Un banco tiene registrados las cuentas corrientes de sus clientes en una tabla llamada "cuentas". 1- Elimine la tabla "cuentas" si existe: if object_id('cuentas') is not null drop table cuentas; 2- Cree la tabla : create table cuentas( numero int identity, documento char(8) not null, nombre varchar(30), saldo money ); 3- Ingrese un registro con valores para todos sus campos, inclusive el campo identity, omitiendo la lista de campos (error, no se debe ingresar para el campo identity): insert into cuentas values (1,'25666777','Juan Perez',2500.50); 4- Ingrese un registro con valores para todos sus campos omitiendo la lista de campos (excepto el campo "identity"): insert into cuentas values ('25666777','Juan Perez',2500.50); 5- Ingrese un registro omitiendo algn campo que admitan valores nulos.

6- Intente ingresar un registro con valor para el campo "numero" (error): insert into cuentas (numero,documento,nombre,saldo) values (5,'28999777','Luis Lopez',34000); 7- Intente ingresar un registro listando 3 campos y colocando 4 valores (error) 8- Intente ingresar un registro sin valor para el campo "documento" (error) 9- Vea los registros ingresados: select *from libros;

Ver solucin

if object_id('cuentas') is not null drop table cuentas; create table cuentas( numero int identity, documento char(8) not null, nombre varchar(30), saldo money ); insert into cuentas values (1,'25666777','Juan Perez',2500.50); insert into cuentas values ('25666777','Juan Perez',2500.50); insert into cuentas (documento,saldo) values ('28999777',-5500); insert into cuentas (numero,documento,nombre,saldo) values (5,'28999777','Luis Lopez',34000); insert into cuentas (numero,documento,nombre) values (3344,'28999777','Luis Lopez',34000);

insert into cuentas (nombre, saldo) values ('Luis Lopez',34000); select *from libros;

21 - Valores por defecto (default)


Hemos visto que si al insertar registros no se especifica un valor para un campo que admite valores nulos, se ingresa automaticamente "null" y si el campo est declarado "identity", se inserta el siguiente de la secuencia. A estos valores se les denomina valores por defecto o predeterminados. Un valor por defecto se inserta cuando no est presente al ingresar un registro y en algunos casos en que el dato ingresado es invlido. Para campos de cualquier tipo no declarados "not null", es decir, que admiten 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 clusula "default". Para todos los tipos, excepto los declarados "identity", se pueden explicitar valores por defecto con la clusula "default". Podemos establecer valores por defecto para los campos cuando creamos la tabla. Para ello utilizamos "default" al definir el campo. Por ejemplo, queremos que el valor por defecto del campo "autor" de la tabla "libros" sea "Desconocido" y el valor por defecto del campo "cantidad" sea "0":
create table libros( codigo int identity, titulo varchar(40), autor varchar(30) not null default 'Desconocido', editorial varchar(20), precio decimal(5,2), cantidad tinyint default 0 );

Si al ingresar un nuevo registro omitimos los valores para el campo "autor" y "cantidad", Sql Server insertar los valores por defecto; el siguiente valor de la secuencia en "codigo", en "autor" colocar "Desconocido" y en cantidad "0". Entonces, si al definir el campo explicitamos un valor mediante la clusula "default", se ser el valor por defecto. Ahora, al visualizar la estructura de la tabla con "sp_columns" podemos entender lo que informa 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 sentencias "insert", por ejemplo:
insert into libros (titulo,autor,precio,cantidad) values ('El gato con botas',default,default,100);

Si todos los campos de una tabla tienen valores predeterminados (ya sea por ser "identity", permitir valores nulos o tener un valor por defecto), se puede ingresar un registro de la siguiente manera:
insert into libros default values;

La sentencia anterior almacenar un registro con los valores predetermiandos para cada uno de sus campos. 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 "1900-01-01" 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.

21 - Valores por defecto (default)


Problema: Trabajamos con la tabla "libros" de una librera. Eliminamos la tabla, si existe:

if object_id('libros') is not null drop table libros;

Creamos la tabla definiendo un valor por defecto para el campo "autor" y otro para el campo "cantidad":
create table libros( codigo int identity, titulo varchar(40), autor varchar(30) not null default 'Desconocido', editorial varchar(20), precio decimal(5,2), cantidad tinyint default 0 );

Ingresamos un registro omitiendo los valores para el campo "autor" y "cantidad":


insert into libros (titulo,editorial,precio) values('Java en 10 minutos','Paidos',50.40);

SQL Server ingresar el registro con el siguiente valor de la secuencia en "codigo", con el ttulo, editorial y precio ingresados, en "autor" colocar "Desconocido" y en cantidad "0":
select *from libros;

Si ingresamos un registro sin valor para el campo "precio", que admite valores nulos, se ingresar "null" en ese campo:
insert into libros (titulo,editorial) values('Aprenda PHP','Siglo XXI'); select *from libros;

Visualicemos la estructura de la tabla:


sp_columns libros;

La columna "COLUMN_DEF", muestra el valor por defecto de cada campo. Podemos emplear "default" para dar el valor por defecto a algunos campos:
insert into libros (titulo,autor,precio,cantidad) values ('El gato con botas',default,default,100); select *from libros;

Como todos los campos de "libros" tienen valores predeterminados, podemos tipear:
insert into libros default values; select *from libros;

La sentencia anterior almacenar un registro con los valores predetermiandos para cada uno de sus campos. Que un campo tenga valor por defecto no significa que no admita valores nulos, puede o no admitirlos. Podemos ingresar el valor "null" en el campo "cantidad":
insert into libros (titulo,autor,cantidad) values ('Alicia en el pais de las maravillas','Lewis Carroll',null);

if object_id('libros') is not null drop table libros;

create table libros( codigo int identity, titulo varchar(40), autor varchar(30) not null default 'Desconocido', editorial varchar(20), precio decimal(5,2), cantidad tinyint default 0 );

insert into libros (titulo,editorial,precio) values('Java en 10 minutos','Paidos',50.40);

select *from libros;

insert into libros (titulo,editorial) values('Aprenda PHP','Siglo XXI'); select *from libros;

sp_columns libros;

insert into libros (titulo,autor,precio,cantidad) values ('El gato con botas',default,default,100); select *from libros;

insert into libros default values; select *from libros;

insert into libros (titulo,autor,cantidad) values ('Alicia en el pais de las maravillas','Lewis Carroll',null);

21 - Valores por defecto (default)


Primer problema:
Un comercio que tiene un stand en una feria registra en una tabla llamada "visitantes" algunos datos de las personas que visitan o compran en su stand para luego enviarle publicidad de sus productos. 1- Elimine la tabla "visitantes", si existe: if object_id('visitantes') is not null drop table visitantes; 2- Cree la tabla con la siguiente estructura: create table visitantes( nombre varchar(30), edad tinyint, sexo char(1) default 'f', domicilio varchar(30), ciudad varchar(20) default 'Cordoba', telefono varchar(11), mail varchar(30) default 'no tiene', montocompra decimal (6,2) ); 4- Vea la informacin de las columnas "COLUMN_DEF" y "IS_NULLABLE": sp_columns visitantes;

5- Ingrese algunos registros sin especificar valores para algunos campos para ver cmo opera la clusula "default": insert into visitantes (nombre, domicilio, montocompra) values ('Susana Molina','Colon 123',59.80); insert into visitantes (nombre, edad, ciudad, mail) values ('Marcos Torres',29,'Carlos Paz','marcostorres@hotmail.com'); select *from visitantes; 6- Use la palabra "default" para ingresar valores en un insert. 7- Ingrese un registro con "default values".

Ver solucin
if object_id('visitantes') is not null drop table visitantes; create table visitantes( nombre varchar(30), edad tinyint, sexo char(1) default 'f', domicilio varchar(30), ciudad varchar(20) default 'Cordoba', telefono varchar(11), mail varchar(30) default 'no tiene', montocompra decimal (6,2) ); sp_columns visitantes; insert into visitantes (nombre, domicilio, montocompra) values ('Susana Molina','Colon 123',59.80); insert into visitantes (nombre, edad, ciudad, mail) values ('Marcos Torres',29,'Carlos Paz','marcostorres@hotmail.com'); select *from visitantes; insert into visitantes values ('Marcelo Morales',38,default,default,default,'4255232','marcelomorales@hotmail.com ',default); insert into visitantes default values; select *from visitantes;

22 - Columnas calculadas (operadores aritmticos y de concatenacin)


Aprendimos que los operadores son smbolos que permiten realizar distintos tipos de operaciones.

Dijimos que SQL Server tiene 4 tipos de operadores: 1) relacionales o de comparacin (los vimos), 2) lgicos (lo veremos ms adelante, 3) aritmticos y 4) de concatenacin. Los operadores aritmticos permiten realizar clculos con valores numricos. Son: multiplicacin (*), divisin (/) y mdulo (%) (el resto de dividir nmeros enteros), 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;

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.

22 - Columnas calculadas (operadores aritmticos y de concatenacin)


Problema: Trabajamos con la tabla "libros" de una librera. Eliminamos la tabla si existe:
if object_id ('libros') is not null drop table libros;

Creamos la tabla:
create table libros( codigo int identity, titulo varchar(40) not null, autor varchar(20) default 'Desconocido', editorial varchar(20), precio decimal(6,2), cantidad tinyint default 0, primary key (codigo) );

Ingresamos algunos registros:


insert into libros (titulo,autor,editorial,precio) values('El aleph','Borges','Emece',25); insert into libros values('Java en 10 minutos','Mario Molina','Siglo XXI',50.40,100); insert into libros (titulo,autor,editorial,precio,cantidad) values('Alicia en el pais de las maravillas','Lewis Carroll','Emece',15,50);

Queremos saber el monto total en dinero de cada libro:


select titulo, precio,cantidad, precio*cantidad from libros;

Queremos saber el precio de cada libro con un 10% de descuento:


select titulo,precio, precio-(precio*0.1) from libros;

Actualizamos los precios con un 10% de descuento y vemos el resultado:

update libros set precio=precio-(precio*0.1); select *from libros;

Queremos una columna con el ttulo, el autor y la editorial de cada libro:


select titulo+'-'+autor+'-'+editorial from libros;

if object_id ('libros') is not null drop table libros;

create table libros( codigo int identity, titulo varchar(40) not null, autor varchar(20) default 'Desconocido', editorial varchar(20), precio decimal(6,2), cantidad tinyint default 0, primary key (codigo) );

insert into libros (titulo,autor,editorial,precio) values('El aleph','Borges','Emece',25); insert into libros values('Java en 10 minutos','Mario Molina','Siglo XXI',50.40,100); insert into libros (titulo,autor,editorial,precio,cantidad) values('Alicia en el pais de las maravillas','Lewis Carroll','Emece',15,50);

select titulo, precio,cantidad,

precio*cantidad from libros;

select titulo,precio, precio-(precio*0.1) from libros;

update libros set precio=precio-(precio*0.1); select *from libros;

select titulo+'-'+autor+'-'+editorial from libros; Primer problema:


Un comercio que vende artculos de computacin registra los datos de sus artculos en una tabla con ese nombre. 1- Elimine la tabla si existe: if object_id ('articulos') is not null drop table articulos; 2- Cree la tabla: create table articulos( codigo int identity, nombre varchar(20), descripcion varchar(30), precio smallmoney, cantidad tinyint default 0, primary key (codigo) ); 3- Ingrese algunos registros: insert into articulos (nombre, descripcion, precio,cantidad) values ('impresora','Epson Stylus C45',400.80,20); insert into articulos (nombre, descripcion, precio) values ('impresora','Epson Stylus C85',500); insert into articulos (nombre, descripcion, precio) values ('monitor','Samsung 14',800); insert into articulos (nombre, descripcion, precio,cantidad) values ('teclado','ingles Biswal',100,50);

4- El comercio quiere aumentar los precios de todos sus artculos en un 15%. Actualice todos los precios empleando operadores aritmticos. 5- Vea el resultado: select *from articulos; 6- Muestre todos los artculos, concatenando el nombre y la descripcin de cada uno de ellos separados por coma. 7- Reste a la cantidad de todos los teclados, el valor 5, empleando el operador aritmtico menos ("-")

Ver solucin
if object_id ('articulos') is not null drop table articulos; create table articulos( codigo int identity, nombre varchar(20), descripcion varchar(30), precio smallmoney, cantidad tinyint default 0, primary key (codigo) ); insert into articulos (nombre, descripcion, precio,cantidad) values ('impresora','Epson Stylus C45',400.80,20); insert into articulos (nombre, descripcion, precio) values ('impresora','Epson Stylus C85',500); insert into articulos (nombre, descripcion, precio) values ('monitor','Samsung 14',800); insert into articulos (nombre, descripcion, precio,cantidad) values ('teclado','ingles Biswal',100,50); update articulos set precio=precio+(precio*0.15); select *from articulos; select nombre+','+descripcion from articulos; update articulos set cantidad=cantidad-5 where nombre='teclado'; select *from articulos;

23 - 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 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. 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.

23 - Alias
Problema: Trabajamos con nuestra tabla "agenda". Eliminamos la tabla si existe:
if object_id('agenda') is not null drop table agenda;

Creamos la tabla:
create table agenda( nombre varchar(30), domicilio varchar(30), telefono varchar(11) );

Ingresamos algunos registros:


insert into agenda

values('Juan Perez','Avellaneda 908','4252525'); insert into agenda values('Marta Lopez','Sucre 34','4556688'); insert into agenda values('Carlos Garcia','Sarmiento 1258',null);

Mostramos la informacin con el encabezado "NombreYApellido" para el campo "nombre":


select nombre as NombreYApellido, domicilio,telefono from agenda;

Mostramos la informacin con el encabezado "Nombre y apellido" para el campo "nombre", necesitamos emplear comillas:
select nombre as 'Nombre y apellido', domicilio,telefono from agenda;

La palabra clave "as" es opcional, podemos obviarla:


select nombre 'Nombre y apellido', domicilio,telefono from agenda;

if object_id('agenda') is not null drop table agenda;

create table agenda( nombre varchar(30), domicilio varchar(30), telefono varchar(11) );

insert into agenda values('Juan Perez','Avellaneda 908','4252525'); insert into agenda

values('Marta Lopez','Sucre 34','4556688'); insert into agenda values('Carlos Garcia','Sarmiento 1258',null);

select nombre as NombreYApellido, domicilio,telefono from agenda;

select nombre as 'Nombre y apellido', domicilio,telefono from agenda;

select nombre 'Nombre y apellido', domicilio,telefono from agenda;

23 - Alias
Primer problema:
Trabaje con la tabla "libros" de una librera. 1- Elimine la tabla si existe: if object_id ('libros') is not null drop table libros; 2- Cree la tabla: create table libros( codigo int identity, titulo varchar(40) not null, autor varchar(20) default 'Desconocido', editorial varchar(20), precio decimal(6,2), cantidad tinyint default 0, primary key (codigo)

); 3- Ingrese algunos registros: insert into libros (titulo,autor,editorial,precio) values('El aleph','Borges','Emece',25); insert into libros values('Java en 10 minutos','Mario Molina','Siglo XXI',50.40,100); insert into libros (titulo,autor,editorial,precio,cantidad) values('Alicia en el pais de las maravillas','Lewis Carroll','Emece',15,50); 4- Muestre todos los campos de los libros y un campo extra, con el encabezado "monto total" en la que calcule el monto total en dinero de cada libro (precio por cantidad) 5- Muestre el ttulo, autor y precio de todos los libros de editorial "Emece" y agregue dos columnas extra en las cuales muestre el descuento de cada libro, con el encabezado "descuento" y el precio con un 10% de descuento con el encabezado "precio final". 6- Muestre una columna con el ttulo y el autor concatenados con el encabezado "Ttulo y autor"

Ver solucin

24 - Funciones
Una funcin es un conjunto de sentencias que operan como una unidad lgica. Una funcin tiene un nombre, retorna un parmetro de salida y opcionalmente acepta parmetros de entrada. Las funciones de SQL Server no pueden ser modificadas, las funciones definidas por el usuario si. SQL Server ofrece varios tipos de funciones para realizar distintas operaciones. Se pueden clasificar de la siguiente manera: 1) de agregado: realizan operaciones que combinan varios valores y retornan un nico valor. Son "count", "sum", "min" y "max". 2) escalares: toman un solo valor y retornan un nico valor. Pueden agruparse de la siguiente manera: - de configuracin: retornan informacin referida a la configuracin. Ejemplo:
select @@version;

retorna la fecha, versin y tipo de procesador de SQL Server. - de cursores: retornan informacin sobre el estado de un cursor.

- de fecha y hora: operan con valores "datetime" y "smalldatetime". Reciben un parmetro de tipo fecha y hora y retornan un valor de cadena, numrico o de fecha y hora. - matemticas: realizan operaciones numricas, geomtricas y trigonomtricas. - de metadatos: informan sobre las bases de datos y los objetos. - de seguridad: devuelven informacin referente a usuarios y funciones. - de cadena: operan con valores "char", "varchar", "nchar", "nvarchar", "binary" y "varbinary" y devuelven un valor de cadena o numrico. - del sistema: informan sobre opciones, objetos y configuraciones del sistema. Ejemplo:
select user_name();

- estadsticas del sistema: retornan informacin referente al rendimiento del sistema. - texto e imagen: realizan operaciones con valor de entrada de tipo text o image y retornan informacin referente al mismo. 3) de conjuntos de filas: retornan conjuntos de registros. Se pueden emplear las funciones del sistema en cualquier lugar en el que se permita una expresin en una sentencia "select". Estudiaremos algunas de ellas.

25 - 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 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'; 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');

devuelve 4.

- 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:
select lower('HOLA ESTUDIAnte');

retorna "hola estudiante". -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:

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.
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. - 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.

26 - Funciones matemticas
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. -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.
select 10%2;

retorna 0. -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.


select round(123.456,-1);

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.

26 - Funciones matemticas

Problema: Trabajamos con la tabla "libros" de una librera. Eliminamos la tabla si existe:
if object_id ('libros') is not null drop table libros;

Creamos la tabla:
create table libros( codigo int identity, titulo varchar(40) not null, autor varchar(20) default 'Desconocido', editorial varchar(20), precio decimal(6,2), primary key (codigo) );

Ingresamos algunos registros:


insert into libros (titulo,autor,editorial,precio) values('El aleph','Borges','Emece',25.33); insert into libros values('Java en 10 minutos','Mario Molina','Siglo XXI',50.65); insert into libros (titulo,autor,editorial,precio) values('Alicia en el pais de las maravillas','Lewis Carroll','Emece',19.95);

Vamos a mostrar los precios de los libros redondeando el valor hacia abajo y hacia arriba:
select titulo,autor,precio, floor(precio) as abajo, ceiling(precio) as arriba from libros;

if object_id ('libros') is not null drop table libros;

create table libros( codigo int identity, titulo varchar(40) not null, autor varchar(20) default 'Desconocido', editorial varchar(20),

precio decimal(6,2), primary key (codigo) );

insert into libros (titulo,autor,editorial,precio) values('El aleph','Borges','Emece',25.33); insert into libros values('Java en 10 minutos','Mario Molina','Siglo XXI',50.65); insert into libros (titulo,autor,editorial,precio) values('Alicia en el pais de las maravillas','Lewis Carroll','Emece',19.95);

select titulo,autor,precio, floor(precio) as abajo, ceiling(precio) as arriba from libros;

27 - Funciones para el uso de fechas y horas


Microsoft SQL Server ofrece algunas funciones para trabajar con fechas y horas. Estas son algunas: - 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; - 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.


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

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 fecha2fecha1. 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());

- 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.

27 - Funciones para el uso de fechas y horas


Problema: Trabajamos con la tabla "libros" de una librera. Eliminamos la tabla si existe:
if object_id ('libros') is not null drop table libros;

Creamos la tabla:
create table libros( titulo varchar(40) not null, autor varchar(20) default 'Desconocido', editorial varchar(20),

edicion datetime, precio decimal(6,2) );

Ingresamos algunos registros:


insert into libros values('El aleph','Borges','Emece','1980/10/10',25.33); insert into libros values('Java en 10 minutos','Mario Molina','Siglo XXI','2000/05/05',50.65); insert into libros values('Alicia en el pais de las maravillas','Lewis Carroll','Emece','2000/08/09',19.95); insert into libros values('Aprenda PHP','Mario Molina','Siglo XXI','2000/02/04',45);

Mostramos el ttulo del libro y el ao de edicin:


select titulo, datepart (year,edicion) from libros;

Mostramos el ttulo del libro y el nombre del mes de edicin:


select titulo, datename (month,edicion) from libros;

Mostramos el ttulo del libro y los aos que tienen de editados:


select titulo, datediff(year,edicion,getdate()) from libros;

Muestre los ttulos de los libros que se editaron el da 9, de cualquier mes de cualquier ao:
select titulo from libros where datepart(day,edicion)=9;

if object_id ('libros') is not null drop table libros;

create table libros( titulo varchar(40) not null, autor varchar(20) default 'Desconocido', editorial varchar(20),

edicion datetime, precio decimal(6,2) );

insert into libros values('El aleph','Borges','Emece','1980/10/10',25.33); insert into libros values('Java en 10 minutos','Mario Molina','Siglo XXI','2000/05/05',50.65); insert into libros values('Alicia en el pais de las maravillas','Lewis Carroll','Emece','2000/08/09',19.95); insert into libros values('Aprenda PHP','Mario Molina','Siglo XXI','2000/02/04',45);

select titulo, datepart (year,edicion) from libros;

select titulo, datename (month,edicion) from libros;

select titulo, datediff(year,edicion,getdate()) from libros;

select titulo from libros where datepart(day,edicion)=9;

27 - Funciones para el uso de fechas y horas


Primer problema:
Una empresa almacena los datos de sus empleados en una tabla denominada "empleados". 1- Elimine la tabla si existe: if object_id ('empleados') is not null drop table empleados; 2- Cree la tabla:

create table empleados( nombre varchar(30) not null, apellido varchar(20) not null, documento char(8), fechanacimiento datetime, fechaingreso datetime, sueldo decimal(6,2), primary key(documento) ); 3- Ingrese algunos registros: insert into empleados values('Ana','Acosta','22222222','1970/10/10','1995/05/05',228.50); insert into empleados values('Carlos','Caseres','25555555','1978/02/06','1998/05/05',309); insert into empleados values('Francisco','Garcia','26666666','1978/10/15','1998/10/02',250.68); insert into empleados values('Gabriela','Garcia','30000000','1985/10/25','2000/12/22',300.25); insert into empleados values('Luis','Lopez','31111111','1987/02/10','2000/08/21',350.98); 4- Muestre nombre y apellido concatenados, con el apellido en letras maysculas, el documento precedido por "DNI N " y el sueldo precedido por "$ ". 5- Muestre el documento y el sueldo redondeado hacia arriba y precedido por "$ ". 6- Muestre los nombres y apellidos de los empleados que cumplen aos en el mes "october" (3 registros) 7- Muestre los nombres y apellidos de los empleados que ingresaron en un determinado ao (2 registros).

28 - Ordenar registros (order by)


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;

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 *libros order by editorial desc;

Tambin podemos ordenar por varios campos, por ejemplo, por "titulo" y "editorial":
select *from libros order by titulo,editorial;

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.

28 - Ordenar registros (order by)


Problema: Trabajamos con la tabla "libros" de una librera. Eliminamos la tabla si existe:
if object_id ('libros') is not null drop table libros;

Creamos la tabla:
create table libros( codigo int identity, titulo varchar(40) not null, autor varchar(20) default 'Desconocido', editorial varchar(20), precio decimal(6,2), primary key (codigo) );

Ingresamos algunos registros:


insert into libros (titulo,autor,editorial,precio) values('El aleph','Borges','Emece',25.33); insert into libros values('Java en 10 minutos','Mario Molina','Siglo XXI',50.65); insert into libros (titulo,autor,editorial,precio) values('Alicia en el pais de las maravillas','Lewis Carroll','Emece',19.95); insert into libros (titulo,autor,editorial,precio) values('Alicia en el pais de las maravillas','Lewis Carroll','Planeta',15);

Recuperamos los registros ordenados por el ttulo:


select *from libros order by titulo;

Ordenamos los registros por el campo "precio", referenciando el campo por su posicin en la lista de seleccin:
select titulo,autor,precio from libros order by 3;

Los ordenamos por "editorial", de mayor a menor empleando "desc":


select *from libros order by editorial desc;

Ordenamos por dos campos:


select *from libros order by titulo,editorial;

Ordenamos en distintos sentidos:


select *from libros order by titulo asc, editorial desc;

Podemos ordenar por un campo que no se lista en la seleccin:

select titulo, autor from libros order by precio;

Est permitido ordenar por valores calculados:


select titulo, autor, editorial, precio+(precio*0.1) as 'precio con descuento' from libros order by 4;

if object_id ('libros') is not null drop table libros;

create table libros( codigo int identity, titulo varchar(40) not null, autor varchar(20) default 'Desconocido', editorial varchar(20), precio decimal(6,2), primary key (codigo) );

insert into libros (titulo,autor,editorial,precio) values('El aleph','Borges','Emece',25.33); insert into libros values('Java en 10 minutos','Mario Molina','Siglo XXI',50.65); insert into libros (titulo,autor,editorial,precio)

values('Alicia en el pais de las maravillas','Lewis Carroll','Emece',19.95); insert into libros (titulo,autor,editorial,precio) values('Alicia en el pais de las maravillas','Lewis Carroll','Planeta',15);

select *from libros order by titulo;

select titulo,autor,precio from libros order by 3;

select *from libros order by editorial desc;

select *from libros order by titulo,editorial;

select *from libros order by titulo asc, editorial desc;

select titulo, autor from libros order by precio;

select titulo, autor, editorial,

precio+(precio*0.1) as 'precio con descuento' from libros order by 4;

Primer problema:
En una pgina web se guardan los siguientes datos de las visitas: nmero de visita, nombre, mail, pais, fecha. 1- Elimine la tabla "visitas", si existe: if object_id('visitas') is not null drop table visitas; 2- Crela con la siguiente estructura: create table visitas ( numero int identity, nombre varchar(30) default 'Anonimo', mail varchar(50), pais varchar (20), fecha datetime, primary key(numero) ); 3- Ingrese algunos registros: insert into visitas (nombre,mail,pais,fecha) values ('Ana Maria Lopez','AnaMaria@hotmail.com','Argentina','2006-1010 10:10'); insert into visitas (nombre,mail,pais,fecha) values ('Gustavo Gonzalez','GustavoGGonzalez@hotmail.com','Chile','2006-10-10 21:30'); insert into visitas (nombre,mail,pais,fecha) values ('Juancito','JuanJosePerez@hotmail.com','Argentina','2006-10-11 15:45'); insert into visitas (nombre,mail,pais,fecha) values ('Fabiola Martinez','MartinezFabiola@hotmail.com','Mexico','2006-10-12 08:15'); insert into visitas (nombre,mail,pais,fecha) values ('Fabiola Martinez','MartinezFabiola@hotmail.com','Mexico','2006-09-12 20:45'); insert into visitas (nombre,mail,pais,fecha) values ('Juancito','JuanJosePerez@hotmail.com','Argentina','2006-09-12 16:20'); insert into visitas (nombre,mail,pais,fecha) values ('Juancito','JuanJosePerez@hotmail.com','Argentina','2006-09-15 16:25'); 4- Ordene los registros por fecha, en orden descendente. 5- Muestre el nombre del usuario, pais y el nombre del mes, ordenado por pais (ascendente) y nombre del mes (descendente)

6- Muestre el pais, el mes, el da y la hora y ordene las visitas por nombre del mes, del da y la hora. 7- Muestre los mail, pas, ordenado por pas, de todos los que visitaron la pgina en octubre (4 registros)

if object_id('visitas') is not null drop table visitas; create table visitas ( numero int identity, nombre varchar(30) default 'Anonimo', mail varchar(50), pais varchar (20), fecha datetime, primary key(numero) ); insert into visitas (nombre,mail,pais,fecha) values ('Ana Maria Lopez','AnaMaria@hotmail.com','Argentina','2006-1010 10:10'); insert into visitas (nombre,mail,pais,fecha) values ('Gustavo Gonzalez','GustavoGGonzalez@hotmail.com','Chile','2006-10-10 21:30'); insert into visitas (nombre,mail,pais,fecha) values ('Juancito','JuanJosePerez@hotmail.com','Argentina','2006-10-11 15:45'); insert into visitas (nombre,mail,pais,fecha) values ('Fabiola Martinez','MartinezFabiola@hotmail.com','Mexico','2006-10-12 08:15'); insert into visitas (nombre,mail,pais,fecha) values ('Fabiola Martinez','MartinezFabiola@hotmail.com','Mexico','2006-09-12 20:45'); insert into visitas (nombre,mail,pais,fecha) values ('Juancito','JuanJosePerez@hotmail.com','Argentina','2006-09-12 16:20'); insert into visitas (nombre,mail,pais,fecha) values ('Juancito','JuanJosePerez@hotmail.com','Argentina','2006-09-15 16:25'); select *from visitas order by fecha desc; select nombre,pais,datename(month,fecha) from visitas order by pais,datename(month,fecha) desc; select nombre,mail, datename(month,fecha) mes, datename(day,fecha) dia,

datename(hour,fecha) hora from visitas order by 3,4,5; select mail, pais from visitas where datename(month,fecha)='October' order by 2;

29 - Operadores lgicos ( and - or - not


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":
select *from libros where autor='Borges' or editorial='Planeta';

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". 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. 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.

29 - Operadores lgicos ( and - or - not)


Problema:

Trabajamos con la tabla "libros" de una librera. Eliminamos la tabla si existe:


if object_id ('libros') is not null drop table libros;

Creamos la tabla:
create table libros( codigo int identity, titulo varchar(40) not null, autor varchar(20) default 'Desconocido', editorial varchar(20), precio decimal(6,2), );

Ingresamos algunos registros:


insert into libros values('El aleph','Borges','Emece',15.90); insert into libros values('Antologa potica','Borges','Planeta',39.50); insert into libros values('Java en 10 minutos','Mario Molina','Planeta',50.50); insert into libros values('Alicia en el pais de las maravillas','Lewis Carroll','Emece',19.90); insert into libros values('Martin Fierro','Jose Hernandez','Emece',25.90); insert into libros values('Martin Fierro','Jose Hernandez','Paidos',16.80); insert into libros values('Aprenda PHP','Mario Molina','Emece',19.50); insert into libros values('Cervantes y el quijote','Borges','Paidos',18.40);

Recuperamos los libros cuyo autor sea igual a "Borges" y cuyo precio no supere los 20 pesos:
select *from libros where (autor='Borges') and (precio<=20);

Seleccionamos los libros cuyo autor es "Borges" y/o cuya editorial es "Planeta":
select *from libros where autor='Borges' or editorial='Planeta';

Recuperamos los libros cuya editorial NO es "Planeta":


select *from libros where not editorial='Planeta';

Veamos cmo el uso de parntesis hace que SQL Server evale en forma diferente ciertas consultas aparentemente iguales:
select*from libros where (autor='Borges') or (editorial='Paidos' and precio<20); select *from libros where (autor='Borges' or editorial='Paidos') and (precio<20);

if object_id ('libros') is not null drop table libros;

create table libros( codigo int identity, titulo varchar(40) not null, autor varchar(20) default 'Desconocido', editorial varchar(20), precio decimal(6,2), );

insert into libros values('El aleph','Borges','Emece',15.90); insert into libros values('Antologa potica','Borges','Planeta',39.50); insert into libros values('Java en 10 minutos','Mario Molina','Planeta',50.50);

insert into libros values('Alicia en el pais de las maravillas','Lewis Carroll','Emece',19.90); insert into libros values('Martin Fierro','Jose Hernandez','Emece',25.90); insert into libros values('Martin Fierro','Jose Hernandez','Paidos',16.80); insert into libros values('Aprenda PHP','Mario Molina','Emece',19.50); insert into libros values('Cervantes y el quijote','Borges','Paidos',18.40);

select *from libros where (autor='Borges') and (precio<=20);

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

select *from libros where not editorial='Planeta';

select*from libros where (autor='Borges') or

(editorial='Paidos' and precio<20);

select *from libros where (autor='Borges' or editorial='Paidos') and (precio<20); Primer problema:
Trabaje con la tabla llamada "medicamentos" de una farmacia. 1- Elimine la tabla, si existe: if object_id('medicamentos') is not null drop table medicamentos; 2- Cree la tabla con la siguiente estructura: create table medicamentos( codigo int identity, nombre varchar(20), laboratorio varchar(20), precio decimal(5,2), cantidad tinyint, primary key(codigo) ); 3- Ingrese algunos registros: insert into medicamentos values('Sertal','Roche',5.2,100); insert into medicamentos values('Buscapina','Roche',4.10,200); insert into medicamentos values('Amoxidal 500','Bayer',15.60,100); insert into medicamentos values('Paracetamol 500','Bago',1.90,200); insert into medicamentos values('Bayaspirina','Bayer',2.10,150); insert into medicamentos values('Amoxidal jarabe','Bayer',5.10,250); 4- Recupere los cdigos y nombres de los medicamentos cuyo laboratorio sea 'Roche' y cuyo precio sea menor a 5 (1 registro cumple con ambas condiciones) 5- Recupere los medicamentos cuyo laboratorio sea 'Roche' o cuyo precio sea menor a 5 (4 registros): select * from medicamentos where laboratorio='Roche' or precio<5; Note que el resultado es diferente al del punto 4, hemos cambiado el operador de la sentencia anterior.

6- Muestre todos los medicamentos cuyo laboratorio NO sea "Bayer" y cuya cantidad sea=100 (1 registro) 7- Muestre todos los medicamentos cuyo laboratorio sea "Bayer" y cuya cantidad NO sea=100 (2 registros): select * from medicamentos where laboratorio='Bayer' and not cantidad=100; Analice estas 2 ltimas sentencias. El operador "not" afecta a la condicin a la cual antecede, no a las siguientes. Los resultados de los puntos 6 y 7 son diferentes. 8- Elimine todos los registros cuyo laboratorio sea igual a "Bayer" y su precio sea mayor a 10 (1 registro eliminado) 9- Cambie la cantidad por 200, a todos los medicamentos de "Roche" cuyo precio sea mayor a 5 (1 registro afectado) 10- Borre los medicamentos cuyo laboratorio sea "Bayer" o cuyo precio sea menor a 3 (3 registros borrados)

Ver solucin
if object_id('medicamentos') is not null drop table medicamentos; create table medicamentos( codigo int identity, nombre varchar(20), laboratorio varchar(20), precio decimal(5,2), cantidad tinyint, primary key(codigo) ); insert into medicamentos values('Sertal','Roche',5.2,100); insert into medicamentos values('Buscapina','Roche',4.10,200); insert into medicamentos values('Amoxidal 500','Bayer',15.60,100); insert into medicamentos values('Paracetamol 500','Bago',1.90,200); insert into medicamentos values('Bayaspirina','Bayer',2.10,150); insert into medicamentos values('Amoxidal jarabe','Bayer',5.10,250); select codigo,nombre from medicamentos where laboratorio='Roche' and precio<5;

select * from medicamentos where laboratorio='Roche' or precio<5; select * from medicamentos where not laboratorio='Bayer' and cantidad=100; select * from medicamentos where laboratorio='Bayer' and not cantidad=100; delete from medicamentos where laboratorio='Bayer' and precio>10; update medicamentos set cantidad=200 where laboratorio='Roche' and precio>5; delete from medicamentos where laboratorio='Bayer' or precio<3;

Segundo problema:
Trabajamos con la tabla "peliculas" de un video club que alquila pelculas en video. 1- Elimine la tabla, si existe; if object_id('peliculas') is not null drop table peliculas; 2- Crela con la siguiente estructura: create table peliculas( codigo int identity, titulo varchar(40) not null, actor varchar(20), duracion tinyint, primary key (codigo) ); 3- Ingrese algunos registros: insert into peliculas values('Mision imposible','Tom Cruise',120); insert into peliculas values('Harry Potter y la piedra filosofal','Daniel R.',180); insert into peliculas values('Harry Potter y la camara secreta','Daniel R.',190); insert into peliculas values('Mision imposible 2','Tom Cruise',120); insert into peliculas values('Mujer bonita','Richard Gere',120); insert into peliculas values('Tootsie','D. Hoffman',90); insert into peliculas values('Un oso rojo','Julio Chavez',100);

insert into peliculas values('Elsa y Fred','China Zorrilla',110); 4- Recupere los registros cuyo actor sea "Tom Cruise" or "Richard Gere" (3 registros) 5- Recupere los registros cuyo actor sea "Tom Cruise" y duracin menor a 100 (ninguno cumple ambas condiciones) 6- Cambie la duracin a 200, de las pelculas cuyo actor sea "Daniel R." y cuya duracin sea 180 (1 registro afectado) 7- Borre todas las pelculas donde el actor NO sea "Tom Cruise" y cuya duracin sea mayor o igual a 100 (2 registros eliminados) if object_id('peliculas') is not null drop table peliculas; create table peliculas( codigo int identity, titulo varchar(40) not null, actor varchar(20), duracion tinyint, primary key (codigo) ); insert into peliculas values('Mision imposible','Tom Cruise',120); insert into peliculas values('Harry Potter y la piedra filosofal','Daniel R.',180); insert into peliculas values('Harry Potter y la camara secreta','Daniel R.',190); insert into peliculas values('Mision imposible 2','Tom Cruise',120); insert into peliculas values('Mujer bonita','Richard Gere',120); insert into peliculas values('Tootsie','D. Hoffman',90); insert into peliculas values('Un oso rojo','Julio Chavez',100); insert into peliculas values('Elsa y Fred','China Zorrilla',110); select *from peliculas where actor='Tom Cruise' or actor='Richard Gere'; select *from peliculas where actor='Tom Cruise' and duracion<100; update peliculas set duracion=200 where actor='Daniel R.' and duracion=180;

delete from peliculas where not actor='Tom Cruise' and duracion<=100;

30 - Otros operadores relacionales (is null)


Hemos aprendido los operadores relacionales "=" (igual), "<>" (distinto), ">" (mayor), "<" (menor), ">=" (mayor o igual) y "<=" (menor o igual). Dijimos que no eran los nicos. Existen otro operador 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.

30 - Otros operadores relacionales (is null)


Problema: Trabajamos con la tabla "libros" de una librera. Eliminamos la tabla si existe:
if object_id ('libros') is not null drop table libros;

Creamos la tabla:
create table libros(

codigo int identity, titulo varchar(40) not null, autor varchar(20) default 'Desconocido', editorial varchar(20), precio decimal(6,2), );

Ingresamos algunos registros:


insert into libros values('El aleph','Borges','Emece',15.90); insert into libros values('Cervantes y el quijote','Borges','Paidos',null); insert into libros values('Alicia en el pais de las maravillas','Lewis Carroll',null,19.90); insert into libros values('Martin Fierro','Jose Hernandez','Emece',25.90); insert into libros (titulo,autor,precio) values('Antologa potica','Borges',25.50); insert into libros (titulo,autor,precio) values('Java en 10 minutos','Mario Molina',45.80); insert into libros (titulo,autor) values('Martin Fierro','Jose Hernandez'); insert into libros (titulo,autor) values('Aprenda PHP','Mario Molina');

Recuperamos los registros en los cuales est almacenado el valor "null" en el campo "editorial":
select *from libros where editorial is null;

Seleccionamos los libros que no contiene "null" en "editorial":


select *from libros where editorial is not null;

if object_id ('libros') is not null drop table libros;

create table libros( codigo int identity, titulo varchar(40) not null,

autor varchar(20) default 'Desconocido', editorial varchar(20), precio decimal(6,2), );

insert into libros values('El aleph','Borges','Emece',15.90); insert into libros values('Cervantes y el quijote','Borges','Paidos',null); insert into libros values('Alicia en el pais de las maravillas','Lewis Carroll',null,19.90); insert into libros values('Martin Fierro','Jose Hernandez','Emece',25.90); insert into libros (titulo,autor,precio) values('Antologa potica','Borges',25.50); insert into libros (titulo,autor,precio) values('Java en 10 minutos','Mario Molina',45.80); insert into libros (titulo,autor) values('Martin Fierro','Jose Hernandez'); insert into libros (titulo,autor) values('Aprenda PHP','Mario Molina');

select *from libros where editorial is null;

select *from libros

where editorial is not null;

Primer problema:
Trabajamos con la tabla "peliculas" de un video club que alquila pelculas en video. 1- Elimine la tabla, si existe; if object_id('peliculas') is not null drop table peliculas; 2- Crela con la siguiente estructura: create table peliculas( codigo int identity, titulo varchar(40) not null, actor varchar(20), duracion tinyint, primary key (codigo) ); 3- Ingrese algunos registros: insert into peliculas values('Mision imposible','Tom Cruise',120); insert into peliculas values('Harry Potter y la piedra filosofal','Daniel R.',null); insert into peliculas values('Harry Potter y la camara secreta','Daniel R.',190); insert into peliculas values('Mision imposible 2','Tom Cruise',120); insert into peliculas values('Mujer bonita',null,120); insert into peliculas values('Tootsie','D. Hoffman',90); insert into peliculas (titulo) values('Un oso rojo'); 4- Recupere las pelculas cuyo actor sea nulo (2 registros) 5- Cambie la duracin a 0, de las pelculas que tengan duracin igual a "null" (2 registros) 6- Borre todas las pelculas donde el actor sea "null" y cuya duracin sea 0 (1 registro)

31 - Otros operadores relacionales (between)


Hemos visto los operadores relacionales: = (igual), <> (distinto), > (mayor), < (menor), >= (mayor o igual), <= (menor o igual), is null/is not null (si un valor es NULL o no). 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 where precio>=20 and precio<=40;

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 15 y mayores a 25:
select *from libros where precio not between 20 and 35;

Siempre que sea posible, emplee condiciones de bsqueda positivas ("between"), evite las negativas ("not between") porque hace ms lenta la recuperacin de los datos. Entonces, se puede usar el operador "between" para reducir las condiciones "where".

31 - Otros operadores relacionales (between)


Problema: Trabajamos con la tabla "libros" de una librera. Eliminamos la tabla si existe:
if object_id ('libros') is not null drop table libros;

Creamos la tabla:
create table libros( codigo int identity, titulo varchar(40) not null, autor varchar(20) default 'Desconocido', editorial varchar(20), precio decimal(6,2), );

Ingresamos algunos registros:


insert into libros values('El aleph','Borges','Emece',15.90); insert into libros values('Cervantes y el quijote','Borges','Paidos',null); insert into libros values('Alicia en el pais de las maravillas','Lewis Carroll',null,19.90); insert into libros values('Martin Fierro','Jose Hernandez','Emece',25.90); insert into libros (titulo,autor,precio) values('Antologa potica','Borges',32); insert into libros (titulo,autor,precio) values('Java en 10 minutos','Mario Molina',45.80); insert into libros (titulo,autor,precio) values('Martin Fierro','Jose Hernandez',40); insert into libros (titulo,autor,precio) values('Aprenda PHP','Mario Molina',56.50);

Recuperamos los registros cuyo precio est entre 20 y 40 empleando "between":


select *from libros where precio between 20 and 40;

Note que si el campo tiene el valor "null", no aparece en la seleccin. Para seleccionar los libros cuyo precio NO est entre un intervalo de valores antecedemos "not" al "between":
select *from libros where precio not between 20 and 35;

if object_id ('libros') is not null drop table libros;

create table libros( codigo int identity, titulo varchar(40) not null, autor varchar(20) default 'Desconocido', editorial varchar(20), precio decimal(6,2), );

insert into libros values('El aleph','Borges','Emece',15.90); insert into libros values('Cervantes y el quijote','Borges','Paidos',null); insert into libros values('Alicia en el pais de las maravillas','Lewis Carroll',null,19.90); insert into libros values('Martin Fierro','Jose Hernandez','Emece',25.90); insert into libros (titulo,autor,precio) values('Antologa potica','Borges',32); insert into libros (titulo,autor,precio) values('Java en 10 minutos','Mario Molina',45.80); insert into libros (titulo,autor,precio) values('Martin Fierro','Jose Hernandez',40); insert into libros (titulo,autor,precio) values('Aprenda PHP','Mario Molina',56.50);

select *from libros

where precio between 20 and 40;

select *from libros where precio not between 20 and 35;

31 - Otros operadores relacionales (between)


Primer problema:
En una pgina web se guardan los siguientes datos de las visitas: nmero de visita, nombre, mail, pais, fechayhora de la visita. 1- Elimine la tabla "visitas", si existe: if object_id('visitas') is not null drop table visitas; 2- Crela con la siguiente estructura: create table visitas ( numero int identity, nombre varchar(30) default 'Anonimo', mail varchar(50), pais varchar (20), fechayhora datetime, primary key(numero) ); 3- Ingrese algunos registros: insert into visitas (nombre,mail,pais,fechayhora) values ('Ana Maria Lopez','AnaMaria@hotmail.com','Argentina','2006-1010 10:10'); insert into visitas (nombre,mail,pais,fechayhora) values ('Gustavo Gonzalez','GustavoGGonzalez@gotmail.com','Chile','2006-10-10 21:30'); insert into visitas (nombre,mail,pais,fechayhora) values ('Juancito','JuanJosePerez@hotmail.com','Argentina','2006-10-11 15:45'); insert into visitas (nombre,mail,pais,fechayhora) values ('Fabiola Martinez','MartinezFabiola@hotmail.com','Mexico','2006-10-12 08:15'); insert into visitas (nombre,mail,pais,fechayhora) values ('Fabiola Martinez','MartinezFabiola@hotmail.com','Mexico','2006-09-12 20:45'); insert into visitas (nombre,mail,pais,fechayhora) values ('Juancito','JuanJosePerez@gmail.com','Argentina','2006-09-12 16:20'); insert into visitas (nombre,mail,pais,fechayhora) values ('Juancito','JuanJosePerez@hotmail.com','Argentina','2006-09-15 16:25');

insert into visitas (nombre,mail,pais) values ('Federico1','federicogarcia@xaxamail.com','Argentina'); 4- Seleccione los usuarios que visitaron la pgina entre el '2006-09-12' y '2006-10-11' (5 registros) Note que incluye los de fecha mayor o igual al valor mnimo y menores al valor mximo, y que los valores null no se incluyen. 5- Recupere las visitas cuyo nmero se encuentra entre 2 y 5 (4 registros) Note que incluye los valores lmites. Ver solucin if object_id('visitas') is not null drop table visitas; create table visitas ( numero int identity, nombre varchar(30) default 'Anonimo', mail varchar(50), pais varchar (20), fechayhora datetime, primary key(numero) ); insert into visitas (nombre,mail,pais,fechayhora) values ('Ana Maria Lopez','AnaMaria@hotmail.com','Argentina','2006-1010 10:10'); insert into visitas (nombre,mail,pais,fechayhora) values ('Gustavo Gonzalez','GustavoGGonzalez@gotmail.com','Chile','2006-10-10 21:30'); insert into visitas (nombre,mail,pais,fechayhora) values ('Juancito','JuanJosePerez@hotmail.com','Argentina','2006-10-11 15:45'); insert into visitas (nombre,mail,pais,fechayhora) values ('Fabiola Martinez','MartinezFabiola@hotmail.com','Mexico','2006-10-12 08:15'); insert into visitas (nombre,mail,pais,fechayhora) values ('Fabiola Martinez','MartinezFabiola@hotmail.com','Mexico','2006-09-12 20:45'); insert into visitas (nombre,mail,pais,fechayhora) values ('Juancito','JuanJosePerez@gmail.com','Argentina','2006-09-12 16:20'); insert into visitas (nombre,mail,pais,fechayhora) values ('Juancito','JuanJosePerez@hotmail.com','Argentina','2006-09-15 16:25'); insert into visitas (nombre,mail,pais) values ('Federico1','federicogarcia@xaxamail.com','Argentina'); select *from visitas where fechayhora between '2006-09-12' and '2006-10-11'; select *from visitas where numero between 2 and 5;

Segundo problema:
Una concesionaria de autos vende autos usados y almacena la informacin en una tabla llamada "autos". 1- Elimine la tabla "autos" si existe: if object_id('autos') is not null drop table autos; 2- Cree la tabla con la siguiente estructura: create table autos( patente char(6), marca varchar(20), modelo char(4), precio decimal(8,2), primary key(patente) ); 3- Ingrese algunos registros: insert into autos values('ACD123','Fiat 128','1970',15000); insert into autos values('ACG234','Renault 11','1980',40000); insert into autos values('BCD333','Peugeot 505','1990',80000); insert into autos values('GCD123','Renault Clio','1995',70000); insert into autos values('BCC333','Renault Megane','1998',95000); insert into autos values('BVF543','Fiat 128','1975',20000); 4- Seleccione todos los autos cuyo modelo se encuentre entre '1970' y '1990' usando el operador

"between" y ordnelos por dicho campo(4 registros) 5- Seleccione todos los autos cuyo precio est entre 50000 y 100000.

Ver solucin
if object_id('autos') is not null drop table autos; create table autos( patente char(6), marca varchar(20), modelo char(4), precio decimal(8,2), primary key(patente) ); insert into autos values('ACD123','Fiat 128','1970',15000); insert into autos values('ACG234','Renault 11','1980',40000); insert into autos values('BCD333','Peugeot 505','1990',80000); insert into autos values('GCD123','Renault Clio','1995',70000); insert into autos values('BCC333','Renault Megane','1998',95000); insert into autos values('BVF543','Fiat 128','1975',20000); select *from autos where modelo between '1970' and '1990' order by modelo; select *from autos where precio between 50000 and 100000;

32 - Otros operadores relacionales (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 autor<>'Paenza';

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 evaln todos los registros y esto hace ms lenta la recuperacin de los datos.

32 - Otros operadores relacionales (in)


Problema: Trabajamos con la tabla "libros" de una librera. Eliminamos la tabla si existe:
if object_id ('libros') is not null drop table libros;

Creamos la tabla:
create table libros( codigo int identity, titulo varchar(40) not null, autor varchar(20), editorial varchar(20), precio decimal(6,2), );

Ingresamos algunos registros:

insert into libros values('El aleph','Borges','Emece',15.90); insert into libros values('Cervantes y el quijote','Borges','Paidos',null); insert into libros values('Alicia en el pais de las maravillas','Lewis Carroll',null,19.90); insert into libros values('Matematica estas ahi','Paenza','Siglo XXI',15); insert into libros (titulo,precio) values('Antologa potica',32); insert into libros (titulo,autor,precio) values('Martin Fierro','Jose Hernandez',40); insert into libros (titulo,autor,precio) values('Aprenda PHP','Mario Molina',56.50);

Recuperamos los libros cuyo autor es "Paenza" o "Borges":


select *from libros where autor in('Borges','Paenza');

Recuperamos los libros cuyo autor NO es "Paenza" ni "Borges":


select *from libros where autor not in ('Borges','Paenza');

Note que los valores "null" no se consideran.


if object_id ('libros') is not null drop table libros;

create table libros( codigo int identity, titulo varchar(40) not null, autor varchar(20), editorial varchar(20), precio decimal(6,2), );

insert into libros

values('El aleph','Borges','Emece',15.90); insert into libros values('Cervantes y el quijote','Borges','Paidos',null); insert into libros values('Alicia en el pais de las maravillas','Lewis Carroll',null,19.90); insert into libros values('Matematica estas ahi','Paenza','Siglo XXI',15); insert into libros (titulo,precio) values('Antologa potica',32); insert into libros (titulo,autor,precio) values('Martin Fierro','Jose Hernandez',40); insert into libros (titulo,autor,precio) values('Aprenda PHP','Mario Molina',56.50);

select *from libros where autor in('Borges','Paenza');

select *from libros where autor not in ('Borges','Paenza');

Primer problema:
Trabaje con la tabla llamada "medicamentos" de una farmacia. 1- Elimine la tabla, si existe: if object_id('medicamentos') is not null drop table medicamentos; 2- Cree la tabla con la siguiente estructura: create table medicamentos( codigo int identity, nombre varchar(20), laboratorio varchar(20), precio decimal(6,2),

cantidad tinyint, fechavencimiento datetime not null, primary key(codigo) ); 3- Ingrese algunos registros: insert into medicamentos values('Sertal','Roche',5.2,1,'2005-02-01'); insert into medicamentos values('Buscapina','Roche',4.10,3,'2006-03-01'); insert into medicamentos values('Amoxidal 500','Bayer',15.60,100,'2007-05-01'); insert into medicamentos values('Paracetamol 500','Bago',1.90,20,'2008-02-01'); insert into medicamentos values('Bayaspirina','Bayer',2.10,150,'2009-12-01'); insert into medicamentos values('Amoxidal jarabe','Bayer',5.10,250,'2010-10-01'); 4- Recupere los nombres y precios de los medicamentos cuyo laboratorio sea "Bayer" o "Bago" empleando el operador "in" (4 registros) 5- Seleccione los remedios cuya cantidad se encuentre entre 1 y 5 empleando el operador "between" y luego el operador "in" (2 registros): select *from medicamentos where cantidad between 1 and 5; select *from medicamentos where cantidad in (1,2,3,4,5); Note que es ms conveniente emplear, en este caso, el operador ""between".

if object_id('medicamentos') is not null drop table medicamentos; create table medicamentos( codigo int identity, nombre varchar(20), laboratorio varchar(20), precio decimal(6,2), cantidad tinyint, fechavencimiento datetime not null, primary key(codigo) ); insert into medicamentos values('Sertal','Roche',5.2,1,'2005-02-01'); insert into medicamentos values('Buscapina','Roche',4.10,3,'2006-03-01'); insert into medicamentos values('Amoxidal 500','Bayer',15.60,100,'2007-05-01'); insert into medicamentos

values('Paracetamol 500','Bago',1.90,20,'2008-02-01'); insert into medicamentos values('Bayaspirina','Bayer',2.10,150,'2009-12-01'); insert into medicamentos values('Amoxidal jarabe','Bayer',5.10,250,'2010-10-01'); select nombre,precio from medicamentos where laboratorio in ('Bayer','Bago'); select *from medicamentos where cantidad between 1 and 5; select *from medicamentos where cantidad in (1,2,3,4,5);

32 - Otros operadores relacionales (in)


Primer problema:
Trabaje con la tabla llamada "medicamentos" de una farmacia. 1- Elimine la tabla, si existe: if object_id('medicamentos') is not null drop table medicamentos; 2- Cree la tabla con la siguiente estructura: create table medicamentos( codigo int identity, nombre varchar(20), laboratorio varchar(20), precio decimal(6,2), cantidad tinyint, fechavencimiento datetime not null, primary key(codigo) ); 3- Ingrese algunos registros: insert into medicamentos values('Sertal','Roche',5.2,1,'2005-02-01'); insert into medicamentos values('Buscapina','Roche',4.10,3,'2006-03-01'); insert into medicamentos values('Amoxidal 500','Bayer',15.60,100,'2007-05-01'); insert into medicamentos values('Paracetamol 500','Bago',1.90,20,'2008-02-01'); insert into medicamentos values('Bayaspirina','Bayer',2.10,150,'2009-12-01'); insert into medicamentos values('Amoxidal jarabe','Bayer',5.10,250,'2010-10-01'); 4- Recupere los nombres y precios de los medicamentos cuyo laboratorio sea "Bayer" o "Bago" empleando el operador "in" (4 registros) 5- Seleccione los remedios cuya cantidad se encuentre entre 1 y 5 empleando el operador "between" y luego el operador "in" (2 registros):

select *from medicamentos where cantidad between 1 and 5; select *from medicamentos where cantidad in (1,2,3,4,5); Note que es ms conveniente emplear, en este caso, el operador ""between". if object_id('medicamentos') is not null drop table medicamentos; create table medicamentos( codigo int identity, nombre varchar(20), laboratorio varchar(20), precio decimal(6,2), cantidad tinyint, fechavencimiento datetime not null, primary key(codigo) ); insert into medicamentos values('Sertal','Roche',5.2,1,'2005-02-01'); insert into medicamentos values('Buscapina','Roche',4.10,3,'2006-03-01'); insert into medicamentos values('Amoxidal 500','Bayer',15.60,100,'2007-05-01'); insert into medicamentos values('Paracetamol 500','Bago',1.90,20,'2008-02-01'); insert into medicamentos values('Bayaspirina','Bayer',2.10,150,'2009-12-01'); insert into medicamentos values('Amoxidal jarabe','Bayer',5.10,250,'2010-10-01'); select nombre,precio from medicamentos where laboratorio in ('Bayer','Bago'); select *from medicamentos where cantidad between 1 and 5; select *from medicamentos where cantidad in (1,2,3,4,5);

33 - Bsqueda de patrones (like - not like)


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 *from libros where autor='Borges';

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". 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 where titulo not like 'M%';

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 like like like '[a-cf-i]%': busca cadenas que comiencen con a,b,c,f,g,h o i; '[-acfi]%': busca cadenas que comiencen con -,a,c,f o i; 'A[_]9%': busca cadenas que comiencen con 'A_9'; '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';

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 '[';

33 - Bsqueda de patrones (like - not like)


Problema: Trabajamos con la tabla "libros" de una librera. Eliminamos la tabla si existe:
if object_id ('libros') is not null drop table libros;

Creamos la tabla:
create table libros( codigo int identity, titulo varchar(40) not null, autor varchar(20) default 'Desconocido', editorial varchar(20), precio decimal(6,2), primary key(codigo) );

Ingresamos algunos registros:


insert into libros values('El aleph','Borges','Emece',15.90); insert into libros values('Antologa potica','J. L. Borges','Planeta',null); insert into libros values('Alicia en el pais de las maravillas','Lewis Carroll',null,19.90); insert into libros values('Matematica estas ahi','Paenza','Siglo XXI',15); insert into libros values('Martin Fierro','Jose Hernandez',default,40); insert into libros values('Aprenda PHP','Mario Molina','Nuevo siglo',56.50);

Recuperamos todos los libros que contengan en el campo "autor" la cadena "Borges":
select *from libros where autor like '%Borges%';

Seleccionamos los libros cuyos ttulos comienzan con la letra "M":


select *from libros where titulo like 'M%';

Seleccionamos todos los ttulos que NO comienzan con "M":


select *from libros where titulo not like 'M%';

Si queremos ver los libros de "Lewis Carroll" pero no recordamos si se escribe "Carroll" o "Carrolt", podemos emplear el comodn "_" (guin bajo) y establecer la siguiente condicin:
select *from libros where autor like '%Carrol_';

Buscamos los libros cuya editorial comienza con las letras entre la "P" y la "S":
select titulo,autor,editorial from libros where editorial like '[P-S]%';

Seleccionamos los libros cuya editorial NO comienza con las letras "P" ni "N":
select titulo,autor,editorial from libros where editorial like '[^PN]%';

Recuperamos todos los libros cuyo precio se encuentra entre 10.00 y 19.99:
select titulo,precio from libros where precio like '1_.%';

Recuperamos los libros que NO incluyen centavos en sus precios:


select titulo,precio from libros where precio like '%.00';

if object_id ('libros') is not null drop table libros;

create table libros( codigo int identity, titulo varchar(40) not null, autor varchar(20) default 'Desconocido', editorial varchar(20), precio decimal(6,2),

primary key(codigo) );

insert into libros values('El aleph','Borges','Emece',15.90); insert into libros values('Antologa potica','J. L. Borges','Planeta',null); insert into libros values('Alicia en el pais de las maravillas','Lewis Carroll',null,19.90); insert into libros values('Matematica estas ahi','Paenza','Siglo XXI',15); insert into libros values('Martin Fierro','Jose Hernandez',default,40); insert into libros values('Aprenda PHP','Mario Molina','Nuevo siglo',56.50);

select *from libros where autor like '%Borges%';

select *from libros where titulo like 'M%';

select *from libros where titulo not like 'M%';

select *from libros

where autor like '%Carrol_';

select titulo,autor,editorial from libros where editorial like '[P-S]%';

select titulo,autor,editorial from libros where editorial like '[^PN]%';

select titulo,precio from libros where precio like '1_.%';

select titulo,precio from libros where precio like '%.00';

33 - Bsqueda de patrones (like - not like)


Primer problema:
Una empresa almacena los datos de sus empleados en una tabla "empleados". 1- Elimine la tabla, si existe: if object_id('empleados') is not null drop table empleados; 2- Cree la tabla: create table empleados( nombre varchar(30), documento char(8), domicilio varchar(30), fechaingreso datetime, seccion varchar(20), sueldo decimal(6,2), primary key(documento) ); 3- Ingrese algunos registros: insert into empleados

values('Juan Perez','22333444','Colon 123','1990-1008','Gerencia',900.50); insert into empleados values('Ana Acosta','23444555','Caseros 987','1995-1218','Secretaria',590.30); insert into empleados values('Lucas Duarte','25666777','Sucre 235','2005-0515','Sistemas',790); insert into empleados values('Pamela Gonzalez','26777888','Sarmiento 873','1999-0212','Secretaria',550); insert into empleados values('Marcos Juarez','30000111','Rivadavia 801','2002-0922','Contaduria',630.70); insert into empleados values('Yolanda Perez','35111222','Colon 180','1990-1008','Administracion',400); insert into empleados values('Rodolfo Perez','35555888','Coronel Olmedo 588','1990-0528','Sistemas',800); 4- Muestre todos los empleados con apellido "Perez" empleando el operador "like" (3 registros) 5- Muestre todos los empleados cuyo domicilio comience con "Co" y tengan un "8" (2 registros) 6- Seleccione todos los empleados cuyo documento finalice en 0,2,4,6 u 8 (4 registros) 7- Seleccione todos los empleados cuyo documento NO comience con 1 ni 3 y cuyo nombre finalice en "ez" (2 registros) 8- Recupere todos los nombres que tengan una "y" o una "j" en su nombre o apellido (3 registros) 9- Muestre los nombres y seccin de los empleados que pertenecen a secciones que comiencen con "S" o "G" y tengan 8 caracteres (3 registros) 10- Muestre los nombres y seccin de los empleados que pertenecen a secciones que NO comiencen con "S" o "G" (2 registros) 11- Muestre todos los nombres y sueldos de los empleados cuyos sueldos incluyen centavos (3 registros) 12- Muestre los empleados que hayan ingresado en "1990" (3 registros)

if object_id('empleados') is not null drop table empleados;

create table empleados( nombre varchar(30), documento char(8), domicilio varchar(30), fechaingreso datetime, seccion varchar(20), sueldo decimal(6,2), primary key(documento) ); insert into empleados values('Juan Perez','22333444','Colon 123','1990-1008','Gerencia',900.50); insert into empleados values('Ana Acosta','23444555','Caseros 987','1995-1218','Secretaria',590.30); insert into empleados values('Lucas Duarte','25666777','Sucre 235','2005-0515','Sistemas',790); insert into empleados values('Pamela Gonzalez','26777888','Sarmiento 873','1999-0212','Secretaria',550); insert into empleados values('Marcos Juarez','30000111','Rivadavia 801','2002-0922','Contaduria',630.70); insert into empleados values('Yolanda Perez','35111222','Colon 180','1990-1008','Administracion',400); insert into empleados values('Rodolfo Perez','35555888','Coronel Olmedo 588','1990-0528','Sistemas',800); select *from empleados where nombre like '%Perez%'; select *from empleados where domicilio like 'Co%8%'; select *from empleados where documento like '%[02468]'; select *from empleados where documento like '[^13]%' and nombre like '%ez'; select nombre from empleados where nombre like '%[yj]%'; select nombre,seccion from empleados where seccion like '[SG]_______'; select nombre,seccion from empleados where seccion not like '[SG]%'; select nombre,sueldo from empleados where sueldo not like '%.00';

select *from empleados where fechaingreso like '%1990%';

34 - Contar registros (count)


Existen en SQL Server funciones que nos permiten contar registros, calcular sumas, promedios, obtener valores mximos y mnimos. Estas funciones se denominan funciones de agregado y operan sobre un conjunto de valores (registros), no con datos individuales y devuelven un nico valor. Imaginemos que nuestra tabla "libros" contiene muchos registros. Para averiguar la cantidad sin necesidad de contarlos manualmente usamos la funcin "count()":
select count(*) from libros;

La funcin "count()" cuenta la cantidad de registros de una tabla, incluyendo los que tienen valor nulo. Tambin podemos utilizar esta funcin junto con la clusula "where" para una consulta ms especfica. Queremos saber la cantidad de libros de la editorial "Planeta":
select count(*) from libros where editorial='Planeta';

Para contar los registros que tienen precio (sin tener en cuenta los que tienen valor nulo), usamos la funcin "count()" y en los parntesis colocamos el nombre del campo que necesitamos contar:
select count(precio) from libros;

Note que "count(*)" retorna la cantidad de registros de una tabla (incluyendo los que tienen valor "null") mientras que "count(precio)" retorna la cantidad de registros en los cuales el campo "precio" no es nulo. No es lo mismo. "count(*)" cuenta registros, si en lugar de un asterisco colocamos como argumento el nombre de un campo, se contabilizan los registros cuyo valor en ese campo NO es nulo.

34 - Contar registros (count)


Problema:

Trabajamos con la tabla "libros" de una librera. Eliminamos la tabla si existe:


if object_id ('libros') is not null drop table libros;

Creamos la tabla:
create table libros( codigo int identity, titulo varchar(40) not null, autor varchar(20) default 'Desconocido', editorial varchar(20), precio decimal(6,2), primary key(codigo) );

Ingresamos algunos registros:


insert into libros values('El aleph','Borges','Emece',15.90); insert into libros values('Antologa potica','J. L. Borges','Planeta',null); insert into libros values('Alicia en el pais de las maravillas','Lewis Carroll',null,19.90); insert into libros values('Matematica estas ahi','Paenza','Siglo XXI',15); insert into libros values('Martin Fierro','Jose Hernandez',default,40); insert into libros values('Aprenda PHP','Mario Molina','Nuevo siglo',null); insert into libros values('Uno','Richard Bach','Planeta',20);

Averiguemos la cantidad de libros usando la funcin "count()":


select count(*) from libros;

Note que incluye todos los libros aunque tengan valor nulo en algn campo. Contamos los libros de editorial "Planeta":
select count(*) from libros where editorial='Planeta';

Contamos los registros que tienen precio (sin tener en cuenta los que tienen valor nulo), usando la funcin "count(precio)":
select count(precio)

from libros;

if object_id ('libros') is not null drop table libros;

create table libros( codigo int identity, titulo varchar(40) not null, autor varchar(20) default 'Desconocido', editorial varchar(20), precio decimal(6,2), primary key(codigo) );

insert into libros values('El aleph','Borges','Emece',15.90); insert into libros values('Antologa potica','J. L. Borges','Planeta',null); insert into libros values('Alicia en el pais de las maravillas','Lewis Carroll',null,19.90); insert into libros values('Matematica estas ahi','Paenza','Siglo XXI',15); insert into libros values('Martin Fierro','Jose Hernandez',default,40); insert into libros values('Aprenda PHP','Mario Molina','Nuevo siglo',null); insert into libros

values('Uno','Richard Bach','Planeta',20);

select count(*) from libros;

select count(*) from libros where editorial='Planeta';

select count(precio)

34 - Contar registros (count)


Primer problema:
Trabaje con la tabla llamada "medicamentos" de una farmacia. 1- Elimine la tabla, si existe: if object_id('medicamentos') is not null drop table medicamentos; 2- Cree la tabla con la siguiente estructura: create table medicamentos( codigo int identity, nombre varchar(20), laboratorio varchar(20), precio decimal(6,2), cantidad tinyint, fechavencimiento datetime not null, numerolote int default null, primary key(codigo) ); 3- Ingrese algunos registros: insert into medicamentos values('Sertal','Roche',5.2,1,'2005-02-01',null); insert into medicamentos values('Buscapina','Roche',4.10,3,'2006-03-01',null); insert into medicamentos values('Amoxidal 500','Bayer',15.60,100,'2007-05-01',null); insert into medicamentos values('Paracetamol 500','Bago',1.90,20,'2008-02-01',null); insert into medicamentos values('Bayaspirina',null,2.10,null,'2009-12-01',null); insert into medicamentos

values('Amoxidal jarabe','Bayer',null,250,'2009-12-15',null); 4- Muestre la cantidad de registros empleando la funcin "count(*)" (6 registros) 5- Cuente la cantidad de medicamentos que tienen laboratorio conocido (5 registros) 6- Cuente la cantidad de medicamentos que tienen precio distinto a "null" y que tienen cantidad distinto a "null", disponer alias para las columnas. 7- Cuente la cantidad de remedios con precio conocido, cuyo laboratorio comience con "B" (2 registros) 8- Cuente la cantidad de medicamentos con nmero de lote distitno de "null" (0 registros)

if object_id('medicamentos') is not null drop table medicamentos; create table medicamentos( codigo int identity, nombre varchar(20), laboratorio varchar(20), precio decimal(6,2), cantidad tinyint, fechavencimiento datetime not null, numerolote int default null, primary key(codigo) ); insert into medicamentos values('Sertal','Roche',5.2,1,'2005-02-01',null); insert into medicamentos values('Buscapina','Roche',4.10,3,'2006-03-01',null); insert into medicamentos values('Amoxidal 500','Bayer',15.60,100,'2007-05-01',null); insert into medicamentos values('Paracetamol 500','Bago',1.90,20,'2008-02-01',null); insert into medicamentos values('Bayaspirina',null,2.10,null,'2009-12-01',null); insert into medicamentos values('Amoxidal jarabe','Bayer',null,250,'2009-12-15',null); select count(*) from medicamentos; select count(laboratorio) from medicamentos; select count(precio) as 'Con precio',

count(cantidad) as 'Con cantidad' from medicamentos; select count(precio) from medicamentos where laboratorio like 'B%'; select count(numerolote) from medicamentos;

35 - Contar registros (count_big)


Retorna la cantidad de registros. Es similar a la funcin "count(*)", la diferencia es que "count_big" retorna un valor "bigint" y "count", un "int". "count_big(*)" cuenta la cantidad de registros de una tabla, incluyendo los valores nulos y duplicados. "count_big(CAMPO)" retorna la cantidad de registros cuyo valor en el campo especificado entre parntesis no es nulo. "count_big(distinct CAMPO)" retorna la cantidad de registros cuyo valor en el campo especificado no es nulo, sin considerar los repetidos. Averiguemos la cantidad de libros usando la funcin "count_big()":
select count_big(*) from libros;

Note que incluye todos los libros aunque tengan valor nulo en algn campo. Contamos los libros de editorial "Planeta":
select count_big(*) from libros where editorial='Planeta';

Contamos los registros que tienen precio (sin tener en cuenta los que tienen valor nulo):
select count_big(precio) from libros;

Contamos las editoriales (sin repetir):


select count_big(distinct editorial) from libros;

35 - Contar registros (count_big)


Problema: Trabajamos con la tabla "libros" de una librera. Eliminamos la tabla si existe:
if object_id ('libros') is not null drop table libros;

Creamos la tabla:
create table libros( codigo int identity, titulo varchar(40) not null, autor varchar(20) default 'Desconocido', editorial varchar(20), precio decimal(6,2), primary key(codigo) );

Ingresamos algunos registros:


insert into libros values('El aleph','Borges','Emece',15.90); insert into libros values('Antologa potica','Borges','Planeta',null); insert into libros values('Alicia en el pais de las maravillas','Lewis Carroll',null,19.90); insert into libros values('Matematica estas ahi','Paenza','Siglo XXI',15); insert into libros values('Martin Fierro','Jose Hernandez',default,40); insert into libros values('Aprenda PHP','Mario Molina','Nuevo siglo',null); insert into libros values('Uno','Richard Bach','Planeta',20);

Contamos los libros usando "count_big()":


select count_big(*) from libros;

Note que incluye todos los libros aunque tengan valor nulo en algn campo. Contamos los libros de editorial "Planeta":
select count_big(*) from libros where editorial='Planeta';

Averiguamos la cantidad de libros que tienen precio:


select count_big(precio)

from libros;

Contamos las editoriales (sin repetir):


select count_big(distinct editorial) from libros;

if object_id ('libros') is not null drop table libros;

create table libros( codigo int identity, titulo varchar(40) not null, autor varchar(20) default 'Desconocido', editorial varchar(20), precio decimal(6,2), primary key(codigo) );

insert into libros values('El aleph','Borges','Emece',15.90); insert into libros values('Antologa potica','Borges','Planeta',null); insert into libros values('Alicia en el pais de las maravillas','Lewis Carroll',null,19.90); insert into libros values('Matematica estas ahi','Paenza','Siglo XXI',15); insert into libros values('Martin Fierro','Jose Hernandez',default,40); insert into libros values('Aprenda PHP','Mario Molina','Nuevo siglo',null); insert into libros values('Uno','Richard Bach','Planeta',20);

select count_big(*) from libros;

select count_big(*) from libros where editorial='Planeta';

select count_big(precio) from libros;

select count_big(distinct editorial) from libros;

Primer problema:
Trabaje con la tabla llamada "medicamentos" de una farmacia. 1- Elimine la tabla, si existe: if object_id('medicamentos') is not null drop table medicamentos; 2- Cree la tabla con la siguiente estructura: create table medicamentos( codigo int identity, nombre varchar(20), laboratorio varchar(20), precio decimal(6,2), cantidad tinyint, fechavencimiento datetime not null, numerolote int default null, primary key(codigo) ); 3- Ingrese algunos registros: insert into medicamentos values('Sertal','Roche',5.2,1,'2005-02-01',null); insert into medicamentos values('Buscapina','Roche',4.10,3,'2006-03-01',null); insert into medicamentos values('Amoxidal 500','Bayer',15.60,100,'2007-05-01',null); insert into medicamentos values('Paracetamol 500','Bago',1.90,20,'2008-02-01',null); insert into medicamentos values('Bayaspirina',null,2.10,null,'2009-12-01',null); insert into medicamentos values('Amoxidal jarabe','Bayer',null,250,'2009-12-15',null); 4- Muestre la cantidad de registros empleando la funcin "count_big(*)" (6 registros)

5- Cuente la cantidad de laboratorios distintos (3 registros) 6- Cuente la cantidad de medicamentos que tienen precio y cantidad distinto de "null" (5 y 5) if object_id('medicamentos') is not null drop table medicamentos; create table medicamentos( codigo int identity, nombre varchar(20), laboratorio varchar(20), precio decimal(6,2), cantidad tinyint, fechavencimiento datetime not null, numerolote int default null, primary key(codigo) ); insert into medicamentos values('Sertal','Roche',5.2,1,'2005-02-01',null); insert into medicamentos values('Buscapina','Roche',4.10,3,'2006-03-01',null); insert into medicamentos values('Amoxidal 500','Bayer',15.60,100,'2007-05-01',null); insert into medicamentos values('Paracetamol 500','Bago',1.90,20,'2008-02-01',null); insert into medicamentos values('Bayaspirina',null,2.10,null,'2009-12-01',null); insert into medicamentos values('Amoxidal jarabe','Bayer',null,250,'2009-12-15',null); select count_big(*) from medicamentos; select count_big(distinct laboratorio) from medicamentos; select count_big(precio) as 'Con precio', count_big(cantidad) as 'Con cantidad' from medicamentos;

36 - Funciones de agrupamiento (count sum - min - max - avg)


Hemos visto que SQL Server tiene funciones que nos permiten contar registros, calcular sumas, promedios, obtener valores mximos y mnimos, las funciones de agregado. Ya hemos aprendido una de ellas, "count()", veamos otras. Se pueden usar en una instruccin "select" y combinarlas con la clusula "group by". Todas estas funciones retornan "null" si ningn registro cumple con la condicin del "where", excepto "count" que en tal caso retorna cero. El tipo de dato del campo determina las funciones que se pueden emplear con ellas. Las relaciones entre las funciones de agrupamiento y los tipos de datos es la siguiente: - count: se puede emplear con cualquier tipo de dato. - min y max: con cualquier tipo de dato. - sum y avg: slo en campos de tipo numrico. La funcin "sum()" retorna la suma de los valores que contiene el campo especificado. Si queremos saber la cantidad total de libros que tenemos disponibles para la venta, debemos sumar todos los valores del campo "cantidad":
select sum(cantidad) from libros;

Para averiguar el valor mximo o mnimo de un campo usamos las funciones "max()" y "min()" respectivamente. Queremos saber cul es el mayor precio de todos los libros:
select max(precio) from libros;

Entonces, dentro del parntesis de la funcin colocamos el nombre del campo del cul queremos el mximo valor. La funcin "avg()" retorna el valor promedio de los valores del campo especificado. Queremos saber el promedio del precio de los libros referentes a "PHP":
select avg(precio) from libros where titulo like '%PHP%';

Ahora podemos entender porque estas funciones se denominan "funciones de agrupamiento", porque operan sobre conjuntos de registros, no con datos individuales. Tratamiento de los valores nulos: Si realiza una consulta con la funcin "count" de un campo que contiene 18 registros, 2 de los cuales contienen valor nulo, el resultado devuelve un total de 16 filas porque no considera aquellos con valor nulo. Todas las funciones de agregado, excepto "count(*)", excluye los valores nulos de los campos. "count(*)" cuenta todos los registros, incluidos los que contienen "null".

36 - Funciones de agrupamiento (count sum - min - max - avg)


Problema: Trabajamos con la tabla "libros" de una librera. Eliminamos la tabla, si existe:
if object_id('libros') is not null drop table libros;

Creamos la tabla:
create table libros( codigo int identity, titulo varchar(40) not null, autor varchar(30) default 'Desconocido', editorial varchar(15), precio decimal(5,2), cantidad tinyint, primary key(codigo) );

Ingresamos algunos registros:


insert into libros values('El aleph','Borges','Planeta',15,null); insert into libros values('Martin Fierro','Jose Hernandez','Emece',22.20,200); insert into libros values('Antologia poetica','J.L. Borges','Planeta',null,150); insert into libros values('Aprenda PHP','Mario Molina','Emece',18.20,null); insert into libros

values('Cervantes y el quijote','Bioy Casares- J.L. Borges','Paidos',null,100); insert into libros values('Manual de PHP', 'J.C. Paez', 'Siglo XXI',31.80,120); insert into libros values('Harry Potter y la piedra filosofal','J.K. Rowling',default,45.00,90); insert into libros values('Harry Potter y la camara secreta','J.K. Rowling','Emece',46.00,100); insert into libros (titulo,autor,cantidad) values('Alicia en el pais de las maravillas','Lewis Carroll',220); insert into libros (titulo,autor,cantidad) values('PHP de la A a la Z',default,0);

Para conocer la cantidad total de libros, sumamos las cantidades de cada uno:
select sum(cantidad) from libros;

Retorna 980; verifique la suma, sumando los valores de todos los registros del campo "cantidad". Queremos saber cuntos libros tenemos de la editorial "Emece":
select sum(cantidad) from libros where editorial='Emece';

retorna 300. Queremos saber cul es el libro ms costoso; usamos la funcin "max()":
select max(precio) from libros;

retorna 46.00. Para conocer el precio mnimo de los libros de "Rowling" tipeamos:
select min(precio) from libros where autor like '%Rowling%';

retorna 45.00. Queremos saber el promedio del precio de los libros referentes a "PHP":
select avg(precio) from libros where titulo like '%PHP%';

Devuelve 25.00. Note que hay 3 libros sobre "PHP", pero uno de ellos tiene precio nulo entonces SQL Server no lo incluye para calcular el promedio.
if object_id('libros') is not null drop table libros;

create table libros( codigo int identity, titulo varchar(40) not null, autor varchar(30) default 'Desconocido', editorial varchar(15), precio decimal(5,2), cantidad tinyint, primary key(codigo) );

insert into libros values('El aleph','Borges','Planeta',15,null); insert into libros values('Martin Fierro','Jose Hernandez','Emece',22.20,200); insert into libros values('Antologia poetica','J.L. Borges','Planeta',null,150); insert into libros values('Aprenda PHP','Mario Molina','Emece',18.20,null); insert into libros values('Cervantes y el quijote','Bioy Casares- J.L. Borges','Paidos',null,100); insert into libros

values('Manual de PHP', 'J.C. Paez', 'Siglo XXI',31.80,120); insert into libros values('Harry Potter y la piedra filosofal','J.K. Rowling',default,45.00,90); insert into libros values('Harry Potter y la camara secreta','J.K. Rowling','Emece',46.00,100); insert into libros (titulo,autor,cantidad) values('Alicia en el pais de las maravillas','Lewis Carroll',220); insert into libros (titulo,autor,cantidad) values('PHP de la A a la Z',default,0);

select sum(cantidad) from libros;

select sum(cantidad) from libros where editorial='Emece';

select max(precio) from libros;

select min(precio) from libros where autor like '%Rowling%';

select avg(precio) from libros

where titulo like '%PHP%';

36 - Funciones de agrupamiento (count sum - min - max - avg)


Primer problema:
Una empresa almacena los datos de sus empleados en una tabla "empleados". 1- Elimine la tabla, si existe: if object_id('empleados') is not null drop table empleados; 2- Cree la tabla: create table empleados( nombre varchar(30), documento char(8), domicilio varchar(30), seccion varchar(20), sueldo decimal(6,2), cantidadhijos tinyint, primary key(documento) ); 3- Ingrese algunos registros: insert into empleados values('Juan Perez','22333444','Colon 123','Gerencia',5000,2); insert into empleados values('Ana Acosta','23444555','Caseros 987','Secretaria',2000,0); insert into empleados values('Lucas Duarte','25666777','Sucre 235','Sistemas',4000,1); insert into empleados values('Pamela Gonzalez','26777888','Sarmiento 873','Secretaria',2200,3); insert into empleados values('Marcos Juarez','30000111','Rivadavia 801','Contaduria',3000,0); insert into empleados values('Yolanda Perez','35111222','Colon 180','Administracion',3200,1); insert into empleados values('Rodolfo Perez','35555888','Coronel Olmedo 588','Sistemas',4000,3); insert into empleados values('Martina Rodriguez','30141414','Sarmiento 1234','Administracion',3800,4); insert into empleados values('Andres Costa','28444555',default,'Secretaria',null,null); 4- Muestre la cantidad de empleados usando "count" (9 empleados) 5- Muestre la cantidad de empleados con sueldo no nulo de la seccin "Secretaria" (2 empleados) 6- Muestre el sueldo ms alto y el ms bajo colocando un alias (5000 y 2000)

7- Muestre el valor mayor de "cantidadhijos" de los empleados "Perez" (3 hijos) 8- Muestre el promedio de sueldos de todo los empleados (3400. Note que hay un sueldo nulo y no es tenido en cuenta) 9- Muestre el promedio de sueldos de los empleados de la seccin "Secretara" (2100) 10- Muestre el promedio de hijos de todos los empleados de "Sistemas" (2) if object_id('empleados') is not null drop table empleados; create table empleados( nombre varchar(30), documento char(8), domicilio varchar(30), seccion varchar(20), sueldo decimal(6,2), cantidadhijos tinyint, primary key(documento) ); insert into empleados values('Juan Perez','22333444','Colon 123','Gerencia',5000,2); insert into empleados values('Ana Acosta','23444555','Caseros 987','Secretaria',2000,0); insert into empleados values('Lucas Duarte','25666777','Sucre 235','Sistemas',4000,1); insert into empleados values('Pamela Gonzalez','26777888','Sarmiento 873','Secretaria',2200,3); insert into empleados values('Marcos Juarez','30000111','Rivadavia 801','Contaduria',3000,0); insert into empleados values('Yolanda Perez','35111222','Colon 180','Administracion',3200,1); insert into empleados values('Rodolfo Perez','35555888','Coronel Olmedo 588','Sistemas',4000,3); insert into empleados values('Martina Rodriguez','30141414','Sarmiento 1234','Administracion',3800,4); insert into empleados values('Andres Costa','28444555',default,'Secretaria',null,null); select count(*) from empleados; select count(sueldo) from empleados where seccion='Secretaria'; select max(sueldo) as 'Mayor sueldo', min(sueldo) as 'Menor sueldo' from empleados;

select max(cantidadhijos) from empleados where nombre like '%Perez%'; select avg(sueldo) from empleados; select avg(sueldo) from empleados where seccion='Secretaria'; select avg(cantidadhijos) from empleados where seccion='Sistemas';

37 - Agrupar registros (group by)


Hemos aprendido que las funciones de agregado permiten realizar varios clculos operando con conjuntos de registros. Las funciones de agregado solas producen un valor de resumen para todos los registros de un campo. Podemos generar valores de resumen para un solo campo, combinando las funciones de agregado con la clusula "group by", que agrupa registros para consultas detalladas. Queremos saber la cantidad de libros de cada editorial, podemos tipear la siguiente sentencia:
select count(*) from libros where editorial='Planeta';

y repetirla con cada valor de "editorial":


select where select where ... count(*) from libros editorial='Emece'; count(*) from libros editorial='Paidos';

Pero hay otra manera, utilizando la clusula "group by":


select editorial, count(*) from libros group by editorial;

La instruccin anterior solicita que muestre el nombre de la editorial y cuente la cantidad agrupando los registros por el campo "editorial". Como resultado aparecen los nombres de las editoriales y la cantidad de registros para cada valor del campo.

Los valores nulos se procesan como otro grupo. Entonces, para saber la cantidad de libros que tenemos de cada editorial, utilizamos la funcin "count()", agregamos "group by" (que agrupa registros) y el campo por el que deseamos que se realice el agrupamiento, tambin colocamos el nombre del campo a recuperar; la sintaxis bsica es la siguiente:
select CAMPO, FUNCIONDEAGREGADO from NOMBRETABLA group by CAMPO;

Tambin se puede agrupar por ms de un campo, en tal caso, luego del "group by" se listan los campos, separados por comas. Todos los campos que se especifican en la clusula "group by" deben estar en la lista de seleccin.
select CAMPO1, CAMPO2, FUNCIONDEAGREGADO from NOMBRETABLA group by CAMPO1,CAMPO2;

Para obtener la cantidad libros con precio no nulo, de cada editorial utilizamos la funcin "count()" envindole como argumento el campo "precio", agregamos "group by" y el campo por el que deseamos que se realice el agrupamiento (editorial):
select editorial, count(precio) from libros group by editorial;

Como resultado aparecen los nombres de las editoriales y la cantidad de registros de cada una, sin contar los que tienen precio nulo. Recuerde la diferencia de los valores que retorna la funcin "count()" cuando enviamos como argumento un asterisco o el nombre de un campo: en el primer caso cuenta todos los registros incluyendo los que tienen valor nulo, en el segundo, los registros en los cuales el campo especificado es no nulo. Para conocer el total en dinero de los libros agrupados por editorial:
select editorial, sum(precio) from libros group by editorial;

Para saber el mximo y mnimo valor de los libros agrupados por editorial:
select editorial, max(precio) as mayor, min(precio) as menor from libros group by editorial;

Para calcular el promedio del valor de los libros agrupados por editorial:
select editorial, avg(precio) from libros group by editorial;

Es posible limitar la consulta con "where". Si incluye una clusula "where", slo se agrupan los registros que cumplen las condiciones. Vamos a contar y agrupar por editorial considerando solamente los libros cuyo precio sea menor a 30 pesos:
select editorial, count(*) from libros where precio<30 group by editorial;

Note que las editoriales que no tienen libros que cumplan la condicin, no aparecen en la salida. Para que aparezcan todos los valores de editorial, incluso los que devuelven cero o "null" en la columna de agregado, debemos emplear la palabra clave "all" al lado de "group by":
select editorial, count(*) from libros where precio<30 group by all editorial;

Entonces, usamos "group by" para organizar registros en grupos y obtener un resumen de dichos grupos. SQL Server produce una columna de valores por cada grupo, devolviendo filas por cada grupo especificado.

37 - Agrupar registros (group by)


Problema: Trabajamos con la tabla "libros" de una librera. Eliminamos la tabla, si existe:
if object_id('libros') is not null drop table libros;

Creamos la tabla:
create table libros( codigo int identity, titulo varchar(40), autor varchar(30), editorial varchar(15),

precio decimal(5,2), cantidad tinyint, primary key(codigo) );

Ingresamos algunos registros:


insert into libros values('El aleph','Borges','Planeta',15,null); insert into libros values('Martin Fierro','Jose Hernandez','Emece',22.20,200); insert into libros values('Antologia poetica','J.L. Borges','Planeta',null,150); insert into libros values('Aprenda PHP','Mario Molina','Emece',18.20,null); insert into libros values('Cervantes y el quijote','Bioy Casares- J.L. Borges','Paidos',null,100); insert into libros values('Manual de PHP', 'J.C. Paez', 'Siglo XXI',31.80,120); insert into libros values('Harry Potter y la piedra filosofal','J.K. Rowling',default,45.00,90); insert into libros values('Harry Potter y la camara secreta','J.K. Rowling','Emece',null,100); insert into libros values('Alicia en el pais de las maravillas','Lewis Carroll','Paidos',22.50,200); insert into libros values('PHP de la A a la Z',null,null,null,0);

Queremos saber la cantidad de libros de cada editorial, utilizando la clusula "group by":
select editorial, count(*) from libros group by editorial;

El resultado muestra los nombres de las editoriales y la cantidad de registros para cada valor del campo. Note que los valores nulos se procesan como otro grupo. Obtenemos la cantidad libros con precio no nulo de cada editorial:
select editorial, count(precio) from libros group by editorial;

La salida muestra los nombres de las editoriales y la cantidad de registros de cada una, sin contar los que tienen precio nulo. Para conocer el total en dinero de los libros agrupados por editorial, tipeamos:
select editorial, sum(precio)

from libros group by editorial;

Obtenemos el mximo y mnimo valor de los libros agrupados por editorial, en una sola sentencia:
select editorial, max(precio) as mayor, min(precio) as menor from libros group by editorial;

Calculamos el promedio del valor de los libros agrupados por editorial:


select editorial, avg(precio) from libros group by editorial;

Es posible limitar la consulta con "where". Vamos a contar y agrupar por editorial considerando solamente los libros cuyo precio es menor a 30 pesos:
select editorial, count(*) from libros where precio<30 group by editorial;

Note que las editoriales que no tienen libros que cumplan la condicin, no aparecen en la salida. Para que aparezcan todos los valores de editorial, incluso los que devuelven cero o "null" en la columna de agregado, debemos emplear la palabra clave "all" al lado de "group by":
select editorial, count(*) from libros where precio<30 group by all editorial;

if object_id('libros') is not null drop table libros;

create table libros( codigo int identity, titulo varchar(40), autor varchar(30),

editorial varchar(15), precio decimal(5,2), cantidad tinyint, primary key(codigo) );

insert into libros values('El aleph','Borges','Planeta',15,null); insert into libros values('Martin Fierro','Jose Hernandez','Emece',22.20,200); insert into libros values('Antologia poetica','J.L. Borges','Planeta',null,150); insert into libros values('Aprenda PHP','Mario Molina','Emece',18.20,null); insert into libros values('Cervantes y el quijote','Bioy Casares- J.L. Borges','Paidos',null,100); insert into libros values('Manual de PHP', 'J.C. Paez', 'Siglo XXI',31.80,120); insert into libros values('Harry Potter y la piedra filosofal','J.K. Rowling',default,45.00,90); insert into libros values('Harry Potter y la camara secreta','J.K. Rowling','Emece',null,100); insert into libros values('Alicia en el pais de las maravillas','Lewis Carroll','Paidos',22.50,200); insert into libros values('PHP de la A a la Z',null,null,null,0);

select editorial, count(*) from libros group by editorial;

select editorial, count(precio) from libros group by editorial;

select editorial, sum(precio) from libros group by editorial;

select editorial, max(precio) as mayor, min(precio) as menor from libros group by editorial;

select editorial, avg(precio) from libros group by editorial;

select editorial, count(*) from libros where precio<30

group by editorial;

select editorial, count(*) from libros where precio<30 group by all editorial;

37 - Agrupar registros (group by)


Primer problema:
Un comercio que tiene un stand en una feria registra en una tabla llamada "visitantes" algunos datos de las personas que visitan o compran en su stand para luego enviarle publicidad de sus productos. 1- Elimine la tabla "visitantes", si existe: if object_id('visitantes') is not null drop table visitantes; 2- Cree la tabla con la siguiente estructura: create table visitantes( nombre varchar(30), edad tinyint, sexo char(1) default 'f', domicilio varchar(30), ciudad varchar(20) default 'Cordoba', telefono varchar(11), mail varchar(30) default 'no tiene', montocompra decimal (6,2) ); 3- Ingrese algunos registros: insert into visitantes values ('Susana Molina',35,default,'Colon 123',default,null,null,59.80); insert into visitantes values ('Marcos Torres',29,'m',default,'Carlos Paz',default,'marcostorres@hotmail.com',150.50); insert into visitantes values ('Mariana Juarez',45,default,default,'Carlos Paz',null,default,23.90); insert into visitantes (nombre, edad,sexo,telefono, mail) values ('Fabian Perez',36,'m','4556677','fabianperez@xaxamail.com'); insert into visitantes (nombre, ciudad, montocompra) values ('Alejandra Gonzalez','La Falda',280.50); insert into visitantes (nombre, edad,sexo, ciudad, mail,montocompra) values ('Gaston Perez',29,'m','Carlos Paz','gastonperez1@gmail.com',95.40);

insert into visitantes values ('Liliana Torres',40,default,'Sarmiento 876',default,default,default,85); insert into visitantes values ('Gabriela Duarte',21,null,null,'Rio Tercero',default,'gabrielaltorres@hotmail.com',321.50); 4- Queremos saber la cantidad de visitantes de cada ciudad utilizando la clusula "group by" (4 filas devueltas) 5- Queremos la cantidad visitantes con telfono no nulo, de cada ciudad (4 filas devueltas) 6- Necesitamos el total del monto de las compras agrupadas por sexo (3 filas) 7- Se necesita saber el mximo y mnimo valor de compra agrupados por sexo y ciudad (6 filas) 8- Calcule el promedio del valor de compra agrupados por ciudad (4 filas) 9- Cuente y agrupe por ciudad sin tener en cuenta los visitantes que no tienen mail (3 filas): 10- Realice la misma consulta anterior, pero use la palabra clave "all" para mostrar todos los valores de ciudad, incluyendo las que devuelven cero o "null" en la columna de agregado (4 filas) Ver solucin if object_id('visitantes') is not null drop table visitantes; create table visitantes( nombre varchar(30), edad tinyint, sexo char(1) default 'f', domicilio varchar(30), ciudad varchar(20) default 'Cordoba', telefono varchar(11), mail varchar(30) default 'no tiene', montocompra decimal (6,2) ); insert into visitantes values ('Susana Molina',35,default,'Colon 123',default,null,null,59.80); insert into visitantes values ('Marcos Torres',29,'m',default,'Carlos Paz',default,'marcostorres@hotmail.com',150.50); insert into visitantes values ('Mariana Juarez',45,default,default,'Carlos Paz',null,default,23.90); insert into visitantes (nombre, edad,sexo,telefono, mail) values ('Fabian Perez',36,'m','4556677','fabianperez@xaxamail.com'); insert into visitantes (nombre, ciudad, montocompra) values ('Alejandra Gonzalez','La Falda',280.50); insert into visitantes (nombre, edad,sexo, ciudad, mail,montocompra)

values ('Gaston Perez',29,'m','Carlos Paz','gastonperez1@gmail.com',95.40); insert into visitantes values ('Liliana Torres',40,default,'Sarmiento 876',default,default,default,85); insert into visitantes values ('Gabriela Duarte',21,null,null,'Rio Tercero',default,'gabrielaltorres@hotmail.com',321.50); select ciudad, count(*) from visitantes group by ciudad; select ciudad, count(telefono) from visitantes group by ciudad; select sexo, sum(montocompra) from visitantes group by sexo; select sexo,ciudad, max(montocompra) as mayor, min(montocompra) as menor from visitantes group by sexo,ciudad; select ciudad, avg(montocompra) as 'promedio de compras' from visitantes group by ciudad; select ciudad, count(*) as 'cantidad con mail' from visitantes where mail is not null and mail<>'no tiene' group by ciudad; select ciudad, count(*) as 'cantidad con mail' from visitantes where mail is not null and mail<>'no tiene' group by all ciudad;

Segundo problema:
Una empresa almacena los datos de sus empleados en una tabla "empleados". 1- Elimine la tabla, si existe: if object_id('empleados') is not null drop table empleados; 2- Cree la tabla: create table empleados( nombre varchar(30), documento char(8), domicilio varchar(30), seccion varchar(20), sueldo decimal(6,2), cantidadhijos tinyint, fechaingreso datetime, primary key(documento) ); 3- Ingrese algunos registros: insert into empleados values('Juan Perez','22333444','Colon 123','Gerencia',5000,2,'1980-0510'); insert into empleados values('Ana Acosta','23444555','Caseros 987','Secretaria',2000,0,'198010-12'); insert into empleados values('Lucas Duarte','25666777','Sucre 235','Sistemas',4000,1,'198505-25'); insert into empleados values('Pamela Gonzalez','26777888','Sarmiento 873','Secretaria',2200,3,'1990-06-25'); insert into empleados

values('Marcos Juarez','30000111','Rivadavia 801','Contaduria',3000,0,'1996-05-01'); insert into empleados values('Yolanda Perez','35111222','Colon 180','Administracion',3200,1,'1996-05-01'); insert into empleados values('Rodolfo Perez','35555888','Coronel Olmedo 588','Sistemas',4000,3,'1996-05-01'); insert into empleados values('Martina Rodriguez','30141414','Sarmiento 1234','Administracion',3800,4,'2000-09-01'); insert into empleados values('Andres Costa','28444555',default,'Secretaria',null,null,null); 4- Cuente la cantidad de empleados agrupados por seccin (5 filas) 5- Calcule el promedio de hijos por seccin (5 filas): 6- Cuente la cantidad de empleados agrupados por ao de ingreso (6 filas) 7- Calcule el promedio de sueldo por seccin de los empleados con hijos (4 filas) 8- Realice la misma consulta anterior pero esta vez incluya las secciones que devuelven cero o "null" en la columna de agregado (5 filas)

Ver solucin
if object_id('empleados') is not null drop table empleados; create table empleados( nombre varchar(30), documento char(8), domicilio varchar(30), seccion varchar(20), sueldo decimal(6,2), cantidadhijos tinyint, fechaingreso datetime, primary key(documento) ); insert into empleados values('Juan Perez','22333444','Colon 123','Gerencia',5000,2,'1980-0510'); insert into empleados values('Ana Acosta','23444555','Caseros 987','Secretaria',2000,0,'198010-12'); insert into empleados values('Lucas Duarte','25666777','Sucre 235','Sistemas',4000,1,'198505-25'); insert into empleados values('Pamela Gonzalez','26777888','Sarmiento 873','Secretaria',2200,3,'1990-06-25'); insert into empleados

values('Marcos Juarez','30000111','Rivadavia 801','Contaduria',3000,0,'1996-05-01'); insert into empleados values('Yolanda Perez','35111222','Colon 180','Administracion',3200,1,'1996-05-01'); insert into empleados values('Rodolfo Perez','35555888','Coronel Olmedo 588','Sistemas',4000,3,'1996-05-01'); insert into empleados values('Martina Rodriguez','30141414','Sarmiento 1234','Administracion',3800,4,'2000-09-01'); insert into empleados values('Andres Costa','28444555',default,'Secretaria',null,null,null); select seccion, count(*) from empleados group by seccion; select seccion, avg(cantidadhijos) as 'promedio de hijos' from empleados group by seccion; select datepart(year,fechaingreso), count(*) from empleados group by datepart(year,fechaingreso); select seccion, avg(sueldo) as 'promedio de sueldo' from empleados where cantidadhijos>0 and cantidadhijos is not null group by seccion; select seccion, avg(sueldo) as 'promedio de sueldo' from empleados where cantidadhijos>0 and cantidadhijos is not null group by all seccion;

38 - Seleccionar grupos (having)


As como la clusula "where" permite seleccionar (o rechazar) registros individuales; la clusula "having" permite seleccionar (o rechazar) un grupo de registros. Si queremos saber la cantidad de libros agrupados por editorial usamos la siguiente instruccin ya aprendida:
select editorial, count(*) from libros group by editorial;

Si queremos saber la cantidad de libros agrupados por editorial pero considerando slo algunos grupos, por ejemplo, los que devuelvan un valor mayor a 2, usamos la siguiente instruccin:
select editorial, count(*) from libros group by editorial having count(*)>2;

Se utiliza "having", seguido de la condicin de bsqueda, para seleccionar ciertas filas retornadas por la clusula "group by". Veamos otros ejemplos. Queremos el promedio de los precios de los libros agrupados por editorial, pero solamente de aquellos grupos cuyo promedio supere los 25 pesos:
select editorial, avg(precio) from libros group by editorial having avg(precio)>25;

En algunos casos es posible confundir las clusulas "where" y "having". Queremos contar los registros agrupados por editorial sin tener en cuenta a la editorial "Planeta". Analicemos las siguientes sentencias:
select editorial, count(*) from libros where editorial<>'Planeta' group by editorial; select editorial, count(*) from libros group by editorial having editorial<>'Planeta';

Ambas devuelven el mismo resultado, pero son diferentes. La primera, selecciona todos los registros rechazando los de editorial "Planeta" y luego los agrupa para contarlos. La segunda, selecciona todos los registros, los agrupa para contarlos y finalmente rechaza fila con la cuenta correspondiente a la editorial "Planeta". No debemos confundir la clusula "where" con la clusula "having"; la primera establece condiciones para la seleccin de registros de un "select"; la segunda establece condiciones para la seleccin de registros de una salida "group by". Veamos otros ejemplos combinando "where" y "having". Queremos la cantidad de libros, sin considerar los que tienen precio nulo, agrupados por editorial, sin considerar la editorial "Planeta":
select editorial, count(*) from libros where precio is not null group by editorial having editorial<>'Planeta';

Aqu, selecciona los registros rechazando los que no cumplan con la condicin dada en "where", luego los agrupa por "editorial" y finalmente rechaza los grupos que no cumplan con la condicin dada en el "having". Se emplea la clusula "having" con funciones de agrupamiento, esto no puede hacerlo la clusula "where". Por ejemplo queremos el promedio de los precios agrupados por editorial, de aquellas editoriales que tienen ms de 2 libros:
select editorial, avg(precio) from libros group by editorial having count(*) > 2;

En una clusula "having" puede haber hasta 128 condiciones. Cuando utilice varias condiciones, tiene que combinarlas con operadores lgicos (and, or, not). Podemos encontrar el mayor valor de los libros agrupados y ordenados por editorial y seleccionar las filas que tengan un valor menor a 100 y mayor a 30:
select editorial, max(precio) as 'mayor' from libros group by editorial having min(precio)<100 and min(precio)>30 order by editorial;

Entonces, usamos la clasula "having" para restringir las filas que devuelve una salida "group by". Va siempre despus de la clusula "group by" y antes de la clusula "order by" si la hubiere.

38 - Seleccionar grupos (having)


Problema: Trabajamos con la tabla "libros" de una librera. Eliminamos la tabla, si existe:
if object_id('libros') is not null drop table libros;

Creamos la tabla:
create table libros( codigo int identity, titulo varchar(40), autor varchar(30), editorial varchar(15), precio decimal(5,2), cantidad tinyint,

primary key(codigo) );

Ingresamos algunos registros:


insert into libros values('El aleph','Borges','Planeta',35,null); insert into libros values('Martin Fierro','Jose Hernandez','Emece',22.20,200); insert into libros values('Martin Fierro','Jose Hernandez','Planeta',40,200); insert into libros values('Antologia poetica','J.L. Borges','Planeta',null,150); insert into libros values('Aprenda PHP','Mario Molina','Emece',18,null); insert into libros values('Manual de PHP', 'J.C. Paez', 'Siglo XXI',56,120); insert into libros values('Cervantes y el quijote','Bioy Casares- J.L. Borges','Paidos',null,100); insert into libros values('Harry Potter y la piedra filosofal','J.K. Rowling',default,45.00,90); insert into libros values('Harry Potter y la camara secreta','J.K. Rowling','Emece',null,100); insert into libros values('Alicia en el pais de las maravillas','Lewis Carroll','Paidos',42,80); insert into libros values('PHP de la A a la Z',null,null,110,0); insert into libros values('Uno','Richard Bach','Planeta',25,null);

Queremos saber la cantidad de libros agrupados por editorial pero considerando slo algunos grupos, por ejemplo, los que devuelvan un valor mayor a 2, usamos la siguiente instruccin:
select editorial, count(*) from libros group by editorial having count(*)>2;

Queremos el promedio de los precios de los libros agrupados por editorial, pero solamente de aquellos grupos cuyo promedio supere los 25 pesos:
select editorial, avg(precio) from libros group by editorial having avg(precio)>25;

Queremos la cantidad de libros, sin considerar los que tienen precio nulo (where), agrupados por editorial (group by), sin considerar la editorial "Planeta" (having):
select editorial, count(*) from libros

where precio is not null group by editorial having editorial<>'Planeta';

Necesitamos el promedio de los precios agrupados por editorial, de aquellas editoriales que tienen ms de 2 libros:
select editorial, avg(precio) from libros group by editorial having count(*) > 2;

Buscamos el mayor valor de los libros agrupados y ordenados por editorial y seleccionamos las filas que tienen un valor menor a 100 y mayor a 30:
select editorial, max(precio) as 'mayor' from libros group by editorial having max(precio)<100 and max(precio)>30 order by editorial;

if object_id('libros') is not null drop table libros;

create table libros( codigo int identity, titulo varchar(40), autor varchar(30), editorial varchar(15), precio decimal(5,2), cantidad tinyint, primary key(codigo) );

insert into libros values('El aleph','Borges','Planeta',35,null); insert into libros

values('Martin Fierro','Jose Hernandez','Emece',22.20,200); insert into libros values('Martin Fierro','Jose Hernandez','Planeta',40,200); insert into libros values('Antologia poetica','J.L. Borges','Planeta',null,150); insert into libros values('Aprenda PHP','Mario Molina','Emece',18,null); insert into libros values('Manual de PHP', 'J.C. Paez', 'Siglo XXI',56,120); insert into libros values('Cervantes y el quijote','Bioy Casares- J.L. Borges','Paidos',null,100); insert into libros values('Harry Potter y la piedra filosofal','J.K. Rowling',default,45.00,90); insert into libros values('Harry Potter y la camara secreta','J.K. Rowling','Emece',null,100); insert into libros values('Alicia en el pais de las maravillas','Lewis Carroll','Paidos',42,80); insert into libros values('PHP de la A a la Z',null,null,110,0); insert into libros values('Uno','Richard Bach','Planeta',25,null);

select editorial, count(*) from libros group by editorial having count(*)>2;

select editorial, avg(precio) from libros group by editorial having avg(precio)>25;

select editorial, count(*) from libros where precio is not null group by editorial having editorial<>'Planeta';

select editorial, avg(precio) from libros group by editorial having count(*) > 2;

select editorial, max(precio) as 'mayor' from libros group by editorial having max(precio)<100 and max(precio)>30 order by editorial;

38 - Seleccionar grupos (having)


Primer problema:
Una empresa tiene registrados sus clientes en una tabla llamada "clientes". 1- Elimine la tabla "clientes", si existe: if object_id('clientes') is not null drop table clientes; 2- Crela con la siguiente estructura: create table clientes ( codigo int identity,

nombre varchar(30) not null, domicilio varchar(30), ciudad varchar(20), provincia varchar (20), telefono varchar(11), primary key(codigo) ); 3- Ingrese algunos registros: insert into clientes values ('Lopez Marcos','Colon 111','Cordoba','Cordoba','null'); insert into clientes values ('Perez Ana','San Martin 222','Cruz del Eje','Cordoba','4578585'); insert into clientes values ('Garcia Juan','Rivadavia 333','Villa del Rosario','Cordoba','4578445'); insert into clientes values ('Perez Luis','Sarmiento 444','Rosario','Santa Fe',null); insert into clientes values ('Pereyra Lucas','San Martin 555','Cruz del Eje','Cordoba','4253685'); insert into clientes values ('Gomez Ines','San Martin 666','Santa Fe','Santa Fe','0345252525'); insert into clientes values ('Torres Fabiola','Alem 777','Villa del Rosario','Cordoba','4554455'); insert into clientes values ('Lopez Carlos',null,'Cruz del Eje','Cordoba',null); insert into clientes values ('Ramos Betina','San Martin 999','Cordoba','Cordoba','4223366'); insert into clientes values ('Lopez Lucas','San Martin 1010','Posadas','Misiones','0457858745'); 4- Obtenga el total de los registros agrupados por ciudad y provincia (6 filas) 5- Obtenga el total de los registros agrupados por ciudad y provincia sin considerar los que tienen menos de 2 clientes (3 filas) 6- Obtenga el total de los clientes que viven en calle "San Martin" (where), agrupados por provincia (group by), teniendo en cuenta todos los valores (all), de aquellas ciudades que tengan menos de 2 clientes (having) y omitiendo la fila correspondiente a la ciudad de "Cordoba" (having) (4 filas devueltas) if object_id('clientes') is not null drop table clientes; create table clientes ( codigo int identity, nombre varchar(30) not null, domicilio varchar(30),

ciudad varchar(20), provincia varchar (20), telefono varchar(11), primary key(codigo) ); insert into clientes values ('Lopez Marcos','Colon 111','Cordoba','Cordoba','null'); insert into clientes values ('Perez Ana','San Martin 222','Cruz del Eje','Cordoba','4578585'); insert into clientes values ('Garcia Juan','Rivadavia 333','Villa del Rosario','Cordoba','4578445'); insert into clientes values ('Perez Luis','Sarmiento 444','Rosario','Santa Fe',null); insert into clientes values ('Pereyra Lucas','San Martin 555','Cruz del Eje','Cordoba','4253685'); insert into clientes values ('Gomez Ines','San Martin 666','Santa Fe','Santa Fe','0345252525'); insert into clientes values ('Torres Fabiola','Alem 777','Villa del Rosario','Cordoba','4554455'); insert into clientes values ('Lopez Carlos',null,'Cruz del Eje','Cordoba',null); insert into clientes values ('Ramos Betina','San Martin 999','Cordoba','Cordoba','4223366'); insert into clientes values ('Lopez Lucas','San Martin 1010','Posadas','Misiones','0457858745'); select ciudad, provincia, count(*) as cantidad from clientes group by ciudad,provincia; select ciudad, provincia, count(*) as cantidad from clientes group by ciudad,provincia having count(*)>1; select ciudad, count(*) from clientes where domicilio like '%San Martin%' group by all ciudad having count(*)<2 and ciudad <> 'Cordoba';

39 - Modificador del group by (with rollup)

Podemos combinar "group by" con los operadores "rollup" y "cube" para generar valores de resumen a la salida. El operador "rollup" resume valores de grupos. representan los valores de resumen de la precedente. Tenemos la tabla "visitantes" con los siguientes campos: nombre, edad, sexo, domicilio, ciudad, telefono, montocompra. Si necesitamos la cantidad de visitantes por ciudad empleamos la siguiente sentencia:
select ciudad,count(*) as cantidad from visitantes group by ciudad;

Esta consulta muestra el total de visitantes agrupados por ciudad; pero si queremos adems la cantidad total de visitantes, debemos realizar otra consulta:
select count(*) as total from visitantes;

Para obtener ambos resultados en una sola consulta podemos usar "with rollup" que nos devolver ambas salidas en una sola consulta:
select ciudad,count(*) as cantidad from visitantes group by ciudad with rollup;

La consulta anterior retorna los registros agrupados por ciudad y una fila extra en la que la primera columna contiene "null" y la columna con la cantidad muestra la cantidad total. La clusula "group by" permite agregar el modificador "with rollup", el cual agrega registros extras al resultado de una consulta, que muestran operaciones de resumen. Si agrupamos por 2 campos, "ciudad" y "sexo":
select ciudad,sexo,count(*) as cantidad from visitantes group by ciudad,sexo with rollup;

La salida muestra los totales por ciudad y sexo y produce tantas filas extras como valores existen del primer campo por el que se agrupa ("ciudad" en este caso), mostrando los totales para cada valor, con la columna correspondiente al segundo campo por el que se agrupa ("sexo" en este ejemplo) conteniendo "null", y 1 fila extra mostrando el total de todos los visitantes (con las columnas correspondientes a ambos campos conteniendo "null"). Es decir, por cada agrupacin, aparece una fila extra con el/ los campos que no se consideran, seteados a "null".

Con "rollup" se puede agrupar hasta por 10 campos. Es posible incluir varias funciones de agrupamiento, por ejemplo, queremos la cantidad de visitantes y la suma de sus compras agrupados por ciudad y sexo:
select ciudad,sexo, count(*) as cantidad, sum(montocompra) as total from visitantes group by ciudad,sexo with rollup;

Entonces, "rollup" es un modificador para "group by" que agrega filas extras mostrando resultados de resumen de los subgrupos. Si se agrupa por 2 campos SQL Server genera tantas filas extras como valores existen del primer campo (con el segundo campo seteado a "null") y una fila extra con ambos campos conteniendo "null". Con "rollup" se puede emplear "where" y "having", pero no es compatible con "all".

39 - Modificador del group by (with rollup)


Problema: Un comercio que tiene un stand en una feria registra en una tabla llamada "visitantes" algunos datos de las personas que visitan o compran en su stand para luego enviarle publicidad de sus productos. Eliminamos la tabla si existe:
if object_id('visitantes') is not null drop table visitantes;

La creamos con la siguiente estructura:


create table visitantes( nombre varchar(30), edad tinyint, sexo char(1), domicilio varchar(30), ciudad varchar(20), telefono varchar(11), montocompra decimal(6,2) not null );

Ingresamos algunos registros:


insert into visitantes

values ('Susana Molina',28,'f',null,'Cordoba',null,45.50); insert into visitantes values ('Marcela Mercado',36,'f','Avellaneda 345','Cordoba','4545454',22.40); insert into visitantes values ('Alberto Garcia',35,'m','Gral. Paz 123','Alta Gracia','03547123456',25); insert into visitantes values ('Teresa Garcia',33,'f',default,'Alta Gracia','03547123456',120); insert into visitantes values ('Roberto Perez',45,'m','Urquiza 335','Cordoba','4123456',33.20); insert into visitantes values ('Marina Torres',22,'f','Colon 222','Villa Dolores','03544112233',95); insert into visitantes values ('Julieta Gomez',24,'f','San Martin 333','Alta Gracia',null,53.50); insert into visitantes values ('Roxana Lopez',20,'f','null','Alta Gracia',null,240); insert into visitantes values ('Liliana Garcia',50,'f','Paso 999','Cordoba','4588778',48); insert into visitantes values ('Juan Torres',43,'m','Sarmiento 876','Cordoba',null,15.30);

Necesitamos la cantidad de visitantes por ciudad y el total de visitantes. Para obtener ambos resultados en una sola consulta empleamos "with rollup":
select ciudad, count(*) as cantidad from visitantes group by ciudad with rollup;

La consulta anterior retorna los registros agrupados por ciudad y una fila extra (la cuarta) en la que la primera columna contiene "null" y la columna con la cantidad muestra la cantidad total. Veamos las filas de resumen cuando agrupamos por 2 campos, "ciudad" y "sexo":
select ciudad,sexo, count(*) as cantidad from visitantes group by ciudad,sexo with rollup;

La salida muestra los totales por ciudad y sexo (5 filas) y produce 4 filas extras, 3 muestran los totales para cada ciudad (con la columna correspondiente al sexo conteniendo "null") y 1 mostrando el total de todos los visitantes (con las columnas correspondientes a la ciudad y al sexo conteniendo "null"). Podemos incluir varias funciones de agrupamiento; para conocer la cantidad de visitantes y la suma de sus compras agrupados por ciudad y sexo, tipeamos:

select ciudad,sexo, count(*) as cantidad, sum(montocompra) as total from visitantes group by ciudad,sexo with rollup;

Note que por cada agrupacin aparece una fila extra con valores de resumen.
if object_id('visitantes') is not null drop table visitantes;

create table visitantes( nombre varchar(30), edad tinyint, sexo char(1), domicilio varchar(30), ciudad varchar(20), telefono varchar(11), montocompra decimal(6,2) not null );

insert into visitantes values ('Susana Molina',28,'f',null,'Cordoba',null,45.50); insert into visitantes values ('Marcela Mercado',36,'f','Avellaneda 345','Cordoba','4545454',22.40); insert into visitantes values ('Alberto Garcia',35,'m','Gral. Paz 123','Alta Gracia','03547123456',25); insert into visitantes values ('Teresa Garcia',33,'f',default,'Alta Gracia','03547123456',120);

insert into visitantes values ('Roberto Perez',45,'m','Urquiza 335','Cordoba','4123456',33.20); insert into visitantes values ('Marina Torres',22,'f','Colon 222','Villa Dolores','03544112233',95); insert into visitantes values ('Julieta Gomez',24,'f','San Martin 333','Alta Gracia',null,53.50); insert into visitantes values ('Roxana Lopez',20,'f','null','Alta Gracia',null,240); insert into visitantes values ('Liliana Garcia',50,'f','Paso 999','Cordoba','4588778',48); insert into visitantes values ('Juan Torres',43,'m','Sarmiento 876','Cordoba',null,15.30);

select ciudad, count(*) as cantidad from visitantes group by ciudad with rollup;

select ciudad,sexo, count(*) as cantidad from visitantes group by ciudad,sexo with rollup;

select ciudad,sexo, count(*) as cantidad,

sum(montocompra) as total from visitantes group by ciudad,sexo with rollup;

39 - Modificador del group by (with rollup)


Primer problema:
Una empresa tiene registrados sus clientes en una tabla llamada "clientes". 1- Elimine la tabla "clientes", si existe: if object_id('clientes') is not null drop table clientes; 2- Crela con la siguiente estructura: create table clientes ( codigo int identity, nombre varchar(30) not null, domicilio varchar(30), ciudad varchar(20), estado varchar (20), pais varchar(20), primary key(codigo) ); 3- Ingrese algunos registros: insert into clientes values ('Lopez Marcos','Colon 111', 'Cordoba','Cordoba','Argentina'); insert into clientes values ('Perez Ana','San Martin 222', 'Carlos Paz','Cordoba','Argentina'); insert into clientes values ('Garcia Juan','Rivadavia 333', 'Carlos Paz','Cordoba','Argentina'); insert into clientes values ('Perez Luis','Sarmiento 444', 'Rosario','Santa Fe','Argentina'); insert into clientes values ('Gomez Ines','San Martin 987', 'Santa Fe','Santa Fe','Argentina'); insert into clientes values ('Gomez Ines','San Martin 666', 'Santa Fe','Santa Fe','Argentina'); insert into clientes values ('Lopez Carlos','Irigoyen 888', 'Cordoba','Cordoba','Argentina'); insert into clientes

values ('Ramos Betina','San Martin 999', 'Cordoba','Cordoba','Argentina'); insert into clientes values ('Fernando Salas','Mariano Osorio 1234', 'Santiago','Region metropolitana','Chile'); insert into clientes values ('German Rojas','Allende 345', 'Valparaiso','Region V','Chile'); insert into clientes values ('Ricardo Jara','Pablo Neruda 146', 'Santiago','Region metropolitana','Chile'); insert into clientes values ('Joaquin Robles','Diego Rivera 147', 'Guadalajara','Jalisco','Mexico'); 4- Necesitamos la cantidad de clientes por pas y la cantidad total de clientes en una sola consulta (4 filas) Note que la consulta retorna los registros agrupados por pais y una fila extra en la que la columna "pais" contiene "null" y la columna con la cantidad muestra la cantidad total. 5- Necesitamos la cantidad de clientes agrupados por pais y estado, incluyendo resultados paciales (9 filas) Note que la salida muestra los totales por pais y estado y produce 4 filas extras: 3 muestran los totales para cada pais, con la columna "estado" conteniendo "null" y 1 muestra el total de todos los clientes, con las columnas "pais" y "estado" conteniendo "null". 6- Necesitamos la cantidad de clientes agrupados por pais, estado y ciudad, empleando "rollup" (16 filas) El resultado muestra los totales por pais, estado y ciudad y genera 9 filas extras: 5 muestran los totales para cada estado, con la columna correspondiente a "ciudad" conteniendo "null", 3 muestran los totales para cada pais, con las columnas "ciudad" y "estado" conteniendo "null" y 1 muestra el total de todos los clientes, con las columnas "pais", "estado" y "ciudad" conteniendo "null". if object_id('clientes') is not null drop table clientes; create table clientes ( codigo int identity, nombre varchar(30) not null, domicilio varchar(30), ciudad varchar(20), estado varchar (20), pais varchar(20), primary key(codigo) ); insert into clientes values ('Lopez Marcos','Colon 111', 'Cordoba','Cordoba','Argentina');

insert into clientes values ('Perez Ana','San Martin 222', 'Carlos Paz','Cordoba','Argentina'); insert into clientes values ('Garcia Juan','Rivadavia 333', 'Carlos Paz','Cordoba','Argentina'); insert into clientes values ('Perez Luis','Sarmiento 444', 'Rosario','Santa Fe','Argentina'); insert into clientes values ('Gomez Ines','San Martin 987', 'Santa Fe','Santa Fe','Argentina'); insert into clientes values ('Gomez Ines','San Martin 666', 'Santa Fe','Santa Fe','Argentina'); insert into clientes values ('Lopez Carlos','Irigoyen 888', 'Cordoba','Cordoba','Argentina'); insert into clientes values ('Ramos Betina','San Martin 999', 'Cordoba','Cordoba','Argentina'); insert into clientes values ('Fernando Salas','Mariano Osorio 1234', 'Santiago','Region metropolitana','Chile'); insert into clientes values ('German Rojas','Allende 345', 'Valparaiso','Region V','Chile'); insert into clientes values ('Ricardo Jara','Pablo Neruda 146', 'Santiago','Region metropolitana','Chile'); insert into clientes values ('Joaquin Robles','Diego Rivera 147', 'Guadalajara','Jalisco','Mexico'); select pais,count(*) as cantidad from clientes group by pais with rollup; select pais,estado, count(*) as cantidad from clientes group by pais,estado with rollup; select pais,estado,ciudad, count(*) as cantidad from clientes group by pais,estado,ciudad with rollup;

40 - Modificador del group by (with cube)


Hemos aprendido el modificador "rollup", que agrega filas extras mostrando resultados de resumen por cada grupo y subgrupo. Por ejemplo, tenemos una tabla llamada "empleados" que contiene, entre otros, los campos "sexo", "estadocivil" y "seccion". Si se agrupa por esos tres campos (en ese orden) y se emplea "rollup":
select sexo,estadocivil,seccion, count(*) from empleados group by sexo,estadocivil,seccion with rollup;

SQL Server genera varias filas extras con informacin de resumen para los siguientes subgrupos:
- sexo y estadocivil (seccion seteado a "null"), - sexo (estadocivil y seccion seteados a "null") y - total (todos los campos seteados a "null").

Si se emplea "cube":
select sexo,estadocivil,seccion, count(*) from empleados group by sexo,estadocivil,seccion with cube;

retorna ms filas extras adems de las anteriores:


sexo y seccion (estadocivil estadocivil y seccion (sexo seccion (sexo y estadocivil estadocivil (sexo y seccion seteado a "null"), seteado a "null"), seteados a "null") y seteados a "null"),

Es decir, "cube" genera filas de resumen de subgrupos para todas las combinaciones posibles de los valores de los campos por los que agrupamos. Se pueden colocar hasta 10 campos en el "group by". Con "cube" se puede emplear "where" y "having", pero no es compatible con "all".

40 - Modificador del group by (with cube)


Problema:

Una empresa tiene registrados sus empleados en una tabla llamada "empleados". Elimine la tabla si existe:
if object_id('empleados') is not null drop table empleados;

Crela con la siguiente estructura:


create table empleados ( documento varchar(8) not null, nombre varchar(30), sexo char(1), estadocivil char(1),--c=casado, s=soltero,v=viudo seccion varchar(20), primary key (documento) );

Ingrese algunos registros:


insert into empleados values ('22222222','Alberto Lopez','m','c','Sistemas'); insert into empleados values ('23333333','Beatriz Garcia','f','c','Administracion'); insert into empleados values ('24444444','Carlos Fuentes','m','s','Administracion'); insert into empleados values ('25555555','Daniel Garcia','m','s','Sistemas'); insert into empleados values ('26666666','Ester Juarez','f','c','Sistemas'); insert into empleados values ('27777777','Fabian Torres','m','s','Sistemas'); insert into empleados values ('28888888','Gabriela Lopez','f','c','Sistemas'); insert into empleados values ('29999999','Hector Garcia','m','c','Administracion'); insert into empleados values ('30000000','Ines Torres','f','c','Administracion'); insert into empleados values ('11111111','Juan Garcia','m','v','Administracion'); insert into empleados values ('12222222','Luisa Perez','f','v','Administracion'); insert into empleados values ('31111111','Marcela Garcia','f','s','Administracion'); insert into empleados values ('32222222','Nestor Fuentes','m','c','Sistemas'); insert into empleados values ('33333333','Oscar Garcia','m','s','Sistemas'); insert into empleados values ('34444444','Patricia Juarez','f','c','Administracion'); insert into empleados values ('35555555','Roberto Torres','m','c','Sistemas'); insert into empleados values ('36666666','Susana Torres','f','c','Administracion');

Agrupamos por "sexo", "estadocivil" y "seccion" empleando "rollup":


select sexo,estadocivil,seccion, count(*) from empleados group by sexo,estadocivil,seccion with rollup;

SQL Server genera varias filas extras con informacin de resumen para los siguientes subgrupos:
- sexo y estadocivil (seccion seteado a "null"), - sexo (estadocivil e hijos seteados a "null") y - total (todos los campos seteados a "null").

Si empleamos "cube":
select sexo,estadocivil,seccion, count(*) from empleados group by sexo,estadocivil,seccion with cube;

retorna ms filas extras adems de las anteriores:


sexo y seccion (estadocivil seteado a "null"), estadocivil y seccion (sexo seteado a "null"), seccion (sexo y estadocivil seteados a "null") y estadocivil (sexo e hijos seteados a "null").

if object_id('empleados') is not null drop table empleados; create table empleados ( documento varchar(8) not null, nombre varchar(30), sexo char(1),

estadocivil char(1),--c=casado, s=soltero,v=viudo seccion varchar(20), primary key (documento) ); insert into empleados values ('22222222','Alberto Lopez','m','c','Sistemas'); insert into empleados values ('23333333','Beatriz Garcia','f','c','Administracion'); insert into empleados values ('24444444','Carlos Fuentes','m','s','Administracion'); insert into empleados

values ('25555555','Daniel Garcia','m','s','Sistemas'); insert into empleados values ('26666666','Ester Juarez','f','c','Sistemas'); insert into empleados values ('27777777','Fabian Torres','m','s','Sistemas'); insert into empleados values ('28888888','Gabriela Lopez','f','c','Sistemas'); insert into empleados values ('29999999','Hector Garcia','m','c','Administracion'); insert into empleados values ('30000000','Ines Torres','f','c','Administracion');

insert into empleados values ('11111111','Juan Garcia','m','v','Administracion'); insert into empleados values ('12222222','Luisa Perez','f','v','Administracion'); insert into empleados values ('31111111','Marcela Garcia','f','s','Administracion'); insert into empleados values ('32222222','Nestor Fuentes','m','c','Sistemas'); insert into empleados values ('33333333','Oscar Garcia','m','s','Sistemas'); insert into empleados

values ('34444444','Patricia Juarez','f','c','Administracion'); insert into empleados values ('35555555','Roberto Torres','m','c','Sistemas'); insert into empleados values ('36666666','Susana Torres','f','c','Administracion'); select sexo,estadocivil,seccion, count(*) from empleados group by sexo,estadocivil,seccion with rollup; select sexo,estadocivil,seccion, count(*) from empleados

group by sexo,estadocivil,seccion with cube; 40 - Modificador del group by (with cube)


Primer problema:
Un comercio guarda la informacin de sus ventas en una tabla llamada "ventas" en la que se registra diariamente, el nmero de venta, el monto total de la compra, el tipo de pago (c=contado, t=tarjeta) y el nombre del vendedor. 1- Elimine la tabla si existe: if object_id('ventas') is not null drop table ventas; 2- Cree la tabla: create table ventas( numero int identity, montocompra decimal(6,2), tipopago char(1),--c=contado, t=tarjeta vendedor varchar(30), primary key (numero) ); 3- Ingrese algunos registros: insert into ventas values(100.50,'c','Marisa Perez'); insert into ventas values(200,'c','Marisa Perez'); insert into ventas values(50,'t','Juan Lopez'); insert into ventas values(220,'c','Juan Lopez'); insert into ventas values(150,'t','Marisa Perez'); insert into ventas values(550.80,'c','Marisa Perez'); insert into ventas values(300,'t','Juan Lopez'); insert into ventas values(25,'c','Marisa Perez'); 4- Agrupe por "tipopago" y "vendedor" y cuente la cantidad empleando "rollup". Las agrupaciones de resumen son las siguientes: - vendedor (tipopago seteado a "null"), 2 filas y

- total (todos los campos seteados a "null"), 1 fila 5- Agrupe por "tipopago" y "vendedor" y cuente la cantidad empleando "cube". Las agrupaciones de resumen son las siguientes: - vendedor (tipopago seteado a "null"), 2 filas, - total (todos los campos seteados a "null"), 1 fila y - tipopago (vendedor seteado a "null"), 2 filas. Ver solucin if object_id('ventas') is not null drop table ventas; create table ventas( numero int identity, montocompra decimal(6,2), tipopago char(1),--c=contado, t=tarjeta vendedor varchar(30), primary key (numero) ); insert into ventas values(100.50,'c','Marisa Perez'); insert into ventas values(200,'c','Marisa Perez'); insert into ventas values(50,'t','Juan Lopez'); insert into ventas values(220,'c','Juan Lopez'); insert into ventas values(150,'t','Marisa Perez'); insert into ventas values(550.80,'c','Marisa Perez'); insert into ventas values(300,'t','Juan Lopez'); insert into ventas values(25,'c','Marisa Perez'); select vendedor,tipopago, count(*) as cantidad from ventas group by vendedor,tipopago with rollup; select vendedor,tipopago, count(*) as cantidad from ventas group by vendedor,tipopago with cube;

Segundo problema:
Un comercio que tiene un stand en una feria registra en una tabla llamada "visitantes" algunos datos de las personas que visitan o compran en su stand para luego enviarle publicidad de sus productos. 1- Elimine la tabla "visitantes", si existe: if object_id('visitantes') is not null drop table visitantes; 2- Crela con la siguiente estructura: create table visitantes( nombre varchar(30), edad tinyint, sexo char(1), domicilio varchar(30), ciudad varchar(20), mail varchar(30) default 'no tiene', montocompra decimal(6,2) ); 3- Ingrese algunos registros: insert into visitantes values ('Susana Molina',28,'f',null,'Cordoba',null,45.50); insert into visitantes values ('Marcela Mercado',36,'f','Avellaneda 345','Cordoba',default,22.40); insert into visitantes values ('Alberto Garcia',35,'m',default,'Alta Gracia','albertogarcia@hotmail.com',25); insert into visitantes values ('Teresa Garcia',33,'f',default,'Alta Gracia',default,120); insert into visitantes

values ('Roberto Perez',45,'m',null,'Cordoba','robertoperez@xaxamail.com',33.20); insert into visitantes values ('Marina Torres',22,'f',null,'Villa Dolores',default,95); insert into visitantes values ('Julieta Gomez',24,'f','San Martin 333','Alta Gracia','julietagomez@gmail.com',53.50); insert into visitantes values ('Roxana Lopez',20,'f','null','Alta Gracia',default,240); insert into visitantes values ('Liliana Garcia',50,'f','Paso 999','Cordoba',default,48); insert into visitantes values ('Juan Torres',43,'m','Sarmiento 876','Cordoba',null,15.30); 4- Agrupe por sexo y ciudad y calcule el total de la compra empleando "rollup" y luego "cube": select sexo,ciudad, sum(montocompra) as total from visitantes group by sexo,ciudad with rollup; Se generan 2 filas con "ciudad" conteniendo "null" y 1 fila con ambos campos seteados a "null". select sexo,ciudad, sum(montocompra) as total from visitantes group by sexo,ciudad with cube; Se generan 2 filas con "ciudad" conteniendo "null" (total de sexo femenino y masculino); 1 fila con ambos campos seteados a "null" (monto total de todos los visitantes) y 3 filas con "sexo" conteniendo "null" (monto total de cada ciudad). 5- Calcule la edad promedio de los visitantes agrupando por sexo y ciudad, sin considerar los que no tienen mail, use ambos modificadores de "group by" ("rollup" y "cube"): select sexo,ciudad, avg(edad) as 'edad promedio' from visitantes where mail is not null and mail <>'no tiene' group by sexo,ciudad with rollup; Se generan 2 filas con el promedio de edad por sexo de cada ciudad y 1 fila con el promedio de edad de todos los visitantes. select sexo,ciudad, avg(edad) as 'edad promedio' from visitantes where mail is not null and mail <>'no tiene' group by sexo,ciudad with cube; Se generan 2 filas con el promedio de edad por sexo de cada ciudad, 1 fila con el promedio de edad de todos los visitantes y 3 filas con el promedio de edad por ciudad.

Ver solucin
if object_id('visitantes') is not null drop table visitantes; create table visitantes( nombre varchar(30), edad tinyint, sexo char(1), domicilio varchar(30), ciudad varchar(20), mail varchar(30) default 'no tiene', montocompra decimal(6,2) ); insert into visitantes values ('Susana Molina',28,'f',null,'Cordoba',null,45.50); insert into visitantes values ('Marcela Mercado',36,'f','Avellaneda 345','Cordoba',default,22.40); insert into visitantes values ('Alberto Garcia',35,'m',default,'Alta Gracia','albertogarcia@hotmail.com',25); insert into visitantes values ('Teresa Garcia',33,'f',default,'Alta Gracia',default,120); insert into visitantes values ('Roberto Perez',45,'m',null,'Cordoba','robertoperez@xaxamail.com',33.20); insert into visitantes values ('Marina Torres',22,'f',null,'Villa Dolores',default,95); insert into visitantes values ('Julieta Gomez',24,'f','San Martin 333','Alta Gracia','julietagomez@gmail.com',53.50); insert into visitantes values ('Roxana Lopez',20,'f','null','Alta Gracia',default,240); insert into visitantes values ('Liliana Garcia',50,'f','Paso 999','Cordoba',default,48); insert into visitantes values ('Juan Torres',43,'m','Sarmiento 876','Cordoba',null,15.30); select sexo,ciudad, sum(montocompra) as total from visitantes group by sexo,ciudad with rollup; select sexo,ciudad, sum(montocompra) as total from visitantes group by sexo,ciudad with cube; select sexo,ciudad, avg(edad) as 'edad promedio' from visitantes

where mail is not null and mail <>'no tiene' group by sexo,ciudad with rollup; select sexo,ciudad, avg(edad) as 'edad promedio' from visitantes where mail is not null and mail <>'no tiene' group by sexo,ciudad with cube;

41 - Funcin grouping
La funcin "grouping" se emplea con los operadores "rollup" y "cube" para distinguir los valores de detalle y de resumen en el resultado. Es decir, permite diferenciar si los valores "null" que aparecen en el resultado son valores nulos de las tablas o si son una fila generada por los operadores "rollup" o "cube". Con esta funcin aparece una nueva columna en la salida, una por cada "grouping"; retorna el valor 1 para indicar que la fila representa los valores de resumen de "rollup" o "cube" y el valor 0 para representar los valores de campo. Slo se puede emplear la funcin "grouping" en los campos que aparecen en la clusula "group by". Si tenemos una tabla "visitantes" con los siguientes registros almacenados:
Nombre sexo ciudad ------------------------------Susana Molina f Cordoba Marcela Mercado f Cordoba Roberto Perez f null Alberto Garcia m Cordoba Teresa Garcia f Alta Gracia

y contamos la cantidad agrupando por ciudad (note que hay un valor nulo en dicho campo) empleando "rollup":
select ciudad, count(*) as cantidad from visitantes group by ciudad with rollup;

aparece la siguiente salida:

ciudad cantidad ------------------------NULL 1 Alta Gracia 1 Cordoba 3 NULL 5

La ltima fila es la de resumen generada por "rollup", pero no es posible distinguirla de la primera fila, en la cual "null" es un valor del campo. Para diferenciarla empleamos "grouping":
select ciudad, count(*) as cantidad, grouping(ciudad) as resumen from visitantes group by ciudad with rollup;

aparece la siguiente salida:


ciudad cantidad resumen --------------------------------------NULL 1 0 Alta Gracia 1 0 Cordoba 3 0 NULL 5 1

La ltima fila contiene en la columna generada por "grouping" el valor 1, indicando que es la fila de resumen generada por "rollup"; la primera fila, contiene en dicha columna el valor 0, que indica que el valor "null" es un valor del campo "ciudad". Entonces, si emplea los operadores "rollup" y "cube" y los campos por los cuales agrupa admiten valores nulos, utilice la funcin "grouping" para distinguir los valores de detalle y de resumen en el resultado.

41 - Funcin grouping
Problema: Un comercio que tiene un stand en una feria registra en una tabla llamada "visitantes" algunos datos de las personas que visitan o compran en su stand para luego enviarle publicidad de sus productos. Eliminamos la tabla si existe:
if object_id('visitantes') is not null drop table visitantes;

La creamos con la siguiente estructura:

create table visitantes( nombre varchar(30), sexo char(1), ciudad varchar(20) );

Ingresamos algunos registros:


insert insert insert insert insert into into into into into visitantes visitantes visitantes visitantes visitantes values('Susana Molina', 'f', 'Cordoba'); values('Marcela Mercado', 'f','Cordoba'); values('Roberto Perez','f',null); values('Alberto Garcia','m','Cordoba'); values('Teresa Garcia','f','Alta Gracia');

Contamos la cantidad de visitantes agrupando por ciudad y empleando "rollup":


select ciudad, count(*) as cantidad from visitantes group by ciudad with rollup;

Note que la ltima fila es la de resumen generada por "rollup", pero no es sencillo distinguirla de la primera fila, en la cual "null" es un valor del campo. Para diferenciarla empleamos "grouping":
select ciudad, count(*) as cantidad, grouping(ciudad) as resumen from visitantes group by ciudad with rollup;

Note que la ltima fila contiene en la columna generada por "grouping" el valor 1, indicando que es la fila de resumen generada por "rollup"; la primera fila, contiene en dicha columna el valor 0, lo cual indica que el valor "null" es un valor del campo "ciudad".
if object_id('visitantes') is not null drop table visitantes;

create table visitantes( nombre varchar(30), sexo char(1), ciudad varchar(20)

);

insert into visitantes values('Susana Molina', 'f', 'Cordoba'); insert into visitantes values('Marcela Mercado', 'f','Cordoba'); insert into visitantes values('Roberto Perez','f',null); insert into visitantes values('Alberto Garcia','m','Cordoba'); insert into visitantes values('Teresa Garcia','f','Alta Gracia');

select ciudad, count(*) as cantidad from visitantes group by ciudad with rollup;

select ciudad, count(*) as cantidad, grouping(ciudad) as resumen from visitantes group by ciudad with rollup;

41 - Funcin grouping
Primer problema:
Una empresa tiene registrados sus empleados en una tabla llamada "empleados". 1- Elimine la tabla si existe: if object_id('empleados') is not null drop table empleados; 2- Crela con la siguiente estructura: create table empleados ( documento varchar(8) not null, nombre varchar(30), sexo char(1), estadocivil char(1),--c=casado, s=soltero,v=viudo seccion varchar(20), primary key (documento) ); 3- Ingrese algunos registros: insert into empleados values ('22222222','Alberto Lopez','m','c','Sistemas'); insert into empleados values ('23333333','Beatriz Garcia','f','c','Administracion'); insert into empleados values ('24444444','Carlos Fuentes','m','s','Administracion'); insert into empleados values ('25555555','Daniel Garcia','m','s','Sistemas'); insert into empleados values ('26666666','Ester Juarez',null,'c','Sistemas'); insert into empleados values ('27777777','Fabian Torres',null,'s','Sistemas'); insert into empleados values ('28888888','Gabriela Lopez','f',null,'Sistemas'); insert into empleados values ('29999999','Hector Garcia','m',null,'Administracion'); 4- Cuente la cantidad de empleados agrupados por sexo y estado civil, empleando "rollup". Es dificil distinguir los valores de detalle y resumen. 5- Realice la misma consulta anterior pero emplee la funcin "grouping" para los dos campos por los que se agrupa para distinguir los valores de resumen y de detalle. Note que las columnas de resumen contienen 1 y las de detalle 0. 6- Realice la misma consulta anterior pero con "cube" en lugar de "rollup", distinguiendo los valores de resumen y de detalle. Note que las columnas de resumen contienen 1 y las de detalle 0.

if object_id('empleados') is not null drop table empleados; create table empleados ( documento varchar(8) not null, nombre varchar(30), sexo char(1), estadocivil char(1),--c=casado, s=soltero,v=viudo seccion varchar(20), primary key (documento) ); insert into empleados values ('22222222','Alberto Lopez','m','c','Sistemas'); insert into empleados values ('23333333','Beatriz Garcia','f','c','Administracion'); insert into empleados values ('24444444','Carlos Fuentes','m','s','Administracion'); insert into empleados values ('25555555','Daniel Garcia','m','s','Sistemas'); insert into empleados values ('26666666','Ester Juarez',null,'c','Sistemas'); insert into empleados values ('27777777','Fabian Torres',null,'s','Sistemas'); insert into empleados values ('28888888','Gabriela Lopez','f',null,'Sistemas'); insert into empleados values ('29999999','Hector Garcia','m',null,'Administracion'); select sexo,estadocivil, count(*) as cantidad from empleados group by sexo,estadocivil with rollup; select sexo,estadocivil, count(*) as cantidad, grouping(sexo) as 'resumen sexo', grouping(estadocivil) as 'resumen estado civil' from empleados group by sexo,estadocivil with rollup; select sexo,estadocivil, count(*) as cantidad, grouping(sexo) as 'resumen sexo', grouping(estadocivil) as 'resumen estado civil' from empleados group by sexo,estadocivil with cube;

42 - Clusulas compute y compute by


Las clusulas "compute" y "compute by" generan totales que aparecen en columnas extras al final del resultado. Produce filas de detalle y un valor nico para una columna. Se usa con las funciones de agrupamiento: avg(), count(), max(), min(), sum(). La sintaxis bsica y general es la siguiente:
select CAMPOS from TABLA compute FUNCION(CAMPO);

El campo que se coloque en la clusula "compute" debe estar incluida en la lista de campos del "select". Para ver todos los datos de los visitantes y el promedio del monto de compra de nuestra tabla "visitantes":
select *from visitantes compute avg(montocompra);

Produce la misma salida que las siguientes 2 sentencias:


select *from visitantes; select avg(montocompra) from visitantes;

En una misma instruccin se pueden colocar varias clusulas "compute":


select edad,ciudad,montocompra from visitantes compute avg(edad),sum(montocompra);

"Compute by" genera cortes de control y subtotales. Se generan filas de detalle y varios valores de resumen cuando cambian los valores del campo. Con "compute by" se DEBE usar tambin la clusula "order by" y los campos que se incluyan luego de "by" deben estar en el "order by". Listando varios campos luego del "by" corta un grupo en subgrupos y aplica la funcin de agregado en cada nivel de agrupamiento:
select nombre,ciudad,provincia from visitantes order by provincia compute count(provincia) by provincia;

select nombre,ciudad,provincia from visitantes order by provincia,ciudad compute count(provincia) by provincia,ciudad;

Los campos que aparecen luego de la clusula "compute by" DEBEN ser idnticos a un subconjunto de los campos que aparecen despus de "order by" y estar en el mismo orden. Si la clusula "order by" tiene los siguientes campos:
... order by a,b,c...

la clusula "compute by" puede incluir los siguientes subconjuntos de campos:


... compute ... by a... o ... compute ... by a,b... o ... compute ... by a,b,c...

En una misma instruccin se pueden colocar varias clusulas "compute" combinadas con varias clusulas "compute by":
select *from visitantes order by provincia,ciudad compute avg(edad), sum(montocompra) compute avg(montocompra),count(provincia) by provincia,ciudad;

El resultado de la consulta anterior muestra el promedio de la compra y la cantidad al final de cada subgrupo de provincia y ciudad (compute by) y el promedio de las edades y el total del monto de compras de todos (compute). Los tipos de datos ntext, text e image no se pueden incluir en una clusula "compute" o "compute by".

42 - Clusulas compute y compute by


Problema: Un comercio que tiene un stand en una feria registra en una tabla llamada "visitantes" algunos datos de las personas que visitan o compran en su stand para luego enviarle publicidad de sus productos. Eliminamos la tabla si existe:

if object_id('visitantes') is not null drop table visitantes;

La creamos con la siguiente estructura:


create table visitantes( nombre varchar(30), edad tinyint, ciudad varchar(20), provincia varchar(20), mail varchar(30), montocompra decimal(6,2) );

Ingresamos algunos registros:


insert into visitantes values ('Susana Molina',28,'Cordoba','Cordoba','susanamolina@gmail.com',50); insert into visitantes values ('Marcela Mercado',36,'Carlos Paz','Cordoba',null,20); insert into visitantes values ('Alberto Garcia',35,'La Falda','Cordoba','albertgomgarcia@hotmail.com',30); insert into visitantes values ('Teresa Garcia',33,'Alta Gracia','Cordoba',null,120); insert into visitantes values ('Roberto Perez',45,'Alta Gracia','Cordoba','robertomarioperez@hotmail.com',30); insert into visitantes values ('Marina Torres',22,'Rosario','Santa Fe','marinatorres@xaxamail.com',90); insert into visitantes values ('Julieta Gomez',24,'Rosario','Santa Fe',null,50); insert into visitantes values ('Roxana Lopez',20,'Alta Gracia','Cordoba',null,200); insert into visitantes values ('Liliana Garcia',50,'Capital Federal','Buenos Aires','lilianagarcia@hotmail.com',40); insert into visitantes values ('Juan Torres',43,'Carlos Paz','Cordoba',null,10);

Veamos todos los datos de los visitantes y el promedio del monto de compra:
select *from visitantes compute avg(montocompra);

Empleamos dos clusulas "compute" en una misma instruccin para averiguar el promedio de las edades y el total de los montos de las compras:
select edad,ciudad,montocompra from visitantes compute avg(edad),sum(montocompra);

Veamos la cantidad de visitantes por provincia y ciudad empleando "compute by". Recuerde que DEBE usarse "order by" y los campos que se incluyan luego de "by" deben estar en el "order by":
select nombre,ciudad,provincia from visitantes order by provincia,ciudad compute count(provincia) by provincia,ciudad;

Combinamos dos clusulas "compute" con dos clusulas "compute by" para averiguar el promedio de la compra y la cantidad por provincia y ciudad y el promedio de las edades y el total del monto de compras de todos los visitantes:
select *from visitantes order by provincia,ciudad compute avg(edad), sum(montocompra) compute avg(montocompra),count(provincia) by provincia,ciudad;
if object_id('visitantes') is not null drop table visitantes; create table visitantes( nombre varchar(30), edad tinyint, ciudad varchar(20), provincia varchar(20), mail varchar(30), montocompra decimal(6,2) ); insert into visitantes values ('Susana Molina',28,'Cordoba','Cordoba','susanamolina@gmail.com',50); insert into visitantes values ('Marcela Mercado',36,'Carlos Paz','Cordoba',null,20); insert into visitantes values ('Alberto Garcia',35,'La Falda','Cordoba','albertgomgarcia@hotmail.com',30); insert into visitantes values ('Teresa Garcia',33,'Alta Gracia','Cordoba',null,120); insert into visitantes values ('Roberto Perez',45,'Alta Gracia','Cordoba','robertomarioperez@hotmail.com',30); insert into visitantes values ('Marina Torres',22,'Rosario','Santa Fe','marinatorres@xaxamail.com',90); insert into visitantes values ('Julieta Gomez',24,'Rosario','Santa Fe',null,50); insert into visitantes values ('Roxana Lopez',20,'Alta Gracia','Cordoba',null,200); insert into visitantes values ('Liliana Garcia',50,'Capital Federal','Buenos Aires','lilianagarcia@hotmail.com',40); insert into visitantes values ('Juan Torres',43,'Carlos Paz','Cordoba',null,10); select *from visitantes compute avg(montocompra); select edad,ciudad,montocompra from visitantes compute avg(edad),sum(montocompra); select nombre,ciudad,provincia from visitantes

order by provincia,ciudad compute count(provincia) by provincia,ciudad; select *from visitantes order by provincia,ciudad compute avg(edad), sum(montocompra) compute avg(montocompra),count(provincia) by provincia,ciudad;

42 - Clusulas compute y compute by


Primer problema:
La provincia almacena en una tabla llamada "inmuebles" los siguientes datos de los inmuebles y sus propietarios para cobrar impuestos: 1- Elimine la tabla si existe: if object_id('inmuebles') is not null drop table inmuebles; 2- Crela con la siguiente estructura: create table inmuebles ( documento varchar(8) not null, nombre varchar(30), domicilio varchar(20), barrio varchar(20), ciudad varchar(20), tipo char(1),--b=baldio, e: edificado superficie decimal (8,2), monto decimal (8,2) ); 3- Ingrese algunos registros: insert into inmuebles values ('11111111','Alberto Acosta','Avellaneda 800','Centro','Cordoba','e',100,1200); insert into inmuebles values ('11111111','Alberto Acosta','Sarmiento 245','Gral. Paz','Cordoba','e',200,2500); insert into inmuebles values ('22222222','Beatriz Barrios','San Martin 202','Centro','Cordoba','e',250,1900); insert into inmuebles values ('33333333','Carlos Caseres','Paso 1234','Alberdi','Cordoba','b',200,1000); insert into inmuebles values ('33333333','Carlos Caseres','Guemes 876','Alberdi','Cordoba','b',300,1500); insert into inmuebles values ('44444444','Diana Dominguez','Calderon 456','Matienzo','Cordoba','b',200,800); insert into inmuebles values ('55555555','Estela Fuentes','San Martin 321','Flores','Carlos Paz','e',500,4500); insert into inmuebles

values ('55555555','Estela Fuentes','Lopez y Planes 853','Alberdi','Cordoba','e',350,2200); 4- Muestre todos los datos y el promedio del monto empleando "compute" (1 resultado parcial) 5- Empleando clusulas "compute" consulte el promedio de las superficies y el total de los montos (2 columnas extras) 6- Realice la misma consulta anterior pero empleando "compute by" para obtener resultados parciales por documento,barrio y ciudad. 7- Realice la misma consulta anterior pero con resultados parciales por documento y barrio (6 resultados parciales dobles) 8- Realice la misma consulta anterior pero con resultados parciales por documento (4 resultados parciales dobles) 9- Intente realizar la misma consulta anterior pero con resultados parciales por documento y ciudad. Aparece un mensaje de error indicando que el subgrupo de campos listados luego del "by" no es correcto. 10- Combine clusulas "compute" con "compute by" para averiguar el total de monto a pagar por propietario y el promedio de monto de todos (4 resultados parciales y 1 general) if object_id('inmuebles') is not null drop table inmuebles; create table inmuebles ( documento varchar(8) not null, nombre varchar(30), domicilio varchar(20), barrio varchar(20), ciudad varchar(20), tipo char(1),--b=baldio, e: edificado superficie decimal (8,2), monto decimal (8,2) ); insert into inmuebles values ('11111111','Alberto Acosta','Avellaneda 800','Centro','Cordoba','e',100,1200); insert into inmuebles values ('11111111','Alberto Acosta','Sarmiento 245','Gral. Paz','Cordoba','e',200,2500); insert into inmuebles values ('22222222','Beatriz Barrios','San Martin 202','Centro','Cordoba','e',250,1900); insert into inmuebles

values ('33333333','Carlos Caseres','Paso 1234','Alberdi','Cordoba','b',200,1000); insert into inmuebles values ('33333333','Carlos Caseres','Guemes 876','Alberdi','Cordoba','b',300,1500); insert into inmuebles values ('44444444','Diana Dominguez','Calderon 456','Matienzo','Cordoba','b',200,800); insert into inmuebles values ('55555555','Estela Fuentes','San Martin 321','Flores','Carlos Paz','e',500,4500); insert into inmuebles values ('55555555','Estela Fuentes','Lopez y Planes 853','Alberdi','Cordoba','e',350,2200); select *from inmuebles compute avg(monto); select *from inmuebles compute avg(superficie),sum(monto); select *from inmuebles order by documento,barrio,ciudad compute avg(superficie),sum(monto) by documento,barrio,ciudad; select *from inmuebles order by documento,barrio,ciudad compute avg(superficie),sum(monto) by documento,barrio; select *from inmuebles order by documento,barrio,ciudad compute avg(superficie),sum(monto) by documento; select *from inmuebles order by documento,barrio,ciudad compute avg(superficie),sum(monto) by documento,ciudad; select *from inmuebles order by documento compute sum(monto) compute avg(monto) by documento;

select *from inmuebles order by documento,barrio,ciudad compute avg(superficie),sum(monto) by documento,ciudad; select *from inmuebles order by documento compute sum(monto) compute avg(monto) by documento;

43 - Registros duplicados (distinct)


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;

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) from libros;

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:
select distinct titulo,editorial from libros order by titulo;

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". Entonces, "distinct" elimina registros duplicados.

43 - Registros duplicados (distinct)


Problema: Trabajamos con la tabla "libros" de una librera. Eliminamos la tabla, si existe:
if object_id('libros') is not null drop table libros;

Creamos la tabla:
create table libros( codigo int identity, titulo varchar(40), autor varchar(30), editorial varchar(15), primary key(codigo)

);

Ingresamos algunos registros:


insert into libros values('El aleph','Borges','Planeta'); insert into libros values('Martin Fierro','Jose Hernandez','Emece'); insert into libros values('Martin Fierro','Jose Hernandez','Planeta'); insert into libros values('Antologia poetica','Borges','Planeta'); insert into libros values('Aprenda PHP','Mario Molina','Emece'); insert into libros values('Aprenda PHP','Lopez','Emece'); insert into libros values('Manual de PHP', 'J. Paez', null); insert into libros values('Cervantes y el quijote',null,'Paidos'); insert into libros values('Harry Potter y la piedra filosofal','J.K. Rowling','Emece'); insert into libros values('Harry Potter y la camara secreta','J.K. Rowling','Emece'); insert into libros values('Alicia en el pais de las maravillas','Lewis Carroll','Paidos'); insert into libros values('Alicia en el pais de las maravillas','Lewis Carroll','Planeta'); insert into libros values('PHP de la A a la Z',null,null); insert into libros values('Uno','Richard Bach','Planeta');

Para obtener la lista de autores sin repeticin tipeamos:


select distinct autor from libros;

Note que aparece "null" como un valor para "autor" Para obtener la lista de autores conocidos, es decir, no incluyendo "null" en la lista:
select distinct autor from libros where autor is not null;

Contamos los distintos autores:


select count(distinct autor) from libros;

Queremos los nombres de las editoriales sin repetir:


select distinct editorial from libros;

Queremos saber la cantidad de editoriales distintas:


select count(distinct editorial) from libros;

La combinamos con "where" para obtener los distintos autores de la editorial "Planeta":
select distinct autor from libros where editorial='Planeta';

Contamos los distintos autores que tiene cada editorial empleando "group by":
select editorial,count(distinct autor) from libros group by editorial;

Mostramos los ttulos y editoriales de los libros sin repetir ttulos ni editoriales:
select distinct titulo,editorial from libros order by titulo;

Note que los registros no estn duplicados, aparecen ttulos iguales pero con editorial diferente, cada registro es diferente.
if object_id('libros') is not null drop table libros;

create table libros( codigo int identity, titulo varchar(40), autor varchar(30), editorial varchar(15), primary key(codigo) );

insert into libros values('El aleph','Borges','Planeta'); insert into libros values('Martin Fierro','Jose Hernandez','Emece');

insert into libros values('Martin Fierro','Jose Hernandez','Planeta'); insert into libros values('Antologia poetica','Borges','Planeta'); insert into libros values('Aprenda PHP','Mario Molina','Emece'); insert into libros values('Aprenda PHP','Lopez','Emece'); insert into libros values('Manual de PHP', 'J. Paez', null); insert into libros values('Cervantes y el quijote',null,'Paidos'); insert into libros values('Harry Potter y la piedra filosofal','J.K. Rowling','Emece'); insert into libros values('Harry Potter y la camara secreta','J.K. Rowling','Emece'); insert into libros values('Alicia en el pais de las maravillas','Lewis Carroll','Paidos'); insert into libros values('Alicia en el pais de las maravillas','Lewis Carroll','Planeta'); insert into libros values('PHP de la A a la Z',null,null); insert into libros values('Uno','Richard Bach','Planeta');

select distinct autor from libros;

select distinct autor from libros

where autor is not null;

select count(distinct autor) from libros;

select distinct editorial from libros;

select count(distinct editorial) from libros;

select distinct autor from libros where editorial='Planeta';

select editorial,count(distinct autor) from libros group by editorial;

select distinct titulo,editorial from libros order by titulo;

43 - Registros duplicados (distinct)


Primer problema:
Una empresa tiene registrados sus clientes en una tabla llamada "clientes". 1- Elimine la tabla "clientes", si existe: if object_id('clientes') is not null drop table clientes; 2- Crela con la siguiente estructura: create table clientes ( codigo int identity, nombre varchar(30) not null, domicilio varchar(30),

ciudad varchar(20), provincia varchar (20), primary key(codigo) ); 3- Ingrese algunos registros: insert into clientes values ('Lopez Marcos','Colon 111','Cordoba','Cordoba'); insert into clientes values ('Perez Ana','San Martin 222','Cruz del Eje','Cordoba'); insert into clientes values ('Garcia Juan','Rivadavia 333','Villa del Rosario','Cordoba'); insert into clientes values ('Perez Luis','Sarmiento 444','Rosario','Santa Fe'); insert into clientes values ('Pereyra Lucas','San Martin 555','Cruz del Eje','Cordoba'); insert into clientes values ('Gomez Ines','San Martin 666','Santa Fe','Santa Fe'); insert into clientes values ('Torres Fabiola','Alem 777','Villa del Rosario','Cordoba'); insert into clientes values ('Lopez Carlos',null,'Cruz del Eje','Cordoba'); insert into clientes values ('Ramos Betina','San Martin 999','Cordoba','Cordoba'); insert into clientes values ('Lopez Lucas','San Martin 1010','Posadas','Misiones'); 4- Obtenga las provincias sin repetir (3 registros) 5- Cuente las distintas provincias. 6- Se necesitan los nombres de las ciudades sin repetir (6 registros) 7- Obtenga la cantidad de ciudades distintas. 8- Combine con "where" para obtener las distintas ciudades de la provincia de Cordoba (3 registros) 9- Contamos las distintas ciudades de cada provincia empleando "group by" (3 registros) Ver solucin if object_id('clientes') is not null drop table clientes; create table clientes ( codigo int identity, nombre varchar(30) not null, domicilio varchar(30), ciudad varchar(20), provincia varchar (20), primary key(codigo) ); insert into clientes values ('Lopez Marcos','Colon 111','Cordoba','Cordoba'); insert into clientes

values ('Perez Ana','San Martin 222','Cruz del Eje','Cordoba'); insert into clientes values ('Garcia Juan','Rivadavia 333','Villa del Rosario','Cordoba'); insert into clientes values ('Perez Luis','Sarmiento 444','Rosario','Santa Fe'); insert into clientes values ('Pereyra Lucas','San Martin 555','Cruz del Eje','Cordoba'); insert into clientes values ('Gomez Ines','San Martin 666','Santa Fe','Santa Fe'); insert into clientes values ('Torres Fabiola','Alem 777','Villa del Rosario','Cordoba'); insert into clientes values ('Lopez Carlos',null,'Cruz del Eje','Cordoba'); insert into clientes values ('Ramos Betina','San Martin 999','Cordoba','Cordoba'); insert into clientes values ('Lopez Lucas','San Martin 1010','Posadas','Misiones'); select distinct provincia from clientes; select count(distinct provincia) as cantidad from clientes; select distinct ciudad from clientes; select count(distinct ciudad) from clientes; select distinct ciudad from clientes where provincia='Cordoba'; select provincia,count(distinct ciudad) from clientes group by provincia;

Segundo problema:
La provincia almacena en una tabla llamada "inmuebles" los siguientes datos de los inmuebles y sus propietarios para cobrar impuestos: 1- Elimine la tabla si existe: if object_id('inmuebles') is not null drop table inmuebles; 2- Crela con la siguiente estructura: create table inmuebles ( documento varchar(8) not null, apellido varchar(30), nombre varchar(30), domicilio varchar(20), barrio varchar(20), ciudad varchar(20), tipo char(1),--b=baldio, e: edificado superficie decimal (8,2) ); 3- Ingrese algunos registros: insert into inmuebles values ('11000000','Perez','Alberto','San Martin 800','Centro','Cordoba','e',100); insert into inmuebles values ('11000000','Perez','Alberto','Sarmiento 245','Gral. Paz','Cordoba','e',200); insert into inmuebles values ('12222222','Lopez','Maria','San Martin 202','Centro','Cordoba','e',250); insert into inmuebles values ('13333333','Garcia','Carlos','Paso 1234','Alberdi','Cordoba','b',200); insert into inmuebles values ('13333333','Garcia','Carlos','Guemes 876','Alberdi','Cordoba','b',300); insert into inmuebles values ('14444444','Perez','Mariana','Caseros 456','Flores','Cordoba','b',200); insert into inmuebles values ('15555555','Lopez','Luis','San Martin 321','Centro','Carlos Paz','e',500); insert into inmuebles values ('15555555','Lopez','Luis','Lopez y Planes 853','Flores','Carlos Paz','e',350); insert into inmuebles values ('16666666','Perez','Alberto','Sucre 1877','Flores','Cordoba','e',150); 4- Muestre los distintos apellidos de los propietarios, sin repetir (3 registros) 5- Muestre los distintos documentos de los propietarios, sin repetir (6 registros)

6- Cuente, sin repetir, la cantidad de propietarios de inmuebles de la ciudad de Cordoba (5) 7- Cuente la cantidad de inmuebles con domicilio en 'San Martin', sin repetir la ciudad (2) 8- Muestre los apellidos y nombres, sin repetir (5 registros) Note que hay 2 personas con igual nombre y apellido que aparece una sola vez. 9- Muestre la cantidad de inmuebles que tiene cada propietario agrupando por documento, sin repetir barrio (6 registros) if object_id('inmuebles') is not null drop table inmuebles; create table inmuebles ( documento varchar(8) not null, apellido varchar(30), nombre varchar(30), domicilio varchar(20), barrio varchar(20), ciudad varchar(20), tipo char(1),--b=baldio, e: edificado superficie decimal (8,2) ); insert into inmuebles values ('11000000','Perez','Alberto','San Martin 800','Centro','Cordoba','e',100); insert into inmuebles values ('11000000','Perez','Alberto','Sarmiento 245','Gral. Paz','Cordoba','e',200); insert into inmuebles values ('12222222','Lopez','Maria','San Martin 202','Centro','Cordoba','e',250); insert into inmuebles values ('13333333','Garcia','Carlos','Paso 1234','Alberdi','Cordoba','b',200); insert into inmuebles values ('13333333','Garcia','Carlos','Guemes 876','Alberdi','Cordoba','b',300); insert into inmuebles values ('14444444','Perez','Mariana','Caseros 456','Flores','Cordoba','b',200); insert into inmuebles values ('15555555','Lopez','Luis','San Martin 321','Centro','Carlos Paz','e',500); insert into inmuebles values ('15555555','Lopez','Luis','Lopez y Planes 853','Flores','Carlos Paz','e',350); insert into inmuebles values ('16666666','Perez','Alberto','Sucre 1877','Flores','Cordoba','e',150); select distinct apellido from inmuebles;

select distinct documento from inmuebles; select count(distinct documento) from inmuebles where ciudad='Cordoba'; select count(ciudad) from inmuebles where domicilio like 'San Martin %'; select distinct apellido,nombre from inmuebles; select documento,count(distinct barrio) as 'cantidad' from inmuebles group by documento;

44 - Clusula top
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 order by autor;

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 seleccion, 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.

44 - Clusula top
Problema: Trabajamos con la tabla "libros" de una librera. Eliminamos la tabla, si existe:
if object_id('libros') is not null drop table libros;

Creamos la tabla:
create table libros( codigo int identity, titulo varchar(40), autor varchar(20), editorial varchar(20) );

Ingresamos algunos registros:


insert insert insert insert insert XXI'); insert insert into into into into into libros libros libros libros libros values values values values values ('Uno','Richard Bach','Planeta'); ('El aleph','Borges','Emece'); ('Alicia en el pais...','Carroll','Planeta'); ('Aprenda PHP','Mario Molina','Siglo XXI'); ('Java en 10 minutos','Mario Molina','Siglo

into libros values ('Java desde cero','Mario Molina','Emece'); into libros values ('Ilusiones','Richard Bach','Planeta');

Obtenemos todos los datos de los primeros 2 libros de la tabla:


select top 2 *from libros;

Mostramos los ttulos y autores de los 3 primeros libros ordenados por autor:
select top 3 titulo,autor

from libros order by autor;

Realizamos la misma consulta anterior pero empleamos la clusula "with ties", con lo cual incluiremos en la seleccin, todos los registros que tengan el mismo autor que el ltimo registro retornado, aunque pasemos de 3:
select top 3 with ties titulo,autor from libros order by autor;

Note que retorna los 5 primeros registros porque incluye los dos siguientes que tienen el mismo valor que el ltimo en el campo "autor" (por el cual se ordena).
insert into libros insert into libros insert into libros insert into libros values values values values ('Aprenda PHP','Mario Molina','Siglo XXI'); ('Java en 10 minutos','Mario Molina','Siglo XXI'); ('Java desde cero','Mario Molina','Emece'); ('Ilusiones','Richard Bach','Planeta');

select top 2 *from libros; select top 3 titulo,autor from libros order by autor; select top 3 w ith ties titulo,autor from libros order by autor;

if object_id('libros') is not null drop table libros; create table libros( codigo int identity, titulo varchar(40), autor varchar(20), editorial varchar(20) ); insert into libros values ('Uno','Richard Bach','Planeta'); insert into libros values ('El aleph','Borges','Emece'); insert into libros values ('Alicia en el pais...','Carroll','Planeta'); insert into libros values ('Aprenda PHP','Mario Molina','Siglo XXI'); insert into libros values ('Java en 10 minutos','Mario Molina','Siglo XXI'); insert into libros values ('Java desde cero','Mario Molina','Emece'); insert into libros values ('Ilusiones','Richard Bach','Planeta'); select top 2 *from libros; select top 3 titulo,autor from libros order by autor; select top 3 with ties titulo,autor from libros order by autor;

44 - Clusula top
Primer problema:
Una empresa tiene registrados sus empleados en una tabla llamada "empleados". 1- Elimine la tabla si existe: if object_id('empleados') is not null drop table empleados; 2- Crela con la siguiente estructura: create table empleados ( documento varchar(8) not null, nombre varchar(30), estadocivil char(1),--c=casado, s=soltero,v=viudo seccion varchar(20) ); 3- Ingrese algunos registros: insert into empleados values ('22222222','Alberto Lopez','c','Sistemas'); insert into empleados values ('23333333','Beatriz Garcia','c','Administracion'); insert into empleados values ('24444444','Carlos Fuentes','s','Administracion'); insert into empleados values ('25555555','Daniel Garcia','s','Sistemas'); insert into empleados values ('26666666','Ester Juarez','c','Sistemas'); insert into empleados values ('27777777','Fabian Torres','s','Sistemas'); insert into empleados values ('28888888','Gabriela Lopez',null,'Sistemas'); insert into empleados values ('29999999','Hector Garcia',null,'Administracion'); 4- Muestre los 5 primeros registros (5 registros) 5- Muestre nombre y seccion de los 4 primeros registros ordenados por seccin (4 registros) 6- Realice la misma consulta anterior pero incluya todos los registros que tengan el mismo valor en "seccion" que el ltimo (8 registros) 7- Muestre nombre, estado civil y seccion de los primeros 4 empleados ordenados por estado civil y seccin (4 registros) 8- Realice la misma consulta anterior pero incluya todos los valores iguales al ltimo registro retornado (5 registros)

Ver solucin
if object_id('empleados') is not null

drop table empleados; create table empleados ( documento varchar(8) not null, nombre varchar(30), estadocivil char(1),--c=casado, s=soltero,v=viudo seccion varchar(20) ); insert into empleados values ('22222222','Alberto Lopez','c','Sistemas'); insert into empleados values ('23333333','Beatriz Garcia','c','Administracion'); insert into empleados values ('24444444','Carlos Fuentes','s','Administracion'); insert into empleados values ('25555555','Daniel Garcia','s','Sistemas'); insert into empleados values ('26666666','Ester Juarez','c','Sistemas'); insert into empleados values ('27777777','Fabian Torres','s','Sistemas'); insert into empleados values ('28888888','Gabriela Lopez',null,'Sistemas'); insert into empleados values ('29999999','Hector Garcia',null,'Administracion'); select top 5 *from empleados; select top 4 nombre,seccion from empleados order by seccion; select top 4 with ties nombre,seccion from empleados order by seccion; select top 4 nombre,estadocivil,seccion from empleados order by estadocivil,seccion; select top 4 with ties nombre,estadocivil,seccion from empleados order by estadocivil,seccion;

Primer problema:
Una empresa tiene registrados sus empleados en una tabla llamada "empleados". 1- Elimine la tabla si existe: if object_id('empleados') is not null drop table empleados; 2- Crela con la siguiente estructura: create table empleados ( documento varchar(8) not null, nombre varchar(30), estadocivil char(1),--c=casado, s=soltero,v=viudo

seccion varchar(20) ); 3- Ingrese algunos registros: insert into empleados values ('22222222','Alberto Lopez','c','Sistemas'); insert into empleados values ('23333333','Beatriz Garcia','c','Administracion'); insert into empleados values ('24444444','Carlos Fuentes','s','Administracion'); insert into empleados values ('25555555','Daniel Garcia','s','Sistemas'); insert into empleados values ('26666666','Ester Juarez','c','Sistemas'); insert into empleados values ('27777777','Fabian Torres','s','Sistemas'); insert into empleados values ('28888888','Gabriela Lopez',null,'Sistemas'); insert into empleados values ('29999999','Hector Garcia',null,'Administracion'); 4- Muestre los 5 primeros registros (5 registros) 5- Muestre nombre y seccion de los 4 primeros registros ordenados por seccin (4 registros) 6- Realice la misma consulta anterior pero incluya todos los registros que tengan el mismo valor en "seccion" que el ltimo (8 registros) 7- Muestre nombre, estado civil y seccion de los primeros 4 empleados ordenados por estado civil y seccin (4 registros) 8- Realice la misma consulta anterior pero incluya todos los valores iguales al ltimo registro retornado (5 registros)

Ver solucin

if object_id('empleados') is not null drop table empleados; create table empleados ( documento varchar(8) not null, nombre varchar(30), estadocivil char(1),--c=casado, s=soltero,v=viudo seccion varchar(20) ); insert into empleados values ('22222222','Alberto Lopez','c','Sistemas'); insert into empleados values ('23333333','Beatriz Garcia','c','Administracion'); insert into empleados

values ('24444444','Carlos Fuentes','s','Administracion'); insert into empleados values ('25555555','Daniel Garcia','s','Sistemas'); insert into empleados values ('26666666','Ester Juarez','c','Sistemas'); insert into empleados values ('27777777','Fabian Torres','s','Sistemas'); insert into empleados values ('28888888','Gabriela Lopez',null,'Sistemas'); insert into empleados values ('29999999','Hector Garcia',null,'Administracion'); select top 5 *from empleados; select top 4 nombre,seccion from empleados order by seccion; select top 4 with ties nombre,seccion from empleados order by seccion; select top 4 nombre,estadocivil,seccion from empleados order by estadocivil,seccion; select top 4 with ties nombre,estadocivil,seccion from empleados order by estadocivil,seccion;

45 - Clave primaria compuesta


Las claves primarias pueden ser simples, formadas por un solo campo o compuestas, ms de un campo. Recordemos que una clave primaria identifica 1 solo registro en una tabla. Para un valor del campo clave existe solamente 1 registro. Los valores no se repiten ni pueden ser nulos. Existe una playa de estacionamiento que almacena cada da los datos de los vehculos que ingresan en la tabla llamada "vehiculos" con los siguientes campos:
patente char(6) not null, tipo char (1), 'a'= auto, 'm'=moto, horallegada datetime, horasalida datetime,

Necesitamos definir una clave primaria para una tabla con los datos descriptos arriba. No podemos usar solamente la patente porque un mismo auto puede ingresar ms de una vez en el da a la playa; tampoco podemos usar la hora de entrada porque varios autos pueden

ingresar a una misma hora. Tampoco sirven los otros campos. Como ningn campo, por si slo cumple con la condicin para ser clave, es decir, debe identificar un solo registro, el valor no puede repetirse, debemos usar 2 campos. Definimos una clave compuesta cuando ningn campo por si solo cumple con la condicin para ser clave. En este ejemplo, un auto puede ingresar varias veces en un da a la playa, pero siempre ser a distinta hora. Usamos 2 campos como clave, la patente junto con la hora de llegada, as identificamos unvocamente cada registro. Para establecer ms de un campo como clave primaria usamos la siguiente sintaxis:
create table vehiculos( patente char(6) not null, tipo char(1),--'a'=auto, 'm'=moto horallegada datetime, horasalida datetime, primary key(patente,horallegada) );

Nombramos los campos que formarn parte de la clave separados por comas. Al ingresar los registros, SQL Server controla que los valores para los campos establecidos como clave primaria no estn repetidos en la tabla; si estuviesen repetidos, muestra un mensaje y la insercin no se realiza. Lo mismo sucede si realizamos una actualizacin. Entonces, si un solo campo no identifica unvocamente un registro podemos definir una clave primaria compuesta, es decir formada por ms de un campo.

45 - Clave primaria compuesta


Problema: Una playa de estacionamiento almacena cada da los datos de los vehculos que ingresan en la tabla llamada "vehiculos". Eliminamos la tabla, si existe:
if object_id('vehiculos') is not null drop table vehiculos;

Creamos la tabla estableciendo dos campos como clave primaria:


create table vehiculos( patente char(6) not null, tipo char(1),--'a'=auto, 'm'=moto horallegada datetime, horasalida datetime, primary key(patente,horallegada) );

Ingresamos algunos registros:


insert insert insert insert insert insert into into into into into into vehiculos vehiculos vehiculos vehiculos vehiculos vehiculos values('AIC124','a','8:05','12:30'); values('CAA258','a','8:05',null); values('DSE367','m','8:30','18:00'); values('FGT458','a','9:00',null); values('AIC124','a','16:00',null); values('LOI587','m','18:05','19:55');

Si intentamos ingresar un registro con clave primaria repetida:


insert into vehiculos values('LOI587','m','18:05',null);

aparece un mensaje de error y la insercin no se realiza. Si ingresamos un registro repitiendo el valor de uno de los campos que forman parte de la clave, si lo acepta:
insert into vehiculos values('LOI587','m','21:30',null);

Si intentamos actualizar un registro repitiendo la clave primaria:


update vehiculos set horallegada='8:05' where patente='AIC124' and horallegada='16:00';

aparece un mensaje de error y la actualizacin no se realiza. Recordemos que los campos que forman parte de la clave primaria no aceptan valores nulos, aunque no se haya aclarado en la definicin de la tabla:
insert into vehiculos values('HUO690','m',null,null);

Si mostramos la estructura de la tabla:


sp_columns vehiculos;

vemos que los campos que forman parte de la clave primaria (patente y horallegada) tienen "NO" en la columna "IS_NULLABLE", es decir, no admiten valores nulos.
if object_id('vehiculos') is not null

drop table vehiculos;

create table vehiculos( patente char(6) not null, tipo char(1),--'a'=auto, 'm'=moto horallegada datetime, horasalida datetime, primary key(patente,horallegada) );

insert into vehiculos values('AIC124','a','8:05','12:30'); insert into vehiculos values('CAA258','a','8:05',null); insert into vehiculos values('DSE367','m','8:30','18:00'); insert into vehiculos values('FGT458','a','9:00',null); insert into vehiculos values('AIC124','a','16:00',null); insert into vehiculos values('LOI587','m','18:05','19:55');

insert into vehiculos values('LOI587','m','18:05',null);

insert into vehiculos values('LOI587','m','21:30',null);

update vehiculos set horallegada='8:05' where patente='AIC124' and horallegada='16:00';

insert into vehiculos values('HUO690','m',null,null);

45 - Clave primaria compuesta


Primer problema:
Un consultorio mdico en el cual trabajan 3 mdicos registra las consultas de los pacientes en una tabla llamada "consultas". 1- Elimine la tabla si existe: if object_id('consultas') is not null drop table consultas; 2- La tabla contiene los siguientes datos: - fechayhora: datetime not null, fecha y hora de la consulta, - medico: varchar(30), not null, nombre del mdico (Perez,Lopez,Duarte), - documento: char(8) not null, documento del paciente, - paciente: varchar(30), nombre del paciente, - obrasocial: varchar(30), nombre de la obra social (IPAM,PAMI, etc.). ); 3- Un mdico slo puede atender a un paciente en una fecha y hora determianada. En una fecha y hora determinada, varios mdicos atienden a distintos pacientes. Cree la tabla definiendo una clave primaria compuesta: create table consultas( fechayhora datetime not null, medico varchar(30) not null, documento char(8) not null, paciente varchar(30), obrasocial varchar(30), primary key(fechayhora,medico) ); 4- Ingrese varias consultas para un mismo mdico en distintas horas el mismo da. 5- Ingrese varias consultas para diferentes mdicos en la misma fecha y hora. 6- Intente ingresar una consulta para un mismo mdico en la misma hora el mismo da. if object_id('consultas') is not null drop table consultas; create table consultas( fechayhora datetime not null, medico varchar(30) not null, documento char(8) not null, paciente varchar(30), obrasocial varchar(30), primary key(fechayhora,medico) );

insert into consultas values ('2006/11/05 8:00','Lopez','12222222','Acosta Betina','PAMI'); insert into consultas values ('2006/11/05 8:30','Lopez','23333333','Fuentes Carlos','PAMI'); insert into consultas values ('2006/11/05 8:00','Perez','34444444','Garcia Marisa','IPAM'); insert into consultas values ('2006/11/05 8:00','Duarte','45555555','Pereyra Luis','PAMI'); insert into consultas values ('2006/11/05 8:00','Perez','23333333','Fuentes Carlos','PAMI');

Segundo problema:
Un club dicta clases de distintos deportes. En una tabla llamada "inscriptos" almacena la informacin necesaria. 1- Elimine la tabla "inscriptos" si existe: if object_id('inscriptos') is not null drop table inscriptos; 2- La tabla contiene los siguientes campos: - documento del socio alumno: char(8) not null - nombre del socio: varchar(30), - nombre del deporte (tenis, futbol, natacin, basquet): varchar(15) not null, - ao de inscripcion: datetime, - matrcula: si la matrcula ha sido o no pagada ('s' o 'n'). 3- Necesitamos una clave primaria que identifique cada registro. Un socio puede inscribirse en varios deportes en distintos aos. Un socio no puede inscribirse en el mismo deporte el mismo ao. Varios socios se inscriben en un mismo deporte en distintos aos. Cree la tabla con una clave compuesta: create table inscriptos( documento char(8) not null, nombre varchar(30), deporte varchar(15) not null, ao datetime, matricula char(1), primary key(documento,deporte,ao) ); 4- Inscriba a varios alumnos en el mismo deporte en el mismo ao: insert into inscriptos values ('12222222','Juan Perez','tenis','2005','s'); insert into inscriptos values ('23333333','Marta Garcia','tenis','2005','s'); insert into inscriptos values ('34444444','Luis Perez','tenis','2005','n'); 5- Inscriba a un mismo alumno en varios deportes en el mismo ao: insert into inscriptos values ('12222222','Juan Perez','futbol','2005','s'); insert into inscriptos values ('12222222','Juan Perez','natacion','2005','s');

insert into inscriptos values ('12222222','Juan Perez','basquet','2005','n'); 6- Ingrese un registro con el mismo documento de socio en el mismo deporte en distintos aos: insert into inscriptos values ('12222222','Juan Perez','tenis','2006','s'); insert into inscriptos values ('12222222','Juan Perez','tenis','2007','s'); 7- Intente inscribir a un socio alumno en un deporte en el cual ya est inscripto en un ao en el cual ya se haya inscripto. 8- Intente actualizar un registro para que la clave primaria se repita.

46 - Integridad de los datos


Es importante, al disear una base de datos y las tablas que contiene, tener en cuenta la integridad de los datos, esto significa que la informacin almacenada en las tablas debe ser vlida, coherente y exacta. Hasta el momento, hemos controlado y restringido la entrada de valores a un campo mediante el tipo de dato que le definimos (cadena, numricos, etc.), la aceptacin o no de valores nulos, el valor por defecto. Tambin hemos asegurado que cada registro de una tabla sea nico definiendo una clave primaria y empleando la propiedad identity. SQL Server ofrece ms alternativas, adems de las aprendidas, para restringir y validar los datos, las veremos ordenadamente y al finalizar haremos un resumen de las mismas. Comenzamos por las restricciones. Las restricciones (constraints) son un mtodo para mantener la integridad de los datos, asegurando que los valores ingresados sean vlidos y que las relaciones entre las tablas se mantenga. Se establecen a los campos y las tablas. Pueden definirse al crear la tabla ("create table") o agregarse a una tabla existente (empleando "alter table") y se pueden aplicar a un campo o a varios. Se aconseja crear las tablas y luego agregar las restricciones. Se pueden crear, modificar y eliminar las restricciones sin eliminar la tabla y volver a crearla. El procedimiento almacenado del sistema "sp_helpconstraint" junto al nombre de la tabla, nos muestra informacin acerca de las restricciones de dicha tabla.

Cuando se agrega una restriccin a una tabla, SQL Server comprueba los datos existentes. Hay varios tipos de restricciones.

47 - Restriccin default
La restriccin "default" especifica un valor por defecto para un campo cuando no se inserta explcitamente en un comando "insert". Anteriormente, para establecer un valor por defecto para un campo emplebamos la clusula "default" al crear la tabla, por ejemplo:
create table libros( ... autor varchar(30) default 'Desconocido', ... );

Cada vez que establecamos un valor por defecto para un campo de una tabla, SQL Server creaba automticamente una restriccin "default" para ese campo de esa tabla. Dicha restriccin, a la cual no le dbamos un nombre, reciba un nombre dado por SQL Server que consiste "DF" (por default), seguido del nombre de la tabla, el nombre del campo y letras y nmeros aleatorios. Podemos agregar una restriccin "default" a una tabla existente con la sintaxis bsica siguiente:
alter table NOMBRETABLA add constraint NOMBRECONSTRAINT default VALORPORDEFECTO for CAMPO;

En la sentencia siguiente agregamos una restriccin "default" al campo autor de la tabla existente "libros", que almacena el valor "Desconocido" en dicho campo si no ingresamos un valor en un "insert":
alter table libros add constraint DF_libros_autor default 'Desconocido' for autor;

Por convencin, cuando demos el nombre a las restricciones "default" emplearemos un formato similar al que le da SQL Server: "DF_NOMBRETABLA_NOMBRECAMPO". Solamente se permite una restriccin "default" por campo y no se puede emplear junto con la propiedad "identity". 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 libros;

aparecen varias columnas con la siguiente informacin:


- 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).

Entonces, la restriccin "default" especifica un valor por defecto para un campo cuando no se inserta explcitamente en un "insert", se puede establecer uno por campo y no se puede emplear junto con la propiedad "identity".

47 - Restriccin default
Problema: Trabajamos con la tabla "libros" de una librera. Eliminamos la tabla, si existe:
if object_id('libros') is not null drop table libros;

Creamos la tabla:
create table libros( codigo int identity, titulo varchar(40), autor varchar(30) default 'Desconocido', editorial varchar(15), precio decimal(6,2) );

Ingresamos algunos registros sin valor para el campo "autor":


insert into libros (titulo,editorial) values('Martin Fierro','Emece'); insert into libros (titulo,editorial) values('Aprenda PHP','Emece');

Veamos que SQL Server cre automticamente una restriccin "default" para el campo "autor":
sp_helpconstraint libros;

aparece la siguiente informacin:


constraint_type constraint_name ... constraint_keys ------------------------------------------------------------------------------DEFAULT on column autor DF_libros_autor (n/a) ('Desconocido')

La restriccin, a la cual no le dimos un nombre, recibe un nombre dado por SQL Server "DF_libros_autor_67C95AEA", que consiste en "DF" (por default), seguido del nombre de la tabla, el nombre del campo y unos nmeros y letras aleatorios. Vamos a eliminar la tabla y la crearemos nuevamente, sin la clusula "default":
drop table libros; create table libros( codigo int identity, titulo varchar(40), autor varchar(30), editorial varchar(15), precio decimal(6,2) );

Agregamos una restriccin "default" empleando "alter table" para que almacene el valor "Desconocido" en el campo "autor":
alter table libros add constraint DF_libros_autor default 'Desconocido' for autor;

Veamos la restricin agregada anteriormente con el procedimiento almacenado "sp_helpcontraint":


sp_helpconstraint libros;

aparece la siguiente informacin:


constraint_type constraint_name ... constraint_keys -------------------------------------------------------------------------------DEFAULT on column autor DF_libros_autor (n/a) ('Desconocido')

Agregamos algunos registros:


insert into libros (titulo,editorial) values('Martin Fierro','Emece'); insert into libros default values;

Veamos cmo se almacenaron los registros sin valor explcito para el campo con restriccin "default":
select *from libros;

Agregamos otra restriccin "default" para el campo "precio" para que almacene el valor 0 en dicho campo:
alter table libros add constraint DF_libros_precio default 0 for precio;

Veamos la restricin agregada anteriormente con el procedimiento almacenado "sp_helpcontraint":


sp_helpconstraint libros;

if object_id('libros') is not null drop table libros;

create table libros( codigo int identity, titulo varchar(40), autor varchar(30) default 'Desconocido', editorial varchar(15), precio decimal(6,2) );

insert into libros (titulo,editorial) values('Martin Fierro','Emece'); insert into libros (titulo,editorial) values('Aprenda PHP','Emece');

sp_helpconstraint libros;

drop table libros; create table libros( codigo int identity, titulo varchar(40), autor varchar(30), editorial varchar(15), precio decimal(6,2) );

alter table libros add constraint DF_libros_autor default 'Desconocido' for autor;

sp_helpconstraint libros;

insert into libros (titulo,editorial) values('Martin Fierro','Emece'); insert into libros default values;

select *from libros;

alter table libros add constraint DF_libros_precio default 0 for precio;

sp_helpconstraint libros;

47 - Restriccin default
Primer problema:
Un comercio que tiene un stand en una feria registra en una tabla llamada "visitantes" algunos datos de las personas que visitan o compran en su stand para luego enviarle publicidad de sus productos. 1- Elimine la tabla "visitantes", si existe: if object_id('visitantes') is not null drop table visitantes; 2- Cree la tabla con la siguiente estructura: create table visitantes( numero int identity, nombre varchar(30), edad tinyint, domicilio varchar(30), ciudad varchar(20), montocompra decimal (6,2) not null ); 3- Defina una restriccin "default" para el campo "ciudad" que almacene el valor "Cordoba" en caso de no ingresar valor para dicho campo: alter table visitantes add constraint DF_visitantes_ciudad default 'Cordoba' for ciudad; 4- Defina una restriccin "default" para el campo "montocompra" que almacene el valor "0" en caso de no ingresar valor para dicho campo: alter table visitantes add constraint DF_visitantes_montocompra default 0 for montocompra;

5- Ingrese algunos registros sin valor para los campos con restriccin "default": insert into visitantes values ('Susana Molina',35,'Colon 123',default,59.80); insert into visitantes (nombre,edad,domicilio) values ('Marcos Torres',29,'Carlos Paz'); insert into visitantes values ('Mariana Juarez',45,'Carlos Paz',null,23.90); 6- Vea cmo se almacenaron los registros: select *from visitantes; 7- Vea las restricciones creadas anteriormente. aparecen dos filas, una por cada restriccin. 8- Intente agregar otra restriccin "default" al campo "ciudad". Aparece un mensaje de error indicando que el campo ya tiene una restriccin "default" y sabemos que no puede establecerse ms de una restriccin "default" por campo. 9- Intente establecer una restriccin "default" al campo "identity". No se permite.

Ver solucin
if object_id('visitantes') is not null drop table visitantes; create table visitantes( numero int identity, nombre varchar(30), edad tinyint, domicilio varchar(30), ciudad varchar(20), montocompra decimal (6,2) not null ); alter table visitantes add constraint DF_visitantes_ciudad default 'Cordoba' for ciudad; alter table visitantes add constraint DF_visitantes_montocompra default 0 for montocompra; insert into visitantes values ('Susana Molina',35,'Colon 123',default,59.80); insert into visitantes (nombre,edad,domicilio) values ('Marcos Torres',29,'Carlos Paz'); insert into visitantes values ('Mariana Juarez',45,'Carlos Paz',null,23.90); select *from visitantes;

sp_helpconstraint visitantes; alter table visitantes add constraint DF_visitantes_ciudad default 'Cordoba' for ciudad; alter table visitantes add constraint DF_visitantes_numero default 0 for numero;

48 - Restriccin check
La restriccin "check" especifica los valores que acepta un campo, evitando que se ingresen valores inapropiados. La sintaxis bsica es la siguiente:
alter table NOMBRETABLA add constraint NOMBRECONSTRAINT check CONDICION;

Trabajamos con la tabla "libros" de una librera que tiene los siguientes campos: codigo, titulo, autor, editorial, preciomin (que indica el precio para los minoristas) y preciomay (que indica el precio para los mayoristas). Los campos correspondientes a los precios (minorista y mayorista) se definen de tipo decimal(5,2), es decir, aceptan valores entre -999.99 y 999.99. Podemos controlar que no se ingresen valores negativos para dichos campos agregando una restriccin "check":
alter table libros add constraint CK_libros_precio_positivo check (preciomin>=0 and preciomay>=0);

Este tipo de restriccin verifica los datos cada vez que se ejecuta una sentencia "insert" o "update", es decir, acta en inserciones y actualizaciones. 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]');

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.

48 - Restriccin check
Problema: Trabajamos con la tabla "libros" de una librera. Eliminamos la tabla, si existe:
if object_id('libros') is not null drop table libros;

La creamos e ingresamos algunos registros:

create table libros( codigo int identity, titulo varchar(40), autor varchar(30), editorial varchar(15), preciomin decimal(5,2), preciomay decimal(5,2) ); insert into insert into insert into XXI',48,53); insert into XXI',35,40); libros values ('Uno','Bach','Planeta',22,20); libros values ('El quijote','Cervantes','Emece',15,13); libros values ('Aprenda PHP','Mario Molina','Siglo libros values ('Java en 10 minutos','Garcia','Siglo

Agregamos una restriccin "check" para asegurar que los valores de los campos correspondientes a precios no puedan ser negativos:
alter table libros add constraint CK_libros_precios_positivo check (preciomin>=0 and preciomay>=0);

Si intentamos ingresar un valor invlido para algn campo correspondiente al precio, que vaya en contra de la restriccin, por ejemplo el valor "-15" aparecer un mensaje de error indicando que hay conflicto con la restriccin creada anteriormente y la insercin no se realiza. Igualmente si intentamos actualizar un precio, que vaya en contra de la restriccin. Si intentamos agregar una restriccin que no permita que el precio mayorista supere el precio minorista, aparece un mensaje de error y la sentencia no se ejecuta, porque hay registros que no cumplen con la restriccin que intentamos establecer. Podemos modificar los datos que no cumplen la condicin de la restriccin o eliminar los registros:
update libros set preciomay=48 where titulo='Aprenda PHP'; delete from libros where titulo='Java en 10 minutos';

Ahora SQL Server si nos permite agregar la restriccin "check" que impida que se ingresen valores para "preciomay" superiores a "preciomin":
alter table libros add constraint CK_libros_preciominmay check (preciomay<=preciomin);

Veamos las restricciones de la tabla:


sp_helpconstraint libros;

Ingresamos un registro con valores por defecto:


insert into libros default values;

Note que los campos correspondientes a precios admiten valores 0 y 999.99 (por el tipo de dato y la restriccin), adems del valor "null".
add constraint CK_libros_precios_positivo check (preciomin>=0 and preciomay>=0); update libros set preciomay=48 w here titulo='Aprenda PHP'; delete from libros w here titulo='Java en 10 minutos'; alter table libros add constraint CK_libros_preciominmay check (preciomay<=preciomin); sp_helpconstraint libros; insert into libros default values;

if object_id('libros') is not null drop table libros;

create table libros( codigo int identity, titulo varchar(40), autor varchar(30), editorial varchar(15), preciomin decimal(5,2), preciomay decimal(5,2) );

insert into libros values ('Uno','Bach','Planeta',22,20); insert into libros values ('El quijote','Cervantes','Emece',15,13); insert into libros values ('Aprenda PHP','Mario Molina','Siglo XXI',48,53); insert into libros values ('Java en 10 minutos','Garcia','Siglo XXI',35,40);

alter table libros add constraint CK_libros_precios_positivo check (preciomin>=0 and preciomay>=0);

update libros set preciomay=48 where titulo='Aprenda PHP'; delete from libros where titulo='Java en 10 minutos';

alter table libros add constraint CK_libros_preciominmay check (preciomay<=preciomin);

sp_helpconstraint libros;

insert into libros default values;

Problema: Trabajamos con la tabla "libros" de una librera. Eliminamos la tabla, si existe:
if object_id('libros') is not null drop table libros;

La creamos e ingresamos algunos registros:


create table libros( codigo int identity, titulo varchar(40), autor varchar(30), editorial varchar(15), preciomin decimal(5,2), preciomay decimal(5,2) ); insert into insert into insert into XXI',48,53); insert into XXI',35,40); libros values ('Uno','Bach','Planeta',22,20); libros values ('El quijote','Cervantes','Emece',15,13); libros values ('Aprenda PHP','Mario Molina','Siglo libros values ('Java en 10 minutos','Garcia','Siglo

Agregamos una restriccin "check" para asegurar que los valores de los campos correspondientes a precios no puedan ser negativos:
alter table libros add constraint CK_libros_precios_positivo check (preciomin>=0 and preciomay>=0);

Si intentamos ingresar un valor invlido para algn campo correspondiente al precio, que vaya en contra de la restriccin, por ejemplo el valor "-15" aparecer un mensaje de error indicando que hay conflicto con la restriccin creada anteriormente y la insercin no se realiza. Igualmente si intentamos actualizar un precio, que vaya en contra de la restriccin. Si intentamos agregar una restriccin que no permita que el precio mayorista supere el precio minorista, aparece un mensaje de error y la sentencia no se ejecuta, porque hay registros que no cumplen con la restriccin que intentamos establecer. Podemos modificar los datos que no cumplen la condicin de la restriccin o eliminar los registros:
update libros set preciomay=48 where titulo='Aprenda PHP'; delete from libros where titulo='Java en 10 minutos';

Ahora SQL Server si nos permite agregar la restriccin "check" que impida que se ingresen valores para "preciomay" superiores a "preciomin":
alter table libros add constraint CK_libros_preciominmay check (preciomay<=preciomin);

Veamos las restricciones de la tabla:


sp_helpconstraint libros;

Ingresamos un registro con valores por defecto:


insert into libros default values;

Note que los campos correspondientes a precios admiten valores 0 y 999.99 (por el tipo de dato y la restriccin), adems del valor "null".
add constraint CK_libros_precios_positivo check (preciomin>=0 and preciomay>=0); update libros set preciomay=48 w here titulo='Aprenda PHP'; delete from libros w here titulo='Java en 10 minutos'; alter table libros add constraint CK_libros_preciominmay check (preciomay<=preciomin); sp_helpconstraint libros; insert into libros default values;

if object_id('libros') is not null drop table libros;

create table libros( codigo int identity, titulo varchar(40), autor varchar(30), editorial varchar(15), preciomin decimal(5,2), preciomay decimal(5,2) );

insert into libros values ('Uno','Bach','Planeta',22,20); insert into libros values ('El quijote','Cervantes','Emece',15,13); insert into libros values ('Aprenda PHP','Mario Molina','Siglo XXI',48,53); insert into libros values ('Java en 10 minutos','Garcia','Siglo XXI',35,40);

alter table libros add constraint CK_libros_precios_positivo check (preciomin>=0 and preciomay>=0);

update libros set preciomay=48 where titulo='Aprenda PHP'; delete from libros where titulo='Java en 10 minutos';

alter table libros add constraint CK_libros_preciominmay check (preciomay<=preciomin);

sp_helpconstraint libros;

insert into libros default values;

48 - Restriccin check
Primer problema:
Una empresa tiene registrados datos de sus empleados en una tabla llamada "empleados". 1- Elimine la tabla si existe: if object_id('empleados') is not null drop table empleados; 2- Crela con la siguiente estructura: create table empleados ( documento varchar(8), nombre varchar(30), fechanacimiento datetime, cantidadhijos tinyint, seccion varchar(20), sueldo decimal(6,2) ); 3- Agregue una restriccin "check" para asegurarse que no se ingresen valores negativos para el sueldo: alter table empleados add constraint CK_empelados_sueldo_positivo check (sueldo>0); 4- Ingrese algunos registros vlidos: insert into empleados values ('22222222','Alberto Lopez','1965/10/05',1,'Sistemas',1000); insert into empleados values ('33333333','Beatriz Garcia','1972/08/15',2,'Administracion',3000); insert into empleados values ('34444444','Carlos Caseres','1980/10/05',0,'Contadura',6000); 5- Intente agregar otra restriccin "check" al campo sueldo para asegurar que ninguno supere el valor 5000: alter table empleados add constraint CK_empleados_sueldo_maximo check (sueldo<=5000); La sentencia no se ejecuta porque hay un sueldo que no cumple la restriccin. 6- Elimine el registro infractor y vuelva a crear la restriccin: delete from empleados where sueldo=6000; alter table empleados add constraint CK_empleados_sueldo_maximo check (sueldo<=5000); 7- Establezca una restriccin para controlar que la fecha de nacimiento que se ingresa no supere la fecha actual: alter table empleados add constraint CK_fechanacimiento_actual

check (fechanacimiento<="" pre="">

49 - Deshabilitar restricciones (with check - nocheck)


Sabemos que si agregamos una restriccin a una tabla que contiene datos, SQL Server los controla para asegurarse que cumplen con la condicin de la restriccin, si algn registro no la cumple, la restriccin no se establecece. Es posible deshabilitar esta comprobacin en caso de restricciones "check". Podemos hacerlo cuando agregamos la restriccin "check" a una tabla para que SQL Server acepte los valores ya almacenados que infringen la restriccin. Para ello debemos incluir la opcin "with nocheck" en la instruccin "alter table":
alter table libros with nocheck add constraint CK_libros_precio check (precio>=0);

La restriccin no se aplica en los datos existentes, pero si intentamos ingresar un nuevo valor que no cumpla la restriccin, SQL Server no lo permite. Entonces, para evitar la comprobacin de datos existentes al crear la restriccin, la sintaxis bsica es la siguiente:
alter table TABLA with nocheck add constraint NOMBRERESTRICCION check (CONDICION);

Por defecto, si no especificamos, la opcin es "with check". Tambin podemos deshabilitar las restricciones para agregar o actualizar datos sin comprobarla:
alter table libros nocheck constraint CK_libros_precio;

En el ejemplo anterior deshabilitamos la restriccin "CK_libros_precio" para poder ingresar un valor negativo para "precio". Para habilitar una restriccin deshabilitada se ejecuta la misma instruccin pero con la clusula "check" o "check all":
alter table libros check constraint CK_libros_precio;

Si se emplea "check constraint all" no se coloca nombre de restricciones, habilita todas las restricciones que tiene la tabla nombrada. Para habilitar o deshabilitar restricciones la comprobacin de datos en inserciones o actualizaciones, la sintaxis bsica es:
alter table NOMBRETABLA OPCIONdeRESTRICCION constraint NOMBRERESTRICCION;

Para saber si una restriccin est habilitada o no, podemos ejecutar el procedimiento almacenado "sp_helpconstraint" y fijarnos lo que informa la columna "status_enabled". Entonces, las clusulas "check" y "nocheck" permiten habilitar o deshabilitar restricciones "check" (tambin las restricciones "foreign key" que veremos ms adelante), a las dems se las debe eliminar ("default" y las que veremos posteriormente).

49 - Deshabilitar restricciones (with check - nocheck)


Problema: Trabajamos con la tabla "libros" de una librera. Eliminamos la tabla, si existe:
if object_id('libros') is not null drop table libros;

La creamos e ingresamos algunos registros:


create table libros( codigo int identity, titulo varchar(40), autor varchar(30), editorial varchar(15), precio decimal(5,2) ); insert into libros values ('Uno','Bach','Planeta',22); insert into libros values ('El quijote','Cervantes','Emece',15); insert into libros values ('Aprenda PHP','Mario Molina','Siglo XXI',40);

Agregamos una restriccin "check" para asegurar que los precios no puedan ser negativos, pero como ya tenemos almacenado un precio que infringe la restriccin, vamos a especificar que no haya comprobacin de datos existentes:
alter table libros with nocheck

add constraint CK_libros_precio_positivo check (precio>=0);

Si intentamos ingresar un registro con precio negativo, no lo permite. Para que lo permita, debemos dehabilitar la comprobacin:
alter table libros nocheck constraint CK_libros_precio_positivo;

Ingresemos un registro con precio negativo:


insert into libros values('Java en 10 minutos',default,'Siglo XXI',-1);

Veamos si la restriccin est o no habilitada:


sp_helpconstraint libros;

La columna "status_enabled" nos informa que est deshabilitada (Disabled). Habilitamos la restriccin :
alter table libros check constraint CK_libros_precio_positivo;

Si ahora intentamos ingresar un precio negativo SQL Server no lo permitir.


if object_id('libros') is not null drop table libros; create table libros( codigo int identity, titulo varchar(40), autor varchar(30), editorial varchar(15), precio decimal(5,2) ); insert into libros values ('Uno','Bach','Planeta',22); insert into libros values ('El quijote','Cervantes','Emece',15); insert into libros values ('Aprenda PHP','Mario Molina','Siglo XXI',-40);

if object_id('libros') is not null drop table libros;

create table libros( codigo int identity, titulo varchar(40),

autor varchar(30), editorial varchar(15), precio decimal(5,2) );

insert into libros values ('Uno','Bach','Planeta',22); insert into libros values ('El quijote','Cervantes','Emece',15); insert into libros values ('Aprenda PHP','Mario Molina','Siglo XXI',-40);

alter table libros with nocheck add constraint CK_libros_precio_positivo check (precio>=0);

alter table libros nocheck constraint CK_libros_precio_positivo;

insert into libros values('Java en 10 minutos',default,'Siglo XXI',-1);

sp_helpconstraint libros;

alter table libros check constraint CK_libros_precio_positivo;

49 - Deshabilitar restricciones (with check - nocheck)


Primer problema:
Una empresa tiene registrados datos de sus empleados en una tabla llamada "empleados". 1- Elimine la tabla (si existe): if object_id('empleados') is not null drop table empleados;

2- Crela con la siguiente estructura e ingrese los registros siguientes: create table empleados ( documento varchar(8), nombre varchar(30), seccion varchar(20), sueldo decimal(6,2) ); insert into empleados values ('22222222','Alberto Acosta','Sistemas',-10); insert into empleados values ('33333333','Beatriz Benitez','Recursos',3000); insert into empleados values ('34444444','Carlos Caseres','Contaduria',4000); 3- Intente agregar una restriccin "check" para asegurarse que no se ingresen valores negativos para el sueldo: alter table empleados add constraint CK_empleados_sueldo_positivo check (sueldo>=0); No se permite porque hay un valor negativo almacenado. 5- Vuelva a intentarlo agregando la opcin "with nocheck": alter table empleados with nocheck add constraint CK_empleados_sueldo_positivo check (sueldo>=0); 6- Intente ingresar un valor negativo para sueldo: insert into empleados values ('35555555','Daniel Duarte','Administracion',-2000); No es posible a causa de la restriccin. 7- Deshabilite la restriccin e ingrese el registro anterior: alter table empleados nocheck constraint CK_empleados_sueldo_positivo; insert into empleados values ('35555555','Daniel Duarte','Administracion',2000); 8- Establezca una restriccin "check" para "seccion" que permita solamente los valores "Sistemas", "Administracion" y "Contadura": alter table empleados add constraint CK_empleados_seccion_lista check (seccion in ('Sistemas','Administracion','Contaduria')); No lo permite porque existe un valor fuera de la lista. 9- Establezca la restriccin anterior evitando que se controlen los datos existentes. 10- Vea si las restricciones de la tabla estn o no habilitadas: sp_helpconstraint empleados; Muestra 2 filas, una por cada restriccin. 11- Habilite la restriccin deshabilitada.

12- Intente modificar la seccin del empleado "Carlos Caseres" a "Recursos". No lo permite. 13- Deshabilite la restriccin para poder realizar la actualizacin del punto precedente. if object_id('empleados') is not null drop table empleados; create table empleados ( documento varchar(8), nombre varchar(30), seccion varchar(20), sueldo decimal(6,2) ); insert into empleados values ('22222222','Alberto Acosta','Sistemas',-10); insert into empleados values ('33333333','Beatriz Benitez','Recursos',3000); insert into empleados values ('34444444','Carlos Caseres','Contaduria',4000); alter table empleados add constraint CK_empleados_sueldo_positivo check (sueldo>=0); alter table empleados with nocheck add constraint CK_empleados_sueldo_positivo check (sueldo>=0); insert into empleados values ('35555555','Daniel Duarte','Administracion',-2000); alter table empleados nocheck constraint CK_empleados_sueldo_positivo; insert into empleados values ('35555555','Daniel Duarte','Administracion',2000); alter table empleados add constraint CK_empleados_seccion_lista check (seccion in ('Sistemas','Administracion','Contaduria')); alter table empleados with nocheck add constraint CK_empleados_seccion_lista check (seccion in ('Sistemas','Administracion','Contaduria')); sp_helpconstraint empleados; alter table empleados check constraint CK_empleados_sueldo_positivo; update empleados set seccion='Recursos' where nombre='Carlos Caseres'; alter table empleados

nocheck constraint CK_empleados_seccion_lista; update empleados set seccion='Recursos' where nombre='Carlos Caseres';

50 - Restriccin primary key


Hemos visto las restricciones que se aplican a los campos, "default" y "check". Ahora veremos las restricciones que se aplican a las tablas, que aseguran valores nicos para cada registro. Hay 2 tipos: 1) primary key y 2) unique. Anteriormente, para establecer una clave primaria para una tabla emplebamos la siguiente sintaxis al crear la tabla, por ejemplo:
create table libros( codigo int not null, titulo varchar(30), autor varchar(30), editorial varchar(20), primary key(codigo) );

Cada vez que establecamos la clave primaria para la tabla, SQL Server creaba automticamente una restriccin "primary key" para dicha tabla. Dicha restriccin, a la cual no le dbamos un nombre, reciba un nombre dado por SQL Server que comienza con "PK" (por primary key), seguido del nombre de la tabla y una serie de letras y nmeros aleatorios. Podemos agregar una restriccin "primary key" a una tabla existente con la sintaxis bsica siguiente:
alter table NOMBRETABLA add constraint NOMBRECONSTRAINT primary key (CAMPO,...);

En el siguiente ejemplo definimos una restriccin "primary key" para nuestra tabla "libros" para asegurarnos que cada libro tendr un cdigo diferente y nico:
alter table libros add constraint PK_libros_codigo primary key(codigo);

Con esta restriccin, si intentamos ingresar un registro con un valor para el campo "codigo" que ya existe o el valor "null", aparece un mensaje de error, porque no se permiten valores duplicados ni nulos. Igualmente, si actualizamos.

Por convencin, cuando demos el nombre a las restricciones "primary key" seguiremos el formato "PK_NOMBRETABLA_NOMBRECAMPO". 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 identity). 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 identity), 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.

50 - Restriccin primary key


Problema: Trabajamos con la tabla "libros" de una librera. Eliminamos la tabla, si existe:
if object_id('libros') is not null drop table libros;

La creamos estableciendo el campo cdigo como clave primaria:


create table libros( codigo int not null, titulo varchar(40), autor varchar(30), editorial varchar(15), primary key (codigo)

);

Veamos la restriccin "primary key" que cre automticamente SQL Server:


sp_helpconstraint libros;

Aparece la siguiente informacin:


constraint_type constraint_name constraint_keys ----------------------------------------------------------------------PRIMARY KEY (clustered) PK__libros__571DF1D5 codigo

Vamos a eliminar la tabla y la crearemos nuevamente, sin establecer la clave primaria:


drop table libros; create table libros( codigo int not null, titulo varchar(40), autor varchar(30), editorial varchar(15) );

Definimos una restriccin "primary key" para nuestra tabla "libros" para asegurarnos que cada libro tendr un cdigo diferente y nico:
alter table libros add constraint PK_libros_codigo primary key(codigo);

Veamos la informacin respecto a ella:


sp_helpconstraint libros;

Si intentamos ingresar un registro con un valor para el campo "codigo" que ya existe, no lo permite. Tampoco permite modificar un cdigo colocando uno existente. Si intentamos definir otra restriccin "primary key", SQL Server no lo permite.

if object_id('libros') is not null drop table libros; create table libros( codigo int not null, titulo varchar(40), autor varchar(30), editorial varchar(15), primary key (codigo) ); sp_helpconstraint libros; drop table libros; create table libros(

Primer problema:
Una empresa tiene registrados datos de sus empleados en una tabla llamada "empleados". 1- Elimine la tabla si existe: if object_id('empleados') is not null drop table empleados; 2- Crela con la siguiente estructura: create table empleados ( documento varchar(8) not null, nombre varchar(30), seccion varchar(20) ); 3- Ingrese algunos registros, dos de ellos con el mismo nmero de documento: insert into empleados values ('22222222','Alberto Lopez','Sistemas'); insert into empleados values ('23333333','Beatriz Garcia','Administracion'); insert into empleados values ('23333333','Carlos Fuentes','Administracion'); 4- Intente establecer una restriccin "primary key" para la tabla para que el documento no se repita ni admita valores nulos: alter table empleados add constraint PK_empleados_documento primary key(documento); No lo permite porque la tabla contiene datos que no cumplen con la restriccin, debemos eliminar (o modificar) el registro que tiene documento duplicado: delete from empleados where nombre='Carlos Fuentes'; 5- Establezca la restriccin "primary key" del punto 4. 6- Intente actualizar un documento para que se repita. No lo permite porque va contra la restriccin.

7-Intente establecer otra restriccin "primary key" con el campo "nombre". No lo permite, slo puede haber una restriccin "primary key" por tabla. 8- Intente ingresar un registro con valor nulo para el documento. No lo permite porque la restriccin no admite valores nulos. 9- Establezca una restriccin "default" para que almacene "00000000" en el documento en caso de omitirlo en un "insert". 10- Ingrese un registro sin valor para el documento. 11- Vea el registro: select *from empleados; 12- Intente ingresar otro empleado sin documento explcito. No lo permite porque se duplicara la clave. 13- Vea las restricciones de la tabla empleados (2 filas): sp_helpconstraint empleados;

Ver solucin
if object_id('empleados') is not null drop table empleados; create table empleados ( documento varchar(8) not null, nombre varchar(30), seccion varchar(20) ); insert into empleados values ('22222222','Alberto Lopez','Sistemas'); insert into empleados values ('23333333','Beatriz Garcia','Administracion'); insert into empleados values ('23333333','Carlos Fuentes','Administracion'); alter table empleados add constraint PK_empleados_documento primary key(documento); delete from empleados where nombre='Carlos Fuentes'; alter table empleados add constraint PK_empleados_documento primary key(documento); update empleados set documento='22222222' where documento='23333333'; alter table empleados add constraint PK_empleados_nombre primary key(nombre); insert into empleados values(null,'Marcelo Juarez','Sistemas');

alter table empleados add constraint DF_empleados_documento default '00000000' for documento; insert into empleados (nombre,seccion) values('Luis Luque','Sistemas'); select *from empleados; insert into empleados (nombre,seccion) values('Ana Fuentes','Sistemas'); sp_helpconstraint empleados;

Segundo problema:
Una empresa de remises tiene registrada la informacin de sus vehculos en una tabla llamada "remis". 1- Elimine la tabla si existe: if object_id('remis') is not null drop table remis; 2- Cree la tabla con la siguiente estructura: create table remis( numero tinyint identity, patente char(6), marca varchar(15), modelo char(4)

); 3- Ingrese algunos registros sin repetir patente: insert into remis values('ABC123','Renault 12','1990'); insert into remis values('DEF456','Fiat Duna','1995'); 4- Intente definir una restriccin "primary key" para el campo "patente". No lo permite porque el campo no fue definido "not null". 5- Establezca una restriccin "primary key" para el campo "numero". Si bien "numero" no fue definido explcitamente "not null", no acepta valores nulos por ser "identity". 6- Vea la informacin de las restricciones (2 filas): sp_helpconstraint remis;

Ver solucin
if object_id('remis') is not null drop table remis; create table remis( numero tinyint identity, patente char(6), marca varchar(15), modelo char(4) ); insert into remis values('ABC123','Renault 12','1990'); insert into remis values('DEF456','Fiat Duna','1995'); alter table remis add constraint PK_remis_patente primary key(patente); alter table remis add constraint PK_remis_numero primary key(numero); sp_helpconstraint remis;

51 - Restriccin unique
Hemos visto que las restricciones aplicadas a tablas aseguran valores nicos para cada registro. Anteriormente aprendimos la restriccin "primary key", otra restriccin para las tablas es "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). La sintaxis general es la siguiente:
alter table NOMBRETABLA add constraint NOMBRERESTRICCION unique (CAMPO);

Ejemplo:
alter table alumnos add constraint UQ_alumnos_documento unique (documento);

En el ejemplo anterior se agrega una restriccin "unique" sobre el campo "documento" de la tabla "alumnos", esto asegura que no se pueda ingresar un documento si ya existe. Esta restriccin permite valores nulos, asi 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". Quiz parezca innecesario colocar el nombre de la tabla, pero cuando empleemos varias tablas ver que es til identificar las restricciones por tipo, tabla y campo. 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. En el caso del ejemplo anterior, si la tabla contiene nmeros de documento duplicados, la restriccin no podr establecerse; si podr establecerse si tiene valores nulos. SQL Server controla la entrada de datos en inserciones y actualizaciones evitando que se ingresen valores duplicados.

51 - Restriccin unique
Problema: Trabajamos con la tabla "alumnos". Eliminamos la tabla, si existe:
if object_id('alumnos') is not null drop table alumnos;

Creamos la tabla:

create table alumnos( legajo char(4) not null, apellido varchar(20), nombre varchar(20), documento char(8) );

Agregamos una restriccin "primary" para el campo "legajo":


alter table alumnos add constraint PK_alumnos_legajo primary key(legajo);

Agregamos una restriccin "unique" para el campo "documento":


alter table alumnos add constraint UQ_alumnos_documento unique (documento);

Ingresamos algunos registros:


insert into alumnos values('A111','Lopez','Ana','22222222'); insert into alumnos values('A123','Garcia','Maria','23333333');

Si intentamos ingresar un legajo o ducumento repetido, aparece un mensaje de error. Veamos las restricciones:
sp_helpconstraint alumnos;

Aparecen las dos restricciones creadas anteriormente.


); alter table alumnos add constraint PK_alumnos_legajo primary key(legajo); alter table alumnos add constraint UQ_alumnos_documento unique (documento); insert into alumnos values('A111','Lopez','Ana','22222222'); insert into alumnos values('A123','Garcia','Maria','23333333'); sp_helpconstraint alumnos;

if object_id('alumnos') is not null drop table alumnos; create table alumnos( legajo char(4) not null, apellido varchar(20), nombre varchar(20),

documento char(8) ); alter table alumnos add constraint PK_alumnos_legajo primary key(legajo); alter table alumnos add constraint UQ_alumnos_documento unique (documento); insert into alumnos values('A111','Lopez','Ana','22222222'); insert into alumnos values('A123','Garcia','Maria','23333333'); sp_helpconstraint alumnos;

51 - Restriccin unique
Primer problema:
Una empresa de remises tiene registrada la informacin de sus vehculos en una tabla llamada "remis". 1- Elimine la tabla si existe: if object_id('remis') is not null drop table remis; 2- Cree la tabla con la siguiente estructura: create table remis( numero tinyint identity, patente char(6), marca varchar(15), modelo char(4) ); 3- Ingrese algunos con patente nula: insert into remis insert into remis insert into remis insert into remis insert into remis registros, 2 de ellos con patente repetida y alguno values('ABC123','Renault clio','1990'); values('DEF456','Peugeot 504','1995'); values('DEF456','Fiat Duna','1998'); values('GHI789','Fiat Duna','1995'); values(null,'Fiat Duna','1995');

4- Intente agregar una restriccin "unique" para asegurarse que la patente del remis no tomar valores repetidos. No se puede porque hay valores duplicados. 5- Elimine el registro con patente duplicada y establezca la restriccin. Note que hay 1 registro con valor nulo en "patente". 6- Intente ingresar un registro con patente repetida (no lo permite) 7- Intente ingresar un registro con valor nulo para el campo "patente". No lo permite porque la clave estara duplicada. 8- Muestre la informacin de las restricciones:

sp_helpconstraint remis;

Ver solucin
if object_id('remis') is not null drop table remis; create table remis( numero tinyint identity, patente char(6), marca varchar(15), modelo char(4) ); insert insert insert insert insert into into into into into remis remis remis remis remis values('ABC123','Renault clio','1990'); values('DEF456','Peugeot 504','1995'); values('DEF456','Fiat Duna','1998'); values('GHI789','Fiat Duna','1995'); values(null,'Fiat Duna','1995');

alter table remis add constraint UQ_remis_patente unique(patente); delete from remis where numero=3; alter table remis add constraint UQ_remis_patente unique(patente); insert into remis values('ABC123','Renault 11','1995'); insert into remis values(null,'Renault 11','1995'); sp_helpconstraint remis;

52 - Informacin de restricciones (sp_helpconstraint)


El procedimiento almacenado "sp_helpconstraint" seguido del nombre de una tabla muestra la informacin referente a todas las restricciones establecidas en dicha tabla, 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 (tema que veremos posteriormente). - constraint_name: nombre de la restriccin. - delete_action: solamente es aplicable para restricciones de tipo "foreign key" (la veremos posteriormente).

- update_action: slo es aplicable para restricciones de tipo "foreign key" (la veremos posteriormente). - 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 "check" muestra la condicin de chequeo; si es una restriccin "default", el valor por defecto; si es una "primary key" o "unique" muestra el/ los campos a los que se aplicaron la restriccin.

52 - Informacin de restricciones (sp_helpconstraint)


Problema: Trabajamos con la tabla "alumnos". Eliminamos la tabla, si existe:
if object_id('alumnos') is not null drop table alumnos;

Creamos la tabla:
create table alumnos( legajo char(4) not null, apellido varchar(20), nombre varchar(20), documento char(8), domicilio varchar(30), ciudad varchar(30), notafinal decimal(4,2) );

Agregamos una restriccin "primary" para el campo "legajo":


alter table alumnos add constraint PK_alumnos_legajo primary key(legajo);

Agregamos una restriccin "unique" para el campo "documento":


alter table alumnos add constraint UQ_alumnos_documento

unique (documento);

Agregamos una restriccin "check" para que el campo "notafinal" admita solamente valores entre 0 y 10:
alter table alumnos add constraint CK_alumnos_nota check (notafinal>=0 and notafinal<=10);

Agregamos una restriccin "default" para el campo "ciudad":


alter table alumnos add constraint DF_alumnos_ciudad default 'Cordoba' for ciudad;

Veamos las restricciones:


sp_helpconstraint alumnos;

Aparece la siguiente informacin:


constraint_type constraint_name status_enabled constraint_keys -----------------------------------------------------------------------------------------CHECK on column notafinal CK_alumos_nota Enabled ([notafinal]>=0 and [notafinal<=10]) DEFAULT on column ciudad DF_alumnos_ciudad (n/a) ('Cordoba') PRIMARY KEY (clustered) PK_alumnos_legajo (n/a) UNIQUE (NON-clustered) UQ_alumnos_documento (n/a) documento

legajo

Deshabilitamos la restriccin "check":


alter table alumnos nocheck constraint CK_alumnos_nota;

Veamos la informacin que nos retorna "sp_helpconstraint":


sp_helpconstraint alumnos; constraint_type constraint_name status_enabled constraint_keys ----------------------------------------------------------------------------------------CHECK on column notafinal CK_alumos_nota Disabled ([notafinal]>=0...

Note que la restriccin esta deshabilitada.

if object_id('alumnos') is not null drop table alumnos; create table alumnos( legajo char(4) not null, apellido varchar(20), nombre varchar(20), documento char(8), domicilio varchar(30), ciudad varchar(30), notafinal decimal(4,2) ); alter table alumnos add constraint PK_alumnos_legajo

if object_id('alumnos') is not null drop table alumnos; create table alumnos( legajo char(4) not null, apellido varchar(20), nombre varchar(20), documento char(8), domicilio varchar(30), ciudad varchar(30), notafinal decimal(4,2) ); alter table alumnos add constraint PK_alumnos_legajo primary key(legajo); alter table alumnos add constraint UQ_alumnos_documento unique (documento); alter table alumnos add constraint CK_alumnos_nota check (notafinal>=0 and notafinal<=10); alter table alumnos add constraint DF_alumnos_ciudad default 'Cordoba' for ciudad; sp_helpconstraint alumnos; alter table alumnos nocheck constraint CK_alumnos_nota; sp_helpconstraint alumnos;

53 - Eliminar restricciones (alter table drop)


Problema: Trabajamos con la tabla "libros" de una librera. Eliminamos la tabla, si existe:
if object_id('libros') is not null drop table libros;

La creamos estableciendo el campo cdigo como clave primaria:


create table libros( codigo int not null, titulo varchar(40), autor varchar(30), editorial varchar(15), precio decimal(6,2) );

Definimos una restriccin "primary key" para nuestra tabla "libros" para asegurarnos que cada libro tendr un cdigo diferente y nico:
alter table libros add constraint PK_libros_codigo primary key(codigo);

Definimos una restriccin "check" para asegurarnos que el precio no ser negativo:
alter table libros add constraint CK_libros_precio check (precio>=0);

Definimos una restriccin "default" para el campo "autor" para que almacene "Desconocido":
alter table libros add constraint DF_libros_autor default 'Desconocido' for autor;

Definimos una restriccin "default" para el campo "precio" para que almacene 0:
alter table libros add constraint DF_libros_precio default 0 for precio;

Vemos las restricciones:


sp_helpconstraint libros;

Aparecen 4 restricciones, 1 "check", 2 "default" y 1 "primary key". Eliminamos la restriccin "DF_libros_autor":


alter table libros drop DF_libros_autor;

Eliminamos la restriccin "PK_libros_codigo":


alter table libros drop PK_libros_codigo;

Vemos si se eliminaron:
sp_helpconstraint libros;

Aparecen 2 restricciones.
if object_id('libros') is not null drop table libros; create table libros( codigo int not null, titulo varchar(40), autor varchar(30), editorial varchar(15), precio decimal(6,2) ); alter table libros add constraint PK_libros_codigo primary key(codigo);

if object_id('libros') is not null drop table libros; create table libros( codigo int not null, titulo varchar(40), autor varchar(30), editorial varchar(15), precio decimal(6,2) ); alter table libros add constraint PK_libros_codigo primary key(codigo); alter table libros add constraint CK_libros_precio check (precio>=0);

alter table libros add constraint DF_libros_autor default 'Desconocido' for autor; alter table libros add constraint DF_libros_precio default 0 for precio; sp_helpconstraint libros; alter table libros drop DF_libros_autor; alter table libros drop PK_libros_codigo; sp_helpconstraint libros;

53 - Eliminar restricciones (alter table drop)


Primer problema:
Una playa de estacionamiento almacena cada da los datos de los vehculos que ingresan en la tabla llamada "vehiculos". 1- Elimine la tabla, si existe: if object_id('vehiculos') is not null drop table vehiculos; 2- Cree la tabla: create table vehiculos( patente char(6) not null, tipo char(1),--'a'=auto, 'm'=moto horallegada datetime not null, horasalida datetime ); 3- Establezca una restriccin "check" que admita solamente los valores "a" y "m" para el campo "tipo": alter table vehiculos add constraint CK_vehiculos_tipo check (tipo in ('a','m')); 4- Establezca una restriccin "default" para el campo "tipo" que almacene el valor "a" en caso de no ingresarse valor para dicho campo: alter table vehiculos add constraint DF_vehiculos_tipo default 'a' for tipo;

5- Establezca una restriccin "check" para el campo "patente" para que acepte 3 letras seguidas de 3 dgitos: alter table vehiculos add constraint CK_vehiculos_patente_patron check (patente like '[A-Z][A-Z][A-Z][0-9][0-9][0-9]'); 6- Agregue una restriccin "primary key" que incluya los campos "patente" y "horallegada": alter table vehiculos add constraint PK_vehiculos_patentellegada primary key(patente,horallegada); 7- Ingrese un vehculo: insert into vehiculos values('SDR456','a','2005/10/10 10:10',null); 8- Intente ingresar un registro repitiendo la clave primaria: insert into vehiculos values('SDR456','m','2005/10/10 10:10',null); No se permite. 9- Ingrese un registro repitiendo la patente pero no la hora de llegada: insert into vehiculos values('SDR456','m','2005/10/10 12:10',null); 10- Ingrese un registro repitiendo la hora de llegada pero no la patente: insert into vehiculos values('SDR111','m','2005/10/10 10:10',null); 11- Vea todas las restricciones para la tabla "vehiculos": sp_helpconstraint vehiculos; aparecen 4 filas, 2 correspondientes a restricciones "check", 1 a "default" y 1 a "primary key". 12- Elimine la restriccin "default" del campo "tipo". 13- Vea si se ha eliminado: sp_helpconstraint vehiculos; 14- Elimine la restriccin "primary key" y "check". 15- Vea si se han eliminado: sp_helpconstraint vehiculos;

Ver solucin
if object_id('vehiculos') is not null drop table vehiculos; create table vehiculos( patente char(6) not null, tipo char(1),--'a'=auto, 'm'=moto horallegada datetime not null, horasalida datetime ); alter table vehiculos add constraint CK_vehiculos_tipo check (tipo in ('a','m'));

alter table vehiculos add constraint DF_vehiculos_tipo default 'a' for tipo; alter table vehiculos add constraint CK_vehiculos_patente_patron check (patente like '[A-Z][A-Z][A-Z][0-9][0-9][0-9]'); alter table vehiculos add constraint PK_vehiculos_patentellegada primary key(patente,horallegada); insert into vehiculos values('SDR456','a','2005/10/10 10:10',null); insert into vehiculos values('SDR456','m','2005/10/10 10:10',null); insert into vehiculos values('SDR456','m','2005/10/10 12:10',null); insert into vehiculos values('SDR111','m','2005/10/10 10:10',null); sp_helpconstraint vehiculos; alter table vehiculos drop DF_vehiculos_tipo; sp_helpconstraint vehiculos; alter table vehiculos drop PK_vehiculos_patentellegada, CK_vehiculos_tipo; sp_helpconstraint vehiculos;

54 - Crear y asociar reglas (create rule sp_bindrule)


Vimos que SQL Server ofrece varias alternativas para asegurar la integridad de datos, mediante el uso de: 1. RESTRICCIONES (constraints), que se establecen en tablas y campos y son controlados automticamente por SQL Server. Hay 3 tipos: I) DE LOS CAMPOS (hace referencia a los valores vlidos para un campo determinado). Pueden ser: a) DEFAULT: especifica un valor por defecto para un campo cuando no se inserta explcitamente en un comando "insert".

b) CHECK: especifica un rango de valores que acepta un campo, se emplea en inserciones y actualizaciones ("insert" y "update"). II) DE LA TABLA (asegura un identificador nico para cada registro de una tabla). Hay 2 tipos: a) PRIMARY KEY: identifica unvocamente cada uno de los registros; asegura que no haya valores duplicados ni valores nulos. Se crea un ndice automticamente. b) UNIQUE: impide la duplicacin de claves alternas (no primarias). Se permiten valores nulos. Se crea un ndice automticamente. III) REFERENCIAL: lo veremos ms adelante. 2. REGLAS (rules) y 3. VALORES PREDETERMINADOS (defaults).

Veamos las reglas. Las reglas especifican los valores que se pueden ingresar en un campo, asegurando que los datos se encuentren en un intervalo de valores especfico, coincidan con una lista de valores o sigan un patrn. Una regla se asocia a un campo de una tabla (o a un tipo de dato definido por el usuario, tema que veremos posteriormente). Un campo puede tener solamente UNA regla asociado a l. Sintaxis bsica es la siguiente:
create rule NOMBREREGLA as @VARIABLE CONDICION

Entonces, luego de "create rule" se coloca el nombre de la regla, luego la palabra clave "as" seguido de una variable (a la cual la precede el signo arroba) y finalmente la condicin. Por convencin, nombraremos las reglas comenzando con "RG", el nombre del campo al que se asocia y alguna palabra que haga referencia a la condicin. La variable puede tener cualquier nombre, pero debe estar precedido por el signo arroba (@), dicha variable ser reemplazada por el valor del campo cuando se asocie. La condicin se refiere a los valores permitidos para inserciones y actualizaciones y puede contener cualquier expresin vlida para una clusula "where"; no puede hacer referencia a los campos de una tabla.

Creamos una regla para restringir los valores que se pueden ingresar en un campo "sueldo" de una tabla llamada "empleados", estableciendo un intervalo de valores:
create rule RG_sueldo_intervalo as @sueldo between 100 and 1000

Luego de crear la regla, debemos asociarla a un campo ejecutando un procedimiento almacenado del sistema empleando la siguiente sintaxis bsica:
exec sp_bindrule NOMBREREGLA, 'TABLA.CAMPO';

Asociamos la regla creada anteriormente al campo "sueldo" de la tabla "empleados":


exec sp_bindrule RG_sueldo_intervalo, 'empleados.sueldo';

Si intentamos agregar (o actualizar) un registro con valor para el campo "sueldo" que no est en el intervalo de valores especificado en la regla, aparece un mensaje de error indicando que hay conflicto con la regla y la insercin (o actualizacin) no se realiza. SQL Server NO controla los datos existentes para confirmar que cumplen con la regla como lo hace al aplicar restricciones; si no los cumple, la regla se asocia igualmente; pero al ejecutar una instruccin "insert" o "update" muestra un mensaje de error, es decir, acta en inserciones y actualizaciones. La regla debe ser compatible con el tipo de datos del campo al cual se asocia; si esto no sucede, SQL Server no lo informa al crear la regla ni al asociarla, pero al ejecutar una instruccin "insert" o "update" muestra un mensaje de error. No se puede crear una regla para campos de tipo text, image, o timestamp. Si asocia una nueva regla a un campo que ya tiene asociada otra regla, la nueva regla reeemplaza la asociacin anterior; pero la primera regla no desaparece, solamente se deshace la asociacin. La sentencia "create rule" no puede combinarse con otras sentencias en un lote. La funcin que cumple una regla es bsicamente la misma que una restriccin "check", las siguientes caractersticas explican algunas diferencias entre ellas: - podemos definir varias restricciones "check" sobre un campo, un campo solamente puede tener una regla asociada a l; - una restriccin "check" se almacena con la tabla, cuando sta se elimina, las restricciones tambin se borran. Las reglas son objetos diferentes e independientes de las tablas, si eliminamos una tabla, las asociaciones desaparecen, pero las reglas siguen existiendo en la base de datos;

- una restriccin "check" puede incluir varios campos; una regla puede asociarse a distintos campos (incluso de distintas tablas); - una restriccin "check" puede hacer referencia a otros campos de la misma tabla, una regla no. Un campo puede tener reglas asociadas a l y restricciones "check". Si hay conflicto entre ellas, SQL Server no lo informa al crearlas y/o asociarlas, pero al intentar ingresar un valor que alguna de ellas no permita, aparece un mensaje de error. Con "sp_helpconstraint" podemos ver las reglas asociadas a los campos de una tabla. Con "sp_help" podemos ver todos los objetos de la base de datos activa, incluyendo las reglas, en tal caso en la columna "Object_type" aparece "rule".

54 - Crear y asociar reglas (create rule sp_bindrule)


Problema: Una empresa tiene registrados datos de sus empleados en una tabla llamada "empleados". Eliminamos la tabla si existe:
if object_id('empleados') is not null drop table empleados;

La creamos con la siguiente estructura:


create table empleados ( documento varchar(8) not null, nombre varchar(30), seccion varchar(20), fechaingreso datetime, fechanacimiento datetime, hijos tinyint, sueldo decimal(6,2) );

Recuerde que las reglas son objetos independientes de las tablas (no se eliminan al borrar la tabla), as que debemos eliminarlas con las siguientes intrucciones (en el siguiente captulo explicaremos este tema):
if object_id ('RG_documento_patron') is not null drop rule RG_documento_patron; if object_id ('RG_empleados_seccion') is not null drop rule RG_empleados_seccion; if object_id ('RG_empleados_fechaingreso') is not null

drop rule RG_empleados_fechaingreso; if object_id ('RG_hijos') is not null drop rule RG_hijos; if object_id ('RG_empleados_sueldo') is not null drop rule RG_empleados_sueldo; if object_id ('RG_empleados_sueldo2') is not null drop rule RG_empleados_sueldo2;

Ingresamos algunos registros:


insert into empleados values('22222222','Ana Acosta','Contaduria','1990-10-10','1972-1010',2,700); insert into empleados values('23333333','Carlos Costa','Contaduria','1990-12-10','1972-0504',0,750); insert into empleados values('24444444','Daniel Duarte','Sistemas','1995-05-05','1975-1006',1,880); insert into empleados values('25555555','Fabiola Fuentes','Secretaria','1998-02-25','197802-08',3,550); insert into empleados values('26666666','Gaston Garcia','Secretaria','1999-05-08','1981-0101',3,670); insert into empleados values('27777777','Ines Irala','Gerencia','2000-04-10','1985-1212',0,6000);

Creamos una regla que establezca un patrn para el documento:


create rule RG_documento_patron as @documento like '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]';

Ejecutamos el procedimiento almacenado del sistema "sp_help" para ver si la regla creada anteriormente fue creada:
sp_help;

Ejecutamos el procedimiento almacenado del sistema "sp_helpconstraint" para ver si est asociada la regla a algn campo de "empleados":
sp_helpconstraint empleados;

No aparece porque an no la asociamos. Si ingresamos un registro con un documento que no cumpla la regla, SQL Server lo acepta porque la regla an no est asociada al campo:
insert into empleados values('ab888888','Juan Juarez','Secretaria','2001-04-11','1986-1112',0,600);

Asociamos la regla "RG_documento_patron" al campo "documento":


exec sp_bindrule RG_documento_patron, 'empleados.documento';

Note que hay un documento que no cumple la regla, pero SQL Server no controla los datos existentes, acta en inserciones y actualizaciones, si intentamos ingresar un valor para "documento" en el cual incluyamos caracteres, aparecer un mensaje de error. Volvemos a ejecutar "sp_helpconstraint":
sp_helpconstraint empleados;

Aparece la regla. Creamos una regla para restringir los valores que se pueden ingresar en un campo "seccion":
create rule RG_empleados_seccion as @seccion in ('Secretaria','Contaduria','Sistemas','Gerencia');

La asociamos al campo "seccion":


exec sp_bindrule RG_empleados_seccion, 'empleados.seccion';

Creamos una regla para restringir los valores que se pueden ingresar en el campo "fechaingreso", para que no sea posterior a la fecha actual:
create rule RG_empleados_fechaingreso as @fecha <= getdate();

Asociamos la regla anteriormente creada a los campos "fechaingreso" y "fechanacimiento":


exec sp_bindrule RG_empleados_fechaingreso, 'empleados.fechaingreso'; exec sp_bindrule RG_empleados_fechaingreso, 'empleados.fechanacimiento';

Creamos una regla para restringir los valores que se pueden ingresar en el campo "hijos":
create rule RG_hijos as @hijos between 0 and 20;

La asociamos al campo "hijos":


exec sp_bindrule RG_hijos, 'empleados.hijos';

Creamos una regla para restringir los valores que se pueden ingresar en un campo "sueldo":
create rule RG_empleados_sueldo as @sueldo>0 and @sueldo<= 5000;

La asociamos al campo "sueldo":


exec sp_bindrule RG_empleados_sueldo, 'empleados.sueldo';

Si intentamos ingresar (o actualizar) un registro con el valor "6000" para "sueldo", SQL Server muestra un mensaje de error y la accin no se realiza. Creamos otra regla para restringir los valores que se pueden ingresar en un campo "sueldo":
create rule RG_empleados_sueldo2 as @sueldo>0 and @sueldo<= 7000;

La asociamos al campo "sueldo":


exec sp_bindrule RG_empleados_sueldo2, 'empleados.sueldo';

La nueva regla reeemplaza la asociacin anterior. Ahora podemos ingresar el valor "6000" en el campo "sueldo":
insert into empleados values('29999999','Luis Lopez','Secretaria','2002-03-03','1990-0909',0,6000);

La regla "RG_empleados_sueldo" no desaparece, solamente se deshizo la asociacin, vemoslo:


sp_help;

La regla "RG_empleados_sueldo" an existe en la base de datos. Veamos las reglas asociadas:


sp_helpconstraint empleados;

La regla "RG_empleados_sueldo" ya no est asociada a ningn campo de la tabla "empleados" as que no aparece; la regla "RG_empleados_sueldo2" si, junto con las otras 5 reglas asociadas.

if object_id('empleados') is not null drop table empleados; create table empleados ( documento varchar(8) not null, nombre varchar(30), seccion varchar(20), fechaingreso datetime, fechanacimiento datetime, hijos tinyint, sueldo decimal(6,2) ); if object_id ('RG_documento_patron') is not null drop rule RG_documento_patron;
if object_id('empleados') is not null drop table empleados; create table empleados ( documento varchar(8) not null, nombre varchar(30), seccion varchar(20), fechaingreso datetime, fechanacimiento datetime, hijos tinyint, sueldo decimal(6,2) ); if object_id ('RG_documento_patron') is not null drop rule RG_documento_patron; if object_id ('RG_empleados_seccion') is not null drop rule RG_empleados_seccion; if object_id ('RG_empleados_fechaingreso') is not null drop rule RG_empleados_fechaingreso; if object_id ('RG_hijos') is not null drop rule RG_hijos; if object_id ('RG_empleados_sueldo') is not null drop rule RG_empleados_sueldo; if object_id ('RG_empleados_sueldo2') is not null drop rule RG_empleados_sueldo2; insert into empleados values('22222222','Ana Acosta','Contaduria','1990-10-10','1972-10-10',2,700); insert into empleados values('23333333','Carlos Costa','Contaduria','1990-12-10','1972-05-04',0,750); insert into empleados values('24444444','Daniel Duarte','Sistemas','1995-05-05','1975-10-06',1,880); insert into empleados values('25555555','Fabiola Fuentes','Secretaria','1998-02-25','1978-02-08',3,550); insert into empleados values('26666666','Gaston Garcia','Secretaria','1999-05-08','1981-01-01',3,670); insert into empleados values('27777777','Ines Irala','Gerencia','2000-04-10','1985-12-12',0,6000); create rule RG_documento_patron as @documento like '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'; sp_help; sp_helpconstraint empleados; insert into empleados values('ab888888','Juan Juarez','Secretaria','2001-04-11','1986-11-12',0,600); exec sp_bindrule RG_documento_patron, 'empleados.documento'; sp_helpconstraint empleados;

create rule RG_empleados_seccion as @seccion in ('Secretaria','Contaduria','Sistemas','Gerencia'); exec sp_bindrule RG_empleados_seccion, 'empleados.seccion'; create rule RG_empleados_fechaingreso as @fecha <= getdate(); exec sp_bindrule RG_empleados_fechaingreso, 'empleados.fechaingreso'; exec sp_bindrule RG_empleados_fechaingreso, 'empleados.fechanacimiento'; create rule RG_hijos as @hijos between 0 and 20; exec sp_bindrule RG_hijos, 'empleados.hijos'; create rule RG_empleados_sueldo as @sueldo>0 and @sueldo<= 5000; exec sp_bindrule RG_empleados_sueldo, 'empleados.sueldo'; create rule RG_empleados_sueldo2 as @sueldo>0 and @sueldo<= 7000; exec sp_bindrule RG_empleados_sueldo2, 'empleados.sueldo'; insert into empleados values('29999999','Luis Lopez','Secretaria','2002-03-03','1990-09-09',0,6000); sp_help; sp_helpconstraint empleados;

54 - Crear y asociar reglas (create rule sp_bindrule)


Primer problema:
Una playa de estacionamiento almacena cada da los datos de los vehculos que ingresan en la tabla llamada "vehiculos". 1- Elimine la tabla, si existe: if object_id('vehiculos') is not null drop table vehiculos; 2- Elimine las siguientes reglas: if object_id ('RG_patente_patron') is not null drop rule RG_patente_patron; if object_id ('RG_horallegada') is not null drop rule RG_horallegada; if object_id ('RG_vehiculos_tipo') is not null drop rule RG_vehiculos_tipo; if object_id ('RG_vehiculos_tipo2') is not null drop rule RG_vehiculos_tipo2; if object_id ('RG_menor_fechaactual') is not null drop rule RG_menor_fechaactual; 3- Cree la tabla: create table vehiculos( patente char(6) not null,

tipo char(1),--'a'=auto, 'm'=moto horallegada datetime not null, horasalida datetime ); 4- Ingrese algunos registros: insert into vehiculos values insert into vehiculos values 01 10:10'); insert into vehiculos values insert into vehiculos values ('AAA111','a','1990-02-01 08:10',null); ('BCD222','m','1990-02-01 08:10','1990-02('BCD222','m','1990-02-01 12:00',null); ('CC1234','a','1990-02-01 12:00',null);

5- Cree una regla para restringir los valores que se pueden ingresar en un campo "patente" (3 letras seguidas de 3 dgitos): create rule RG_patente_patron as @patente like '[A-Z][A-Z][A-Z][0-9][0-9][0-9]' 6- Ejecute el procedimiento almacenado del sistema "sp_help" para ver que la regla creada anteriormente existe: sp_help; 7- Ejecute el procedimiento almacenado del sistema "sp_helpconstraint" para ver que la regla creada anteriormente no est asociada an a ningn campo de la tabla "vehiculos". 8- Asocie la regla al campo "patente": Note que hay una patente que no cumple la regla, SQL Server NO controla los datos existentes, pero si controla las inserciones y actualizaciones: select *from empleados; 9- Intente ingresar un registro con valor para el campo "patente" que no cumpla con la regla. aparece un mensaje de error indicando que hay conflicto con la regla y la insercin no se realiza. 10- Cree otra regla que controle los valores para el campo "tipo" para que solamente puedan ingresarse los caracteres "a" y "m". 11- Asocie la regla al campo "tipo". 12- Intente actualizar un registro cambiando el valor de "tipo" a un valor que no cumpla con la regla anterior. No lo permite. 13- Cree otra regla llamada "RG_vehiculos_tipo2" que controle los valores para el campo "tipo" para que solamente puedan ingresarse los caracteres "a", "c" y "m". 14- Si la asociamos a un campo que ya tiene asociada otra regla, la nueva regla reeemplaza la

asociacin anterior. Asocie la regla creada en el punto anterior al campo "tipo". 15- Actualice el registro que no pudo actualizar en el punto 12: update vehiculos set tipo='c' where patente='AAA111'; 16- Cree una regla que permita fechas menores o iguales a la actual. 17- Asocie la regla anterior a los campos "horallegada" y "horasalida": exec sp_bindrule RG_menor_fechaactual, 'vehiculos.horallegada'; exec sp_bindrule RG_menor_fechaactual, 'vehiculos.horasalida'; 18- Ingrese un registro en el cual la hora de entrada sea posterior a la hora de salida: insert into vehiculos values ('NOP555','a','1990-02-01 10:10','1990-0201 08:30'); 19- Intente establecer una restriccin "check" que asegure que la fecha y hora de llegada a la playa no sea posterior a la fecha y hora de salida: alter table vehiculos add constraint CK_vehiculos_llegada_salida check(horallegada<=horasalida); No lo permite porque hay un registro que no cumple la restriccin. 20- Elimine dicho registro: delete from vehiculos where patente='NOP555'; 21- Establezca la restriccin "check" que no pudo establecer en el punto 19: alter table vehiculos add constraint CK_vehiculos_llegada_salida check(horallegada<=horasalida); 22- Cree una restriccin "default" que almacene el valor "b" en el campo "tipo: alter table vehiculos add constraint DF_vehiculos_tipo default 'b' for tipo; Note que esta restriccin va contra la regla asociada al campo "tipo" que solamente permite los valores "a", "c" y "m". SQL Server no informa el conflicto hasta que no intenta ingresar el valor por defecto. 23- Intente ingresar un registro con el valor por defecto para el campo "tipo": insert into vehiculos values ('STU456',default,'1990-02-01 10:10','199002-01 15:30'); No lo permite porque va contra la regla asociada al campo "tipo". 24- Vea las reglas asociadas a "empleados" y las restricciones aplicadas a la misma tabla ejecutando "sp_helpconstraint". Muestra 1 restriccin "check", 1 restriccin "default" y 4 reglas asociadas.

if object_id('vehiculos') is not null drop table vehiculos; if object_id ('RG_patente_patron') is not null drop rule RG_patente_patron; if object_id ('RG_horallegada') is not null drop rule RG_horallegada; if object_id ('RG_vehiculos_tipo') is not null drop rule RG_vehiculos_tipo; if object_id ('RG_vehiculos_tipo2') is not null drop rule RG_vehiculos_tipo2; if object_id ('RG_menor_fechaactual') is not null drop rule RG_menor_fechaactual; create table vehiculos( patente char(6) not null, tipo char(1),--'a'=auto, 'm'=moto horallegada datetime not null, horasalida datetime ); insert into insert into 01 10:10'); insert into insert into vehiculos values ('AAA111','a','1990-02-01 08:10',null); vehiculos values ('BCD222','m','1990-02-01 08:10','1990-02vehiculos values ('BCD222','m','1990-02-01 12:00',null); vehiculos values ('CC1234','a','1990-02-01 12:00',null);

create rule RG_patente_patron as @patente like '[A-Z][A-Z][A-Z][0-9][0-9][0-9]'; sp_help; sp_helpconstraint vehiculos; sp_bindrule RG_patente_patron,'vehiculos.patente'; select *from empleados; insert into vehiculos values ('FGHIJK','a','1990-02-01 18:00',null); create rule RG_vehiculos_tipo as @tipo in ('a','m'); sp_bindrule RG_vehiculos_tipo, 'vehiculos.tipo'; update vehiculos set tipo='c' where patente='AAA111'; create rule RG_vehiculos_tipo2 as @tipo in ('a','c','m'); sp_bindrule RG_vehiculos_tipo2, 'vehiculos.tipo'; update vehiculos set tipo='c' where patente='AAA111'; create rule RG_menor_fechaactual as @fecha <= getdate();

exec sp_bindrule RG_menor_fechaactual, 'vehiculos.horallegada'; exec sp_bindrule RG_menor_fechaactual, 'vehiculos.horasalida'; insert into vehiculos values ('NOP555','a','1990-02-01 10:10','1990-0201 08:30'); alter table vehiculos add constraint CK_vehiculos_llegada_salida check(horallegada<=horasalida); delete from vehiculos where patente='NOP555'; alter table vehiculos add constraint CK_vehiculos_llegada_salida check(horallegada<=horasalida); alter table vehiculos add constraint DF_vehiculos_tipo default 'b' for tipo; insert into vehiculos values ('STU456',default,'1990-02-01 10:10','199002-01 15:30'); sp_helpconstraint vehiculos;

55 - Eliminar y dasasociar reglas (sp_unbindrule - drop rule)


Para eliminar una regla, primero se debe deshacer la asociacin, ejecutando el procedimiento almacenado del sistema "sp_unbindrule":
exec sp_unbindrule 'TABLA.CAMPO';

No es posible eliminar una regla si est asociada a un campo. Si intentamos hacerlo, aparece un mensaje de error y la eliminacin no se realiza. Con la instruccin "drop rule" eliminamos la regla:
drop rule NOMBREREGLA;

Quitamos la asociacin de la regla "RG_sueldo_intervalo" con el campo "sueldo" de la tabla "empleados" tipeando:
exec sp_unbindrule 'empleados.sueldo';

Luego de quitar la asociacin la eliminamos:


drop rule RG_sueldo_100a1000;

Si eliminamos una tabla, las asociaciones de reglas de sus campos desaparecen, pero las reglas siguen existiendo.

55 - Eliminar y dasasociar reglas (sp_unbindrule - drop rule)


Problema: Una empresa registra los datos de sus empleados en una tabla llamada "empleados". Eliminamos la tabla "empleados" si existe:
if object_id ('empleados') is not null drop table empleados;

Recordemos que si eliminamos una tabla, las asociaciones de reglas de sus campos desaparecen, pero las reglas siguen existiendo. Si intentamos crear una regla con igual nombre que una existente, aparecer un mensaje indicndolo, por ello, debemos eliminar las reglas (si existen) para poder crearlas nuevamente:
if object_id ('RG_sueldo_100a1000') is not null drop rule RG_sueldo_100a1000;

Creamos la tabla:
create table empleados( documento char(8), nombre varchar(30) not null, seccion varchar(20), sueldo decimal(6,2), primary key(documento) );

Creamos una regla para restringir los valores que se pueden ingresar en un campo "sueldo":
create rule RG_sueldo_100a1000 as @sueldo between 100 and 1000;

Asociamos la regla creada anteriormente al campo "sueldo":


exec sp_bindrule RG_sueldo_100a1000, 'empleados.sueldo';

Si intentamos ingresar un registro con valor para el campo "sueldo" de "1200" aparece un mensaje de error indicando que hay conflicto con la regla y la insercin no se realiza. Vemos si la regla est asociada a algn campo de "empleados":
sp_helpconstraint empleados;

Aparece la regla. Si intentamos eliminar la regla "RG_sueldo_100a 1000" aparece un mensaje de error indicando que no se puede eliminar la regla porque est asociada. Quitamos la asociacin:
exec sp_unbindrule 'empleados.sueldo';

Ahora que hemos quitado la asociacin, podemos ingresar el valor "1200" en el campo "sueldo":
insert into empleados values ('30111222','Pedro Torres','Contaduria',1200);

Vemos si la regla est asociada a algn campo de "empleados":


sp_helpconstraint empleados;

No aparece la regla. Ejecutamos el procedimiento "sp_help" para verificar que la regla an existe:
sp_help;

Aparece la regla. Ahora si podemos borrar la regla:


drop rule RG_sueldo_100a1000;
if object_id ('empleados') is not null drop table empleados; if object_id ('RG_sueldo_100a1000') is not null drop rule RG_sueldo_100a1000; create table empleados( documento char(8), nombre varchar(30) not null, seccion varchar(20), sueldo decimal(6,2), primary key(documento) ); create rule RG_sueldo_100a1000
if object_id ('empleados') is not null drop table empleados; if object_id ('RG_sueldo_100a1000') is not null drop rule RG_sueldo_100a1000; create table empleados(

documento char(8), nombre varchar(30) not null, seccion varchar(20), sueldo decimal(6,2), primary key(documento) ); create rule RG_sueldo_100a1000 as @sueldo between 100 and 1000; exec sp_bindrule RG_sueldo_100a1000, 'empleados.sueldo'; sp_helpconstraint empleados; exec sp_unbindrule 'empleados.sueldo'; insert into empleados values ('30111222','Pedro Torres','Contaduria',1200); sp_helpconstraint empleados; sp_help; drop rule RG_sueldo_100a1000;

55 - Eliminar y dasasociar reglas (sp_unbindrule - drop rule)


Primer problema:
Una playa de estacionamiento almacena cada da los datos de los vehculos que ingresan en la tabla llamada "vehiculos". 1- Elimine la tabla, si existe: if object_id('vehiculos') is not null drop table vehiculos; 2- Elimine las siguientes reglas, si existen: if object_id ('RG_patente_patron') is not null drop rule RG_patente_patron; if object_id ('RG_vehiculos_tipo') is not null drop rule RG_vehiculos_tipo; if object_id ('RG_vehiculos_tipo2') is not null drop rule RG_vehiculos_tipo2; 3- Cree la tabla: create table vehiculos( patente char(6) not null, tipo char(1),--'a'=auto, 'm'=moto horallegada datetime not null, horasalida datetime ); 4- Cree una regla para restringir los valores que se pueden ingresar en un campo "patente" (3 letras seguidas de 3 dgitos): create rule RG_patente_patron as @patente like '[A-Z][A-Z][A-Z][0-9][0-9][0-9]';

5-Asocie la regla al campo "patente": sp_bindrule RG_patente_patron,'vehiculos.patente'; 6- Intente ingresar un registro con valor para el campo "patente" que no cumpla con la regla: insert into vehiculos values ('FGHIJK','a','1990-02-01 18:00',null); aparece un mensaje de error indicando que hay conflicto con la regla y la insercin no se realiza. 7- Cree otra regla que controle los valores para el campo "tipo" para que solamente puedan ingresarse los caracteres "a" y "m": create rule RG_vehiculos_tipo as @tipo in ('a','m') 8- Asocie la regla al campo "tipo": sp_bindrule RG_vehiculos_tipo, 'vehiculos.tipo'; 9- Intente ingresar un registro con el valor 'c' para "tipo": insert into vehiculos values('AAA111','c','2001-10-10 10:10',NULL); No lo permite. 10- Cree otra regla llamada "RG_vehiculos_tipo2" que controle los valores para el campo "tipo" para que solamente puedan ingresarse los caracteres "a", "c" y "m": create rule RG_vehiculos_tipo2 as @tipo in ('a','c','m'); 11- Si la asociamos a un campo que ya tiene asociada otra regla, la nueva regla reeemplaza la asociacin anterior. Asocie la regla creada en el punto anterior al campo "tipo". 12- Ingrese el registro que no pudo ingresar en el punto 9. 13- Intente eliminar la regla "RG_vehiculos_tipo2". No es posible porque est asociada a un campo de "vehiculos". 14- Elimine la regla "RG_vehiculos_tipo". Es posible porque no est asociada a ningn campo. 15- Intente eliminar la regla "RG_patente_patron". No es posible porque est asociada. 16- Quite la asociacin de la regla con el campo "patente" de "vehiculos". 17- Vea si la regla "RG_patente_patron" est asociada a algn campo de "vehiculos". No lo est. 18- Verifique que la regla an existe en la base de datos activa: sp_help; aparece la regla. 19- Elimine la regla que no pudo eliminar en el punto 15.

20- Verifique que la regla ya no existe en la base de datos activa. No aparece la regla "RG_patente_patron".

Ver solucin
if object_id('vehiculos') is not null drop table vehiculos; if object_id ('RG_patente_patron') is not null drop rule RG_patente_patron; if object_id ('RG_vehiculos_tipo') is not null drop rule RG_vehiculos_tipo; if object_id ('RG_vehiculos_tipo2') is not null drop rule RG_vehiculos_tipo2; create table vehiculos( patente char(6) not null, tipo char(1),--'a'=auto, 'm'=moto horallegada datetime not null, horasalida datetime ); create rule RG_patente_patron as @patente like '[A-Z][A-Z][A-Z][0-9][0-9][0-9]'; sp_bindrule RG_patente_patron,'vehiculos.patente'; insert into vehiculos values ('FGHIJK','a','1990-02-01 18:00',null); create rule RG_vehiculos_tipo as @tipo in ('a','m'); sp_bindrule RG_vehiculos_tipo, 'vehiculos.tipo'; insert into vehiculos values('AAA111','c','2001-10-10 10:10',NULL); create rule RG_vehiculos_tipo2 as @tipo in ('a','c','m'); sp_bindrule RG_vehiculos_tipo2, 'vehiculos.tipo'; insert into vehiculos values('AAA111','c','2001-10-10 10:10',NULL); drop rule RG_vehiculos_tipo2; drop rule RG_vehiculos_tipo; drop rule RG_patente_patron; exec sp_unbindrule 'vehiculos.patente'; sp_helpconstraint vehiculos; sp_help; drop rule RG_patente_patron; sp_help;

56 - Informacin de reglas (sp_help sp_helpconstraint)


Podemos utilizar el procedimiento almacenado "sp_help" con el nombre del objeto del cual queremos informacin, en este caso el nombre de una regla:
sp_help NOMBREREGLA;

muestra nombre, propietario, tipo y fecha de creacin. Con "sp_help", no sabemos si las reglas existentes estn o no asociadas a algn campo. "sp_helpconstraint" retorna una lista de todas las restricciones que tiene una tabla. Podemos ver las reglas asociadas a una tabla con este procedimiento almacenado:
sp_helpconstraint NOMBRETABLA;

muestra la siguiente informacin: - constraint_type: indica que es una regla con "RULE", nombrando el campo al que est asociada. - constraint_name: nombre de la regla. - constraint_keys: muestra el texto de la regla. Para ver el texto de una regla empleamos el procedimiento almacenado "sp_helptext" seguido del nombre de la regla:
sp_helptext NOMBREREGLA;

Tambin se puede consultar la tabla del sistema "sysobjects", que nos muestra el nombre y varios datos de todos los objetos de la base de datos actual. La columna "xtype" indica el tipo de objeto, en caso de ser una regla aparece el valor "R":
select *from sysobjects;

Si queremos ver todas las reglas creadas por nosotros, podemos tipear:
select *from sysobjects where xtype='R' and-- tipo regla name like 'RG%';--bsqueda con comodn

56 - Informacin de reglas (sp_help sp_helpconstraint)


Problema: Una empresa registra los datos de sus empleados en una tabla llamada "empleados". Eliminamos la tabla "empleados" (si existe) y las reglas:
if object_id ('empleados') is not null drop table empleados; if object_id ('RG_sueldo') is not null drop rule RG_sueldo; if object_id ('RG_seccion_lista') is not null drop rule RG_seccion_lista;

Creamos la tabla:
create table empleados( documento char(8) not null, nombre varchar(30) not null, seccion varchar(20), sueldo decimal(6,2), primary key(documento) );

Creamos una regla para el campo "sueldo":


create rule RG_sueldo as @sueldo between 100 and 1000;

Asociamos la regla creada anteriormente al campo "sueldo":


exec sp_bindrule RG_sueldo, 'empleados.sueldo';

Creamos una regla con una lista de valores para "seccion":


create rule RG_seccion_lista as @seccion in ('Sistemas','Secretaria','Contaduria');

No la asociamos. Llamemos al procedimiento almacenado "sp_help" junto al nombre de la regla de la cual queremos informacin:
sp_help RG_sueldo;

muestra el nombre, propietario, tipo y fecha de creacin.

Para ver las reglas asociadas a la tabla "empleados" tipeamos:


sp_helpconstraint empleados;

retorna una lista de todas las restricciones que tiene una tabla. Tambin las reglas asociadas. Aparecen 2 filas: una con informacin de la restriccin "primary key" y otra con informacin de la regla asociada, esta ltima muestra: - constraint_type: indica que es una regla con "RULE", nombrando el campo al que est asociada. - constraint_name: nombre de la regla. - constraint_keys: el texto de la regla. - las otras columnas no tienen informacin. Note que no aparece la regla "RG_seccion_lista" porque no fue asociada a la tabla. Si asociamos la regla a la tabla:
exec sp_bindrule RG_seccion_lista, 'empleados.seccion';

y ejecutamos el procedimiento nuevamente:


sp_helpconstraint empleados;

Aparecen ambas reglas. Tambin podemos ver el texto de una regla empleando "sp_helptext":
sp_helptext "RG_seccion_lista";

Deshacemos la asociacin de la regla "RG_sueldo" y la eliminamos:


exec sp_unbindrule 'empleados.sueldo'; drop rule RG_sueldo;

Verificamos que ya no existe tal regla:


sp_help RG_sueldo;

Vemos si la regla "RG_seccion_lista" existe consultando la tabla "sysobjects":


select *from sysobjects where xtype='R' and name like '%seccion%';

if object_id ('empleados') is not null drop table empleados; if object_id ('RG_sueldo') is not null drop rule RG_sueldo; if object_id ('RG_seccion_lista') is not null drop rule RG_seccion_lista; create table empleados( documento char(8) not null, nombre varchar(30) not null, seccion varchar(20), sueldo decimal(6,2), primary key(documento) );

if object_id ('empleados') is not null drop table empleados; if object_id ('RG_sueldo') is not null drop rule RG_sueldo; if object_id ('RG_seccion_lista') is not null drop rule RG_seccion_lista; create table empleados( documento char(8) not null, nombre varchar(30) not null, seccion varchar(20), sueldo decimal(6,2), primary key(documento) ); create rule RG_sueldo as @sueldo between 100 and 1000; exec sp_bindrule RG_sueldo, 'empleados.sueldo'; create rule RG_seccion_lista as @seccion in ('Sistemas','Secretaria','Contaduria'); sp_help RG_sueldo; sp_helpconstraint empleados; exec sp_bindrule RG_seccion_lista, 'empleados.seccion'; sp_helpconstraint empleados; sp_helptext "RG_seccion_lista"; exec sp_unbindrule 'empleados.sueldo'; drop rule RG_sueldo; sp_help RG_sueldo; select *from sysobjects where xtype='R' and name like '%seccion%';

57 - Valores predeterminados (create default)

Hemos visto que para mantener la integridad declarativa se emplean restricciones, reglas (que hemos estudiado en secciones anteriores) y valores predeterminados. Veamos los valores predeterminados. Los valores predeterminados se asocian con uno o varios campos (o tipos de datos definidos por el usuario); se definen una sola vez y se pueden usar muchas veces. Si no se coloca un valor cuando se ingresan datos, el valor predeterminado especifica el valor del campo al que est asociado. Sintaxis bsica:
create default NOMBREVALORPREDETERMINADO as VALORPREDETERMINADO;

"VALORPREDETERMINADO" no puede hacer referencia a campos de una tabla (u otros objetos) y debe ser compatible con el tipo de datos y longitud del campo al cual se asocia; si esto no sucede, SQL Server no lo informa al crear el valor predeterminado ni al asociarlo, pero al ejecutar una instruccin "insert" muestra un mensaje de error. En el siguiente ejemplo creamos un valor predeterminado llamado "VP_datodesconocido' con el valor "Desconocido":
create default VP_datodesconocido as 'Desconocido'

Luego de crear un valor predeterminado, debemos asociarlo a un campo (o a un tipo de datos definido por el usuario) ejecutando el procedimiento almacenado del sistema "sp_bindefault":
exec sp_bindefault NOMBRE, 'NOMBRETABLA.CAMPO';

La siguiente sentencia asocia el valor predeterminado creado anteriormente al campo "domicilio" de la tabla "empleados":
exec sp_bindefault VP_datodesconocido, 'empleados.domicilio';

Podemos asociar un valor predeterminado a varios campos. Asociamos el valor predeterminado "VP_datodesconocido" al campo "barrio" de la tabla "empleados":
exec sp_bindefault VP_datodesconocido, 'empleados.barrio';

La funcin que cumple un valor predeterminado es bsicamente la misma que una restriccin "default", las siguientes caractersticas explican algunas semejanzas y diferencias entre ellas:

- un campo solamente puede tener definida UNA restriccin "default", un campo solamente puede tener UN valor predeterminado asociado a l, - una restriccin "default" se almacena con la tabla, cuando sta se elimina, las restricciones tambin. Los valores predeterminados son objetos diferentes e independientes de las tablas, si eliminamos una tabla, las asociaciones desaparecen, pero los valores predeterminados siguen existiendo en la base de datos. - una restriccin "default" se establece para un solo campo; un valor predeterminado puede asociarse a distintos campos (inclusive, de diferentes tablas). - una restriccin "default" no puede establecerse sobre un campo "identity", tampoco un valor predeterminado. No se puede asociar un valor predeterminado a un campo que tiene una restriccin "default". Un campo con un valor predeterminado asociado puede tener reglas asociadas a l y restricciones "check". Si hay conflicto entre ellas, SQL Server no lo informa al crearlas y/o asociarlas, pero al intentar ingresar un valor que alguna de ellas no permita, aparece un mensaje de error. La sentencia "create default" no puede combinarse con otra sentencia en un mismo lote. Si asocia a un campo que ya tiene asociado un valor predeterminado otro valor predeterminado, la nueva asociacin reemplaza a la anterior. Veamos otros ejemplos. Creamos un valor predeterminado que inserta el valor "0" en un campo de tipo numrico:
create default VP_cero as 0;

En el siguiente creamos un valor predeterminado que inserta ceros con el formato vlido para un nmero de telfono:
create default VP_telefono as '(0000)0-000000';

Con "sp_helpconstraint" podemos ver los valores predeterminados asociados a los campos de una tabla. Con "sp_help" podemos ver todos los objetos de la base de datos activa, incluyendo los valores predeterminados, en tal caso en la columna "Object_type" aparece "default".

57 - Valores predeterminados (create default)


Problema: Una empresa registra los datos de sus empleados en una tabla llamada "empleados". Eliminamos la tabla "empleados" si existe:
if object_id ('empleados') is not null drop table empleados;

Tambin debemos eliminar los valores predeterminados con las siguientes intrucciones (en el siguiente captulo explicaremos este tema):
if object_id ('VP_cero') is not null drop default VP_cero; if object_id ('VP_100') is not null drop default VP_100; if object_id ('VP_datodesconocido') is not null drop default VP_datodesconocido; if object_id ('VP_telefono') is not null drop default VP_telefono;

Creamos la tabla:
create table empleados( nombre varchar(30), domicilio varchar(30), barrio varchar(15), telefono char(14), sueldo decimal(6,2) );

Ingresamos un registro sin valores para ver qu valores por defecto se almacenan:
insert into empleados default values; select *from empleados;

Creamos un valor predeterminado con el valor "Desconocido":


create default VP_datodesconocido as 'Desconocido';

Lo asociamos al campo "domicilio":


exec sp_bindefault VP_datodesconocido, 'empleados.domicilio';

Lo asociamos al campo "barrio":

exec sp_bindefault VP_datodesconocido, 'empleados.barrio';

Ingresamos otro registro sin especificar valores y vemos los datos:


insert into empleados default values; select *from empleados;

Creamos un valor predeterminado que inserta el valor "0":


create default VP_cero as 0;

Lo asociamos al campo "sueldo":


exec sp_bindefault VP_cero, 'empleados.sueldo';

Ingresamos un registro y verificamos los datos:


insert into empleados default values; select *from empleados;

Creamos un valor predeterminado que inserta el valor "100":


create default VP_100 as 100;

Lo asociamos al campo "sueldo":


exec sp_bindefault VP_100, 'empleados.sueldo';

Recuerde que si asociamos a un campo que ya tiene asociado un valor predeterminado otro valor predeterminado, la nueva asociacin reemplaza a la anterior. Verificamos:
insert into empleados default values; select *from empleados;

Veamos los valores predeterminados asociadas a la tabla "empleados":


sp_helpconstraint empleados;

El valor predeterminado "VP_cero" no aparece porque no est asociado a ningn campo de "empleados"; si aparecen "VP_100", "VP_datodesconocido" que est asociado a 2 campos (domicilio y barrio). Veamos si "VP_cero" existe, ejecutando el procedimiento almacenado del sistema "sp_help":
sp_help;

An existe en la base de datos. Creamos un valor predeterminado que inserta ceros con el formato vlido para un campo nmero de telfono:
create default VP_telefono as '(0000)0-000000';

La asociamos al campo "telefono" de la tabla "empleados":


exec sp_bindefault VP_telefono,'empleados.telefono';

Ingresamos un registro y verificamos los valores predeterminados almacenados:


insert into empleados default values; select *from empleados;

Veamos los valores predeterminados asociadas a la tabla "empleados":


sp_helpconstraint empleados;

Aparecen 4 filas, una por cada asociacin.


if object_id ('empleados') is not null drop table empleados; if object_id ('VP_cero') is not null drop default VP_cero; if object_id ('VP_100') is not null drop default VP_100; if object_id ('VP_datodesconocido') is not null drop default VP_datodesconocido; if object_id ('VP_telefono') is not null drop default VP_telefono; create table empleados( nombre varchar(30), domicilio varchar(30),
if object_id ('empleados') is not null drop table empleados; if object_id ('VP_cero') is not null drop default VP_cero; if object_id ('VP_100') is not null drop default VP_100; if object_id ('VP_datodesconocido') is not null drop default VP_datodesconocido; if object_id ('VP_telefono') is not null drop default VP_telefono; create table empleados( nombre varchar(30), domicilio varchar(30), barrio varchar(15), telefono char(14), sueldo decimal(6,2)

); insert into empleados default values; select *from empleados; create default VP_datodesconocido as 'Desconocido'; exec sp_bindefault VP_datodesconocido, 'empleados.domicilio'; exec sp_bindefault VP_datodesconocido, 'empleados.barrio'; insert into empleados default values; select *from empleados; create default VP_cero as 0; exec sp_bindefault VP_cero, 'empleados.sueldo'; insert into empleados default values; select *from empleados; create default VP_100 as 100; exec sp_bindefault VP_100, 'empleados.sueldo'; insert into empleados default values; select *from empleados; sp_helpconstraint empleados; -- sp_help; create default VP_telefono as '(0000)0-000000'; exec sp_bindefault VP_telefono,'empleados.telefono'; insert into empleados default values; select *from empleados; sp_helpconstraint empleados;

57 - Valores predeterminados (create default)


Primer problema:
Una empresa registra los datos de sus clientes en una tabla llamada "clientes". 1- Elimine la tabla si existe: if object_id ('clientes') is not null drop table clientes; 2- Recuerde que si elimina una tabla, las asociaciones de reglas y valores predeterminados de sus campos desaparecen, pero las reglas y valores predeterminados siguen existiendo. Si intenta crear

una regla o un valor predeterminado con igual nombre que uno existente, aparecer un mensaje indicndolo, por ello, debe eliminarlos (si existen) para poder crearlos nuevamente: if object_id ('VP_legajo_patron') is not null drop default VP_legajo_patron; if object_id ('RG_legajo_patron') is not null drop rule RG_legajo_patron; if object_id ('RG_legajo') is not null drop rule RG_legajo; if object_id ('VP_datodesconocido') is not null drop default VP_datodesconocido; if object_id ('VP_fechaactual') is not null drop default VP_fechaactual; 3- Cree la tabla: create table clientes( legajo char(4), nombre varchar(30), domicilio varchar(30), ciudad varchar(15), provincia varchar(20) default 'Cordoba', fechaingreso datetime ); 4- Cree una regla para establecer un patrn para los valores que se ingresen en el campo "legajo" (2 letras seguido de 2 cifras) llamada "RG_legajo_patron": 5- Asocie la regla al campo "legajo". 6- Cree un valor predeterminado para el campo "legajo" ('AA00') llamado "VP_legajo_patron". 7- Ascielo al campo "legajo". Recuerde que un campo puede tener un valor predeterminado y reglas asociados. 8- Cree un valor predeterminado con la cadena "??" llamado "VP_datodesconocido". 9- Ascielo al campo "domicilio". 10- Ascielo al campo "ciudad". Recuerde que un valor predeterminado puede asociarse a varios campos. 11- Ingrese un registro con valores por defecto para los campos "domicilio" y "ciudad" y vea qu almacenaron. 12- Intente asociar el valor predeterminado "VP_datodesconocido" al campo "provincia". No se puede porque dicho campo tiene una restriccin "default". 13- Cree un valor predeterminado con la fecha actual llamado "VP_fechaactual".

14- Ascielo al campo "fechaingreso". 15- Ingrese algunos registros para ver cmo se almacenan los valores para los cuales no se insertan datos. 16- Asocie el valor predeterminado "VP_datodesconocido" al campo "fechaingreso". Note que se asoci un valor predeterminado de tipo caracter a un campo de tipo "datetime"; SQL Server lo permite, pero al intentar ingresar el valor aparece un mensaje de error. 17- Ingrese un registro con valores por defecto. No lo permite porque son de distintos tipos. 18- Cree una regla que entre en conflicto con el valor predeterminado "VP_legajo_patron". 19- Asocie la regla al campo "legajo". Note que la regla especifica que el campo "legajo" debe comenzar con la letra "B", pero el valor predeterminado tiene el valor "AA00"; SQL Server realiza la asociacin, pero al intentar ingresar el valor predeterminado, no puede hacerlo y muestra un mensaje de error. 20- Intente ingresar un registro con el valor "default" para el campo "legajo". No lo permite porque al intentar ingresar el valor por defecto establecido con el valor predeterminado entra en conflicto con la regla "RG_legajo".

Ver solucin
if object_id ('clientes') is not null drop table clientes; if object_id ('VP_legajo_patron') is not null drop default VP_legajo_patron; if object_id ('RG_legajo_patron') is not null drop rule RG_legajo_patron; if object_id ('RG_legajo') is not null drop rule RG_legajo; if object_id ('VP_datodesconocido') is not null drop default VP_datodesconocido; if object_id ('VP_fechaactual') is not null drop default VP_fechaactual; create table clientes( legajo char(4), nombre varchar(30), domicilio varchar(30), ciudad varchar(15), provincia varchar(20) default 'Cordoba', fechaingreso datetime ); create rule RG_legajo_patron as @valor like '[A-Z][A-Z][0-9][0-9]';

exec sp_bindrule RG_legajo_patron,'clientes.legajo'; create default VP_legajo_patron as 'AA00'; exec sp_bindefault VP_legajo_patron,'clientes.legajo'; create default VP_datodesconocido as '??'; exec sp_bindefault VP_datodesconocido,'clientes.domicilio'; exec sp_bindefault VP_datodesconocido,'clientes.ciudad'; insert into clientes values('GF12','Ana Perez',default,default,'Cordoba','2001-10-10'); select *from clientes; exec sp_bindefault VP_datodesconocido,'clientes.provincia'; create default VP_fechaactual as getdate(); exec sp_bindefault VP_fechaactual,'clientes.fechaingreso'; insert into clientes default values; select *from clientes; exec sp_bindefault VP_datodesconocido,'clientes.fechaingreso'; insert into clientes default values; create rule RG_legajo as @valor like 'B%'; exec sp_bindrule RG_legajo,'clientes.legajo'; insert into clientes values (default,'Luis Garcia','Colon 876','Cordoba','Cordoba','2001-10-10');

57 - Valores predeterminados (create default)


Problema: Una empresa registra los datos de sus empleados en una tabla llamada "empleados". Eliminamos la tabla "empleados" si existe:
if object_id ('empleados') is not null drop table empleados;

Tambin debemos eliminar los valores predeterminados con las siguientes intrucciones (en el siguiente captulo explicaremos este tema):
if object_id ('VP_cero') is not null drop default VP_cero; if object_id ('VP_100') is not null drop default VP_100; if object_id ('VP_datodesconocido') is not null drop default VP_datodesconocido; if object_id ('VP_telefono') is not null drop default VP_telefono;

Creamos la tabla:
create table empleados( nombre varchar(30), domicilio varchar(30), barrio varchar(15), telefono char(14), sueldo decimal(6,2) );

Ingresamos un registro sin valores para ver qu valores por defecto se almacenan:
insert into empleados default values; select *from empleados;

Creamos un valor predeterminado con el valor "Desconocido":


create default VP_datodesconocido as 'Desconocido';

Lo asociamos al campo "domicilio":


exec sp_bindefault VP_datodesconocido, 'empleados.domicilio';

Lo asociamos al campo "barrio":


exec sp_bindefault VP_datodesconocido, 'empleados.barrio';

Ingresamos otro registro sin especificar valores y vemos los datos:


insert into empleados default values; select *from empleados;

Creamos un valor predeterminado que inserta el valor "0":


create default VP_cero as 0;

Lo asociamos al campo "sueldo":

exec sp_bindefault VP_cero, 'empleados.sueldo';

Ingresamos un registro y verificamos los datos:


insert into empleados default values; select *from empleados;

Creamos un valor predeterminado que inserta el valor "100":


create default VP_100 as 100;

Lo asociamos al campo "sueldo":


exec sp_bindefault VP_100, 'empleados.sueldo';

Recuerde que si asociamos a un campo que ya tiene asociado un valor predeterminado otro valor predeterminado, la nueva asociacin reemplaza a la anterior. Verificamos:
insert into empleados default values; select *from empleados;

Veamos los valores predeterminados asociadas a la tabla "empleados":


sp_helpconstraint empleados;

El valor predeterminado "VP_cero" no aparece porque no est asociado a ningn campo de "empleados"; si aparecen "VP_100", "VP_datodesconocido" que est asociado a 2 campos (domicilio y barrio). Veamos si "VP_cero" existe, ejecutando el procedimiento almacenado del sistema "sp_help":
sp_help;

An existe en la base de datos. Creamos un valor predeterminado que inserta ceros con el formato vlido para un campo nmero de telfono:
create default VP_telefono as '(0000)0-000000';

La asociamos al campo "telefono" de la tabla "empleados":


exec sp_bindefault VP_telefono,'empleados.telefono';

Ingresamos un registro y verificamos los valores predeterminados almacenados:

insert into empleados default values; select *from empleados;

Veamos los valores predeterminados asociadas a la tabla "empleados":


sp_helpconstraint empleados;

Aparecen 4 filas, una por cada asociacin.


if object_id ('empleados') is not null drop table empleados; if object_id ('VP_cero') is not null drop default VP_cero; if object_id ('VP_100') is not null drop default VP_100; if object_id ('VP_datodesconocido') is not null drop default VP_datodesconocido; if object_id ('VP_telefono') is not null drop default VP_telefono; create table empleados( nombre varchar(30), domicilio varchar(30),

if object_id ('empleados') is not null drop table empleados;

if object_id ('VP_cero') is not null drop default VP_cero; if object_id ('VP_100') is not null drop default VP_100; if object_id ('VP_datodesconocido') is not null drop default VP_datodesconocido; if object_id ('VP_telefono') is not null drop default VP_telefono;

create table empleados( nombre varchar(30), domicilio varchar(30), barrio varchar(15),

telefono char(14), sueldo decimal(6,2) );

insert into empleados default values; select *from empleados;

create default VP_datodesconocido as 'Desconocido';

exec sp_bindefault VP_datodesconocido, 'empleados.domicilio';

exec sp_bindefault VP_datodesconocido, 'empleados.barrio';

insert into empleados default values; select *from empleados;

create default VP_cero as 0;

exec sp_bindefault VP_cero, 'empleados.sueldo';

insert into empleados default values; select *from empleados;

create default VP_100 as 100;

exec sp_bindefault VP_100, 'empleados.sueldo';

insert into empleados default values;

select *from empleados;

sp_helpconstraint empleados;

-- sp_help;

create default VP_telefono as '(0000)0-000000';

exec sp_bindefault VP_telefono,'empleados.telefono';

insert into empleados default values; select *from empleados;

sp_helpconstraint empleados;

57 - Valores predeterminados (create default)


Primer problema:
Una empresa registra los datos de sus clientes en una tabla llamada "clientes". 1- Elimine la tabla si existe: if object_id ('clientes') is not null drop table clientes; 2- Recuerde que si elimina una tabla, las asociaciones de reglas y valores predeterminados de sus campos desaparecen, pero las reglas y valores predeterminados siguen existiendo. Si intenta crear una regla o un valor predeterminado con igual nombre que uno existente, aparecer un mensaje indicndolo, por ello, debe eliminarlos (si existen) para poder crearlos nuevamente: if object_id ('VP_legajo_patron') is not null drop default VP_legajo_patron; if object_id ('RG_legajo_patron') is not null drop rule RG_legajo_patron; if object_id ('RG_legajo') is not null drop rule RG_legajo;

if object_id ('VP_datodesconocido') is not null drop default VP_datodesconocido; if object_id ('VP_fechaactual') is not null drop default VP_fechaactual; 3- Cree la tabla: create table clientes( legajo char(4), nombre varchar(30), domicilio varchar(30), ciudad varchar(15), provincia varchar(20) default 'Cordoba', fechaingreso datetime ); 4- Cree una regla para establecer un patrn para los valores que se ingresen en el campo "legajo" (2 letras seguido de 2 cifras) llamada "RG_legajo_patron": 5- Asocie la regla al campo "legajo". 6- Cree un valor predeterminado para el campo "legajo" ('AA00') llamado "VP_legajo_patron". 7- Ascielo al campo "legajo". Recuerde que un campo puede tener un valor predeterminado y reglas asociados. 8- Cree un valor predeterminado con la cadena "??" llamado "VP_datodesconocido". 9- Ascielo al campo "domicilio". 10- Ascielo al campo "ciudad". Recuerde que un valor predeterminado puede asociarse a varios campos. 11- Ingrese un registro con valores por defecto para los campos "domicilio" y "ciudad" y vea qu almacenaron. 12- Intente asociar el valor predeterminado "VP_datodesconocido" al campo "provincia". No se puede porque dicho campo tiene una restriccin "default". 13- Cree un valor predeterminado con la fecha actual llamado "VP_fechaactual". 14- Ascielo al campo "fechaingreso". 15- Ingrese algunos registros para ver cmo se almacenan los valores para los cuales no se insertan datos. 16- Asocie el valor predeterminado "VP_datodesconocido" al campo "fechaingreso". Note que se asoci un valor predeterminado de tipo caracter a un campo de tipo "datetime"; SQL

Server lo permite, pero al intentar ingresar el valor aparece un mensaje de error. 17- Ingrese un registro con valores por defecto. No lo permite porque son de distintos tipos. 18- Cree una regla que entre en conflicto con el valor predeterminado "VP_legajo_patron". 19- Asocie la regla al campo "legajo". Note que la regla especifica que el campo "legajo" debe comenzar con la letra "B", pero el valor predeterminado tiene el valor "AA00"; SQL Server realiza la asociacin, pero al intentar ingresar el valor predeterminado, no puede hacerlo y muestra un mensaje de error. 20- Intente ingresar un registro con el valor "default" para el campo "legajo". No lo permite porque al intentar ingresar el valor por defecto establecido con el valor predeterminado entra en conflicto con la regla "RG_legajo".

Ver solucin
if object_id ('clientes') is not null drop table clientes; if object_id ('VP_legajo_patron') is not null drop default VP_legajo_patron; if object_id ('RG_legajo_patron') is not null drop rule RG_legajo_patron; if object_id ('RG_legajo') is not null drop rule RG_legajo; if object_id ('VP_datodesconocido') is not null drop default VP_datodesconocido; if object_id ('VP_fechaactual') is not null drop default VP_fechaactual; create table clientes( legajo char(4), nombre varchar(30), domicilio varchar(30), ciudad varchar(15), provincia varchar(20) default 'Cordoba', fechaingreso datetime ); create rule RG_legajo_patron as @valor like '[A-Z][A-Z][0-9][0-9]'; exec sp_bindrule RG_legajo_patron,'clientes.legajo'; create default VP_legajo_patron as 'AA00'; exec sp_bindefault VP_legajo_patron,'clientes.legajo'; create default VP_datodesconocido as '??';

exec sp_bindefault VP_datodesconocido,'clientes.domicilio'; exec sp_bindefault VP_datodesconocido,'clientes.ciudad'; insert into clientes values('GF12','Ana Perez',default,default,'Cordoba','2001-10-10'); select *from clientes; exec sp_bindefault VP_datodesconocido,'clientes.provincia'; create default VP_fechaactual as getdate(); exec sp_bindefault VP_fechaactual,'clientes.fechaingreso'; insert into clientes default values; select *from clientes; exec sp_bindefault VP_datodesconocido,'clientes.fechaingreso'; insert into clientes default values; create rule RG_legajo as @valor like 'B%'; exec sp_bindrule RG_legajo,'clientes.legajo'; insert into clientes values (default,'Luis Garcia','Colon 876','Cordoba','Cordoba','2001-10-10');

58 - Desasociar y eliminar valores predeterminados


Un valor predeterminado no puede eliminarse si no se ha desasociado previamente. Para deshacer una asociacin empleamos el procedimiento almacenado "sp_unbindefault" seguido de la tabla y campo al que est asociado:
sp_unbindefault 'TABLA.CAMPO';

Quitamos la asociacin al campo "sueldo" de la tabla "empleados":


sp_unbindefault 'empleados.sueldo';

Con la instruccin "drop default" podemos eliminar un valor predeterminado:


drop default NOMBREVALORPREDETERMINADO;

Eliminamos el valor predeterminado llamado "VP_cero":

drop default VP_cero;

Si eliminamos una tabla, las asociaciones de valores predeterminados de sus campos desaparecen, pero los valores predeterminados siguen existiendo.

58 - Desasociar y eliminar valores predeterminados


Problema: Una empresa registra los datos de sus empleados en una tabla llamada "empleados". Eliminamos la tabla "empleados" si existe:
if object_id ('empleados') is not null drop table empleados;

Recordemos que si eliminamos una tabla, las asociaciones de los valores predeterminados a sus campos desaparecen, pero los valores predeterminados siguen existiendo. Si intentamos crear un valor predeterminado con igual nombre que uno existente, aparecer un mensaje indicndolo, por ello, debemos eliminar los valores predeterminados (si existen) para poder crearlos nuevamente:
if object_id ('VP_cero') is not null drop default VP_cero; if object_id ('VP_datodesconocido') is not null drop default VP_datodesconocido;

Creamos la tabla:
create table empleados( nombre varchar(30), domicilio varchar(30), barrio varchar(15), sueldo decimal(6,2) );

Creamos un valor predeterminado que inserta el valor "0":


create default VP_cero as 0;

Lo asociamos al campo "sueldo":


exec sp_bindefault VP_cero, 'empleados.sueldo';

Creamos un valor predeterminado con el valor "Desconocido":

create default VP_datodesconocido as 'Desconocido';

Lo asociamos al campo "domicilio" y al campo "barrio":


exec sp_bindefault VP_datodesconocido, 'empleados.domicilio'; exec sp_bindefault VP_datodesconocido, 'empleados.barrio';

Veamos los valores predeterminados asociados a los campos de la tabla "empleados":


sp_helpconstraint empleados;

Aparecen 3 filas, correspondientes a las asociaciones de valores predeterminados a los campos "sueldo", "domicilio" y "barrio". Quitamos la asociacin al campo "barrio":
sp_unbindefault 'empleados.barrio';

Ejecutamos nuevamente el procedimiento "sp_helpconstraint":


sp_helpconstraint empleados;

Note que el valor predeterminado "VP_datodesconocido" ya no est asociado al campo "barrio". Pero dicho valor predeterminado an existe en la base de datos, verifiqumoslo:
sp_help;

aparece en la lista. Aun no podemos eliminarlo porque est asociado al campo "domicilio", quitamos la asociacin y luego lo eliminamos:
sp_unbindefault 'empleados.domicilio'; drop default VP_datodesconocido;
if object_id ('empleados') is not null drop table empleados; if object_id ('VP_cero') is not null drop default VP_cero; if object_id ('VP_datodesconocido') is not null drop default VP_datodesconocido; create table empleados( nombre varchar(30), domicilio varchar(30), barrio varchar(15), sueldo decimal(6,2) );

if object_id ('empleados') is not null

drop table empleados; if object_id ('VP_cero') is not null drop default VP_cero; if object_id ('VP_datodesconocido') is not null drop default VP_datodesconocido; create table empleados( nombre varchar(30), domicilio varchar(30), barrio varchar(15), sueldo decimal(6,2) ); create default VP_cero as 0; exec sp_bindefault VP_cero, 'empleados.sueldo'; create default VP_datodesconocido as 'Desconocido'; exec sp_bindefault VP_datodesconocido, 'empleados.domicilio'; exec sp_bindefault VP_datodesconocido, 'empleados.barrio'; sp_helpconstraint empleados; sp_unbindefault 'empleados.barrio'; sp_helpconstraint empleados; -- sp_help; sp_unbindefault 'empleados.domicilio'; drop default VP_datodesconocido;

58 - Desasociar y eliminar valores predeterminados


Primer problema:
Una librera almacena los datos de sus libros en una tabla llamada "libros". 1- Elimine la tabla si existe: if object_id ('libros') is not null drop table libros; 2- Recuerde que si elimina una tabla, las asociaciones de reglas y valores predeterminados de sus campos desaparecen, pero las reglas y valores predeterminados siguen existiendo. Si intenta crear una regla o un valor predeterminado con igual nombre que uno existente, aparecer un mensaje indicndolo, por ello, debe eliminarlos (si existen) para poder crearlos nuevamente: if object_id ('VP_cero') is not null drop default VP_cero; if object_id ('VP_desconocido') is not null drop default VP_desconocido; if object_id ('RG_positivo') is not null drop rule RG_positivo;

3- Cree la tabla: create table libros( codigo int identity, titulo varchar(40) not null, autor varchar(30), editorial varchar(20), precio decimal(5,2), cantidad smallint ); 4- Cree una regla para impedir que se ingresen valores negativos, llamada "RG_positivo". 5- Asocie la regla al campo "precio". 6- Asocie la regla al campo "cantidad". 7- Cree un valor predeterminado para que almacene el valor cero, llamado "VP_cero". 8- Ascielo al campo "precio". 9- Ascielo al campo "cantidad". 10- Cree un valor predeterminado con la cadena "Desconocido" llamado "VP_desconocido". 11- Ascielo al campo "autor". 12- Ascielo al campo "editorial". 13- Vea las reglas y valores predeterminados con "sp_help": sp_help; 14- Vea las reglas y valores predeterminados asociados a "libros". Aparecen 6 filas, 2 corresponden a la regla "RG_positivo" asociadas a los campos "precio" y "cantidad"; 2 al valor predeterminado "VP_cero" asociados a los campos "precio" y "cantidad" y 2 al valor predeterminado "VP_desconocido" asociados a los campos "editorial" y "autor". 15- Ingrese un registro con valores por defecto para todos los campos, excepto "titulo" y vea qu se almacen. 15- Quite la asociacin del valor predeterminado "VP_cero" al campo "precio". 16- Ingrese otro registro con valor predeterminado para el campo "precio" y vea cmo se almacen. 17- Vea las reglas y valores predeterminados asociados a "libros". 5 filas; el valor predeterminado "VP_cero" ya no est asociado al campo "precio".

18- Verifique que el valor predeterminado "VP_cero" existe an en la base de datos. 19- Intente eliminar el valor predeterminado "VP_cero". No se puede porque est asociado al campo "cantidad". 20- Quite la asociacin del valor predeterminado "VP_cero" al campo "cantidad". 21- Verifique que ya no existe asociacin de este valor predeterminado con la tabla "libros". 4 filas. 22- Verifique que el valor predeterminado "VP_cero" aun existe en la base de datos. 23- Elimine el valor predeterminado "VP_cero". 24- Verifique que ya no existe en la base de datos. if object_id ('libros') is not null drop table libros; if object_id ('VP_cero') is not null drop default VP_cero; if object_id ('VP_desconocido') is not null drop default VP_desconocido; if object_id ('RG_positivo') is not null drop rule RG_positivo; create table libros( codigo int identity, titulo varchar(40) not null, autor varchar(30), editorial varchar(20), precio decimal(5,2), cantidad smallint ); create rule RG_positivo as @valor >=0; exec sp_bindrule RG_positivo,'libros.precio'; exec sp_bindrule RG_positivo,'libros.cantidad'; create default VP_cero as 0; exec sp_bindefault VP_cero,'libros.precio'; exec sp_bindefault VP_cero,'libros.cantidad'; create default VP_desconocido as 'Desconocido'; exec sp_bindefault VP_desconocido,'libros.autor'; exec sp_bindefault VP_desconocido,'libros.editorial';

-- sp_help; sp_helpconstraint libros; insert into libros (titulo) values('Aprenda PHP'); select *from libros; exec sp_unbindefault 'libros.precio'; insert into libros (titulo) values('Matematica estas ahi'); select *from libros; sp_helpconstraint libros; sp_help VP_cero; drop default VP_cero; exec sp_unbindefault 'libros.cantidad'; sp_helpconstraint libros; sp_help VP_cero; drop default VP_cero; sp_help VP_cero;

59 - Informacin de valores predeterminados


Problema: Una empresa registra los datos de sus empleados en una tabla llamada "empleados". Eliminamos la tabla "empleados" (si existe) y los valores predeterminados:
if object_id ('empleados') is not null drop table empleados; if object_id ('VP_sueldo') is not null drop default VP_sueldo; if object_id ('VP_seccion') is not null drop default Vp_seccion;

Creamos la tabla:
create table empleados( documento char(8) not null, nombre varchar(30) not null, seccion varchar(20), sueldo decimal(6,2), primary key(documento) );

Creamos un valor predeterminado para el campo "sueldo":


create default VP_sueldo as 500;

Asociamos el valor predeterminado creado anteriormente al campo "sueldo":


exec sp_bindefault VP_sueldo, 'empleados.sueldo';

Creamos un valor predeterminado para "seccion":


create default VP_seccion as 'Secretaria';

No la asociamos. Veamos todos los objetos de la base de datos activa:


sp_help;

Aparece una tabla con todos los objetos de la base de datos activa, incluyendo los dos valores predeterminados creados anteriormente; se muestra el nombre, el propietario del objeto y, en caso de los valores predeterminados, aparece "default".

Si agregamos al procedimiento almacenado "sp_help" el nombre del valor predeterminado del cual queremos informacin:
sp_help VP_sueldo;

muestra el nombre, propietario, tipo y fecha de creacin. Para ver los valores predeterminados asociados a la tabla "empleados" tipeamos:
sp_helpconstraint empleados;

retorna una lista de todas las restricciones que tiene una tabla. Tambin los valores predeterminados asociados. Aparecen 2 filas: una con informacin de la restriccin "primary key" y otra con informacin del valor predeterminado asociado, este ltimo muestra: - constraint_type: indica que es un valor predeterminado con "DEFAULT", nombrando el campo al que est asociado. - constraint_name: nombre del valor predeterminado. - constraint_keys: el texto del valor predeterminado. - las otras columnas no tienen informacin. Note que no aparece el valor predeterminado "VP_seccion" porque no fue asociado a la tabla. Si asociamos el valor predeterminado a la tabla:
exec sp_bindefault VP_seccion, 'empleados.seccion';

y ejecutamos el procedimiento nuevamente:


sp_helpconstraint empleados;

Aparecen ambos valores predeterminados. Veamos el texto que define el valor predeterminado "VP_seccion" empleando "sp_helptext":
sp_helptext VP_seccion;

Deshacemos la asociacin del valor predeterminado "VP_sueldo" y lo eliminamos:


exec sp_unbindefault'empleados.sueldo'; drop default VP_sueldo;

Verificamos que ya no existe tal valor predeterminado:


sp_help VP_sueldo;

Vemos si el valor predeterminado "VP_seccion" existe consultando la tabla "sysobjects":


select *from sysobjects where xtype='D' and name like '%seccion%';
if object_id ('empleados') is not null drop table empleados; if object_id ('VP_sueldo') is not null drop default VP_sueldo; if object_id ('VP_seccion') is not null drop default Vp_seccion; create table empleados( documento char(8) not null, nombre varchar(30) not null, seccion varchar(20), sueldo decimal(6,2), primary key(documento) ); create default VP_sueldo as 500; exec sp_bindefault VP_sueldo, 'empleados.sueldo'; create default VP_seccion as 'Secretaria'; -- sp_help; sp_help VP_sueldo; sp_helpconstraint empleados; exec sp_bindefault VP_seccion, 'empleados.seccion'; sp_helpconstraint empleados; sp_helptext VP_seccion; exec sp_unbindefault'empleados.sueldo'; drop default VP_sueldo; sp_help VP_sueldo; select *from sysobjects where xtype='D' and name like '%seccion%';

60 - Indices
SQL Server accede a los datos de dos maneras: 1. recorriendo las tablas; comenzando el principio y extrayendo los registros que cumplen las condiciones de la consulta.

2. empleando ndices; recorriendo la estructura de rbol del ndice para localizar los registros y extrayendo los que cumplen las condiciones de la consulta. Los ndices se emplean para facilitar la obtencin de informacin de una tabla. El indice de una tabla desempea la misma funcin que el ndice de un libro: permite encontrar datos rpidamente; en el caso de las tablas, localiza registros. Una tabla se indexa por un campo (o varios). Un ndice posibilita el acceso directo y rpido haciendo ms eficiente las bsquedas. Sin ndice, SQL Server debe recorrer secuencialmente toda la tabla para encontrar un registro. El objetivo de un indice es acelerar la recuperacin de informacin. La indexacin es una tcnica que optimiza el acceso a los datos, mejora el rendimiento acelerando las consultas y otras operaciones. Es til cuando la tabla contiene miles de registros, cuando se realizan operaciones de ordenamiento y agrupamiento y cuando se combinan varias tablas (tema que veremos ms adelante). La desventaja es que consume espacio en el disco en disco y genera costo de mantenimiento (tiempo y recursos). Los ndices ms adecuados son aquellos creados con campos que contienen valores nicos. Es importante identificar el o los campos por los que sera til crear un ndice, aquellos campos por los cuales se realizan bsqueda con frecuencia: claves primarias, claves externas o campos que combinan tablas. No se recomienda crear ndices por campos que no se usan con frecuencia en consultas o no contienen valores nicos. SQL Server permite crear dos tipos de ndices: 1) agrupados y 2) no agrupados.

61 - Indices agrupados y no agrupados (clustered y nonclustered)


Dijimos que SQL Server permite crear dos tipos de ndices: 1) agrupados (clustered) y 2) no agrupados (nonclustered). 1) Un INDICE AGRUPADO es similar a una gua telefnica, los registros con el mismo valor de campo se agrupan juntos. Un ndice agrupado determina la secuencia de almacenamiento de los registros en una tabla. Se utilizan para campos por los que se realizan busquedas con frecuencia o se accede siguiendo un orden.

Una tabla slo puede tener UN ndice agrupado. El tamao medio de un ndice agrupado es aproximadamente el 5% del tamao de la tabla. 2) Un INDICE NO AGRUPADO es como el ndice de un libro, los datos se almacenan en un lugar diferente al del ndice, los punteros indican el lugar de almacenamiento de los elementos indizados en la tabla. Un ndice no agrupado se emplea cuando se realizan distintos tipos de busquedas frecuentemente, con campos en los que los datos son nicos. Una tabla puede tener hasta 249 ndices no agrupados. Si no se especifica un tipo de ndice, de modo predeterminado ser no agrupado. Los campos de tipo text, ntext e image no se pueden indizar. Es recomendable crear los ndices agrupados antes que los no agrupados, porque los primeros modifican el orden fsico de los registros, ordenndolos secuencialmente. La diferencia bsica entre ndices agrupados y no agrupados es que los registros de un ndice agrupado estn ordenados y almacenados de forma secuencial en funcin de su clave. SQL Server crea automaticamente ndices cuando se crea una restriccin "primary key" o "unique" en una tabla. Es posible crear ndices en las vistas. Resumiendo, los ndices facilitan la recuperacin de datos, permitiendo el acceso directo y acelerando las bsquedas, consultas y otras operaciones que optimizan el rendimiento general.

62 - Creacin de ndices
Para crear ndices empleamos la instruccin "create index". La sintaxis bsica es la siguiente:
create TIPODEINDICE index NOMBREINDICE on TABLA(CAMPO);

"TIPODEINDICE" indica si es agrupado (clustered) o no agrupado (nonclustered). Si no especificamos crea uno No agrupado. Independientemente de si es agrupado o no, tambin se puede especificar que sea "unique", es decir, no haya valores repetidos. Si se intenta crear un ndice unique para un campo que tiene valores duplicados, SQL Server no lo permite.

En este ejemplo se crea un ndice agrupado nico para el campo "codigo" de la tabla "libros":
create unique clustered index I_libros_codigo on libros(codigo);

Para identificar los ndices fcilmente, podemos agregar un prefijo al nombre del ndice, por ejemplo "I" y luego el nombre de la tabla y/o campo. En este ejemplo se crea un ndice no agrupado para el campo "titulo" de la tabla "libros":
create nonclustered index I_libros_titulo on libros(titulo);

Un ndice puede tener ms de un campo como clave, son ndices compuestos. Los campos de un ndice compuesto tienen que ser de la misma tabla (excepto cuando se crea en una vista - tema que veremos posteriormente). Creamos un ndice compuesto para el campo "autor" y "editorial":
create index I_libros_autoreditorial on libros(autor,editorial);

SQL Server crea automticamente ndices cuando se establece una restriccin "primary key" o "unique" en una tabla. Al crear una restriccin "primary key", si no se especifica, el ndice ser agrupado (clustered) a menos que ya exista un ndice agrupado para dicha tabla. Al crear una restriccin "unique", si no se especifica, el ndice ser no agrupado (nonclustered). Ahora podemos entender el resultado del procedimiento almacenado "sp_helpconstraint" cuando en la columna "constraint_type" mostraba el tipo de ndice seguido de las palabras "clustered" o "non_clustered". Puede especificarse que un ndice sea agrupado o no agrupado al agregar estas restricciones. Agregamos una restriccin "primary key" al campo "codigo" de la tabla "libros" especificando que cree un ndice NO agrupado:
alter table libros add constraint PK_libros_codigo primary key nonclustered (codigo);

Para ver los indices de una tabla:


sp_helpindex libros;

Muestra el nombre del ndice, si es agrupado (o no), primary (o unique) y el campo por el cual se indexa.

Todos los ndices de la base de datos activa se almacenan en la tabla del sistema "sysindexes", podemos consultar dicha tabla tipeando:
select name from sysindexes;

Para ver todos los ndices de la base de datos activa creados por nosotros podemos tipear la siguiente consulta:
select name from sysindexes where name like 'I_%';

62 - Creacin de ndices
Problema: Trabajamos con la tabla "libros" de una librera. Eliminamos la tabla si existe y la creamos:
if object_id('libros') is not null drop table libros; create table libros( codigo int identity, titulo varchar(40), autor varchar(30), editorial varchar(15) );

Creamos un ndice agrupado nico para el campo "codigo" de la tabla "libros":


create unique clustered index I_libros_codigo on libros(codigo);

Creamos un ndice no agrupado para el campo "titulo":


create nonclustered index I_libros_titulo on libros(titulo);

Veamos los indices de "libros":


sp_helpindex libros;

Aparecen 2 filas, uno por cada ndice. Muestra el nombre del ndice, si es agrupado (o no), primary (o unique) y el campo por el cual se indexa. Creamos una restriccin "primary key" al campo "codigo" especificando que cree un ndice NO agrupado:
alter table libros add constraint PK_libros_codigo

primary key nonclustered (codigo);

Verificamos que cre un ndice automticamente:


sp_helpindex libros;

El nuevo ndice es agrupado, porque no se especific. Analicemos la informacin que nos muestra "sp_helpconstraint":
sp_helpconstraint libros;

En la columna "constraint_type" aparece "PRIMARY KEY" y entre parntesis, el tipo de ndice creado. Creamos un ndice compuesto para el campo "autor" y "editorial":
create index I_libros_autoreditorial on libros(autor,editorial);

Se crear uno no agrupado porque no especificamos el tipo, adems, ya existe uno agrupado y solamente puede haber uno por tabla. Consultamos la tabla "sysindexes":
select name from sysindexes;

Veamos los ndices de la base de datos activa creados por nosotros podemos tipear la siguiente consulta:
select name from sysindexes where name like 'I_%';
if object_id('libros') is not null drop table libros; create table libros( codigo int identity, titulo varchar(40), autor varchar(30), editorial varchar(15) ); create unique clustered index I_libros_codigo on libros(codigo); create nonclustered index I_libros_titulo on libros(titulo);

if object_id('libros') is not null drop table libros; create table libros( codigo int identity, titulo varchar(40),

autor varchar(30), editorial varchar(15) ); create unique clustered index I_libros_codigo on libros(codigo); create nonclustered index I_libros_titulo on libros(titulo); sp_helpindex libros; alter table libros add constraint PK_libros_codigo primary key nonclustered (codigo); sp_helpindex libros; sp_helpconstraint libros; create index I_libros_autoreditorial on libros(autor,editorial); select name from sysindexes; select name from sysindexes where name like 'I_%';

62 - Creacin de ndices
Primer problema:
Un profesor guarda algunos datos de sus alumnos en una tabla llamada "alumnos". 1- Elimine la tabla si existe y crela con la siguiente estructura: if object_id('alumnos') is not null drop table alumnos; create table alumnos( legajo char(5) not null, documento char(8) not null, apellido varchar(30), nombre varchar(30), notafinal decimal(4,2) ); 2- Ingresamos algunos registros: insert into alumnos values ('A123','22222222','Perez','Patricia',5.50); insert into alumnos values ('A234','23333333','Lopez','Ana',9); insert into alumnos values ('A345','24444444','Garcia','Carlos',8.5); insert into alumnos values ('A348','25555555','Perez','Daniela',7.85); insert into alumnos values ('A457','26666666','Perez','Fabian',3.2); insert into alumnos values ('A589','27777777','Gomez','Gaston',6.90); 3- Intente crear un ndice agrupado nico para el campo "apellido". No lo permite porque hay valores duplicados. 4- Cree un ndice agrupado, no nico, para el campo "apellido". 5- Intente establecer una restriccin "primary key" al campo "legajo" especificando que cree un ndice agrupado.

No lo permite porque ya existe un ndice agrupado y solamente puede haber uno por tabla. 6- Establezca la restriccin "primary key" al campo "legajo" especificando que cree un ndice NO agrupado. 7- Vea los ndices de "alumnos": sp_helpindex alumnos; 2 ndices: uno "I_alumnos_apellido", agrupado, con "apellido" y otro "PK_alumnos_legajo", no agrupado, unique, con "legajo" que se cre automticamente al crear la restriccin "primary key". 8- Analice la informacin que muestra "sp_helpconstraint": sp_helpconstraint libros; En la columna "constraint_type" aparece "PRIMARY KEY" y entre parntesis, el tipo de ndice creado. 9- Cree un ndice unique no agrupado para el campo "documento". 10- Intente ingresar un alumno con documento duplicado. No lo permite. 11- Veamos los indices de "alumnos". Aparecen 3 filas, uno por cada ndice. 12- Cree un ndice compuesto para el campo "apellido" y "nombre". Se crear uno no agrupado porque no especificamos el tipo, adems, ya existe uno agrupado y solamente puede haber uno por tabla. 13- Consulte la tabla "sysindexes", para ver los nombres de todos los ndices creados para "alumnos": select name from sysindexes where name like '%alumnos%'; 4 ndices. 14- Cree una restriccin unique para el campo "documento". 15- Vea la informacin de "sp_helpconstraint". 16- Vea los ndices de "alumnos". Aparecen 5 filas, uno por cada ndice. 17- Consulte la tabla "sysindexes", para ver los nombres de todos los ndices creados para "alumnos": select name from sysindexes where name like '%alumnos%'; 5 ndices. 18- Consulte la tabla "sysindexes", para ver los nombres de todos los ndices creados por usted: select name from sysindexes where name like 'I_%';

3 ndices. Recuerde que los ndices que crea SQL Server automticamente al agregarse una restriccin "primary" o "unique" no comienzan con "I_". if object_id('alumnos') is not null drop table alumnos; create table alumnos( legajo char(5) not null, documento char(8) not null, apellido varchar(30), nombre varchar(30), notafinal decimal(4,2) ); insert insert insert insert insert insert into into into into into into alumnos alumnos alumnos alumnos alumnos alumnos values values values values values values ('A123','22222222','Perez','Patricia',5.50); ('A234','23333333','Lopez','Ana',9); ('A345','24444444','Garcia','Carlos',8.5); ('A348','25555555','Perez','Daniela',7.85); ('A457','26666666','Perez','Fabian',3.2); ('A589','27777777','Gomez','Gaston',6.90);

create unique clustered index I_alumnos_apellido on alumnos(apellido); create clustered index I_alumnos_apellido on alumnos(apellido); alter table alumnos add constraint PK_alumnos_legajo primary key clustered (legajo); alter table alumnos add constraint PK_alumnos_legajo primary key nonclustered (legajo); sp_helpindex alumnos; sp_helpconstraint libros; create unique nonclustered index I_alumnos_documento on alumnos(documento); insert into alumnos values ('A789','27777777','Morales','Hector',8); sp_helpindex alumnos; create index I_alumnos_apellidonombre on alumnos(apellido,nombre); select name from sysindexes where name like '%alumnos%'; alter table alumnos add constraint UQ_alumnos_documento unique (documento); sp_helpconstraint alumnos;

sp_helpindex alumnos; select name from sysindexes where name like '%alumnos%'; select name from sysindexes where name like 'I_%';

63 - Regenerar ndices
Vimos que para crear ndices empleamos la instruccin "create index". Empleando la opcin "drop_existing" junto con "create index" permite regenerar un ndice, con ello evitamos eliminarlo y volver a crearlo. La sintaxis es la siguiente:
create TIPODEINDICE index NOMBREINDICE on TABLA(CAMPO) with drop_existing;

Tambin podemos modificar alguna de las caractersticas de un ndice con esta opcin, a saber: - tipo: cambindolo de no agrupado a agrupado (siempre que no exista uno agrupado para la misma tabla). No se puede convertir un ndice agrupado en No agrupado. - campo: se puede cambiar el campo por el cual se indexa, agregar campos, eliminar algn campo de un ndice compuesto. - nico: se puede modificar un ndice para que los valores sean nicos o dejen de serlo. En este ejemplo se crea un ndice no agrupado para el campo "titulo" de la tabla "libros":
create nonclustered index I_libros on libros(titulo);

Regeneramos el ndice "I_libros" y lo convertimos a agrupado:


create clustered index I_libros on libros(titulo) with drop_existing;

Agregamos un campo al ndice "I_libros":


create clustered index I_libros on libros(titulo,editorial) with drop_existing;

Esta opcin no puede emplearse con ndices creados a partir de una restriccin "primary key" o "unique".

63 - Regenerar ndices
Problema: Trabajamos con la tabla "libros" de una librera. Eliminamos la tabla si existe y la creamos:
if object_id('libros') is not null drop table libros; create table libros( codigo int identity, titulo varchar(40), autor varchar(30), editorial varchar(15) );

Creamos un ndice no agrupado para el campo "titulo":


create nonclustered index I_libros_titulo on libros(titulo);

Veamos la informacin:
sp_helpindex libros;

Vamos a agregar el campo "autor" al ndice "I_libros_titulo" y vemos si se modific:


create index I_libros_titulo on libros(titulo,autor) with drop_existing; exec sp_helpindex libros;

Lo convertimos en agrupado y ejecutamos "sp_helpindex":


create clustered index I_libros_titulo on libros(titulo,autor) with drop_existing; exec sp_helpindex libros;

Quitamos un campo "autor" y verificamos la modificacin:


create clustered index I_libros_titulo on libros(titulo) with drop_existing; exec sp_helpindex libros;

if object_id('libros') is not null drop table libros; create table libros( codigo int identity, titulo varchar(40), autor varchar(30), editorial varchar(15) ); create nonclustered index I_libros_titulo on libros(titulo); sp_helpindex libros; create index I_libros_titulo on libros(titulo,autor)
if object_id('libros') is not null drop table libros; create table libros( codigo int identity, titulo varchar(40), autor varchar(30), editorial varchar(15) ); create nonclustered index I_libros_titulo on libros(titulo); sp_helpindex libros; create index I_libros_titulo on libros(titulo,autor) with drop_existing; exec sp_helpindex libros; create clustered index I_libros_titulo on libros(titulo,autor) with drop_existing; exec sp_helpindex libros; create clustered index I_libros_titulo on libros(titulo) with drop_existing; exec sp_helpindex libros; if object_id('libros') is not null drop table libros; create table libros( codigo int identity, titulo varchar(40), autor varchar(30), editorial varchar(15) ); create nonclustered index I_libros_titulo on libros(titulo); sp_helpindex libros; create index I_libros_titulo on libros(titulo,autor) with drop_existing; exec sp_helpindex libros; create clustered index I_libros_titulo on libros(titulo,autor)

with drop_existing; exec sp_helpindex libros; create clustered index I_libros_titulo on libros(titulo) with drop_existing; exec sp_helpindex libros;

63 - Regenerar ndices
Primer problema:
Un profesor guarda algunos datos de sus alumnos en una tabla llamada "alumnos". 1- Elimine la tabla si existe y crela con la siguiente estructura: if object_id('alumnos') is not null drop table alumnos; create table alumnos( legajo char(5) not null, documento char(8) not null, apellido varchar(30), nombre varchar(30), notafinal decimal(4,2) ); 2- Cree un ndice no agrupado para el campo "apellido". 3- Vea la informacin de los ndices de "alumnos". 4- Modifquelo agregando el campo "nombre". 5- Verifique que se modific: exec sp_helpindex alumnos; 6- Establezca una restriccin "unique" para el campo "documento". 7- Vea la informacin que muestra "sp_helpindex": sp_helpindex alumnos; 8- Intente modificar con "drop_existing" alguna caracterstica del ndice que se cre automticamente al agregar la restriccin "unique": create clustered index UQ_alumnos_documento on alumnos(documento) with drop_existing; No se puede emplear "drop_existing" con ndices creados a partir de una restriccin. 9- Cree un ndice no agrupado para el campo "legajo". 10- Muestre todos los ndices: sp_helpindex alumnos;

11- Convierta el ndice creado en el punto 9 a agrupado conservando las dems caractersticas. 12- Verifique que se modific: exec sp_helpindex alumnos; 13- Intente convertir el ndice "I_alumnos_legajo" a no agrupado: create nonclustered index I_alumnos_legajo on alumnos(legajo) with drop_existing; No se puede convertir un ndice agrupado en no agrupado. 14- Modifique el ndice "I_alumnos_apellido" quitndole el campo "nombre". 15- Intente convertir el ndice "I_alumnos_apellido" en agrupado: create clustered index I_alumnos_apellido on alumnos(apellido) with drop_existing; No lo permite porque ya existe un ndice agrupado. 16- Modifique el ndice "I_alumnos_legajo" para que sea nico y conserve todas las otras caractersticas. 17- Verifique la modificacin: sp_helpindex alumnos; 18- Modifique nuevamente el ndice "I_alumnos_legajo" para que no sea nico y conserve las dems caractersticas. 19- Verifique la modificacin: sp_helpindex alumnos;

Ver solucin
if object_id('alumnos') is not null drop table alumnos; create table alumnos( legajo char(5) not null, documento char(8) not null, apellido varchar(30), nombre varchar(30), notafinal decimal(4,2) ); create nonclustered index I_alumnos_apellido on alumnos(apellido); sp_helpindex alumnos; create nonclustered index I_alumnos_apellido on alumnos(apellido,nombre) with drop_existing; exec sp_helpindex alumnos; alter table alumnos

add constraint UQ_alumnos_documento unique nonclustered (documento); sp_helpindex alumnos; create clustered index UQ_alumnos_documento on alumnos(documento) with drop_existing; create nonclustered index I_alumnos_legajo on alumnos(legajo); sp_helpindex alumnos; create clustered index I_alumnos_legajo on alumnos(legajo) with drop_existing; exec sp_helpindex alumnos; create nonclustered index I_alumnos_legajo on alumnos(legajo) with drop_existing; create nonclustered index I_alumnos_apellido on alumnos(apellido) with drop_existing; create clustered index I_alumnos_apellido on alumnos(apellido) with drop_existing; create unique clustered index I_alumnos_legajo on alumnos(legajo) with drop_existing; sp_helpindex alumnos; create clustered index I_alumnos_legajo on alumnos(legajo) with drop_existing; sp_helpindex alumnos;

64 - Eliminar ndices
Los ndices creados con "create index" se eliminan con "drop index"; la siguiente es la sintaxis bsica:
drop index NOMBRETABLA.NOMBREINDICE;

Eliminamos el ndice "I_libros_titulo":


drop index libros.I_libros_titulo;

Los ndices que SQL Server crea automticamente al establecer una restriccin "primary key" o "unique" no pueden eliminarse con "drop index", se eliminan automticamente cuando quitamos la restriccin. Podemos averiguar si existe un ndice para eliminarlo, consultando la tabla del sistema "sysindexes":
if exists (select name from sysindexes where name = 'NOMBREINDICE') drop index NOMBRETABLA.NOMBREINDICE;

Eliminamos el ndice "I_libros_titulo" si existe:


if exists (select *from sysindexes where name = 'I_libros_titulo') drop index libros.I_libros_titulo;

64 - Eliminar ndices
Problema: Trabajamos con la tabla "libros" de una librera. Eliminamos la tabla si existe y la creamos:
if object_id('libros') is not null drop table libros; create table libros( codigo int identity, titulo varchar(40), autor varchar(30), editorial varchar(15) );

Creamos un ndice para el campo "titulo":


create index I_libros_titulo on libros(titulo);

Verifiquemos que se cre:


sp_helpindex libros;

Eliminamos el ndice "I_libros_titulo":


drop index libros.I_libros_titulo;

Corroboremos que se elimin:

sp_helpindex libros;

Solicitamos que se elimine el ndice "I_libros_titulo" si existe:


if exists (select name from sysindexes where name = 'I_libros_titulo') drop index libros.I_libros_titulo;
if object_id('libros') is not null drop table libros; create table libros( codigo int identity, titulo varchar(40), autor varchar(30), editorial varchar(15) ); create index I_libros_titulo on libros(titulo); sp_helpindex libros;

if object_id('libros') is not null drop table libros; create table libros( codigo int identity, titulo varchar(40), autor varchar(30), editorial varchar(15) ); create index I_libros_titulo on libros(titulo); sp_helpindex libros; drop index libros.I_libros_titulo; sp_helpindex libros; if exists (select name from sysindexes where name = 'I_libros_titulo') drop index libros.I_libros_titulo;

64 - Eliminar ndices
Primer problema:
Un profesor guarda algunos datos de sus alumnos en una tabla llamada "alumnos". 1- Elimine la tabla si existe y crela con la siguiente estructura: if object_id('alumnos') is not null drop table alumnos; create table alumnos( legajo char(5) not null, documento char(8) not null, apellido varchar(30),

nombre varchar(30), notafinal decimal(4,2) ); 2- Cree un ndice no agrupado para el campo "apellido". 3- Establezca una restriccin "primary" para el campo "legajo" y especifique que cree un ndice "agrupado". 4- Vea la informacin que muestra "sp_helpindex": sp_helpindex alumnos; 5- Intente eliminar el ndice "PK_alumnos_legajo" con "drop index": drop index PK_alumnos_legajo; No se puede. 6- Intente eliminar el ndice "I_alumnos_apellido" sin especificar el nombre de la tabla: drop index I_alumnos_apellido; Mensaje de error. 7- Elimine el ndice "I_alumnos_apellido" especificando el nombre de la tabla. 8- Verifique que se elimin: sp_helpindex alumnos; 9- Solicite que se elimine el ndice "I_alumnos_apellido" si existe: if exists (select name from sysindexes where name = 'I_alumnos_apellido') drop index alumnos.I_alumnos_apellido; 10- Elimine el ndice "PK_alumnos_legajo" (quite la restriccin). 11- Verifique que el ndice "PK_alumnos_legajo" ya no existe: sp_helpindex alumnos;

Ver solucin
if object_id('alumnos') is not null drop table alumnos; create table alumnos( legajo char(5) not null, documento char(8) not null, apellido varchar(30), nombre varchar(30), notafinal decimal(4,2) ); create nonclustered index I_alumnos_apellido on alumnos(apellido); alter table alumnos add constraint PK_alumnos_legajo primary key clustered (legajo); sp_helpindex alumnos;

drop index PK_alumnos_legajo; drop index I_alumnos_apellido; drop index alumnos.I_alumnos_apellido; sp_helpindex alumnos; if exists (select name from sysindexes where name = 'I_alumnos_apellido') drop index alumnos.I_alumnos_apellido; alter table alumnos drop PK_alumnos_legajo; sp_helpindex alumnos;

65 - Trabajar con varias tablas


Hasta el momento hemos trabajado con una sola tabla, pero generalmente, se trabaja con ms de una. Para evitar la repeticin de datos y ocupar menos espacio, se separa la informacin en varias tablas. Cada tabla almacena parte de la informacin que necesitamos registrar. Por ejemplo, los datos de nuestra tabla "libros" podran separarse en 2 tablas, una llamada "libros" y otra "editoriales" que guardar la informacin de las editoriales. En nuestra tabla "libros" haremos referencia a la editorial colocando un cdigo que la identifique. Veamos:
create table libros( codigo int identity, titulo varchar(40) not null, autor varchar(30) not null default 'Desconocido', codigoeditorial tinyint not null, precio decimal(5,2), primary key (codigo) ); create table editoriales( codigo tinyint identity, nombre varchar(20) not null, primary key(codigo) );

De esta manera, evitamos almacenar tantas veces los nombres de las editoriales en la tabla "libros" y guardamos el nombre en la tabla "editoriales"; para indicar la editorial de cada libro agregamos un campo que hace referencia al cdigo de la editorial en la tabla "libros" y en "editoriales".

Al recuperar los datos de los libros con la siguiente instruccin:


select* from libros;

vemos que en el campo "editorial" aparece el cdigo, pero no sabemos el nombre de la editorial. Para obtener los datos de cada libro, incluyendo el nombre de la editorial, necesitamos consultar ambas tablas, traer informacin de las dos. Cuando obtenemos informacin de ms de una tabla decimos que hacemos un "join" (combinacin). Veamos un ejemplo:
select *from libros join editoriales on libros.codigoeditorial=editoriales.codigo;

Resumiendo: si distribuimos la informacin en varias tablas evitamos la redundancia de datos y ocupamos menos espacio fsico en el disco. Un join es una operacin que relaciona dos o ms tablas para obtener un resultado que incluya datos (campos y registros) de ambas; las tablas participantes se combinan segn los campos comunes a ambas tablas. Hay hay tres tipos de combinaciones. En los siguientes captulos explicamos cada una de ellas.

Das könnte Ihnen auch gefallen