Consultas SQL: SELECT y Condiciones
Consultas SQL: SELECT y Condiciones
TEMA
4
CONSULTAS A UNA TABLA
Introducción
En este capítulo aprenderá el comando SQL SELECT que se usa para recuperar datos en una
base de datos. Examinará los modos de organizar datos y usar las funciones de SQL para consultar
filas y calcular totales. También aprenderá los comandos SELECT anidados situando un comando
SELECT dentro de otro. Por último, aprenderá como agrupar filas que contienen valores iguales en
alguna columna.
En SQL utilizamos el comando SELECT para consultar una base de datos. La forma básica del
comando SELECT es SELECT-FROM-WHERE. Después de la palabra SELECT, listamos las columnas
que queremos incluir en los resultados de la consulta. Esta parte del comando se denomina
cláusula SELECT. Después, escribimos la palabra FROM seguida del nombre de la tabla que
contiene los datos que queremos consultar. Esta parte del comando se denomina cláusula FROM.
Por último, después de la palabra WHERE, listamos las condiciones (restricciones) que se apliquen
a los datos que queremos recuperar. Esta parte opcional del comando se denomina cláusula
WHERE. Por ejemplo, cuando tenemos que recuperar las filas de sólo los clientes con límite de
crédito $7500.00, incluimos una condición en la cláusula WHERE especificando que el valor de la
columna limiCreClien ha de ser $7500.00 (limiCreClien=7500). No hay reglas especiales de
formato en SQL. En este libro, las cláusulas FROM y WHERE (cuando se utiliza) aparecen en líneas
separadas sólo para que los comandos sean más legibles y comprensibles.
53
Asignatura: Sistemas de Base de Datos
Ejemplo 1:
Liste el código, nombre y balance de todos los clientes.
Como tenemos que listar todos los clientes, no tenemos que incluir ninguna cláusula WHERE,
pues no necesitamos especificar restricción alguna a los datos que queremos recuperar.
Simplemente listaremos las columnas que queremos incluir (codiClien, nombreClien y balanClien)
en la cláusula SELECT y el nombre de la tabla (tCliente) en la cláusula FROM. Escriba un punto y
coma para indicar el final del comando y después haga clic en el botón Ejecutar para mostrar los
resultados. La consulta y sus resultados aparecen en la figura 4.1.
Nota: En Oracle Database Express Edition, el número que aparece en el cuadro Mostrar indica el
número máximo de filas que mostrará Oracle en los resultados de la consulta. El valor por defecto
el 10. Para cambiarlo, puede hacer clic en la flecha y seleccionar un nuevo valor de la lista o
escribirlo en el cuadro. En la figura 4.1 vemos el cuadro de lista Mostrar con el valor cambiado por
el usuario para mostrar 100 filas. Cuando ejecutamos una consulta cuyos resultados incluirán más
filas que el número del cuadro de lista Mostrar, Oracle lo indicará con un mensaje. Si ocurre esta
situación, aumente el número del cuadro de lista Mostrar y después haga clic de nuevo en el
botón Ejecutar para mostrar todos los resultados de la consulta. Si utilizamos SQL Server para
ejecutar los comandos SQL de este libro, los resultados de nuestras consultas pueden diferir
ligeramente de los que vemos en las figuras. En SQL Server, los valores del campo balanClien
tendrán dos posiciones decimales y los valores del campo fechaPedi se pueden mostrar con un
valor de tiempo. Aunque nuestros resultados pueden tener un formato diferente, los datos
deberían ser los mismos que vemos en las figuras.
Figura 4.1. Comando SELECT para seleccionar determinadas columnas de la tabla tCliente.
54
Asignatura: Sistemas de Base de Datos
Ejemplo 2
Liste la tabla tArticulo completa
En lugar de incluir todas las columnas en la cláusula SELECT, podemos utilizar un asterisco (*) para
indicar que queremos incluir todas las columnas. El resultado listará todas las columnas en el
orden en que se las describimos al DBMS al crear la tabla. Si quiere que las columnas aparezcan
en otro orden, escriba los nombres de las columnas en el orden en que quiere que aparezcan en
los resultados de la consulta. En este caso, asumiendo que el orden por defecto es adecuado,
podemos utilizar la consulta que vemos en la figura 4.2 para mostrar toda la tabla tArticulo.
Figura 4.2. Comando SELECT para seleccionar todas las columnas de la tabla tArticulo.
Cláusula WHERE
Cuando tenemos que recuperar filas que cumplan alguna condición, incluiremos la cláusula
WHERE en el comando SELECT, como vemos en el ejemplo 3.
Ejemplo 3
¿Cómo se llama el cliente con el código de cliente 148?
55
Asignatura: Sistemas de Base de Datos
Podemos utilizar la cláusula WHERE para restringir los resultados de la consulta al código de
cliente 148, como vemos en la figura 4.3. Como codiClien es una columna de caracteres, el valor
148 irá entre comillas simples. Además, como la columna codiClien es la clave principal de la tabla
tCliente, sólo puede haber un cliente cuyo número coincida con el número especificado en la
cláusula WHERE.
Figura 4.3. Comando SELECT para encontrar el nombre del cliente con código 148.
La condición de la cláusula WHERE que hemos visto se llama condición simple. Una condición
simple tiene la forma de un nombre de columna, un operador de comparación y después otro
nombre de columna o bien un valor. En la tabla 4.1 se recogen los operadores de comparación
que se pueden utilizar en SQL. Observe que hay dos versiones del operador “no igual a”: < > y !=.
Ejemplo 4
Encuentre el código y nombre de los clientes situados en la ciudad de Grove.
La única diferencia entre este ejemplo y el anterior es que en el ejemplo 3, no podía haber más de
una fila en la respuesta porque la condición implicaba a la clave principal de la tabla. En el
ejemplo 4 la condición implica a una columna que no es la clave principal de la tabla. Como hay
más de un cliente situado en la ciudad de Grove, los resultados pueden y de hecho contienen más
de una fila, como vemos en la figura 4.4.
56
Asignatura: Sistemas de Base de Datos
Figura 4.4. Comando SELECT para encontrar a todos los clientes situados en Grove.
Ejemplo 5
Encuentre el código, nombre, balance y límite de crédito para todos los clientes con balances que
excedan sus límites de crédito.
Una condición sencilla también puede comparar los valores almacenados en dos columnas. En la
figura 4.5 la cláusula WHERE incluye un operador de comparación que selecciona sólo las filas en
las que el balance es mayor que el límite de crédito.
Figura 4.5. Comando SELECT para encontrar a todos los clientes con balances que exceden sus
límites de crédito.
Condiciones compuestas
Las condiciones que hemos visto hasta ahora se denominan condicionales simples. Los siguientes
ejemplos requieren condiciones compuestas. Una condición compuesta se forma conectando dos
o más condiciones simples con los operadores AND, OR y NOT. Cuando el operador AND conecta
condiciones simples, todas las condiciones simples deben ser verdaderas para que la condición
compuesta sea verdadera. Cuando el operador OR conecta las condiciones simples, la condición
compuesta será verdadera siempre que cualquier otra de las condiciones simples lo sea. Preceder
una condición del operador NOT invierte la verdad de la condición original. Por ejemplo, si la
condición original es verdadera, la condición nueva será falsa, y si la condición original es falsa, la
nueva será verdadera.
57
Asignatura: Sistemas de Base de Datos
Ejemplo 6
Liste las descripciones de todos los artículos situados en el almacén 3 Y para las que haya más de
25 unidades.
Figura 4.6. Comando SELECT con una condición AND en líneas separadas.
Para que sea más legible, cada una de las condiciones simples de la consulta que vemos en la
figura 4.6 aparece en una línea separada. Hay usuarios que prefieren poner las condiciones en la
misma línea con cada una de las condiciones simples entre paréntesis, como vemos en la figura
4.7. Ambos métodos llevan a cabo la misma función. En este libro las condiciones simples
aparecen en líneas aparte y sin paréntesis.
Figura 4.7. Comando SELECT con una condición AND en la misma línea.
Ejemplo 7
Liste las descripciones de todos los artículos situados en el almacén 3 O en las que haya más de 25
unidades.
58
Asignatura: Sistemas de Base de Datos
En el ejemplo 7, se trata de recuperar las descripciones para aquello artículos para las que el
número de almacén sea igual a 3, o para las que el número de unidades sea mayor que 25, o
ambos. Para ello, formaremos una condición compuesta utilizando el operador OR, como vemos
en la figura 4.8. Cuando una cláusula WHERE utiliza el operador OR para conectar condiciones
simples, también se denomina una condición OR.
Ejemplo 8
Liste las descripciones de todos los artículos que NO están en el almacén 3.
Para el ejemplo 8, podríamos utilizar una condición simple y el operador “no igual a” (WHERE
almaArti <> ‘3’). Como alternativa, podemos utilizar el operador igual (=) en la condición y
preceder toda la condición del operador NOT, como vemos en la figura 4.9. Cuando una cláusula
WHERE utiliza el operador NOT para conectar condiciones simples, también se denomina una
condición NOT.
59
Asignatura: Sistemas de Base de Datos
No es necesario que la condición almaArti=’3’ vaya entre paréntesis, pero de esta manera el
comando es más legible.
Operador BETWEEN
El ejemplo 9 requiere una condición compuesta para determinar la respuesta.
Ejemplo 9
Liste el código, nombre y balance de todos los clientes con balances mayores o iguales a $2000 y
menores o iguales a $5000.
Para recuperar los datos, podemos utilizar una cláusula WHERE y el operador AND, como vemos
en la figura 4.10.
Nota: En SQL los números incluidos en las consultas se introducen sin símbolos adicionales, como
pueden ser el símbolo del dólar o las comas.
Una alternativa a este método sería utilizar el operador BETWEEN, como vemos en la figura 4.11.
El operador BETWEEN nos permite especificar un rango de valores en una condición.
Figura 4.10. Comando SELECT con una condición AND para una sola columna.
60
Asignatura: Sistemas de Base de Datos
El operador BETWEEN es inclusivo, lo que significa que la consulta selecciona un valor igual a
cualquier valor de la condición y en el rango de los valores. Por ejemplo, en la cláusula BETWEEN
2000 AND 5000 los valores entre 2000 y 5000 harían la condición verdadera. Podemos utilizar el
operador BETWEEN en Oracle y SQL Server.
El operador BETWEEN no es una función esencial en SQL, ya hemos visto que podemos obtener el
mismo resultado sin él. Sin embargo, la utilización del operador BETWEEN hace que determinados
comandos SELECT sean más sencillos de contruir.
Columnas de Cálculo
Con las consultas de SQL podemos llevar a cabo diferentes cálculos. La columna de cálculo no
existe en la base de datos pero se puede calcular utilizando datos de las columnas existentes. Los
cálculos pueden llevar cualquiera de los operadores aritméticos que vemos en la tabla 4.2.
Ejemplo 10
Encuentre el código, nombre y crédito disponible (el límite de crédito menos el balance) de cada
cliente.
En la base de datos de Premiere Products no existe ninguna columna que almacene el crédito
disponible de los clientes, pero podemos calcularlo utilizando las columnas limiCreClien y
61
Asignatura: Sistemas de Base de Datos
Los paréntesis antes y después del cálculo (limiCreClien – balanClien) no son esenciales pero lo
hacen más legible. También se pueden asignar un nombre a una columna de cálculo poniendo
delante del cálculo la palabra AS y el nombre deseado. Por ejemplo, el comando que vemos en la
figura 4.13 asigna el nombre crediDisClien a la columnas de cálculo.
Ejemplo 11
Encuentre el código, nombre y crédito disponible de los clientes que tengan más de 5000 de
crédito disponible.
También podemos utilizar las columnas de cálculo en comparaciones como vemos en la figura
4.14.
62
Asignatura: Sistemas de Base de Datos
Operador LIKE
En la mayoría de los casos, en las condiciones de las cláusulas WHERE hay coincidencias exactas,
como recuperar filas de los clientes situados en la ciudad de Grove. Sin embargo, en algunos casos
las coincidencias exactas no funcionan. Por ejemplo, podríamos saber que el valor deseado
contiene sólo un conjunto determinado de caracteres. En esos casos, utilizaremos el operador
LIKE con un símbolo de porcentaje, como vemos en el ejemplo 12. En lugar de buscar la igualdad,
el operador LIKE utiliza uno o más caracteres de porcentaje para buscar una coincidencia a partir
de un modelo.
Ejemplo 12
Liste el código, nombre y dirección completa de los clientes situados en una calle que contenga las
letras “Central”.
Todo lo que sabemos es que las direcciones que queremos contienen un conjunto determinado
de caracteres (“Central”) en alguna parte de la columna direcClien, pero no sabemos dónde. En
SQL para Oracle y para SQL Server, el signo de porcentaje (%) se utiliza como comodín para
representar cualquier conjunto de caracteres. Como vemos en la figura 4.15, la condición LIKE
‘%Central%’ recupera información de los clientes cuya calle contiene un conjunto de caracteres,
seguidos de las letras “Central”, seguidas posteriormente por algunos caracteres adicionales.
Observe que esta consulta también recuperaría información de un cliente cuya calle es “123
Centralia”, porque “Centralia” también contiene las letras “Central”.
Otro símbolo comodín en SQL es el guión bajo (_), que representa cualquier carácter individual.
Por ejemplo, “T_m” representa la letra “T” seguida de cualquier carácter, seguido de la letra “m”,
y recuperaría filas en que se incluyeran las palabras Tim, Tom o T3m.
Nota: En una base de datos grande sólo debemos utilizar los comodines cuando sea
absolutamente necesario. Las búsquedas con comodines pueden ser extremadamente lentas para
el proceso.
Operador IN
Una cláusula IN, que consiste en el operador IN seguido de un conjunto de valores, proporciona
una manera concisa de escribir ciertas condiciones, como ilustra el ejemplo 13. Más adelante
veremos otro uso de la cláusula IN en ejemplos más complejos.
63
Asignatura: Sistemas de Base de Datos
Ejemplo 13
Liste el código, nombre y límite de crédito de cada cliente que tenga un límite de crédito de
$5000, $10000 y $15000.
En esta consulta podemos utilizar una cláusula IN para determinar si un límite de crédito es
$5000, $10000 o $15000. Obtendremos la misma respuesta utilizando la condición WHERE
limiCreClien = 5000 OR limiCreClien = 10000 OR limiCreClien = 15000. El método que vemos en la
figura 4.17 es más sencillo porque la cláusula IN contiene un conjunto de valores: 5000, 10000 y
15000. La condición es verdadera para aquellas filas en que el valor de la columna limiCreClien
esté en ese conjunto.
Ordenar
El orden de las filas en una tabla es inmaterial para el DBMS. Desde un punto de vista práctico,
esto significa que cuando consultamos una base de datos relacional, no hay ningún orden definido
en el que mostrar los resultados. Las filas se pueden mostrar en el orden en que se introdujeron
originalmente los datos, pero ni siquiera esto es del todo cierto. Si el orden en que se muestran
los datos es importante, podemos solicitar expresamente que los resultados aparezcan en un
orden deseado. En SQL especificaremos el orden de los resultados utilizando la cláusula ORDER
BY.
Cláusula ORDER BY
Utilizamos la cláusula ORDER BY para listar datos en un orden específico, como vemos en el
ejemplo 14.
Ejemplo 14
Liste el código, nombre y balance de los clientes. Ordene el resultado en orden ascendente
(aumentando) por balance.
64
Asignatura: Sistemas de Base de Datos
La columna según la que ordenamos los datos se denomina clave de ordenación o simplemente
clave. En el ejemplo 14 tenemos que ordenar el resultado por balance, por tanto la clave de
ordenación es la columna balanClien. Para ordenar el resultado utilice la cláusula ORDER BY
seguida de la clave de ordenación. Si no especificamos un orden, por defecto será ascendente. La
consulta aparece en la figura 4.18.
Ejemplo 15
Liste el código, nombre y límite de crédito de todos los clientes. Ordénelos por límite de crédito
en orden descendente y después por nombre. (En otras palabras primero ordene los clientes con
límite de crédito en orden descendente. Dentro de cada grupo de clientes con el mismo límite de
crédito, ordénelos por nombre en orden ascendente.)
En el ejemplo 15 tenemos dos nuevos conceptos: ordenar por varias claves (limiCreClien y
nombreClien) y ordenar una de las claves en orden descendente. Cuando tenemos que ordenar
datos por dos columnas, la columna más importante (en este caso, limiCreClien) se denomina
clave principal de ordenación y la columna menos importante (en este caso, nombreClien) se
denomina clave secundaria de ordenación. Para ordenar por múltiples claves, listaremos las
claves por orden de importancia en la cláusula ORDER BY. Para clasificar en orden descendente,
después del nombre de la clave de ordenación situaremos el operador DESC, como vemos en la
figura 4.19.
65
Asignatura: Sistemas de Base de Datos
Figura 4.19. Comando SELECT para ordenar datos por múltiples claves de ordenación.
Funciones
SQL utiliza funciones especiales, denominadas funciones de agregación, para calcular sumas,
medias, recuentos, valores máximos y valores mínimos. Estas funciones se aplican a grupos de
filas. Se podrían aplicar a todas las filas de una tabla (por ejemplo, calcular el balance medio de
todos los clientes). También se pueden aplicar a aquellas filas que cumplan una condición
determinada (por ejemplo, el balance medio de todos los clientes del vendedor 20). Las
descripciones de las funciones de agregación se recogen en la tabla 4.3.
Función Descripción
AVG Calcula el valor medio en una columna.
COUNT Determina el número de filas en una tabla.
MAX Determina el valor máximo en una columna.
MIN Determina el valor mínimo en una columna.
SUM Calcula el total de los valores en una columna.
Tabla 4.3. Operadores aritméticos.
Función COUNT
La función COUNT, como vemos en el ejemplo 16, cuenta el número de filas en una tabla.
Ejemplo 16
¿Cuántos artículos hay con la clase de artículo HW?
Para esta consulta tenemos que determinar el número total de filas en la tabla tArtículo con el
valor HW en la columna claseArti. Podemos contar los números de artículos en los resultados de
66
Asignatura: Sistemas de Base de Datos
También podemos contar el número de filas en una consulta seleccionando una columna
determinada en lugar de utilizar el asterisco, de esta manera:
SELECT COUNT(codiArti)
FROM tArticulo
WHERE claseArti = 'HW';
Función SUM
Si necesitamos calcular el total de los balances de todos los clientes, podemos utilizar la función
SUM, como vemos en el ejemplo 17.
Ejemplo 17
Encuentra el número total de clientes de Premiere Products y el total de sus balances.
Cuando utilizamos la función SUM, debemos especificar la columna que hay que sumar, y el tipo
de datos de la columna ha de ser numérico. (¿Cómo calcular la suma de nombres o dirección?) En
la figura 4.21 vemos la consulta.
67
Asignatura: Sistemas de Base de Datos
El uso de las funciones AVG, MAX y MIN es similar al de SUM, excepto que se calculan diferentes
estadísticas. AVG calcula el valor medio en un rango numérico, MAX calcula el valor máximo en un
rango numérico y MIN calcula el valor mínimo en un rango numérico.
Ejemplo 18
Encuentra la suma de todos los balances, el balance medio, el balance máximo y el balance
mínimo de todos los clientes de Premiere Products.
Nota: Cuando utilizamos las funciones SUM, AVG, MAX o MIN, SQL ignora los valores nulos en la
columna y los elimina de los cálculos.
Los valores nulos en columnas numéricas pueden producir resultados extraños cuando se calculan
las estadísticas. Suponiendo que la columna balanClien aceptara valores nulos, hay cuatro clientes
en la tabla tCliente y sus respectivos balances son $100, $200, $300 y nulo (desconocido). Cuando
calculamos el balance medio, SQL ignora el valor nulo y obtiene el resultado de
$200(($100+$200+$300)/3). De manera similar, cuando calculamos el total de los balances, SQL
ignora el valor nulo y calcula un total de $600. Sin embargo, cuando contamos el número de
clientes en una tabla, SQL incluye la fila que contiene el valor nulo y el resultado es 4. Así, el total
de los balances ($600) dividido por el número de clientes (4) resulta un balance medio de $150.
Nota: Podemos utilizar una cláusula AS con una función. Por ejemplo, el siguiente comando
calcula la suma de la columna balanClien y muestra el encabezado de la columna como
balanToClien en los resultados de la consulta:
Operador DISTINCT
En algunas situaciones, el operador DISTINCT es útil cuando se utiliza junto con la función COUNT,
porque elimina valores duplicados en los resultados de la consulta. Los ejemplos 19 y 20 ilustran
los usos más comunes del operador DISTINCT.
Ejemplo 19
68
Asignatura: Sistemas de Base de Datos
Encuentra el código de todos los clientes que tienen actualmente un pedido abierto (es decir, un
pedido actualmente en la tabla tPedido).
El comando parece bastante sencillo. Cuando un cliente tiene actualmente un pedido abierto,
debe haber al menos una fila en la tabla tPedido en la que aparezca el número de ese cliente.
Podríamos utilizar la consulta que aparece en la figura 4.23 para encontrar los números de
clientes con pedidos abiertos.
Observe que los códigos de clientes 148 y 608 aparecen más de una vez en los resultados, lo que
significa que actualmente ambos tienen más de un pedido abierto en la tabla tPedido. En el
ejemplo 20 vamos a listar cada cliente sólo una vez.
Ejemplo 20
Encuentre el código de cada cliente que tiene actualmente un pedido abierto. Liste cada cliente
sólo una vez.
Para asegurar la exclusividad, podemos utilizar el operador DISTINCT, como vemos en la figura
4.24.
Se puede estar preguntando sobre la relación entre COUNT y DISTINCT, porque en ambos hay filas
de recuento. En el ejemplo 21 se identifican las diferencias.
Ejemplo 21
Cuente el código de clientes que tienen actualmente pedidos abiertos.
La consulta de la figura 4.25 cuenta el número de clientes que utilizan la columna codiClien.
69
Asignatura: Sistemas de Base de Datos
Figura 4.24. Número de cliente con pedidos abiertos y con los duplicados eliminados.
Preguntas y Respuestas
Algunas implantaciones de SQL, incluyendo Oracle y SQL Server, nos permiten utilizar el operador
DISTINCT para calcular el recuento correcto, como vemos en la figura 4.26.
Anidar Consultas
En ocasiones, son necesarios dos o más pasos para obtener los resultados que necesitamos, como
vemos en los siguientes dos ejemplos.
70
Asignatura: Sistemas de Base de Datos
Figura 4.26. Recuento que excluye códigos de cliente duplicados (utilizando DISTINCT dentro de
COUNT).
Ejemplo 22
Liste el código de cada artículo con la clase AP.
Ejemplo 23
Liste los códigos de pedido que contienen una línea de pedido para un artículo con la clase AP.
En el ejemplo 23 tenemos que encontrar los códigos de pedido en la tabla tDetallePedido que
correspondan a los códigos de artículos en los resultados de la consulta del ejemplo 22. Una vez
obtenidos dichos resultados (CD52, DR93, DW11, KL62 y KT03), podemos utilizar el comando de la
figura 4.28.
71
Asignatura: Sistemas de Base de Datos
Subconsultas
Es posible situar una consulta dentro de otra. La consulta interior se denomina subconsulta. La
subconsulta se evalúa primero. Una vez evaluada la subconsulta, la consulta exterior puede
utilizar los resultados de la subconsulta para encontrar los suyos propios, como vemos en el
ejemplo 24.
Ejemplo 24
Encuentre la respuesta a los ejemplos 22 y 23 en un solo paso.
Podemos encontrar el mismo resultado de los dos ejemplos anteriores en un solo paso utilizando
una subconsulta. En la figura 4.29 el comando entre paréntesis es la subconsulta. Esta subconsulta
se evaluará primero, produciendo una tabla temporal. La tabla temporal se utiliza solo para
evaluar la consulta: no está disponible para mostrar al usuario, y se borrará una vez que la
evaluación de la consulta haya finalizado. En este ejemplo la tabla temporal tiene una sola
columna (codiArti) y cinco filas (CD52, DR93, DW11, KL62 y KT03). La consulta exterior se evaluará
después. En este caso, la consulta exterior recupera el número de pedido de cada fila de la tabla
tDetallePedido, para la que el código de artículo está en los resultados de la subconsulta. Como la
tabla contiene sólo los códigos de artículo en la clase AP, los resultados muestran la lista deseada
de números de pedido.
En la figura 4.29 vemos números de pedido duplicados en los resultados. Para eliminar esta
duplicación, podemos utilizar el operador DISTINCT de esta manera:
SELECT DISTINCT(codiPedi)
FROM tDetallePedido
WHERE codiArti IN
(SELECT codiArti FROM tArticulo WHERE claseArti = ‘AP’);
72
Asignatura: Sistemas de Base de Datos
Los resultados de esta consulta mostrarán cada código de pedido sólo una vez.
Ejemplo 25
Liste el código, nombre y balance de cada cliente cuyo balance excede el balance medio de todos
los clientes.
En este caso, utilizamos una subconsulta para obtener el balance medio. Como esta subconsulta
produce un solo número, podemos comparar el balance de cada cliente con este número, como
vemos en la figura 4.30.
73
Asignatura: Sistemas de Base de Datos
Agrupamiento
El agrupamiento crea grupos de filas que comparten alguna característica en común. Si
agrupamos clientes por límite de crédito, por ejemplo, el primer grupo contiene clientes con
límites de $5000, el segundo contiene clientes con límites de crédito de $7500, etc. Si, por otro
lado, agrupamos clientes por número de vendedor, el primer grupo contiene los clientes
representados por el código de vendedor 20, el segundo grupo contiene los representados por el
código 35, y el tercer grupo contiene los clientes representados por el código de vendedor 65.
Cuando agrupamos filas, todos los cálculos indicados en el comando SELECT se llevan a cabo para
todo el grupo. Por ejemplo, si agrupamos clientes por código de vendedor y la consulta solicita el
balance medio, los resultados incluyen el balance medio del grupo de clientes representados por
el código de vendedor 20, el balance medio del grupo del código de vendedor 35 y el balance
medio del grupo representado por el código de vendedor 65. Los siguientes ejemplos ilustran este
proceso.
Cláusula GROUP BY
La cláusula GROUP BY nos permite agrupar datos de una columna en concreto, como codiVende,
y calcular estadísticas cuando lo deseemos, como vemos en el ejemplo 26.
Ejemplo 26
Liste el código de todos los vendedores y el balance medio de sus clientes.
Como tenemos que agrupar clientes por código de vendedor y después calcular el balance medio
de todos los clientes en cada grupo, usaremos la cláusula GROUP BY. En este caso, GROUP BY
codiVende sitúa a los clientes con el mismo código de vendedor en grupos separados. Las
estadísticas indicadas en el comando SELECT se calculan para cada grupo. Es importante tener en
cuenta que la cláusula GROUP BY no ordena los datos en un orden en concreto, tenemos que
utilizar la cláusula ORDER BY para ordenar datos. Asumiendo que los resultados deberían
ordenarse por el código de vendedor, podemos utilizar el comando de la figura 4.31.
74
Asignatura: Sistemas de Base de Datos
Cuando se agrupan las filas, se produce una línea de resultados para cada grupo. Sólo se pueden
mostrar estadísticas calculadas para el grupo de columnas cuyos valores son los mismos para
todas las filas de un grupo.
Preguntas y respuestas
Pregunta: ¿Es adecuado mostrar el código de vendedor en la consulta del ejemplo 26?
Respuesta: Sí, porque el código de vendedor en una fila de un grupo ha de ser el mismo que
el código de vendedor en cualquier otra fila de grupo.
Pregunta: ¿Sería adecuado mostrar el código de cliente en la consulta del ejemplo 26?
Respuesta: No, porque el código de cliente varía en las filas de un grupo. (El mismo vendedor
está asociado con muchos clientes.) El DBMS no podría determinar qué número de cliente
mostrar para el grupo, y mostraría un mensaje de error si intentamos mostrar un código de
cliente.
Cláusula HAVING
La cláusula HAVING se utiliza para restringir los grupos que están incluidos, como vemos en el
ejemplo 27.
Ejemplo 27
Repita el ejemplo anterior, pero liste solo aquellos vendedores que representen menos de cuatro
clientes.
La única diferencia entre los ejemplos 26 y 27 es la restricción de mostrar solo aquellos clientes
que representen menos de cuatro clientes. La restricción no se aplica a filas individuales, sino a
grupos. Como la cláusula WHERE se aplica solo a filas, no podemos utilizarla para llevar a cabo el
tipo de selección necesario. Por fortuna, la cláusula HAVING hace en los grupos lo que la cláusula
WHERE hace en las filas. La cláusula HAVING limita los grupos incluidos en los resultados. En la
figura 4.32, la fila creada para un grupo solo se muestra cuando el recuento del número de filas
del grupo es menor que cuatro y, además, todos los grupos están ordenados por número de
vendedor.
75
Asignatura: Sistemas de Base de Datos
Ejemplo 28
Liste los límites de crédito y el código de clientes que tienen cada límite de crédito.
Para encontrar el código de clientes que tienen un límite de crédito determinado, tenemos que
agrupar los datos por límite de crédito, como vemos en la figura 4.33.
Ejemplo 29
Repita el ejemplo 28, pero liste sólo los límites de crédito que tengan más de un cliente.
La consulta incluye una cláusula HAVING porque esta condición implica un total de grupo, como
vemos en la figura 4.34.
Figura 4.34. Muestra los grupos que contienen más de una fila.
76
Asignatura: Sistemas de Base de Datos
Ejemplo 30
Liste cada límite de crédito y el código de clientes del vendedor 20 que tienen este límite.
La condición implica sólo las filas, por tanto es adecuado utilizar la cláusula WHERE, como vemos
en la figura 4.35.
Ejemplo 31
Repita el ejemplo 30, pero liste solo los límites de crédito que tengan más de un cliente.
Tenemos que utilizar una cláusula WHERE y una cláusula HAVING, porque las condiciones
implican filas y grupos, como vemos en la figura 4.36.
En el ejemplo 31, las filas de la tabla original se evalúan sólo cuando el número de vendedor es
20. Estas filas se agrupan por límite de crédito y se calcula el recuento. Sólo se muestran los
grupos para los que el recuento calculado es mayor que uno.
Valores nulos
En ocasiones, una condición se refiere a una columna que puede aceptar valores nulos, como
vemos en el ejemplo 32.
77
Asignatura: Sistemas de Base de Datos
Ejemplo 32
Liste el código y nombre de los clientes con un valor nulo (desconocido) de calle.
La condición debería ser algo como direcClien = NULL. El formato correcto realmente utiliza el
operador IS NULL (direcClien IS NULL), como vemos en la figura 4.37. (Para seleccionar un cliente
cuya calle no es nula, utilice el operador IS NOT NULL (direcClien IS NOT NULL)) En la actual base
de datos de Premiere Products, ningún cliente tiene un valor nulo de calle, por tanto, no se
recupera ninguna fila en los resultados de la consulta.
Figura 4.37. Seleccionar filas que contienen valores nulos en la columna direcClien.
78