2.2. Algebra relacional.
El Algebra relacional es un lenguaje de consulta procedural. Consta de un conjunto de operaciones que toman como entrada una o dos relaciones y producen como resultado una nueva relación, por lo tanto, es posible anidar y combinar operadores. Hay ocho operadores en el álgebra relacional que construyen relaciones y manipulan datos, estos son:
Tabla 2-1 - Operadores del Algebra relacional Las operaciones de proyección, producto, unión, diferencia, y selección son llamadas primitivas, puesto que las otras tres se pueden definir en términos de estas. Se hace necesario en este punto incluir un modelo de datos de ejemplo en el cual trabajar para generar ejemplos de comandos y operadores. Para este efecto se incluye un modelo básico de administración de RadioTaxis. El Gráfico que se presenta a continuación representa el Modelo conceptual (Modelo Lógico) o Diagrama de Entidad-Relación | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Los Esquemas de relaciones que se pueden construir a partir de este modelo son los siguientes:
Dueño = {rut, nombre, teléfono, dirección, vigencia}
Chofer = {rut, nombre, teléfono, dirección, fecha_licencia_desde, fecha_licencia_hasta, vigencia}
Vale = {correlativo, hora_desde, hora_hasta, metraje_total, tarifa_total}
Móvil = {patente, rut_dueño, rut_chofer, marca, modelo, año}
Viaje = {correlativo_vale, patente_movil, Hora_Desde, hora_hasta, origen, destino, tarifa, metraje}
2.2.1. Selección.
El operador de selección opta por tuplas que satisfagan cierto predicado, se utiliza la letra griega sigma minúscula (σ) para señalar la selección. El predicado aparece como subíndice de σ. La Relación que constituye el argumento se da entre paréntesis después de la σ.
Ejemplos : 2.2.2. Proyección.
La operación de proyección permite quitar ciertos atributos de la relación, esta operación es unaria, copiando su relación base dada como argumento y quitando ciertas columnas, La proyección se señala con la letra griega pi mayúscula (Π). Como subíndice de Π se coloca una lista de todos los atributos que se desea aparezcan en el resultado. La relación argumento se escribe después de Π entre paréntesis.
Ejemplos : 2.2.3. Producto.
En álgebra relacional el producto de dos relaciones A y B es:
A Veces B o A X B Produce el conjunto de todas las tuplas t tales que t es el encadenamiento de una tupla aperteneciente a A y de una b que pertenece a B. se utiliza el símbolo X para representar el producto. Ejemplos: 2.2.4. Unión.
En álgebra relacional la unión de dos relaciones compatibles[3]A y B es:
A UNION B o A ∪ B Produce el conjunto de todas las tuplas que pertenecen ya sea a A o a B o a Ambas. Al igual que en teoría de conjuntos el símbolo ∪ representa aquí la unión de dos relaciones. Ejemplo : Devuelve todos los Dueños y los Choferes. 2.2.5. Intersección.
En álgebra relacional la intersección de dos relaciones compatibles A y B
A INTERSECCION B o A ∩ B Produce el conjunto de todas las tuplas pertenecientes a A y B. Al igual que en teoría de conjuntos el símbolo ∩ representa aquí la intersección entre dos relaciones. Ejemplo: Devuelve todos los dueños que también son choferes 2.2.6. Diferencia
En álgebra relacional la diferencia entre dos relaciones compatibles A y B
A MENOS B o A – B Produce el conjunto de todas las tuplas t que pertenecen a A y no pertenecen a B. Ejemplo: Devuelve todos los dueños que NO son choferes 2.2.7. Join o Reunión.
En álgebra relacional el JOIN entre el atributo X de la relación A con el atributo Y de la relación B produce el conjunto de todas las tuplas t tal que t es el encadenamiento de una tupla a perteneciente a A y una tupla b perteneciente a B que cumplen con el predicado “A.X comp B.Y es verdadero” (siendo comp un operador relacional y los atributos A.X y B.Y pertenecientes al mismo dominio). Si el operador relacional “comp” es “=” entonces el conjunto resultante es un EQUI-JOIN. Si se quita uno de éstos (usando una proyección) entonces el resultado es un JOIN-NATURAL.
Ejemplo : 2.2.8. División
En álgebra relacional el operador de división divide la relación A con grado m + n por la relación B entregando como resultado una relación con grado m. El atributo m + i de A y el atributo i de B deben estar definidos dentro del mismo dominio. Así el resultado de
A DIVIDIDO POR B o A / B produce la relación C con un sólo atributo X, tal que cada valor de x de C.X aparece como un valor de A.X, y el par de valores (x, y) aparece en A para todos los valores y que aparecen en B.
Ejemplo:
Selecciona todos los autos a cuyos choferes les caduca la licencia el 01/01/1999 http://www.jorgesanchez.net/bd/ejerciciosAR/algebra1.pdf
Ejercicios de álgebra relacional (1)
Tenemos el siguiente esquema relacional de base de datos:
CLIENTES(Nº Cliente, Nombre, Dirección, Teléfono, Población)
PRODUCTO(Cod Producto, Descripción, Precio)
VENTA(Cod Producto, Nº Cliente, Cantidad, Id Venta)
La tabla de clientes almacena información sobre cada posible cliente
de nuestra empresa.
En la tabla de productos almacenamos información sobre cada
producto de la empresa.
La tabla de ventas relaciona a las dos anteriores utilizando el atributo
cod Producto para indicar el producto que se venda, y el atributo Nº
Cliente para indicar el cliente al que vendimos el producto.
Sobre ella se realizan estos ejercicios (las soluciones están al final):
[1] Realizar una consulta que muestre el nombre de los
clientes de Palencia
[2] Indicar el código y descripción de los productos cuyo
código coincida con su descripción
[3] Obtener el nombre de los clientes junto con el
identificador de venta y la cantidad vendida, de aquellos
productos de los que se vendieron más de 500 unidades
[4] Nombre de los clientes de la tabla Clientes que no
aparecen en la tabla de ventas (Clientes que no han
comprado nada)
[5] Nombre de los clientes que han comprado todos los
productos de la empresa
[6] Identificador de las ventas cuya cantidad supera a la
cantidad vendida en la venta número 18
[7] Productos que no se han comprado nunca en Palencia
[8] Productos que se han vendido tanto en Palencia como en
Valladolid [9] Poblaciones a las que hemos vendido todos nuestros
productos
Imaginemos que añadimos la tabla de facturas que se relaciona con
la de ventas, de modo que a la tabla de ventas le añadimos el nº de
Factura con la que se relaciona. En la tabla de factura indicamos la
fecha, el número y si se pago o no (un 1 significa pagado, un 0 que
no está pagada). Cada factura se corresponde con varias ventas y
con un solo cliente, para lo cual se varía el diseño:
FACTURA(Nº Factura, Fecha, Pagada, Nº Cliente)
VENTA(Cod Producto, Nº Factura, Cantidad, Id Venta)
[10] Obtener el nombre de los clientes que tienen alguna
factura sin pagar
[11] Clientes que han pagado todas sus facturas
Soluciones
Lo primero es renombrar las tablas para facilitar su manejo en las
consultas:
Ventas V
oductos P
Clientes C
→
→
→
Pr
[1] ( ) ∏nombre σ población="Palencia"
C
[2] ( ) ∏cód Pr oducto,Descripción
σ cod Pr oducto=Descripción
P
[3] (( ) ) ∏C.Nombre,P.Descripción,V.Cantidad σ cantidad >500V ∞P∞C
[4] C (C V) ∏nombre −∏nombre ∞
[5] Se aplica una división sobre toda la tabla de ventas
mezclada con clientes y se divide entre la tabla de
productos (quedan los clientes que tienen todas las
combinaciones de la tabla de productos) (( ( )):( )) ∏nombre ∏C.nombre,C.NºCliente,V.codproducto
C∞V ∏codproducto
P
[6] Dividimos la consulta en dos, primero obtenemos la fila
correspondiente a la venta nº 18 y luego la combinamos
con todas las demás eliminando las que tengan ventas
menores
'
'
. '.
18
V V
V V
V cantidad V Cantidad
idVenta
∞>
σ =
→
[7] Se resuelve sacando primero los productos que sí se
compraron en Palencia y luego restándoles del conjunto
total de Productos
P Pale
C V Pale
codproducto
V codproducto población Palencia
∏ −
∏ .
((σ =" "
)∞ )→
[8] Se trata de una intersección entre los productos de
Palencia y los productos comprados en Valladolid
Pale Vall
C V Vall
C V Pale
V codproducto población Valladolid
V codproducto población Palencia
I
∏ ∞ →
∏ ∞ →
=
=
(( ) )
(( ) )
. " "
. " "
σ
σ
[9] Necesitamos sacar la lista de poblaciones con los códigos
de productos que se han vendido en ellas. Luego
dividimos entre los códigos de la tabla de productos y
quedarán las poblaciones en las que se han pedido todos
los códigos
(( ( )):( )) ∏poblacion ∏C.población,V.codproducto
C∞V ∏codprodcto P
[10]
( ( )) ∏nombre,nº factura σ
Pagada=0
C∞F[11] La consulta no se puede hacer como la anterior, ya que
puede haber clientes que hayan pagado algunas facturas y
otras no. Se parte de la consulta anterior para hacer esto:
Pagadores
C F Pagadores
nombre
nombre Pagada
∏ −
∏ (σ =0
( ∞ ))→
|
viernes, 7 de junio de 2013
Algebra relacional
Modelo ERR (Ejercicios Resueltos )
http://lopez99.wordpress.com/2010/03/23/modelos-entidad-relacion-trabajo/
EJERCICIO 1
A partir del siguiente enunciado se desea realiza el modelo entidad-relación.
“Una empresa vende productos a varios clientes. Se necesita conocer los datos
personales de los clientes (nombre, apellidos, dni, dirección y fecha de nacimiento). Cada
producto tiene un nombre y un código, así como un precio unitario. Un cliente puede
comprar varios productos a la empresa, y un mismo producto puede ser comprado por
varios clientes.
Los productos son suministrados por diferentes proveedores. Se debe tener en cuenta
que un producto sólo puede ser suministrado por un proveedor, y que un proveedor puede
suministrar diferentes productos. De cada proveedor se desea conocer el NIF, nombre y
dirección”.
EJERCICIO 2
A partir del siguiente enunciado se desea realizar el modelo entidad-relación.
“Se desea informatizar la gestión de una empresa de transportes que reparte paquetes
por toda España. Los encargados de llevar los paquetes son los camioneros, de los que
se quiere guardar el dni, nombre, teléfono, dirección, salario y población en la que vive.
De los paquetes transportados interesa conocer el código de paquete, descripción,
destinatario y dirección del destinatario. Un camionero distribuye muchos paquetes, y un
paquete sólo puede ser distribuido por un camionero.
De las provincias a las que llegan los paquetes interesa guardar el código de provincia y
el nombre. Un paquete sólo puede llegar a una provincia. Sin embargo, a una provincia
pueden llegar varios paquetes.
De los camiones que llevan los camioneros, interesa conocer la matrícula, modelo, tipo y
potencia. Un camionero puede conducir diferentes camiones en fechas diferentes, y un
camión puede ser conducido por varios camioneros”.
EJERCICIOS MODELO ENTIDAD-RELACIÓN . PÁG. 2
EJERCICIO 3
A partir del siguiente enunciado diseñar el modelo entidad-relación.
“Se desea diseñar la base de datos de un Instituto. En la base de datos se desea guardar
los datos de los profesores del Instituto (DNI, nombre, dirección y teléfono). Los
profesores imparten módulos, y cada módulo tiene un código y un nombre. Cada alumno
está matriculado en uno o varios módulos. De cada alumno se desea guardar el nº de
expediente, nombre, apellidos y fecha de nacimiento. Los profesores pueden impartir
varios módulos, pero un módulo sólo puede ser impartido por un profesor. Cada curso
tiene un grupo de alumnos, uno de los cuales es el delegado del grupo”.
EJERCICIO 4
A partir del siguiente supuesto diseñar el modelo entidad-relación:
“Se desea diseñar una base de datos para almacenar y gestionar la información
empleada por una empresa dedicada a la venta de automóviles, teniendo en cuenta los
siguientes aspectos:
La empresa dispone de una serie de coches para su venta. Se necesita conocer la
matrícula, marca y modelo, el color y el precio de venta de cada coche.
Los datos que interesa conocer de cada cliente son el NIF, nombre, dirección, ciudad y
número de teléfono: además, los clientes se diferencian por un código interno de la
empresa que se incrementa automáticamente cuando un cliente se da de alta en ella. Un
cliente puede comprar tantos coches como desee a la empresa. Un coche determinado
solo puede ser comprado por un único cliente.
El concesionario también se encarga de llevar a cabo las revisiones que se realizan a
cada coche. Cada revisión tiene asociado un código que se incrementa automáticamente
por cada revisión que se haga. De cada revisión se desea saber si se ha hecho cambio de
filtro, si se ha hecho cambio de aceite, si se ha hecho cambio de frenos u otros. Los
coches pueden pasar varias revisiones en el concesionario”.
EJERCICIO 5
A partir del siguiente supuesto diseñar el modelo entidad-relación:
“La clínica “SAN PATRÁS” necesita llevar un control informatizado de su gestión de
pacientes y médicos.
De cada paciente se desea guardar el código, nombre, apellidos, dirección, población,
EJERCICIOS MODELO ENTIDAD-RELACIÓN . PÁG. 3
provincia, código postal, teléfono y fecha de nacimiento.
De cada médico se desea guardar el código, nombre, apellidos, teléfono y especialidad.
Se desea llevar el control de cada uno de los ingresos que el paciente hace en el hospital.
Cada ingreso que realiza el paciente queda registrado en la base de datos. De cada
ingreso se guarda el código de ingreso (que se incrementará automáticamente cada vez
que el paciente realice un ingreso), el número de habitación y cama en la que el paciente
realiza el ingreso y la fecha de ingreso.
Un médico puede atender varios ingresos, pero el ingreso de un paciente solo puede ser
atendido por un único médico. Un paciente puede realizar varios ingresos en el hospital”.
EJERCICIO 6
Se desea informatizar la gestión de una tienda informática. La tienda dispone de una serie
de productos que se pueden vender a los clientes.
“De cada producto informático se desea guardar el código, descripción, precio y número
de existencias. De cada cliente se desea guardar el código, nombre, apellidos, dirección y
número de teléfono.
Un cliente puede comprar varios productos en la tienda y un mismo producto puede ser
comprado por varios clientes. Cada vez que se compre un artículo quedará registrada la
compra en la base de datos junto con la fecha en la que se ha comprado el artículo.
La tienda tiene contactos con varios proveedores que son los que suministran los
productos. Un mismo producto puede ser suministrado por varios proveedores. De cada
proveedor se desea guardar el código, nombre, apellidos, dirección, provincia y número
de teléfono”.
EJERCICIO 7
Pasa el modelo entidad-relación del ejercicio 1 al modelo relacional. Diseña las tablas en
Access, realiza las relaciones que consideres oportunas e inserta cinco registros en cada
una de las tablas.
EJERCICIO 8
Pasa el modelo entidad-relación del ejercicio 2 al modelo relacional. Diseña las tablas en
Access, realiza las relaciones que consideres oportunas e inserta cinco registros en cada
una de las tablas.
EJERCICIOS MODELO ENTIDAD-RELACIÓN . PÁG. 4
EJERCICIO 9
Pasa el modelo entidad-relación del ejercicio 3 al modelo relacional. Diseña las tablas en
Access, realiza las relaciones que consideres oportunas e inserta cinco registros en cada
una de las tablas.
¿Cómo quedaría el modelo relacional suponiendo que cada profesor sólo imparte un
módulo y cada módulo es impartido por sólo un profesor?
EJERCICIO 10
Transforma el modelo entidad-relación del ejercicio 4 al modelo relacional. Diseña las
tablas en Access, realiza las relaciones que consideres oportunas e inserta cinco registros
en cada una de las tablas.
Si un cliente sólo puede comprar un coche en el concesionario, y un coche sólo puede ser
comprado por un cliente, ¿cómo quedaría el modelo relacional?
EJERCICIO 11
Transforma el modelo entidad-relación del ejercicio 5 a modelo relacional. Diseña las
tablas en Access, realiza las relaciones que consideres oportunas e inserta cinco registros
en cada una de las tablas.
EJERCICIO 12
Transforma el modelo entidad-relación del ejercicio 6 al modelo relacional. Diseña las
tablas en Access, realiza las relaciones que consideres oportunas e inserta cinco registros
en cada una de las tablas.
EJERCICIO 13
Considera la siguiente relación PERSONA-TIENE HIJOS-PERSONA. Una persona puede
tener muchos hijos/as o ninguno. Una persona siempre es hijo/a de otra persona. Los
atributos de la persona son dni, nombre, dirección y teléfono. Transformarlo al modelo
relacional.
EJERCICIOS MODELO ENTIDAD-RELACIÓN . PÁG. 5
EJERCICIO 14
A partir del siguiente enunciado, diseñar el modelo entidad-relación.
“En la biblioteca del centro se manejan fichas de autores y libros. En la ficha de cada
autor se tiene el código de autor y el nombre. De cada libro se guarda el código, título,
ISBN, editorial y número de página. Un autor puede escribir varios libros, y un libro puede
ser escrito por varios autores. Un libro está formado por ejemplares. Cada ejemplar tiene
un código y una localización. Un libro tiene muchos ejemplares y un ejemplar pertenece
sólo a un libro.
Los usuarios de la biblioteca del centro también disponen de ficha en la biblioteca y sacan
ejemplares de ella. De cada usuario se guarda el código, nombre, dirección y teléfono.
Los ejemplares son prestados a los usuarios. Un usuario puede tomar prestados varios
ejemplares, y un ejemplar puede ser prestado a varios usuarios. De cada préstamos
interesa guardar la fecha de préstamo y la fecha de devolución”.
Pasar el modelo entidad-relación resultante al modelo relacional. Diseñar las tablas en
Access, realizar las relaciones oportunas entre tablas e insertar cinco registros en cada
una de las tablas.
EJERCICIO 15
A partir del siguiente supuesto realizar el modelo entidad-relación y pasarlo a modelo
relacional.
“A un concesionario de coches llegan clientes para comprar automóviles. De cada coche
interesa saber la matrícula, modelo, marca y color. Un cliente puede comprar varios
coches en el concesionario. Cuando un cliente compra un coche, se le hace una ficha en
el concesionario con la siguiente información: dni, nombre, apellidos, dirección y teléfono.
Los coches que el concesionario vende pueden ser nuevos o usados (de segunda mano).
De los coches nuevos interesa saber el número de unidades que hay en el concesionario.
De los coches viejos interesa el número de kilómetros que lleva recorridos.
El concesionario también dispone de un taller en el que los mecánicos reparan los coches
que llevan los clientes. Un mecánico repara varios coches a lo largo del día, y un coche
puede ser reparado por varios mecánicos. Los mecánicos tienen un dni, nombre,
apellidos, fecha de contratación y salario. Se desea guardar también la fecha en la que se
repara cada vehículo y el número de horas que se tardado en arreglar cada automóvil”.
Pasar el modelo entidad-relación resultante al modelo relacional. Diseñar las tablas en
Access, realizar las relaciones oportunas entre tablas e insertar cinco registros en cada
una de las tablas.
EJERCICIOS MODELO ENTIDAD-RELACIÓN . PÁG. 6
EJERCICIO 16
La liga de fútbol profesional, presidida por Don Ángel María Villar, ha decidido informatizar
sus instalaciones creando una base de datos para guardar la información de los partidos
que se juegan en la liga.
Se desea guardar en primer lugar los datos de los jugadores. De cada jugador se quiere
guardar el nombre, fecha de nacimiento y posición en la que juega (portero, defensa,
centrocampista…). Cada jugador tiene un código de jugador que lo identifica de manera
única.
De cada uno de los equipos de la liga es necesario registrar el nombre del equipo, nombre
del estadio en el que juega, el aforo que tiene, el año de fundación del equipo y la ciudad
de la que es el equipo. Cada equipo también tiene un código que lo identifica de manera
única. Un jugador solo puede pertenecer a un único equipo.
De cada partido que los equipos de la liga juegan hay que registrar la fecha en la que se
juega el partido, los goles que ha metido el equipo de casa y los goles que ha metido el
equipo de fuera. Cada partido tendrá un código numérico para identificar el partido.
También se quiere llevar un recuento de los goles que hay en cada partido. Se quiere
almacenar el minuto en el que se realizar el gol y la descripción del gol. Un partido tiene
varios goles y un jugador puede meter varios goles en un partido.
Por último se quiere almacenar, en la base de datos, los datos de los presidentes de los
equipos de fútbol (dni, nombre, apellidos, fecha de nacimiento, equipo del que es
presidente y año en el que fue elegido presidente). Un equipo de fútbol tan sólo puede
tener un presidente, y una persona sólo puede ser presidente de un equipo de la liga.
Pasar el modelo entidad-relación resultante al modelo relacional. Diseñar las tablas en
Access, realizar las relaciones oportunas entre tablas e insertar cinco registros en cada
una de las tablas.
EJERCICIO 17
A partir del siguiente supuesto diseñar el modelo entidad-relación.
“Se desea informatizar la gestión de un centro de enseñanza para llevar el control de los
alumnos matriculados y los profesores que imparten clases en ese centro. De cada
profesor y cada alumno se desea recoger el nombre, apellidos, dirección, población, dni,
fecha de nacimiento, código postal y teléfono.
Los alumnos se matriculan en una o más asignaturas, y de ellas se desea almacenar el
código de asignatura, nombre y número de horas que se imparten a la semana. Un
profesor del centro puede impartir varias asignaturas, pero una asignatura sólo es
impartida por un único profesor. De cada una de las asignaturas se desea almacenar
EJERCICIOS MODELO ENTIDAD-RELACIÓN . PÁG. 7
también la nota que saca el alumno y las incidencias que puedan darse con él.
Además, se desea llevar un control de los cursos que se imparten en el centro de
enseñanza. De cada curso se guardará el código y el nombre. En un curso se imparten
varias asignaturas, y una asignatura sólo puede ser impartida en un único curso.
Las asignaturas se imparten en diferentes aulas del centro. De cada aula se quiere
almacenar el código, piso del centro en el que se encuentra y número de pupitres de que
dispone. Una asignatura se puede dar en diferentes aulas, y en un aula se pueden
impartir varias asignaturas. Se desea llevar un registro de las asignaturas que se imparten
en cada aula. Para ello se anotará el mes, día y hora en el que se imparten cada una de
las asignaturas en las distintas aulas.
La dirección del centro también designa a varios profesores como tutores en cada uno de
los cursos. Un profesor es tutor tan sólo de un curso. Un curso tiene un único tutor. Se
habrá de tener en cuenta que puede que haya profesores que no sean tutores de ningún
curso”.
Una vez construido el modelo E-R pasarlo al modelo relacional. Diseñar las tablas en
Access, hacer las relaciones oportunas e insertar 5 registros en cada una de las tablas.
EJERCICIO 18
“Una empresa necesita organizar la siguiente información referente a su organización
interna.
La empresa está organizada en una serie de departamentos. Cada departamento tiene un
código, nombre y presupuesto anual. Cada departamento está ubicado en un centro de
trabajo. La información que se desea guardar del centro de trabajo es el código de centro,
nombre, población y dirección del centro.
La empresa tiene una serie de empleados. Cada empleado tiene un teléfono, fecha de
alta en la empresa, NIF y nombre. De cada empleado también interesa saber el número
de hijos que tiene y el salario de cada empleado.
A esta empresa también le interesa tener guardada información sobre los hijos de los
empleados. Cada hijo de un empleado tendrá un código, nombre y fecha de nacimiento.
Se desea mantener también información sobre las habilidades de los empleados (por
ejemplo, mercadotecnia, trato con el cliente, fresador, operador de telefonía, etc…). Cada
habilidad tendrá una descripción y un código”.
Sobre este supuesto diseñar el modelo E/R y el modelo relacional teniendo en cuenta los
siguientes aspectos.
Un empleado está asignado a un único departamento. Un departamento estará
compuesto por uno o más empleados.
EJERCICIOS MODELO ENTIDAD-RELACIÓN . PÁG. 8
Cada departamento se ubica en un único centro de trabajo. Estos se componen de
uno o más departamentos.
Un empleado puede tener varios hijos.
Un empleado puede tener varias habilidades, y una misma habilidad puede ser
poseída por empleados diferentes.
Un centro de trabajo es dirigido por un empleado. Un mismo empleado puede
dirigir centros de trabajo distintos.
Realizar el diseño de la base de datos en Access e introducir cinco registros en cada una
de las tablas.
EJERCICIO 19
Se trata de realizar el diseño de la base de datos en el modelo E/R para una cadena de
hoteles.
“Cada hotel (del que interesa almacenar su nombre, dirección, teléfono, año de
construcción, etc.) se encuentra clasificado obligatoriamente en una categoría (por
ejemplo, tres estrellas) pudiendo bajar o aumentar de categoría.
Cada categoría tiene asociada diversas informaciones, como, por ejemplo, el tipo de IVA
que le corresponde y la descripción.
Los hoteles tiene diferentes clases de habitaciones (suites, dobles, individuales, etc.), que
se numeran de forma que se pueda identificar fácilmente la planta en la que se
encuentran. Así pues, de cada habitación se desea guardar el código y el tipo de
habitación.
Los particulares pueden realizar reservas de las habitaciones de los hoteles. En la reserva
de los particulares figurarán el nombre, la dirección y el teléfono.
Las agencias de viaje también pueden realizar reservas de las habitaciones. En caso de
que la reserva la realiza una agencia de viajes, se necesitarán los mismos datos que para
los particulares, además del nombre de la persona para quien la agencia de viajes está
realizando la reserva.
En los dos casos anteriores también se debe almacenar el precio de la reserva, la fecha
de inicio y la fecha de fin de la reserva”.
EJERCICIO 20
Imagina que una agencia de seguros de tu municipio te ha solicitado una base de datos
mediante la cual llevar un control de los accidentes y las multas. Tras una serie de
entrevistas, has tomado las siguientes notas:
“Se desean registrar todas las personas que tienen un vehículo. Es necesario guardar los
EJERCICIOS MODELO ENTIDAD-RELACIÓN . PÁG. 9
datos personales de cada persona (nombre, apellidos, dirección, población, teléfono y
DNI).
De cada vehículo se desea almacenar la matrícula, la marca y el modelo. Una persona
puede tener varios vehículos, y puede darse el caso de un vehículo pertenezca a varias
personas a la vez.
También se desea incorporar la información destinada a gestionar los accidentes del
municipio. Cada accidente posee un número de referencia correlativo según orden de
entrada a la base de datos. Se desea conocer la fecha, lugar y hora en que ha tenido
lugar cada accidente. Se debe tener en cuenta que un accidente puede involucrar a varias
personas y varios vehículos.
Se desea llevar también un registro de las multas que se aplican. Cada multa tendrá
asignado un número de referencia correlativo. Además, deberá registrarse la fecha, hora,
lugar de infracción e importe de la misma. Una multa solo se aplicará a un conductor e
involucra a un solo vehículo.”
Realiza el modelo E-R y pásalo al modelo relacional. Diseña después las tablas en
Access, realiza las relaciones oportunas entre ellas e inserta cinco registros en cada una
de las tablas.
EJERCICIO 21
Una agencia de viajes desea informatizar toda la gestión de los viajeros que acuden a la
agencia y los viajes que estos realizan. Tras ponernos en contacto con la agencia, ésta
nos proporciona la siguiente información.
“La agencia desea guardar la siguiente información de los viajeros: dni, nombre, dirección
y teléfono.
De cada uno de los viajes que maneja la agencia interesa guardar el código de viaje,
número de plazas, fecha en la que se realiza el viaje y otros datos. Un viajero puede
realizar tantos viajes como desee con la agencia. Un viaje determinado sólo puede ser
cubierto por un viajero.
Cada viaje realizado tiene un destino y un lugar de origen. De cada uno de ellos se quiere
almacenar el código, nombre y otros datos que puedan ser de interés. Un viaje tiene un
único lugar de destino y un único lugar de origen”.
Realizar el modelo E-R y pasarlo al modelo de datos relacional. Diseñar las tablas en
Access, realizar las oportunas relaciones entre tablas e introducir cinco registros en cada
una de las tablas.
EJERCICIOS MODELO ENTIDAD-RELACIÓN . PÁG. 10
EJERCICIO 22
Una empresa desea diseñar una base de datos para almacenar en ella toda la
información generada en cada uno de los proyectos que ésta realiza.
“De cada uno de los proyectos realizados interesa almacenar el código, descripción,
cuantía del proyecto, fecha de inicio y fecha de fin. Los proyectos son realizados por
clientes de los que se desea guardar el código, teléfono, domicilio y razón social. Un
cliente puede realizar varios proyectos, pero un solo proyecto es realizado por un único
cliente.
En los proyectos participan colaboradores de los que se dispone la siguiente información:
nif, nombre, domicilio, teléfono, banco y número de cuenta. Un colaborador puede
participar en varios proyectos. Los proyectos son realizados por uno o más colaboradores.
Los colaboradores de los proyectos reciben pagos. De los pagos realizados se quiere
guardar el número de pago, concepto, cantidad y fecha de pago. También interesa
almacenar los diferentes tipos de pagos que puede realizar la empresa. De cada uno de
los tipos de pagos se desea guardar el código y descripción. Un tipo de pago puede
pertenecer a varios pagos”.
miércoles, 29 de mayo de 2013
Subconsultas
Una consulta genera un result set (tabla)
Una consulta puede generar :
-Dato (valor)
-Un registro(tupla)
-Una tabla (una columna o n columnas)
Una subconsulta es utilizar uno de los resultados en otra consulta
las subconsultas van en el where
where campo (operador realacional) consulta
<,>,=, <> ----------->la consulta debe dar un solo valor
campo in (subconsulta)-----------------> la subconsulta puede ser una columna o un valor
---listar empleados del dpart 20 que tienen tocayos en el 50
nombre in (select nombre from e where d=50)
-----Listar por departamentos cantidad empleados que hay y el departamento debe tener un empleados llamado jorge
>any
----Empleados con salario mayor a cualquier jefe
<=all
Cuando hay group by o funciones se usa having
having count (e.id)>x
inteligencia de negocio, arquitectura de software
select * from employees;
select e1.employee_id, e1.first_name from employees e1 where e1.salary> select
avg(d.manager_id)from ;
select e.department_id, e.employee_id, count( distinct e.employee_id) from employees e group by e.department_id, e.employee_id having count( distinct e.employee_id)>4
join departments d1 on e.employee_id=d1.
join departments d2 on e.department_id=;
---Mostrar empleados cuyo salario sea mayor a la mitad del maximo s
alario de la region el cual el trabaja
select * from employees e where e.sala;ry> select max(e2) from employees e2 ---
where q.region_id =r1.region_id
---subconsultas en el from
select nombre from (select e.employee_id as codigo , e.first_name as nombre from employees e where e.department_id=50);
select nombre from (select e.employee_id as codigo , e.first_name as nombre from employees e where e.department_id=50 )join departments d on d.manager_id=codigo ;
select nombre from (select e.employee_id , e.first_name as nombre from employees e where e.department_id=50 )join departments d on d.manager_id=employee_id ;
---- con alias
select nombre from ((select e.employee_id , e.first_name as nombre from employees e where e.department_id=50 )) M join departments d on d.manager_id=M.employee_id;
select Round((count(e.employee_id)/ total)*100 ) from employees e cross join (select count(*) total from employees ) group by e.department_id, total ;
----mostrar por departamento empleado que ams gana
select from (select max(e.salary ) , e.department_id ,m.department_id from employees e join employees m on m.department_id=e.department_id group by e.department_id, m.department_id) as ta
join employees n on ta.
inteligencia de negocio, arquitectura de software
select * from employees;
select e1.employee_id, e1.first_name from employees e1 where e1.salary> select
avg(d.manager_id)from ;
select e.department_id, e.employee_id, count( distinct e.employee_id) from employees e group by e.department_id, e.employee_id having count( distinct e.employee_id)>4
join departments d1 on e.employee_id=d1.
join departments d2 on e.department_id=;
---Mostrar empleados cuyo salario sea mayor a la mitad del maximo s
alario de la region el cual el trabaja
select * from employees e where e.sala;ry> select max(e2) from employees e2 ---
where q.region_id =r1.region_id
---subconsultas en el from
select nombre from (select e.employee_id as codigo , e.first_name as nombre from employees e where e.department_id=50);
select nombre from (select e.employee_id as codigo , e.first_name as nombre from employees e where e.department_id=50 )join departments d on d.manager_id=codigo ;
select nombre from (select e.employee_id , e.first_name as nombre from employees e where e.department_id=50 )join departments d on d.manager_id=employee_id ;
---- con alias
select nombre from ((select e.employee_id , e.first_name as nombre from employees e where e.department_id=50 )) M join departments d on d.manager_id=M.employee_id;
select Round((count(e.employee_id)/ total)*100 ) from employees e cross join (select count(*) total from employees ) group by e.department_id, total ;
----mostrar por departamento empleado que ams gana
select from (select max(e.salary ) , e.department_id ,m.department_id from employees e join employees m on m.department_id=e.department_id group by e.department_id, m.department_id) as ta
join employees n on ta.
jueves, 23 de mayo de 2013
Group by
Permite calcular totales de grupo, se usa solo cuando se necesite una función , si se necesita mostar por nombre o por algo solo se ordena
select
from
where
group by Exp-grupo
----------------------------------------------------------------------------------------------
--No se puede poner asterisco
select * from employees e join departments d on d.department_id=e.department_id order by d.department_name;
select e.department_id from employees e group by e.department_id;
select d.department_name from employees e join departments d on d.department_id=e.department_id group by d.department_name;
select d.department_name from employees e join departments d on d.department_id=e.department_id group by d.department_id, d.department_name;
-----------------------Total de salarios de Accouting 20300
--------Suma
select d.department_name , sum(e.salary)from employees e join departments d on d.department_id=e.department_id group by d.department_id, d.department_name;
-------Promedio
select d.department_name , sum(e.salary), avg(e.salary) from employees e join departments d on d.department_id=e.department_id group by d.department_id, d.department_name;
Finance 51600 8600
Shipping 156400 3475,555555555555555555555555555555555556
Public Relations 10000 10000
Executive 58000 19333,3333333333333333333333333333333333
Purchasing 24900 4150
Administration 4400 4400
Accounting 20300 10150
Human Resources 6500 6500
IT 28800 5760
Sales 304500 8955,882352941176470588235294117647058824
Marketing 19000 9500
---Ordenar por el d.department_id, d.department_name, e.employee_id
select d.department_name, sum(e.salary), avg(e.salary) from employees e join departments d on d.department_id=e.department_id group by d.department_id, d.department_name, e.employee_id ;
Otras funciones
------Como todas las funciones son en una agrupacion ´por departamento entonces todas las funciones se ponen en una consulta
select d.department_name , sum(e.salary) , max(e.salary), avg(e.salary), min(e.salary) , variance (e.salary) from employees e join departments d on d.department_id=e.department_id group by d.department_id, d.department_name;
Mostrar departamentos con menos de 3 empleados
select d.department_name, sum(e.salary), avg(e.salary), count(e.employee_id) from employees e right join departments d on d.department_id=e.department_id group by
d.department_id, d.department_name having count (e.employee_id ) <3;
select count (*) from employees;
---- cuenta id aunque hayan repetidas
select count (department_id) from employees;
----Cuenta id sin repetir , sumar salarios distintos , promediar salarios distintos
select count (distinct department_id) from employees;
select
from
where
group by Exp-grupo
----------------------------------------------------------------------------------------------
--No se puede poner asterisco
select * from employees e join departments d on d.department_id=e.department_id order by d.department_name;
select e.department_id from employees e group by e.department_id;
select d.department_name from employees e join departments d on d.department_id=e.department_id group by d.department_name;
select d.department_name from employees e join departments d on d.department_id=e.department_id group by d.department_id, d.department_name;
-----------------------Total de salarios de Accouting 20300
--------Suma
select d.department_name , sum(e.salary)from employees e join departments d on d.department_id=e.department_id group by d.department_id, d.department_name;
-------Promedio
select d.department_name , sum(e.salary), avg(e.salary) from employees e join departments d on d.department_id=e.department_id group by d.department_id, d.department_name;
Finance 51600 8600
Shipping 156400 3475,555555555555555555555555555555555556
Public Relations 10000 10000
Executive 58000 19333,3333333333333333333333333333333333
Purchasing 24900 4150
Administration 4400 4400
Accounting 20300 10150
Human Resources 6500 6500
IT 28800 5760
Sales 304500 8955,882352941176470588235294117647058824
Marketing 19000 9500
---Ordenar por el d.department_id, d.department_name, e.employee_id
select d.department_name, sum(e.salary), avg(e.salary) from employees e join departments d on d.department_id=e.department_id group by d.department_id, d.department_name, e.employee_id ;
Otras funciones
------Como todas las funciones son en una agrupacion ´por departamento entonces todas las funciones se ponen en una consulta
select d.department_name , sum(e.salary) , max(e.salary), avg(e.salary), min(e.salary) , variance (e.salary) from employees e join departments d on d.department_id=e.department_id group by d.department_id, d.department_name;
Mostrar departamentos con menos de 3 empleados
select d.department_name, sum(e.salary), avg(e.salary), count(e.employee_id) from employees e right join departments d on d.department_id=e.department_id group by
d.department_id, d.department_name having count (e.employee_id ) <3;
select count (*) from employees;
---- cuenta id aunque hayan repetidas
select count (department_id) from employees;
----Cuenta id sin repetir , sumar salarios distintos , promediar salarios distintos
select count (distinct department_id) from employees;
Funciones de Expresiones Regulares
REGEXP_LIKE
REGEXP_LIKE(cadena, expreg)
REGEXP_LIKE
is similar to the LIKE
condition, except REGEXP_LIKE
performs regular expression matching instead of the simple pattern matching performed by LIKE
. This condition evaluates strings using characters as defined by the input character set.This condition complies with the POSIX regular expression standard and the Unicode Regular Expression Guidelines. For more information, please refer to Appendix C, " Oracle Regular Expression Support".
regexp_like_condition::=
Description of the illustration regexp_like_condition.gif
source_string
is a character expression that serves as the search value. It is commonly a character column and can be of any of the datatypesCHAR
,VARCHAR2
,NCHAR
,NVARCHAR2
,CLOB
, orNCLOB
.pattern
is the regular expression. It is usually a text literal and can be of any of the datatypesCHAR
,VARCHAR2
,NCHAR
, orNVARCHAR2
. It can contain up to 512 bytes. If the datatype ofpattern
is different from the datatype ofsource_string
, Oracle convertspattern
to the datatype ofsource_string
. For a listing of the operators you can specify inpattern
, please refer to Appendix C, " Oracle Regular Expression Support".match_parameter
is a text literal that lets you change the default matching behavior of the function. You can specify one or more of the following values formatch_parameter
:
'i'
specifies case-insensitive matching.'c'
specifies case-sensitive matching.'n'
allows the period (.), which is the match-any-character wildcard character, to match the newline character. If you omit this parameter, the period does not match the newline character.'m'
treats the source string as multiple lines. Oracle interprets^
and$
as the start and end, respectively, of any line anywhere in the source string, rather than only at the start or end of the entire source string. If you omit this parameter, Oracle treats the source string as a single line.
'ic'
, then Oracle uses case-sensitive matching. If you specify a character other than those shown above, then Oracle returns an error.
If you omitmatch_parameter
, then:
- The default case sensitivity is determined by the value of the
NLS_SORT
parameter. - A period (.) does not match the newline character.
- The source string is treated as a single line.
See Also:
"LIKE "
Examples
The following query returns the first and last names for those employees with a first name of Steven or Stephen (where
first_name
begins with Ste
and ends with en
and in between is either v
or ph)
:SELECT first_name, last_name FROM employees WHERE REGEXP_LIKE (first_name, '^Ste(v|ph)en$'); FIRST_NAME LAST_NAME -------------------- ------------------------- Steven King Steven Markle Stephen StilesThe following query returns the last name for those employees with a double vowel in their last name (where
last_name
contains two adjacent occurrences of either a
, e
, i
, o
, or u
, regardless of case):SELECT last_name FROM employees WHERE REGEXP_LIKE (last_name, '([aeiou])\1', 'i'); LAST_NAME ------------------------- De Haan Greenberg Khoo Gee Greene Lee Bloom Feeney
REGEXP_REPLACE
Description of the illustration regexp_replace.gifREGEXP_REPLACE
extends the functionality of theREPLACE
function by letting you search a string for a regular expression pattern. By default, the function returnssource_char
with every occurrence of the regular expression pattern replaced withreplace_string
. The string returned is in the same character set assource_char
. The function returnsVARCHAR2
if the first argument is not a LOB and returnsCLOB
if the first argument is a LOB.This function complies with the POSIX regular expression standard and the Unicode Regular Expression Guidelines. For more information, please refer toAppendix C, "Oracle Regular Expression Support".
source_char
is a character expression that serves as the search value. It is commonly a character column and can be of any of the datatypesCHAR
,VARCHAR2
,NCHAR
,NVARCHAR2
,CLOB
orNCLOB
.pattern
is the regular expression. It is usually a text literal and can be of any of the datatypesCHAR
,VARCHAR2
,NCHAR
, orNVARCHAR2
. It can contain up to 512 bytes. If the datatype ofpattern
is different from the datatype ofsource_char
, Oracle Database convertspattern
to the datatype ofsource_char
. For a listing of the operators you can specify inpattern
, please refer to Appendix C, "Oracle Regular Expression Support".replace_string
can be of any of the datatypesCHAR
,VARCHAR2
,NCHAR
,NVARCHAR2
,CLOB
, orNCLOB
. Ifreplace_string
is aCLOB
orNCLOB
, then Oracle truncatesreplace_string
to 32K. Thereplace_string
can contain up to 500 backreferences to subexpressions in the form\n
, wheren
is a number from 1 to 9. Ifn
is the backslash character inreplace_string
, then you must precede it with the escape character (\\
). For more information on backreference expressions, please refer to the notes to "Oracle Regular Expression Support", Table C-1.position
is a positive integer indicating the character ofsource_char
where Oracle should begin the search. The default is 1, meaning that Oracle begins the search at the first character ofsource_char
.occurrence
is a nonnegative integer indicating the occurrence of the replace operation:
If you specify 0, then Oracle replaces all occurrences of the match. If you specify a positive integern
, then Oracle replaces then
th occurrence.match_parameter
is a text literal that lets you change the default matching behavior of the function. This argument affects only the matching process and has no effect onreplace_string
. You can specify one or more of the following values formatch_parameter
:
'i'
specifies case-insensitive matching.'c'
specifies case-sensitive matching.'n'
allows the period (.), which is the match-any-character character, to match the newline character. If you omit this parameter, the period does not match the newline character.'m'
treats the source string as multiple lines. Oracle interprets^
and$
as the start and end, respectively, of any line anywhere in the source string, rather than only at the start or end of the entire source string. If you omit this parameter, Oracle treats the source string as a single line. 'x' ignores whitespace characters. By default, whitespace characters match themselves.If you specify multiple contradictory values, Oracle uses the last value. For example, if you specify'ic'
, then Oracle uses case-sensitive matching. If you specify a character other than those shown above, then Oracle returns an error.If you omitmatch_parameter
, then:
The default case sensitivity is determined by the value of theNLS_SORT
parameter. A period (.) does not match the newline character. The source string is treated as a single line.See Also:
The following example examinesphone_number
, looking for the patternxxx
.xxx
.xxxx
. Oracle reformats this pattern with (xxx
)xxx
-xxxx
.SELECT REGEXP_REPLACE(phone_number, '([[:digit:]]{3})\.([[:digit:]]{3})\.([[:digit:]]{4})', '(\1) \2-\3') "REGEXP_REPLACE" FROM employees; REGEXP_REPLACE -------------------------------------------------------------------------------- (515) 123-4567 (515) 123-4568 (515) 123-4569 (590) 423-4567 . . .The following example examinescountry_name
. Oracle puts a space after each non-null character in the string.SELECT REGEXP_REPLACE(country_name, '(.)', '\1 ') "REGEXP_REPLACE" FROM countries; REGEXP_REPLACE -------------------------------------------------------------------------------- A r g e n t i n a A u s t r a l i a B e l g i u m B r a z i l C a n a d a . . .The following example examines the string, looking for two or more spaces. Oracle replaces each occurrence of two or more spaces with a single space.SELECT REGEXP_REPLACE('500 Oracle Parkway, Redwood Shores, CA', '( ){2,}', ' ') "REGEXP_REPLACE" FROM DUAL; REGEXP_REPLACE -------------------------------------- 500 Oracle Parkway, Redwood Shores, CA
select * from employees; select first_name, REGEXP_COUNT( first_name, '^[f-i]' ) as pattern_count from employees; ------- SELECT first_name, last_name FROM employees WHERE REGEXP_LIKE (first_name, '^Ste(v|ph)en$'); ---Reempaza algo SELECT REGEXP_REPLACE(phone_number, '([[:digit:]]{3})\.([[:digit:]]{3})\.([[:digit:]]{4})', '(\1) \2-\3') "REGEXP_REPLACE" FROM employees; SELECT REGEXP_REPLACE(first_name, 'a', 'b') "REGEXP_REPLACE" FROM employees; --The following example examines country_name. Oracle puts a space after each non-null character in the string. SELECT REGEXP_REPLACE(country_name, '(.)', '\1 ') "REGEXP_REPLACE" FROM countries; --El metacaracter () porner expresion dentro de otra --- REGEXP_COUNT si se ponen en el where es para comparar si se pone en el select es para retornar ---- En que posicion de la cadena se cumple la expresion ejemplo le[a-c] alea retornaria 2 SELECT last_name, REGEXP_INSTR(last_name, '[aeiou]') FROM hr.employees; ----Saca un pedazo de la cadena SELECT last_name, REGEXP_SUBSTR(last_name, '^[AC]') FROM hr.employees; ---i, j retorna cuantas la letra cuando aparezca j veces Ana 1,2 retorna la segunda a ---i a partir de cual numero j:cantidad de ocurrencias SELECT last_name, REGEXP_SUBSTR ( Upper(last_name), 'A',1,2) FROM hr.employees; ---a partir del caracter 5 hay una a SELECT last_name, REGEXP_SUBSTR ( Upper(last_name), 'A',5,1) FROM hr.employees; SELECT * FROM hr.employees where REGEXP_SUBSTR(last_name, 'a')=hr.last_name; ----Start at 3rd position, extract 2 characters from the last ---- SELECT last_name, REGEXP_SUBSTR(last_name, '..',3) FROM hr.employees;
Suscribirse a:
Entradas (Atom)