You are on page 1of 35

Manual de SQL Server 2000 Consultas.

- SELECT

LENGUAJE DE MANIPULACION DE DATOS
CONSULTAS .- SELECT
INTRODUCCIN
Esta sentencia forma parte del DML (lenguaje de manipulacin de datos), en este
tema veremos cmo seleccionar columnas de una tabla, cmo seleccionar filas y
cmo obtener las filas ordenadas por el criterio que queramos.
SQL Server proporciona a travs de Transact SQL una forma fcil de poder consultar
datos desde una base de datos. El acrnimo SQL significa: Lenguaje de consulta
estructurado (Structured Query Language). Utilizaremos en adelante la base de
datos Neptuno como base de datos ejemplo.
El resultado de la consulta es una tabla lgica, porque no se guarda en el disco
sino que est en memoria y cada vez que ejecutamos la consulta se vuelve a
calcular.
Cuando ejecutamos la consulta se visualiza el resultado en forma de tabla con
columnas y filas, pues en la SELECT tenemos que indicar qu columnas queremos
que tenga el resultado y qu filas queremos seleccionar de la tabla origen.
Bsicamente, una consulta SQL se constituye de las siguientes partes
fundamentales:
SELECT [ALL] [DISTINCT] [TOP N] <columnas que se desean obtener>
FROM <nombres de tablas origen >
[WHERE] <condiciones de seleccin o bsqueda de filas>
[GROUP BY] <columnas para agrupar funciones agregadas>
[HAVING] <criterios para seleccin para las funciones agregadas>
[ORDER BY] <especifica cmo deben ordenarse los resultados>
La lista de columnas que queremos que aparezcan en el resultado es lo que
llamamos lista de seleccin (columnas que se desean obtener) y se especifica
despus de la clusula SELECT.
Se utiliza el asterisco * en <columnas que se desean obtener> para recuperar
todas las columnas de la tabla. Tiene dos ventajas:
Evitar nombrar las columnas una a una (es ms corto). Si aadimos una columna
nueva en la tabla, esta nueva columna saldr sin tener que modificar la consulta.
Se puede combinar el * con el nombre de una tabla (Ej. Productos.*), pero esto se
utiliza ms cuando el origen de la consulta son dos tablas.
Las columnas se pueden especificar mediante su nombre simple (Nombre de
Columna) o su nombre cualificado (NombreTabla.NombreColumna, el nombre de la
Ing. Segundo Jos Castillo Zumarn 1

Manual de SQL Server 2000 Consultas.- SELECT

columna precedido del nombre de la tabla que contiene la columna y separados
por un punto).
El nombre cualificado se puede emplear siempre que queramos y es obligatorio en
algunos casos que veremos ms adelante.
Cuando el nombre de la columna o de la tabla contiene espacios en blanco, hay
que poner el nombre entre corchetes [] y adems el nmero de espacios en blanco
debe coincidir. Por ejemplo [codigo de cliente] no es lo mismo que [ codigo de
cliente] (el segundo lleva un espacio en blanco delante de cdigo)
Con la clusula FROM indicamos en qu tabla tiene que buscar la informacin. En
este captulo de consultas simples el resultado se obtiene de una nica tabla.
La clusula WHERE selecciona nicamente las filas que cumplan la condicin de
seleccin especificada.
En la consulta slo aparecern las filas para las cuales la condicin es verdadera
(TRUE), los valores nulos (NULL) no se incluyen por lo tanto en las filas del
resultado. La condicin de seleccin puede ser cualquier condicin vlida o
combinacin de condiciones utilizando los operadores NOT (no) AND (y) y OR ().
Condiciones de seleccin
Las condiciones de seleccin son las condiciones que pueden aparecer en la clusula
WHERE.
En SQL tenemos cinco condiciones bsicas:
El Test de comparacin
El Test de rango
El Test de pertenencia a un conjunto
El Test de valor nulo
El Test de correspondencia con patrn .
El Test de comparacin.
Compara el valor de una expresin con el valor de otra.
La sintaxis es la siguiente:

= igual que
<> distinto de
< menor que
<= menor o igual
> mayor que
>= mayor o igual

Ing. Segundo Jos Castillo Zumarn 2

Manual de SQL Server 2000 Consultas.- SELECT

Test de rango (BETWEEN).
Examina si el valor de la expresin est comprendido entre los dos valores
definidos por exp1 y exp2.
Tiene la siguiente sintaxis:

Test de pertenencia a conjunto (IN)
Examina si el valor de la expresin es uno de los valores incluidos en la lista de
valores.
Tiene la siguiente sintaxis:

Test de valor nulo (IS NULL)
Una condicin de seleccin puede dar como resultado el valor verdadero TRUE, falso
FALSE o nulo NULL.
Cuando una columna que interviene en una condicin de seleccin contiene el
valor nulo, el resultado de la condicin no es verdadero ni falso, sino nulo, sea
cual sea el Test que se haya utilizado. Por eso si queremos listar las filas que
tienen valor en una determinada columna, no podemos utilizar el Test de
comparacin. Si queremos preguntar si una columna contiene el valor nulo debemos
utilizar un Test especial, el Test de valor nulo.
Tiene la siguiente sintaxis:

Test de correspondencia con patrn (LIKE)
Se utiliza cuando queremos utilizar caracteres comodines para formar el valor
con el comparar.
Tiene la siguiente sintaxis:


Los comodines ms usados son los siguientes:
? Representa un carcter cualquiera
% Representa cero o ms caracteres
# Representa un dgito cualquiera (0-9)
Ing. Segundo Jos Castillo Zumarn 3

Manual de SQL Server 2000 Consultas.- SELECT

Nota.- En las Siguientes consultas, trabajaremos con la Base de Datos Neptuno.
Empezaremos por estudiar la sentencia SELECT, que permite recuperar datos de
una o varias tablas. La sentencia SELECT es con mucho la ms compleja y potente
de las sentencias SQL. Empezaremos por ver las consultas ms simples, basadas
en una sola tabla.
Ejemplo:
Obtener los nombres y apellidos de los empleados que tienen como jefe al empleado
con codigo 2.
SELECT idEmpleado, apellidos, nombre
FROM Empleados
WHERE jefe=2
Cuando se visualiza el resultado de la consulta, normalmente las columnas toman
el nombre que tiene la columna en la tabla, si queremos cambiar ese nombre lo
podemos hacer definiendo un alias de columna mediante la clusula AS ser el
nombre que aparecer como ttulo de la columna.
SELECT idEmpleado as [Cdigo Empleado], apellidos as Apellidos, nombre as Nombres
FROM Empleados
WHERE jefe=2
En adelante, analizaremos cada una de las clusulas que pueden incluirse en una
consulta SQL con la finalidad de explotar la funcionalidad de este lenguaje.
Para ordenar las filas del resultado de la consulta, tenemos la clusula ORDER BY.

Con esta clusula se altera el orden de visualizacin de las filas de la tabla pero en
ningn caso se modifica el orden de las filas dentro de la tabla. La tabla no se
modifica.
Podemos indicar la columna por la que queremos ordenar utilizando su nombre de
columna (nbcolumna) o utilizando su nmero de orden que ocupa en la lista de
seleccin (Ncolumna).
Veamos estos ejemplos.
Por Defecto Ordena de manera ascendente
SELECT idEmpleado,Apellidos+', '+Nombre as NombreCompleto
FROM Empleados
ORDER BY 2
Se puede Ordenar por N Columnas y especificar la forma de ordenamiento
(Ascendente o Descendente). Si no se especifica la forma de ordenamiento, se
considera de forma ascendente por defecto.
SELECT idCliente,nombreCompaa,Pas,Ciudad
FROM Clientes
WHERE Pas IS NOT NULL
ORDER BY 3 ASC,4 DESC
Ing. Segundo Jos Castillo Zumarn 4

Manual de SQL Server 2000 Consultas.- SELECT

A continuacin veremos las clusulas que nos permiten indicar qu filas queremos
visualizar.

Las clusulas DISTINCT / ALL.- Al incluir la clusula DISTINCT en la SELECT, se
eliminan del resultado las repeticiones de filas. Si por el contrario queremos que
aparezcan todas las filas incluidas las duplicadas, podemos incluir la clusula ALL o
nada, ya que ALL es el valor que SQL asume por defecto.
Por ejemplo queremos saber los pases y sus ciudades a los cuales pertenecen
nuestros clientes.
SELECT Pas,Ciudad
FROM Clientes
WHERE Pas IS NOT NULL
ORDER BY 1,2
En esta Consulta aparecen Filas repetidas
SELECT DISTINCT Pas,Ciudad
FROM Clientes
WHERE Pas IS NOT NULL
ORDER BY 1,2
En esta Consulta con la Clusula DISTINCT se eliminan las Filas repetidas
La clusula TOP.- La clusula TOP permite sacar las N primeras filas de la tabla
origen. No elige entre valores iguales, si pido los 25 primeros valores pero el que
hace 26 es el mismo valor que el 25, entonces devolver 26 registros en vez de 25
(o los que sea). Siempre se guia por la columna de ordenacin, la que aparece en
la clusula ORDER BY o en su defecto la clave principal de la tabla.
Por ejemplo queremos saber los dos empleados ms antiguos de la empresa.
SELECT TOP 2 dEmpleado,Apellidos+', '+Nombre as NombreCompleto,fechaContratacin
FROM Empleados
ORDER BY 3 DESC
El nmero de filas que queremos visualizar se puede expresar con un nmero
entero o como un porcentaje sobre el nmero total de filas que se recuperaran
sin la clusula TOP. En este ltimo caso utilizaremos la clusula TOP n PERCENT
(porcentaje en ingls).
SELECT TOP 20 PERCENT idEmpleado,Apellidos+', '+Nombre as NombreCompleto,fechaContratacin
FROM Empleados
ORDER BY 3 DESC
SQL Server 2000 tiene muchas funciones predefinidas que se pueden utilizar,
enumerarlas y explicarlas sera demasiado largo. Lo mejor es saber que tenemos
muchas funciones y cuando queramos obtener algo diferente consultar la ayuda de
SQL Server 2000 para ver si existe una funcin para lo que queremos hacer.
A ttulo de ejemplo tenemos unas que se utilizan ms a menudo:
GetDate() devuelve la fecha y hora en que estamos
Year(fecha) devuelve el ao de la fecha
Ing. Segundo Jos Castillo Zumarn 5

Manual de SQL Server 2000 Consultas.- SELECT

Month(fecha) devuelve el mes de la fecha
Day(fecha) devuelve el dia de la fecha
Uso del parntesis.
Cuando combinamos varias expresiones podemos utilizar los parntesis para
delimitar cada expresin. Siempre se tiene que utilizar un parntesis de apertura (
y uno de cierre ).
Ejemplo: precioUnidad+ (precioUnidad * 0.1)
El uso del parntesis sirve para que la expresin quede ms clara sobre todo
cuando combinamos muchas expresiones, y para que los operadores actuen en el
orden que nosotros queramos para as olvidarnos de la prioridad de los
operadores.
Funciones de resumen
Son funciones que permiten efectuar una operacin aritmtica que resume los
valores de una columna de toda la tabla, o que resume los valores de la columna
agrupados segn determinado criterio. La funcin produce un solo valor que es el
resumen de la tabla, o de cada uno de los grupos.
Funcin SUM
Realiza una suma acumulada de un atributo para todas las filas accedidas mediante
una consulta SQL.
Queremos obtener la suma del precio de todos los productos almacenados, bastara
con realizar la siguiente consulta.
SELECT SUM(precioUnidad) as SumaPrecio FROM Productos
Resultado
SumaPrecio
---------------------
2222.7100
(1 filas afectadas)
Funcion COUNT ( * )
Cuenta todas las filas de las tablas accedidas mediante una consulta SQL
Queremos mostrar el total de productos con los que actualmente esta vendiendo la
Empresa:
SELECT COUNT(*) as TotalProductos FROM Productos WHERE suspendido=0
Resultado
TotalProductos
--------------
69
(1 filas afectadas)


Ing. Segundo Jos Castillo Zumarn 6

Manual de SQL Server 2000 Consultas.- SELECT

Funcion AVG ( Average)
Realiza una media aritmtica de los atributos para todas las filas accedidas mediante
una consulta SQL.
Ejemplo 14
SELECT AVG (precioUnidad) as PrecioPromedio from PRODUCTOS Where suspendido=0
Resultado
PrecioPromedio
---------------------
26.7343
(1 filas afectadas)
Funcion MAX
Obtiene el maximo valor del atributo especificado, de entre todas las filas
seleccionadas mediante una consulta SQL.
Queremos saber cual es Producto ms caro que actualmente vendemos:
SELECT MAX (precioUnidad) as [Mas Caro] FROM Productos
Resultado
Mas Caro
---------------------
263.5000
(1 filas afectadas)
Funcion MI N.
Obtiene el mnimo valor del atributo especificado de entre todas las filas
seleccionadas mediante una consulta SQL.
SELECT MIN (precioUnidad) as [Mas Barato] FROM Productos
Resultado
Mas Barato
---------------------
2.5000
(1 filas afectadas)
Ing. Segundo Jos Castillo Zumarn 7

Manual de SQL Server 2000 Consultas.- SELECT

Para Cimentar esta parte basica de consultas presentamos una serie de Consultas
sencillas a una Tabla.
1. Lista de Empleados
SELECT * FROM Empleados
2. Lista de Clientes que sean de Brasil
SELECT idCliente,NombreCompaa,pas
FROM Clientes
WHERE pas='Brasil'
3. Lista de Proveedores cuyo cargo contacto sea Representante de Ventas
SELECT IdEmpleado,apellidos+', '+nombre as [Nombre Completo Empleado]
FROM EMPLEADOS
WHERE Cargo='Representante de Ventas'
4. Lista de Productos cuyo precio unidad sea mayor a 50.
SELECT idProducto,NombreProducto,precioUnidad
FROM Productos WHERE precioUnidad>50
ORDER BY 2
5. Lista de Productos que comiencen con M.
SELECT idProducto,NombreProducto,precioUnidad
FROM Productos
WHERE nombreProducto like 'M%'
6. Lista de Pedidos efectuados entre el 01/08/1994 y el 30/10/1994
SELECT idPedido,fechaPedido as [Fecha de Pedido],pasDestinatario
FROM Pedidos WHERE fechaPedido Between '01/08/1994' and '30/10/1994'
ORDER BY fechaPedido
7. Lista de proveedores que tengan Fax.
SELECT idProveedor, NombreCompaa,NombreContacto,Telfono,Fax
FROM Proveedores
WHERE fax is NOT NULL
8. Lista de proveedores que no tengan Fax
SELECT idProveedor, NombreCompaa,NombreContacto,Telfono,Fax
FROM Proveedores WHERE fax is NULL
9. Lista de Clientes que tengan la palabra com en forma ordenadamente
descendentemente.
SELECT idCliente, NombreCompaa
FROM Clientes
WHERE NombreCompaa LIKE '%com%'
ORDER BY 2 DESC
10. Lista de productos cuyo proveedor sea de codigo 3,5 y 7.
SELECT idProducto,NombreProducto,precioUnidad,idProveedor
FROM Productos
WHERE idProveedor IN (3,5,7)
ORDER BY 2 DESC
11. Lista de clientes cuya pais sea Alemania, Espaa o Francia.
SELECT idCliente, NombreCompaa,pas
FROM Clientes
WHERE pas IN ('Alemania','Espaa','Francia')
ORDER BY 2 DESC
Ing. Segundo Jos Castillo Zumarn 8

Manual de SQL Server 2000 Consultas.- SELECT

12. Lista de Empleados y sus edades.
SELECT IdEmpleado,apellidos+', '+nombre as [Nombre Completo Empleado],
DATEDIFF(mm, fechaNacimiento, getdate())/12 as Edad
FROM Empleados
13. Lista de pedidos realizados en octubre del ao de 1994.
SELECT idPedido,fechaPedido
FROM Pedidos
WHERE year(fechaPedido)=1994 and month(fechaPedido)=8
14. Cual es el producto mas barato.
SELECT MAX(precioUnidad)
FROM Productos

SELECT TOP 1 idProducto,nombreProducto,precioUnidad
FROM Productos
ORDER BY 3 DESC
15. Cual es el producto mas caro.
SELECT MIN(precioUnidad)
FROM Productos

SELECT TOP 1 idProducto,nombreProducto,precioUnidad
FROM Productos
ORDER BY 3 ASC
Ing. Segundo Jos Castillo Zumarn 9

Manual de SQL Server 2000 Consultas.- SELECT

Cuando deseamos obtener informacin que est distribuida en ms de una tabla
podemos hacer uso de las combinaciones. Los tipos de combinaciones ms comunes
son las reuniones, las que pueden ser internas o externas: INNER JOIN (reunin
interna), LEFT OUTER JOIN (reunin externa izquierda), RIGHT OUTER JOIN
(reunin externa derecha), FULL OUTER JOIN (reunin externa completa, que es la
unin de LEFT OUTER JOIN y RIGHT OUTER JOIN), y CROSS JOIN (producto
cartesiano de dos tablas).
En conclusin, Un JOIN o consulta correlacionada es la consulta que selecciona
columnas de ms de una tabla, y las muestra en un nico conjunto de resultados.

SELECT lista_columna
FROM tabla1 Tipo_join JOIN tabla2 ON condicin_del_join

Lista_columnas es la lista de columnas a mostrar en el resultado de la consulta.
Se recomienda que cada columna sea clasificada con el alias de la tabla a la cual
pertenece.
Tipo_join indica si el JOIN es interior (INNER), exterior (OUTER) o irrestricto
(CROSS).
Condicin_del_join es una expresin que indica en base a que columnas de cada
una de las tablas se establece la relacin entre ellas.

USANDO REUNIONES INTERNAS
Una reunin interna queda expresada a travs de la clusula INNER JOIN. INNER
JOIN devuelve filas de cualquiera de las tablas slo si tienen una fila correspondiente
en la otra tabla. ste es el tipo de combinacin predeterminado si no se especifica
ningn tipo de combinacin.
El INNER JOIN es otro tipo de composicin de tablas, permite emparejar filas de
distintas tablas de forma ms eficiente que con el producto cartesiano cuando una de
las columnas de emparejamiento est indexada. Ya que en vez de hacer el producto
cartesiano completo y luego seleccionar la filas que cumplen la condicin de
emparejamiento, para cada fila de una de las tablas busca directamente en la otra
tabla las filas que cumplen la condicin, con lo cual se emparejan slo las filas que
luego aparecen en el resultado.
La sintaxis es la siguiente:

tabla1 y tabla2 son especificaciones de tabla (nombre de tabla con alias o no,
nombre de consulta guardada), de las tablas cuyos registros se van a combinar.
Pueden ser las dos la misma tabla, en este caso es obligatorio definir al menos un
alias de tabla.
col1, col2 son las columnas de emparejamiento.
Observar que dentro de la clusula ON los nombres de columna deben ser
nombres cualificados (llevan delante el nombre de la tabla y un punto).
Ing. Segundo Jos Castillo Zumarn 10

Manual de SQL Server 2000 Consultas.- SELECT

Las columnas de emparejamiento deben contener la misma clase de datos, las
dos de tipo texto, de tipo fecha etc... los campos numricos deben ser de tipos
similares. Por ejemplo, se puede combinar campos AutoNumrico y Long puesto que
son tipos similares, sin embargo, no se puede combinar campos de tipo Simple y
Doble. Adems las columnas no pueden ser de tipo Memo ni OLE.
comp representa cualquier operador de comparacin ( =, <, >, <=, >=, o <> ) y
se utiliza para establecer la condicin de emparejamiento.
Se pueden combinar ms de dos tablas
En este caso hay que sustituir en la sintaxis una tabla por un INNER JOIN
completo.
Departamento (5 Filas)

Id_dep Nombre Jefe
1 Ventas Lpez
2 Finanzas Mora
3 Personal Castro
4 Logistica Alva
5 marketing Ludea
Empleado (8 Filas)












Id_emp Paterno Id_dep
101 Quispe 2
102 Soria 1
103 Osorio 2
104 Aliaga 3
105 Vera 2
106 Barrios NULL
107 Mrquez 1
108 Cceres 2

SELECT e.id_emp, e.paterno, d.jefe
FROM Empleado e INNER JOIN departamento d ON e.iddep=d.id_dep

Resultado (7 Filas)
Id_emp paterno Jefe
101 Quispe Mora
102 Soria Lpez
103 Osorio Mora
104 Aliaga Castro
105 Vera Mora
107 Mrquez Lpez
108 Cceres Mora
Ejemplo
Listar los Productos y los nombres de categora a los cuales pertenecen. Utilice la
Base de Datos Neptuno.
Sugerencia:
En la consulta mostrada se hace uso de los alias para reducir la cantidad de cdigo
de la consulta. Cuando utilizamos un alias (como Empleado As E) nos referimos a la
tabla origen a partir del alias creado evitando la necesidad de escribir el nombre
completo de la tabla origen. Adems, los alias son utilizados tambin para renombrar
las columnas que se mostrarn en la clusula SELECT, sobretodo cuando se
mostrarn valores a partir de expresiones.
SELECT idProducto,NombreProducto,precioUnidad,nombreCategora as Categoria
FROM Productos p INNER JOIN Categoras c ON p.idCategora=c.idCategora
WHERE suspendido=0
Es posible listar las tablas origen en la clusula FROM una tras otra e incluir las
Ing. Segundo Jos Castillo Zumarn 11

Manual de SQL Server 2000 Consultas.- SELECT

condiciones de combinacin en la clusula WHERE, aunque esto genera un producto
cartesiano entre las tablas origen, lo que afecta directamente el rendimiento de la
consulta. Por otra parte, se mezclan en la clusula WHERE tanto condiciones de
reunin, como condiciones de filtrado, lo que hace menos legible la consulta.
SELECT idProducto,NombreProducto,precioUnidad,nombreCategora as Categoria
FROM Productos p,Categoras c
WHERE p.idCategora=c.idCategora AND suspendido=0
Ejemplo
Listar los pedidos registrados en la Primera Quincena del mes de Noviembre. La
informacin debe presentar en el siguiente formato.
Numero de Pedido, Fecha de Pedido, Nombre de Cliente, Empleado que atendio el pedido.

Como vemos para elaborar la consulta tendremos que trabajar con tres tablas, la
tabla Empleados, Pedidos y Clientes.
En este caso hay que sustituir en la sintaxis una tabla por un INNER JOIN completo.
SELECT idPedido,fechaPedido,NombreCompaa,apellidos+', '+nombre as NombreEmpleado
FROM Pedidos p INNER JOIN Clientes c ON p.idCliente=c.idCliente
INNER JOIN Empleados e ON p.idEmpleado=e.IdEmpleado
WHERE YEAR(p.fechapedido)=1994 AND MONTH(p.fechapedido)=11 AND DAY(p.fechapedido) BETWEEN 1 AND 15
ORDER BY 3

USANDO REUNIONES EXTERNAS - OUTER JOIN

Un outer join es la consulta correlacionada que entrega todas las filas que estn
relacionadas, y adems:
Las filas no relacionadas de la tabla izquierda (LEFT OUTER JOIN ), o
Las filas no relacionadas de la tabla derecha (RIGHT OUTER JOIN), o
Las filas no relacionadas de ambas tablas (FULL OUTER JOIN)

Se considera como tabla izquierda, a aquella que se menciona en la clusula FROM.

LEFT OUTER JOIN
Devuelve todas las filas para las que exista una conexin entre las tablas
involucradas. Adems, devuelve todas las filas de la primera tabla para las que no
existe una fila correspondiente en la segunda tabla. Al devolver filas sin
concordancia, las columnas seleccionadas de la segunda tabla se devuelven como
NULL.
Departamento (5 Filas)

Id_dep Nombre Jefe
1 Ventas Lpez
2 Finanzas Mora
3 Personal Castro
4 Logistica Alva
5 marketing Ludea
Empleado (8 Filas)












Id_emp Paterno Id_dep
101 Quispe 2
102 Soria 1
103 Osorio 2
104 Aliaga 3
105 Vera 2
106 Barrios NULL
107 Mrquez 1
108 Cceres 2

SELECT e.id_emp, e.paterno, d.jefe
FROM empleado e LEFT OUTER JOIN departamento d ON e.id_dep=d.id_dep

Ing. Segundo Jos Castillo Zumarn 12

Manual de SQL Server 2000 Consultas.- SELECT

Resultado (8 filas)
Id_emp Paterno Jefe
101 Quispe Mora
102 Soria Lpez
103 Osorio Mora
104 Aliaga Castro
105 Vera Mora
106 Barrios NULL
107 Mrquez Lpez
108 Cceres Mora

La consulta muestra a los 7 empleados que estn registrados en departamentos existentes, y
adems al empleado 106 Barrios que figura en un departamento inexistente.
Como empleado es la tabla izquierda, la consulta debe mostrar todas las filas de la tabla
empleado; es decir, las filas relacionadas y las filas no relacionadas.

RIGHT OUTER JOIN
Devuelve todas las filas para las que exista una conexin entre las tablas
involucradas. Adems, devuelve todas las filas de la segunda tabla para las que no
existe una fila correspondiente en la primera tabla. Al devolver filas sin concordancia,
las columnas seleccionadas de la primera tabla se devuelven como NULL.

Departamento (5 Filas)

Id_dep Nombre Jefe
1 Ventas Lpez
2 Finanzas Mora
3 Personal Castro
4 Logistica Alva
5 marketing Ludea
Empleado (8 Filas)












Id_emp Paterno Id_dep
101 Quispe 2
102 Soria 1
103 Osorio 2
104 Aliaga 3
105 Vera 2
106 Barrios NULL
107 Mrquez 1
108 Cceres 2

SELECT e.id_emp, e.paterno, d.jefe
FROM empleado e RIGHT OUTER JOIN departamento d ON e.id_dep = d.id_dep

RESULTADO (9 filas)
Id_emp paterno Jefe
101 Quispe Mora
102 Soria Lpez
103 Osorio Mora
104 Aliaga Castro
105 Vera Mora
107 Mrquez Lpez
108 Cceres Mora
NULL NULL Alva
NULL NULL Ludea

La consulta muestra a los 7 empleados que estn registrados en departamentos
existentes, y adems a los jefes de departamento que no tienen empleados a su
cargo.
Como departamento es la tabla de la izquierda, la consulta debe mostrar todas las
filas de la tabla empleado que tienen relacin con la tabla departamento y adems
las filas de tabla departamento que no tienen relacin con la tabla empleado.
Ing. Segundo Jos Castillo Zumarn 13

Manual de SQL Server 2000 Consultas.- SELECT

Como puede suponer, podemos transformar una reunin izquierda en una derecha
invirtiendo el orden de las tablas involucradas. Aunque ms que una cuestin de
orden, las reuniones externas izquierdas y derechas proporcionan mejor expresividad
a las consultas y cubren muchas necesidades en cuanto a consultas.

FULL OUTER JOIN
Devuelve todas las filas para las que exista una conexin entre las tablas
involucradas. Adems, devuelve todas las filas de la primera tabla para las que no
existe una fila correspondiente en la segunda tabla y todas las filas de la segunda
tabla para las que no existe una fila correspondiente en la primera tabla. Al devolver
filas sin concordancia, las columnas seleccionadas de la primera o segunda tabla se
devuelven como NULL. Podemos decir que FULL OUTER JOIN es la unin de LEFT
OUTER J OI N y RI GHT OUTER J OI N.

Departamento (5 Filas)

Id_dep Nombre Jefe
1 Ventas Lpez
2 Finanzas Mora
3 Personal Castro
4 Logistica Alva
5 marketing Ludea
Empleado (8 Filas)












Id_emp Paterno Id_dep
101 Quispe 2
102 Soria 1
103 Osorio 2
104 Aliaga 3
105 Vera 2
106 Barrios NULL
107 Mrquez 1
108 Cceres 2

SELECT e.id_emp, e.paterno, d.jefe
FROM Empleado e FULL OUTER JOIN Departamento d ON e.id_dep = d.id_dep

Resultado (10 filas)
Id_emp paterno Jefe
101 Quispe Mora
102 Soria Lpez
103 Osorio Mora
104 Aliaga Castro
105 Vera Mora
107 Mrquez Lpez
108 Cceres Mora
106 Barrios NULL
NULL NULL Alva
NULL NULL Ludea

La consulta muestra a los 7 empleados que estan registrados en departamentos
existents, y adems a los empleados registrados en departamentos inexistentes, y a
los jefes de departamento que no tienen empleados a su cargo.
Ing. Segundo Jos Castillo Zumarn 14

Manual de SQL Server 2000 Consultas.- SELECT

CROSS JOIN
Un CROSS JOIN es la consulta correlacionada que combina cada una de las filas de
las tablas con todas las filas de la otra tabla.
Devuelve todas las filas de la primera tabla combinadas con todas las filas de la
segunda tabla. La clusula ON no se incluye. En pocas palabras, CROSS JOIN
devuelve el producto cartesiano de las dos tablas.
No es necesario que exista una columna comn para ejecutar cross join
Departamento (5 Filas)

Id_dep Nombre Jefe
1 Ventas Lpez
2 Finanzas Mora
3 Personal Castro
4 Logistica Alva
5 marketing Ludea
Empleado (8 Filas)












Id_emp Paterno Id_dep
101 Quispe 2
102 Soria 1
103 Osorio 2
104 Aliaga 3
105 Vera 2
106 Barrios NULL
107 Mrquez 1
108 Cceres 2

SELECT e.id_emp, e.paterno, d.jefe
FROM empleado e CROSS JOIN departamento d
o
SELECT e.id_emp, e.paterno, d.jefe
FROM empleado e , departamento d
Aunque la segunda consulta no hace uso de CROSS JOIN, devuelve la misma
informacin que la primera. Listar las tablas separadas por comas en la clusula
FROM genera un producto cartesiano de las filas de las tablas comprometidas.

RESULTADO (40 filas)
Id_emp Paterno Jefe
101 Quispe Lpez
101 Quispe Mora
101 Quispe Castro
101 Quispe Alva
101 Quispe Ludea
102 Soria Lpez
102 Soria Mora
102 Soria Castro
102 Soria Alva
102 Soria Ludea
103 Osorio Lpez


107 Mrquez Ludea
108 Caceres Lpez
108 Caceres Mora
108 Caceres Castro
108 Caceres Alva
108 Caceres Ludea

Ing. Segundo Jos Castillo Zumarn 15

Manual de SQL Server 2000 Consultas.- SELECT

Ms Ejemplos
1. Listar los pedidos atendidos por la compaa de envos Speedy Express
SELECT pe.idPedido,pe.fechaPedido,cl.NombreCompaa as Cliente
FROM Pedidos pe INNER JOIN [Compaas de Envos] co ON pe.formaEnvo=co.IdCompaaEnvos
INNER JOIN Clientes cl ON pe.idCliente=cl.idCliente
WHERE co.NombreCompaa='Speedy Express'
ORDER BY 2 ASC
2. Lista de productos de la categora Bebidas.
SELECT pr.idProducto,pr.nombreProducto,pr.precioUnidad
FROM Productos pr INNER JOIN Categoras ca ON pr.idCategora=ca.idCategora
WHERE ca.NombreCategora='Bebidas'
ORDER BY 2 ASC
3. Lista de pedidos registrados en el primer trimestre del ao de 1995. Mostrar el
nmero de pedido, fecha de registro, nombre de compaa para la cual se
registro y el empleado que atendi.
SELECT pe.idPedido,pe.fechaPedido,cl.nombreCompaa as Cliente, apellidos+', '+nombre as Empleado
FROM Pedidos pe INNER JOIN Clientes cl ON pe.idCliente=cl.idCliente
INNER JOIN Empleados em ON pe.idEmpleado=em.idEmpleado
WHERE YEAR(fechaPedido) =1995 and MONTH(fechaPedido) IN (1,2,3,4)
4. Mostrar cuntos empleados tienen ms de 14 aos trabajando en la compaa.
SELECT COUNT(*) as Cantidad
FROM empleados where DATEDIFF(yy, FechaContratacin, GETDATE()) > 14
5. Listar los productos, la categora a la que pertenece y el proveedor que lo surte.
SELECT a.nombreProducto,a.precioUnidad,b.nombreCategora as Categoria,c.nombreCompaa as Proveedor
FROM Productos a INNER JOIN Categoras b ON a.idCategora=b.idCategora
INNER JOIN Proveedores c ON a.idProveedor=c.idProveedor
WHERE suspendido=0
6. Listar los empleados que tengan entre 50 y 60 aos.
SELECT idEmpleado,apellidos+', '+nombre as Empleado,fechaNacimiento,
DATEDIFF(yy, FechaNacimiento, GETDATE()) as Edad
FROM Empleados
WHERE DATEDIFF(yy, FechaNacimiento, GETDATE()) BETWEEN 50 AND 60
7. Lista de proveedores que no tengan pagina principal.
SELECT idProveedor,nombreCompaa,nombreContacto
FROM Proveedores
WHERE pginaPrincipal IS NULL
8. Quienes son los empleados que actualmente tienen entre 10 y 13 aos laborando
en la empresa.
SELECT idEmpleado,apellidos+', '+nombre as Empleado,fechaContratacin,
DATEDIFF(yy, fechaContratacin, GETDATE()) as Edad
FROM Empleados
WHERE DATEDIFF(yy, fechaContratacin, GETDATE()) BETWEEN 10 AND 13
9. Quien es el empleado que tiene menos edad.
SELECT TOP 1 idEmpleado,apellidos+', '+nombre as Empleado,fechaNacimiento,
DATEDIFF(yy, FechaNacimiento, GETDATE()) as Edad
FROM Empleados
ORDER BY 4 ASC




Ing. Segundo Jos Castillo Zumarn 16

Manual de SQL Server 2000 Consultas.- SELECT

10. Lista de pedidos que demoraron mas de 10 das entre la fecha que se realizo el
pedido y la fecha que se envi.
SELECT idPedido,fechaPedido,fechaenvo,DATEDIFF(dd,fechaPedido, fechaenvo)
FROM Pedidos
WHERE DATEDIFF(dd,fechaPedido, fechaenvo)>10
11. Cual fue el pedido que mas se demoro en atenderse desde que se realizo hasta la
fecha que se envi.
SELECT TOP 1 idPedido,fechaPedido,fechaenvo,DATEDIFF(dd,fechaPedido, fechaenvo) AS TotalDias
FROM Pedidos
ORDER BY 4 DESC
12. Lista de Clientes que no tenga Fax.
SELECT idCliente,nombreCompaa,nombreContacto,cargoContacto
FROM Clientes
WHERE fax IS NULL
13. Ver todos los pedidos realizados los das lunes o viernes que demoraron una
semana en ser despachados.
Revizar las funciones DATEPART ( datepart , date ), DATENAME ( datepart , date )

SELECT idPedido,fechaPedido,fechaenvo
FROM Pedidos
WHERE DateName(dw,fechaPedido) IN ('Lunes','Viernes') AND DATEDIFF(dd,fechaPedido, fechaenvo)=7
14. Lista de pedidos donde aparece el producto Pan Fino como parte del pedido, en
que cantidad se compro, a que precio.
SELECT idPedido,de.precioUnidad,cantidad
FROM [Detalles de Pedidos] de INNER JOIN Productos pr ON de.idProducto=pr.idProducto
WHERE pr.nombreProducto LIKE 'Pan Fino'
15. A que categora pertenece el productos mas caro.
SELECT TOP 1 pr.nombreProducto,pr.precioUnidad,ca.nombreCategora
FROM Productos pr INNER JOIN Categoras ca ON pr.idCategora=ca.idCategora
ORDER BY 2 DESC
16. Que proveedor ofrece el producto mas caro.
SELECT TOP 1 a.nombreProducto,a.precioUnidad,b.nombreCompaa
FROM Productos a INNER JOIN Proveedores b ON a.idProveedor=b.idProveedor
ORDER BY 2 DESC
17. Lista de todos los productos suspendidos, a que categora pertenece y que
proveedor los ofrece.
SELECT a.idProducto,a.nombreProducto,a.precioUnidad,cantidadporUnidad,b.nombreCategora,c.nombreCompaa
FROM Productos a INNER JOIN Categoras b ON a.idCategora=b.idCategora
INNER JOIN Proveedores c ON a.idProveedor=c.idProveedor
WHERE suspendido=1
Ing. Segundo Jos Castillo Zumarn 17

Manual de SQL Server 2000 Consultas.- SELECT

UNIENDO MLTIPLES CONJUNTOS DE RESULTADOS
El operador UNION une los resultados de dos o ms sentencias SELECT en un solo
conjunto de resultados.
Use el operador UNION cuando los datos que desea recuperar residen en diferentes
localizaciones y no puede acceder a ellos con una sola consulta. Cuando use el
operador UNION considere lo siguiente:
SQL Server requiere que las consultas a las tablas referenciales tengan el mismo
nmero de columnas, los mismos tipos de datos, y que las columnas se
encuentren en el mismo orden en la lista SELECT.
SQL Server elimina las filas duplicadas en el resultado. Sin embargo, si usa la
opcin ALL, todas las filas (incluso las duplicadas) son incluidas en el resultado.
Debe especificar los nombres de las columnas en la primera sentencia del
SELECT. Por consiguiente, si quiere definir los nuevos titulos de las columnas
para el resultado, debe crear los seudnimos de las columnas en la pimera
sentencia SELECT.
Si quiere que el resultado completo sea devuelto en un orden especfico, debe
especificar el orden e incluir la clusula ORDER BY dentro de la sentencia UNION.
Sentencia_select
UNION [ALL]
Sentencia_select
UNION [ALL]
Sentencia_select,
Ejemplo con la Base de Datos Neptuno.
Este ejemplo combina dos resultados. El primer resultado devuelve el nombre, la
ciudad y cdigo postal de cada cliente de la tabla Clientes. El segundo resultado
devuelve el nombre, ciudad y cdigo postal de cada empleado de la tabla
Empleados.
SELECT (nombre + ' ' + apellidos) as Nombre, ciudad, cdPostal FROM Empleados
UNION
SELECT NombreCompaa, ciudad, cdPostal FROM Clientes
ORDER BY 1 ASC
Tambin podemos indicar que queremos el resultado ordenado por algn criterio, en
este caso se incluye la clusula ORDER BY que ya vimos en el tema anterior. La
clusula ORDER BY se escribe despus de la ltima consulta, al final de la sentencia;
para indicar las columnas de ordenacin podemos utilizar su nmero de orden o el
nombre de la columna, en este ltimo caso se deben de utilizar los nombres de
columna de la primera consulta ya que son los que se van a utilizar para nombrar las
columnas del resultado.
Ing. Segundo Jos Castillo Zumarn 18

Manual de SQL Server 2000 Consultas.- SELECT

CREANDO UNA TABLA DESDE UN CONJUNTO DE RESULTADOS
Es posible crear una tabla a partir del resultado de una consulta. Esta tabla tiene
como nombres de columna los mismos especificados en la instruccin SELECT de la
consulta y adquieren sus tipos de datos y longitudes originales.
Ejemplos:
Mostrar la lista de productos que no estn suspendidos as como el nombre de la
categora a la cual pertenecen.
-- Creacin de tabla temporal local
SELECT p.idProducto,p.NombreProducto,p.precioUnidad,c.nombreCategora
INTO #Productos_Categoria
FROM Productos p INNER JOIN Categoras c ON p.idCategora=c.idCategora
Esta consulta ha creado la tabla #Productos_ Categoria y las columnas incluidas en
la clusula SELECT; adems, ha incluido como registros aquellos devueltos por la
consulta. Podemos utilizar DROP TABLE para eliminar la tabla, hacer alguna
consulta sobre ella o inspeccionar sus columnas con sp_columns.
EXEC sp_columns Gerentes_Dptos
En Transact SQL es posible crear tablas temporales locales y tablas temporales
globales para almacenar los resultados de una consulta. La diferencia radica en que
las tablas temporales locales (llamadas tambin privadas) slo pueden ser accesadas
por la conexin que las cre, mientras que las tablas temporales globales existen
mientras exista alguna conexin que haga uso de ellas.
Para crear una tabla temporal local basta anteponer el smbolo # al nombre de la
tabla, y el smbolo ## si desea crear una tabla temporal global. A continuacin se
muestra la consulta anterior creando una tabla temporal local y una tabla temporal
global.
-- Creacin de tabla temporal local
SELECT p.idProducto,p.NombreProducto,p.precioUnidad,c.nombreCategora
INTO ##Productos_Categoria
FROM Productos p INNER JOIN Categoras c ON p.idCategora=c.idCategora








Ing. Segundo Jos Castillo Zumarn 19

Manual de SQL Server 2000 Consultas.- SELECT

INTRODUCCIN A LAS SUBCONSULTAS
Las subconsultas facilitan la tares de realizar operaciones relativamente complejas,
al subdividirlas en pequeas consultas en la que cada una contribuye en la solucin
proporcionando datos especficos. En SQL Server la mayor parte de las
combinaciones puede expresarse de manera alternativa como subconsultas, aunque
suele ser menos eficiente que realizar la operacin de combinacin.
Use las subconsultas para solucionar una consulta compleja en una serie de pasos
lgicos y en consecuencia, para resolver un problema con una sola sentencia.
Al utilizar subconsultas es comn hacer uso de los predicados IN, ALL, ANY y NOT,
adems de los operadores de comparacin ya conocidos (>, <, =, etc.). Debe
tenerse en cuenta que el uso de todos estos operadores depende del nmero de
valores devueltos por una subconsulta.
Es habitual utilizar la operacin IN para subconsultas, tanto para encontrar valores
que cumplan los criterios establecidos, como para encontrar valores que no los
cumplan, negando dichos criterios (NOT IN). Utilizar el predicado IN es equivalente
a utilizar =ANY, de igual forma, NOT IN es equivalente a <> ALL.
Porqu no usar subconsultas
Se recomienda el uso de JOINS en lugar de subconsultas porque MICROSOFT SQL
Server procesa un JOIN mas rpido que las subconsultas. El uso de las subconsultas
puede forzar al SQL Server Query Optimizer a ejecutar pasos adicionales, como
ordenar, y puede influir en el rendimiento del proceso.
Si una consulta no requiere de mltiples pasos, puede no ser necesario usar una
subconsulta.
Uso de subconsultas
Cuando decida usar subconsultas, considere los hechos siguientes:
La subconsulta se especifica entre parntesis.
La lista SELECT de una subconsulta solo puede contener una expresin nombre
de columna que devuelva un valor.
Pude utilizar una subconsulta en cualquier lugar donde se define una expresin,
con la condicin que devuelva un solo valor.
No se puede usar subconsultas en columnas que contienen texto y tipos de datos
de imagen.




Ing. Segundo Jos Castillo Zumarn 20

Manual de SQL Server 2000 Consultas.- SELECT

Subconsultas que retornan un solo valor.
Se definen:
En la lista de columnas del SELECT externo.
En la clusula WHERE con un operador de comparacin (test de comparacin)
Mostrar todos los productos que no estn suspendidos cuyo precio este por encima
del precio promedio de dichos productos.
Ejemplo: en la lista del SELECT

SELECT p.idProducto,p.NombreProducto,precioUnidad,unidadesEnExistencia,
CONVERT(Float,unidadesEnExistencia*precioUnidad)*100/
(SELECT SUM(unidadesEnExistencia*precioUnidad) FROM Productos WHERE suspendido=0) as
Porcentaje
FROM Productos p INNER JOIN Categoras c ON p.idCategora=c.idCategora
WHERE suspendido=0
ORDER BY 5 DESC

La subconsulta (SELECT SUM(unidadesEnExistencia*precioUnidad) FROM Productos WHERE
suspendido=0) calcula el total de ventas. Luego, este resultado es utilizado por la
consulta externa para calcular el porcentaje de dinero invertido por cada Producto
respecto al Total.

Ejemplo: test de comparacin

SELECT idProducto,NombreProducto,precioUnidad
FROM Productos
WHERE suspendido=0 AND precioUnidad>(SELECT AVG(precioUnidad) from Productos WHERE
suspendido=0)

La subconsulta (SELECT AVG(precioUnidad) from Productos WHERE suspendido=0) determina el
precio promedio de los productos que no estan suspendidos. Luego, este valor es
utilizado para determinar que productos estan por encima del precio promedio.

Subconsultas que retornan un conjunto de valores
Se definen en la clusula WHERE con el operador IN (Test de pertenencia).
Ejemplo de test de pertenencia
Listar de los clientes registrados, solo los clientes que no han registrado ningn
pedido en el ao de 1995
SELECT idcliente,nombrecompaa
FROM clientes
WHERE idcliente NOT IN (SELECT DISTINCT idcliente FROM pedidos WHERE YEAR(fechapedido)=1995)

La Sub consulta (SELECT DISTINCT idcliente FROM pedidos WHERE YEAR(fechapedido)=1995) ,
genera una lista de cdigos de CLIENTES que han registrado pedidos. Luego, la
consulta externa utiliza la lista para determinar que clientes no han solicitado
pedidos.





Ing. Segundo Jos Castillo Zumarn 21

Manual de SQL Server 2000 Consultas.- SELECT

Subconsultas Correlacionadas

Se presentan cuando la consulta externa debe entregar datos a la consulta interna
para que se pueda ejecutar.

La consulta interna se evala repetidamente, una vez por cada fila de la consulta
externa.
Se pueden definir en la clusula WHERE de la consulta externa usando el
operador EXISTS (Test de existencia).

Ejemplo

Este ejemplo devuelve una lista de clientes que pidieron ms de 20 piezas del
producto nmero 23 en un pedido.

SELECT p.idPedido,c.NombreCompaa
FROM pedidos p INNER JOIN clientes c ON p.idcliente=c.idcliente
WHERE (select cantidad FROM [detalles de pedidos] d WHERE idproducto=23 AND d.idpedido=p.idpedido
)>20

Ejemplo de de Test de Existencia

Genera una lista de clientes que han registrado pedidos en el mes de julio de 1995

SELECT c.idcliente, c.nombrecompaa
FROM clientes c
WHERE EXISTS
(SELECT * FROM pedidos p WHERE p.idcliente=c.idcliente AND YEAR(p.fechapedido)=1995 AND
MONTH(p.fechapedido)=7)

Observacin:
Los dos ejemplos anteriores pueden replantearse como JOINS. En general, se
recomienda el uso de JOINS antes que el de subconsultas correlacionadas.

Conceptualmente, una consulta correlacionada es similar a un bucle en
programacin, aunque no se utilizan en absoluto las construcciones procedimentales
do-while o for. El resultado de cada ejecucin de la subconsulta debe estar
correlacionado (asociado o correspondido) a una fila de la consulta principal.


Ing. Segundo Jos Castillo Zumarn 22

Manual de SQL Server 2000 Consultas.- SELECT

Funciones de columna
Las funciones agregadas permiten resumir columnas de resultados. SQL Server
proporciona seis funciones agregadas generales que forman parte del estndar ANSI
SQL-92.
Usando Funciones Agregadas
En la lista de seleccin de una consulta de resumen aparecen funciones de columna
tambin denominadas funciones de dominio agregadas. Una funcin de columna se
aplica a una columna y obtiene un valor que resume el contenido de la columna.
Funciones Descripcin
AVG Promedio de valores en una expresin
Numerica
COUNT Numero de valores en una expresin
COUNT(*) Numero de filas seleccionadas
MAX Maximo valor en la expresin
MIN Minimo valor en la expresin
SUM Valores Totales en una expresin numerica
STDEV Desviacin estadistica de todos los valores
STDEVP Desviacin estadistica de la poblacin
VAR Varianza estadistica de todos los valores
VARP Varianza estadistica de todos los valores
de la poblacin.

El argumento de la funcin indica con qu valores se tiene que operar, por eso
expresin suele ser un nombre de columna, columna que contiene los valores a
resumir, pero tambin puede ser cualquier expresin vlida que devuelva una lista
de valores.
La funcin SUM() calcula la suma de los valores indicados en el argumento. Los
datos que se suman deben ser de tipo numrico (entero, decimal, coma flotante o
monetario...). El resultado ser del mismo tipo aunque puede tener una precisin
mayor.
Ejemplo:
SELECT SUM(cargo) as MontoFlete
FROM Pedidos
WHERE YEAR(fechaPedido)=1995 AND MONTH(fechaPedido)=5
La funcin AVG() calcula el promedio (la media arimtica) de los valores indicados en
el argumento, tambin se aplica a datos numricos, y en este caso el tipo de dato
del resultado puede cambiar segn las necesidades del sistema para representar el
valor del resultado.
Ing. Segundo Jos Castillo Zumarn 23

Manual de SQL Server 2000 Consultas.- SELECT

StDev() y StDevP() calculan la desviacin estndar de una poblacin o de una
muestra de la poblacin representada por los valores contenidos en la columna
indicada en el argumento. Si la consulta base (el origen) tiene menos de dos
registros, el resultado es nulo.
Es interesante destacar que el valor nulo no equivale al valor 0, las funciones de
columna no consideran los valores nulos mientras que consideran el valor 0 como un
valor, por lo tanto en las funciones AVG(), STDEV(), STDEVP() los resultados no
sern los mismos con valores 0 que con valores nulos. Vemoslo con un ejemplo:
Si tenemos esta tabla con el nombre tabla1:
Col1
10
5
0
3
6
0
La consulta
SELECT AVG(col1) AS Media
FROM tabla1
Devuelve:
Media
4
En este caso los ceros entran en la media por lo que sale igual a 4
(10+5+0+3+6+0)/6 =4
Con esta otra tabla, la tabla2:
Col1
10
5
NULL
3
6
NULL
SELECT AVG(col1) AS Media
FROM tabla2
Devuelve:
Media
4
En este caso los ceros se han sustituido por valores nulos y no entran en el clculo,
por lo que la media sale igual a 6.
(10+5+3+6)/4 = 4
Ing. Segundo Jos Castillo Zumarn 24

Manual de SQL Server 2000 Consultas.- SELECT

Las funciones MIN() y MAX() determinan los valores menores y mayores
respectivamente. Los valores de la columna pueden ser de tipo numrico, texto o
fecha. El resultado de la funcin tendr el mismo tipo de dato que la columna. Si la
columna es de tipo numrico MIN() devuelve el valor menor contenido en la
columna, si la columna es de tipo texto MIN() devuelve el primer valor en orden
alfabtico, y si la columna es de tipo fecha, MIN() devuelve la fecha ms antigua y
MAX() la fecha ms reciente.
La funcin COUNT(nb columna) cuenta el nmero de valores que hay en la columna,
los datos de la columna pueden ser de cualquier tipo, y la funcin siempre devuelve
un nmero entero. Si la columna contiene valores nulos esos valores no se cuentan,
si en la columna aparece un valor repetido, lo cuenta varias veces.
COUNT(*) permite contar filas en vez de valores. Si la columna no contiene ningn
valor nulo, COUNT(nbcolumna) y COUNT(*) devuelven el mismo resultado, mientras
que si hay valores nulos en la columna, COUNT(*) cuenta tambin esos valores
mientras que COUNT(nb columna) no los cuenta.
Ejemplo:
Cuntos empleados tenemos?
Cuntos empleados tienen una oficina asignada?
Se pueden combinar varias funciones de columna en una expresin pero no se
pueden anidar funciones de columna, es decir:
SELECT (AVG(ventas) * 3) + SUM(cuota)
FROM ...
Es correcto
SELECT AVG(SUM(ventas))
FROM ...
NO es correcto, no se puede incluir una funcin de columna dentro de una funcin de
columna
Ing. Segundo Jos Castillo Zumarn 25

Manual de SQL Server 2000 Consultas.- SELECT

Las consultas de resumen
En SQL SERVER 2000 y de la mayora de los motores de bases de datos relacionales,
podemos definir un tipo de consultas cuyas filas resultantes son un resumen de
las filas de la tabla origen, por eso las denominamos consultas de resumen,
tambin se conocen como consultas sumarias.
Es importante entender que las filas del resultado de una consulta de resumen tienen
una naturaleza distinta a las filas de las dems tablas resultantes de consultas, ya
que corresponden a varias filas de la tabla origen. Para simplificar, veamos el caso
de una consulta basada en una sola tabla, una fila de una consulta 'no resumen'
corresponde a una fila de la tabla origen, contiene datos que se encuentran en una
sola fila del origen, mientras que una fila de una consulta de resumen
corresponde a un resumen de varias filas de la tabla origen, esta diferencia es
lo que va a originar una serie de restricciones que sufren las consultas de resumen y
que veremos a lo largo del tema.
Las consultas de resumen introducen dos nuevas clusulas a la sentencia SELECT,
la clusula GROUP BY y la clusula HAVING, son clusulas que slo se pueden
utilizar en una consulta de resumen, se tienen que escribir entre la clusula WHERE
y la clusula ORDER BY y tienen la siguiente sintaxis:

En el ejemplo que viene a continuacin tienes un ejemplo de consulta normal en la
que se visualizan las filas de la tabla pedidos ordenados por fechapedido, en este
caso cada fila del resultado se corresponde con una sola fila de la tabla pedidos,
mientras que la segunda consulta es una consulta resumen, cada fila del resultado se
corresponde con una o varias filas de la tabla pedidos.












Ing. Segundo Jos Castillo Zumarn 26

Manual de SQL Server 2000 Consultas.- SELECT

SELECT idpedido,fechapedido,cargo
FROM pedidos
WHERE YEAR(fechapedido)=1995 AND MONTH(fechapedido)=1 AND DAY(fechapedido) BETWEEN 1 AND 15
ORDER BY 2

SELECT fechapedido,SUM(cargo) as MontoCargoPorDia
FROM pedidos
WHERE YEAR(fechapedido)=1995 and MONTH(fechapedido)=1 AND DAY(fechapedido) BETWEEN 1 AND15
GROUP BY fechapedido
ORDER BY 1

|

La clusula GROUP BY



Hasta ahora las consultas de resumen que hemos visto utilizan todas las filas de la
tabla y producen una nica fila resultado.
Se pueden obtener subtotales con la clusula GROUP BY. Una consulta con una
clusula GROUP BY se denomina consulta agrupada ya que agrupa los datos de la
tabla origen y produce una nica fila resumen por cada grupo formado. Las
columnas indicadas en el GROUP BY se llaman columnas de agrupacin.
Ejemplo:
Un columna de agrupacin no puede ser de tipo memo u OLE.
La columna de agrupacin se puede indicar mediante un nombre de o cualquier
expresin vlida basada en una columna pero no se pueden utilizar los alias de
campo.

En la lista de seleccin slo pueden aparecer :
Valores constantes
Funciones de columna
Columnas de agrupacin (columnas que aparecen en la clusula GROUP BY)
O cualquier expresin basada en las anteriores.
Ing. Segundo Jos Castillo Zumarn 27

Manual de SQL Server 2000 Consultas.- SELECT

Se pueden agrupar las filas por varias columnas, en este caso se indican las
columnas separadas por una coma y en el orden de mayor a menor agrupacin. Se
permite incluir en la lista de agrupacin hasta 10 columnas.
Ejemplo: Queremos obtener la cantidad de clientes por pais y ciudad:
SELECT pas,ciudad,COUNT(*) as NumeroClientes FROM clientes
GROUP BY pas,ciudad
ORDER BY 1,2
Se agrupa primero por pas, y dentro de cada pas por ciudad.
Todas las filas que tienen valor nulo en el campo de agrupacin, pasan a formar un nico
grupo. Es decir, considera el valor nulo como un valor cualquiera a efectos de agrupacin.
La clusula HAVING


La clusula HAVING nos permite seleccionar filas de la tabla resultante de una
consulta de resumen.
Para la condicin de seleccin se pueden utilizar los mismos Tests de comparacin
descritos en la clusula WHERE, tambin se pueden escribir condiciones (unidas por
los operadores OR, AND, NOT), pero existe una restriccin.
En la condicin de seleccin slo pueden aparecer:
.- Valores constantes
.- Funciones de columna
.- Columnas de agrupacin (columnas que aparecen en la clusula GROUP BY)
.- O cualquier expresin basada en las anteriores.
Ejemplo: Queremos listar los nombres de Categoras con la cantidad de productos no
suspendidos.
SELECT c.nombreCategora,COUNT(*) as [Total Productos]
FROM Productos p INNER JOIN Categoras c ON p.idcategora=c.idcategora
WHERE p.suspendido=0
GROUP BY c.nombreCategora
HAVING COUNT(*)>10
ORDER BY 2 DESC
Ejemplo: Mostrar cuntos empleados han ingresado a la compaa por ao.
SELECT YEAR(fechaContratacin),COUNT(*)
FROM empleados
GROUP BY YEAR(fechaContratacin)

Ejemplo: Relacin de clientes cuya participacin de compras a las empresas en el
mes de enero del ao 1995 hayan superado los 5000 dlares en todos sus pedidos
registrados en ese mes.

SELECT c.idcliente,c.nombrecompaa,SUM(d.precioUnidad*d.cantidad-d.descuento) as MontoCompra
FROM pedidos p INNER JOIN clientes c ON p.idcliente=c.idcliente
INNER JOIN [detalles de pedidos] d ON p.idpedido=d.idpedido
WHERE YEAR(p.fechapedido)=1995 and MONTH(p.fechapedido)=1
GROUP BY c.idcliente,c.nombrecompaa
HAVING SUM(d.precioUnidad*d.cantidad-d.descuento)>5000
ORDER BY 3 DESC


Ing. Segundo Jos Castillo Zumarn 28

Manual de SQL Server 2000 Consultas.- SELECT

Resumen del tema

Cmo se ejecuta internamente una consulta de resumen?
Primero se forma la tabla origen de datos segn la clusula FROM,
Se seleccionan del origen de datos las filas segn la clusula WHERE,
Se forman los grupos de filas segn la clusula GROUP BY,
Por cada grupo se una fila en la tabla resultante con los valores que aparecen en
las clusulas GROUP BY, HAVING y en la lista de seleccin,
Se seleccionan de la tabla resultante las filas segn la clusula HAVING,
Se eliminan de la tabla resultante las columnas que no aparecen en la lista de
seleccin,
se ordenan las filas de la tabla resultante segn la clusula ORDER BY.
Una consulta se convierte en consulta de resumen en cuanto aparece GROUP BY,
HAVING o una funcin de columna.
En una consulta de resumen, la lista de seleccin y la clusula HAVING slo
pueden contener:
Valores constantes
Funciones de columna
Columnas de agrupacin (columnas que aparecen en la clusula GROUP BY)
O cualquier expresin basada en las anteriores.







Ing. Segundo Jos Castillo Zumarn 29

Manual de SQL Server 2000 Consultas.- SELECT

Mas Ejemplos
1. Cual fue el empleado que atendi el pedido con mayor monto en el ao de 1995.
2. Lista de categoras y cuantos productos tiene cada una, ordenados por total de
productos.
3. Lista de clientes y la cantidad de pedidos que compro cada uno en el ao de
1995.
4. Lista de proveedores que despachan mas de 3 productos.
5. Lista de pedidos y sus montos respectivos registrados en el mes de julio del ao
de 1996.
6. Listado de empleados y cuantos pedidos efectu cada uno de ellos en el primer
trimestre de 1995.
7. Listado de clientes y cuantos pedidos efectu cada uno de ellos en el segundo
trimestre de 1995.
8. Listado de compaas de envos y cuantos pedidos despacharon cada uno de ellos
en el segundo semestre del ao 1995.
9. Listado de Proveedores y cuantos productos que no estn suspendidos ofrecen
cada uno de ellos.
10. Listado de empleados y el monto acumulado de todos sus pedidos.
11. Listado de clientes y el monto acumulado de todos sus pedidos.
12. Lista de pedidos registrados en la primera semana de enero de 1995 y sus
montos totales.
13. Lista de pedidos registrados en la primera semana de enero de 1995 con sus
montos totales sin descuentos, montos de descuento y montos netos.
14. Lista de pedidos y los montos netos de cada uno de ellos, realizados por el
empleado Andrew.
15. Cual es el monto que genero la producto Pez Espada en el Primer trimestre de
1995.
16. Cual fue el producto que tuvo menos ventas en unidades en el ao de 1994.
17. Cual fue el producto que mas se vendi en monto en el ao de 1994.
18. Quien es el empleado que quedo ultimo en ventas (considere montos) en el ao
de 1994.
19. Que empleado vendi mas productos de la categora Bebidas (en monto).
20. Quien fue el cliente que mas compro productos de la categora Condimentos.
Ing. Segundo Jos Castillo Zumarn 30

Manual de SQL Server 2000 Consultas.- SELECT

21. Listado de empleados y el monto acumulado de todos los pedidos atendidos.
22. Listado de clientes y el monto acumulado de todos los pedidos registrados para
ellos.
23. Cual fue el producto que mas se vendi en monto (cantidad de dinero).
24. Cual fue el producto que tuvo menos ventas en unidades.
25. Listado de los productos mas vendidos y el monto que ha generado.
26. Listado de los 5 empleados que han registrado mas pedidos y los 5 empleados
que han registrado menos pedidos (Ranking de empleados Los 5 primeros y los
5 ltimos).
27. La Empresa necesita premiar a sus dos mejores empleados en atencin de
pedidos. El criterio que se tomara es en base al monto acumulado de pedidos en
la que ha participado. Para ello recurre a Ud. Para que le proporcione informacin
de los empleados y sus montos acumulados de pedidos en el ao de 1995.
Codigo Empleado, Nombre Completo del Empleado, Monto Total Pedidos
28. La Empresa necesita premiar a sus dos mejores empleados en atencin de
pedidos. El criterio que se tomara es en base al numero total de pedidos
atendidos. Para ello recurre a Ud. Para que le proporcione informacin de los
empleados y la cantidad de pedidos en el ao de 1995.
Codigo Empleado, Nombre Completo del Empleado, Total de Pedidos
29. Listar los 5 productos que han generado mayores ingresos para la empresa en el
ao de 1995.
Nombre Producto, Monto de Venta 1995
30. Listar los 5 productos que han generado menores ingresos para la empresa en el
ao de 1995.
Nombre Producto, Monto de Venta 1995
31. Se necesita premiar a los mejores clientes. Para ello el gerente de ventas recurre
a usted para solicitarle informacin de los 5 mejores clientes que se ha tenido en
el Tercer Trimestre del ao de 1995. El criterio que se tomara es el cliente que ha
generado mayores compras en ese ao.
Codigo, Razon Social, Monto Registrado
32. La Empresa necesita comparar el monto total de pedidos registrados en el rimer
semestre de los aos de 1995 y 1996.
Mes, Monto registrado 1995, Monto registrado 1996
33. Elaborar un reporte en la que por cada empleado se liste el monto acumulado por
participacin en pedidos y la cantidad de pedidos registrados en el ao de 1995.
Ing. Segundo Jos Castillo Zumarn 31

Manual de SQL Server 2000 Consultas.- SELECT

Empleado, Monto Total Participacin, Total Pedidos
34. Listar los productos cuyo stock estn por debajo del stock mnimo.
35. Listar los empleados que son jefes y las cantidades de empleados que tienen a su
cargo.
36. Listar la relacin de todos los empleados y el empleado jefe a quien responde.
37. Se necesita premiar a los dos primeros empleados que vendieron mas en el
primer trimestre del ao de 1995 de la categora Bebidas.
38. Se desea premiar a los vendedores cuyo monto total de pedidos registrados en el
ao de 1996 en el 4to trimestre hayan superado el monto total de pedidos del
ao de 1995 en ese Trimestre.
Nombre Empleado, Monto 4to Trimestre 1996, Monto 4to Trimestre 1995
39. Quien es el cliente que tiene el mayor monto de compra de productos que
pertenece a la categora Lcteos.
40. Listado de categoras por montos generados en los aos 1994, 1995, 1996.
Categora, Monto registrado 1994, Monto registrado 1995, Monto registrado 1996
41. Listar todos los empleados cuyo monto de ventas en el mes de agosto de 1996
hayan superado las ventas del mes anterior.
Empleado, Monto Agosto 1996, Monto Julio 1996
42. Listar todos los empleados que hayan superado los 10 pedidos en el primer
trimestre del ao de 1996.
43. Mostrar a travs de un cuadro de doble entrada a todos los clientes que
pertenecen al pas de Alemania y Brasil, los montos registrados en los aos de
1996 y 1997, solo que hayan sido atendidos por el empleado cuyo apellido es
Davolio.
Cliente, Pas, Monto Registrado 1995, Monto Registrado 1996

Ing. Segundo Jos Castillo Zumarn 32

Manual de SQL Server 2000

Ing. Segundo Jos Castillo Zumarn

Consultas.- SELECT
33
Bibliografa:
Delaney, Kalen A fondo Microsoft SQL Server 2000
McGraw-Hill. 1era edicin. Espaa 2001. 904 pp.
Microsoft MOC 2073A. Programming a Microsoft SQL Server 2000 Database
Microsoft. EEUU 2000. 460 pp.
Microsoft I mplementing a Database on Microsoft SQL Server 7.0
Microsoft. EEUU 1999. 594 pp.
Libros en Pantalla de SQL Server 2000 (actualizada al 2004)
http://www.microsoft.com/downloads/details.aspx?FamilyId=A6F79CB 1-A420-445F-8A4B D77A7DA194B&displaylang=es


Consultas.- SELECT
34
BASE DE DATOS NEPTUNO
Manual de SQL Server 2000

Ing. Segundo Jos Castillo Zumarn

Manual de SQL Server 2000 Consultas.- SELECT


Ing. Segundo Jos Castillo Zumarn 35

You might also like