Curso SQL
Curso SQL
Curso SQL
Server
El curso brinda un concepto teórico corto, luego un problema resuelto que invito a
ejecutar, modificar y jugar con el mismo. Por último, y lo más 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 creación de tablas, insert, delete, update, definición de
índices y restricciones, creación y ejecución de procedimientos almacenados, vistas,
subconsultas, creación de trigger etc.
La única restricción 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)
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 intersección de una
columna con una fila, contiene un dato específico, un solo valor.
Cada campo (columna) también debe definir el tipo de dato que almacenará.
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';
Al crear una tabla debemos resolver qué campos (columnas) tendrá y qué tipo de datos
almacenarán cada uno de ellos, es decir, su estructura.
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 paréntesis definimos los campos y sus
tipos:
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:
Cada usuario ocupará un registro de esta tabla, con su respectivo nombre y clave.
Para nombres de tablas, se puede utilizar cualquier carácter permitido para nombres de
directorios, el primero debe ser un carácter alfabético y no puede contener espacios. La
longitud máxima 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 eliminar una tabla usamos "drop table" junto al nombre de la tabla a eliminar:
Si intentamos eliminar una tabla que no existe, aparece un mensaje de error indicando
tal situación y la sentencia no se ejecuta. Para evitar este mensaje podemos agregar a la
instrucción lo siguiente:
Ejercicio
Necesita almacenar los datos de sus amigos en una tabla. Los datos que
guardará serán: apellido,nombre, domicilio y teléfono.
1- Elimine la tabla "agenda" si existe:
if object_id('agenda') is not null
drop table agenda;
3- Cree una tabla llamada "agenda", debe tener los siguientes campos:
apellido, varchar(30); nombre varchar(20); domicilio, varchar (30) y
telefono, varchar(11):
7- Elimine la tabla.
Al ingresar los datos de cada registro debe tenerse en cuenta la cantidad y el orden de
los campos.
Usamos "insert into", luego el nombre de la tabla, detallamos los nombres de los
campos entre paréntesis y separados por comas y luego de la cláusula "values"
colocamos los valores para cada campo, también entre paréntesis y separados por
comas.
Note que los datos ingresados, como corresponden a cadenas de caracteres se colocan
entre comillas simples.
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:
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":
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).
Estos son algunos tipos de datos básicos de SQL Server (posteriormente veremos otros):
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 números enteros, el tipo "float" sería una
mala elección; si vamos a guardar precios, el tipo "float" es más adecuado, no así
"integer" que no tiene decimales. Otro ejemplo, si en un campo vamos a guardar un
número telefónico o un número de documento, usamos "varchar", no "integer" porque si
bien son dígitos, con ellos no realizamos operaciones matemáticas.
Ejercicio-1:
Vamos a crear una tabla llamada "libros". En primer lugar vamos a eliminar la tabla
"libros" averiguando si existe:
Para almacenar información de los libros de una librería necesitamos los siguientes
campos:
Al crear la tabla, entonces, elegimos el tipo de dato más adecuado para cada campo:
Note que al especificar el tipo de dato de los campos numéricos, no colocamos entre
paréntesis la longitud.
sp_columns libros;
Note que al ingresar valores numéricos (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 más
de 20 caracteres:
Podemos especificar el nombre de los campos que queremos ver separándolos 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 según la
lista de selección, en dicha lista los nombres de los campos se separan con comas.
Ejercicio-1
2- Cree la tabla:
create table peliculas(titulo varchar(20), actor varchar(20),
duracion integer, cantidad integer );
Ejercicio-2
Trabajamos con la tabla "libros" que almacena los datos de los libros de una librería.
Eliminamos la tabla, si existe:
Creamos la tabla:
Veamos solamente el título, autor y editorial de todos los libros especificando los
nombres de los campos separados por comas:
Con la siguiente sentencia seleccionamos los títulos y precios de todos los libros:
En la consulta anterior solicitamos el nombre de todos los usuarios cuya clave sea igual
a "River".
Ejercicio-1
Ejercicio-2
Trabajamos con la tabla "usuarios" que consta de 2 campos: nombre de usuario y clave.
Eliminamos la tabla, si existe:
Creamos la tabla:
sp_columns usuarios;
Realizamos una consulta especificando una condición, queremos ver el usuario cuyo
nombre es "Leonardo":
1. relacionales (o de comparación)
2. aritméticos
3. de concatenación
4. lógicos.
= igual
<> distinto
> mayor
< menor
>= mayor o igual
<= menor o igual
Podemos seleccionar los registros cuyo autor sea diferente de "Borges", para ello
usamos la condición: select * from libros where autor<>'Borges';
Podemos comparar valores numéricos. Por ejemplo, queremos mostrar los títulos y
precios de los libros cuyo precio sea mayor a 20 pesos:
Queremos seleccionar los libros cuyo precio sea menor o igual a 30:
Ejercicio-1
Ejercicio-2
Seleccionamos los registros cuyo precio supere los 20 pesos, sólo el título y precio:
Note que el valor con el cual comparamos el campo "precio", como es numérico (float),
no se coloca entre comillas. Los libros cuyo precio es menor o igual a 20 pesos no
aparece en la selección.
Si no queremos eliminar todos los registros, sino solamente algunos, debemos indicar
cuál o cuáles, para ello utilizamos el comando "delete" junto con la clausula "where"
con la cual establecemos la condición que deben cumplir los registros a borrar.
Por ejemplo, queremos eliminar aquel registro cuyo nombre de usuario es "Marcelo":
Ejercicio-1
6- Muestre la tabla.
8- Muestre la tabla.
Ejercicio-2
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 selección con "where".
Por ejemplo, queremos cambiar el valor correspondiente a la clave de nuestro usuario
llamado "Federicolopez", queremos como nueva clave "Boca", necesitamos una
condición "where" que afecte solamente a este registro:
Si Microsoft SQL Server no encuentra registros que cumplan con la condición del
"where", no se modifica ninguno. Las condiciones no son obligatorias, pero si omitimos
la cláusula "where", la actualización afectará a todos los registros. También podemos
actualizar varios campos en una sola instrucción:
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.
Ejercicio-1
Trabaje con la tabla "agenda" que almacena los datos de sus amigos.
Ejercicio-2
10 - Comentarios
Para aclarar algunas instrucciones, en ocasiones, necesitamos agregar comentarios.
Es posible ingresar comentarios en la línea de comandos, es decir, un texto que no se
ejecuta; para ello se emplean dos guiones (--) al comienzo de la línea:
en la línea anterior, todo lo que está luego de los guiones (hacia la derecha) no se
ejecuta. Para agregar varias líneas 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 (*/).
Ejercicio-1
Trabajamos con la tabla "libros" que almacena los datos de los libros de una librería.
Eliminamos la tabla, si existe:
Agregamos un registro:
Para especificar que un campo no admita valores nulos, debemos colocar "not null"
luego de la definición 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 aún no hemos definido el precio podemos colocar
"null" para mostrar que no tiene precio:
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. También podemos colocar "null" en el campo "editorial" si
desconocemos el nombre de la editorial a la cual pertenece el libro que vamos a
ingresar:
Para ver cuáles campos admiten valores nulos y cuáles no, podemos emplear el
procedimiento almacenado "sp_columns" junto al nombre de la tabla. Nos muestra
mucha información, 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 algún 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):
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:
Con la primera sentencia veremos los libros cuya editorial es igual a "null", con la
segunda, los libros cuya editorial guarda una cadena vacía.
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".
Primer problema:
Una farmacia guarda información 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;
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;
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).
Segundo problema:
Trabaje con la tabla que almacena los datos sobre películas, llamada
"peliculas".
1- Elimine la tabla si existe:
if object_id('peliculas') is not null
drop table peliculas;
5- Recupere todos los registros para ver cómo SQL Server los almacenó:
select *from peliculas;
10- Muestre todos los registros. Note que el cambio anterior no afectó
a los registros con valor nulo en el campo "actor".
11- Elimine los registros cuyo título sea una cadena vacía(1 registro)
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 número 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.
En el siguiente ejemplo definimos una clave primaria, para nuestra tabla "usuarios" para
asegurarnos que cada usuario tendrá un nombre diferente y único:
Lo que hacemos agregar luego de la definición de cada campo, "primary key" y entre
paréntesis, el nombre del campo que será clave primaria. Una tabla sólo 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, automáticamente 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
estén repetidos en la tabla; si estuviesen repetidos, muestra un mensaje y la inserción 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 instrucción "insert" no se ejecuta.
Igualmente, si realizamos una actualización, SQL Server controla que los valores para el
campo establecido como clave primaria no estén repetidos en la tabla, si lo estuviese,
aparece un mensaje indicando que se viola la clave primaria y la actualización no se
realiza.
Primer problema:
Trabaje con la tabla "libros" de una librería.
1- Elimine la tabla si existe:
if object_id('libros') is not null
drop table libros;
Segundo problema:
Para que un campo pueda establecerse como "identity", éste debe ser entero (también
puede ser de un subtipo de entero o decimal con escala 0, tipos que estudiaremos
posteriormente). Para que un campo genere sus valores automáticamente, debemos
agregar el atributo "identity" luego de su definición 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 automáticamente 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);
Primer problema:
Una farmacia guarda información 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;
10- Seleccione todos los registros para ver qué valor guardó SQL
Server en el campo código: select *from medicamentos;
Segundo problema:
Un videoclub almacena información sobre sus películas en una tabla
llamada "peliculas".
1- Elimine la tabla si existe:
if object_id('peliculas') is not null
drop table peliculas;
La función "ident_seed()" retorna el valor de inicio del campo "identity" de la tabla que
nombramos: select ident_seed('libros');
Primer problema:
Una farmacia guarda información 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;
Segundo problema:
Un videoclub almacena información sobre sus películas en una tabla
llamada "peliculas".
12- Ingrese un nuevo registro y muestre todos los registros para ver
cómo SQL Server siguió la secuencia tomando el último valor del campo
como referencia.
15 - Truncate table
Aprendimos que para borrar todos los registro de una tabla se usa "delete" sin condición
"where". También podemos eliminar todos los registros de una tabla con "truncate
table". Por ejemplo, queremos vaciar la tabla "libros", usamos:
La sentencia "truncate table" vacía 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 vacía. La diferencia con "delete" es la velocidad, es más rápido
"truncate table" que "delete" (se nota cuando la cantidad de registros es muy grande) ya
que éste borra los registros uno a uno.
Por ejemplo, tenemos la tabla "libros" con el campo "codigo" definido "identity", y el
valor más alto de ese campo es "2", si borramos todos los registros con "delete" y luego
ingresamos un registro, éste guardará el valor de código "3"; si en cambio, vaciamos la
tabla con "truncate table", al ingresar un nuevo registro el valor del código se iniciará en
1 nuevamente.
Primer problema:
Un instituto de enseñanza 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;
Segundo problema:
Un comercio que vende artículos de computación registra los datos de
sus artículos 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 );
Hasta ahora hemos visto 3 tipos de datos: varchar, integer y float. Hay más tipos,
incluso, subtipos.
Entonces, cuando creamos una tabla y definir sus campos debemos elegir el tipo de dato
más preciso. Por ejemplo, si necesitamos almacenar nombres usamos texto; si un campo
numérico almacenará solamente valores enteros el tipo "integer" es más adecuado que,
por ejemplo un "float"; si necesitamos almacenar precios, lo más lógico es utilizar el
tipo "money".
Para almacenar cadenas que varían en su longitud, es decir, no todos los registros
tendrán 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 varían en su longitud, es decir, todos los registros
tendrán la misma longitud en un campo determinado, se emplea "char".
Por ejemplo, definimos un campo "codigo" que constará de 5 caracteres, todos los
registros tendrán un código de 5 caracteres, ni más ni menos.
nvarchar(x) 0 a 8K
nchar(x) 0 a 8K
ntext 0 a 2GB
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));
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) decimal o numeric (t,d): Pueden tener hasta 38 digitos, guarda un valor exacto. El
primer argumento indica el total de dígitos 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.
5) money: Puede tener hasta 19 digitos y sólo 4 de ellos puede ir luego del separador
decimal; entre –900000000000000.5808 aprox y 900000000000000.5807.
Es importante elegir el tipo de dato adecuado según el caso, el más preciso. Por
ejemplo, si un campo numérico almacenará valores positivos menores a 255, el tipo
"int" no es el más 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".
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;
6- Muestre todos los empleados cuyo sueldo no supere los 900 pesos (1
registro):
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 año) empleamos "set dateformat". Estos
son los formatos:
Podemos ingresar una fecha, sin hora, en tal caso la hora se guarda como "00:00:00".
Por ejemplo, si ingresamos '25-12-01' (año de 2 dígitos), 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'.
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;
Problema:
Una empresa almacena los datos de sus empleados en una tabla "empleados".
Eliminamos la tabla, si existe:
Mostramos los datos de los empleados cuya fecha de ingreso es anterior a '01-01-1985':
Actualizamos el nombre a "Maria Carla Juarez' del empleado cuya fecha de ingreso es
igual a '20/05/1983':
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 más (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 cláusula "default" (tema que veremos a
continuación).
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 );
Problema:
Trabajamos con la tabla "libros" que almacena los datos de los libros de una librería.
Eliminamos la tabla, si existe:
Creamos la tabla:
Si ingresamos valores para todos los campos, podemos omitir la lista de campos:
No podemos omitir el valor para un campo declarado "not null", como el campo
"titulo":
Veamos cómo SQL Server almacenó los registros: select *from libros;
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 explícitamente con la cláusula "default".
Para todos los tipos, excepto los declarados "identity", se pueden explicitar valores por
defecto con la cláusula "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":
También se puede utilizar "default" para dar el valor por defecto a los campos en
sentencias "insert", por ejemplo:
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:
La sentencia anterior almacenará un registro con los valores predeterminados para cada
uno de sus campos.
Los campos para los cuales no se ingresan valores en un "insert" tomarán los valores
por defecto:
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.
Problema:
Creamos la tabla definiendo un valor por defecto para el campo "autor" y otro para el
campo "cantidad":
Si ingresamos un registro sin valor para el campo "precio", que admite valores nulos, se
ingresará "null" en ese campo:
Podemos emplear "default" para dar el valor por defecto a algunos campos:
Como todos los campos de "libros" tienen valores predeterminados, podemos tipear:
La sentencia anterior almacenará un registro con los valores predeterminados 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":
Si queremos ver los títulos, 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 título podemos multiplicar el precio
por la cantidad por cada título, pero también podemos hacer que SQL Server realice el
cálculo y lo incluya en una columna extra en la salida:
Si queremos saber el precio de cada libro con un 10% de descuento podemos incluir en
la sentencia los siguientes cálculos:
select 5/0;
Note que concatenamos además unos guiones para separar los campos.
Primer problema:
Un comercio que vende artículos de computación registra los datos de
sus artículos 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));
Problema:
Creamos la tabla:
23 - Alias
Una manera de hacer más 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 información de dicha tabla aparezca como
encabezado del campo "nombre" el texto "nombre y apellido", para ello colocamos un
alias de la siguiente manera:
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 más
de una palabra, es necesario colocarla entre comillas simples:
Un alias puede contener hasta 128 caracteres. También se puede crear un alias para
columnas calculadas. La palabra clave "as" es opcional en algunos casos, pero es
conveniente usarla.
Primer problema:
Trabaje con la tabla "libros" de una librería.
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));
Creamos la tabla:
24 - Funciones
Una función es un conjunto de sentencias que operan como una unidad lógica. Una
función tiene un nombre, retorna un parámetro de salida y opcionalmente acepta
parámetros 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:
- del sistema: informan sobre opciones, objetos y configuraciones del sistema. Ejemplo:
select user_name();
- texto e imagen: realizan operaciones con valor de entrada de tipo text o image y
retornan información referente al mismo.
Se pueden emplear las funciones del sistema en cualquier lugar en el que se permita una
expresión en una sentencia "select".
retorna "tardes".
- str(numero,longitud,cantidaddecimales): convierte números a caracteres; el primer
parámetro indica el valor numérico a convertir, el segundo la longitud del resultado
(debe ser mayor o igual a la parte entera del número más 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 inglés.
select str(123.456,7,3);
select str(-123.456,7,3);
retorna '-123.46';
select str(123.456);
retorna '123';
select str(123.456,3);
retorna '123';
Si el segundo parámetro es menor a la parte entera del número, devuelve asteriscos (*).
Ejemplo: select str(123.456,2,3);
retorna "**".
select stuff('abcde',3,2,'opqrs');
devuelve 4.
- char(x): retorna un caracter en código ASCII del entero enviado como argumento.
Ejemplo:
select char(65);
retorna "A".
retorna "www.sqlserverya.com'.
select reverse('Hola');
retorna "aloH".
retorna 7.
retorna 2.
retorna 0.
retorna 13.
retorna 2.
retorna 0.
retorna 0.
Problema:
Creamos la tabla:
Mostramos sólo los 12 primeros caracteres de los títulos de los libros y sus autores,
empleando la función "substring()":
Mostramos sólo los 12 primeros caracteres de los títulos de los libros y sus autores,
ahora empleando la función "left()":
Mostramos los títulos de los libros y sus precios convirtiendo este último a cadena de
caracteres con un solo decimal, empleando la función "str":
Se redondea a entero.
26 - Funciones matemáticas
Las funciones matemáticas realizan operaciones con expresiones numéricas y retornan
un resultado, operan con tipos de datos numéricos. Microsoft SQL Server tiene algunas
funciones para trabajar con números. Aquí presentamos algunas.
select abs(-20);
retorna 20.
select ceiling(12.34);
retorna 13.
select floor(12.34);
retorna 12.
select 10%3;
retorna 1.
select 10%2;
retorna 0.
retorna 8.
select round(123.456,1);
select round(123.456,2);
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).
Problema:
Creamos la tabla:
Vamos a mostrar los precios de los libros redondeando el valor hacia abajo y hacia
arriba:
select getdate();
Los valores para "partedefecha" pueden ser: year (año), quarter (cuarto), month (mes),
day (dia), week (semana), hour (hora), minute (minuto), second (segundo) y millisecond
(milisegundo). Ejemplos:
select datepart(month,getdate());
select datepart(day,getdate());
select datepart(hour,getdate());
select datename(month,getdate());
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 parámetro, tantas veces como lo indica el
segundo parámetro. Los valores para el primer argumento pueden ser: year (año),
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');
select dateadd(month,3,'1980/11/02');
select dateadd(hour,2,'1980/11/02');
select dateadd(minute,16,'1980/11/02');
select datediff(month,'2005/10/28','2006/11/29');
retorna 13 (meses).
select day(getdate());
select month(getdate());
select year(getdate());
Problema:
Trabajamos con la tabla "libros" de una librería.
Eliminamos la tabla si existe:
Creamos la tabla:
Muestre los títulos de los libros que se editaron el día 9, de cualquier mes de cualquier
año:
Por ejemplo, recuperamos los registros de la tabla "libros" ordenados por el título:
select *from libros order by titulo;
También podemos colocar el número de orden del campo por el que queremos que se
ordene en lugar de su nombre, es decir, referenciar a los campos por su posición en la
lista de selección. Por ejemplo, queremos el resultado del "select" ordenado por
"precio":
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;
También podemos ordenar por varios campos, por ejemplo, por "titulo" y "editorial":
Incluso, podemos ordenar en distintos sentidos, por ejemplo, por "titulo" en sentido
ascendente y "editorial" en sentido descendente:
Debe aclararse al lado de cada campo, pues estas palabras claves afectan al campo
inmediatamente anterior.
La cláusula "order by" no puede emplearse para campos text, ntext e image.
Primer problema:
En una página web se guardan los siguientes datos de las visitas:
número de visita, nombre, mail, pais, fecha.
1- Elimine la tabla "visitas", si existe:
if object_id('visitas') is not null
drop table visitas;
7- Muestre los mail, país, ordenado por país, de todos los que
visitaron la página en octubre (4 registros)
Problema:
Creamos la tabla:
Los operadores lógicos 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:
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":
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 condición dada, por ejemplo,
aquellos cuya editorial NO sea "Planeta":
Los paréntesis se usan para encerrar condiciones, para que se evalúen como una sola
expresión. Cuando explicitamos varias condiciones con diferentes operadores lógicos
(combinamos "and", "or") permite establecer el orden de prioridad de la evaluación;
además permite diferenciar las expresiones más claramente.
Si bien los paréntesis no son obligatorios en todos los casos, se recomienda utilizarlos
para evitar confusiones.
El orden de prioridad de los operadores lógicos es el siguiente: "not" se aplica antes que
"and" y "and" antes que "or", si no se especifica un orden de evaluación mediante el uso
de paréntesis. El orden en el que se evalúan los operadores con igual nivel de
precedencia es indefinido, por ello se recomienda usar los paréntesis.
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;
10- Borre los medicamentos cuyo laboratorio sea "Bayer" o cuyo precio
sea menor a 3 (3 registros borrados)
Segundo problema:
Trabajamos con la tabla "peliculas" de un video club que alquila
películas en video.
1- Elimine la tabla, si existe;
if object_id('peliculas') is not null
drop table peliculas;
5- Recupere los registros cuyo actor sea "Tom Cruise" y duración menor
a 100 (ninguno cumple ambascondiciones)
7- Borre todas las películas donde el actor NO sea "Tom Cruise" y cuya
duración sea mayor o igual a 100 (2 registros eliminados)
Se emplea el operador "is null" para recuperar los registros en los cuales esté
almacenado el valor "null" en un campo específico:
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 búsqueda positivas ("is null"), evite las negativas ("is not null") porque
con ellas se evalúan todos los registros y esto hace más lenta la recuperación de los
datos.
Primer problema:
Trabajamos con la tabla "peliculas" de un video club que alquila
películas en video.
1- Elimine la tabla, si existe;
if object_id('peliculas') is not null
drop table peliculas;
6- Borre todas las películas donde el actor sea "null" y cuya duración
sea 0 (1 registro)
Problema:
Creamos la tabla:
Recuperamos los registros en los cuales esté almacenado el valor "null" en el campo
"editorial":
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 lógico "and":
select *from libros where precio>=20 and precio<=40;
Averiguamos si el valor de un campo dado (precio) está entre los valores mínimo y
máximo especificados (20 y 40 respectivamente). "between" significa "entre". Trabaja
con intervalo de valores. Este operador se puede emplear con tipos de datos numéricos y
money (en tales casos incluyen los valores mínimo y máximo) y tipos de datos fecha y
hora (incluye sólo el valor mínimo). No tiene en cuenta los valores "null".
Siempre que sea posible, emplee condiciones de búsqueda positivas ("between"), evite
las negativas ("not between") porque hace más lenta la recuperación de los datos.
Entonces, se puede usar el operador "between" para reducir las condiciones "where".
Primer problema:
En una página web se guardan los siguientes datos de las visitas:
número 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;
5- Seleccione todos los autos cuyo precio esté entre 50000 y 100000.
Para recuperar los libros cuyo autor no sea 'Paenza' ni 'Borges' usábamos:
Recuerde: siempre que sea posible, emplee condiciones de búsqueda positivas ("in"),
evite las negativas ("not in") porque con ellas se evalún todos los registros y esto hace
más lenta la recuperación de los datos.
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;
Creamos la tabla:
El operador igual ("=") nos permite comparar cadenas de caracteres, pero al realizar la
comparación, busca coincidencias de cadenas completas, realiza una búsqueda exacta.
sólo aparecerá el primer registro, ya que la cadena "Borges" no es igual a la cadena "J.L.
Borges". Esto sucede porque el operador "=" (igual), también 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%";
Note que el símbolo "%" ya no está al comienzo, con esto indicamos que el título debe
tener como primera letra la "M" y luego, cualquier cantidad de caracteres.
Así como "%" reemplaza cualquier cantidad de caracteres, el guión bajo "_" reemplaza
un caracter, es otro caracter comodín. Por ejemplo, queremos ver los libros de "Lewis
Carroll" pero no recordamos si se escribe "Carroll" o "Carrolt", entonces tipeamos esta
condición:
Para seleccionar los libros cuya editorial comienza con las letras entre la "P" y la "S"
usamos la siguiente sintaxis:
Ejemplos:
Para seleccionar los libros cuya editorial NO comienza con las letras "P" ni "N"
tipeamos:
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));
8- Recupere todos los nombres que tengan una "y" o una "j" en su
nombre o apellido (3 registros)
11- Muestre todos los nombres y sueldos de los empleados cuyos sueldos
incluyen centavos (3
registros)
Creamos la tabla:
Recuperamos todos los libros que contengan en el campo "autor" la cadena "Borges":
Si queremos ver los libros de "Lewis Carroll" pero no recordamos si se escribe "Carroll"
o "Carrolt", podemos emplear el comodín "_" (guión bajo) y establecer la siguiente
condición: select *from libros where autor like '%Carrol_';
Buscamos los libros cuya editorial comienza con las letras entre la "P" y la "S":
Seleccionamos los libros cuya editorial NO comienza con las letras "P" ni "N":
Recuperamos todos los libros cuyo precio se encuentra entre 10.00 y 19.99:
Imaginemos que nuestra tabla "libros" contiene muchos registros. Para averiguar la
cantidad sin necesidad de contarlos manualmente usamos la función "count()":
La función "count()" cuenta la cantidad de registros de una tabla, incluyendo los que
tienen valor nulo. También podemos utilizar esta función junto con la cláusula "where"
para una consulta más específica. Queremos saber la cantidad de libros de la editorial
"Planeta":
Para contar los registros que tienen precio (sin tener en cuenta los que tienen valor
nulo), usamos la función "count()" y en los paréntesis colocamos el nombre del campo
que necesitamos contar:
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;
Creamos la tabla:
Note que incluye todos los libros aunque tengan valor nulo en algún campo.
Contamos los registros que tienen precio (sin tener en cuenta los que tienen valor nulo),
usando la función "count(precio)":