Documentos de Académico
Documentos de Profesional
Documentos de Cultura
SQL I PDF
SQL I PDF
3.1 Introducción.
La base de datos esta formada por cinco tablas, donde cada tabla almacena
información referente a un tipo particular de entidad. El diagrama de la base de datos
puede verse en la figura siguiente (figura 3.1.1).
La tabla OFICINAS (tabla 3.1.1) almacena datos acerca de cada una de las cinco
oficinas de ventas incluyendo la ciudad en donde está localizada la oficina, la región de
ventas a la que pertenece, etc.
La tabla CLIENTES (tabla 3.1.2) almacena datos acerca de cada cliente, tales
como el nombre de la empresa, el límite de crédito y el vendedor que atiende al cliente.
La tabla PEDIDOS (tabla 3.1.5) lleva la cuenta de cada pedido remitido por un
cliente, identificando al vendedor que aceptó el pedido, el producto solicitado, la
cantidad y el importe del pedido, etc. Por simplicidad, cada pedido atañe a un solo
producto.
Dentro de cada tipo de datos hay varios subtipos. Vamos a describir ahora los
dominios correspondientes a cada uno de ellos y cómo se definen.
Enteros.
Sus valores son números enteros, positivos o negativos. Existen dos tipos de
enteros: los pequeños y los grandes. Los primeros se definen con la palabra SMALLINT
y su dominio son los números enteros comprendidos entre –32768 y 32767. Los
segundos se definen con la palabra INTEGER y su dominio son los números enteros
entre –2147483648 y 2147483647.
Decimales.
Sus valores son números positivos o negativos que pueden tener parte entera y
parte fraccionaria. Estos tipos de datos se definen como DECIMAL(p,s), donde el
primer entero p se llama precisión y es el número total de dígitos (parte entera y parte
fraccionaria) que puede tener un valor. El segundo entero es el número de dígitos que
puede tener la parte fraccionaria y se conoce con el nombre de escala. El dominio de un
DECIMAL(p,s) es el conjunto de todos los números racionales, positivos y negativos,
formados por p dígitos de los que s son fraccionarios.
En coma flotante.
Sus valores representan números positivos o negativos que pueden tener parte
entera y parte fraccionaria, como los datos de tipo decimal, pero con más cifras. Este
tipo de datos se definen con la palabra FLOAT o la palabra REAL (ambas son
equivalentes). Su dominio es el conjunto de números racionales que son aproximaciones
a los números reales comprendidos entre ciertos límites (generalmente los límites son
los números cuyo valor absoluto esta comprendido entre 1.175494351e-38 y
3.402823466e38).
De longitud fija.
De longitud variable.
Sus valores son números que representan un punto en el tiempo con una
precisión de días, segundos o microsegundos. Existen tres subtipos:
Fechas.
Horas.
minuto y la tercera los segundos. Si la hora tiene el valor 24, la segunda y tercera partes
deben valer cero.
Instante.
3.3 Constantes.
Las numéricas son números enteros positivos o negativos (10, +10, -10),
números decimales (3.04, +3.04, -3.04) o números en notación exponencial (3.14e-5).
Sea cual sea el tipo de datos asignado a una columna, se puede permitir o no
entre sus valores posibles uno especial denominado nulo. El valor nulo se especifica con
la palabra predefinida NULL.
En una columna de tipo numérico el valor nulo no es lo mismo que el valor cero.
En una columna de tipo alfanumérico, el nulo no es lo mismo que blanco o que el valor
vacío (longitud cero).
Las consultas son el corazón del lenguaje SQL. La sentencia SELECT, que se
utiliza para expresar consultas en SQL, es la más potente y compleja de las sentencias
de SQL. Empezaremos en este punto con las consultas más simples para pasar
posteriormente a consultas más complicadas.
ALL ,
DISTINCT *
,
Figura 3.5.1.1: Diagrama sintáctico de la sentencia SELECT.
La cláusula SELECT que inicia cada sentencia SELECT especifica los ítems de
datos a recuperar por la consulta. Los ítems se especifican generalmente mediante una
lista 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
puede ser:
• 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.
El resultado de una consulta SQL es siempre una tabla de datos, semejante a las
tablas de base de datos. Generalmente los resultados de la consulta formarán una tabla
con varias columnas y filas. Por ejemplo, la consulta siguiente forma una tabla de tres
columnas (ya que se piden tres ítems de datos) y diez filas (ya que hay diez
vendedores):
En contraste, la consulta siguiente produce una única fila, ya que sólo hay un
vendedor que tenga el número de empleado solicitado. Aún cuando esta única fila de
resultados tenga un aspecto menos “tabular” que los resultados multifíla, SQL sigue
considerándolo una tabla de tres columnas y una fila.
En algunos casos los resultados de la consulta pueden ser un único valor, como
el siguiente ejemplo:
AVG(ventas)
24758.20
Tabla 3.5.2.3: Promedio de ventas de los vendedores.
E incluso en otros puede producir cero filas de resultados como en este ejemplo:
NOMBRE CONTRATO
Tabla 3.5.2.4: Nombre y fecha de contrato de cualquier vendedor con ventas superiores
a 75000.
Aún en esta situación, el resultado sigue siendo una tabla. Se trata de una tabla
vacía con dos columnas y cero filas.
Las consultas SQL más sencillas solicitan columnas de datos de una única tabla
en la base de datos. Por ejemplo:
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. La tercera columna se calcula, fila a fila, utilizando
Ciencias y Técnicas Estadísticas 9
Adquisición y tratamiento de datos El lenguaje SQL I: Consulta de datos
los valores de datos de la fila actual de la tabla OFICINAS. Veamos otros ejemplos de
columnas calculadas.
También se pueden utilizar constantes de 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, como por ejemplo:
REGION
Centro
Este
Este
Este
Centro
Tabla 3.5.4.1: Lista de las regiones en que se encuentran las oficinas.
Los resultados tienen cinco filas (uno por oficina), pero se encuentran filas
duplicadas una de la otra. Estos resultados no son probablemente los que uno pretende
Ciencias y Técnicas Estadísticas 11
Adquisición y tratamiento de datos El lenguaje SQL I: Consulta de datos
con la consulta, si existen dos regiones diferentes, cabría esperar que aparecieran solo
las dos regiones.
REGION
Este
Centro
Tabla 3.5.4.2: Lista de las regiones en que se encuentran las oficinas.
Las consultas SQL que recuperan todas las filas de una tabla únicamente son
útiles para generar informes sobre la base de datos. Generalmente se desea seleccionar
solamente parte de las filas de una tabla, y sólo se incluirán esas filas en los resultados.
La cláusula WHERE se emplea para especificar las filas que se desean recuperar.
Veamos unos ejemplos simples:
NOMBRE VENTAS
Belen Aguirre 39.327
Daniel Gutierrez 26.628
Pedro Cruz 2.700
Tabla 3.5.5.3: Empleados dirigidos por el empleado número 104.
Test de comparación.
NOMBRE
Carlos Martinez
Soledad Martinez
Daniel Gutierrez
Pedro Cruz
CIUDAD REGION
Valencia Este
Barcelona Este
Alicante Este
Tabla 3.5.6.3: Lista de las oficinas que no se encuentran en la región Centro.
EMPRESA LIMITE_CREDITO
Distribuciones Sur S.A. 35.000
Tabla 3.5.6.4: Nombre y limite de crédito del cliente número 2107.
Observe que la sentencia SQL que recupera un cliente específico por su número
y la que recupera todos los clientes que tienen una cierta característica es exactamente
de la misma forma. Estos dos tipos de consulta serían operaciones muy diferentes en
una base de datos no relacional. Considere además, que SQL maneja lógica trivaluada,
por lo cual es necesario considerar el manejo del valor NULL como en el ejemplo
siguiente:
NOMBRE
Jose Maldonado
Belen Aguirre
Lorenzo Fernandez
Natalia Martin
Tabla 3.5.6.5: Lista de vendedores que superan sus cuotas.
NOMBRE
Carlos Martinez
Maria Garcia
Soledad Martinez
Daniel Gutierrez
Pedro Cruz
Tabla 3.5.6.6: Lista de vendedores que no superan sus cuotas.
Como puede observarse, solo se recuperan nueve filas, pues una de las filas
originales no posee una cuota establecida (valor NULL).
Test de rango.
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. Veamos otro ejemplo de test de rango:
NUM_PEDIDO IMPORTE
110036 22.500
112987 27.500
113042 22.500
Tabla 3.5.6.8: Pedidos que caen en un determinado rango de importe.
La versión negada del test de rango (NOT BETWEEN) comprueba los valores
que caen fuera del rango, como en el siguiente ejemplo:
Se puede utilizar un test de comparación simple para recuperar las filas en donde
el contenido de una columna de texto se corresponde con un cierto texto particular. Por
ejemplo, esta consulta recupera la fila de la tabla clientes por nombre:
EMPRESA LIMITE_CREDITO
AFS S.A. 20.000
Tabla 3.5.6.12: Limite de crédito de la empresa AFS S.A.
Así por ejemplo, uno puede consultar todos los vendedores de apellido Martinez
de la siguiente forma:
NUM_EMPL NOMBRE
104 Carlos Martinez
102 Soledad Martinez
Tabla 3.5.6.13: Empleados apellidados Martinez.
NOMBRE
Antonio Valle
Tabla 3.5.6.14: Vendedores que aún no tienen asignada una oficina.
La forma negada del test de valor nulo (IS NOT NULL) encuentra las filas que
no contienen un valor NULL:
NOMBRE
Jose Maldonado
Carlos Martinez
Belen Aguirre
Maria Garcia
Lorenzo Fernandez
Soledad Martinez
Daniel Gutierrez
Pedro Cruz
Natalia Martin
Tabla 3.5.6.15: Vendedores que tienen asignada una oficina.
La palabra clave AND se utiliza para combinar dos condiciones de búsqueda que
deban ser ciertas simultáneamente:
Por último, se puede utilizar la palabra clave NOT para seleccionar filas en
donde la condición de búsqueda es falsa:
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:
NOMBRE EDAD
Carlos Martinez 33
Soledad Martinez 48
Pedro Cruz 29
Tabla 3.5.7.4: Vendedores con ventas inferiores a la cuota y edad mayor de 45 años o
con ventas inferiores a 5000.
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 la consulta siguiente están ordenados por las columnas región
y ciudad.
Por omisión, SQL ordena los datos en secuencia ascendente. Para solicitar la
ordenación en secuencia descendente, se incluye la palabra clave DESC en la
especificación de ordenación, como en este ejemplo:
ID_FAB ID_PRODUCTO
ACI 4100Y
REI 2A44L
ACI 4100Z
REI 2A44R
Tabla 3.5.9.1: Productos cuyo precio excede de 2000.
FAB PRODUCTO
IMM 775C
REI 2A44L
REI 2A44R
Tabla 3.5.9.2: Productos de los cuales se ha hecho un pedido mayor de 30000.
ID_FAB ID_PRODUCTO
ACI 4100Y
ACI 4100Z
IMM 775C
REI 2A44L
REI 2A44R
Tabla 3.5.9.3: Resultado de la unión de las dos consultas anteriores.
• El tipo de datos de cada columna en la primera tabla debe ser el mismo que el
tipo de datos en la columna correspondiente en la segunda tabla.
• Ninguna de las dos tablas puede estar ordenadas con la cláusula ORDER BY.
Puede observarse que la UNION combina las filas de los dos conjuntos de
resultados eliminando por defecto las filas duplicadas. Si se desean mantener las filas
duplicadas en una operación UNION, se puede especificar la palabra clave ALL a
continuación de la palabra UNION. Por ejemplo:
ID_FAB ID_PRODUCTO
ACI 4100Y
REI 2A44L
ACI 4100Z
REI 2A44R
IMM 775C
REI 2A44L
REI 2A44R
Tabla 3.5.9.4: Resultado de la unión de las consultas anteriores conservando las filas
repetidas.
ID_FAB ID_PRODUCTO
REI 2A44L
REI 2A44R
ACI 4100Y
ACI 4100Z
IMM 775C
Tabla 3.5.9.5: Resultado de la unión de las consultas ordenado por la identificación del
producto.
• Lista los pedidos mostrando el importe del pedido, el nombre del cliente que lo
ordenó y el nombre del producto solicitado (tablas PEDIDOS, CLIENTES y
REPVENTAS).
Sin embargo, existe un enlace entre estas dos tablas. En cada fila de la tabla
PEDIDOS, la columna CLIE contiene el número del cliente que ordenó el pedido, el
cual se corresponde con el valor en la columna NUM_CLIE de una de las filas de la
tabla CLIENTES.
Las consultas multitabla más comunes implican a dos tablas que tienen la
relación natural padre/hijo. La consulta referente a pedidos y clientes anterior es un
ejemplo de tal tipo de consulta. Cada pedido (hijo) tiene un cliente asociado (padre), y
cada cliente (padre) puede tener muchos pedidos asociados (hijos). Los pares de filas
que generan los resultados de la consulta son combinaciones de fila padre/hijo.
Las claves foráneas y las claves primarias crean relaciones padre/hijo en una
base de datos SQL. La tabla que contiene la clave foránea es el hijo en la relación; la
tabla con la clave primaria es el padre. Para ejercitar la relación padre/hijo en una
consulta debe especificarse una condición de búsqueda que compare la clave foránea y
la clave primaria. Otro ejemplo de una consulta padre/hijo es la siguiente:
Con la condición de búsqueda adicional, las filas que aparecen en los resultados
están más restringidas. El primer test (oficina_rep=oficina) selecciona solamente pares
de filas REPVENTAS y OFICINAS que tienen la relación padre/hijo. El segundo test
selecciona adicionalmente sólo aquellos pares de filas donde la oficina está por encima
del objetivo.
SQL puede combinar datos de tres o más tablas utilizando las mismas técnicas
básicas utilizadas para las consultas de dos tablas. Un sencillo ejemplo es el siguiente:
Los resultados de esta consulta provienen de los pares de filas de las tablas
PEDIDOS y REPVENTAS donde el valor en la columna FECHA_PEDIDO coincide
con el valor de la columna CONTRATO para el vendedor. Ninguna de estas columnas
es una clave foránea o una clave primaria, pero SQL es capaz de componer las tablas.
La base de datos ejemplo incluye varias instancias en donde dos tablas contienen
columnas con el mismo nombre. La tabla OFICINAS y la tabla REPVENTAS, por
ejemplo, contienen ambas una columna de nombre VENTAS. Normalmente, no hay
confusión entre ambas columnas, ya que la cláusula FROM determina cuál de ellas es la
adecuada en una consulta determinada, como en estos dos ejemplos:
CIUDAD VENTAS
Toledo 34.432
Alicante 39.327
Madrid 81.309
Tabla 3.6.7.1: Lista de las ciudades donde las ventas superan el objetivo.
NOMBRE VENTAS
Jose Maldonado 32.958
Belen Aguirre 39.327
Lorenzo Fernandez 58.533
Natalia Martin 34.432
Tabla 3.6.7.2: Lista de los vendedores con ventas superiores a 30000.
Como se vio con anterioridad, “SELECT *” puede ser utilizado para seleccionar
todas las columnas de la tabla designada en la cláusula FROM. En una consulta
multitabla, el asterisco selecciona todas las columnas de todas las tablas listadas en la
cláusula FROM. Por ejemplo:
3.6.9 Autocomposiciones.
Algunas consultas multitabla afectan a una relación que una tabla tiene consigo
misma. Por ejemplo, supongamos que se desea listar los nombres de todos los
vendedores y sus directores. Cada vendedor aparece como una fila en la tabla
REPVENTAS, y la columna DIRECTOR contiene el número de empleado del director
del vendedor. Por ello, la columna DIRECTOR es una clave foránea para la propia tabla
REPVENTAS.
Si se tratara de expresar esta consulta como cualquier otra consulta de dos tablas
implicando una coincidencia clave foránea/clave primaria, aparecería tal como ésta:
NOMBRE NOMBRE
Tabla 3.6.9.1: Empleados que son sus propios directores.
Para resolver el problema, imaginemos que SQL tuviera dos copias idénticas de
la tabla REPVENTAS, una llamada EMPS, que contuviera los empleados, y otra
llamada DIRS, que contuviera los directores. Entonces la columna director de la tabla
EMPS sería una clave foránea para la tabla DIRS y la consulta se realizaría como:
SQL realmente no tiene dos tablas diferentes, pero es capaz de asignar a una tabla un
nombre diferente, llamado alias de tabla. La consulta, escrita utilizando los alias EMPS
y DIRS para la tabla REPVENTAS sería:
NOMBRE NOMBRE
Carlos Martinez Jose Maldonado
Belen Aguirre Carlos Martinez
Maria Garcia Jose Maldonado
Lorenzo Fernandez Jose Maldonado
Soledad Martinez Lorenzo Fernandez
Daniel Gutierrez Carlos Martinez
Antonio Valle Daniel Gutierrez
Pedro Cruz Carlos Martinez
Natalia Martin Lorenzo Fernandez
SUM(CUOTA) SUM(VENTAS)
240.000 247.582
Tabla 3.7.1.1: Cuotas y ventas totales.
SUM(IMPORTE)
39.327
Tabla 3.7.1.2: Total de pedidos aceptados por el empleado Belen Aguirre.
AVG(PRECIO)
804,29
Tabla 3.7.2.1: Precio promedio de los productos del fabricante ‘ACI’.
AVG(IMPORTE)
8.895,50
Tabla 3.7.2.2: Precio medio del pedido ordenado por el cliente 2103.
MIN(CUOTA) MAX(CUOTA)
17.500 30.000
Tabla 3.7.3.1: Cuotas mínima y máxima asignadas a los vendedores.
MIN(FECHA_PEDIDO)
12/10/1999
Tabla 3.7.3.2: Fecha del pedido más antiguo en la base de datos.
MAX(100*VENTAS/CUOTA)
195
Tabla 3.7.3.3: Mejor rendimiento de todos los vendedores.
MIN(NOMBRE) MAX(NOMBRE)
Antonio Valle Soledad Martinez
Tabla 3.7.3.4: Primer y último vendedor por orden alfabético.
COUNT(NUM_CLIE)
21
Tabla 3.7.4.1: Número de clientes.
COUNT(NOMBRE)
4
Tabla 3.7.4.2:Número de vendedores que superan su cuota.
COUNT(IMPORTE)
4
Tabla 3.7.4.3: Número de pedidos de más de 25000.
Resaltar que la función COUNT() ignora los valores de los datos en la columna,
simplemente cuenta cuántos datos hay. En consecuencia, no importa realmente qué
columna se especifica como argumento de la función COUNT(). Por ello, el SQL
soporta una función de columna especial, COUNT(*) que cuenta filas en lugar de
valores de datos. Por ello la última consulta podría haberse escrito como:
COUNT(*)
4
Tabla 3.7.4.4: Número de pedidos de más de 25000.
Las consultas simples con una función de columna en una lista de selección son
fáciles de entender. Sin embargo, cuando la lista de selección incluye varias funciones
de columna es difícil entender su proceso.
Uno de los mejores modos de imaginar las consultas sumarias y las funciones de
columna es pensar en el procesamiento de la consulta dividido en dos pasos. Primero,
imaginamos cómo funcionaria la consulta sin las funciones de columna, produciendo
muchas filas de resultados de consulta detallados. Luego imaginamos a SQL aplicando
las funciones de columna a los resultados de consulta detallados, produciendo una sola
fila sumaria. Por ejemplo:
SELECT AVG(importe),SUM(importe),AVG(100*importe/limite_credito),
AVG(100*importe/cuota) FROM pedidos,clientes,repventas WHERE clie=num_clie
AND rep=num_empl
La tabla REPVENTAS contiene diez filas, por lo que COUNT(*) devuelve diez.
Las columnas VENTAS contienen diez valores no NULL, por lo que la función
COUNT(ventas) devuelve también diez. Sin embargo, la columna CUOTA es NULL
para un vendedor, por lo cual la función COUNT(cuota) ignora ese valor de NULL y
devuelve el valor nueve.
La ignorancia de los valores NULL para las funciones MIN() y MAX() carece
de importancia. Sin embargo para las funciones SUM() y AVG() puede producir sutiles
problemas. Supongamos la siguiente consulta:
SELECT SUM(ventas),SUM(cuota),SUM(ventas)-SUM(cuota),SUM(ventas-cuota)
FROM repventas
Igual que en la selección de una lista, se puede pedir a SQL que elimine valores
duplicados de una columna antes de aplicarle la 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. Veamos algunos
ejemplos:
COUNT(DISTINCT TITULO)
3
Tabla 3.7.7.1: Número de títulos diferentes de los vendedores.
COUNT(DISTINCT OFICINA_REP)
4
Tabla 3.7.7.2: Número de oficinas con vendedores que superan sus cuotas.
Las consultas sumarias descritas hasta ahora son como los totales al final de un
informe. Condensan todos los datos detallados del informe en una única fila sumaria de
datos. Sin embargo, en algunos casos es útil obtener subtotales. La cláusula GROUP BY
de la sentencia SELECT proporciona esta capacidad. Veamos un ejemplo:
REP AVG(IMPORTE)
101 8.876,00
102 5.694,00
103 1.350,00
105 7.865,40
106 16.479,00
107 11.477,33
108 8.361,86
109 3.552,50
110 11.566,00
Tabla 3.7.8.1: Tamaño medio de los pedidos para cada vendedor.
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 sumario de resultados.
OFICINA_REP COUNT(*)
NULL 1
11 2
12 3
13 1
21 2
22 1
Tabla 3.7.8.3: Número de vendedores asignados a cada oficina.
Da como resultado:
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
REP AVG(IMPORTE)
105 7.865,40
106 16.479,00
107 11.477,33
108 8.361,86
Tabla 3.7.9.1: Tamaño de pedido promedio por vendedor para vendedores con pedidos
totales de más de 30000.
Por último, veamos otro ejemplo que utiliza todas las cláusulas de la sentencia
SELECT:
id_fab,id_producto,descripcion,precio,existencias HAVING
SUM(cant)>(0.75*existencias) ORDER BY existencias DESC
Para procesar esta consulta, SQL efectúa conceptualmente los siguientes pasos:
2. Elimina los grupos en donde la cantidad pedida (el total de la columna CANT
para todos los pedidos del grupo) es menos del 75% de las existencias.
5. Ordena los resultados para que los productos con el mayor valor de existencias
aparezcan en primer lugar.
3.8 Subconsultas.
1. Una sentencia SQL con una subconsulta es frecuentemente el modo más natural
de expresar una consulta, ya que se asemeja más estrechamente a la descripción
de la consulta en lenguaje natural.
3. Hay algunas consultas que no pueden ser expresadas en el lenguaje SQL sin
utilizar una subconsulta.
El valor “???” necesita ser sustituido, y debería ser igual a “al 50% de la suma de
las cuotas de los vendedores asignados a la oficina en cuestión”. Sabemos que la menor
de las cuotas para una oficina específica puede obtenerse como:
• Una subconsulta debe producir una única columna de datos como resultados.
Esto significa que una subconsulta siempre tiene un único elemento de selección
de la cláusula SELECT.
ALL
DISTINCT
CIUDAD
Barcelona
Tabla 3.8.1.1: Ciudades con ventas inferiores al 50% de la suma de las cuotas de los
vendedores asignados a dicha ciudad.
NOMBRE
Belen Aguirre
Lorenzo Fernandez
Soledad Martinez
Tabla 3.8.2.1: Lista los vendedores con cuota igual o superior al objetivo de Alicante.
EMPRESA
Pino S.L.
JPF S.L.
Tabla 3.8.2.2: Lista de los clientes atendidos por Belen Aguirre.
DESCRIPCION EXISTENCIAS
Articulo Tipo 1 277
Articulo Tipo 2 167
Articulo Tipo 3 207
Tabla 3.8.2.3: Lista de los productos del fabricante ACI para los cuales las existencias
superan a las existencias del producto ACI-41004.
NOMBRE
Belen Aguirre
Lorenzo Fernandez
Soledad Martinez
Natalia Martin
Tabla 3.8.2.4: Lista de los vendedores que trabajan en oficinas que superan su objetivo
de ventas.
NOMBRE
Lorenzo Fernandez
Tabla 3.8.2.5: Lista de empleados que tienen todos sus clientes con limite de credito
igual o superior a 50000.
EMPRESA
EVBE S.A.
Pino S.L.
Distribuciones Sur S.A.
Zapater Importaciones S.A.
Tabla 3.8.2.6: Lista de los clientes que han remitido pedidos del fabricante ACI con
productos que empiezan por 4100 entre Enero y Junio de 2000.
Test de existencia.
DESCRIPCION
Bisagra Dcha.
Bisagra Izqda.
Extractor
Riostra 1-Tm
Tabla 3.8.2.7: Lista de productos para los cuales se ha recibido un pedido mayor o
igual a 25000.
EMPRESA
Hnos. Martinez S.A.
Construcciones Leon S.A.
Tabla 3.8.2.8: Lista de los clientes asignados a ‘Soledad Martinez’ y que no han
remitido ningún pedido superior a 3000.
CIUDAD
Toledo
Alicante
Tabla 3.8.2.9: Oficinas donde la cuota de un vendedor representa más del 55% del
objetivo de la oficina.
Test cuantificados.
El test ALL se utiliza, al igual que el test ANY, conjuntamente con uno de los
seis operadores de comparación SQL (=, <>, <, <=, >, >=) para comparar un único valor
de test con una columna de valores de datos producidos por una subconsulta. Para
efectuar el test, SQL utiliza el operador de comparación especificado para comparar el
valor de test con todos y cada uno de los valores de datos de la columna. Si todas las
comparaciones individuales producen TRUE, el test ALL devuelve un resultado TRUE.
Veamos unos ejemplos de test ANY y ALL:
NOMBRE
Jose Maldonado
Lorenzo Fernandez
Natalia Martin
Tabla 3.8.2.10: Lista de los vendedores que han aceptado un pedido que representa
más de su cuota.
CIUDAD OBJETIVO
Toledo 27.500
Alicante 30.000
Tabla 3.8.2.11: Lista de las oficinas y sus objetivos en donde todos los vendedores
tienen ventas que igualan o superan el objetivo de la oficina.
Todas las consultas descritas hasta ahora han sido consultas de “dos niveles”,
afectando a la consulta principal y una subconsulta. Del mismo modo que se puede
utilizar una subconsulta dentro de una consulta principal, se puede utilizar una
subconsulta dentro de otra subconsulta. Esto se puede extender hasta el nivel de
subconsulta que se desee. Veamos un ejemplo:
EMPRESA
Hnos. Martinez S.A.
Lopez Asociados S.L.
Componentes Fernandez S.A.
Domingo S.L.
Distribuciones Montiel S.L.
En este ejemplo, la subconsulta más interna produce una columna que contiene
los números de oficina de las oficinas de la región Centro. La siguiente subconsulta
produce una columna que contiene los números de empleado de los vendedores que
trabajan en las oficinas seleccionadas. Finalmente la consulta externa encuentra los
clientes cuyos vendedores tienen uno de los números de empleado seleccionados.
NOMBRE AVG(IMPORTE)
Antonio Valle 22.500,00
Soledad Martinez 15.000,00
Tabla 3.8.4.1: Lista de los vendedores cuyo tamaño de pedido medio para productos
fabricados por “ACI” es superior al tamaño de pedido medio global.
OFICINAS
DPTOFICINAS oficina
codigo ciudad
oficina region
departamento
telefono
DEPARTAMENTOS
deptno
EMPLEADOS nombre
num
nombre CATEGORIAS
edad
categoria
departamento
titulo
categoria
salario
contrato trienio
OFICINAS CATEGORÍAS
OFICINA CIUDAD REGION CATEGORIA TITULO SALARI TRIENIO
11 Valencia Este O
12 Barcelona Este 1 Director 50.000 1.000
13 Alicante Este 2 Jefe Sección 40.000 800
21 Madrid Centro 3 Administrativo 35.000 700
22 Toledo Centro 4 Comercial 35.000 700
5 Empl. almacén 25.000 500
DEPARTAMENTOS DPTOFICINAS
DEPTNO NOMBRE CODIGO OFICINA DEPARTAMENTO TELEFONO
1 Dirección 100 11 1 963.981.000
2 Administración 101 11 2 963.981.100
3 Comercial 102 11 3 963.981.200
4 Almacén 103 11 4 963.981.300
5 Informática 104 11 5 963.981.400
105 12 2 933.551.000
106 12 3 933.551.100
107 12 4 933.551.200
108 13 3 961.671.000
109 21 2 913.641.000
110 21 3 913.641.100
111 21 4 913.641.200
112 22 3 925.871.000
EMPLEADOS
NUM NOMBRE EDAD DEPARTAMENTO CATEGORÍA CONTRATO
1000 Antonio Gutierrez 45 100 1 12/01/1989
1001 Paloma Blanco 56 100 2 17/03/1992
1002 Antonio Pazos 52 100 3 14/03/1986
1003 Ana Garcia 27 101 2 23/10/1995
1004 Amparo Beltran 28 101 3 04/02/1998
1005 Enrique Gomez 36 101 3 05/07/2000
1006 Nieves Soler 25 105 2 13/03/1996
1007 Juan Jose Velasco 34 105 3 14/02/1997
1008 Isidro Perez 22 109 2 06/05/2000
1009 Ignacio Lopez 38 109 3 07/04/1990
17) Nombre y edad de los empleados ordenados por nombre de forma descendente.
28) Categoría y suma de los sueldos de los empleados, contando trienios, de cada una de
las categorías.
29) Nombre y suma de los sueldos de los empleados, contando trienios, de cada oficina.
30) Titulo y suma de trienios de las categorías cuya suma supera las 10000
31) Nombre del departamento y número de empleados de los departamentos que tienen
más de 5 empleados.
32) Nombre y sueldo, contando trienios, de los empleados cuyos sueldos son inferiores
a la media de sueldos de la empresa.
33) Título de las categorías donde existe un empleado con contrato anterior a 1990.
34) Nombre de los empleados que tiene un contrato más antiguo que cualquier
empleado del departamento de 'Informática'.