You are on page 1of 9

ESCUELA POLITÉCNICA NACIONAL

FACULTAD DE INGENIERÍA DE SISTEMAS


BASES DE DATOS

NOMBRE: Alex Francisco Carrera Alvarez

TEMA: Consultas y Subconsultas

OBJETIVOS:
Crear un modelo E-R y aplicar la relación Supertipo y Subtipo mediante el uso de PowerDesigner para así tener un
dominio mayor en el uso y creación de modelos E-R.
Analizar y diferenciar entre los supertipos y subtipos en un modelo E-R

MARCO TEÓRICO:

Usaremos un modelo entidad relación de una entidad bancaria para desarrollar el marco teórico.

SUBCONSULTAS ANIDADAS

SQL proporciona un mecanismo para anidar subconsultas. Las subconsultas son expresiones select-from-where que
están anidadas dentro de otra consulta. Una finalidad habitual de las subconsultas es llevar a cabo comprobaciones
de pertenencia a conjuntos, hacer comparaciones de conjuntos y determinar cardinalidades de conjuntos. Estos usos
se estudian en los apartados siguientes.

COMPARACIÓN DE CONJUNTOS
EJEMPLO:

“Determinar el nombre de todas las sucursales que poseen activos mayores que, al menos, una sucursal de
Arganzuela”.

select distinct T.nombre_sucursal


from sucursal as T, sucursal as S
where T.activos > S.activos and S.ciudad_sucursal = ’Arganzuela’
SQL ofrece, sin embargo, un estilo alternativo de formular la consulta anterior. La expresión: “mayor que, al menos,
una” se representa en SQL por > some Este constructor permite volver a escribir la consulta de forma más parecida a
la formulación de la consulta en lenguaje natural.

EJEMPLO:

“Determinar el nombre de todas las sucursales que poseen activos mayores que, al menos, una sucursal de
Arganzuela”.

select nombre_sucursal
from sucursal
where activos > some (select activos
from sucursal
where ciudad_sucursal = ’Arganzuela’)

La subconsulta usada genera el conjunto de todos los valores de activos para todas las sucursales situadas en
Arganzuela.

La comparación > some de la cláusula where de la cláusula select más externa es cierta si el valor del atributo activos
de la tupla es mayor que, al menos, un miembro del conjunto de todos los valores de activos de las sucursales de
Arganzuela.

SQL también permite realizar las comparaciones < some, <= some, >= some, = some y <> some.
Además = some es idéntico a in, mientras que <> some no es lo mismo que not in.

En SQL, la palabra clave any es sinónimo de some. Las primeras versiones de SQL sólo admitían
any. Versiones posteriores añadieron la alternativa some para evitar la ambigüedad lingüística de la
palabra inglesa any en su idioma original.

IN Y NOT IN

La conectiva in comprueba la pertenencia a un conjunto, donde el conjunto es la colección de valores resultado de


una cláusula select. La
conectiva not in comprueba la no pertenencia a un conjunto.

EJEMPLO:

Determinar los clientes que son prestatarios del banco y que aparecen en la lista de titulares de cuentas obtenida en
la subconsulta anterior. Esto se consigue anidando la subconsulta en un select más externo. La consulta resultante
es:

select distinct nombre_cliente


from prestatario
where nombre_cliente in (select nombre_cliente
from impositor)

EJEMPLO:

Encontrar todos los clientes que tienen concedido un préstamo en el banco pero no tienen abierta cuenta.

select distinct nombre_cliente


from prestatario
where nombre_cliente not in (select nombre_cliente
from impositor)
Los operadores in y not in también se pueden utilizar sobre conjuntos enumerados.
EJEMPLO:

La consulta siguiente selecciona los nombres de los clientes que tienen concedido un préstamo en el banco y cuyos
nombres no son ni Santos ni Gómez.

select distinct nombre_cliente


from prestatario
where nombre_cliente not in (’Santos’, ’Gómez’)

COMPROBACIÓN DE RELACIONES VACÍAS

SQL incluye la posibilidad de comprobar si las subconsultas tienen alguna tupla en su resultado. El constructor exists
devuelve el valor true si su argumento subconsulta no resulta vacía. Mediante el constructor exists se puede
formular la consulta

EJEMPLO:

“Determinar todos los clientes que tienen tanto una


cuenta abierta como un préstamo concedido en el banco” de otra forma más:

select nombre_cliente
from prestatario
where exists (select *
from impositor
where impositor.nombre_cliente = prestatario.nombre_cliente);

Devolver una lista de clientes que compraron el artículo "lapiz":

select cliente,numero
from facturas as f
where exists
(select *from Detalles as d
where f.numero=d.numerofactura
and d.articulo='lapiz');

Mediante el constructor not exists se puede comprobar la inexistencia de tuplas en el resultado de las subconsultas.
Se puede utilizar el constructor not exists para simular la operación de continencia de conjuntos (es decir,
superconjuntos). Se puede escribir “la relación A contiene a la relación B” cómo “not exists (B except A)”.

EJEMPLO:

“Determinar todos los clientes que tienen una cuenta en todas las sucursales de Arganzuela”. Hay que comprobar
para cada cliente si el conjunto de todas las sucursales en las que dicho cliente tiene cuenta contiene al conjunto de
todas las sucursales de Arganzuela. Mediante el constructor except se puede formular la consulta del modo
siguiente:

select distinct S.nombre_cliente


from impositor as S
where not exists ((select nombre_sucursal
from sucursal
where ciudad_sucursal = ’Arganzuela’)
except
(select R.nombre_sucursal
from impositor as T, cuenta as R
where T.número_cuenta = R.número_cuenta and
S.nombre_cliente = T.nombre_cliente))
VISTAS

No resulta deseable que todos los usuarios vean el modelo lógico completo. Las consideraciones de seguridad
pueden exigir que se ocultan ciertos datos a los usuarios. Considérese una persona que necesita saber el número de
préstamo y el nombre de la sucursal de un cliente, pero no necesita ver el importe de ese préstamo. Esa persona
debería ver una relación descrita (módulo renombramiento de atributos) en SQL mediante

select nombre_cliente, prestatario.número_préstamo, nombre_sucursal


from prestatario, préstamo
where prestatario.número_préstamo = préstamo.número_préstamo

Aparte de las consideraciones de seguridad, puede que se desee crear un conjunto personalizado de relaciones que
se adapte mejor a la intuición de un usuario determinado que el modelo lógico. Puede que a un usuario del
departamento de publicidad, por ejemplo, le guste ver una relación que consista en los clientes que tienen o bien
cuenta abierta o bien préstamo concedido en el banco y las sucursales
con las que trabajan. La relación que se crearía para ese empleado es la siguiente:

(select nombre_sucursal, nombre_cliente


from impositor, cuenta
where impositor.número_cuenta = cuenta.número_cuenta)
union
(select nombre_sucursal, nombre_cliente
from prestatario, préstamo
where prestatario.número_préstamo = préstamo.número_préstamo).

Las relaciones que no forman parte del modelo lógico, pero se hacen visibles a los usuarios como relaciones virtuales
se denominan vistas. Es posible definir un gran número de vistas de cualquier conjunto dado de relaciones reales.

DEFINICIÓN DE VISTAS

Las vistas en SQL se definen mediante la instrucción create view. Para definir una vista hay que darle un nombre e
indicar la consulta que la va a calcular. La forma de la instrucción create view es create view v as <expresión de
consulta> donde <expresión de consulta> es cualquier expresión legal de consulta. El nombre de la vista se
representa mediante v.

EJEMPLO

Considérese la vista consistente en las sucursales y sus clientes. Supóngase que se desea que esta vista se denomine
todos_los_clientes. Esta vista se define de la manera siguiente:

create view todos_los_clientes as


(select nombre_sucursal, nombre_cliente
from impositor, cuenta
where impositor.número_cuenta = cuenta.número_cuenta)
union
(select nombre_sucursal, nombre_cliente
from prestatario, préstamo
where prestatario.número_préstamo = préstamo.número_préstamo)
Una vez definida la vista se puede utilizar su nombre para hacer referencia a la relación virtual que genera.
Utilizando la vista todos_los_clientes se puede determinar el nombre de todos los clientes de la sucursal de
Navacerrada escribiendo

select nombre_cliente
from todos_los_clientes
where nombre_sucursal = ’Navacerrada’
DESARROLLO DE LA PRACTICA:

1. Consultar los nombres de clientes cuyos nombres comienzan con A y que tienen facturas por un total mayor
al cliente de nombre “xxx”

select distinct apellido from cliente, factura where apellido like 'a%' and
total > (select sum(total)from factura
where COD_CLIENTE =(select COD_CLIENTE from cliente where APELLIDO = '001b'));

2. Listar los números de facturas con totales mayores al promedio del total de todos los clientes.

select COD_FACTURA from factura where total > (select AVG(total)from factura);
3. Listar los nombres de clientes que han emitido facturas con un total mayor al promedio del total de todas
las facturas.

select APELLIDO from cliente,factura where total>(select AVG(total) from factura) and
cliente.cod_cliente=factura.cod_cliente;

4. Listar nombres de clientes que no hayan emitido ninguna factura entre dos fechas dadas.

select apellido from cliente where cod_cliente not in (select cod_cliente from factura where fecha between '2017-
11-07' and '2017-11-20' )
5. Listar nombres de clientes que no hayan emitido ninguna factura entre dos fechas dadas.

SELECT NOMBRE_PROD FROM PRODUCTO WHERE COD_PRODUCTO not in ( SELECT COD_PRODUCTO FROM
producto)

6. Listar los nombres de clientes que hayan emitido solo una factura

select apellido , count(cod_factura) as total_factura from cliente, factura where


cliente.COD_CLIENTE = factura.COD_CLIENTE group by APELLIDO having count(COD_FACTURA)=1

7. Listar los nombres de clientes que hayan emitido alguna factura

select apellido, count(cod_factura) as total_factura from cliente, factura where


cliente.COD_CLIENTE=factura.COD_CLIENTE group by apellido having count(COD_FACTURA)>0
8. Listar los clientes que tienen promedios de totales mayores al promedio del cliente de nombre”xxx”

select apellido from CLIENTE ,FACTURA where cliente.COD_CLIENTE = factura.COD_CLIENTE and


(Select AVG (TOTAL) from FACTURA)>(select AVG(TOTAL) from FACTURA,CLIENTE where
apellido ='arauz' and cliente.cod_cliente = factura.COD_CLIENTE )group by apellido

CONCLUSIONES Y RECOMENDACIONES:

 Al usar más de una tabla en FROM se debe tener en cuenta que se produce un producto cartesiano entre las
tablas implicadas.
 Al usar el constructor exists para comprobar la existencia de tuplas en una subconsulta este retorna un valor
booleano dependiendo de lo encontrado.
 Se aconseja usar ; al final de cada instrucción SQL para evitar errores de lectura en momento de ejecución.
 Las instrucciones en SQL tienen su semejante en Álgebra relacional, debido a que SQL es basado en este tipo
de álgebra.
 La vista son una forma segura de crear tablas que no existen solo para que se pueda acceder a ellas sin
necesidad de mostrar el resto de información.
 Se puede evitar lo anterior añadiendo go al final de la instrucción que cree la vista y luego escribimos las
instrucciones sql en las que usaremos esa vista.
 En SQL server una vista debe estar sola en un script y para consultar de esta vista es necesario definir la
instrucción sql en otro script luego de haber creado la vista.
BIBLIOGRAFÍA:

[1] Anonimo. (Sin Registro). Bases de datos relacionales. 12/11/2017, de IBM® IBM Knowledge Center Sitio web:
https://www.ibm.com/support/knowledgecenter/es/SSEPGG_8.2.0/com.ibm.db2.udb.doc/admin/c0004099.htm

[2] Maria Hallo. (SinRegistro). CONCEPTOS DE SQL. 12/11/2017, de Escuela Politecnica Nacional Sitio web:
https://educacionvirtual.epn.edu.ec/pluginfile.php/221597/mod_resource/content/1/MANUAL_DE_SQLREV.pdf

[3] NA. (2016). ¿Qué es un proveedor?. 03/05/2017, de Reviso Sitio web: https://www.reviso.com/es/que-es-un-
proveedor

[4] Julián Pérez Porto y Ana Gardey. (2011). Orden compra. 03/05/2017, de Definicio.de Sitio web:
http://definicion.de/orden-de-compra/

You might also like