0% encontró este documento útil (0 votos)
2 vistas42 páginas

UD07 SQL Tema 03

El documento aborda el tema de consultas simples en SQL, explicando las cláusulas SELECT y FROM, así como el uso de la cláusula WHERE para filtrar resultados. Se detallan diferentes condiciones de búsqueda, incluyendo tests de comparación, rango, pertenencia a conjunto, correspondencia con patrón y valor nulo. Además, se incluyen ejemplos prácticos y ejercicios para ilustrar el uso de estas consultas en la recuperación de datos.

Cargado por

leiruchi2007
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
2 vistas42 páginas

UD07 SQL Tema 03

El documento aborda el tema de consultas simples en SQL, explicando las cláusulas SELECT y FROM, así como el uso de la cláusula WHERE para filtrar resultados. Se detallan diferentes condiciones de búsqueda, incluyendo tests de comparación, rango, pertenencia a conjunto, correspondencia con patrón y valor nulo. Además, se incluyen ejemplos prácticos y ejercicios para ilustrar el uso de estas consultas en la recuperación de datos.

Cargado por

leiruchi2007
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

TEMA 3

CONSULTAS SIMPLES

3.1. CLÁUSULA SELECT

3.2. CLÁUSULA FROM

3.3. RESULTADOS DE CONSULTAS

3.4. CLÁUSULA WHERE

3.5. CONDICIONES DE BÚSQUEDA

3.5.1. Test de comparación


3.5.2. Test de rango
3.5.3. Test de pertenencia a conjunto
3.5.4. Test de correspondencia con patrón
3.5.5. Test de valor nulo
3.5.6. Condiciones de búsqueda compuestas

3.6. COLUMNAS CALCULADAS

3.7. SELECCIÓN DE TODAS LAS COLUMNAS

3.8. FILAS DUPLICADAS (DISTINCT)

3.9. ORDENACIÓN DE LOS RESULTADOS DE UNA CONSULTA

3.10. REGLAS PARA PROCESAMIENTO DE CONSULTAS DE TABLA ÚNICA

3.11. UNIÓN DE RESULTADOS DE CONSULTAS

3.12. EJERCICIOS

3.13. CONSULTAS DE RESUMEN, HAVING Y GROUP BY

3.14. SINTAXIS DE LA SENTENCIA SELECT

3.15. RESUMEN

3.16. EJERCICIOS

José A. Priego SQL BÁSICO


Tema 3.- Consultas simples

3.1. CLÁUSULA SELECT

La cláusula SELECT que empieza cada sentencia SELECT especifica los ítems de datos a
recuperar por la consulta. Los ítems se especifican generalmente mediante una lista de
selección, una lista de ítems de selección separados por comas. Cada ítem de selección de
la lista genera una única columna de resultados de consulta, en orden de izquierda a
derecha. Un ítem de selección puede ser:

SELECT item1, item2, ...

Un nombre de columna, identificando una columna de la tabla designada en la


cláusula FROM. Cuando un nombre de columna aparece como ítem de
selección, SQL simplemente toma el valor de esa columna de cada fila de la
tabla de base de datos y lo coloca en la fila correspondiente de los resultados de
la consulta.

Una constante, especificando que el mismo valor constante va a aparecer en


todas las filas de la tabla resultado de la consulta.

Una expresión SQL, indicando que SQL debe calcular el valor a colocar en los
resultados, según el estilo especificado por la expresión.

3.2. CLÁUSULA FROM

La cláusula FROM consta de la palabra clave FROM, seguida de una lista de nombres de
tablas separados por comas. Cada nombre se refiere a una tabla que contiene datos a
recuperar por la consulta. Estas tablas se denominan tablas fuente de la consulta select, ya
que constituyen la fuente de todos los datos que aparecen en los resultados.
Todas las consultas de este tema tienen una única tabla fuente, por tanto, todas sus
cláusulas FROM contienen un solo nombre de tabla.

José A. Priego SQL BÁSICO Pág. 2


Tema 3.- Consultas simples

3.3. RESULTADOS DE CONSULTAS

El resultado de una consulta SQL es siempre una tabla de datos, semejante a las tablas de
la base de datos. Si se escribe una sentencia SELECT utilizando SQL interactivo, el SGBD
visualizará los resultados de la consulta en forma tabular sobre la pantalla.

Generalmente los resultados de la consulta formarán una tabla con varias columnas y
varias filas.

Por ejemplo, esta consulta produce una tabla de tres columnas (ya que pide tres ítems de
datos) y diez filas (ya que hay diez vendedores). Se trata de una operación de proyección
sobre una tabla:

Lista los nombres, oficinas y fecha de contratos de todos los vendedores.

/* Obtiene los nombres, oficinas y fecha de contratos de todos los vendedores*/


SELECT NOMBRE, OFICINA_REP, CONTRATO
FROM REPVENTAS

NOMBRE OFICINA_REP CONTRATO


Bill Adams 13 12-FEB-88
Mary Jones 11 12-OCT-89
Sue Smith 21 10-DIC-86
Sam Clark 11 14-JUN-88
Bob Smith 12 19-MAY-87
Dan Roberts 12 20-OCT-86
Tom Snyder NULL 13-ENE-90
Larry Fitch 21 12-OCT-89
Paul Cruz 12 01-MAR-87
Nancy Angelli 22 14-NOV-88

Las consultas SQL más sencillas solicitan columnas de datos de una única tabla en la base
de datos.

Ejemplo: Lista de la población, región y ventas de cada oficina.

--Obtiene la población, region y ventas de cada oficina


SELECT CIUDAD, REGION, VENTAS
FROM OFICINAS

CIUDAD REGION VENTAS


Denver Oeste $186,042.00
New York Este $692,637.00
Chicago Este $735,042.00
Atlanta Este $367,911.00
Los Angeles Oeste $835,915.00
La sentencia SELECT para consultas sencillas como ésta sólo incluye las dos cláusulas

José A. Priego SQL BÁSICO Pág. 3


Tema 3.- Consultas simples

imprescindibles. La cláusula SELECT designa a las columnas solicitadas; la cláusula


FROM designa a la tabla que las contiene.

Conceptualmente, SQL procesa la consulta recorriendo la tabla nominada en la cláusula


FROM, fila a fila. Para 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.

Tabla OFICINAS
OFICINA CIUDAD REGION OBJETIVO VENTAS
22 Denver Oeste $300,000.00 $186,042.00
11 New York Este $575,000.00 $692,637.00
12 Chicago Este $800,000.00 $735,042.00
13 Atlanta Este $350,000.00 $350,000.00
21 Los Angeles Oeste $725,000.00 $835,915.00

Tabla resultante
de la consulta

CIUDAD REGION VENTAS


Denver Oeste $186,042.00
New York Este $692,637.00
Chicago Este $735,042.00
Atlanta Este $350,000.00
Los Angeles Oeste $835,915.00

José A. Priego SQL BÁSICO Pág. 4


Tema 3.- Consultas simples

3.4. CLÁUSULA WHERE

Las consultas SQL que recuperan todas las filas de una tabla son útiles para inspección y
elaboración de informes sobre la base de datos, pero para poco más. Generalmente se
deseará seleccionar solamente parte de las filas de una tabla. La cláusula WHERE se
emplea para especificar las filas que se desean recuperar. He aquí algunos ejemplos de
consultas simples que utilizan la cláusula WHERE.

Muestra las oficinas en donde las ventas exceden del objetivo.

SELECT CIUDAD, VENTAS, OBJETIVO


FROM OFICINAS
WHERE VENTAS > OBJETIVO

CIUDAD VENTAS OBJETIVO


New York $692,637.00 $575,000.00
Atlanta $367,911.00 $350,000.00
Los Angeles $835,915.00 $725,000.00

Muestra los empleados dirigidos por Bob Smith (empleado 104).

SELECT NOMBRE, VENTAS


FROM REPVENTAS
WHERE DIRECTOR = 104

NOMBRE VENTAS
Bill Adams $367,911.00
Dan Roberts $305,673.00
Paul Cruz $286,775.00

La cláusula WHERE consta de la palabra clave WHERE seguida de una condición de


búsqueda que especifica las filas a recuperar. En la consulta anterior, por ejemplo, la
condición de búsqueda es DIRECTOR = 104. Conceptualmente, SQL recorre las filas de la
tabla REPVENTAS, una a una, y aplica la condición de búsqueda a cada una de ellas.
Cuando aparece un nombre de columna en la condición de búsqueda (tal como la columna
DIRECTOR en este ejemplo), SQL utiliza el valor de la columna en la fila actual. Por cada
fila, la condición de búsqueda puede producir uno de los tres resultados.

◼ Si la condición de búsqueda es TRUE (cierta), la fila se incluye en los


resultados de la consulta. Por ejemplo, la fila correspondiente a Bill Adams
tiene el valor DIRECTOR correcto y, por tanto, se incluye.

◼ Si la condición de búsqueda es FALSE (falsa), la fila se excluye de los

José A. Priego SQL BÁSICO Pág. 5


Tema 3.- Consultas simples

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. Por ejemplo, la fila correspondiente a
Sam Clark tiene un valor NULL en la columna DIRECTOR, y por tanto se
excluye.

NOMBRE DIRECTO NOMBRE VENTAS


R
Bill Adams 104 Bill Adams $367,911.00
Mary Jones 106 Dan Roberts $305,673.00
Sue Smith 108
Sam Clark NULL
Bob Smith 106
Dan Roberts 104
DIRECTOR =
104
TRUE

DIRECTOR = 106
FALSE

DIRECTOR es
NULL Desconocido

Básicamente la condición de búsqueda realiza una operación de selección sobre la tabla:


actúa como un filtro para las filas de la tabla. Las filas que satisfacen la condición de
búsqueda atraviesan el filtro y forman parte de los resultados de la consulta. Las filas que
no satisfacen la condición de búsqueda son atrapadas por el filtro y quedan excluidas de los
resultados de la consulta.

José A. Priego SQL BÁSICO Pág. 6


Tema 3.- Consultas simples

3.5. CONDICIONES DE BÚSQUEDA

SQL ofrece un rico conjunto de condiciones de búsqueda que permite especificar muchos
tipos diferentes de consultas eficaz y naturalmente. Aquí se resumen cinco condiciones
básicas de búsqueda (llamadas predicadas en el estándar ANSI/ISO) y posteriormente se
describirán más en otras secciones:

Test de comparación. Compara el valor de una expresión con el valor de otra.

Test de rango. Examina si el valor de una expresión cae dentro de un rango


especificado de valores.

Test de pertenencia a conjunto. Comprueba si el valor de una expresión


coincide con alguno de los valores de un conjunto de valores dado.

Test de correspondencia con patrón. Comprueba si el valor de una columna que


contiene datos de cadena de caracteres se corresponde a un patrón especificado.

Test de valor nulo. Comprueba si una columna tiene un valor NULL


(desconocido).

3.5.1. Test de comparación


La condición de búsqueda más utilizada en una consulta SQL es el test de comparación. En
un test de comparación, SQL calcula y compara los valores de dos expresiones SQL por
cada fila de datos. Las expresiones pueden ser tan simples como un nombre de columna o
una constante, o pueden ser expresiones aritméticas más complejas. He aquí algunos
ejemplos de tests de comparación típicos.

Halla los vendedores contratados antes de 1988.

SELECT NOMBRE
FROM REPVENTAS
WHERE CONTRATO < ‘01-ENE-88’

NOMBRE
Sue Smith
Bob Smith
Dan Roberts
Paul Cruz

Como operadores de comparación se pueden utilizar: =, <>, <, <=, >, >=.

La comparación de desigualdad se escribe como “A<>B” según especificación SQL


ANSI/ISO. Varias implementaciones SQL utilizan notaciones alternativas, tales como
“A!=B”.

José A. Priego SQL BÁSICO Pág. 7


Tema 3.- Consultas simples

Cuando SQL compara los valores de dos expresiones en el test de


comparación sigue la lógica trivaluada, es decir, se pueden producir tres
resultados:

◼ Si la comparación es cierta, el test produce un resultado TRUE.


◼ Si la comparación es falsa, el test produce un resultado FALSE.
◼ Si alguna de las dos expresiones produce un valor NULL, la
comparación genera un resultado NULL (desconocido).

Recuperación de una fila


El test de comparación más habitual es el que comprueba si el valor de una columna es
igual a cierta constante. Cuando la columna es una clave primaria, el test produce ninguna
o una sola fila de resultados, como en este ejemplo:

Recupera el nombre y el límite de crédito del cliente número 2.107.

SELECT EMPRESA, LIMITE_CREDITO


FROM CLIENTES
WHERE NUM_CLIE = 2107

EMPRESA LIMITE_CREDITO
Ace International $35,000.00

Este tipo de consulta es el fundamento de los programas de recuperación de base de datos


basadas en formularios. El usuario introduce el número de cliente en el formulario, y el
programa utiliza el número para construir y ejecutar una consulta. Luego visualiza los
datos recuperados en el formulario.

José A. Priego SQL BÁSICO Pág. 8


Tema 3.- Consultas simples

Consideraciones del valor NULL.


El comportamiento de los valores NULL en los tests de comparación puede revelar que
algunas nociones “obviamente ciertas” referentes a consultas SQL no son, de hecho,
necesariamente ciertas.

Ejemplo: Podría parecer que los resultados de las dos consultas siguientes deberían
incluir todas las filas de la tabla REPVENTAS.

Lista los vendedores que superan sus cuotas:


SELECT NOMBRE
FROM REPVENTAS
WHERE VENTAS > CUOTA

NOMBRE
Bill Adams
Mary Jones
Sue Smith
Sam Clark
Dan Roberts
Larry Fitch
Paul Cruz

Lista los vendedores cuyas ventas están por debajo o en su cuota:


SELECT NOMBRE
FROM REPVENTAS
WHERE VENTAS <= CUOTA

NOMBRE
Bob Smith
Nancy Angelli

Pero las consultas producen siete y dos filas, respectivamente, haciendo un total de nueve
filas. Sin embargo, hay diez filas en la tabla REPVENTAS. La fila de Tom Snyder tiene un
valor NULL en la columna CUOTA, puesto que aún no se le ha asignado una cuota. Esta
fila no aparece en ninguna de las dos consultas; “desaparece” con los test de comparación
realizados.

Como muestra este ejemplo, es necesario considerar la gestión del valor


NULL cuando se especifica una condición de búsqueda. En la lógica
trivaluada de SQL, una condición de búsqueda puede producir un
resultado TRUE, FALSE o NULL. Sólo las filas en donde la condición
de búsqueda genera un resultado TRUE se incluyen los resultados de la
consulta.

José A. Priego SQL BÁSICO Pág. 9


Tema 3.- Consultas simples

3.5.2. Test de rango


SQL proporciona una forma diferente de condición de búsqueda con el test de rango:
BETWEEN. El test de rango comprueba si un valor de dato se encuentra entre dos valores
especificados. Implica el uso de tres expresiones SQL. La primera expresión define el
valor a comprobar; las expresiones segunda y tercera definen los extremos superior e
inferior del rango a comprobar. Los tipos de datos de las tres expresiones deben ser
comparables.

Este ejemplo muestra un test de rango típico.

SELECT NUM_PEDIDO, FECHA_PEDIDO, FAB, PRODUCTO, IMPORTE


FROM PEDIDOS
WHERE FECHA_PEDIDO BETWEEN ‘01-OCT-89’ AND ‘31-DIC-89’

NUM_PEDIDO FECHA_PEDIDO FAB PRODUCTO IMPORTE


112961 17-DIC-89 REI A244L $31,500.00
112968 12-OCT-89 ACI 41004 $ 3,978.00
112963 17-DIC-89 ACI 41004 $ 3,276.00
112983 27-DIC-89 ACI 41004 $ 702.00
112979 12-OCT-89 ACI 41002 $15,000.00
112992 04-NOV-89 ACI 41002 $ 760.00
112975 12-OCT-89 REI A244G $ 2,100.00
112987 31-DIC-89 ACI 4100Y $27,500.00

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

La versión negada del test de rango (NOT BETWEEN) comprueba los valores que caen
fuera del rango, como en este ejemplo:

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

SELECT NOMBRE, VENTAS, CUOTA


FROM REPVENTAS
WHERE VENTAS NOT BETWEEN (0.8 * CUOTA) AND (1.2 * CUOTA)

NOMBRE VENTAS CUOTA


Mary Jones $392,725.00 $300,000.00
Sue Smith $474,050.00 $350,000.00
Bob Smith $142,594.00 $200,000.00
Nancy Angelli $186,042.00 $300,000.00

José A. Priego SQL BÁSICO Pág. 10


Tema 3.- Consultas simples

La expresión de test especificada en el test BETWEEN puede ser cualquier expresión


válida, pero en la práctica generalmente es tan sólo un nombre de columna, como en los
ejemplos anteriores.

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


definitorias 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.
◼ 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.

Merece la pena advertir que el test BETWEEN no añade realmente potencia expresiva a
SQL, ya que puede ser expresado mediante dos tests de comparación. El test de rango:

A BETWEEN B AND C es completamente equivalente a:

(A >= B) AND (A <= C)

3.5.3. Test de pertenencia a conjunto


Examina si un valor coincide con alguno de los valores de una lista dada de valores
objetivo.

Ejemplo: Lista los vendedores que trabajan en New York, Atlanta o Denver (oficinas
11, 13 y 22).

SELECT NOMBRE, CUOTA, VENTAS


FROM REPVENTAS
WHERE OFICINA_REP IN (11, 13, 22)

NOMBRE CUOTA VENTAS


Bill Adams $350,000.00 $367,911.00
Mary Jones $300,000.00 $392,725.00
Sam Clark $275,000.00 $299,912.00
Nancy Angelli $300,000.00 $186,042.00

Se puede comprobar si el valor del dato no corresponde con ninguno de los valores
objetivos utilizando la forma NOT IN del test de pertenencia a conjunto. La expresión de
test en un test IN puede ser cualquier expresión SQL, pero generalmente es tan sólo un
nombre de columna, como en los ejemplos precedentes, Si la expresión de test produce un
valor NULL, el test IN devuelve NULL. Todos los elementos en la lista de valores objetivo
deben tener el mismo tipo de datos, y ese tipo debe ser comparable con el tipo de dato de la
expresión de test.

Al igual que el test BETWEEN, el test IN no añade potencia expresiva a SQL, ya que la

José A. Priego SQL BÁSICO Pág. 11


Tema 3.- Consultas simples

condición de búsqueda.

X IN (A, B, C) es completamente equivalente a:

(X = A) OR (X = B) OR (X= C)

3.5.4. Test de correspondencia con patrón


Se puede utilizar un test de comparación simple para recuperar las filas en donde el
contenido de una consulta de texto se corresponde con un cierto texto particular.

Por ejemplo, se podría olvidar fácilmente si el nombre de la empresa era “Smith”,


“Smithson” o “Smithsonian”. El test de correspondencia con patrón de SQL puede ser
utilizado para recuperar los datos sobre la base de una correspondencia parcial del nombre
de cliente.

El test de correspondencia con patrón: LIKE, comprueba si el valor de datos 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
El carácter comodín % (signo de porcentaje) se corresponde con cualquier secuencia de
cero o más caracteres.

Ejemplo: Muestra el límite de crédito de Smithson Corp..

SELECT EMPRESA, LIMITE_CREDITO


FROM CLIENTES
WHERE EMPRESA LIKE ‘Smith% Corp.’

La palabra clave LIKE dice a SQL que compare la columna NOMBRE con el patrón
“Smith% Corp.”. Cualquiera de los nombres siguientes se ajustaría al patrón:

Smith Corp., Smithson Corp., Smithsen Corp., Smithsonian Corp.

El carácter comodín _ (subrayado) se corresponde con cualquier carácter simple (uno


sólo).

Ejemplo: Si se está seguro que el nombre de la empresa es o bien “Smithson” o bien


“Smithsen”, se puede utilizar esta consulta.

SELECT EMPRESA, LIMITE_CREDITO


FROM CLIENTES
WHERE EMPRESA LIKE ‘Smiths_n Corp.’
Los caracteres comodines pueden aparecer en cualquier lugar de la cadena patrón, y puede

José A. Priego SQL BÁSICO Pág. 12


Tema 3.- Consultas simples

haber varios caracteres comodín y varias veces el mismo carácter comodín dentro de una
misma cadena.

Se pueden localizar cadenas que no se ajusten a un patrón utilizando el formato NOT


LIKE del test de correspondencia de patrones. El test LIKE debe aplicarse a una columna
con un tipo de datos cadena. Si el valor del dato en la columna es NULL, el test LIKE
devuelve un resultado NULL.

Caracteres escape
Uno de los problemas de la correspondencia con patrones en cadenas es cómo hacer
corresponder los propios caractéres comodín como caracteres literales. Para comprobar la
presencia de un carácter tanto por ciento en una columna de datos de texto, por ejemplo, no
se puede simplemente incluir el signo del tanto por ciento en el patrón, ya que SQL lo
trataría como un comodín.

El estándar SQL especifica una manera de comparar literalmente caracteres comodines,


utilizando un carácter escape especial. Cuando el carácter escape aparece en el patrón, el
carácter inmediatamente siguiente se trata como un carácter literal en lugar de como un
carácter comodín. El carácter al que se le aplica el “escape” puede ser uno de los dos
caracteres comodín, o el propio carácter de escape, que ha tomado ahora un significado
especial dentro del patrón.

Ejemplo: Halla los productos cuyo id_producto comience con las cuatro letras
“A%BC”.
SELECT NUM_PEDIDO, PRODUCTO
FROM PEDIDOS
WHERE PRODUCTO LIKE ‘A$%BC%’ ESCAPE ‘$’

En el patrón, el primer signo de porcentaje que sigue al carácter escape (en este caso $) es
tratado como un signo literal; el segundo funciona como un comodín.

3.5.5. Test de valor nulo


Los valores NULL crean una lógica trivaluada para las condiciones de búsqueda en SQL.
Para una fila determinada, el resultado de una condición de búsqueda puede ser TRUE,
FALSE o puede ser NULL debido a que alguna de las columnas utilizadas en la evaluación
de la condición de búsqueda contenga un valor NULL.

A veces, es útil comprobar explícitamente los valores NULL en una condición de búsqueda
y gestionarlos directamente. SQL proporciona un test especial de valor nulo para ello: IS
NULL.

José A. Priego SQL BÁSICO Pág. 13


Tema 3.- Consultas simples

Ejemplo: Halla el vendedor que aún no tiene asignada una oficina.


SELECT NOMBRE
FROM REPVENTAS
WHERE OFICINA_REP IS NULL

La forma negada del test de valor nulo (IS NOT NULL) encuentra las filas que no
contienen un valor NULL.

Ejemplo: Lista los vendedores a los que se les ha asignado una oficina.
SELECT NOMBRE
FROM REPVENTAS
WHERE OFICINA_REP IS NOT NULL

A diferencia de las condiciones de búsqueda descritas anteriormente, el test de valor nulo


no puede producir un resultado NULL. Será siempre TRUE o FALSE.

3.5.6. Condiciones de búsqueda compuestas


Las condiciones de búsqueda simples, descritas en las secciones precedentes 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úsqueda SQL
simples para formar otras más complejas.

La palabra clave OR se utiliza para combinar dos condiciones de búsqueda cuando una o la
otra (o ambas) deban ser ciertas.

Ejemplo: Halla los vendedores que están por debajo de la cuota o con ventas inferiores a
$300.000.

SELECT NOMBRE, CUOTA, VENTAS


FROM REPVENTAS
WHERE VENTAS < CUOTA OR VENTAS < 300000.00

También se puede utilizar la palabra clave AND para combinar dos condiciones de
búsqueda que deban ser ciertas simultáneamente.

SELECT NOMBRE, CUOTA, VENTAS


FROM REPVENTAS
WHERE VENTAS < CUOTA AND VENTAS < 300000.00

Finalmente, se puede utilizar la palabra clave NOT para seleccionar filas en donde la
condición de búsqueda es falsa.

José A. Priego SQL BÁSICO Pág. 14


Tema 3.- Consultas simples

Ejemplo: Halla todos los vendedores que están por debajo de la cuota, pero cuyas ventas
no son inferiores a $150.000.

SELECT NOMBRE, CUOTA, VENTAS


FROM REPVENTAS
WHERE VENTAS < CUOTA AND NOT VENTAS < 150000.00

Utilizando las palabras clave AND, OR y NOT y los paréntesis para agrupar los criterios
de búsqueda, se pueden construir criterios de búsqueda muy complejos. Cuando se
combinan más de dos condiciones de búsqueda con AND, OR y NOT, el estándar
especifica que NOT tiene la precedencia más alta, seguido de AND y por último OR. Para
asegurar la portabilidad, es siempre una buena idea utilizar paréntesis y suprimir cualquier
posible ambigüedad.

José A. Priego SQL BÁSICO Pág. 15


Tema 3.- Consultas simples

3.6. COLUMNAS CALCULADAS


Además de las columnas cuyos valores provienen directamente de la base de datos, 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 SQL en la lista de selección. Las expresiones SQL pueden contener sumas,
restas, multiplicaciones y divisiones. También paréntesis para construir expresiones más
complejas.

Ejemplo: Esta consulta muestra una columna calculada simple: Lista 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

CIUDAD REGION (VENTAS-OBJETIVOS)


Denver Oeste -$113,958.00
New York Este $117,637.00
Chicago Este -$64,958.00
Atlanta Este $17,911.00
Los Angeles Oeste $110,915.00

Para procesar la consulta, SQL examina las oficinas, generando una fila de resultados por
cada fila de la tabla OFICINAS. Las dos primeras columnas de resultados provienen
directamente de la tabla OFICINAS. La tercera columna de los resultados se calcula
utilizando los valores de datos de la fila actual de la tabla OFICINAS.

Muchos productos SQL disponen de operaciones aritméticas adicionales, operaciones de


cadenas de caracteres y funciones internas que pueden ser utilizadas en expresiones SQL.
Estas pueden aparecer en expresiones de la lista de selección.

Ejemplo: Lista el nombre, el mes y el año de contrato para cada vendedor.

SELECT NOMBRE, MONTH(CONTRATO), YEAR(CONTRATO)


FROM REPVENTAS

También se pueden utilizar constantes SQL por sí mismas como ítems en una lista de
selección. Esto puede ser útil para producir resultados que sean más fáciles de leer e
interpretar.

José A. Priego SQL BÁSICO Pág. 16


Tema 3.- Consultas simples

Ejemplo: Lista las ventas para cada ciudad.

SELECT CIUDAD, ‘tiene ventas de’, VENTAS


FROM OFICINAS

CIUDAD TIENE VENTAS DE VENTAS


Denver tiene ventas de $186,042.00
New York tiene ventas de $692,637.00
Chicago tiene ventas de $735,042.00
Atlanta tiene ventas de $367,911.00
Los Angeles tiene ventas de $835,915.00

Los resultados de la consulta parecen consistir en una “frase” distinta por cada oficina,
pero realmente es una tabla de tres columnas. Las columnas primera y tercera contienen
valores procedentes de la tabla OFICINAS. La segunda columna siempre contiene la
misma cadena de texto de quince caracteres.

3.7. SELECCIÓN DE TODAS LAS COLUMNAS


A veces es conveniente visualizar el contenido de todas las columnas de una tabla. Esto
puede ser particularmente útil cuando uno va a utilizar por primera vez una base de datos y
desea obtener una rápida comprensión de su estructura y de los datos que contiene. Por
conveniencia, SQL permite utilizar un asterisco (*) en lugar de la lista de selección como
abreviatura de “todas las columnas”.

Ejemplo: Muestra todos los datos de la tabla OFICINAS.

SELECT * FROM OFICINAS

El resultado de la consulta contiene las seis columnas de la tabla OFICINAS, en el mismo


orden de izquierda a derecha que tienen en la tabla.

La selección de todas las columnas es muy adecuada cuando se está utilizando el SQL
interactivo de forma casual. Debería evitarse en SQL programado, ya que cambios en la
estructura de la base de datos pueden hacer que un programa falle.

José A. Priego SQL BÁSICO Pág. 17


Tema 3.- Consultas simples

3.8. 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 (ya que la clave primaria tiene un valor diferente en cada
fila). Si no se incluye la clave primaria en los resultados, pueden producirse filas
duplicadas. Por ejemplo, supongamos que se hace la siguiente petición.

Lista los números de empleado de todos los directores de oficinas de ventas.

SELECT DIR FROM OFICINAS

DIR
108
106
104
105
108

Los resultados tienen cinco filas (uno por cada oficina), pero dos de ellas son duplicados
exactos la una de la otra. Porque Larry Fitch dirige las oficinas tanto de Los Ángeles como
de Denver y su número de empleado (108) aparece en ambas filas de la tabla OFICINAS.
Estos resultados no son probablemente lo que se pretende cuando se hace la consulta. Si
hubiera cuatro directores diferentes, cabría esperar que sólo aparecieran en los resultados
cuatro números de empleado.

Se pueden eliminar las filas duplicadas de los resultados de la consulta, de forma que las
filas que sean iguales entre sí aparezcan sólo una vez, insertando la palabra clave
DISTINCT en la sentencia SELECT justo antes de la lista de selección. He aquí una
versión de la consulta anterior que produce los resultados deseados.

Lista los números de empleado de todos los directores de oficinas de ventas.

SELECT DISTINCT DIR FROM OFICINAS

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


resultados (cinco filas) y eliminando luego las filas que son duplicados exactos de alguna
otra para formar los resultados finales. La palabra clave DISTINCT puede ser especificada
con independencia de los contenidos de la lista SELECT.

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

José A. Priego SQL BÁSICO Pág. 18


Tema 3.- Consultas simples

3.9. ORDENACIÓN DE LOS RESULTADOS DE UNA CONSULTA


Al igual que las filas de una tabla en la base de datos, las filas de los resultados de una
consulta no están dispuestas 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 consta de las palabras clave ORDER BY, seguidas de
una lista de especificaciones de ordenación separadas por comas. Por ejemplo, los
resultados de esta consulta están ordenados por dos columnas, REGION y CIUDAD. Así
se consigue que las filas resultantes de la consulta se ordenen primero por el contenido de
la columna REGIÓN y, las filas con la misma región, se ordenarán por el contenido de la
columna CIUDAD.

Muestra las ventas de cada oficina, ordenadas en orden alfabético por región y dentro de
cada región por ciudad.
SELECT CIUDAD, REGION, VENTAS
FROM OFICINAS
ORDER BY REGION, CIUDAD

La primera especificación de ordenación (REGION) es la clave de la ordenación mayor o


principal. Las que le sigan (CIUDAD, en este caso) son progresivamente especificaciones
de ordenación menores o secundarias, utilizadas para “desempatar” cuando dos filas de
resultados tienen los mismos valores para las claves mayores.

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 ordenación en
secuencia descendente, se incluye la palabra clave DESC en la especificación de
ordenación, como en este ejemplo:

Lista las oficinas, clasificadas en orden descendente de ventas, de modo que las oficinas
con mayores aparezcan en primer lugar:
SELECT CIUDAD, REGION, VENTAS
FROM OFICINAS
ORDER BY VENTAS DESC

CIUDAD REGION VENTAS


Los Angeles Oeste $835,915.00
Chicago Este $735,042.00
New York Este $692,637.00
Atlanta Este $367,911.00
Denver Oeste $186,042.00

José A. Priego SQL BÁSICO Pág. 19


Tema 3.- Consultas simples

También se puede utilizar la palabra clave ASC para especificar el orden ascendente, pero
puesto que ésta es la secuencia de ordenación por defecto, la palabra reservada ASC se
suele omitir.

Si la columna de resultados de la consulta utilizada para ordenación es una columna


calculada, no tiene nombre de columna que se pueda emplear en una especificación de
ordenación. En este caso, debe especificarse un número de columna en lugar de un
nombre, como en este ejemplo.

Lista las oficinas clasificadas en orden descendente de rendimiento de ventas, de modo


que las oficinas con mejor rendimiento aparezcan primero.

SELECT CIUDAD, REGION, (VENTAS-OBJETIVO)


FROM OFICINAS
ORDER BY 3 DESC, 1 ASC, 2

Las filas resultantes están ordenadas de mayor a menor (de forma descendente) por la
tercera columna, que es la diferencia calculada entre VENTAS y OBJETIVO para cada
oficina. Aquellas filas que tengan el mismo valor en esta tercera columna, se ordenan de
menor a mayor (de forma ascendente) por la primera columna: CIUDAD. Y, por último,
las filas que tengan el mismo valor en la tercera columna y en la primera, salen ordenadas
de forma ascendente por la segunda columna (REGION).

José A. Priego SQL BÁSICO Pág. 20


Tema 3.- Consultas simples

3.10. REGLAS PARA PROCESAMIENTO DE CONSULTAS DE


TABLA ÚNICA

Las consultas de tabla única son generalmente sencillas, y normalmente es fácil entender el
significado de una consulta tan sólo leyendo la sentencia SELECT.

Para generar los resultados de una consulta correspondiente a una sentencia SELECT:

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 aquéllas para las cuáles es FALSE o NULL.

3) Para cada fila resultante, calcular el valor de cada elemento en la lista de


selección para producir una única fila de resultados. Por cada referencia de
columna, utilizar el valor de la columna en la fila actual.

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.

Las filas generadas por este procedimiento forman los resultados de la consulta.

José A. Priego SQL BÁSICO Pág. 21


Tema 3.- Consultas simples

3.11. UNIÓN DE RESULTADOS DE CONSULTAS

Ocasionalmente, puede ser conveniente unir los resultados de dos o más consultas en una
única tabla de resultados totales. SQL lo permite gracias a la operación UNION de dos o
más sentencias SELECT.

Ejemplo: Lista todos los productos en donde el precio del producto exceda de $2.000 o
en donde más de $30.000 del producto hayan sido incluidos en un solo pedido.

La operación UNION produce una única tabla de resultados que junta en una sola tabla las
filas de la primera consulta con las filas de los resultados de la segunda consulta. La
sentencia SELECT que especifica la operación UNION tiene el siguiente aspecto:

SELECT ID_FAB, ID_PRODUCTO


FROM PRODUCTOS
WHERE PRECIO > 2000.00
UNION
SELECT DISTINCT FAB, PRODUCTO
FROM PEDIDOS
WHERE IMPORTE > 30000.00

Hay varias restricciones sobre las tablas y sobre las selects que pueden unirse con una
operación UNION:

◼ Ambas tablas resultantes deben contener el mismo número de columnas.


◼ 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.
◼ Ninguna de las dos selects puede estar ordenada con la cláusula ORDER BY.
Sin embargo, el resultado puede ser ordenado, según se describe en la sección
siguiente.

Los nombres de columna de las dos consultas unidas mediante una UNION pueden se
diferentes. En el ejemplo anterior, la primera tabla de resultados tiene columnas de nombre
ID_FAB e ID_PRODUCTO, mientras que la segunda tabla de resultados tiene columnas
de nombres FAB y PRODUCTO. Puesto que las columnas de las dos tablas pueden tener
nombres diferentes, las columnas de los resultados producidos por la operación UNION
están sin designar.

Por omisión, la operación UNION elimina las filas duplicadas, dejando solamente una de
ellas, como parte de su procesamiento.

José A. Priego SQL BÁSICO Pág. 22


Tema 3.- Consultas simples

Ejemplo: Lista todos los productos en donde el precio del producto exceda de $2.000 o
en donde más de $30.0000 del producto hayan sido incluidos en un solo pedido.

SELECT ID_FAB, ID_PRODUCTO


FROM PRODUCTOS
WHERE PRECIO > 2000.00
UNION
SELECT DISTINCT FAB, PRODUCTO
FROM PEDIDOS
WHERE IMPORTE > 30000.00

La eliminación de duplicados en los resultados de la consulta es un proceso que consume


mucho tiempo, especialmente si los resultados contienen un gran número de filas. Si se
sabe, en base a las consultas individuales implicadas, que la operación UNION no puede
producir filas duplicadas, se debería utilizar específicamente la operación UNION ALL, ya
que la consulta se ejecutará mucho más rápidamente.

Uniones y ordenación
La cláusula ORDER BY no puede aparecer en ninguna de las dos sentencias SELECT
unidas por una operación UNION. No tendría mucho sentido ordenar los dos conjuntos de
resultados de ninguna manera, ya que éstos se dirigen directamente a la operación UNION
y nunca son visibles al usuario. Sin embargo, el resultado de la consulta producido por la
operación UNION puede ser ordenado especificando una cláusula ORDER BY después de
la última sentencia SELECT. Ya que las columnas producidas por la operación UNION no
tienen nombre, la cláusula ORDER BY debe especificar las columnas mediante un
número.

He aquí la misma consulta de productos con los resultados ordenados por fabricante y
número de producto.

Lista todos los productos en donde el precio del producto supera a $2.000 o en donde
más de $30.000 del producto hayan sido incluidos en un solo pedido, clasificados por
fabricante y número de producto.

SELECT ID_FAB, ID_PRODUCTO


FROM PRODUCTOS
WHERE PRECIO > 2000.00
UNION
SELECT DISTINCT FAB, PRODUCTO
FROM PEDIDOS
WHERE IMPORTE >30000.00
ORDER BY 1, 2

José A. Priego SQL BÁSICO Pág. 23


Tema 3.- Consultas simples

Uniones múltiples
La operación UNION puede ser utilizada repetidamente para combinar tres o más
conjuntos de resultados. La unión de la Tabla B y la Tabla C en la figura produce una
única tabla. Esta tabla se combina luego con la Tabla A en otra operación UNION. La
consulta de la figura se escribe de este modo:

SELECT * FROM A
UNION (SELECT * FROM B
UNION
SELECT * FROM C)

Tabla A
Tabla B Bill
Bill Mary
Sue George Resultados
Julia Fred de la consulta
Harry UNION Bill
UNION Bill Mary
Tabla C Sue George
Mary Julia Fred
George Harry Sue
Bill Mary Julia
Harry George Harry

Los paréntesis que aparecen en la consulta indican qué UNION debería ser realizada en
primer lugar. De hecho, si todas las uniones de la sentencia eliminan filas duplicadas, o si
todas ellas retienen filas duplicadas, el orden en que se efectúan no tienen importancia.

Estas tres expresiones son equivalentes:

A UNION (B UNION C)

(A UNION B) UNION C

(A UNION C) UNION B

Sin embargo, si las uniones implican una mezcla de UNION y UNION ALL, el orden de la
evaluación sí importa:

Si esta expresión A UNION ALL B UNION C

Se interpreta como A UNION ALL (B UNION C), entonces se producen diez filas de
resultados (seis de la UNION interna, más cuatro filas de la Tabla A).

Sin embargo, si se interpreta como (A UNION ALL B) UNION C, obtendrá 7 filas de


resultado (quitará los repetidos).

José A. Priego SQL BÁSICO Pág. 24


Tema 3.- Consultas simples

3.12. EJERCICIOS

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

2. Lista las oficinas cuyas ventas están por debajo del 80 por 100 del objetivo. Mostrar la
ciudad, las ventas y el objetivo.

3. Lista las oficinas no dirigidas por el empleado número 108. Mostrar la ciudad y
número de empleado del director.

4. Hallar los pedidos cuyo importe es superior a 20.000 e inferior a 29.999. Mostrar el
número de pedido e importe.

5. Hallar los pedidos remitidos un jueves de enero de 2008. Mostrar el número de pedido,
fecha de pedido e importe.

6. Hallar todos los pedidos obtenidos por cuatro vendedores específicos (elegir 4 que ya
tengáis). Mostrar el número de pedido, representante e importe.

7. Buscar el nombre de las empresas cuya primera palabra empieza por “Smiths”, acaba
en “n” y en el medio hay una letra desconocida. Por detrás, el nombre puede tener:
“Corp” o “Inc”.

8. Hallar todos los nombres de vendedores que cumplan alguna de las 3 siguientes
opciones:
A. Trabajan en Denver (22), New York (11) o Chicago (12).
B. No tienen director y fueron contratados a partir de junio de 1988.
C. Sus ventas están por encima de la cuota, pero tienen ventas de 600.000 o
menos.

9. Por cada producto mostrar el identificador del fabricante, el identificador del producto,
su descripción y el inventario (existencias por precio).

10. Calcular a cada vendedor una nueva cuota, incrementando su cuota actual en un 3 por
100 de sus ventas anuales. Mostrar el nombre de vendedor, su cuota actual y su nueva
cuota.

11. Listar las oficinas, clasificadas en orden alfabético por región, y dentro de cada región
por orden descendente de rendimiento de ventas (ventas menos objetivo). Por cada
oficina se mostrará la ciudad, la región y el rendimiento de ventas.

José A. Priego SQL BÁSICO Pág. 25


Tema 3.- Consultas simples

3.13. CONSULTAS DE RESUMEN, HAVING Y GROUP BY

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


columna. Una función de columna SQL acepta una columna de datos como argumento y
produce un único valor que resume la columna. Las funciones de columna ofrecen
diferentes tipos de resumen:

SUM() calcula la suma total de una columna.

AVG() calcula el valor promedio de una columna.

MIN() encuentra el valor más pequeño de una columna.

MAX() encuentra el valor mayor de una columna.

COUNT() cuenta el número de valores de una columna.

COUNT(*) cuenta las filas de una consulta.

El argumento de una función columna puede ser un solo nombre de columna o puede ser
una expresión SQL.

Cálculo de la suma total de una columna (SUM)


La función columna SUM() calcula la suma de los valores de una columna de datos. Los
datos de la columna deben tener un tipo numérico (entero, decimal, coma flotante o
monetario). El resultado de la función SUM() tiene el mismo tipo de dato básico que los
datos de la columna, pero el resultado puede tener una precisión superior.

Ejemplo: ¿Cuáles son la suma de las cuotas y la suma de las ventas de todos los
vendedores?

SELECT SUM(CUOTA), SUM(VENTAS)


FROM REPVENTAS

SUM(CUOTA) SUM(VENTAS)
$2,700,000.00 $2,893,352.00

José A. Priego SQL BÁSICO Pág. 26


Tema 3.- Consultas simples

Cálculo del promedio de una columna (AVG)


La función de columna AVG() calcula la media aritmética (promedio o “average”) de los
valores de una columna de datos. Al igual que una función SUM(), los datos de la columna
deben tener un tipo numérico.

Ya que la función AVG() suma los valores de la columna y luego lo divide por el número
de valores, su resultado puede tener un tipo de dato diferente al de los valores de columna.
Por ejemplo, si se aplica la función AVG() a una columna de enteros, el resultado será un
número decimal o un número de coma flotante, dependiendo del producto SGBD concreto
que se esté utilizando.

Ejemplo: Calcula el precio medio de los productos del fabricante ACI.

SELECT AVG(PRECIO)
FROM PRODUCTOS
WHERE ID_FAB = ‘ACI’

AVG(PRECIO)
$804.29

Determinación de valores extremos (MIN y MAX)


Las funciones de columna MIN() y MAX() determinan los valores menor y mayor de una
columna, respectivamente. Los datos de la columna pueden contener información
numérica, de cadena o de fecha/hora. El resultado de la función MIN() y MAX() tiene
exactamente el mismo tipo de dato que los datos de la columna.

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

SELECT MIN(CUOTA), MAX(CUOTA)


FROM REPVENTAS

MIN(CUOTA) MAX(CUOTA)
$200,000.00 $350,000.00

Ejemplo: ¿Cuál es la fecha de pedido más antigua?

SELECT MIN(FECHA_PEDIDO)
FROM PEDIDOS

MIN(FECHA_PEDIDO)
04-ENE-89

José A. Priego SQL BÁSICO Pág. 27


Tema 3.- Consultas simples

Cuando las funciones de columnas MIN() y MAX() se aplican a datos numéricos, SQL
compara los números en orden algebraico (los números negativos grandes son menores que
los números negativos pequeños, los cuáles son menores que cero, el cual a su vez es
menor que todos los números positivos). Las fechas se comparan secuencialmente (las
fechas más antiguas son más pequeñas que las fechas más recientes).

Cuando se utiliza MIN() y MAX() con datos de cadenas, la comparación de las cadenas
depende del conjunto de caracteres que esté siendo utilizado. En el juego de caracteres
ASCII los dígitos se encuentran delante de las letras en la secuencia de ordenación, y todos
los caracteres en mayúscula se encuentran delante de todos los caracteres en minúscula.

Cuenta de valores de datos (COUNT)


La función de columna COUNT() cuenta el número de valores de datos que hay en una
columna. Los datos de la columna pueden ser de cualquier tipo. La función COUNT()
siempre devuelve un entero, independientemente del tipo de dato de la columna.

Ejemplo: ¿Cuántos clientes hay?

SELECT COUNT(NUM_CLIE)
FROM CLIENTES

COUNT(NUM_CLIE)
21

Ejemplo: ¿Cuántos vendedores superan su cuota?

SELECT COUNT(NOMBRE)
FROM REPVENTAS
WHERE VENTAS > CUOTA

COUNT(NOMBRE)
7

Ejemplo: ¿Cuántos pedidos de más de $25.000 hay?

SELECT COUNT (IMPORTE)


FROM PEDIDOS
WHERE IMPORTE > 25000.00

COUNT(IMPORTE)
4

Obsérvese que la función COUNT() ignora los valores de los datos de la columna;
simplemente cuenta cuántos datos hay.

SQL permite una función de columna especial COUNT(*) que cuenta filas en lugar de
valores de datos.

José A. Priego SQL BÁSICO Pág. 28


Tema 3.- Consultas simples

He aquí la misma consulta, reescrita una vez más para utilizar la función COUNT(*).

SELECT COUNT(*)
FROM PEDIDOS
WHERE IMPORTE > 25000.00

COUNT (*)
4

Si se piensa en la función COUNT(*) como en una función “cuenta filas”, la consulta


resulta más fácil de leer.

José A. Priego SQL BÁSICO Pág. 29


Tema 3.- Consultas simples

Valores NULL y funciones de columna


Las funciones de columna SUM(), AVG(), MIN(), MAX() y COUNT() aceptan cada una
de ellas una columna de valores de datos como argumento y producen un único valor
como resultado.

¿Qué sucede si uno o más de los valores de la columna es un valor NULL? El estándar
SQL ANSI/ISO especifica que los valores NULL de la columna sean ignorados por las
funciones de la columna.

Esta consulta muestra cómo la función de columna COUNT() ignora los valores NULL
de una columna.

SELECT COUNT(*), COUNT (VENTAS), COUNT(CUOTA)


FROM REPVENTAS

COUNT(*) COUNT(VENTAS) COUNT(CUOTA)


10 10 9

La tabla REPVENTAS contiene diez filas, por lo que COUNT(*) devuelve una cuenta de
diez.

La columna VENTAS contiene diez valores no NULL, por lo que la función


COUNT(VENTAS) también devuelve una cuenta de diez.

La columna CUOTA es NULL para el vendedor más reciente. La función


COUNT(CUOTA) ignora este valor NULL y devuelve una cuenta de nueve.

Debido a estas peculiaridades, la función COUNT(*) es utilizada casi siempre en lugar de


la función COUNT(), a menos que, específicamente, se desee excluir del total los valores
NULL de una columna concreta. Ignorar los valores NULL tiene poco impacto en las
funciones de columna MIN() y MAX().

Ejemplo:

SELECT SUM(VENTAS), SUM(CUOTA),


(SUM(VENTAS) – SUM(CUOTA)),
SUM(VENTAS-CUOTA)
FROM REPVENTAS

SUM(VENTAS) SUM(CUOTA) (SUM(VENTAS)–SUM(CUOTA) SUM(VENTAS-CUOTA)


$2,893.532.00 $2,700,000.00 $193,532.00 $117,547.00

José A. Priego SQL BÁSICO Pág. 30


Tema 3.- Consultas simples

Sería de esperar que las dos expresiones de la lista de selección:


(SUM(VENTAS) – SUM(CUOTA) y SUM(VENTAS-CUOTA)
produjeran resultados idénticos, pero el ejemplo muestra que no es así.

El vendedor con un valor NULL en la columna CUOTA es de nuevo la


razón.

La expresión SUM(VENTAS) totaliza las ventas para los diez


vendedores, mientras que la expresión SUM(CUOTA) totaliza
solamente los nueve valores de cuota no NULL.

La expresión SUM(VENTAS) – SUM(CUOTA) calcula la diferencia


de estos dos importes.

Sin embargo, la función de columna SUM(VENTAS-CUOTA) tiene


un valor de argumento no NULL para sólo nueve de los diez vendedores.
En la fila con un valor de cuota NULL, la resta produce un NULL, que es
ignorado por la función SUM(). Por tanto, las ventas del vendedor sin
cuota, que están incluidas en el cálculo previo, se excluyen de este cálculo.

◼ Si todos los datos de una columna son NULL, las funciones de columna
SUM(), AVG(), MIN(), y MAX() devuelven un valor NULL; la función
COUNT() devuelve un valor cero.
◼ Si no hay dato en la columna (es decir, la columna está vacía), las funciones
de columna SUM(), AVG(), MIN(), y MAX() devuelven un valor cero.
◼ La función COUNT(*) cuenta filas, y no depende de la presencia o ausencia
de valores NULL en la columna.

José A. Priego SQL BÁSICO Pág. 31


Tema 3.- Consultas simples

Eliminación de filas duplicadas (DISTINCT)


Recuérdese que se puede especificar la palabra clave DISTINCT al comienzo de la lista de
selección para eliminar las filas duplicadas del resultado de la consulta. También se puede
pedir a SQL que elimine valores duplicados de una columna antes de aplicarle una función
de columna. Para eliminar valores duplicados, la palabra clave DISTINCT se incluye
delante del argumento de la función de columna, inmediatamente después del paréntesis
abierto.

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

SELECT COUNT (DISTINCT TITULO)


FROM REPVENTAS

COUNT (DISTINCT TITULO)


3

Cuando se utiliza la palabra clave DISTINCT, el argumento de la función columna debe


ser un simple nombre de columna; no puede ser una expresión. El estándar no permite el
uso de la palabra clave DISTINCT con las funciones de columna MIN() y MAX().
DISTINCT no puede ser especificado con la función COUNT(*).

La palabra clave DISTINCT sólo se puede especificar una vez en una consulta. Si aparece
en un argumento de una función de columna, no puede aparecer en ninguna otra. Si se
especifica delante de la lista de selección, no puede aparecer en ninguna función de
columna.

José A. Priego SQL BÁSICO Pág. 32


Tema 3.- Consultas simples

Consultas agrupadas (cláusula GROUP BY)


Las consultas resumen descritas hasta ahora son como los totales al final de un informe.
Condensan todos los datos detallados del informe en una única fila resumen de datos.

Ejemplo: ¿Cuál es el valor medio del importe de los pedidos?

SELECT AVG(IMPORTE)
FROM PEDIDOS

AVG(IMPORTE)
$8,256.37

Ejemplo: ¿Cuál es el pedido medio de cada vendedor?

SELECT REP, AVG(IMPORTE)


FROM PEDIDOS
GROUP BY REP

REP AVG(IMPORTE)
101 $8,876.00
102 $5,694.00
103 $1,350.00
105 $7,685.40
106 $16,479.00
107 $11,477.33
108 $3,552.50
110 $11,566.00

La primera consulta es una consulta resumen simple, como la de los ejemplos anteriores.
La segunda consulta produce varias filas resumen, una fila por cada grupo, resumiendo los
pedidos aceptados por un solo vendedor. Conceptualmente, SQL lleva a cabo la consulta
del modo siguiente:

1. SQL divide los pedidos en grupos de pedidos, un grupo por cada vendedor.
Dentro de cada grupo, todos los pedidos tienen el mismo valor en la columna
REP.

2. Por cada grupo, SQL calcula el valor medio 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 REP del grupo y el pedido medio calculado.

Una consulta que incluya la cláusula GROUP BY se denomina consulta agrupada, ya


que agrupa los datos de las tablas fuentes y produce una única fila resumen por cada grupo
de filas. Las columnas indicadas en la cláusula GROUP BY se denominan columnas
de agrupación de la consulta ya que son las que determinan cómo se dividen las filas en
grupos.

José A. Priego SQL BÁSICO Pág. 33


Tema 3.- Consultas simples

Múltiples columnas de agrupación


SQL puede agrupar resultados de consulta basándose en contenidos de dos o más
columnas. Por ejemplo, supongamos que se desea agrupar los pedidos por vendedor y por
cliente. Esta consulta agrupa los datos basándose en ambos criterios:

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

SELECT REP, CLIE, SUM(IMPORTE)


FROM PEDIDOS
GROUP BY REP, CLIE

REP CLIE SUM(IMPORTE)


101 2102 $3,978.00
101 2108 $ 150.00
101 2113 $22,500.00
102 2106 $4,026.00
102 2114 $15,000.00
102 2120 $3,750.00
103 2111 $2,750.00
105 2103 $35,582.00
105 2111 $3,745.00

Las órdenes de agrupación deben agruparse por los campos que no son funciones de
columna en la lista de campos.

José A. Priego SQL BÁSICO Pág. 34


Tema 3.- Consultas simples

Cláusula COMPUTE
La cláusula COMPUTE calcula subtotales y sub-subtotales como se muestra en este
ejemplo.

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

SELECT REP, CLIE, IMPORTE


FROM PEDIDOS
ORDER BY REP, CLIE
COMPUTE SUM(IMPORTE) BY REP, CLIE
COMPUTE SUM(IMPORTE), AVG(IMPORTE) BY REP

REP CLIE IMPORTE


101 2102 $3,978.00
sum
------- ------------
$3,978.00
101 2108 $150.00
sum
------- ------------
$150.00
101 2113 $22,500.00
sum
------- ------------
$22,500.00
sum
------- ------------
$26,628.00
avg
------- ------------
$8,876.00
102 2106 $2,130.00
102 2106 $1,896.00
sum
------- ------------
$4,026.00

102 2114 $15,000.00


sum
------- ------------
$15,000.00
102 2120 $3,750.00
sum
------- ------------
$3,750.00
sum
------- ------------
$22,776.00
avg
------- ------------
$5,694.00

José A. Priego SQL BÁSICO Pág. 35


Tema 3.- Consultas simples

Restricciones en consultas agrupadas


Las columnas de agrupación deben ser columnas efectivas de las tablas designadas en la
cláusula FROM de la consulta. No se pueden agrupar las filas basándose en el valor de una
expresión calculada.

También hay restricciones sobre los elementos que pueden aparecer en la lista de selección
de una consulta agrupada.

Todos los elementos de la lista de selección deben tener un único valor


por cada grupo de filas.
Básicamente, esto significa que un elemento de selección en una
consulta agrupada puede ser:

◼ Una columna de las que aparecen en la cláusula GROUP


BY, que por definición tiene el mismo valor en todas las
filas del grupo.

◼ Una constante.

◼ Una función resumen o de columna.

◼ Una expresión que combine las anteriores.

En la práctica, una consulta agrupada incluirá siempre una columna de agrupación y una
función de columna en su lista de selección.

Valores NULL 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? En la cláusula WHERE, cuando se comparan dos valores NULL diferentes, el
resultado es NULL (no TRUE), es decir, los dos valores NULL no se consideran iguales.
Si se aplicara el mismo convenio a la cláusula GROUP BY se forzaría a SQL a colocar
cada fila con una columna de agrupación NULL en un grupo aparte.

En la práctica, esta regla se demuestra que es demasiado rígida. En vez de ello, el estándar
SQL ANSI/ISO considera que dos valores NULL son iguales a efectos de la cláusula
GROUP BY. Si dos filas tienen NULL en las mismas columnas de agrupación no NULL,
se agrupan dentro del mismo grupo de filas.

SELECT COLORPELO, COLOROJOS, COUNT(*)


FROM PERSONAS
GROUP BY COLORPELO, COLOROJOS

José A. Priego SQL BÁSICO Pág. 36


Tema 3.- Consultas simples

Tabla PERSONAS
NOMBRE COLORPELO COLOROJOS
Cindy Castaño Azules
Louise NULL Azules
Harry NULL Azules
Samantha NULL NULL
Joanne NULL NULL
George Castaño NULL
Mary Castaño NULL
Paula Castaño NULL
Kevin Castaño NULL
Joel Castaño Negros
Susan Rubio Azules
Marie Rubio Azules

COLORPELO COLOROJOS COUNT(*)


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

Condiciones de búsqueda de grupos (cláusula HAVING)


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 la cláusula HAVING es análogo al de
la cláusula WHERE, consistiendo en la palabra clave HAVING seguida de una condición
de búsqueda.

Ejemplo: ¿Cuál es el importe de pedido promedio para cada vendedor cuyos pedidos
totalizan más de $30.000?

SELECT REP, AVG(IMPORTE)


FROM PEDIDOS
GROUP BY REP
HAVING SUM(IMPORTE) > 30000.00

REP AVG(IMPORTE)
105 $7,865.40
106 $16,479.00
107 $11,477.33
108 $8,376.14

La cláusula GROUP BY dispone primero los pedidos en grupos por vendedor. La cláusula
HAVING elimina entonces los grupos en donde el total de los pedidos no excede de
$30.000. Finalmente, la cláusula SELECT calcula el importe de pedido medio para cada
uno de los grupos resultantes y genera los resultados de la consulta.

José A. Priego SQL BÁSICO Pág. 37


Tema 3.- Consultas simples

Ejemplo: Por cada oficina con dos o más personas, calcular la cuota total y las ventas
totales para todos los vendedores que trabajan en la oficina.

SELECT OFICINA_REP, SUM(CUOTA), SUM(VENTAS)


FROM REPVENTAS
GROUP BY OFICINA_REP
HAVING COUNT(*) >= 2

OFICINA_REP SUM(CUOTA) SUM([Link])


12 $775,000.00 $735,042.00
21 $700,000.00 $835,915.00
11 $575,000.00 $692,637.00

Restricciones en condiciones de búsqueda de grupos


La cláusula HAVING se utiliza para incluir o excluir grupos de filas de los resultados de la
consulta, por lo que la condición de búsqueda que especifica debe ser aplicable al grupo en
su totalidad en lugar de a filas individuales. Esto significa que un elemento que aparezca
dentro de la condición de búsqueda en una cláusula HAVING puede ser:

◼ Una columna de las que aparecen en la cláusula GROUP BY, que por
definición tiene el mismo valor en todas las filas del grupo
◼ Una constante
◼ Una función resumen o de columna
◼ Una expresión que combine las anteriores.

En la práctica, la condición de búsqueda de la cláusula HAVING incluirá siempre al menos


una función de columna. Si no lo hiciera, la condición de búsqueda podría expresarse con
la cláusula WHERE y aplicarse a filas individuales. El modo más fácil de averiguar si una
condición de búsqueda pertenece a la cláusula WHERE o a la cláusula HAVING es
recordar cómo se aplican ambas cláusulas:

◼ La cláusula WHERE se aplica a filas individuales, por lo que las expresiones


que contiene deben ser calculables para filas individuales.
◼ La cláusula HAVING se aplica a grupos de filas, por lo que las expresiones
que contengan deben ser calculables para un grupo de filas.

José A. Priego SQL BÁSICO Pág. 38


Tema 3.- Consultas simples

Valores NULL y condiciones de búsqueda de grupos


Al igual que la condición de búsqueda de la cláusula WHERE, la condición de búsqueda
de 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 y contribuye


con una fila resumen a los resultados de la consulta.
◼ Si la condición de búsqueda es FALSE, el grupo de filas se descarta y no
contribuye con una fila resumen a los resultados de la consulta.
◼ Si la condición de búsqueda es NULL, el grupo de filas se descarta y no
contribuye con una fila resumen a los resultados de la consulta.

HAVING sin GROUP BY


La cláusula HAVING se utiliza casi siempre juntamente con la cláusula GROUP BY, pero
la sintaxis de la sentencia SELECT no lo precisa. Si una cláusula HAVING aparece sin una
cláusula GROUP BY, SQL considera el conjunto entero de resultados detallados como un
único grupo. En otras palabras, las funciones de columna de la cláusula HAVING se
aplican a un solo y único grupo para determinar si el grupo está incluido o excluido de los
resultados, y este grupo está formado por todas las filas. El uso de una cláusula HAVING
sin una cláusula correspondiente GROUP BY casi nunca se ve en la práctica.

Ejemplo: Muestra la suma de las cuotas y la suma de las ventas de todos los vendedores,
sólo si la suma de las cuotas es mayor o igual a 2.500.000.

SELECT SUM(CUOTA), SUM(VENTAS)


FROM REPVENTAS
HAVING SUM(CUOTA) >= 2500000

SUM(CUOTA) SUM(VENTAS)
$2,700,000.00 $2,893,352.00

Con una consulta de este tipo, la fila resultante solo se muestra si se cumple la condición
de la cláusula having.

José A. Priego SQL BÁSICO Pág. 39


Tema 3.- Consultas simples

3.14. SINTAXIS DE LA SENTENCIA SELECT


La figura muestra el formato completo de la sentencia SELECT, que consta de seis
cláusulas. Las cláusulas SELECT y FROM de la sentencia son necesarias. Las cuatro
cláusulas restantes (where, order, group y having) son opcionales. Se incluyen en la
sentencia SELECT solamente cuando se desean utilizar las funciones que proporcionan. La
función de cada cláusula esta resumida a continuación:

La cláusula SELECT lista los datos a recuperar por la sentencia SELECT. Los
ítems pueden ser columnas de la base de datos o columnas a calcular por SQL
cuando efectúe la consulta.

La cláusula FROM lista las tablas que contienen los datos a recuperar por la
consulta.

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
,

La cláusula WHERE dice a SQL que incluya sólo ciertas filas de datos en
los resultados de la consulta.

La cláusula GROUP BY especifica una consulta resumen. En vez de producir


una fila de resultados por cada fila de datos de la base de datos, una consulta
resumen agrupa todas las filas similares y luego produce una fila resumen de
resultados para cada grupo.

La cláusula HAVING dice a SQL que incluya sólo ciertos grupos producidos
por la cláusula GROUP BY en los resultados de la consulta. Al igual que la
cláusula WHERE, utiliza una condición de búsqueda para especificar los grupos
deseados.

La cláusula ORDER BY ordena los resultados de la consulta en base a los datos


de una o más columnas.

José A. Priego SQL BÁSICO Pág. 40


Tema 3.- Consultas simples

3.15. RESUMEN
◼ La sentencia SELECT se utiliza para expresar una consulta SQL. Toda sentencia
SELECT produce una tabla de resultados que contienen una o más columnas y
cero o más filas.

◼ La cláusula FROM especifica la(s) tabla(s) que contiene(n) los datos a recuperar
por una consulta.

◼ La cláusula SELECT especifica la(s) columna(s) de datos a incluir en los


resultados de la consulta, que pueden ser columnas de datos de la base de datos o
columnas calculadas.

◼ La cláusula WHERE selecciona las filas a incluir en los resultados aplicando una
condición de búsqueda a las filas de la base de datos.

◼ Una condición de búsqueda puede seleccionar filas mediante comparación de


valores, mediante comparación de un valor con un rango o un grupo de valores,
por correspondencia con un patrón de cadena o por comprobación de valores
NULL.

◼ Las condiciones de búsqueda simples pueden combinarse mediante AND, OR y


NOT para formar condiciones de búsqueda más complejas.

◼ La cláusula ORDER BY especifica que los resultados de la consulta deben ser


ordenados en sentido ascendente o descendente, basándose en los valores de una o
más columnas.

◼ La operación UNION puede ser utilizada junto con sentencias SELECT para unir
dos o más conjuntos de resultados y formar un único conjunto.

◼ Las consultas resumen utilizan funciones de columna SQL para condensar una
columna de valores en un único valor que resuma la columna.

◼ Las funciones de columna pueden calcular el promedio, suma, el valor mínimo y


máximo de una columna, contar el número de valores de datos de una columna o
contar el número de filas de los resultados de la consulta.

◼ Una consulta resumen sin una cláusula GROUP BY genera una única fila de
resultados, resumiendo todas las filas de una tablas o de un conjunto compuestos
de tablas.

◼ Una consulta resumen con una cláusula GROUP BY genera múltiples filas de
resultados.

José A. Priego SQL BÁSICO Pág. 41


Tema 3.- Consultas simples

3.16. EJERCICIOS
12. Calcular la cuota promedio de todos los vendedores.

13. Calcular el importe medio de los pedidos realizados por el cliente “Acme Mfg.”.

14. Calcular el mejor rendimiento de ventas (ventas menos cuota) de todos los vendedores.

15. Listar el rango de cuotas de vendedores asignadas a cada oficina. Mostrar la oficina, el
rango inferior y el superior.

16. Mostrar el número de vendedores asignados a cada oficina.

17. Mostrar los diferentes clientes que son atendidos por cada vendedor.

José A. Priego SQL BÁSICO Pág. 42

También podría gustarte