Manual de Sql-Server Parte II
Manual de Sql-Server Parte II
Manual de Sql-Server Parte II
2 – Funciones Matemáticas
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 trigonométricas que retornan radianes.
Se pueden emplear estas funciones enviando como argumento el nombre de un campo de tipo
numérico.
Trabajamos con la tabla "libros" de una librería.
Eliminamos la tabla si existe:
1
MANUAL DE SQL-SERVER PARTE II
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;
select titulo,autor,precio,
floor(precio) as abajo,
ceiling(precio) as arriba
from libros;
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 específica de una fecha, el año, trimestre, día, hora, etc.
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());
retorna el número de mes actual;
select datepart(day,getdate());
retorna el día actual;
select datepart(hour,getdate());
retorna la hora actual;
- datename(partedefecha,fecha): retorna el nombre de una parte específica 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
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');
2
MANUAL DE SQL-SERVER PARTE II
Datos a cargar
if object_id ('libros') is not null
drop table libros;
3
MANUAL DE SQL-SERVER PARTE II
Mostrar pantalla
4
MANUAL DE SQL-SERVER PARTE II
Muestre los títulos de los libros que se editaron el día 9, de cualquier mes de cualquier año:
select titulo from libros
where datepart(day,edicion)=9;
Mostrar pantalla
Ejercicio
5
MANUAL DE SQL-SERVER PARTE II
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);
6
MANUAL DE SQL-SERVER PARTE II
7
MANUAL DE SQL-SERVER PARTE II
8
MANUAL DE SQL-SERVER PARTE II
Problema:
9
MANUAL DE SQL-SERVER PARTE II
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 cómo el uso de paréntesis hace que SQL Server evalúe en forma
diferente ciertas consultas aparentemente iguales:
Select * from libros
where (autor='Borges') or
(editorial='Paidos' and precio<20);
Primer problema:
10
MANUAL DE SQL-SERVER PARTE II
cantidad tinyint,
primary key(codigo)
);
inserte pantalla
11
MANUAL DE SQL-SERVER PARTE II
12
MANUAL DE SQL-SERVER PARTE II
13
MANUAL DE SQL-SERVER PARTE II
inserte pantalla
14
MANUAL DE SQL-SERVER PARTE II
10- Borre los medicamentos cuyo laboratorio sea "Bayer" o cuyo precio sea
menor a 3 (3 registros borrados)
inserte pantalla
Segundo problema:
15
MANUAL DE SQL-SERVER PARTE II
4- Recupere los registros cuyo actor sea "Tom Cruise" or "Richard Gere"
(3 registros)
inserte pantalla
5- Recupere los registros cuyo actor sea "Tom Cruise" y duración menor a
100 (ninguno cumple ambas condiciones)
inserte pantalla
16
MANUAL DE SQL-SERVER PARTE II
6- Cambie la duración a 200, de las películas cuyo actor sea "Daniel R."
y cuya duración sea 180 (1registro afectado)
inserte pantalla
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)
inserte pantalla
17
MANUAL DE SQL-SERVER PARTE II
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".
Si agregamos el operador "not" antes de "between" el resultado se invierte, es decir, se recuperan los
registros que están 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 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".
Problema:
Trabajamos con la tabla "libros" de una librería.
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('Antología poética','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)
18
MANUAL DE SQL-SERVER PARTE II
problema
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;
19
MANUAL DE SQL-SERVER PARTE II
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' usábamos 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' usábamos:
select *from libros
where autor<>'Borges' and
autor<>'Paenza';
También 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 condición, 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 búsqueda positivas ("in"), evite las negativas
("not in") porque con ellas se evalúan todos los registros y esto hace más lenta la recuperación de los datos.
problema
Primer problema:
20
MANUAL DE SQL-SERVER PARTE II
primary key(codigo) );
4- Recupere los nombres y precios de los medicamentos cuyo laboratorio sea "Bayer" o "Bago" empleando
el operador "in" (4 registros)
Inserte pantalla
21
MANUAL DE SQL-SERVER PARTE II
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);
Inserte pantalla
22
MANUAL DE SQL-SERVER PARTE II
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 búsquedas 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 '[';
Problema:
23
MANUAL DE SQL-SERVER PARTE II
Recuperamos todos los libros que contengan en el campo "autor" la cadena "Borges":
select *from libros
where autor like '%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":
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]%';
24
MANUAL DE SQL-SERVER PARTE II
Recuperamos todos los libros cuyo precio se encuentra entre 10.00 y 19.99:
select titulo,precio from libros
where precio like '1_.%';
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)
);
25
MANUAL DE SQL-SERVER PARTE II
4- Muestre todos los empleados con apellido "Perez" empleando el operador "like" (3 registros)
Inserte pantalla
5- Muestre todos los empleados cuyo domicilio comience con "Co" y tengan un "8" (2 registros)
Inserte pantalla
26
MANUAL DE SQL-SERVER PARTE II
7- Seleccione todos los empleados cuyo documento NO comience con 1 ni 3 y cuyo nombre finalice en "ez"
(2 registros)
Inserte pantalla
27
MANUAL DE SQL-SERVER PARTE II
8- Recupere todos los nombres que tengan una "y" o una "j" en su nombre o apellido (3 registros)
Inserte pantalla
9- Muestre los nombres y sección de los empleados que pertenecen a secciones que comiencen con "S" o
"G" y tengan 8 caracteres (3 registros)
Inserte pantalla
28
MANUAL DE SQL-SERVER PARTE II
10- Muestre los nombres y sección de los empleados que pertenecen a secciones que NO comiencen con "S"
o "G" (2 registros)
Inserte pantalla
11- Muestre todos los nombres y sueldos de los empleados cuyos sueldos incluyen centavos (3 registros)
Inserte pantalla
29
MANUAL DE SQL-SERVER PARTE II
select count(*)
from libros;
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":
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 función
"count()" y en los paréntesis 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.
30
MANUAL DE SQL-SERVER PARTE II
Problema:
Creamos la tabla:
select count(*)
from libros;
Note que incluye todos los libros aunque tengan valor nulo en algún campo.
select count(*)
from libros
where editorial='Planeta';
Contamos los registros que tienen precio (sin tener en cuenta los que tienen valor nulo), usando la
función "count(precio)":
31
MANUAL DE SQL-SERVER PARTE II
select count(precio)
from libros;
Primer problema:
32
MANUAL DE SQL-SERVER PARTE II
33
MANUAL DE SQL-SERVER PARTE II
6- Cuente la cantidad de medicamentos que tienen precio distinto a "null" y que tienen
cantidad distinto a "null", disponer alias para las columnas.
inserte pantalla
7- Cuente la cantidad de remedios con precio conocido, cuyo laboratorio comience con
"B" (2 registros)
inserte pantalla
34
MANUAL DE SQL-SERVER PARTE II
Hemos visto que SQL Server tiene funciones que nos permiten contar registros, calcular
sumas, promedios, obtener valores máximos y mínimos, las funciones de agregado.
Se pueden usar en una instrucción "select" y combinarlas con la cláusula "group by".
Todas estas funciones retornan "null" si ningún registro cumple con la condición 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:
La función "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":
35
MANUAL DE SQL-SERVER PARTE II
select sum(cantidad)
from libros;
Para averiguar el valor máximo o mínimo de un campo usamos las funciones "max()" y
"min()" respectivamente.
Queremos saber cuál es el mayor precio de todos los libros:
select max(precio)
from libros;
Entonces, dentro del paréntesis de la función colocamos el nombre del campo del cuál
queremos el máximo valor.
La función "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%';
Si realiza una consulta con la función "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".
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)
36
MANUAL DE SQL-SERVER PARTE II
);
37
MANUAL DE SQL-SERVER PARTE II
6- Muestre el sueldo más alto y el más bajo colocando un alias (5000 y 2000)
Inserte pantalla
38
MANUAL DE SQL-SERVER PARTE II
8- Muestre el promedio de sueldos de todo los empleados (3400. Note que hay un
sueldo nulo y no es tenido en cuenta)
Inserte pantalla
39
MANUAL DE SQL-SERVER PARTE II
40
MANUAL DE SQL-SERVER PARTE II
Si queremos saber la cantidad de libros agrupados por editorial pero considerando sólo
algunos grupos, por ejemplo, los que devuelvan un valor mayor a 2, usamos la siguiente
instrucción:
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:
En algunos casos es posible confundir las cláusulas "where" y "having". Queremos contar
los registros agrupados por editorial sin tener en cuenta a la editorial "Planeta".
Analicemos las siguientes sentencias:
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".
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":
41
MANUAL DE SQL-SERVER PARTE II
Aquí, selecciona los registros rechazando los que no cumplan con la condición dada en "where",
luego los agrupa por "editorial" y finalmente rechaza los grupos que no cumplan con la condición
dada en el "having".
Se emplea la cláusula "having" con funciones de agrupamiento, esto no puede hacerlo la cláusula
"where". Por ejemplo queremos el promedio de los precios agrupados por editorial, de aquellas
editoriales que tienen más de 2 libros:
En una cláusula "having" puede haber hasta 128 condiciones. Cuando utilice varias condiciones,
tiene que combinarlas con operadores lógicos (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:
Entonces, usamos la claúsula "having" para restringir las filas que devuelve una salida "group by".
Va siempre después de la cláusula "group by" y antes de la cláusula "order by" si la hubiere.
Problema:
Creamos la tabla:
42
MANUAL DE SQL-SERVER PARTE II
precio decimal(5,2),
cantidad tinyint,
primary key(codigo)
);
Queremos saber la cantidad de libros agrupados por editorial pero considerando sólo algunos
grupos, por ejemplo, los que devuelvan un valor mayor a 2, usamos la siguiente instrucción:
Queremos el promedio de los precios de los libros agrupados por editorial, pero solamente de
aquellos grupos cuyo promedio supere los 25 pesos:
Queremos la cantidad de libros, sin considerar los que tienen precio nulo (where), agrupados por
editorial (group by), sin considerar la editorial "Planeta" (having):
43
MANUAL DE SQL-SERVER PARTE II
group by editorial
having editorial<>'Planeta';
Necesitamos el promedio de los precios agrupados por editorial, de aquellas editoriales que tienen
más de 2 libros:
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:
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;
44
MANUAL DE SQL-SERVER PARTE II
45
MANUAL DE SQL-SERVER PARTE II
5- Obtenga el total de los registros agrupados por ciudad y provincia sin considerar los
que tienen menos de 2 clientes (3 filas)
inserte pantalla
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)
inserte pantalla
Segundo problema:
46
MANUAL DE SQL-SERVER PARTE II
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;
47
MANUAL DE SQL-SERVER PARTE II
4- Obtenga el total de las compras agrupados por ciudad y sexo de aquellas filas que
devuelvan un valor superior a 50 (3 filas)
inserte pantalla
5- Obtenga el total de las compras agrupados por ciudad y sexo (group by), teniendo
en cuenta todos los valores (all), considerando sólo los montos de compra superiores a
50 (where), los visitantes con teléfono (where), sin considerar la ciudad de "Cordoba"
(having), ordenados por ciudad (order by) (3 filas)
inserte pantalla
48
MANUAL DE SQL-SERVER PARTE II
6- Muestre el monto mayor de compra agrupado por ciudad, siempre que dicho valor
supere los 50 pesos (having), considerando sólo los visitantes de sexo femenino y
domicilio conocido (where) (2 filas)
inserte pantalla
7- Agrupe por ciudad y sexo, muestre para cada grupo el total de visitantes, la suma
de sus compras y el promedio de compras, ordenado por la suma total y considerando
las filas con promedio superior a 30 (3 filas)
inserte pantalla
49