0% encontró este documento útil (0 votos)
85 vistas7 páginas

Lenguaje SQL (Parte 2)

Este documento describe el uso de operaciones sobre conjuntos como union, intersect y except en el lenguaje SQL. Explica cómo estas operaciones permiten combinar resultados de consultas y eliminar o conservar duplicados. También cubre el uso de funciones de agregación como avg, count, max y min para resumir datos a nivel de grupos.

Cargado por

Rosaly D. Muñoz
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)
85 vistas7 páginas

Lenguaje SQL (Parte 2)

Este documento describe el uso de operaciones sobre conjuntos como union, intersect y except en el lenguaje SQL. Explica cómo estas operaciones permiten combinar resultados de consultas y eliminar o conservar duplicados. También cubre el uso de funciones de agregación como avg, count, max y min para resumir datos a nivel de grupos.

Cargado por

Rosaly D. Muñoz
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

Instituto Técnico Superior Comunitario

(ITSC)

Nombre:
Rosaly Dorali

Apellido:
Muñoz Rodríguez

Matrícula:
2020-0563

Carrera:
Soporte Informático

Materia:
Fundamentos de Base de Datos 105

Sección:
01

Maestro:
Luis Bessewell Féliz

Tema:
Lenguaje SQL (Parte 2)

Fecha:
Viernes 06 Nov. 2020
Fundamentos de Bases de Datos
Lenguaje SQL

6.5 Operaciones sobre conjuntos


Las operaciones union, intersect y except operan sobre relaciones y corresponden a las operaciones
del álgebra relacional ∪, ∩ y –. Al igual que la unión, intersección y diferencia de conjuntos en el
álgebra relacional, las relaciones que participan en las operaciones han de ser compatibles; esto es,
deben tener el mismo conjunto de atributos.

A continuación se demuestra cómo se pueden formular en SQL varias de las consultas de ejemplo
utilizando consultas que incluyen las operaciones union, intersect y except de dos conjuntos. Los dos
conjuntos utilizados serán: el conjuntos de todos los clientes que tienen una cuenta en el banco, que
puede obtenerse con:

select nombre-cliente
from impositor

y el conjunto de todos los clientes que tienen un préstamo en el banco, que puede obtenerse con:

select nombre-cliente
from prestatario

Apartir de ahora, las letras i y p se utilizarán para hacer referencia a las relaciones obtenidas como
resultado de las dos consultas anteriores.

6.5.1. La operación unión


Para encontrar todos los clientes que poseen un préstamo, una cuenta o las dos cosas en el banco, se
escribirá:

(select nombre-cliente
from impositor)
“unión”
(select nombre-cliente
from prestatario)

A diferencia de la cláusula select, la operación union (unión) elimina duplicados automáticamente.


Así, en la consulta anterior.

Ejemplo

Si un cliente, Santos tiene varias cuentas o préstamos (o ambas cosas) en el banco, entonces Santos
aparecerá sólo una vez en el resultado. Para conservar los duplicados, se utilizará union all en lugar
de union:

(select nombre-cliente
from impositor)
“union all”
(select nombre-cliente
from prestatario)

El número de tuplas duplicadas en el resultado es igual al número total de duplicados que aparecen
en i y p. Así, si Santos tuviese tres cuentas y dos préstamos en el banco, entonces en el resultado
aparecerían cinco tuplas con el nombre de Santos.

6.5.2. La operación intersección


Para encontrar todos los clientes que tienen tanto un préstamo como una cuenta en el banco, se
escribirá:

(select distinct nombre-cliente


from impositor)
“intersect”
(select distinct nombre-cliente
from prestatario)

La operacion intersect (intersección) elimina duplicados automáticamente. Así, en la consulta


anterior.
Ejemplo

Si un cliente, Santos—tiene varias cuentas o préstamos (o ambas cosas) en el banco, entonces Santos
aparecerá solo una vez en el resultado. Para conservar los duplicados se utilizará intersect all en lugar
de intersect:

(select nombre-cliente
from impositor)
“intersect all”
(select nombre-cliente
from prestatario)

El número de tuplas duplicadas en el resultado es igual al mínimo número de duplicados que aparecen
en i y p. Así, si Santos tuviese tres cuentas y dos préstamos en el banco, entonces en el resultado de
la consulta aparecerían dos tuplas con el nombre de Santos.

6.5.3. La operación excepto


Para encontrar todos los clientes que tienen cuenta pero no tienen ningún préstamo en el banco se
escribirá:

(select distinct nombre-cliente


from impositor)
“except”
(select distinct nombre-cliente
from prestatario)

La operacion except (excepto) elimina duplicados automáticamente. Así, en la consulta anterior, una
tupla con el nombre de Santos aparecerá en el resultado (exactamente una vez), sólo si Santos tiene
una cuenta en el banco, pero no tiene ningún préstamo en el mismo. Para conservar los duplicados,
se utilizará except all en lugar de except:
(select nombre-cliente
from impositor)
“except all”
(select nombre-cliente
from prestatario)

El número de copias duplicadas de una tupla en el resultado es igual al número de copias duplicadas
de dicha tupla en i menos el número de copias duplicadas de la misma tupla en p, siempre que la
diferencia sea positiva. Así, si Santos tuviese tres cuentas y un préstamo en el banco, entonces en el
resultado aparecerían dos tuplas con el nombre de Santos. Si, por el contrario, dicho cliente tuviese
dos cuentas y tres préstamos en el banco, no habrá ninguna tupla con el nombre de Santos en el
resultado.

6.6 Funciones de agregación


Las funciones de agregación son funciones que toman una colección (un conjunto o multiconjunto)
de valores como entrada y producen un único valor como salida.

SQL proporciona cinco funciones de agregación primitivas:

• Media: avg
• Mínimo: min
• Máximo: max
• Total: sum
• Cuenta: count

La entrada a sum y avg debe ser una colección de números, pero los otros operadores pueden operar
sobre colecciones de datos de tipo no numérico, tales como las cadenas.

Ejemplo
Considérese la consulta “Obtener la media de saldos de las cuentas de la sucursal Navacerrada”. Esta
consulta se puede formular del modo siguiente:

select avg (saldo)


from cuenta
where nombre-sucursal = ‘Navacerrada’

El resultado de esta consulta será una relación con un único atributo, que contendrá una única fila con
un valor numérico correspondiente al saldo medio de la sucursal Navacerrada. Opcionalmente se
puede dar un nombre al atributo resultado de la relación, usando la cláusula as.

Existen situaciones en las cuales sería deseable aplica las funciones de agregación no sólo a un único
conjunto de tuplas sino también a un grupo de conjuntos de tuplas; esto se especifica en SQL usando
la cláusula group by. El atributo o atributos especificados en la cláusula group by se usan para formar
grupos. Las tuplas con el mismo valor en todos los atributos especificados en la cláusula group by se
colocan en un grupo.

Ejemplo
considérese la consulta “Obtener el saldo medio de las cuentas de cada sucursal”. Dicha consulta se
formulará del modo siguiente:
select nombre-sucursal, avg (saldo)
from cuenta
group by nombre-sucursal

La conservación de duplicados es importante al calcular una media. Supóngase que los saldos de las
cuentas en la (pequeña) sucursal de nombre «Galapagar» son 1.000 €, 3.000 €, 2.000 € y 1.000 €. El
saldo medio es 7.000/4 =1.750 €. Si se eliminasen duplicados se obtendría un resultado erróneo
(6.000/3 = 2.000 €).

Hay casos en los que se deben eliminar los duplicados antes de calcular una función de agregación.
Para eliminar duplicados se utiliza la palabra clave distinct en la expresión de agregación. Como
ejemplo considérese la consulta «Obtener el número de impositores de cada sucursal». En este caso
un impositor sólo se debe contar una vez, sin tener en cuenta el número de cuentas que el impositor
pueda tener. La consulta se formulará del modo siguiente:

select nombre-sucursal, count (distinct nombrecliente)


from impositor, cuenta
where impositor.número-cuenta = cuenta.númerocuenta
group by nombre-sucursal

A veces es más útil establecer una condición que se aplique a los grupos que una que se aplique a las
tuplas. Por ejemplo, podemos estar interesados sólo en aquellas sucursales donde el saldo medio de
cuentas es superior a 1.200 €. Esta condición no es aplicable a una única tupla; se aplica a cada grupo
construido por la cláusula group by. Para expresar este tipo de consultas se utiliza la cláusula having
de SQL. Los predicados de la cláusula having se aplican después de la formación de grupos, de modo
que se pueden usar las funciones de agregación. Esta consulta se expresa en SQL del modo siguiente:

select nombre-sucursal, avg (saldo)


from cuenta
group by nombre-sucursal
having avg (saldo) > 1200

A veces se desea tratar la relación entera como unúnico grupo. En casos de este tipo no se usa la
cláusula group by. Considérese la consulta «Obtener el saldo medio de todas las cuentas». Esta
consulta se formulará del modo siguiente:

select avg (saldo)


from cuenta

Con mucha frecuencia se usa la función de agregación count para contar el número de tuplas de una
relación.

La notación para esta función en SQL es count (*). Así, para encontrar el número de tuplas de la
relación cliente, se escribirá

select count (*)


from cliente

SQL no permite el uso de distinct con count (*). Sí se permite, sin embargo, el uso de distinct con
max y min, incluso cuando el resultado no cambia. Se puede usar la palabra clave all en lugar de
distinct para especificar la retención de duplicados, pero como all se especifica de manera
predeterminada, no es necesario incluir dicha cláusula.

Si en una misma consulta aparece una cláusula where y una cláusula having, se aplica primero el
predicado de la cláusula where. Las tuplas que satisfagan el predicado de la cláusula where se colocan
en grupos según la cláusula group by. La cláusula having, si existe, se aplica entonces a cada grupo;
los grupos que no satisfagan el predicado de la cláusula having se eliminan. La cláusula select utiliza
los grupos restantes para generar las tuplas resultado de la consulta.

Para ilustrar el uso de la cláusula where y la cláusula having dentro de la misma consulta considérese
el ejemplo «Obtener el saldo medio de cada cliente que vive en Madrid y tiene como mínimo tres
cuentas».

select impositor.nombre-cliente, avg (saldo)


from impositor, cuenta, cliente
where impositor.número-cuenta
= cuenta.número-cuenta and
impositor.nombre-cliente
= cliente.nombre-cliente and
ciudad-cliente = ‘Madrid’
group by impositor.nombre-cliente
having count (distinct impositor.número-cuenta) >= 3

6.7 Valores nulos


SQL permite el uso de valores nulos para indicar la ausencia de información sobre el valor de un
atributo. En un predicado se puede usar la palabra clave especial null para comprobar si un valor es
nulo. Así, para encontrar todos los números de préstamo que aparecen en la relación préstamo con
valores nulos para importe se escribe:

select número-préstamo
from préstamo
where importe is null

El predicado is not null pregunta por la ausencia de un valor nulo.

El uso de un valor nulo en las operaciones aritméticas y de comparación causa varias complicaciones.
Ahora se describe cómo maneja SQL los valores nulos. El resultado de una expresión aritmética
(incluyendo por ejemplo +,–,* o /) es nulo si cualquiera de los valores de entrada es nulo. SQL trata
como desconocido el resultado de cualquier comparación que implique un valor nulo (aparte de is
null e is not null).

Dado que el predicado en una cláusula where puede incluir operaciones booleanas tales como and, or
y not sobre los resultados de las comparaciones, las definiciones de estas operaciones se extienden
para manejar el valor desconocido, como se describe en el Apartado 3.3.4.

• and: el resultado de cierto and desconocido es desconocido, falso and desconocido es falso,
mientras que desconocido and desconocido es desconocido.

• or: el resultado de cierto or desconocido es cierto, falso or desconocido es desconocido,


mientras que desconocido or desconocido es desconocido.
SQL define el resultado de una instrucción SQL de la forma:

select … from R1, …., Rn where P

para contener (proyecciones de) tuplas en R1 × … × Rn para las que el predicado P se evalúa a cierto.
Si el predicado se evalúa a falso o desconocido para una tupla de R1 × … × Rn (la proyección de) la
tupla no se añade al resultado.

SQL también permite determinar si el resultado de una comparación es desconocido en lugar de cierto
o falso usando las cláusulas is unknown (es desconocido) e is not unknown (no es desconocido)

La existencia de valores nulos también complica el procesamiento de los operadores de agregación.


Supóngase que algunas tuplas en la relación préstamo tienen valor nulo para el atributo importe.
Considérese en ese caso la siguiente consulta, que calcula el total de todas las cantidades prestadas:

select sum (importe)


from préstamo

Los valores que van a ser sumados en la consulta anterior incluyen valores nulos, puesto que algunas
tuplas tienen valor nulo para el atributo importe. En lugar de decir que la suma total es nula, la norma
SQL establece que el operador sum debería ignorar los valores nulos de su entrada.

En general, las funciones de agregación tratan los valores nulos según la regla siguiente: todas las
funciones de agregación excepto count(*) ignoran los valores nulos de la colección de datos de
entrada. Como resultado de ignorar los valores nulos, la colección de valores de entrada puede resultar
vacía. El cálculo de count de una colección vacía se define como 0 y todas las demás operaciones de
agregación devuelven un valor nulo cuando se aplican sobre una colección de datos vacía. El efecto
de los valores nulos en algunas de las construcciones más complicadas de SQL puede ser más sutil.

En SQL:1999 se introdujo un tipo de datos boolean, que puede tomar los valores cierto, falso y
desconocido. Las funciones de agregación some (algún) y every (cada), que significan exactamente
lo que se espera de ellas, se pueden aplicar a una colección de valores booleanos.

También podría gustarte