Documentos de Académico
Documentos de Profesional
Documentos de Cultura
DML Consultas PDF
DML Consultas PDF
- SELECT
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.
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.
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.
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.
= igual que
<> distinto de
< menor que
<= menor o igual
> mayor que
>= mayor o igual
Una condicin de seleccin puede dar como resultado el valor verdadero TRUE, falso
FALSE o nulo NULL.
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
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.
A continuacin veremos las clusulas que nos permiten indicar qu filas queremos
visualizar.
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
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.
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.
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)
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:
Resultado
TotalProductos
--------------
69
(1 filas afectadas)
Realiza una media aritmtica de los atributos para todas las filas accedidas mediante
una consulta SQL.
Ejemplo 14
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.
Resultado
Mas Caro
---------------------
263.5000
(1 filas afectadas)
Funcion MIN.
Obtiene el mnimo valor del atributo especificado de entre todas las filas
seleccionadas mediante una consulta SQL.
Resultado
Mas Barato
---------------------
2.5000
(1 filas afectadas)
Para Cimentar esta parte basica de consultas presentamos una serie de Consultas
sencillas a una Tabla.
1. Lista de Empleados
SELECT lista_columna
FROM tabla1 Tipo_join JOIN tabla2 ON condicin_del_join
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.
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.
comp representa cualquier operador de comparacin ( =, <, >, <=, >=, o <> ) y
se utiliza para establecer la condicin de emparejamiento.
En este caso hay que sustituir en la sintaxis una tabla por un INNER JOIN
completo.
Departamento (5 Filas) Empleado (8 Filas)
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
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
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)
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
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
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.
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) Empleado (8 Filas)
o
SELECT e.id_emp, e.paterno, d.jefe
FROM empleado e , departamento d
Ms Ejemplos
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
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
13. Ver todos los pedidos realizados los das lunes o viernes que demoraron una
semana en ser despachados.
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'
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
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.
Sentencia_select
UNION [ALL]
Sentencia_select
UNION [ALL]
Sentencia_select,
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.
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:
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.
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.
Si una consulta no requiere de mltiples pasos, puede no ser necesario usar una
subconsulta.
Uso de subconsultas
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.
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
SELECT idProducto,NombreProducto,precioUnidad
FROM Productos
WHERE suspendido=0 AND precioUnidad>(SELECT AVG(precioUnidad) from Productos WHERE
suspendido=0)
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)
Subconsultas Correlacionadas
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
Genera una lista de clientes que han registrado pedidos en el mes de julio de 1995
Observacin:
Los dos ejemplos anteriores pueden replantearse como JOINS. En general, se
recomienda el uso de JOINS antes que el de subconsultas correlacionadas.
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.
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 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.
La consulta
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
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
Ejemplo:
SELECT AVG(SUM(ventas))
FROM ...
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.
SELECT idpedido,fechapedido,cargo
FROM pedidos
WHERE YEAR(fechapedido)=1995 AND MONTH(fechapedido)=1 AND DAY(fechapedido) BETWEEN 1 AND 15
ORDER BY 2
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:
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.
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
Valores constantes
Funciones de columna
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.
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.
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.
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).
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).
29. Listar los 5 productos que han generado mayores ingresos para la empresa en el
ao de 1995.
30. Listar los 5 productos que han generado menores ingresos para la empresa en el
ao de 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.
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.
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.
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.
Bibliografa: