Sunteți pe pagina 1din 23

Bases de Datos I

UNIDAD V: LENGUAJES RELACIONALES – PARTE I

INTRODUCCION A SQL
Comenzaremos el estudio de consultas simples a una Base de Datos, en estas
consultas participará solamente una tabla.
Para la realización de consultas se utiliza la sentencia SELECT, la cual recupera
datos de una BD y los devuelve en forma de resultados de la consulta.
Para consultas sencillas, la petición en lenguaje inglés y la sentencia SELECT son
muy similares.
La sentencia SELECT tiene el siguiente formato:

SELECT ítem-seleccionado

ALL ,
DISTINCT *

FROM especificación de tabla


,

WHERE condición de búsqueda

GROUP BY columna de agrupación


,

HAVING condición de búsqueda

ORDER BY especificación de ordenación


,

Como se puede apreciar la sentencia SELECT consiste de seis cláusulas. Las


cláusulas SELECT y FROM necesarias, las otras cuatro son opcionales. Aunque
lo veremos después con más detenimiento resumiremos el uso de cada una de las
cláusulas:
 La cláusula SELECT lista los datos a recuperar por la sentencia. Los ítems
pueden ser columnas de la BD o columnas a calcular por SQL.
 La cláusula FROM lista las tablas que contienen los datos a recuperar la
consulta.
 La cláusula WHERE dice a SQL que incluya sólo ciertas filas de datos en los
resultados de la consulta, precisamente los que satisfacen la condición de
búsqueda que se especifica.

Recopilado por: Ing. Claudia L. Benavidez Rugama 1


Bases de Datos I

 La cláusula GROUP BY especifica una consulta resumen. Agrupa todas las


filas similares y produce una fila resumen.
 La cláusula HAVING dice a SQL que incluya sólo ciertos grupos producidos
por la cláusula GROUP BY.
 La cláusula ORDER BY ordena los resultados de las consultas sobre la base
de los datos de una o más columnas.

Cláusula SELECT
La cláusula SELECT que empieza cada sentencia SELECT especifica los ítems de
datos a recuperar por la consulta. Un ítem puede ser:
- Un nombre de columna, identificando una columna de la tabla designada en la
cláusula FROM. Cuando un nombre de columna aparece en el SELECT, SQL
simplemente toma el valor de esa columna de cada fila de la tabla de la BD.
- Una constante, especificando que el mismo valor constante va a aparecer en
todas las filas de los resultados de la consulta.
- Una expresión SQL, indicado que SQL debe calcular el valor a colocar en los
resultados.
Cláusula FROM
Especifica las tablas que intervienen en la consulta. Estas tablas se llaman tablas
fuentes. Todas las consultas que veremos en esta clase tienen una única tabla
fuente.
Resultados de consultas
El resultado de una consulta SQL es siempre una tabla de datos, semejante a
cualquier otra tabla. Si se trabaja con SQL interactivo será una tabla que se
muestra en la pantalla, si se trabaja desde un programa será una tabla que de
alguna manera ese programa deberá manipular. Las columnas de la tabla
corresponden a los items de la cláusula SELECT.
Es importante destacar que aún cuando la consulta devuelva un valor, este
considera una tabla de una fila y una columna.
Consultas Sencillas
Las consultas más sencillas solicitan columnas de datos de una única tabla en la
BD. Generalmente la sentencia SELECT incluye sólo las cláusulas SELECT y
FROM y conceptualmente SQL procesa la consulta recorriendo la tabla nominada
en la cláusula FROM, una fila cada vez. Por cada fila, SQL toma los valores de las
columnas solicitadas en la lista de selección y produce una única fila de
resultados. Los resultados contienen por tanto una fila de datos por cada fila de la
tabla.

Recopilado por: Ing. Claudia L. Benavidez Rugama 2


Bases de Datos I

Ejemplo:
Listar la ciudad, región e importe de ventas de cada oficina
SELECT ciudad, región, ventas
FROM oficinas

Además de las columnas cuyos valores provienen directamente de la BD una


consulta SQL puede incluir columnas calculadas cuyos valores se calculan a
partir de los valores de los datos almacenados. Para solicitar una columna
calculada se especifica una expresión en la lista de selección.
Ejemplo
Listar la ciudad, la región y el importe por encima o por debajo del objetivo
para cada oficina.
SELECT ciudad, region, ventas-objetivo
FROM oficinas

(Lo que se ha señalado en negritas constituye la columna calculada.)

Listar el valor del inventario para cada producto.


SELECT id_fab, id_producto, descripcion, precio*existencias
FROM productos

Listar las ventas de cada oficina


SELECT oficina, „tiene ventas de „, ventas
FROM oficinas

(Los resultados de la consulta parecen consistir en una “frase” distinta por cada
oficina, pero realmente es una tabla de 3 columnas. La segunda columna contiene
la misma cadena de texto para cada una de las filas.)

Selección de todas las columnas (SELECT *)

A veces es conveniente visualizar el contenido de todas las columnas de una


tabla. SQL permite utilizar un * en lugar de la lista de selección como abreviatura
de “todas las columnas”.

Mostrar todos los datos de la tabla OFICINAS

SELECT *
FROM oficinas

Recopilado por: Ing. Claudia L. Benavidez Rugama 3


Bases de Datos I

Como se mostró en el diagrama sintáctico SQL estándar prohíbe el uso de * junto


a una lista de ítems. Hay dialectos (como SQL Server) que si lo permite y por lo
tanto pudiera escribirse la siguiente consulta:
SELECT *, ventas-objetivo
FROM oficinas

Filas duplicadas (DISTINCT)


Si una consulta incluye la clave primaria de una tabla en su lista de selección
entonces cada fila de resultados será única. Si no se incluye la clave primaria en
los resultados pueden producirse filas duplicadas.

Por ejemplo:
Listar los números de empleados de todos los directores de oficina:

SELECT dir
FROM oficinas

Si un director dirige más de una oficina su número saldría tantas veces como
oficina dirija.

Para evitar esta repetición se inserta la palabra clave DISTINCT en la cláusula


SELECT justo antes de la lista de selección

En nuestro caso queda la consulta de la siguiente manera:

SELECT DISTINCT dir


FROM oficinas

SQL efectúa esta consulta generando primero un conjunto completo de resultados


y eliminando luego las filas que son duplicados exactos de alguna otra para formar
los resultados finales.

Si no se especifica la palabra clave DISTINCT, SQL no elimina las filas


duplicadas. También se puede especificar la palabra ALL para indicar
explícitamente que las filas duplicadas sean incluidas, pero es innecesario, ya que
este es el comportamiento por omisión.

Observar que hasta este momento todas las operaciones que hemos realizado
sobre las tablas corresponden a la operación de proyección del álgebra relacional.

Selección de filas (cláusula WHERE)

Las consultas SQL que recuperan todas las filas de una tabla no son frecuentes
en las aplicaciones. Generalmente se desea seleccionar parte de las filas de una
tabla.

Recopilado por: Ing. Claudia L. Benavidez Rugama 4


Bases de Datos I

La cláusula WHERE se emplea para especificar las filas que se desean recuperar.
Esta cláusula consta de la palabra clave WHERE seguida de una condición de
búsqueda que especifica las filas a recuperar. Dicha condición en general es una
expresión lógica

Ejemplos:
Muestra todas las oficinas en donde las ventas excedan al objetivo.

SELECT ciudad, ventas, objetivo


FROM oficinas
WHERE ventas > objetivo

Muestra el nombre, las ventas y la cuota del empleado número 105.

SELECT nombre, ventas, cuota


FROM vendedores
WHERE num_empl=105

SQL recorre cada fila de la tabla, una a una, y aplica la condición. Se pueden
producir tres casos:
- Si la condición de búsqueda es TRUE (cierta), la fila en cuestión se incluye en
los resultados de la consulta.
- Si la condición de búsqueda es FALSE (falsa), la fila se excluye de los
resultados de la consulta.
- Si la condición de búsqueda tiene un valor NULL (desconocido), la fila se
excluye de los resultados de la consulta.

La condición de búsqueda actúa como un filtro para la tabla en cuestión. La


cláusula WHERE añade la operación de selección del álgebra relacional.

Condiciones de búsqueda
SQL ofrece un conjunto de condiciones de búsqueda. Se pueden agrupar en cinco
grupos (llamados predicados en el estándar).

a) Test de comparación

Es la búsqueda más utilizada, cuando se comparan los valores de dos


expresiones. Se pueden utilizar los operadores <, <=, >, >=, =, <>

Los ejemplos que vimos anteriormente son un ejemplo de este test.

En el caso que alguna de las dos expresiones sea NULL la comparación


genera un valor NULL. Observe que si es la única expresión en la cláusula
WHERE esa fila no se incluirá en el resultado.

Recopilado por: Ing. Claudia L. Benavidez Rugama 5


Bases de Datos I

b) Test de Rango

Comprueba si un valor de dato se encuentra entre dos valores especificados. Su


diagrama sintáctico es el siguiente:

expresión de test BETWEEN exp-inf. AND exp-sup

NOT

La primera expresión define el valor a comprobar, las expresiones segunda y


tercera definen los extremos inferior y superior del rango a comprobar. Los tipos
de datos de las tres expresiones deben ser comparables.

Ejemplo:

Listar los pedidos que se hayan hecho entre el 01-Oct-89 y en 31-Dic-89.

SELECT num_pedido, fecha_pedido, fab, producto, importe


FROM pedidos
WHERE fecha_pedido BETWEEN ‟01-10-89‟ AND ‟31-12-89‟

El test incluye los puntos extremos del rango, por lo que los pedidos remitidos el 1
de octubre o el 31 de diciembre se incluirán en los resultados de la consulta.

Listar los pedidos cuyo importe esté entre 20000 y 30000

SELECT num_pedido, importe


FROM pedidos
WHERE importe BETWEEN 20000 AND 30000

Listar los vendedores cuyas ventas no están entre el 80 y el 120 por ciento
de su cuota.

SELECT nombre, ventas, cuota


FROM vendedores
WHERE ventas NOT BETWEEN (0.8*cuota) AND (1.2*cuota)

Las expresiones especificadas en el test de rango pueden ser cualquier expresión


SQL válida. Se imponen las siguientes reglas para el manejo de los valores nulos.

- Si la expresión de test produce un valor NULL, o si ambas expresiones del


rango producen valores NULL, el test BETWEEN devuelve un resultado NULL.
- Si la expresión que define el extremo inferior del rango produce un valor NULL,
el test BETWEEN devuelve FALSE si el valor de test es superior al límite
superior, y NULL en caso contrario.

Recopilado por: Ing. Claudia L. Benavidez Rugama 6


Bases de Datos I

- Si la expresión que define el extremo superior del rango produce un valor


NULL, el test BETWEEN devuelve FALSE si el valor de test es menor que el
límite inferior, y NULL en caso contrario.

c)Test de pertenencia a conjunto

Una prueba típica de consultas es determinar si un valor de dato coincide con uno
de una lista de valores objetivo. A este tipo de test se le llama test de pertenencia
a conjunto y su diagrama sintáctico se puede ver a continuación:

expresión de test IN ( constante )


NOT ,

Ejemplos:

Listar los vendedores que trabajan en las oficinas 11, 13 y 22.

SELECT nombre, cuota, ventas


FROM vendedores
WHERE oficina_vend IN (11, 13, 22)

Listar todos los pedidos remitidos un jueves en enero de 1990

SELECT num_pedido, fecha_pedido, importe


FROM pedidos
WHERE fecha_pedido IN (‟04-01-90‟, ‟11-01-99‟, ‟18-01-99‟, ‟25-01-
99‟)

La expresión del test puede ser una expresión cualquiera. Todos los elementos de
la lista deben tener el mismo tipo de datos, y este debe coincidir con el tipo de la
expresión.

Si la expresión produce NULL, el test devuelve NULL.

Test de correspondencia con patrón

El test de correspondencia con patrón es utilizado para recuperar datos sobre la


base de una correspondencia parcial con los valores almacenados en la BD. Su
diagrama sintáctico se muestra a continuación:

Recopilado por: Ing. Claudia L. Benavidez Rugama 7


Bases de Datos I

nombre de columna LIKE patrón


NOT ESCAPE carácter escape

El test de correspondencia con patrón comprueba si el valor de dato de una


columna se ajusta a un patrón especificado. El patrón es una cadena que puede
incluir uno o más caracteres comodines. Estos caracteres se interpretan de una
manera especial.

Caracteres comodines:

% - Se interpreta como una secuencia de cero o más caracteres.


(Equivalente al * del MS-DOS)
_ - Se interpreta como un carácter. (Equivalente al ? de MS-DOS)

Ejemplos:

SELECT empresa, lim_credito


FROM clientes
WHERE empresa LIKE „Smith% Corp.‟

Se busca en la tabla clientes aquellos cuyo nombre comience por Smith,


luego tengan una secuencia de caracteres y terminen en Corp.

SELECT empresa, lim_credito


FROM clientes
WHERE empresa LIKE „Smiths_n Corp.‟

Esta consulta busca en la tabla clientes aquellos cuyos nombres comienzan con
Smiths, tiene un carácter luego y después n Corp.

El test LIKE debe aplicarse a columnas con tipo de dato cadenas. Si el valor de
dato en la columna es NULL, el test devuelve el valor NULL.

La cláusula ESCAPE se utiliza cuando se quiere utilizar uno de los comodines en


el marco de la cadena que se quiere comparar. Por ejemplo si se quiere encontrar
los productos cuyos identificadores comiencen con „A%BC‟. Si escribimos LIKE
„A%BC‟, el % se interpretara como un comodín. Se utiliza entonces un carácter
llamado escape, cuando el se encuentra en la cadena el carácter que le sigue no
se trata como comodín.
Nuestro ejemplo quedaría:
SELECT num_pedido, producto
FROM pedidos
WHERE producto LIKE „A$%BC%‟ ESCAPE „$‟

Recopilado por: Ing. Claudia L. Benavidez Rugama 8


Bases de Datos I

El primer signo de por ciento en el patrón, que sigue al carácter de escape, es


tratado como un literal no como un comodín, el segundo, sin embargo, funciona
como comodín.

Observar que el carácter de escape se puede elegir en cada instrucción de forma


distinta.

Test de valor nulo

A veces es útil comprobar explícitamente los valores nulos en una condición de


búsqueda y gestionarlos directamente. SQL proporciona un test especial de valor
nulo (NULL), cuyo diagrama sintáctico se muestra a continuación.

nombre de columna IS NULL

NOT

Hallar el vendedor que aún no tiene asignada una oficina

SELECT nombres
FROM vededores
WHERE oficina_vend IS NULL

A diferencia de otros test este nunca producirá un valor NULL.

Condiciones de búsqueda compuestas (and, or y not)

Las condiciones de búsqueda simples, descritas anteriormente devuelven un valor


TRUE, FALSE o NULL cuando se aplican a una fila de datos. Utilizando las reglas
de la lógica se pueden combinar estas condiciones de búsquedas simples para
formar otras más complejas. El diagrama sintáctico se muestra a continuación

WHERE condición de búsqueda


NO
T
AND

OR
Ejemplo:
Hallar los vendedores que están por debajo de la cuota o con ventas
inferiores a 30000.

SELECT nombre, cuota, ventas


FROM vendedores
WHERE (ventas < cuota) OR (ventas < 30000)

Recopilado por: Ing. Claudia L. Benavidez Rugama 9


Bases de Datos I

Los paréntesis en este caso son opcionales, solo se han puesto para claridad de
la expresión.

El estándar especifica que estos operadores tienen la siguiente prioridad: NOT,


AND y OR.

Las tablas de verdad, incluyendo los valores nulos, se muestran en las siguientes
tablas:

NOT
TRUE FALSE
FALSE TRUE
NULL NULL

AND TRUE FALSE NULL


TRUE TRUE FALSE NULL
FALSE FALSE FALSE NULL
NULL NULL NULL NULL

OR TRUE FALSE NULL


TRUE TRUE TRUE TRUE
FALSE TRUE FALSE NULL
NULL TRUE NULL NULL

Las posiciones que están en negritas serían las operaciones donde participan
valores nulos.

Ordenación de los resultados de una consulta

Al igual que las filas de una tabla en la BD, las filas de los resultados de una
consulta no están dispuestos en ningún orden particular. Se puede pedir a SQL
que ordene los resultados de una consulta incluyendo la cláusula ORDER BY en
la sentencia SELECT.

La cláusula ORDER BY posee la siguiente sintaxis:


Observar que en el ordenamiento solamente se pueden especificar las columnas
de la cláusula SELECT.

ORDER BY nombre de columna

número de columna ASC

DESC
,

Recopilado por: Ing. Claudia L. Benavidez Rugama 10


Bases de Datos I

Mostrar las ventas de cada oficina, ordenadas en orden alfabético por


ciudad.

SELECT ciudad, ventas


FROM oficinas
ORDER BY ciudad

Como se observa en la sintaxis en un mismo ORDER BY pueden haber varios


criterios de ordenamiento.

Mostrar las ventas de cada oficina, ordenadas en orden alfabético por región
y dentro de cada región por ciudad.

SELECT ciudad, región, ventas


FROM oficinas
ORDER BY región, ciudad

Utilizando la cláusula ORDER BY se puede solicitar la ordenación en secuencia


ascendente o descendente, y se puede ordenar con respecto a cualquier elemento
en la lista de selección de la consulta.

Por omisión, SQL ordena los datos en secuencia ascendente. Para solicitar en
secuencia descendente, se incluye la palabra clave DESC en la especificación de
ordenación, como en el siguiente ejemplo:

Listar las oficinas, clasificadas en orden descendente de ventas, de modo


que las oficinas con mayores ventas aparezcan en primer lugar.

SELECT ciudad, region, ventas


FROM oficinas
ORDER BY ventas DESC

Se puede utilizar la palabra clave ASC para especificar el orden ascendente, pero
puesto que este es el orden por omisión, la palabra clave se suele omitir.

Si la columna de resultados de la consulta utilizada para ordenar es una columna


calculada, entonces se utiliza en lugar de un nombre el número que ocupa dentro
de la cláusula SELECT.

Recopilado por: Ing. Claudia L. Benavidez Rugama 11


Bases de Datos I

Ejemplo:

Listar las oficinas, clasificadas en orden descendente de rendimiento de


ventas, el rendimiento de ventas es las ventas menos el objetivo.

SELECT ciudad, región, (ventas-objetivo)


FROM oficinas
ORDER BY 3 DESC

Observar que los resultados estarán ordenados por la tercera columna, que es
una columna calculada.

Resumen parcial del modo de realizar una consulta:

1. Comenzar con la tabla designada en la cláusula FROM.


2. Si hay cláusula WHERE, aplicar su condición de búsqueda a cada fila de la
tabla, reteniendo aquellas filas para las cuales la condición de búsqueda es
TRUE, y descartando aquellas para las cuales es FALSE o NULL.
3. Para cada fila retenida, calcular el valor de cada elemento en la lista de
selección para producir una única fila de resultados.
4. Si se especifica SELECT DISTINCT, eliminar las filas duplicadas de los
resultados que se hubieran producido.
5. Si hay una cláusula ORDER BY, ordenar los resultados de la consulta según
se especifiquen.

Combinación de los resultados de una consulta

Ocasionalmente, es conveniente combinar los resultados de dos o más consultas


en una única tabla de resultados totales. SQL permite esta capacidad gracias a la
característica UNION.

UNION es un operador que toma el resultado de dos consultas y los une en un


único resultado (actúa de forma similar a la unión entre conjuntos).

Ejemplo:

Listar todos los productos en donde el precio del producto exceda de 2000 ó
donde más de 30000 del producto hayan sido incluidos en un solo pedido.
Dividiremos esta consulta en dos partes:

Listar todo los productos cuyo precio exceda de 2000.

SELECT id_fab, id_producto


FROM productos
WHERE precio > 2000

Recopilado por: Ing. Claudia L. Benavidez Rugama 12


Bases de Datos I

Listar los productos para los cuales más de 30000 del producto hayan sido
incluidos en un solo pedido.

SELECT DISTINCT fab, producto


FROM pedido
WHERE importe > 30000

Como queremos los productos que satisfacen estos dos requerimientos,


debemos tomar los resultados de las dos consultas:

SELECT id_fab, id_producto


FROM productos
WHERE precio > 2000
UNION
SELECT DISTINCT fab, producto
FROM pedido
WHERE importe > 30000

Hay varias restricciones sobre las tablas que pueden combinarse con una
operación UNION:
a) Ambas tablas deben contener el mismo número de columnas.
b) El tipo de datos de cada columna en la primera tabla debe ser el mismo
que el tipo de datos de la columna correspondiente en la segunda tabla.
c) Ninguna de las dos tablas puede estar ordenada con la cláusula ORDER
BY. Sin embargo, los resultados combinados pueden ser ordenados,
según se describe después.

Ya que la operación UNION combina filas de dos conjuntos de resultados, pudiera


suceder que los resultados tuvieran filas iguales. (Un caso es el ejemplo anterior,
ver los resultados). Por omisión, la operación UNION elimina las filas duplicadas
como parte de su procesamiento. Si se desea obtener las filas duplicadas en una
operación UNION, se puede especificar la palabra clave ALL inmediatamente de la
palabra UNION.

La cláusula ORDER BY no puede ser especificada en ninguna de las dos


sentencias SELECT que combina una UNION. Sin embargo el conjunto
combinado de resultados de la consulta producidos por la operación UNION puede
ser ordenado especificando una cláusula ORDER BY después de la segunda
sentencia SELECT. Ya que las columnas producidas por la operación UNION no
tienen nombres, la cláusula ORDER BY debe especificar las columnas por
número.

Listar todos los productos en donde el precio del producto exceda de 2000 ó
donde más de 30000 del producto hayan sido incluidos en un solo pedido,
clasificados por fabricante y el identificador del producto..

Recopilado por: Ing. Claudia L. Benavidez Rugama 13


Bases de Datos I

SELECT id_fab, id_producto


FROM productos
WHERE precio > 2000
UNION
SELECT DISTINCT fab, producto
FROM pedido
WHERE importe > 30000
ORDER BY 1,2

La operación UNION puede ser utilizada repetidamente para combinar tres o más
conjuntos de resultados, tal como se muestra en la figura siguiente:
Tabla a
Bill Resultados
Tabla b
Mary Bill
Bill
George Mary
Sue
Fred George
Julia UNION
Fred
Harry
Bill Sue
UNION
Tabla c Sue Julia
Mary Julia Harry
George Harry
Bill Mary
Harry George

La consulta se escribiría de la siguiente forma:

SELECT *
FROM a
UNION ( SELECT *
FROM b
UNION
SELECT *
FROM c )

Los paréntesis indican el orden en que deben ser realizadas las uniones. En este
caso como todas las uniones eliminan duplicados no importa el orden. Hay que
tener mucho cuidado con el orden cuando una de las operaciones UNION tiene el
ALL.

Recopilado por: Ing. Claudia L. Benavidez Rugama 14


Bases de Datos I

Funciones de Columna

SQL permite resumir datos de la BD mediante un conjunto de funciones de


columnas. Una función de columna acepta una columna entera de datos como
argumento y produce un único dato que resume la columna. Por ejemplo, la
función AVG( ) acepta una columnas de datos y calcula su promedio.

¿Cuál es la cuota promedio y las ventas promedio de los vendedores?

SELECT AVG(cuota), AVG(ventas)


FROM vendedores

SQL ofrece seis funciones de columna diferentes, tal como se muestra en el


siguiente diagrama sintáctico. Las funciones de columna ofrecen estos valores:

- SUM ( ) calcula la suma total de una columna.


- AVG( ) calcula el valor promedio de una columna.
- MAX( ) calcula el valor más grande de la columna.
- MIN( ) calcula el valor más pequeño de la columna.
- COUNT( ) cuenta el número de valores de una columna.
- COUNT(*) cuenta las filas de una consulta.

SUM ( expresión )
DISTINCT nombre columna

AVG ( expresión )
DISTINCT nombre columna

MIN ( expresión )

MAX ( expresión )

COUNT ( nombre de columna )


DISTINCT
COUNT ( * )

El argumento de una función columna, como se pude apreciar en el diagrama


sintáctico puede ser una expresión SQL.

Recopilado por: Ing. Claudia L. Benavidez Rugama 15


Bases de Datos I

¿Cuál es el promedio del por ciento de cumplimiento de los vendedores?

SELECT AVG(100*(ventas/cuota))
FROM vendedores

Para procesar esta consulta SQL construye una columna temporal que contiene el
valor de la expresión por cada fila de la tabla, luego calcula el promedio de la
columna temporal.
Ejemplos:

¿Cuáles son las cuotas y ventas totales para todos los vendedores?

SELECT SUM(cuota), SUM(ventas)


FROM vendedores

¿Cuál es el precio promedio de los productos del fabricante ACI?

SELECT AVG(precio)
FROM productos
WHERE id_fab=´ACI´

¿Cuáles son las cuotas mínima y máxima asignadas a los vendedores?

SELECT MIN(cuota), MAX(cuota)


FROM vendedores

¿Cuántos vendedores superan su cuota?

SELECT COUNT(nombre)
FROM vendedores
WHERE ventas>cuotas

SELECT COUNT(*)
FROM vendedores
WHERE ventas>cuotas

Con la segunda consulta se cuentan filas en lugar de nombres como en la primera,


lo que parece más natural.

Valores nulos y funciones de columna

En las funciones de columna SUM( ), AVG( ), MIN( ), MAX( ) y COUNT( ) los


valores nulos son ignorados.

Recopilado por: Ing. Claudia L. Benavidez Rugama 16


Bases de Datos I

La siguiente consulta:

SELECT COUNT(*), COUNT(ventas), COUNT(cuota)


FROM vendedores

arrojará los valores 10, 10 y 9, porque hay un vendedor con cuota nula.

Ignorar los nulos tiene poca importancia en las funciones MAX y MIN, pero puede
producir algunas sutilezas en las funciones SUM y AVG. Por ejemplo la consulta:

SELECT SUM(ventas)-SUM(cuota), SUM(ventas-cuota)


FROM vendedores

Parece que debe dar dos valores similares, sin embargo en nuestro ejemplo
produce resultados diferentes pues hay un vendedor que tiene un valor nulo en su
cuota, por lo tanto es ignorado en SUM(cuota) y en SUM(ventas-cuota), no así el
valor correspondiente de sus ventas que no es nulo.

Eliminación de filas duplicadas

Al igual que se eliminaban las filas duplicadas en una consulta se pueden eliminar
los valores duplicados de una columna antes de aplicarle una función de columna.
Para ello se utiliza la palabra clave DISTINCT en el argumento de la función como
se indica en el diagrama sintáctico.

¿Cuántos títulos diferentes tienen los vendedores?

SELECT COUNT(DISTINCT titulo)


FROM vendedores

Ejercicios:
Desarrollar las siguientes consultas haciendo uso de las clausulas
estudiadas de SQL Server y entregarlo en un reporte.

1. Listar las oficinas de ventas con sus objetivos y ventas reales.


2. Listar las oficinas de ventas de la región Este con sus objetivos y ventas.
3. Listar las oficinas de ventas de la región Este cuyas ventas exceden a sus
objetivos.
4. Listar los nombres, oficinas y fechas de contrato de todos los vendedores.
5. ¿Cuál es el nombre, cuota y ventas del empleado número 107?
6. Listar el nombre y fecha de contrato de cualquier vendedor cuyas ventas
sean superiores a 500 000.
7. Listar todos los nombres de los vendedores, sus cuotas y directores.
8. Mostrar que sucederá si se eleva la cuota de cada vendedor en un 3% de
sus ventas anuales
9. Muestra los empleados dirigidos por Bob Smith (empleado 104).
10. Halla los vendedores contratados antes de 1988.

Recopilado por: Ing. Claudia L. Benavidez Rugama 17


Bases de Datos I

11. Listar las oficinas cuyas ventas están por debajo del 80% del objetivo.
12. ¿Cuál es el nombre y el límite de crédito del cliente número 2107?
13. Listar los pedidos cuyos importes están entre 30000 y 40000.
14. Listar los pedidos obtenidos por los vendedores 107, 109, 101 y 103.
15. Listar todos lo vendedores cuyos nombres comience con B.
16. Listar todos los productos del fabricante QSA cuyo identificador comience
por XK.
17. Listar los vendedores a los que se ha asignado oficina.
18. Hallar todos los vendedores que están pro debajo de la cuota, pero cuyas
ventas no son inferiores a 150000.
19. Listar los productos ordenados por su precio.
20. Listar los productos ordenador por su fabricante y dentro de estos por su
código.
21. Listar los vendedores en orden decreciente de su edad, dentro de la edad
ordenarlos por el nombre.
22. Listar los productos ordenados por el valor de su inventario.
23. Listar los vendedores que atienden a algún cliente o que han tomado algún
pedido.
24. ¿Cuál es el total de los pedidos aceptados por el vendedor 107?
25. ¿Cuál es la fecha de pedido más antigua en la base de datos?
26. ¿Cuál es el mejor promedio de ventas entre todos los vendedores?
27. ¿Cuántos clientes hay?
28. ¿Cuántos pedidos de más de 25000 hay en los registros?
29. ¿Cuántas oficinas de ventas tienen vendedores que superan sus cuotas?
30. ¿Cuál es el promedio de los objetivos de las oficinas del Este?
31. ¿Cuál es el límite de crédito más pequeño entre los clientes?
32. ¿Cuál es el total de ventas de los vendedores que son Dir Ventas?
33. ¿Cuántos vendedores han tomado algún pedido?

CONSULTAS AGRUPADAS

En muchas ocasiones necesitamos obtener consultas con subtotales, cada uno de


estos subtotales son grupos que formamos a partir de nuestra tabla.

En la clase anterior hicimos consultas como la siguiente:

¿Cuál es el importe medio de los pedidos?


SELECT AVG(importe)
FROM pedidos

Ahora supongamos que deseamos el importe medio de los pedidos aceptados por
cada uno de los vendedores.

Aquí tendríamos que agrupar la tabla pedidos según los vendedores que tomaron
los pedidos y sacar el promedio de cada uno de los grupos.

Recopilado por: Ing. Claudia L. Benavidez Rugama 18


Bases de Datos I

Para realizar tal consulta se utiliza la cláusula GROUP BY que según vimos en la
sintaxis general del SELECT tiene el siguiente diagrama sintáctico:

GROUP BY columna de agrupación


,

Para nuestro caso la consultaría quedaría:

SELECT vend, AVG(importe)


FROM pedidos
GROUP BY vend

Esta consulta se lleva a cabo de la siguiente manera:


1. SQL divide los pedidos en grupos de pedidos, un grupo para cada vendedor
como se especifica en la cláusula GROUP BY, todos los pedidos de un grupo
tienen el mismo valor en columna vend.
2. Por cada grupo, SQL calcula el valor promedio de la columna importe para
todas las filas del grupo y genera una única fila resumen de resultados. La fila
contiene el valor de la columna vend del grupo y el importe medio calculado.

Una consulta que contenga la cláusula GROUP BY se denomina consulta


agrupada. Las columnas indicadas en la cláusula se llaman columnas de
agrupación.

Ejemplos:
¿Cuál es el rango de cuotas asignadas a cada oficina?

SELECT oficina_vend, MIN(cuota), MAX(cuota)


FROM vendedores
GROUP BY oficina_vend

¿Cuántos vendedores están asignados a cada oficina?

SELECT oficina_vend, COUNT(*)


FROM vendedores
GROUP BY oficina_rep

Hay una estrecha conexión entre las funciones de columna de SQL y la cláusula
GROUP BY. Cuando esta cláusula está presente indica a SQL que debe agrupar
las filas y aplicar la función de columna separadamente a cada grupo, produciendo
un único resultado por el grupo.

Recopilado por: Ing. Claudia L. Benavidez Rugama 19


Bases de Datos I

Múltiples columnas de agrupación

Según se puede ver en la sintaxis, SQL puede agrupar las filas basándose en
contenidos de dos ó más columnas.

Calcula los pedidos totales por cada cliente y por cada vendedor.

SELECT vend, clie, SUM(importe)


FROM pedidos
GROUP BY vend, clie

La consulta produce una fila resumen separada por cada pareja vendedor / cliente.
Es imposible crear grupos y subgrupos con dos niveles de subtotales en SQL
estándar.

Es también imposible obtener resultados a la vez detallados y resumen en una


consulta simple. En algunos dialectos como SQL Server se suple esta limitación
del SQL añadiendo una cláusula COMPUTE al final de la sentencia SELECT, por
ejemplo:

Calcula los pedidos totales para cada cliente de cada vendedor, ordenados
por vendedor, y dentro de cada vendedor por cliente.

SELECT vend, clie, importe


FROM pedidos
ORDER BY vend, clie
COMPUTE SUM(importe) BY vend, clie
COMPUTE SUM(importe), AVG(importe) BY vend

Esta consulta produce una fila de resultados detallados por cada fila de la tabla
Pedidos, ordenados por clie dentro de vend. Además calcula la suma de los
pedidos por cada pareja cliente / vendedor (un subtotal de bajo nivel) y calcula la
suma de pedidos y el tamaño medio de pedido por cada vendedor (un subtotal de
alto nivel). Los resultados tienen por tanto una mezcla de filas de detalles y de filas
resumen, que incluyen tanto subtotales como totales.

Al final de estas notas se brindan los resultados parciales de esta consulta.


Esta cláusula COMPUTE no es estándar en lo absoluto y según muchos autores
viola los principios básicos de las consultas relacionales, pues el resultado no es
una tabla, sino una extraña combinación de diferentes tipos de filas. No obstante
puede ser útil en algunos casos.

Recopilado por: Ing. Claudia L. Benavidez Rugama 20


Bases de Datos I

Restricciones en consultas agrupadas


Las consultas agrupadas están sujetas a algunas limitaciones bastantes estrictas:

- Las columnas de agrupación deben ser columnas efectivas de las tablas


designadas en la cláusula FROM, no se pueden agrupar las filas basándose en
el valor de una expresión calculada.
- Los elementos de selección en una consulta agrupada pueden ser:
o Una constante.
o Una función de columna, que produce un único valor que resume las
filas del grupo.
o Una columna de agrupación, que por definición tiene el mismo valor en
todas las filas del grupo.
o Una expresión que afecte a combinaciones de los anteriores.

Valores NULOS en columnas de agrupación

Un valor NULL presenta un problema especial cuando aparece en una columna de


agrupación. Si el valor de la columna es desconocido, ¿en qué grupo debería
colocarse la fila?

El estándar de SQL considera que dos valores NULL son iguales a efectos de la
cláusula GROUP BY. Si dos filas tiene NULL en las mismas columnas de
agrupación y valores idénticos en las columnas de agrupación no NULL, se
agrupan dentro del mismo grupo de filas.

Veremos un ejemplo con una pequeña tabla de muestra:

Nombre Pelo Ojos


Rosa Castaño Azules
Luisa NULL Azules
Juan NULL Azules
Sandra NULL NULL
Juana NULL NULL
Jorge Castaño NULL
María Castaño NULL
Paula Castaño NULL
Carlos Castaño NULL
Yoel Castaño Negros
Susana Rubio Azules
Mariana Rubio Azules

SELECT pelo, ojos, COUNT(*)


FROM ejemplo
GROUP BY pelo, ojos

Recopilado por: Ing. Claudia L. Benavidez Rugama 21


Bases de Datos I

Se obtiene como resultado de esta consulta la siguiente tabla:

PELO OJOS COUNT(*)


-------- --------- --------------
Castaño Azules 1
NULL Azules 2
NULL NULL 2
Castaño NULL 4
Castaño Negros 1
Rubio Azules 2

Observar el comportamiento del NULL con los diferentes valores y los grupos que
se forman. Es importante que en los dialectos no siempre se siguen las mismas
reglas (aunque éstas que hemos especificado son las del estándar), por lo que es
importante con ejemplos pequeños probar antes de decidir hacer aplicaciones
importantes.

Condiciones de búsqueda de grupos

Al igual que la cláusula WHERE puede ser utilizada para seleccionar y rechazar
filas individuales que participan en una consulta, la cláusula HAVING puede ser
utilizada para seleccionar y rechazar grupos de filas.

El formato de HAVING es similar al de WHERE, lo único que la condición de


búsqueda funciona para los grupos.

Ejemplo:

¿Cuál es el tamaño de pedido promedio para cada vendedor cuyos pedidos


totalizan más de 30000?

SELECT vend, AVG(importe)


FROM pedidos
GROUP BY vend
HAVING SUM(importe) > 30000

Aquí la cláusula GROUP BY dispone de los pedidos en grupos por cada vendedor.
Entonces la cláusula HAVING toma solamente los grupos en donde el total de los
pedidos exceden de 30000, finalmente la cláusula SELCT calcule el tamaño de
pedido medio para cada uno de los grupos que quedó y genera los resultados de
la consulta.

Las condiciones de búsqueda de la cláusula HAVING son las mismas que las
estudiadas para la cláusula WHERE.

Recopilado por: Ing. Claudia L. Benavidez Rugama 22


Bases de Datos I

Para cada oficina con dos o más vendedores calcular la cuota total y las
ventas totales de los vendedores que trabajan en ella.

SELECT oficina_vend, SUM(cuota), SUM(ventas)


FROM vendedores
GROUP BY oficina_vend
HAVING COUNT(*) >= 2

Restricciones en condiciones de búsqueda de grupos

Un elemento que aparezca dentro de la condición de búsqueda en una cláusula


HAVING puede ser:
- Una constante.
- Una función de columna, que produzca un único valor resumen de las
filas del grupo.
- Una columna de agrupación, que por definición tiene el mismo valor
para todas las filas del grupo.
- Una expresión que afecte a combinaciones de las anteriores.

Valores nulos y condiciones de búsqueda de grupos


La cláusula HAVING puede producir uno de los tres resultados siguientes:
Si la condición de búsqueda es TRUE, se retiene el grupo de filas.
Si la condición de búsqueda es FALSE, el grupo de filas se descarta.
Si la condición de búsqueda es NULL, el grupo de filas se descarta.

La cláusula HAVING se utiliza casi siempre en conjunto con la cláusula GROUP


BY, pero la sintaxis no lo precisa. Si una cláusula HAVING aparece sin una
cláusula GROUP BY, SQL considera el conjunto entero de resultados como un
único grupo. Y por lo tanto la cláusula HAVING determina si este grupo se incluye
o no.

El uso de una cláusula HAVING sin una cláusula GROUP BY correspondiente


nuca se ve en la práctica.

Ejercicios: Desarrollar las siguientes consultas haciendo uso de las


clausulas de SQL Server.

1. Obtener para cada vendedor cual es promedio de límite de crédito de sus


clientes.
2. Obtener el importe total para cada producto solicitado en pedidos.
3. Obtener el importe total de pedidos solicitados por cada uno de los clientes.
4. ¿Cuántas oficinas hay en cada una de las ciudades?
5. Determinar la cantidad de productos pedidos por cada cliente con importe
de pedidos mayor que 50000.

Recopilado por: Ing. Claudia L. Benavidez Rugama 23

S-ar putea să vă placă și