Practicas06 PDF
Practicas06 PDF
Bases de Datos I
Eva Gmez Ballester
Paloma Moreda Pozo
Patricio Martnez Barco
Jos Clavel Cerro
Ernesto Prez Lpez
Armando Surez Cueto
Dpto. de Lenguajes y
Sistemas Informticos
Escuela Politcnica Superior
Universidad de Alicante
http://www.dlsi.ua.es/asignaturas/bd1/bd1.html
ndice
sesin 0_______________________________________________ 5
select 1 ______________________________________________ 11
select 2 ______________________________________________ 23
select 3 ______________________________________________ 29
select fecha___________________________________________ 35
conjuntos ____________________________________________ 39
funciones_____________________________________________ 45
group by - having ______________________________________ 59
subselect _____________________________________________ 65
subselect - exists ______________________________________ 71
adicionales 1 __________________________________________ 75
adicionales 2 __________________________________________ 77
adicionales 3 __________________________________________ 79
adicionales 4 __________________________________________ 81
adicionales 5 __________________________________________ 83
adicionales 6 __________________________________________ 85
adicionales 7 __________________________________________ 87
sesin 0
MANEJO DE SQL
WORKSHEET
Objetivos:
Adquirir la destreza mnima para trabajar en el entorno ORACLE SQL
WORKSHEET
Contenidos
Extensiones de Ejemplo:
ASIGNATURAS
cdigo descripcin
crditos crditosp
HI
FBD
DGBD
PC
FP
4.5
6.0
6.0
6.0
9.0
HISTORIA DE LA INFORMATICA
FUNDAMENTOS DE LAS BASES DE DATOS
DISEO Y GESTION DE BASES DE DATOS
PROGRAMACION CONCURRENTE
FUNDAMENTOS DE LA PROGRAMACION
1.5
3.0
1.5
4.5
PROFESORES
IMPARTE
dni
nombre
categora fechainc
dni
asignatura
21111222
21222333
21333444
EVA GOMEZ
MANUEL PALOMAR
RAFAEL ROMERO
TEU
TEU
ASO6
21111222
21111222
21333444
FBD
DGBD
PC
01/10/1993
16/06/1989
16/06/1992
lilo:
teclear la palabra
windows
2.
Usuario: alumno
Contrasea: alumno
Servicio: oracle
Conectar como: normal
Actualmente, Oracle 9.
Tipos de datos
En general, la utilizacin de varias tablas necesita que ellas se puedan relacionar por una
columna comn, en este caso dni de profesor, para la relacin entre imparte y profesor, y cdigo
de asignatura, para la relacin entre asignatura e imparte. Ntese, sin embargo, que en la tabla
imparte el cdigo de asignatura se llama asignatura y en la tabla asignaturas cdigo. En realidad,
tales atributos son comunes porque el dominio es el mismo para ambos y se pueden comparar.
Los dominios vienen definidos por los tipos de datos que ofrece el SGBD.
Los tipos de datos que acompaan en el esquema de BD a cada columna en cada tabla
determinan los valores que pueden tomar stas. Son de capital importancia a la hora de relacionar
tablas en una sentencia select, puesto que slo podremos comparar columnas con idntico tipo de
datos, o a la hora de manipular datos, dado que, como veremos en prximas sesiones, cada tipo
de datos presenta unos requisitos especficos para su manipulacin.
Algunos de los tipos de datos que nos podemos encontrar en ORACLE son:
(1<=n<=4000)
Cadena de caracteres de longitud fija de longitud n (1<=n<=2000)
Cadena de caracteres de longitud variable hasta 2 gigabytes, o 231-1 bytes
Nmeros con precisin p y escala s (1<=p<=38) (-84<=s<=127)
Cadena de caracteres binarios de longitud n (1<=n<=2000)
Cadena de caracteres binarios de longitud variable hasta 2 gigabytes
Datos de tipo fecha, con la forma dd/mm/yyyy(da, mes y ao). Los valores
date deben manejarse encerrados entre comillas simples. Rango vlido desde 1
de enero de 4712 AC hasta el 31 de diciembre de 4712 DC.
La base de datos PROVEEDORES ser la base de datos utilizada durante todo el desarrollo de las prcticas de BD1.
INFORMACIN ADICIONAL
Ayuda en lnea.
Direcciones con ayuda Oracle disponible:
www.oracle.com
www.redcientifica.com/
COLUMN
COLUMN
COLUMN
COLUMN
COLUMN
COLUMN
Y tambin:
select 1
SQL - SELECT
Objetivos:
Introducir al alumno en el SQL y la orden SELECT.
Comentar el esquema lgico propuesto.
Contenidos:
Sistema de informacin propuesto.
La orden SELECT-FROM-WHERE.
Proyecciones, Selecciones.
Tipos de datos.
ORDER BY
Consultas 1.
Se detalla el esquema lgico que describe la BD de PROVEEDORES, ya creada y a
disposicin del alumno, intentando que comprenda su significado, el sistema real que
pretende representar. El esquema lgico es la referencia que permite construir las rdenes
select con las que interrogar a la BD. Las extensiones de cada relacin se incluyen como
ayuda para comprobar la correccin de las rdenes select utilizadas.
Tambin se proporciona informacin sobre las consultas ms sencillas a realizar sobre una
BD.
El resto de la sesin practicar con el primer grupo de requerimientos propuestos, cuyo
objetivo es familiarizarle con el entorno de trabajo SQL WorkSheet de ORACLE, y los
resultados que puede obtener.
11
COLUMNAS
( numvend NUMBER(4),
nomvend VARCHAR2(30),
nombrecomer VARCHAR2(30),
telefono CHAR(11),
calle VARCHAR2(30),
ciudad VARCHAR2(20),
provincia VARCHAR2(20) )
( numpieza VARCHAR2(16),
nompieza VARCHAR2(30),
preciovent NUMBER(9,2))
RESTRICCIONES
Clave Primaria: (numvend)
PRECIOSUM
( numpieza VARCHAR2(16),
numvend NUMBER(4),
preciounit NUMBER(9,2),
diassum NUMBER(3),
descuento NUMBER(2))
PEDIDO
( numpedido NUMBER(5),
numvend NUMBER(4),
fecha DATE )
LINPED
( numpedido NUMBER(5),
numlinea NUMBER(2),
numpieza VARCHAR2(16),
preciocompra NUMBER(9,2),
cantpedida NUMBER(4),
fecharecep DATE,
cantrecibida NUMBER(4))
INVENTARIO
( numpieza VARCHAR2(16),
numbin NUMBER(10),
cantdisponible NUMBER(5),
fecharecuento DATE,
periodorecuen NUMBER(2),
cantminima NUMBER(5) )
PIEZA
12
13
tabla VENDEDOR
numvend
1
2
3
4
5
6
7
8
9
10
11
12
13
8001
8002
8003
100
101
102
200
55
201
nomvend
AGAPITO LAFUENTE
DEL CORRAL
LUCIANO BLAZQUEZ
VAZQUEZ
GODOFREDO MARTIN
MARTINEZ
JUANITO REINA
PRINCESA
JUANITO REINA
PRINCESA
MANOLO PIEDRA
POMEZ
MANUEL PEREZ
RODRIGUEZ
LUISA PINTO HEREDIA
CHEMA PAMUNDI
GUSTAVO DE BASICA
MARIO DUQUE
LIZONDO
JOSE ANTONIO
MARTINEZ JUAN
MANUEL GOMEZ
SANTISTEBAN
JUAN RODRIGUEZ
JUAN
JUAN MARTINEZ
GARCIA
LUIS RODRIGUEZ
SALA
PEDRO GRACIA
MORALES
SALVADOR PLA
GARCIA
SOLEDAD MARTINEZ
ORTEGA
SEVERINO MARTIN
MARTINEZ
LUIS GARCIA
SATORRE
MANUEL ORTUO
LAFUENTE
nombrecomer
telefono
calle
Ciudad
provincia
MECEMSA
96-5782401
ALICANTE
ALICANTE
HARW S.A.
96-3232321
GENERAL LACY, 15 2
B
ALICANTE
ALICANTE
MECEMSA
96-4141722
ALICANTE
ALICANTE
HARW S.A.
903-696969
LO ANGELE
LOS EU'S
LA DEAQUI
98-5363636
GIJON
ASTURIAS
HUMP S.A.
96-5660727
AVIACION 92, 3 I
SAN VICENTE
ALICANTE
DONDEQUIERAS,
1000, 13F
S. FRANCISCO DE
ASIS, 10 1
SOFTHARD
DISTRIBUIDORA S.A.
LA MEJOR S.A.
OLE ESPAA, S.A.
OLE ESPAA, S.A.
98-5696969
ARZOBISPO LOACES
999-2014455
BANESTOESSOFT S.L.
OXFORD BLUES
QUINTANAR DE LA
ORDE
NEW ORLEANS
RIVAS VACIAMADRID
RIVAS VACIAMADRID
LOUISSIANA
MADRID
MADRID
98-0101010
MOROS, 19
GIJON
ASTURIAS
3667788
COLON, 21
VALENCIA
VALENCIA
3667789
COLON, 21
VALENCIA
VALENCIA
ALMORADI
ALICANTE
HALA S.A.
HARW S.A.
3334455
CISCAR, 5
VALENCIA
VALENCIA
HARW S.A.
3335588
SALAMANCA, 102
VALENCIA
VALENCIA
SALAMANCA, 100
VALENCIA
VALENCIA
SOFT S.A.
TABAC & SOFT
5661100
MAYOR, 44
SAN VICENTE
ALICANTE
ASX. S.A.
87879998
PEREZ GALDOS, 54
ALICANTE
ALICANTE
SEVESOFT
5779988
GENERAL LACY, 17
ALICANTE
ALICANTE
HARW S.A.
5889944
POETA ALONSO, 12
ALICANTE
ALICANTE
HALA S.A.
5660788
MAYOR, 64
SAN VICENTE
ALICANTE
tabla PIEZA
numpieza
A-1001-L
C-1002-H
C-1002-J
C-400-Z
DD-0001-210
DD-0001-30
DK144-0001
DK144-0002-P
FD-0001-144
FD-0002-720
M-0001-C
M-0002-C
M-0003-C
O-0001-PP
O-0002-PP
P-0001-33
T-0001-IBM
T-0002-AT
T-0003-AT
X-0001-PC
14
TOLEDO
nompieza
MOUSE ADL 3B
preciovent
7,00
4,00
7,00
18,00
250,00
200,00
1,10
10,00
180,00
150,00
170,00
350,00
400,00
20,00
100,00
350,00
110,00
55,00
120,00
70,00
tabla PEDIDO
numpedido
1
2
3
4
5
6
7
numvend
1
1
2
2
1
5
8002
fecha
05/05/1992
11/10/1992
15/10/1992
16/10/1992
22/10/1992
22/08/1995
02/10/1992
tabla LINPED
numpedido
1
1
1
1
1
2
2
3
3
4
5
6
6
7
numlinea
1
2
3
4
5
1
2
1
2
1
1
1
2
1
numpieza
M-0001-C
P-0001-33
FD-0001-144
DD-0001-210
T-0002-AT
DK144-0002-P
T-0002-AT
DD-0001-210
P-0001-33
O-0002-PP
T-0002-AT
O-0001-PP
O-0002-PP
C-400-Z
preciocompra
300,00
210,00
135,00
150,00
31,00
5,45
30,00
146,00
210,00
99,00
15,00
15,00
99,00
7,00
cantpedida
10
20
20
20
22
100
1
15
3
10
15
1000
2000
45
fecharecep
10/05/1992
10/05/1992
10/05/1992
10/05/1992
17/10/1992
15/10/1992
15/10/1992
17/10/1992
17/10/1992
17/10/1992
11/06/1993
25/08/1995
25/08/1995
09/10/1992
cantrecibida
10
18
20
20
22
101
1
15
3
10
13
1000
1998
8
tabla INVENTARIO
numpieza
DD-0001-30
P-0001-33
O-0002-PP
M-0001-C
M-0003-C
DD-0001-210
FD-0001-144
numbin
1
2
3
4
5
6
7
cantdisponible
120
10
110
15
2
10
10
fecharecuento
15/10/1990
15/10/1992
15/10/1992
15/10/1992
20/10/1992
12/11/1992
12/11/1992
periodorecuen
1
1
2
1
2
2
cantminima
15
5
3
2
0
1
0
15
tabla PRECIOSUM
numpieza
A-1001-L
A-1001-L
A-1001-L
A-1001-L
C-1002-H
C-1002-J
C-400-Z
C-400-Z
DD-0001-210
DD-0001-210
DD-0001-210
DD-0001-30
DK144-0001
DK144-0002-P
DK144-0002-P
FD-0001-144
FD-0001-144
FD-0001-144
FD-0002-720
M-0001-C
M-0001-C
M-0002-C
M-0002-C
M-0003-C
M-0003-C
M-0003-C
O-0001-PP
O-0001-PP
O-0001-PP
O-0002-PP
O-0002-PP
O-0002-PP
O-0002-PP
P-0001-33
P-0001-33
P-0001-33
P-0001-33
P-0001-33
T-0001-IBM
T-0001-IBM
T-0001-IBM
T-0002-AT
T-0002-AT
T-0002-AT
T-0002-AT
T-0002-AT
T-0002-AT
T-0003-AT
T-0003-AT
16
numvend
3
4
100
1
1
1
1
8002
1
2
101
1
1
1
2
1
102
55
1
1
3
9
1
3
4
1
5
55
1
2
5
101
1
2
1
4
3
5
2
100
1
1
2
4
5
100
201
1
3
preciounit
5,00
4,90
4,00
2,00
0,50
1,50
8,50
7,00
150,00
170,00
140,00
120,00
0,56
5,60
5,50
130,00
136,00
120,00
60,00
155,00
180,00
300,00
150,00
350,00
280,00
200,00
19,50
15,00
15,00
99,00
98,75
80,00
75,00
210,00
250,00
280,00
250,00
280,00
90,00
95,00
90,00
30,00
35,00
25,00
33,00
34,00
30,00
77,50
81,45
diassum
1
1
3
3
2
2
4
3
3
5
15
4
3
3
5
3
3
10
3
3
7
1
10
2
7
7
1
7
1
1
1
10
1
5
3
7
2
3
5
5
15
3
5
7
3
2
1
3
descuento
5
15
12
14
7
13
10
15
5
15
15
12
10
10
5
5
LA ORDEN SELECT-FROM-WHERE
Sintaxis general de la orden select
SELECT [ DISTINCT ] listaColumnas
FROM listaTablas
[ WHERE condicin ]
[ GROUP BY listaColumnas
[ HAVING condicin ] ]
[ ORDER BY listaColumnas [ ASC | DESC ] ]
Select-From
Para realizar consultas sobre una base de datos vamos a utilizar la orden SELECT de SQL. Con
la sintaxis que se muestra en el punto anterior seremos capaces de formular cualquier
requerimiento (consulta) sobre las tablas que componen una determinada BD. En este momento
veremos la expresin mnima de la orden, formada por dos clusulas, select y from, que
obligatoriamente tendremos que especificar en cada consulta que realicemos.
Supongamos que sobre la base de datos Ejemplo queremos obtener todos los datos acerca de
los profesores. Debemos, en primer lugar, seleccionar la base de datos, y ejecutamos (en el
Query-language) la siguiente orden
dni
21111222
21222333
21333444
nombre
EVA GMEZ
MANUEL PALOMAR
RAFAEL ROMERO
categora
TEU
TEU
ASO6
categora
TEU
TEU
ASO6
nombre
EVA GMEZ
MANUEL PALOMAR
RAFAEL ROMERO
categora
TEU
TEU
ASO6
17
categora
TEU
ASO6
Ntese, sin embargo, que las dos rdenes siguientes obtienen el mismo resultado, puesto que
la duplicacin se refiere a filas completas y no a una columna en particular:
select distinct dni, categora from profesores
select dni, categora from profesores
resultado:
dni
21111222
21222333
21333444
categora
TEU
TEU
ASO6
La clusula WHERE
Con la orden select-from obtenemos la informacin de las columnas requeridas de toda la
tabla. Si nicamente queremos informacin de aquellas filas que cumplen una determinada
condicin utilizaremos la clusula where.
Pretendemos obtener el nombre de los profesores titulares:
select nombre from profesores where categora = 'TEU'
resultado:
nombre
EVA GMEZ
MANUEL PALOMAR
En la construccin de tales condiciones podemos utilizar las conectivas lgicas AND, OR, y
NOT, as como los parntesis para alterar la evaluacin de izquierda a derecha. Tambin, los
operadores de comparacin >, <, >=, <=, <>
Nombre de los profesores que son titulares o asociados a 6 horas:
select nombre from profesores
where categora = 'TEU' or categora = 'ASO6'
resultado:
18
nombre
EVA GMEZ
MANUEL PALOMAR
RAFAEL ROMERO
La clusula ORDER BY
Podemos ordenar la salida producida por nuestra orden select por valores ascendentes o
descendentes de una columna en particular.
Nombre de las asignaturas ordenadas de menor a mayor nmero de crditos:
select crditos, descripcin from asignaturas order by crditos
resultado:
crditos
4.5
6
6
6
9
descripcin
Historia de la Informtica
Fundamentos de las Bases de Datos
Diseo y Gestin de Bases de Datos
Programacin Concurrente
Fundamentos de la Programacin
crditos
9
6
6
6
descripcin
Fundamentos de la Programacin
Fundamentos de las Bases de Datos
Diseo y Gestin de Bases de Datos
Programacin Concurrente
crditos
4.5
6
6
6
9
descripcin
Historia de la Informtica
Diseo y Gestin de Bases de Datos
Fundamentos de las Bases de Datos
Programacin Concurrente
Fundamentos de la Programacin
Constantes
Se pueden explicitar constantes en la orden select de forma que dicho valor aparezca en
todas las filas:
select 'La asignatura ', descripcin, ' tiene ', crditos, ' crditos'
from asignaturas
order by crditos
resultado:
'laasignatura'
La asignatura
La asignatura
La asignatura
La asignatura
La asignatura
descripcin
HISTORIA DE LA INFORMATICA
FUNDAMENTOS DE LAS BASES DE DATOS
DISEO Y GESTION DE BASES DE DATOS
PROGRAMACION CONCURRENTE
FUNDAMENTOS DE LA PROGRAMACION
19
CONSULTAS SELECT1
1.
2.
Nombre de todas las piezas con un precio de venta menor que 1000.
3.
Nmero, nombre y precio de venta de las piezas de precio de venta mayor que 10 o
menor que 1 euros, ordenadas de menor a mayor precio.
4.
Para cada pieza de la que se conozca algn suministrador, obtener el nmero de pieza y
el descuento, en orden descendente del valor de descuento.
5.
6.
7.
8.
Obtener todos los nmeros de los vendedores de los que se sepa que pueden suministrar
alguna pieza.
9.
20
SOLUCIONES SELECT1
Muchas de las soluciones tambin se muestran en lgebra relacional (AR) y clculo
relacional de tuplas (CRT), que son temas que se tratarn ms adelante en las clases de
teora. En AR y CRT los resultados son relaciones, por lo tanto todas las soluciones que
se muestran aqu corresponden al enunciado al que se est dando respuesta, pero eliminando
duplicados. En CRT se consideran declaradas correctamente todas las variables utilizadas.
--1
select numpieza
from pieza
En AR PIEZA[numpieza]
En CRT {P.numpieza/PIEZA(P)}
--2
select nompieza
from pieza
where preciovent < 1000
En AR PIEZA donde preciovent<1000[nompieza]
En CRT {P.nompieza / PIEZA(P) P.preciovent<1000}
--3
select numpieza, nompieza, preciovent
from pieza
where preciovent > 10
or preciovent < 1
order by preciovent
(la ordenacin no se puede expresar ni En CRT ni En AR)
En AR PIEZA donde preciovent>10 o preciovent<1 [numpieza,nompieza,preciovent]
En CRT { P.nompieza, P.nompieza, P.preciovent /
PIEZA(P) P.preciovent>1000 P.preciovent<10000}
--4
select numpieza, descuento
from preciosum
order by descuento desc
En AR PRECIOSUM [numpieza, descuento]
En CRT {P.numpieza, P.descuento / PRECIOSUM(P)}
--5
select nomvend
from vendedor
where numvend < 6
--6
select distinct nomvend
from vendedor
where numvend < 6
En AR VENDEDOR donde numvend<6 [nomvend]
En CRT {V.nomvend / VENDEDOR(V) V.numvend<6}
--7
select numvend, nomvend
from vendedor
where numvend < 6
En AR VENDEDOR donde numvend<6 [numvend, nomvend]
En CRT {V.numvend, V.nomvend / VENDEDOR(V) V.numvend<6}
--8
select distinct numvend
from preciosum
--9
select numvend, nomvend
from vendedor
where provincia = 'ALICANTE'
--10
select nomvend, nombrecomer
from vendedor
where provincia = 'ALICANTE'
or provincia = 'CASTELLON'
21
or provincia = 'VALENCIA'
--11
select numvend, diassum
from preciosum
where numpieza = 'P-0001-33'
--12
select numpieza
from linped
where numpedido = 1
order by preciocompra desc
--13
select numpedido, numvend
from pedido
where fecha = '15/10/1992'
--14
select distinct numpieza
from preciosum
where descuento is not null
--15
select numvend, numpieza, preciounit
from preciosum
order by numvend, numpieza
22
select 2
CONSULTAS SOBRE
VARIAS TABLAS
Objetivos:
Poder relacionar distintas tablas de la BD para obtener informacin ms compleja.
Contenidos
Utilizacin de ms de una tabla.
Nombres cualificados de atributo.
Sinnimos temporales de tabla.
Tipos de datos: dominios.
Resolucin de requerimientos
nombre
EVA GMEZ
EVA GMEZ
RAFAEL ROMERO
descripcin
En primer lugar, solicitamos nombre (del profesor) y descripcin (de la asignatura). El primer
atributo se encuentra en la tabla profesores, y el segundo en la de asignaturas. La relacin entre
ambas tablas se encuentra en la tabla imparte, que asocia dni de profesor con cdigo de
asignatura que imparte. As, para obtener la informacin que precisamos, necesitamos involucrar
a las tres tablas al mismo tiempo.
Podemos pensar, por clarificar el mecanismo por el que se obtiene este resultado, que el SGBD
recorre la tabla de profesores, tupla por tupla, y busca el valor de dni de cada una en la tabla
imparte. Si encuentra tal valor, en esa tupla de imparte en que lo ha encontrado, aparecer el
cdigo de asignatura, en la columna nominada como asignatura; buscando en la tercera tabla,
asignaturas, obtendr la descripcin y finalmente mostrar en pantalla el nombre y la descripcin
que le corresponde.
23
asignatura
FBD
FBD
FBD
DGBD
DGBD
DGBD
PC
PC
PC
nombre
EVA GOMEZ
MANUEL PALOMAR
RAFAEL ROMERO
EVA GOMEZ
MANUEL PALOMAR
RAFAEL ROMERO
EVA GOMEZ
MANUEL PALOMAR
RAFAEL ROMERO
asignatura
FBD
DGBD
PC
nombre
EVA GOMEZ
EVA GOMEZ
RAFAEL ROMERO
El SGBD primero combinara todas las tuplas con todas de las tablas especificadas en el from:
dni
21111222
21222333
21333444
21111222
21222333
21333444
21111222
21222333
21333444
nombre
EVA GOMEZ
MANUEL PALOMAR
RAFAEL ROMERO
EVA GOMEZ
MANUEL PALOMAR
RAFAEL ROMERO
EVA GOMEZ
MANUEL PALOMAR
RAFAEL ROMERO
categoria
TEU
TEU
ASO6
TEU
TEU
ASO6
TEU
TEU
ASO6
fechainc
01/10/1993
16/06/1989
16/06/1992
01/10/1993
16/06/1989
16/06/1992
01/10/1993
16/06/1989
16/06/1992
dni
21111222
21111222
21111222
21111222
21111222
21111222
21333444
21333444
21333444
asignatura
FBD
FBD
FBD
DGBD
DGBD
DGBD
PC
PC
PC
Esto no es necesariamente real, una de las ventajas de utilizar un SGBD es que las consultas se
procesan de manera eficiente y de forma totalmente transparente para el usuario.
24
Por lo especificado por la where eliminara aquellas tuplas que no cumplieran la condicin, y
nos quedara:
dni
21111222
21111222
21333444
nombre
EVA GOMEZ
EVA GOMEZ
RAFAEL ROMERO
categoria
TEU
TEU
ASO6
fechainc
01/10/1993
01/10/1993
16/06/1992
dni
21111222
21111222
21333444
asignatura
FBD
DGBD
PC
EVA GOMEZ
EVA GOMEZ
RAFAEL ROMERO
ERROR
Al especificar que nos muestre en pantalla el dni del profesor, el SGBD entra en conflicto
puesto que no sabe si nos referimos al de la tabla profesores o al de la tabla imparte. Utilizaremos
el nombre completo de la columna (es indiferente, en este caso, de qu tabla):
select profesores.dni, nombre from profesores, imparte
where profesores.dni = imparte.dni
resultado:
dni
21111222
21111222
21333444
nombre
EVA GMEZ
EVA GMEZ
RAFAEL ROMERO
Se recuerda que la ocurrencia EVA GMEZ est relacionada con dos asignaturas, y es por eso que aparece duplicada
en este resultado. La forma de evitar tuplas idnticas ya se mostr en la sesin anterior.
25
dni
21111222
21333444
26
nombre
EVA GMEZ
RAFAEL ROMERO
CONSULTAS SELECT2
1.
Obtener el nmero de pieza junto con el nombre de todas las provincias desde las que
puede sernos suministrada, en orden descendente del nmero de pieza.
2.
3.
4.
5.
6.
7.
8.
9.
27
SOLUCIONES SELECT2
--2
select distinct numpieza, provincia
from preciosum ps, vendedor v
where ps.numvend = v.numvend
order by numpieza desc
(En AR y C.R.T. no se puede hacer order by)
En AR Vendedor Preciosum [numpieza, provincia]
En CRT {PS.numpieza, V.provincia/ Preciosum(PS)
V(Vendedor(V) PS.numvend=V.numvend) }
--9
select preciounit
from preciosum
where numvend = 100 and numpieza='A-1001-L'
En AR Preciosum donde numvend=100 y numpieza=A-1001-L
[precionuit]
En CRT {PS.preciounit / Preciosum(PS) numvend=100
numpieza=A-1001-L }
--17
select p.numpieza, nompieza
from preciosum ps, pieza p
where ps.numpieza=p.numpieza
and (numvend = 2
or numvend = 4)
En AR Pieza Preciosum donde numvend=2 o numvend=4
[numpieza, nompieza]
En CRT {P.numpieza, P.nompieza/ Pieza(P) PR
(Preciosum(PR) P.numpieza=PR.numpieza (numvend=2
numvend=4)) }
--19
select nompieza, l.numpieza, preciovent
from pieza pz, pedido p,linped l
where numvend = 1
and p.numpedido=l.numpedido
and l.numpieza=pz.numpieza
En AR Pieza Linped Pedido donde numvend=1 [numpieza,
nompieza, preciovent]
En CRT {P.numpieza, P.nompieza P.preciovent/ Pieza(P) LP
(Linped(LP) P.numpieza=LP.numpieza P (Pedido(P)
LP.numpedido=P.numpedido numvend=1)) }
28
select 3
EXPRESIONES DE
SELECCIN DE FILAS
Objetivos:
Comparaciones de cadenas de caracteres.
Contenidos
BETWEEN, IN
LIKE, subcadenas.
Construccin de expresiones de seleccin de filas utilizando rangos, listas, y funciones de
comparacin de cadenas de caracteres.
RANGOS
Expresiones del tipo 10 <= x <= 100 se pueden construir utilizando el operador de
construccin de rangos BETWEEN.
La sintaxis de tal subexpresin de la clusula where es la siguiente:
crditos
6
6
6
descripcin
LISTAS
Mediante el operador IN se puede buscar un determinado valor en una lista construida
mediante constantes.
29
descripcin
nombre
RAFAEL ROMERO
Fijmonos en que MANUEL PALOMAR, que no imparte ninguna de las asignaturas objeto de la
bsqueda, tampoco aparece en la tabla resultado puesto que su dni no aparece en la tabla
IMPARTE.
SUBCADENAS DE CARACTERES
Podemos preguntar por subcadenas dentro de columnas de tipo carcter. Para ello utilizaremos
los operadores LIKE o MATCHES, que soportan la siguiente sintaxis:
dni
21333444
nombre
RAFAEL ROMERO
30
cdigo
FBD
DGBD
categora
ASO6
cdigo
HI
PC
FP
VALORES NULOS
Podemos interrogar a la BD de datos en busca de valores desconocidos
(informacin faltante) mediante el operador IS NULL, cuya sintaxis es:
cdigo
crditos
HI
FBD
DGBD
PC
FP
4.5
6
6
6
9
RESUMEN DE OPERADORES
Recopilamos todos los operadores y conectivas lgicas vistos hasta ahora para la construccin
de expresiones condicionales:
=
>
<
>=
<=
<>
IS NULL
AND
OR
NOT
BETWEEN
IN
LIKE {%,_}
31
CONSULTAS SELECT3
1.
Obtener el nombre de las piezas que puedan ser suministradas por aquellos proveedores
cuyo nombre empiece por S.
2.
Obtener el nombre de las piezas que puedan ser suministradas por proveedores cuyo
nombre empiece por S, y se llamen de apellido 5 Martnez o Martn.
3.
4.
5.
6.
7.
8.
Obtener los vendedores de la provincia de Valencia o Alicante que su nombre empieza por
J o por M y tienen un nmero de vendedor entre 1 y 100.
9.
Listar los nombres y nmeros de vendedores as como el nmero y nombre de las piezas
que pueden suministrar, para los vendedores de la provincia de Valencia o Alicante.
10. Obtener los nombres de pieza que pueden suministrar los vendedores de apellido 'Garca'.
11. Piezas 6 que sabemos que nos puede suministrar algn vendedor.
12. Obtener todos los vendedores que tengan telfono.
13. Listar las piezas con un descuento entre 1 y 10 cuyo nombre contenga una O y que se las
hayamos solicitado a proveedores cuyo nmero oscile entre el 1 y el 1000.
14. Obtener los nombres de vendedores en orden alfabtico.
15. Obtener nombre de vendedores y nombre de piezas que pueden suministrar ordenado en
orden alfabtico.
16. Obtener todos los nombres de piezas que pueda suministrar el vendedor 100, el 300 y/o
el 400 con un precio de venta entre 10 y 1000, y un precio unitario entre 1 y 500.
17. Obtener el nmero de pieza y el precio de los monitores.
18. Nombre de las piezas que pueden sernos suministradas desde la Comunidad Valenciana.
19. Obtener los vendedores que viven en la calle Ciscar o Salamanca y de la Empresa Harw
S.A.
20. Obtener nombres de vendedores y nmeros de pieza que nos pueden suministrar, de
aquellos vendedores cuyo apellido comienza por Martn, y ordenados alfabticamente.
Cuando no se especifica un atributo concreto, se entiende que se pide toda la informacin disponible
en la BD de los objetos solicitados.
32
SOLUCIONES SELECT3
En AR y CRT no existe el operador LIKE, ni el operador IS
NULL, as como tampoco se puede establecer un criterio para
ordenar el resultado.
--1
select nompieza
from pieza p, preciosum ps, vendedor v
where p.numpieza = ps.numpieza
and ps.numvend = v.numvend
and nomvend like 'S%'
--2
select nompieza
from pieza p, preciosum ps, vendedor v
where p.numpieza = ps.numpieza
and ps.numvend = v.numvend
and (nomvend like 'S% MARTIN %'
or nomvend like 'S% MARTINEZ %')
--3
select nomvend
from vendedor
where provincia in ('ALICANTE', 'VALENCIA', 'CASTELLON')
order by nomvend
En AR Vendedor donde provincia=Alicante o
provincia=Castelln o provincia=Valencia [nomvend]
En CRT {V.nomvend / Vendedor(V) (provincia=Alicante
provincia=Castellon provincia=Valencia)}
--7
select nomvend
from vendedor
where nomvend like 'M_R%'
order by nomvend
--12
select *
from vendedor
where telefono is not null
order by nomvend
33
select fecha
FUNCIONES DE FECHA7
Objetivos:
Construir condiciones de seleccin de filas utilizando atributos de tipo fecha.
Contenidos
TO_CHAR()
TO_DATE()
SYSDATE
ADD_MONTHS()
MONTHS_BETWEEN()
FUNCIONES DE FECHA
Se presentan a continuacin distintas funciones de manejo de fechas y hora, que se pueden
utilizar tanto en la lista de columnas que aparecern en la tabla resultado de la select como en la
construccin de expresiones de la where.
En general, la comparacin entre fechas se hace directamente. Por ejemplo:
select nombre from profesores where fechainc < 12/23/1989
select nombre from profesores where fechainc < 12-23-1989
resultado:
nombre
MANUEL PALOMAR
Pero si necesitamos hacer transformaciones sobre un determinado dato (extraer parte de una
fecha, cambiar el formato de visualizacin, calcular das, etc.) entonces debemos ayudarnos de
estas funciones.
TO_CHAR(fecha [, formato])
Aunque todas las dems sesiones de prcticas cumplen con el estndar SQL, los tipos de datos de
fecha y hora y las funciones que los manejan no suelen estar igualmente implementadas en todos los
SGBD, por lo que esta sesin es nicamente aplicable a Oracle.
35
FORMATOS DE FECHA
Las funciones TO_CHAR() y TO_DATE() admiten distintos formatos de fecha que se pueden
construir segn una mscara especificada por el usuario. Dicha mscara es una cadena de
caracteres entre comillas simples en la que se pueden utilizar los siguientes:
ELEMENTO
- / ' . ; : 'texto'
D
DAY
DD
DY
MM
MON
MONTH
Q
YYYY
Y,YYY
YY
SIGNIFICADO
Marcas de puntuacin y texto fijo que se reproduce en el resultado
Da de la semana (1-7)
Nombre del da de la semana
Da del mes (1-31)
Da del ao (1-366)
Mes (1-12)
Nombre abreviado del mes
Nombre completo del mes
Cuatrimestre del ao (1-4)
Ao con 4 dgitos
Ao con punto de millar
Ao con 2 dgitos
Por ejemplo:
select nombre, to_char (fechainc,'DD') from profesores where to_char(fechainc,'DD') < 15
select * from profesores where to_char(fechainc,'MM') < 6
select * from profesores where fechainc = sysdate
Para obtener el nmero de das entre dos fechas basta con utilizar la operacin resta
select sysdate-fechainc from profesores
36
2.
3.
4.
Nombre de los vendedores que sirvieron piezas en la primera quincena de mayo del 92,
ordenado alfabticamente.
5.
Nmero, nombre de vendedor y mes en que se les solicit un pedido de discos duros.
6.
7.
Nmero y descripcin de las piezas que sirvieron los proveedores los das 10 de cada mes.
8.
Nmero y descripcin de las piezas que sirvieron los proveedores en el 95 y cuyo precio
de compra es superior al precio de suministro que ellos ofertaban.
9.
37
conjuntos
OPERACIONES DE
CONJUNTOS
Objetivos:
Combinar el resultado de varias sentencias select en un nico resultado, utilizando los
operadores de conjuntos: unin, interseccin y diferencia.
Contenidos
Union, Union All
Intersect
Minus
Resolucin de requerimientos.
nombre
RAFAEL ROMERO
39
select nombre
from profesores p, imparte i, asignaturas
where p.dni=i.dni and asignatura=codigo and creditos=6
resultado:
nombre
RAFAEL ROMERO
EVA GMEZ
EVA GMEZ
En el resultado final aparecern todas las filas que estn en cualquiera de los dos resultados.
select nombre
from profesores
where categora=ASO6
UNION
select nombre
from profesores p, imparte i, asignaturas
where p.dni=i.dni and asignatura=codigo and creditos=6
resultado con UNION ALL:
nombre
RAFAEL ROMERO
RAFAEL ROMERO
EVA GMEZ
EVA GMEZ
con UNION
nombre
RAFAEL ROMERO
EVA GMEZ
INTERSECT
Al utilizar el operador INTERSECT entre dos sentencias SELECT, el resultado final estar
compuesto por todas aquellas filas que aparezcan en los resultados de ambas sentencias (no es
suficiente que aparezcan slo en el resultado de una de ellas)
Supongamos que queremos saber el nombre de los profesores que son ASO6 e imparten
asignaturas de 6 crditos.
select nombre
from profesores
where categora=ASO6
INTERSECT
select nombre
from profesores p, imparte i, asignaturas
where p.dni=i.dni and asignatura=codigo and creditos=6
resultado:
nombre
RAFAEL ROMERO
Se calcula cada SELECT por separado y aparecen en el resultado final todas las filas que estn
en ambos resultados.
MINUS
Al utilizar el operador MINUS entre dos sentencias SELECT, el resultado final estar compuesto
slo por aquellas filas que aparecen en el resultado de la primera SELECT y no aparecen en el
resultado de la segunda.
Supongamos que queremos saber el nombre de los profesores que son ASO6 y no imparten
asignaturas de 6 crditos.
40
select nombre
from profesores
where categora=ASO6
MINUS
select nombre
from profesores p, imparte i, asignaturas
where p.dni=i.dni and asignatura=codigo and creditos=6
resultado:
nombre
Supongamos que las condiciones hubiesen estado al revs. Queremos saber el nombre de los
profesores que imparten asignaturas de 6 crditos y no son ASO6.
select nombre
from profesores p, imparte i, asignaturas
where p.dni=i.dni and asignatura=codigo and creditos=6
MINUS
select nombre
from profesores
where categora=ASO6
resultado:
nombre
EVA GMEZ
Algunos de estos requerimientos se pueden resolver con una sola sentencia SELECT donde se
combinen de modo adecuado las condiciones. En otras ocasiones debemos recurrir a operar con
los resultados de varias sentencias. Por ejemplo, en estos dos ltimos enunciados, el segundo se
puede solucionar con una SELECT, mientras que en el caso del primero es necesario trabajar con
dos.
41
CONSULTAS CONJUNTOS
1.
Nombre de las empresas que tengan ms de dos vendedores o que pueda suministrar la
pieza A-1001-L.
2.
Nombre de las empresas que tengan ms de dos vendedores y que pueda suministrar la
pieza A-1001-L, al menos por medio de uno de ellos.
3.
Nombre de las empresas que tengan ms de dos vendedores y que ninguno de sus
vendedores pueda suministrar la pieza A-1001-L.
4.
5.
Nmero y fecha del pedido que contiene piezas que no estn listadas en la lista de
suministros.
6.
Nmero y nombre de los vendedores que oferten alguna de las piezas que pueden ser
suministradas por el vendedor nmero 1, pero que no oferten ninguna de las que puedan
ser suministradas por el vendedor nmero 2.
7.
Nmero y nombre de las piezas con un precio de venta mayor que 1000, y que puedan
ser suministradas por el vendedor nmero 1.
42
SOLUCIONES CONJUNTOS
--1
select nombrecomer
from vendedor
group by nombrecomer
having count(*)>2
UNION
select nombrecomer
from vendedor v, preciosum ps
where v.numvend=ps.numvend and numpieza=A-10001-L
En AR Define alias V1, V2 para VENDEDOR
V1 V2 VENDEDOR donde V1.nombrecomer=V2.nombrecomer and
V2.nombrecomer=Vendedor.nombrecomer and
V1.numvend<>V2.numvend and V1.numvend<> VENDEDOR.numvend and
V2.numvend<>Vendedor.numvend [V1.nombrecomer]
43
PS(PRECIOSUM(PS) numpieza=A-1001-L
V4(VENDEDOR(V4) PS.numvend=V4.numvend
V4.nombrecomer=V1.nombrecomer) ) }
--6
select v.numvend, nomvend
from vendedor v, preciosum ps1, preciosum ps2
where v.numvend=ps1.numvend and
ps1.numpieza=ps2.numpieza and numvend=1
MINUS
select v.numvend, nomvend
from vendedor v, preciosum ps1, preciosum ps2
where v.numvend=ps1.numvend and
ps1.numpieza=ps2.numpieza and numvend=2
En AR
(PRECIOSUM donde numvend=1 [numpieza] PRECIOSUM
VENDEDOR)[numvend, nomvend]
(PRECIOSUM donde numvend=2 [numpieza] PRECIOSUM
VENDEDOR)[numvend, nomvend]
En CRT {V1.numvend, V1.nomvend / VENDEDOR(V1)
PS1(PRECIOSUM(PS1) PS1.numvend=V1.numvend
PS2(PRECIOSUM(PS2) PS2.numvend=1
PS1.numpieza=PS2.numpieza
PS3(PRECIOSUM(PS3) PS3.numvend=V1.numvend
PS4(PRECIOSUM(PS4) PS4.numvend=2
PS3.numpieza=PS4.numpieza)) ) ) }
--7
44
funciones
ARITMTICA Y
FUNCIONES
AGREGADAS
Objetivos:
Obtencin de informacin calculada.
Contenidos
operaciones aritmticas: +, -, *, /
SUM(), AVG(), COUNT(), MAX(), MIN(), ROUND(), ABS().
etiquetas para columnas
Resolucin de requerimientos.
Introduccin de las funciones estadsticas aplicables a columnas enteras y de cuenta de
filas, as como la forma de realizar operaciones como suma, producto, etc., de valores
escalares.
OPERACIONES ARITMTICAS
Se pueden utilizar expresiones aritmticas tanto en la clusula select, para obtener una nueva
columna en la tabla resultado, como en la construccin de condiciones de seleccin de filas.
Nmero de horas semanales, en un slo semestre, que se imparten de cada asignatura:
select descripcin, (crditos/3)*2 from asignaturas
resultado:
descripcin
Historia de la Informtica
Fundamentos de las Bases de Datos
Diseo y Gestin de Bases de Datos
Programacin Concurrente
Fundamentos de Programacin
(crditos/3)*2
3
4
4
4
6
45
Descripcin de las asignaturas y nmero de horas semanales de las asignaturas con menos de
4 horas semanales de clase:
select descripcin, crditos from asignaturas where (crditos/3)*2 < 4
resultado:
descripcin
Historia de la Informtica
crditos
4.5
FUNCIONES AGREGADAS
Se dispone de una serie de funciones agregadas que retornan valores calculados sobre una
determinada columna. Estas funciones devuelven un nico valor para todas las tuplas
seleccionadas mediante la condicin de la clusula where; si no se especifica sta, el clculo se
realiza sobre la totalidad de la columna.
COUNT( *
COUNT( DISTINCT expr
SUM( [DISTINCT] expr
AVG( [DISTINCT] expr
MIN( expr
MAX( expr
ROUND( expr
ABS( expr
)
)
)
)
)
)
)
)
nmero de filas
nmero de valores distintos en la columna expr
suma de todos los valores en expr
promedio de todos los valores en expr
el ms pequeo de todos los valores en expr
el mayor de todos los valores en expr
redondea expr
valor absoluto de expr
Las funciones de tipo estadstico precisan que la expresin que se evale se construya sobre
columnas de tipo de datos numrico.
La expresin expr puede contener el nombre de una columna o un clculo sobre una o varias
columnas.
Si se especifica la palabra clave distinct la expresin obligatoriamente ha de ser un nombre de
columna, y se asume que la funcin se calcula nicamente sobre valores distintos de la expresin.
En ningn caso se pueden anidar funciones: avg ( min ( crditos ) ) no est permitido.
Cuntos profesores hay en nuestra BD?
select count( * ) from profesores
resultado:
( count( * ) )
3
( count( * ) )
4
( count )
3
46
( avg )
6.3
( avg )
4.2
sum( crditos )
12
num_asignaturas mediactos
5
6.30
47
CONSULTAS FUNCIONES
1.
Obtener la diferencia entre cantidad pedida y cantidad recibida de las lneas del pedido 1.
2.
Media de das de intervalo entre la fecha de envo del pedido 1 y de entrega de las
distintas piezas solicitadas en ese pedido
3.
4.
Mnima diferencia entre precio de compra y precio de suministro del vendedor al que se le
compr.
5.
6.
7.
Nmero, nombre y diferencia entre precio de venta y precio de compra de la(s) pieza(s)
que suministran los vendedores de Alicante.
8.
9.
Cantidad total de piezas que sabemos nos pueden suministrar los proveedores.
48
SOLUCIONES FUNCIONES
--1
select numlinea, cantrecibida-cantpedida diferencia
from linped
where numpedido = 1
--2
select avg(abs(fecha-fecharecep)) mediarecep
from linped l, pedido pd
where pd.numpedido = 1
and l.numpedido = pd.numpedido
--3
select count(distinct provincia) provincias
from vendedor
--4
select min(preciocompra-preciounit) minimo
from preciosum ps, pedido pd, linped l
where ps.numvend = pd.numvend
and pd.numpedido = l.numpedido
and l.numpieza = ps.numpieza
--5
select avg(distinct preciovent) mediaventa
from pieza
49
group by
INFORMACIN
AGRUPADA
Objetivos:
Obtencin de informacin calculada sobre grupos de filas.
Contenidos
GROUP BY
Resolucin de requerimientos.
Clasificacin de informacin en funcin de algn criterio especificado mediante la clusula
GROUP BY.
LA CLUSULA GROUP BY
Supongamos que queremos obtener la cantidad de asignaturas que imparte cada profesor:
select p.dni, nombre, count( * )
from profesores p, imparte i
where p.dni = i.dni
group by p.dni, nombre
resultado:
dni
21111222
21333444
nombre
EVA GMEZ
RAFAEL ROMERO
( count )
2
1
En esta ocasin, y por la utilizacin de la clusula group by, la cuenta de valores distintos de la
columna asignatura se calcula en base a cada profesor de nuestra BD que imparte alguna
asignatura.
El criterio de agrupacin se forma con al menos todas las columnas no calculadas de la lista de
la clusula select.
No se pueden poner columnas no calculadas en la select que no aparezcan en la group
by.
select p.dni, nombre, count( * )
from profesores p, imparte i
where p.dni = i.dni
group by p.dni
resultado:
ERROR
51
nombre
( count(*) )
EVA GMEZ
RAFAEL ROMERO
2
1
where y group by
Cuando se utiliza la clusula where, aparte de enlazar tablas por columnas comunes, como
PROFESORES e IMPARTE por profesores.dni e imparte.dni respectivamente, se puede utilizar para
eliminar ciertas filas del clculo.
As, si queremos calcular cuantas asignaturas imparte cada profesor sin contar Fundamentos
de las Bases de Datos, escribiremos la siguiente sentencia.
nombre
EVA GMEZ
RAFAEL ROMERO
( count(*) )
1
1
52
CLIENTE
NOMBRE
JUAN
JUAN
OPERACIN
1
2
3
INGRESO
CLIENTE
21
22
22
INGRESO
1000
2000
3000
nombre
JUAN
media
2000
Puesto que el nombre es el mismo para los dos clientes, la agrupacin contabiliza todas las
ocurrencias de ingreso como de uno slo. Sin embargo, si introducimos en la lista de columnas del
GROUP BY aquellas que son su clave primaria:
select nombre, avg( ingreso ) media
from cliente, ingreso
where dni = cliente
group by dni, nombre
resultado:
nombre
JUAN
JUAN
media
1000
2500
Es evidente que, si queremos saber exactamente de a qu cliente nos referimos en cada tupla
del resultado, debemos incluir la clave primaria como atributo de la relacin derivada de la
ejecucin de la select.
En general, y aunque no afecte al resultado, evitaremos la no inclusin de atributos clave en la
clusula group by.
ORDENACIN DE LA SALIDA
En la clusula order by podemos especificar la expresin tal cual aparece en la select.
select dni, count( * ) asignaturas from profesores group by p.dni, nombre order by count( * )
resultado:
dni
21333444
21111222
asignaturas
1
2
O bien podemos utilizar una alias para la columna (asignaturas en este ejemplo) o el orden de
la columna empezando por la izquierda (la funcin est en la tercera columna en este ejemplo):
select dni, count( * ) asignaturas
from profesores
group by p.dni, nombre
order by asignaturas
select dni, count( * ) asignaturas
from profesores
group by p.dni, nombre
order by 2
53
resultado:
dni
21333444
21111222
asignaturas
1
2
55
CONSULTAS GROUP BY
NOTA:
NOTA:
1.
Obtener para cada pieza, nombre de la pieza, precio de venta, y la media de la diferencia
entre el precio de venta y el de suministro.
2.
Obtener para cada nmero de pedido, el precio pagado en total por ese pedido, la cantidad
pedida total as como la diferencia entre cantidad pedida total y cantidad recibida total.
3.
4.
Obtener, por pieza solicitada, la mxima diferencia entre cantidad pedida y cantidad recibida
de entre todas las veces en que fue servida.
5.
Obtener para cada pieza, el nmero de la pieza y el nmero total de vendedores que nos
pueden suministrar esa pieza.
6.
Obtener nmero de pieza y nmero total de vendedores que la pueden suministrar para
piezas de ms de 250 de precio de venta.
7.
8.
De cada pieza de precio de venta mayor que 250 obtener el precio medio de suministro.
9.
Obtener la media de las ventas (en euros) realizadas por cada vendedor de cada pieza.
10. Obtener la cantidad de pedidos efectuados por fecha y el total pagado por las mercancas.
11. Calcular las ganancias (precio de compra menos precio de suministro por la cantidad
recibida) de cada vendedor que ha efectuado alguna venta.
12. Calcular por nmero de pedido, la media de la diferencia entre el precio de compra y el de
suministro (que nos ofertaba el vendedor al que se le solicit el pedido) de las lneas de cada
pedido.
13. Calcular para cada pieza, el tanto por ciento de beneficios del precio de venta al pblico
respecto al precio medio de compra de todas las compras que se han realizado de la pieza
14. Obtener, por cada pieza solicitada, cuntos vendedores la podran suministrar, ordenado
alfabticamente por la descripcin de la pieza y eliminando aquellas compradas a
proveedores de Alicante.
56
SOLUCIONES GROUP BY
En AR y C.R.T. no hay definidas funciones agregadas por lo que
muchos de los requerimientos nos los podramos abordar, sobre
todo si estas funciones agregadas aparecen en la clusula
SELECT.
--1
select nompieza, preciovent, avg(preciovent-preciounit) media
from pieza p, preciosum ps
where p.numpieza=ps.numpieza
group by p.numpieza,nompieza,preciovent
order by nompieza
--2
select numpedido, sum(preciocompra*cantrecibida) precioPagado,
sum(cantpedida) cantidadPedida,
sum(cantpedida-cantrecibida) no_recibido
from linped
group by numpedido
order by numpedido
--3
select count(*) vendedores, nombrecomer
from vendedor
group by nombrecomer
order by vendedores desc, nombrecomer
--4
select numpieza, max(cantpedida-cantrecibida) maximo
from linped
group by numpieza
order by numpieza
--5
select numpieza, count(*) vendedores
from preciosum
group by numpieza
order by numpieza
--6
select ps.numpieza, count(*) vendedores
from preciosum ps, pieza p
where ps.numpieza = p.numpieza
and preciovent >= 250
group by ps.numpieza
order by 2
--7
select numpieza,avg(preciounit) precio_Sum_Medio
from preciosum
group by numpieza
order by numpieza
--13
select p.numpieza, max(preciovent)/avg(preciocompra)*100
from linped l, pieza p
where l.numpieza=p.numpieza
group by p.numpieza
order by p.numpieza
57
group by - having
SELECCIN DE
INFORMACIN
AGRUPADA
Objetivos:
Establecer selecciones sobre informacin agrupada.
Contenidos
HAVING.
Resolucin de requerimientos.
LA CLUSULA HAVING
Al igual que la clusula where selecciona filas, la clusula having selecciona grupos; si en la
where la condicin que se especifica afecta a las tuplas de toda la tabla, el group by efecta los
clculos en funcin de esa seleccin previa y da como resultado una tabla con la informacin
calculada para cada grupo. Sobre esta ltima el having eliminara aquellas tuplas que no cumplen
la condicin.
Normalmente, where selecciona sobre los datos almacenados en la tabla y having sobre la
informacin calculada.
Supongamos que queremos saber cuantas asignaturas imparte cada profesor pero nicamente
en el caso de que imparta 2 ms asignaturas:
dni
21111222
nombre
EVA GMEZ
asignaturas
59
dni
nombre
asignaturas
En la expresin del having no se pueden utilizar los alias de las columnas (asignaturas) en este
caso.
Veamos, clusula a clusula, los efectos de esta ltima orden:
1. la clusula where ha eliminado las tuplas de imparte de cdigo de asignatura FBD.
2. la clusula group by calcula, para cada profesor, el nmero de asignaturas que imparte.
Puesto que no contamos FBD, Eva Gmez slo imparte, igual que Rafael Romero, una
nica asignatura.
3. la clusula having elimina del resultado del paso anterior todas aquellas tuplas con un valor
en la cuenta de filas menor que 2. El resultado es vaco puesto que ninguno de los grupos
supera la condicin.
60
2.
3.
4.
Obtener los nmeros de pedido donde el precio total sea superior a 1000.
5.
Para las piezas que se hayan ofertadoa un precio unitario medio mayor que 260 obtener
el nmero de pieza, el mximo precio unitario, y la cantidad de suministradores.
6.
Para las piezas que se ofrecen a un precio unitario medio mayor que 260 (sin tener en
cuenta los suministros menores de 250) obtener el nmero de pieza, el mximo precio
unitario, y la cantidad de suministradores.
7.
8.
Obtener el nmero de pieza y el precio unitario medio de aquellas piezas que tarden de
media 14 das como mximo en ser suministradas (diassum=tiempo de suministro).
9.
Obtener los nmeros de pedido, precio de compra y cantidad pedida de los nmeros de
lnea 1 y recibidas en fecha 10-05-92.
10. Obtener el nmero, el nombre y el precio mximo unitario de las piezas cuyo precio de
venta sea mayor que 250 o menor que 170, su descuento medio oscile entre 10 y 17 y
que tengan un precio unitario medio total superior a 150, ordenado por precio mximo.
11. Determinar el nmero total de proveedores que pueden suministrar la pieza 'P-0001-33.
12. Para cada pieza, de la que se tiene informacin sobre sus posibles vendedores, obtener el
nmero de pieza, y sus precios unitarios mximo y mnimo, exceptuando la informacin
referida al vendedor nmero 1.
13. Dar una relacin del nombre de las piezas que nos pueden suministrar ms de dos
proveedores.
14. Obtener el nmero y el nombre del vendedor as como el nmero y nombre de las piezas
de precio unitario mayor que 200 que nos puedan suministrar. El resultado se dar
ordenado por nmero y nombre de vendedor y por nombre de la pieza.
61
62
--10
select p.numpieza,nompieza,max(preciounit) maximo
from pieza p,preciosum ps
where ps.numpieza=p.numpieza
and preciovent > 250 or preciovent < 170
group by p.numpieza,nompieza
having avg(descuento) between 10 and 17
and avg(preciounit) > 150
order by maximo
63
subselect
CONSULTAS ANIDADAS
Objetivos:
Utilizar el resultado de una sentencia select para establecer las condiciones de otra
sentencia select.
Contenidos
Subqueries.
Resolucin de requerimientos.
descripcin
Historia de la Informtica
crditos
4.5
En primer lugar se calcula la select anidada (entre parntesis) y se obtiene el valor mnimo
para la columna crditos de la tabla asignaturas. Con ese valor se compara tupla a tupla y se
obtiene la asignatura (o asignaturas) cuya cantidad de crditos es igual al mnimo.
nada
Siempre que la subselect devuelva algo, nicamente ser en una y nada ms que
una columna (salvo el operador EXISTS).
descripcin
Historia de la Informtica
crditos
4.5
En este caso, el nmero en crditos de la asignatura tiene que ser menor o igual que todos
(all) los valores obtenidos en la subconsulta (que es la relacin de crditos de todas las
asignaturas).
66
crditos
6
6
6
9
descripcin
Seran todas aquellas asignaturas cuyos crditos superasen al menos a uno (any) de los
valores devueltos por la subconsulta. El modificador some es equivalente a any.
Otra forma de expresar el mismo requerimiento :
select descripcin
from asignaturas
where crditos != ( select min(crditos) from asignaturas )
Supongamos que deseamos obtener el nombre de los profesores que imparten una asignatura
que no sea la mxima en nmero de crditos :
select nombre
from profesores p, asignaturas a, imparte i
where p.dni = i.dni and i.asignatura = a.codigo
and crditos < ANY ( select crditos from asignaturas )
resultado:
nombre
Eva Gmez
Rafael Romero
O dicho de otra manera : datos de los profesores cuyo dni aparece en la tabla imparte.
En este caso dara lo mismo procesar la orden :
select p.* from profesores p, imparte i
where p.dni = i.dni
67
68
CONSULTAS SUBSELECT
1.
Obtener todos los datos de los vendedores a los que se les han solicitado ms pedidos
que a todos los dems.
2.
3.
Nmero y nombre de los vendedores a los que se les ha solicitado algn pedido.
4.
5.
6.
7.
Para cada pieza que se ofrece en la lista de suministros, obtener el nmero de pieza, y
sus precios unitarios mximo y mnimo, exceptuando aquellos suministrados por el
vendedor nmero 1.
8.
9.
10. Nmero, descripcin y precio de venta de los monitores que no han sido nunca
solicitados.
11. Calcular, por cada nmero de vendedor, la cantidad de piezas distintas que ha vendido,
para aquellos vendedores pertenecientes a la empresa con ms proveedores.
12. Nombre de los suministradores que pueden suministrar al menos alguna de las piezas que
puede suministrar el vendedor nmero 5.
13. Listar los vendedores que sean de la misma provincia que el vendedor nmero 100.
14. Obtener los nombres de los vendedores de la misma empresa que Luis Garca.
15. Nmero y descripcin de las piezas cuyo precio medio de suministro est por encima del
mayor precio de compra pagado por ella.
16. Nmero, nombre, empresa en la que trabaja y nmero de piezas que puede suministrar el
vendedor que tiene la media ms alta de piezas servidas.
17. Nombre de la empresa con mayor importe de ventas.
18. Nmero y descripcin de la pieza que ha sido pedida ms veces.
19. Nmero y descripcin de las piezas que pueden ser suministradas por proveedores de la
Comunidad Valenciana o que pueden ser suministradas por el vendedor que ha realizado
la menor venta (pedido de importe ms bajo)
20. Nmero de vendedor, nmero de pieza y descuento para aquellas piezas cuyo precio de
venta supere en ms del 15% la media del precio de compra de los pedidos en los que
aparece.
21. Cantidad de piezas a la venta de las que no tenemos informacin sobre sus posibles
suministradores.
69
SOLUCIONES SUBSELECT
--1
select *
from vendedor
where numvend in (select numvend
from pedido
group by numvend
having count(*) >= all(select count(*)
from pedido
group by numvend))
--2
select numvend, nomvend
from vendedor
where numvend not in (select numvend
from preciosum)
order by nomvend
En AR (VENDEDOR[numvend] PRECIOSUM[numvend])
VENDEDOR[numvend, nomvend]
En CRT {V.numvend, V.nomvend / VENDEDOR(V)
PR(PRECIOSUM(PR) PR.numvend=V.numvend)}
--3a
select v.numvend, nomvend
from vendedor v, pedido p
where v.numvend = p.numvend
order by nomvend
En AR VENDEDOR PEDIDO [numvend, nomvend]
En CRT {V.numvend, V.nomvend / VENDEDOR(V) P(PEDIDO(P)
P.numvend=V.numvend)}
--3b
select numvend, nomvend
from vendedor
where numvend in (select numvend
from pedido)
order by nomvend
--11
select v.numvend,count(distinct numpieza) npiezas
from vendedor v, pedido p, linped l
where v.numvend=p.numvend
and p.numpedido=l.numpedido
and nombrecomer in
(select nombrecomer
from vendedor
group by nombrecomer
having count(*) >= all
(select count(*)
from vendedor
group by nombrecomer))
group by v.numvend
order by v.numvend
--15
select p.numpieza, nompieza,avg(preciounit),max(preciocompra)
from pieza p, preciosum ps, linped l
where p.numpieza=ps.numpieza and ps.numpieza=l.numpieza
group by p.numpieza, nompieza
having avg(preciounit)>=
(select max(preciocompra)
from linped
where linped.numpieza=p.numpieza)
70
subselect - exists
CONSULTAS ANIDADAS II
Contenidos
El operador EXISTS.
Resolucin de requerimientos.
EL OPERADOR EXISTS
[ NOT ] EXISTS ( orden select )
El operador exists nos informa si una subconsulta ha devuelto algn resultado, o lo que es lo
mismo, si la tabla resultado tiene alguna fila.
Exists devuelve verdadero si hay al menos una tupla en la relacin derivada y falso si la
relacin derivada es vaca.
Supongamos que queremos conocer si algn profesor imparte todas las asignaturas :
select nombre from profesores p
where not exists ( select cdigo from asignaturas a
where not exists ( select asignatura from imparte i
where i.asignatura=a.cdigo and p.dni=i.dni ) )
Vamos a leer el requerimiento siguiendo las apariciones del operador exists dentro de las
sucesivas rdenes select : Nombre de los profesores tales que no hay ninguna asignatura que no
imparta l.
Supongamos que la forma que tiene el SGBD de resolver esta sentencia es la siguiente :
Una vez que ha fijado el profesor y la asignatura, la ltima subconsulta dar como resultado
verdadero si la imparte y falso en caso contrario (devolver una tupla o no devolver nada).
Supongamos un profesor que no imparte al menos una de las asignaturas de nuestra base de
datos. Cuando el SGBD est resolviendo la ltima subselect para ese profesor y esa asignatura,
como no estn relacionados, no devolver ninguna tupla : el resultado del segundo exists es falso,
y, como est negado, finalmente verdadero (ese profesor no imparte esa asignatura).
Por lo tanto, para la primera subselect, ya existe una asignatura que obtiene en la clusula
where un valor verdadero : esa asignatura saldr en la tabla resultado. Como sta ltima tiene al
menos una fila, el primer exists ser verdadero, y, como est negado, finalmente falso. El profesor
no imparte todas las asignaturas de nuestra base de datos.
Un profesor que imparta todas las asignaturas obtendr siempre una fila en la ltima subselect
y, por lo tanto, ninguna asignatura aparecer como resultado de la primera subselect, el
correspondiente exists ser falso, y por efecto del operador de negacin la condicin ser cierta :
ese profesor aparecer en la solucin.
En nuestra base de datos Ejemplo no hay ningn profesor que imparta todas las asignaturas.
71
Aunque puede inducir a error, por su traduccin intuitiva del ingls al espaol, no
se deben confundir nunca los operadores IN y EXISTS : el primero devuelve una lista de
valores, mientras que el segundo devuelve un valor de verdad; la sintaxis tambin es muy
diferente.
72
2.
3.
Numero y descripcin de las piezas que se han solicitado en todos los pedidos del
vendedor 1.
4.
Nombre de las empresas que cumplen que todos sus vendedores son de la Comunidad
Valenciana, ordenadas alfabticamente.
5.
6.
7.
8.
Numero de los pedidos cuyas piezas tienen todas un precio de venta mayor que la mitad
del precio mximo de venta.
9.
Obtener todos los datos de los vendedores que sirvieron los pedidos del requerimiento
anterior.
10. Nmero y nombre de los vendedores que han servido algn pedido (utilizando
obligatoriamente EXISTS).
11. Nmero y nombre de la pieza de menor precio de suministro (utilizando EXISTS).
12. Nombre de los vendedores a los que se les haya solicitado ms de dos pedidos (utilizando
subconsultas).
13. Nmero de pedido, fecha y nmero de vendedor del pedido ms caro (utilizando
subconsultas).
73
74
adicionales 1
EJERCICIOS
ADICIONALES
CONSULTAS
1.
Toda la informacin de las piezas que puedan ser suministradas por vendedores de
empresas cuyo nombre empieza por 'H'.
2.
Piezas que el vendedor numero 1 ofrece en la lista de suministros y que han sido servidas
en algn pedido
3.
Vendedores que pueden suministrarnos piezas que se venden al pblico con un precio de
venta entre 50 y 100 y que esa pieza ha sido solicitada en algn momento (no
necesariamente a ellos)
4.
5.
Nombre y numero de las piezas que se han solicitado en algn pedido ordenadas por el
nombre
6.
Para cada pieza comprada, nmero de pieza y diferencia en euros entre el precio de
compra y el de suministro del vendedor al que se le compr, ordenado descendentemente
por dicha cantidad.
7.
Numero de vendedor y empresa para la que trabaja de aquellos que han vendido alguna
pieza por un precio mayor que el estipulado por ellos en la lista de suministros
75
SOLUCIONES
--3
select distinct numvend
from preciosum ps, pieza p, linped l
where ps.numpieza = p.numpieza
and p.numpieza = l.numpieza
and preciovent between 50 and 100
order by numvend
En AR PIEZA PRECIOSUM LINPED donde preciovent50 and
preciovent100 [numvend]
En CRT {PR.numvend / PRECIOSUM(PR) P (PIEZA(P)
P.numpieza=PR.numpieza preciovent5000 preciovent10000
LP (LINPED(LP) PR.numpieza=LP.numpieza)) }
--4
select nombrecomer
from vendedor v, pedido pd, linped l, pieza p
where v.numvend = pd.numvend
and pd.numpedido = l.numpedido
and l.numpieza = p.numpieza
and nompieza like '%MONITOR%'
and provincia = 'ALICANTE'
--5
select nompieza, p.numpieza
from pieza p, linped l
where p.numpieza = l.numpieza
order by nompieza
En AR PIEZA LINPED [numpieza, nompieza]
En CRT {P.numpieza, P.nompieza / PIEZA(P) LP (LINPED(LP)
P.numpieza=LP.numpieza) }
--6
select ps.numpieza, preciounit - preciocompra
from linped l, pedido pd, preciosum ps
where l.numpedido = pd.numpedido
and pd.numvend = ps.numvend
and ps.numpieza = l.numpieza
order by diferencia
En AR PRECIOSUM PEDIDO LINPED [numpieza, preciounit,
preciocompra]
En CRT {PR.numpieza, PR.preciounit, LP.preciocompra /
PRECIOSUM(PR) LINPED(LP) P (PEDIDO(P)
PR.numvend=P.numvend P.numpedido=LP.numpedido
PR.numpieza=LP.numpieza) }
En AR y C.R.T.: no est considerada, en la formalizacin de
estos lenguajes, la resta como resultado.
--7
select distinct v.numvend, nombrecomer
from vendedor v, pedido pd, linped l, preciosum ps
where ps.numvend = v.numvend
and v.numvend = pd.numvend
and pd.numpedido = l.numpedido
and l.numpieza = ps.numpieza
and preciocompra > preciounit
En AR VENDEDOR PRECIOSUM PEDIDO LINPED donde
preciocompra > preciounit [numvend, nomvend]
En CRT {V.numvend, V.nomvend / VENDEDOR(V)
PR(PRECIOSUM(PR) V.numvend=PR.numvend P (PEDIDO(P)
PR.numvend=P.numvend LP(LINPED(LP)
P.numpedido=LP.numpedido PR.numpieza=LP.numpieza
preciocompra > p
76
adicionales 2
EJERCICIOS
ADICIONALES
CONSULTAS
1.
2.
3.
Obtener el nombre de las piezas, la media del precio unitario de cada pieza y el precio de
venta de todas las piezas de las que conocemos posibles suministradores.
4.
Para cada pedido obtener el nmero de lneas que tiene, el nmero y nombre del
vendedor y la fecha del pedido.
5.
Obtener el nombre de las piezas, la media del precio unitario de cada pieza y el precio de
venta de todas las piezas que puedan sernos suministradas por ms de tres proveedores.
6.
Obtener los nmeros y nombres de los vendedores que han servido algn pedido con ms
de tres artculos diferentes.
7.
Obtener nmero y nombre de vendedores a los que les hayamos solicitado algn pedido.
8.
Obtener el nombre de las piezas, la media del precio unitario de cada pieza y el precio de
venta de todas las piezas de precio unitario medio mayor que 100 y que puedan ser
suministradas por ms de dos proveedores.
9.
Obtener para cada pieza, el nombre de las pieza, la media del precio unitario de
suministro y el precio de venta, para las piezas de precio de venta mayor que 300,
teniendo en cuenta que la media de los precios unitarios debe estar entre 100 y 280.
Ordenar el resultado por el nombre de la pieza.
10. Obtener nmero y nombre de las piezas que tengan una diferencia entre precio de venta
y media de precio de suministro (preciounit) menor del 20% del precio de venta.
77
SOLUCIONES
--1
select nomvend,count(*) cantidad
from preciosum ps, vendedor v
where ps.numvend=v.numvend
group by v.numvend,nomvend
order by nomvend
--2
select v.numvend,nomvend,count(*) cantidad
from preciosum ps, vendedor v
where ps.numvend=v.numvend
group by v.numvend,nomvend
order by nomvend
--6
select numvend, nomvend
from vendedor v, pedido p, linped lp
where v.numvend = p.numvend
and p.numpedido = lp.numpedido
group by p.numpedido,v.numvend, nomvend
having count(distinct numpieza)> 3
En AR Define alias LP1, LP2, LP3 para LINPED
LP1 LP2 LP3 LINPED donde LP1.numpedido=LP2.numpedido
and LP2.numpedido=LP3.numpedido and
LP3.numpedido=LINPED.numpedido and LP1.numpieza<>LP2.numpieza
and LP1.numpieza<> LP3.numpieza and LP1.numpieza<>
LINPED.numpieza and LP2.numpieza<> LP3.numpieza and
LP2.numpieza<>LINPED.numpieza and LP3.numpieza<>
LINPED.numpieza [LP1.numpedido] PEDIDO VENDEDOR [numvend,
nomvend]
En CRT {V.numvend, V.nomvend / VENDEDOR(V) P (PEDIDO(P)
P.numvend=V.numvend) LP1 ( LINPED(LP1)
LP1.numpedido=P.numpedido LP2 (LINPED(LP2)
LP1.numpedido=LP2.numpedido LP1.numpieza<>LP2.numpieza
LP3 (LINPED(LP3) LP2.numpedido=LP3.numpedido
LP1.numpieza<>LP3.numpieza LP2.numpieza<>LP3.numpieza
LP4 (LINPED(LP4) LP3.numpedido=LP4.numpedido
LP1.numpieza<>LP4.numpieza LP2.numpieza<>LP4.numpieza
LP3.numpieza<>LP4.numpieza))))) }
--4
select p.numpedido, count(*), p.numvend, nomvend, fecha from pedido p, linped l,
vendedor v where p.numvend = v.numvend and p.numpedido = l.numpedido group by
p.numpedido, p.numvend, nomvend, fecha
(en este caso coincide count(*) y count(distinct numlinea)
--7
select v.numvend, nomvend from vendedor v, pedido p where v.numvend = p.numvend
--8
select nompieza, avg(preciosum), preciovent from preciosum ps, pieza p where
p.numpieza = ps.numpieza group by nompieza, preciovent having avg(preciosum) > 100
and count(*) > 2
(aqu tambin coincide count(*) y count(distinct numvend)
--9
select nompieza, avg(preciounit) media, preciovent
from preciosum ps, pieza p
where ps.numpieza=p.numpieza
and preciovent > 30000
group by p.numpieza,nompieza,preciovent
having count(*)>2
and avg(preciounit) between 100 and 280
order by p.nompieza
--10
select p.numpieza, nompieza from pieza p, preciosum ps where p.numpieza =
ps.numpieza group by p.numpieza, nompieza, preciovent having preciovent*20/100 >
avg(preciounit)
(necesito poner el preciovent en el group by porque es no calculado)
78
adicionales 3
EJERCICIOS
ADICIONALES
CONSULTAS
1.
2.
3.
Obtener el nmero de pedido, el importe total, y el numero y nombre del vendedor al que
se les solicit, para los pedidos de importe total superior a 10000 euros. Ordena el
resultado por el importe total.
4.
Para cada pieza que pueda ser suministrada a un precio medio unitario inferior a 10
euros, obtener el nmero de la pieza, su nombre, el precio mximo al que nos la han
ofrecido, el precio mnimo y la cantidad de vendedores que nos la pueden suministrar.
5.
Para los pedidos que nos han sido servidos en ms de un da, obtener el nmero de
pedido, el nmero del vendedor al que se le solicit, su nombre, y la cantidad de das
distintos en los que nos han servido las piezas solicitadas.
6.
Para las empresas que tengan un nico vendedor, obtener el nombre de la empresa y la
cantidad total de pedidos que se le han solicitado, y el importe total entre todos los
pedidos.
7.
79
SOLUCIONES
--1
select v.numvend, nomvend, count(*) cantidadPED
from vendedor v, pedido p
where v.numvend=p.numvend and provincia=ALICANTE
group by v.numvend, nomvend
--4
select p.numpieza, nompieza, max(preciounit) maxPrecio,
min(preciounit) minPrecio, count(*) totalVend
from preciosum ps, pieza p
where ps.numpieza=p.numpieza
group by p.numpieza, nompieza
having avg(preciounit)<10
--5
select p.numpedido, v.numvend, nomvend, count(distinct fecharecep)
from vendedor v, pedido p, linped lp
where v.numvend = p.numvend
and p.numpedido = lp.numpedido
group by p.numpedido, v.numvend, nomvend
having count(distinct fecharecep)> 1
--7
select p.numpieza, nompieza, v.numvend, nomvend
from pieza p, linped lp , pedido ped, vendedor v
where lp.numpieza=p.numpieza and lp.numpedido=ped.numpedido
and ped.numvend=v.numvend and to_char(fecharecep, d)=7
order by 2
80
adicionales 4
EJERCICIOS
ADICIONALES
CONSULTAS
1.
Nmero y nombre de los vendedores a los que les hemos solicitado algn pedido en el
ao 1995 pero no les hemos solicitado ninguno en el ao 1992.
2.
Obtener el nmero y el nombre las piezas que puedan sernos suministradas por ms de
dos vendedores de la provincia de Alicante, y que en total (entre todos los pedidos
solicitados a todos los vendedores) hayamos pedido ms de 500 unidades.
3.
4.
5.
Obtener el nmero de los vendedores (numvend) que nos hubiesen podido servir todo lo
que se solicita en las lneas 1, 2 y 3 del pedido nmero 1.
6.
81
SOLUCIONES
--1
select v.numvend, nomvend
from pedido p, vendedor v
where p.numvend=v.numvend and to_char(fecha,yyyy)=1995
minus
select v.numvend, nomvend
from pedido p, vendedor v
where p.numvend=v.numvend and to_char(fecha,yyyy)=1992
--4
select numpieza, nompieza
from pieza
minus
select p.numpieza, nompieza
from linped lp, pieza p
where lp.numpieza=p.numpieza
En AR
PIEZA[numpieza, nompieza]
(PIEZA LINPED)[numpieza, nompieza]
En CRT {P.numpieza, P.nompieza / PIEZA(P) LP(LINPED(LP)
LP.numpieza=P.numpieza}
--5
select numvend
from preciosum ps, linped lp
where ps.numpieza=lp.numpieza and numpedido=1 and numlinea=1
intersect
select numvend
from preciosum ps, linped lp
where ps.numpieza=lp.numpieza and numpedido=1 and numlinea=2
intersect
select numvend
from preciosum ps, linped lp
where ps.numpieza=lp.numpieza and numpedido=1 and numlinea=3
En AR Define alias V1, V2 para VENDEDOR
PRECIOSUM [numvend, numpieza]
LINPED DONDE (numpedido=1 and (numlinea=1 or numlinea=2 or
numlinea=3)) [numpieza]
En CRT
{V.numvend / VENDEDOR(V)
LP (LINPED(LP) LP.numpedido=1 (LP.numlinea=1
LP.numlinea=2 LP.numlinea=3)
PS(PRECIOSUM(PS) PS.numpieza=LP.numpieza
PS.numvend=V.numvend) ) }
--6
select v.numvend, nomvend, sum(cantrecibida*preciocompra) Total
from vendedor v, pedido p, linped lp
where v.numvend=p.numvend and p.numpedido=lp.numpedido
and provincia I (ALICANTE, MADRID)
group by v.numvend, nomvend
82
adicionales 5
EJERCICIOS
ADICIONALES
CONSULTAS
1.
Obtener para los pedidos con un importe total entre 400 y 600 euros, el nmero de
pedido, el nmero y nombre del vendedor al que se le solicit, y la fecha del pedido.
2.
Obtener para las piezas cuyo precio de suministro oscila entre 10 y 15, el nmero de la
pieza, su nombre, y la cantidad de vendedores que nos la pueden suministrar a ese
precio.
3.
Obtener para los vendedores a los que les hayamos pagado en total (entre todos sus
pedidos) ms de 3000 euros, el nmero y nombre de vendedor junto con el importe total
que les hemos pagado, y el total de pedidos que les hemos hecho.
4.
Obtener para el nmero y nombre de los vendedores de Alicante a los que se les haya
solicitado alguna pieza, de la que nos haban indicado que su plazo de suministro sera
superior a una semana, junto con el nmero y nombre de la pieza, y la cantidad de
pedidos distintos en los que se les ha solicitado. Ordena el resultado por la ltima
columna.
5.
6.
83
SOLUCIONES
--1
select p.numpedido, v.numvend, nomvend, fecha
from pedido p, linped lp, vendedor v
where p.numvend=v.numvend and p.numpedido=lp.numpedido
group by p.numpedido, fecha, v.numvend, nomvend
having sum(ctdpedida*preciocompra) between 400 and 600
--4
select v.numvend, nomvend, p.numpieza, nompieza, count(distinct numpedido)
from vendedor v, preciosum ps, pedido pd, linped lp, pieza p
where v.numvend = pd.numvend and v.numvend=ps.numvend
and pd.numpedido = lp.numpedido and p.numpieza=lp.numpieza and
p.numpieza=ps.numpieza and diassum>7
group by v.numvend, nomvend, p.numpieza, nompieza
order by 5
--5
select nombrecomer
from vendedor
group by nombrecomer
having count(*)>3
intersect
select nombrecomer
from vendedor
where provincia=AICANTE
group by nombrecomer
having count(*)>1
--6
select nomvend, nombrecomer
from vendedor
where provincia not in (ALICANTE,CASTELLON,VALENCIA) and telefono is null
84
adicionales 6
EJERCICIOS
CONSULTAS
1.
2.
Nombre del vendedor y media de todos sus precios de suministro para los vendedores
que viven en la misma ciudad que algn vendedor de apellido Garca.
3.
4.
Obtener el nombre de vendedor para los vendedores cuya media de precio unitario de
suministro sea mxima.
5.
6.
7.
8.
Nombre de los vendedores a los que se les haya solicitado ms de dos pedidos en los que
se sirvan discos duros.
9.
10. Nmero de pieza, descripcin, precio medio de suministro y descuento mximo de las
piezas que proceden de la misma ciudad que la empresa Mecemsa y que se han solicitado
2 veces o ms.
85
SOLUCIONES
--2
select nomvend, avg(preciounit) mediasumin
from vendedor v, preciosum ps
where v.numvend=ps.numvend
and ciudad IN (select ciudad
from vendedor
where nomvend like '%GARCIA%')
group by v.numvend, nomvend,ciudad
order by mediasumin
--7
select numpedido, v.numvend, nomvend, fecha
from pedido p, vendedor v
where p.numvend=v.numvend
and to_char(fecha,'YYYY')>1992
and numpedido in (select numpedido
from linped
group by numpedido
having sum(preciocompra*cantrecibida) > any
(select sum(preciocompra*cantrecibida)
from linped
group by numpedido))
--10
select ps.numpieza, nompieza, avg(preciounit) media,
max(descuento) descuento
from preciosum ps, pieza pz, vendedor v
where ps.numpieza=pz.numpieza and v.numvend=ps.numvend
and v.ciudad in (select ciudad
from vendedor
where nombrecomer='MECEMSA')
and ps.numpieza in (select numpieza
from linped
group by numpieza
having count(*)>1)
group by ps.numpieza,nompieza
order by ps.numpieza
86
adicionales 7
EJERCICIOS
CONSULTAS
1.
Nmero y nombre de los vendedores que oferten alguna de las piezas que pueden ser
suministradas por el vendedor nmero 1, pero que no oferten ninguna de las que puedan
ser suministradas por el vendedor nmero 2.
2.
3.
Obtener, para el vendedor que cumple que la diferencia de precio al que le compramos
una pieza y el precio que nos haba ofrecido por ella sea mxima, el nmero de vendedor,
su nombre y la diferencia media entre el precio al que nos vende las piezas y el que nos
haba ofrecido por las mismas.
4.
Obtener el nmero de pieza de los teclados que nos han sido servidos en el mayo de
cualquier ao.
5.
Obtener un listado en el que figure el nmero y nombre de la pieza , junto con el nmero
y nombre de vendedor que nos ha ofertado la pieza, pero al que nunca se la hemos
solicitado.
6.
Obtener los nmeros y nombres de los vendedores que nos han servido ms de tres
artculos diferentes.
87
SOLUCIONES
--1
select v.numvend, nomvend
from vendedor v, preciosum ps
where v.numvend=ps.numvend and
numpieza IN (select numpieza from preciosum where numvend=1)
and numvend NOT IN (
select v.numvend, nomvend
from vendedor v, preciosum ps
where v.numvend=ps.numvend and
numpieza IN (select numpieza from preciosum where numvend=2))
--1
select numvend, nomvend
from vendedor
where numvend IN (
select numvend from preciosum
where numpieza IN (select numpieza from preciosum where numvend=1)
MINUS
select numvend from preciosum
where numpieza IN (select numpieza from preciosum where numvend=2))
En AR
(PRECIOSUM donde numvend=1 [numpieza] PRECIOSUM
VENDEDOR)[numvend, nomvend]
(PRECIOSUM donde numvend=2 [numpieza] PRECIOSUM
VENDEDOR)[numvend, nomvend]
En CRT {V1.numvend, V1.nomvend / VENDEDOR(V1)
PS1(PRECIOSUM(PS1) PS1.numvend=V1.numvend
PS2(PRECIOSUM(PS2) PS2.numvend=1
PS1.numpieza=PS2.numpieza
PS3(PRECIOSUM(PS3) PS3.numvend=V1.numvend
PS4(PRECIOSUM(PS4) PS4.numvend=2
PS3.numpieza=PS4.numpieza)) ) ) }
--3
select v.numvend, nomvend, avg(preciocompra-preciounit) DifMedia
from preciosum ps, pedido p, linped lp, vendedor v
where p.numpedido=lp.numpedido and ps.numvend=p.numvend
and lp.numpieza=ps.numpieza and p.numvend=v.numvend
group by v.numvend, nomvend
having max(precicompra-preciounit) =
(Select max(preciocomprapreciounit)
from preciosum ps, pedido p, linped lp
where p.numpedido=lp.numpedido and ps.numvend=p.numvend
and lp.numpieza=ps.numpieza)
--4
select numpieza
from pieza p, linped lp
where p.numpieza=lp.numpieza and nompieza like %TECLADO%
and to_char(fecharecep, mm)=5
--6
select v.numvend, nomvend
from vendedor v, pedido p, linped lp
where v.numvend=p.numvend and p.numpedido=lp.numpedido
group by v.numvend, nomvend
having count(distinct numpieza)>3
88