Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Resuelveme PDF
Resuelveme PDF
[Email:
ing.delphi@gmail.com]
Bases de Datos II
Sesin 0:
ENTORNO MySQL
Objetivos:
Adquirir la destreza mnima para trabajar en el entorno MySQL.
Contenidos
Extensiones de Ejemplo:
2
Bases de Datos II
ASIGNATURAS
codigo descripcion
HI
FBD
DGBD
PC
FP
creditos creditosp
HISTORIA DE LA INFORMATICA
FUNDAMENTOS DE LAS BASES DE DATOS
DISEO Y GESTION DE BASES DE DATOS
PROGRAMACION CONCURRENTE
FUNDAMENTOS DE LA PROGRAMACION
4.5
6.0
6.0
6.0
9.0
PROFESORES
dni
21111222
21222333
21333444
nombre
EVA GOMEZ
MANUEL PALOMAR
RAFAEL ROMERO
1.5
3.0
1.5
4.5
IMPARTE
categoria
ingreso
TEU
TEU
ASO6
01/10/1993
16/06/1989
16/06/1992
dni
21111222
21111222
21333444
asignatura
FBD
DGBD
PC
MySQL
Una vez el sistema permite la conexin, disponemos de un rea donde introducir rdenes SQL
cuyo resultado se obtiene pulsando el botn Ejecutar. Podemos probar con la siguiente consulta:
select * from profesores
resultado: dni
21111222
21222333
21333444
nombre
EVA GOMEZ
MANUEL PALOMAR
RAFAEL ROMERO
categoria
TEU
TEU
ASO6
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 codigo
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 codigo. 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.
Bases de Datos II
Algunos de los tipos de datos que nos podemos encontrar en MySQL son:
Tipos numricos:
Existen tipos de datos numricos, que se pueden dividir en dos grandes grupos,
los que estn en coma flotante (con decimales) y los que no.
TinyInt: es un nmero entero con o sin signo. Con signo el rango de valores
vlidos va desde -128 a 127. Sin signo, el rango de valores es de 0 a 255
Bit Bool: un nmero entero que puede ser 0 1
SmallInt: nmero entero con o sin signo. Con signo el rango de valores va desde 32768 a 32767. Sin signo, el rango de valores es de 0 a 65535.
MediumInt: nmero entero con o sin signo. Con signo el rango de valores va
desde -8.388.608 a 8.388.607. Sin signo el rango va desde 0 a16777215.
Integer, Int: nmero entero con o sin signo. Con signo el rango de valores va
desde -2147483648 a 2147483647. Sin signo el rango va desde 0 a
429.4967.295
BigInt: nmero entero con o sin signo. Con signo el rango de valores va desde 9.223.372.036.854.775.808 a 9.223.372.036.854.775.807. Sin signo el rango va
desde 0 a 18.446.744.073.709.551.615.
Float: nmero pequeo en coma flotante de precisin simple. Los valores vlidos
van desde -3.402823466E+38 a -1.175494351E-38, 0 y desde 1.175494351E-38 a
3.402823466E+38.
xReal, Double: nmero en coma flotante de precisin doble. Los valores
permitidos van desde -1.7976931348623157E+308 a -2.2250738585072014E308, 0 y desde 2.2250738585072014E-308 a 1.7976931348623157E+308
Decimal, Dec, Numeric: Nmero en coma flotante desempaquetado. El nmero
se almacena como una cadena
Tamao de
Tipo de Campo
Almacenamiento
TINYINT
1 byte
SMALLINT
2 bytes
MEDIUMINT
3 bytes
INT
4 bytes
INTEGER
4 bytes
BIGINT
8 bytes
Docente: Arturo Daz Pulido
Bases de Datos II
FLOAT(X)
4 8 bytes
FLOAT
4 bytes
DOUBLE
8 bytes
DOUBLE
PRECISION
8 bytes
REAL
8 bytes
M+2 bytes s D > 0, M+1
DECIMAL(M,D
bytes s D = 0
M+2 bytes if D > 0, M+1
NUMERIC(M,D)
bytes if D = 0
Tipos fecha:
A la hora de almacenar fechas, hay que tener en cuenta que Mysql no comprueba
de una manera estricta si una fecha es vlida o no. Simplemente comprueba que
el mes esta comprendido entre 0 y 12 y que el da esta comprendido entre 0 y 31.
Date: tipo fecha, almacena una fecha. El rango de valores va desde el 1 de enero
del 1001 al 31 de diciembre de 9999. El formato de almacenamiento es de aomes-dia
DateTime: Combinacin de fecha y hora. El rango de valores va desde el 1 de
enero del 1001 a las 0 horas, 0 minutos y 0 segundos al 31 de diciembre del 9999
a las 23 horas, 59 minutos y 59 segundos. El formato de almacenamiento es de
ao-mes-dia horas: minutos: segundos
TimeStamp: Combinacin de fecha y hora. El rango va desde el 1 de enero de
1970 al ao 2037. El formato de almacenamiento depende del tamao del campo:
Tamao
Formato
AoMesDiaHoraMinutoSegundo
14
aaaammddhhmmss
AoMesDiaHoraMinutoSegundo
12
aammddhhmmss
oMesDia aaaammdd
AoMesDia aammdd
AoMes aamm
Ao aa
Time: almacena una hora. El rango de horas va desde -838 horas, 59 minutos y
59 segundos a 838, 59 minutos y 59 segundos. El formato de almacenamiento es
5
Bases de Datos II
de 'HH:MM:SS'
Year: almacena un ao. El rango de valores permitidos va desde el ao 1901 al
ao 2155. El campo puede tener tamao dos o tamao 4 dependiendo de si
queremos almacenar el ao con dos o cuatro dgitos.
Tipo de
Tamao de
Campo
Almacenamiento
DATE
3 bytes
DATETIME
8 bytes
TIMESTAMP
4 bytes
TIME
3 bytes
YEAR
1 byte
Tipos de cadena:
Char(n): almacena una cadena de longitud fija. La cadena podr contener desde
0 a 255 caracteres.
VarChar(n): almacena una cadena de longitud variable. La cadena podr
contener desde 0 a 255 caracteres.
Dentro de los tipos de cadena se pueden distinguir otros dos subtipos, los tipo
Test y los tipo BLOB (Binary large Object)
La diferencia entre un tipo y otro es el tratamiento que reciben a la hora de realizar
ordenamientos y comparaciones. Mientras que el tipo test se ordena sin tener en
cuenta las Maysculas y las minsculas, el tipo BLOB se ordena tenindolas en
cuenta.
Los tipos BLOB se utilizan para almacenar datos binarios como pueden ser
ficheros.
TinyText y TinyBlob: Columna con una longitud mxima de 255 caracteres.
Blob y Text: un texto con un mximo de 65535 caracteres.
MediumBlob y MediumText: un texto con un mximo de 16.777.215 caracteres.
LongBlob y LongText: un texto con un mximo de caracteres 4.294.967.295.
Hay que tener en cuenta que debido a los protocolos de comunicacin los
paquetes pueden tener un mximo de 16 Mb.
Enum: campo que puede tener un nico valor de una lista que se especifica. El
tipo Enum acepta hasta 65535 valores distintos
Bases de Datos II
Set: un campo que puede contener ninguno, uno varios valores de una lista. La
lista puede tener un mximo de 64 valores.
Tamao de
Tipo de campo
Almacenamiento
CHAR(n)
n bytes
VARCHAR(n)
n +1 bytes
TINYBLOB, TINYTEXT
Longitud+1 bytes
BLOB, TEXT
Longitud +2 bytes
MEDIUMBLOB,
MEDIUMTEXT
Longitud +3 bytes
LONGBLOB, LONGTEXT
Longitud +4 bytes
1 dos bytes dependiendo
ENUM('value1','value2',...)
SET('value1','value2',...)
valores
Almace
Almace
Valor
''
''
4 bytes
"
1 byte
'ab'
'ab '
4 bytes
'ab'
3 bytes
'abcd'
'abcd'
4 bytes
'abcd'
'abcdefgh'
'abcd'
4 bytes
'abcd'
5 bytes
Bases de Datos II
SELECT 1
Objetivos:
Contenidos:
La orden SELECT-FROM-WHERE.
Proyecciones, Selecciones.
Tipos de datos.
ORDER BY
Se proporciona informacin sobre las consultas ms sencillas a realizar sobre una BD.
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 (cuyo esquema y contenido se presentaron en
la sesin anterior) 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
select * from profesores
resultado: dni
21111222
21222333
21333444
nombre
EVA GOMEZ
MANUEL PALOMAR
RAFAEL ROMERO
categoria
TEU
TEU
ASO6
Bases de Datos II
Al especificar en la lista de atributos un asterisco le indicamos al SGBD que deseamos la
informacin de todas las columnas definidas para la tabla PROFESORES.
Si deseamos conocer a qu categoras pertenecen los profesores que se encuentran en la BD:
select categoria from profesores
resultado: categoria
TEU
TEU
ASO6
Podemos especificar tantas columnas como queramos:
select nombre, categoria from profesores
resultado:
nombre
EVA GOMEZ
MANUEL PALOMAR
RAFAEL ROMERO
categoria
TEU
TEU
ASO6
categoria
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, categoria from profesores
select dni, categoria from profesores
resultado:
dni
21111222
21222333
21333444
categoria
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 categoria = 'TEU'
Bases de Datos II
resultado:
nombre
EVA GOMEZ
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
categoria = 'TEU' or categoria = 'ASO6'
resultado:
nombre
EVA GOMEZ
MANUEL PALOMAR
RAFAEL ROMERO
La clusula ORDER BY
Podemos ordenar la salida producida por nuestra orden select por valores ascendentes o
descendientes de una columna en particular.
Nombre de las asignaturas ordenadas de menor a mayor nmero de crditos:
select creditos, descripcion from asignaturas order by creditos
resultado:
creditos
descripcion
4.5
Historia de la Informtica
6
Fundamentos de las Bases de Datos
6
Diseo y Gestin de Bases de Datos
6
Programacin Concurrente
9
Fundamentos de la Programacin
Si no se indica nada la ordenacin ser ascendente.
El mismo requerimiento anterior pero en orden descendente y de aquellas que tienen ms de
4.5 crditos:
select creditos, descripcion from asignaturas
where creditos > 4.5 order by creditos desc
resultado:
creditos
descripcion
9
Fundamentos de la Programacin
6
Fundamentos de las Bases de Datos
6
Diseo y Gestin de Bases de Datos
6
Programacin Concurrente
Puede aplicarse ms de un criterio de ordenacin:
select creditos, descripcion from asignaturas order by creditos, descripcion
resultado:
10
Pulido
creditos
4.5
descripcion
Historia de la Informtica
Bases de Datos II
6
6
6
9
Constantes
Se pueden explicitar constantes en la orden select de forma que dicho valor aparezca en todas las
filas:
select 'La asignatura ', descripcion, ' tiene ', creditos, ' creditos'
from asignaturas order by creditos
resultado:
'laasignatura' descripcion
'tiene' creditos 'crditos
La asignatura HISTORIA DE LA INFORMATICA
tiene
4.5 crditos La
asignatura FUNDAMENTOS DE LAS BASES DE DATOS
tiene
6 crditos La
asignatura DISEO Y GESTION DE BASES DE DATOS
tiene
6 crditos La
asignatura PROGRAMACION CONCURRENTE
tiene
6 crditos La
asignatura FUNDAMENTOS DE LA PROGRAMACION
tiene
9 crditos
11
Docente: Arturo
DazPulido
Bases de Datos II
BD Proveedores
LA BASE DE DATOS
PROVEEDORES
Objetivos:
Ser capaz de interpretar un esquema de base de datos relacional (concretamente, el propuesto
para las prcticas de la asignatura: Proveedores)
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.
12
Pulido
Bases de Datos II
PIEZA
( numpieza VARCHAR2(16),
nompieza VARCHAR2(30),
preciovent NUMBER(9,2))
PRECIOSUM
( numpieza VARCHAR2(16),
numvend NUMBER(4),
preciounit NUMBER(9,2),
diassum NUMBER(3),
descuento NUMBER(2))
( numpedido NUMBER(5),
numvend NUMBER(4), fecha
DATE )
( numpedido NUMBER(5),
numlinea NUMBER(2),
numpieza VARCHAR2(16),
preciocompra NUMBER(9,2),
cantpedida NUMBER(4),
PEDIDO
LINPED
( numpieza VARCHAR2(16),
numbin NUMBER(10),
cantdisponible NUMBER(5),
fecharecuento DATE,
periodorecuen NUMBER(2),
cantminima NUMBER(5) )
Docente: Arturo
DazPulido
Bases de Datos II
Los datos de los proveedores que nos suministran la mercadera que, posteriormente, es
vendida al pblico en general.
Las piezas que distribuye nuestra empresa y el precio de venta al pblico de las mismas.
Lista de precios de suministro (preciosum, vendedor, pieza).
Conocer los precios a los que los proveedores nos podran suministrar las piezas. Es
informacin histrica cuyo origen no nos preocupa. No se debe confundir esta informacin
con la de los pedidos: los artculos almacenado en preciosum puede que no se hayan pedido
nunca y, si se ha hecho, que hayan sido comprados a un precio distinto porque se negociara en
ese instante con cualquiera de los suministradores.
Control de pedidos (pedido, linped, vendedor, pieza).
14
Pulido
Bases de Datos II
tabla VENDEDOR
numvend nomvend nombrecomer telefono calle Ciudad provincia
1
AGAPITO
MECEMSA
96-5782401
Avda. Valencia
ALICANTE
LAFUENTE DEL
3205
CORRAL
2
LUCIANO
HARW S.A.
96-3232321 GENERAL LACY,
ALICANTE
BLAZQUEZ
15 2 B
VAZQUEZ
3
GODOFREDO
MECEMSA
96-4141722 AVDA. VALENCIA
ALICANTE
MARTIN
3372
MARTINEZ
DONDEQUIERAS,
4
JUANITO REINA
HARW S.A.
903-696969
LO ANGELE
1000, 13F
PRINCESA
5
JUANITO REINA
LA DEAQUI
98-5363636
S. FRANCISCO
GIJON
PRINCESA
DE ASIS, 10 1
6
MANOLO PIEDRA
HUMP S.A.
96-5660727
AVIACION 92, 3 I
SAN VICENTE
POMEZ
SOFTHARD
7
MANUEL PEREZ
98-5696969 ARZOBISPO
QUINTANAR DE
DISTRIBUIDORA
RODRIGUEZ
LOACES
LA ORDE
S.A.
8
LUISA PINTO
LA MEJOR S.A.
999OXFORD BLUES
NEW ORLEANS
HEREDIA
2014455
9
CHEMA PAMUNDI OLE ESPAA, S.A.
RIVAS
VACIAMADRID
10
GUSTAVO DE
OLE ESPAA, S.A.
RIVAS
BASICA
VACIAMADRID
11
MARIO DUQUE BANESTOESSOFT
98MOROS, 19
GIJON
LIZONDO
S.L.
0101010
12
JOSE ANTONIO OLE ESPAA, S.A.
3667788
COLON, 21
VALENCIA
MARTINEZ JUAN
13
MANUEL GOMEZ
OLE ESPAA, S.A.
3667789
COLON, 21
VALENCIA
SANTISTEBAN
8001
JUAN
HALA S.A.
ALMORADI
RODRIGUEZ
JUAN
8002
JUAN MARTINEZ
HARW S.A.
3334455
CISCAR, 5
VALENCIA
GARCIA
8003
LUIS
HARW S.A.
3335588
SALAMANCA, 102
VALENCIA
RODRIGUEZ
SALA
100
PEDRO GRACIA
SOFT S.A.
SALAMANCA, 100
VALENCIA
MORALES
101
SALVADOR PLA
TABAC & SOFT
5661100
MAYOR, 44
SAN VICENTE
GARCIA
102
SOLEDAD
ASX. S.A.
87879998
PEREZ GALDOS,
ALICANTE
MARTINEZ
54
ORTEGA
200
SEVERINO
SEVESOFT
5779988
GENERAL LACY,
ALICANTE
MARTIN
17
MARTINEZ
55
LUIS GARCIA
HARW S.A.
5889944
POETA ALONSO,
ALICANTE
SATORRE
12
201
MANUEL
HALA S.A.
5660788
MAYOR, 64
SAN VICENTE
ORTUO
LAFUENTE
ALICANTE
ALICANTE
ALICANTE
LOS EU'S
ASTURIAS
ALICANTE
TOLEDO
LOUISSIANA
MADRID
MADRID
ASTURIAS
VALENCIA
VALENCIA
ALICANTE
VALENCIA
VALENCIA
VALENCIA
ALICANTE
ALICANTE
ALICANTE
ALICANTE
ALICANTE
tabla PIEZA
numpieza nompieza
preciovent
A-1001-L
MOUSE ADL 3B
15
7,00
Docente: Arturo
DazPulido
Bases de Datos II
C-1002-H
4,00
C-1002-J
7,00
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
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
1
numpedido
1
numvend
05/05/1992
11/10/1992
15/10/1992
16/10/1992
22/10/1992
22/08/1995
8002
02/10/1992
fecha
tabla LINPED
numpedido numlinea numpieza preciocompra cantpedida fecharecep cantrecibida
1
1
M-0001-C
300,00
10
10/05/1992
10
P-0001-33
210,00
20
10/05/1992
18
135,00
20
10/05/1992
20
150,00
20
10/05/1992
20
FD-0001144
DD-0001210
T-0002-AT
31,00
22
17/10/1992
22
5,45
100
15/10/1992
101
30,00
15/10/1992
146,00
15
17/10/1992
15
DD-0001210
P-0001-33
210,00
17/10/1992
O-0002-PP
99,00
10
17/10/1992
10
T-0002-AT
15,00
15
11/06/1993
13
O-0001-PP
15,00
1000
25/08/1995
1000
O-0002-PP
99,00
2000
25/08/1995
1998
C-400-Z
7,00
45
09/10/1992
DK144-0002P
T-0002-AT
tabla INVENTARIO
16
Pulido
Bases de Datos II
fecharecuento
15/10/1990
15/10/1992
periodorecuen
1
cantminima
15
5
3
4
5
6
110
15
2
10
15/10/1992
15/10/1992
20/10/1992
12/11/1992
1
2
1
2
3
2
0
1
10
12/11/1992
tabla PRECIOSUM
numpieza
A-1001-L
numvend
5,00
A-1001-L
4,90
A-1001-L
100
A-1001-L
2,00
C-1002-H
0,50
3
2
1,50
1
8002
8,50
7,00
4
3
DD-0001-210
DD-0001-210
DD-0001-210
DD-0001-30
1
2
101
1
150,00
170,00
140,00
120,00
3
5
15
4
DK144-0001
0,56
DK144-0002P
DK144-0002P
FD-0001-144
5,60
5,50
130,00
FD-0001-144
FD-0001-144
FD-0002-720
102
55
1
136,00
120,00
60,00
3
10
3
M-0001-C
M-0001-C
M-0002-C
M-0002-C
M-0003-C
M-0003-C
1
3
9
1
3
4
155,00
180,00
300,00
150,00
350,00
280,00
3
7
1
10
2
7
M-0003-C
200,00
O-0001-PP
O-0001-PP
19,50
55
15,00
15,00
O-0002-PP
99,00
O-0002-PP
O-0002-PP
5
101
98,75
80,00
1
10
O-0002-PP
75,00
210,00
descuento
C-400-Z
C-400-Z
O-0001-PP
diassum
C-1002-J
P-0001-33
17
4,00
preciounit
1
5
15
12
14
7
13
10
15
5
15
15
12
Docente: Arturo
DazPulido
Bases de Datos II
P-0001-33
250,00
P-0001-33
280,00
P-0001-33
250,00
P-0001-33
T-0001-IBM
5
2
280,00
90,00
3
5
T-0001-IBM
T-0001-IBM
100
1
95,00
90,00
5
15
T-0002-AT
30,00
T-0002-AT
T-0002-AT
2
4
35,00
25,00
5
7
T-0002-AT
33,00
T-0002-AT
T-0002-AT
T-0003-AT
100
201
1
34,00
30,00
77,50
2
1
3
T-0003-AT
81,45
10
10
5
5
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.
18
Pulido
Bases de Datos II
select 2
CONSULTAS SOBRE
VARIAS TABLAS
Objetivos:
Contenidos
Resolucin de requerimientos
nombre
EVA GOMEZ
EVA GOMEZ
RAFAEL ROMERO
descripcion
Fundamentos de las Bases de Datos
Diseo y Gestin de Bases de Datos
Programacin Concurrente
En primer lugar, solicitamos nombre (del profesor) y descripcion (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 codigo 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
19
Docente: Arturo
DazPulido
Bases de Datos II
asignatura, en la columna nominada como asignatura; buscando en la tercera tabla, asignaturas,
obtendr la descripcion y finalmente mostrar en pantalla el nombre y la descripcin que le
corresponde.
Ntese que no aparece MANUEL PALOMAR, o la asignatura HISTORIA DE LA INFORMTICA,
puesto que ni el primero (en nuestra BD) imparte asignatura alguna, ni la segunda es impartida por
ningn profesor (de los conocidos por nuestro sistema).
Qu pasara si no utilizramos la clusula where para enlazar las tablas? Supongamos el
siguiente requerimiento:
select asignatura, nombre from
profesores, imparte
resultado:
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
ingreso
dni
asignatura
01/10/1993 21111222
FBD
16/06/1989 21111222
FBD
16/06/1992 21111222
FBD
01/10/1993 21111222
DGBD
16/06/1989 21111222
DGBD
16/06/1992 21111222
DGBD
01/10/1993 21333444
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.
20
Pulido
Bases de Datos II
21222333 MANUEL PALOMAR TEU
21333444 RAFAEL ROMERO
ASO6
16/06/1989 21333444
16/06/1992 21333444
PC
PC
Por lo especificado por la where eliminara aquellas tuplas que no cumplieran la condicin, y nos
quedara:
dni
nombre
categoria
21111222 EVA GOMEZ
TEU
21111222 EVA GOMEZ
TEU
21333444 RAFAEL ROMERO ASO6
ingreso
dni
asignatura
01/10/1993 21111222 FBD
01/10/1993 21111222 DGBD
16/06/1992 21333444 PC
nombre
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
res, imparte
profeso where profesores.dni = imparte.dni
resultado: dni
21111222
21111222
21333444
21
nombre
EVA GOMEZ
EVA GOMEZ
RAFAEL ROMERO
Docente: Arturo
DazPulido
Bases de Datos II
Se recuerda que la ocurrencia EVA GOMEZ 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.
22
Pulido
Bases de Datos II
23
nombre
EVA GOMEZ
RAFAEL ROMERO
Docente: Arturo
DazPulido
Bases de Datos II
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.
24
Pulido
Bases de Datos II
select 3
EXPRESIONES DE
SELECCIN DE FILAS
Objetivos:
Contenidos
BETWEEN, IN
LIKE, subcadenas.
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:
creditos
6
6
6
descripcion
Fundamentos de las Bases de Datos
Diseo y Gestin de Bases de Datos
Programacin Concurrente
LISTAS
Mediante el operador IN se puede buscar un determinado valor en una lista construida usando
constantes.
25
Docente: Arturo
DazPulido
Bases de Datos II
expresin [NOT] IN (listaValores)
Descripcin de las asignaturas FBD y DGBD:
descripcion
Fundamentos de las Bases de Datos
Diseo y Gestin de Bases de Datos
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:
nombre
RAFAEL ROMERO
categoria
ASO6
Bases de Datos II
resultado: codigo
FBD
DGBD
Cdigo de las asignaturas, siendo tal cdigo de 2 caracteres:
select codigo from asignaturas where
codigo like '__ '
(2 subrayados seguidos de 3 espacios en blanco: codigo es un CHAR(5)
resultado:
codigo
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:
columna IS [NOT] NULL
Cdigo y crditos de las asignaturas de las que conocemos su nmero de crditos:
27
codigo
HI
FBD
DGBD
PC
FP
creditos
4.5
6
6
6
9
Docente: Arturo
DazPulido
Bases de Datos II
RESUMEN DE OPERADORES
Recopilamos todos los operadores y conectivas lgicas vistos hasta ahora para la construccin de
expresiones condicionales:
AND
BETWEEN
>
OR
IN
<
>=
<=
<>
IS
NULL
NOT
LIKE {%,_}
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 apellido2 Martnez o Martn.
3.
Obtener los nombres de los vendedores de las provincias de Valencia, Castelln o Alicante.
4.
5.
6.
7.
Nombre de vendedores que el nombre empieza por M seguido de cualquier carcter simple, una
R y cualquier cadena de n caracteres.
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'.
Evidentemente, la BD no diferencia entre nombre y apellido primero y segundo, por lo que se ha de tratar
como subcadenas dentro del valor del atributo.
28
Pulido
Bases de Datos II
11. Piezas3 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.
29
Docente: Arturo
DazPulido
Bases de Datos II
select fecha
FUNCIONES DE FECHA4
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 ingreso < '23/12/1989'; select
nombre from profesores where ingreso < '23/12/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.
Convierte la fecha de tipo DATE a un valor VARCHAR2
en el formato especificado en "formato"
Convierte la cadena de caracteres "cadena" de tipo
TO_DATE(cadena [, formato]) CHAR a un valor de tipo DATE con el formato
especificado en "formato"
Devuelve la fecha actual del sistema
SYSDATE
Devuelve la fecha especificada con n meses ms
ADD_MONTHS(fecha,n)
Devuelve los meses transcurridos entre fecha1 y fecha2
MONTHS_BETWEEN(fecha1,fecha2)
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.
30
Pulido
Bases de Datos II
31
Docente: Arturo
DazPulido
Bases de Datos II
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 (ingreso,'DD') from profesores where to_char(ingreso,'DD') < 15
select * from profesores where to_char(ingreso,'MM') < 6 select * from profesores where
ingreso = sysdate
Para obtener el nmero de das entre dos fechas basta con utilizar la operacin resta
select nombre, sysdate-ingreso from profesores
32
Pulido
Bases de Datos II
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.
Nmero de pieza, descripcin, fecha de recepcin, cantidad recibida, de las piezas recibidas
en el 95 y de precio de venta entre 50 y 100 euros.
33
Docente: Arturo
DazPulido
create
DEFINICIN DE DATOS
Objetivos:
Contenidos
34
Restricciones
RESTRICCIONES
Las restricciones son reglas, que normalmente se establecen en el momento de crear una tabla, para
garantizar la integridad de los datos.
Bsicamente, las restricciones obligan a cumplirse ciertas reglas cuando una fila es insertada, borrada
o modificada, de forma que la operacin se llevar a efecto slo si se cumplen las restricciones definidas
en la tabla.
Todos los SGBDR permiten crear tablas sin restricciones de clave primaria, pero un correcto diseo de bases
de datos incluir claves ajenas que no se pueden definir si no existen sus correspondientes claves primarias.
Las claves ajenas se introducen en la siguiente sesin.
35
PRIMARY KEY: identifica de manera nica a cada fila de la tabla mediante una o varias
columas, estas columnas que forman la clave primaria no pueden tener valores nulos.
FOREIGN KEY: establece una relacin entre una(s) columna(s) de la tabla y otra(s)
columna(s) de la tabla referenciada, siendo esta ltima(s) columna(s) la PRIMARY KEY.
De las restricciones, slo vamos a utilizar, de momento, la clave primaria, que puede contener tantas
columnas como se necesiten:
Por ejemplo:
create table profesores (DNI varchar2(10), nombre varchar2(40), categoria char(4), ingreso
date, primary key (DNI));6 create table asignaturas (codigo char(5), descripcion
varchar2(35), creditos number(3,1) creditosp number(3,1), primary key (codigo)) 7
resultado:
1 tabla creada
1 tabla creada
Ahora ya podemos ejecutar una consulta sobre cualquiera de estas dos tablas:
select * from profesores
resultado: ninguna fila seleccionada
El resultado de la creacin es una tabla vaca, sin filas, lista para insertar datos en ellas (orden insert,
a continuacin). Al crear una tabla, el resultado es persistente, la tabla no desaparece cuando nos
desconectamos del servidor (tampoco los datos que almacenamos en ella). Si queremos borrar una tabla
debemos ordenrselo al SGBD mediante la orden DROP TABLE:
1 tabla borrada
Al utilizar esta orden ntese que tambin se eliminan los datos (las filas) que pudiera contener. Ahora
podramos volver a crear la tabla (sin filas), con los mismos o diferentes atributos, y volver a borrarla,
y...
36
Para facilitar su uso, los nombres de tabla y las columnas no deben incluir acentos o caracteres no
habituales
El punto y coma es necesario para informar a Oracle de que una orden ha de ejecutarse y que, a
continuacin, se va a ejecutar otra orden distinta. Si slo se escribe una orden no hace falta este caracter.
No obstante, por la implementacin del cliente Worksheet, se aconseja terminar todas las rdenes con punto
y coma, incluso si slo es una.
LA ORDEN INSERT
Para introducir datos nuevos en una base de datos vamos a utilizar la orden INSERT de SQL. Con la
sintaxis que se muestra a continuacin seremos capaces de introducir datos nuevos en cualquiera de las
tablas que componen una determinada BD. En principio, veremos la expresin mnima de la orden,
formada por dos clusulas, into y values.
1 fila creada
Slo se puede indicar una tabla en la que introducir datos, no se permite una lista de nombres de
tabla para introducir datos en varias tablas a la vez. Para introducir datos en n tablas, habr que
ejecutar n sentencias INSERT.
insert into profesores, asignaturas values
(55555555,PATRICIO MARTINEZ,TU, 01/01/2000,
BdI,BASES DE DATOS I,6,0);
resultado:
Lo mismo ocurre con las filas, slo se puede indicar una lista de valores. Esto quiere decir que hay
que ejecutar una orden insert por cada una de las filas que queramos almacenar en una tabla
insert into profesores
values (66,ERNESTO PEREZ,ASO6, 10/10/2001);
resultado:
1 fila creada
Resultado
El resultado que devuelve una orden INSERT, ser siempre el nmero de filas insertadas, en el caso
de que la ejecucin haya sido correcta. Para los casos en que la ejecucin de la sentencia viole alguna
restriccin de la BD y por tanto, su ejecucin no sea correcta, el resultado indicar cul es la restriccin
violada.
El SGBD, cada vez que insertamos un nuevo dato en una tabla, se encarga de verificar las
restricciones activas, en nuestro caso las claves primarias, que como sabemos, no admiten valores
duplicados, ni valores nulos.
insert into profesores
values (66,PEPITO,XXX, 11/11/2006);
37
VALUES
Si no se va a dar valor a todas las columnas de la tabla se deber indicar las columnas a las que se
les dar valor. As, si por ejemplo, slo supiramos el dni y el nombre del profesor que queremos dar
de alta, ejecutaramos la sentencia siguiente
Insert into profesores (dni, nombre) values (88888888, ARMANDO SUAREZ);
resultado:
1 fila creada
Es recomendable acostumbrarse a poner siempre las columnas a las que se va a dar valor, sean o
no todas las de la tabla. Las razones que lo aconsejan son:
No habr que fijarse en si se va a dar valor a todas o slo a alguna de las columnas para
acomodar la sintaxis de la sentencia INSERT.
Si por alguna razn se modifica la estructura de una tabla, es decir, se aaden columnas
nuevas, y tenemos costumbre de no indicar las columnas cuando se inserta valor a todas, con
la modificacin dejarn de funcionar las sentencias que tuviramos escritas.
Existe la posibilidad de hacer uso del valor NULL. Puesto que NULL es la ausencia de valor, si lo
asignamos como valor a una columna de una tabla, lo que estaremos haciendo es indicar que esa
columna no tiene valor. La siguiente sentencia realiza la misma operacin que la anterior.
Insert into profesores (dni,nombre,categoria,ingreso) values
(88888888,ARMANDO SUAREZ, NULL, NULL);
resultado:
1 fila creada
La lista de valores se asigna a la lista de columnas, de forma que la primera columna toma el primer
valor, la segunda el segundo y as sucesivamente. Es decir, las dos sentencias siguientes realizan
exactamente la misma operacin, aunque el orden de asignacin es diferente.
Insert into profesores (dni,nombre,categoria) values
(88888888,ARMANDO SUAREZ, NULL);
resultado:
1 fila creada
1 fila creada
sto apoya an ms el hecho de que sea aconsejable poner siempre la lista de columnas, ya que an
dando valor a todas las columnas de la tabla, si no las indicamos, la lista de valores deber seguir el
orden que esas columnas tienen internamente en la tabla. Es decir, estaremos obligados a mirar las
columnas y su orden, para poder establecer el orden adecuado en la lista de valores.
38
Nombre de la restriccin.
9 (1) nombreTabla
39
RDENES CREATE
1.
Crea una tabla de nombre XX con 2 columnas, col1 de tipo integer, y col2 de tipo char(3), con col1
como clave primaria.
2.
consulta la tabla
3.
4.
5.
6.
consulta la tabla XX
7.
8.
9.
borra la tabla XX
10
40
MANIPULACIN DE
DATOS (1)
Objetivos:
Introducir al alumno en el concepto de clave ajena, influencia de las mismas en las sentencias
Insert y Delete.
Contenidos
La orden DELETE. Borrar todas las filas de una tabla. Borrar determinadas filas.
Supongamos que en la BD Ejemplo existiera una tabla llamada OPTATIVAS que contuviera los cdigos
y los crditos de aquellas asignaturas de carcter optativo.
Vamos a crear dicha tabla, eligiendo como clave primaria el cdigo de la asignatura y poniendo
adems otra restriccin, que todas las filas tengan un valor no nulo en la columna crditos
create table optativas (asignatura char (5), creditos number(3,1) not null, primary
key (asignaturas))
LA ORDEN INSERT
Existe la posibilidad de insertar el resultado de una SELECT, en lugar de indicar la lista concreta de
valores a insertar. Esto nos permite insertar varias filas en una tabla con una sola operacin, en concreto,
tantas filas como tuplas devuelva la SELECT.
resultado:
4 filas creadas
La SELECT deber seleccionar tantas columnas como columnas pongamos en la lista de columnas de
la parte insert y los tipos de datos de las columnas seleccionadas debern coincidir con los tipos de datos
de las columnas en las que se van a insertar esos valores.
Insert into optativas (asignatura) select codigo, creditos from asignaturas where creditos < 9;
resultado:
Insert into optativas (asignatura,creditos) select codigo from asignaturas where creditos < 9;
resultado:
Insert into optativas (asignatura) select codigo from asignaturas where creditos < 4;
resultado:ERROR no se puede realizar una insercin NULL en (BDI.OPTATIVAS.CREDITOS)
En esta ltima sentencia la restriccin NOT NULL sobre la columna creditos impide que se realice la
insercin de filas, para asegurar la integridad de los datos, evitando que se pongan valores nulos en esa
columna.
Por otra parte, es importante fijarse en que la sintaxis de la sentencia INSERT no permite utilizar a
la vez una lista de valores y el resultado de una consulta.
Insert into imparte (dni, asignatura) values
(55555555,select codigo from asignaturas);
resultado:
4 filas creadas
LA ORDEN DELETE
La sentencia DELETE nos permite borrar las filas contenidas en una tabla.
42
CLUSULA WHERE
Si no se especifica ninguna condicin, la sentencia causar el borrado de todas las filas de la tabla.
Delete from asignaturas;
resultado:
5 filas suprimidas
En el caso de que se indique alguna condicin, se borrarn slo aquellas filas de la tabla que cumplan
la condicin o condiciones impuestas. As, la siguiente sentencia, a diferencia de la anterior que borra
todas las filas de la tabla asignaturas, har que se borren slo las asignaturas que tengan menos de 5
crditos.
Delete from asignaturas where creditos < 5;
resultado:
1 fila suprimida
La condicin indicada en la clusula where puede ser tan complicada como se desee. Por ejemplo,
la sentencia siguiente borra aquellas asignaturas que son impartidas por profesores con categora de
TEU.
Delete from asignaturas where codigo in (select
asignatura from imparte i, profesores p where
i.dni = p.dni and p.categoria=TEU);
Resultado:
1 fila suprimida
43
Veamos otra sintaxis para definir claves ajenas, mediante las palabras reservadas FOREIGN KEY, que
nos permite designar varias columnas como clave ajena.
1 fila creada
44
secundario encontrado
Para poder realizar esta operacin, ser necesario primero eliminar las filas de imparte que hagan
referencia a esa asignatura. Una vez que la asignatura ya no est siendo referenciada desde ninguna
otra tabla, puede ser eliminada.
1 fila suprimida
1 fila suprimida
EJERCICIOS MANIPULACIN1
Si alguna de las sentencias no se puede realizar, explica el motivo del error
1.
2.
Crear la tabla AMISTAD con las columnas grado y descripcion , para reflejar los diferentes grados
de amistad y su descripcin: amigo, colega, etc. Por lo pronto vamos a crear slo la tabla. Sin
incorporar datos.
3.
Borremos la tabla LISTIN. Y volvamos a crearla, pero aadiendo una restriccin: que la columna
grado sea clave ajena que referencie a AMISTAD.
4.
Ejecutemos las sentencias del punto 1 para insertar algunas filas en LISTIN.
5.
Mirando detenidamente las anteriores sentencias hagamos SLO los insert NECESARIOS en la
tabla AMISTAD.
6.
7.
8.
Borremos TODAS las filas de AMISTAD. Mira las filas de AMISTAD y explica que sucede.
9.
10. Borremos de AMISTAD la fila que ms referencias tenga, hagamos una select de LISTIN y
contemos visualmente.
11. Borremos las filas necesarias del LISTIN que nos permitan ejecutar el punto 10.
12. Volvamos a ejecutar el punto 10.
45
MANIPULACIN DE
DATOS (2)
Objetivos:
LA ORDEN UPDATE
La sentencia UPDATE nos permite modificar la informacin contenida en una tabla.
CLUSULA SET
En la clusula SET se especifican las columnas de la tabla cuyos valores se desean modificar y los
nuevos valores que se van a asignar a dichas columnas. Por ejemplo, la siguiente sentencia hace que
la columna crditos de la tabla asignaturas pase a tener valor 0.
4 filas actualizadas
Cuando se desea modificar ms de una columna se indicar la lista de columnas y valores separadas
por comas. En el ejemplo que se muestra a continuacin, a la columna crditos se le asigna el valor 4
y a la columna crditosp el valor 2.
4 filas modificadas
Debe existir concordancia entre los tipos de datos de las columnas y el de los valores asignados a las
mismas.
46
CLUSULA WHERE
Si no se especifica ninguna condicin, la sentencia causar la modificacin de todas las filas de la
tabla.
3 filas modificadas
En el caso de que se indique alguna condicin, se modificarn slo aquellas filas de la tabla que
cumplan la condicin o condiciones impuestas. As, la siguiente sentencia, a diferencia de la anterior
que modifica todas las filas de la tabla profesores, har que se modifique la fecha de ingreso slo a
aquellos profesores cuya categora sea TEU.
2 filas modificadas
La condicin indicada en la clusula where puede ser tan complicada como se desee. Por ejemplo,
la sentencia siguiente modifica los crditos de las asignaturas que son impartidas por profesores con
categora de TEU.
1 fila modificada
47
1 fila actualizada
Si la restriccin de que la consulta devuelva una fila y una columna no se cumple no se realiza la
actulizacin.
La segunda opcin asigna el resultado de una consulta a una lista de columnas. En este caso, la
sentencia SELECT devolver una nica fila, pero con tantas columnas como elementos haya en la lista
de columnas. Los valores se asignan por orden, de forma que a la primera columna se le asigna el valor
de la primera columna de la SELECT, a la segunda la segunda, y as sucesivamente. En el ejemplo
siguiente se seleccionan dos columnas para dar valor a las columnas dni y asignatura de la tabla
impartir.
1 fila actualizada
resultado:
Deber existir una concordancia de tipo de dato y longitud entre los elementos de la lista de columnas
y las columnas seleccionadas.
1 fila insertada
1 fila suprimida
Resultado:
1 fila suprimida
12
Recurdese que el identificador de restriccin (en este caso, una clave ajena) lo asigna el sistema y puede
cambiar de un usuario a otro.
49
RDENES MANIPULACIN2
Los siguientes ejercicios se ejecutarn sobre la base de datos de Proveedores, ya conocida. Antes de
comenzar, debers ejecutar las instrucciones contenidas en el fichero BD1CreateBD.sql para la
creacin de la BD e insercin de datos iniciales.
1.
Haz que la fecha de recuento del inventario de todas las piezas sea el 1 de enero de 2003.
2.
Modifica la cantidad mnima de todas las piezas inventariadas que cumplan que la cantidad
disponible es menor. Haz que tomen el valor de la cantidad disponible de cada una de ellas.
3.
Para aquellos vendedores para los que no tengamos telfono, ponles el valor SIN TLFNO.
4.
Haz que la calle, la ciudad y la provincia de los vendedores de TOLEDO sea CENTRAL,
5,SALAMANCA, SALAMANCA.
5.
Modifica los datos de las piezas que no tengan descripcin. Haz que tomen el valor SIN
DESCRIPCION.
6.
Las piezas suministradas por el vendedor de nmero 3 van a ser suministradas a partir de ahora
por el de nmero 500, a un preciounitario de 5 euros.
7.
8.
9.
Modifica los pedidos realizados por el vendedor de nmero 200 de forma que los haya realizado
el vendedor de nmero 1000.
10. El pedido con nmero 8 va a tener a partir de ahora el nmero 4, el pedido con nmero 5 va a
tener a partir de ahora el pedido con nmero 1, el 8 ser el 2 a partir de ahora y el 3 el 2.
11. Para los pedidos en los que la cantidad recibida variara de la pedida, haz que no sea as.
12. Actualiza la ciudad y la provincia de los vendedores que no sean de ALICANTE. Asgnales los
valores de la ciudad y la provincia del vendedor de nmero 3.
13. Modifica la descripcin de las piezas que estn SIN DESCRIPCIN asignndoles la descripcin
de la que tenga el precio de venta igual a 7 euros.
14. Actualiza el precio de venta de la pieza de nmero A-1001-L a 4 euros y el de la pieza de nmero
C-1002-H a 15.
15. A partir de ahora el vendedor nmero 5 suministrar la pieza DISKETTE 1.44 PANASONIC al
precio de venta de la misma.
16. Haz lo mismo que en el ejercicio anterior, pero para el vendedor de nmero 200.
17. Los pedidos del vendedor nmero 3 han sido realizados a fecha de hoy.
18. Pon el precio de compra igual al precio de venta, la cantidad pedida y recibida a 100 y la fecha
de recepcin a la fecha del da, para las lneas de pedido en las que la pieza pedida sea A-1001L.
19. Modifica los datos de las piezas recontadas con anterioridad al 1 de enero de 2003 de forma
que el perodo de recuento sea el mismo que para las piezas recontadas
50
INTEGRIDAD
REFERENCIAL Y
BORRADOS
Objetivos:
Extender la gestin de las claves ajenas y automatizar el borrado cuando produce problemas
de integridad referencial.
Contenidos
ON DELETE
Ya se ha practicado con la integridad referencial en sesiones anteriores y se ha visto que el intento
de borrar ciertas filas es rechazado por el SGBD si stas estn siendo referenciadas por alguna clave
ajena. Recordemos la estructura y el contenido de la base de datos Ejemplo:
PROFESORES ( dni : char(9), nombre : char(25), categoria : char(4), ingreso : date ) Clave
primaria: dni
ASIGNATURAS ( codigo : char(5), descripcion : char(40), creditos : decimal(3,1),
creditosp : decimal(3,1) )
Clave primaria: codigo
IMPARTE ( dni : char(9), asignatura : char(5) )
Clave primaria: (dni, asignatura)
Clave ajena: dni PROFESORES
Clave ajena: asignatura ASIGNATURAS
Extensiones de Ejemplo:
ASIGNATURAS
codigo descripcion
HI
FBD
DGBD
PC
FP
creditos creditosp
HISTORIA DE LA INFORMATICA
FUNDAMENTOS DE LAS BASES DE DATOS
DISEO Y GESTION DE BASES DE DATOS
PROGRAMACION CONCURRENTE
FUNDAMENTOS DE LA PROGRAMACION
4.5
6.0
6.0
6.0
9.0
1.5
3.0
1.5
4.5
51
PROFESORES
dni
nombre
21111222
21222333
21333444
IMPARTE
dni asignatura
categoria ingreso
EVA GOMEZ
MANUEL PALOMAR
RAFAEL ROMERO
TEU
TEU
ASO6
21111222
21111222
21333444
01/10/1993
16/06/1989
16/06/1992
FBD
DGBD
PC
No hay ningn problema en borrar cualquier fila de la tabla IMPARTE, no existen claves ajenas que
les hagan referencia, pero tanto PROFESORES como ASIGNATURAS son referenciadas por las claves
ajenas definidas en IMPARTE y segn el estado de la BD ciertas filas pueden ser eliminadas y otras no.
Por ejemplo, podemos eliminar Historia de la Informtica puesto que ningn profesor la imparte, pero
si intentamos eliminar Fundamentos de las Bases de Datos el sistema mostrar un error y no realizar
la operacin.
PROPAGAR EL BORRADO
Supongamos que la tabla IMPARTE de la BD Ejemplo tiene la siguiente definicin:
1 fila suprimida
ASIGNATURAS
codigo descripcion
HI
DGBD
PC
FP
52
creditos creditosp
HISTORIA DE LA INFORMATICA
DISEO Y GESTION DE BASES DE DATOS
PROGRAMACION CONCURRENTE
FUNDAMENTOS DE LA PROGRAMACION
4.5
6.0
6.0
9.0
3.0
1.5
4.5
PROFESORES
dni
IMPARTE
nombre
21111222
21222333
21333444
categoria ingreso
EVA GOMEZ
MANUEL PALOMAR
RAFAEL ROMERO
TEU
TEU
ASO6
dni
01/10/1993
16/06/1989
16/06/1992
21111222
21333444
asignatura
DGBD
PC
1 fila suprimida
ASIGNATURAS
codigo descripcion
DGBD
PC
FP
creditos creditosp
PROFESORES
21111222
21222333
21333444
6.0
6.0
9.0
3.0
1.5
4.5
IMPARTE
EVA GOMEZ
MANUEL PALOMAR
RAFAEL ROMERO
TEU
TEU
ASO6
01/10/1993 asignatura
16/06/1989
16/06/1992
21111222
21333444
DGBD
PC
Sin embargo, ntese que la clave ajena dni que hace referencia a PROFESORES no tiene modificado
su comportamiento ante borrados:
1 fila borrada
La fila de Eva GOMEZ no ha podido ser eliminada puesto que imparte DGBD (y no se ha modificado
con ON DELETE) pero s se ha borrado la de Manuel Palomar, que no imparte asignatura alguna.
ASIGNATURAS
codigo descripcion
DGBD
PC
FP
creditos creditosp
PROFESORES
6.0
6.0
9.0
3.0
1.5
4.5
IMPARTE
EVA GOMEZ
MANUEL PALOMAR
TEU
TEU
01/10/1993
16/06/1989
21111222
21333444
DGBD
PC
53
resultado:
El sistema ha intentado cambiar el valor 21111222 en la tabla IMPARTE por un nulo pero, al ser
parte de la clave primaria, ha rechazado la operacin.
Supongamos que la tabla imparte tiene esta otra definicin:
ASIGNATURAS
codigo descripcion
HI
FBD
DGBD
PC
FP
creditos creditosp
HISTORIA DE LA INFORMATICA
FUNDAMENTOS DE LAS BASES DE DATOS
DISEO Y GESTION DE BASES DE DATOS
PROGRAMACION CONCURRENTE
FUNDAMENTOS DE LA PROGRAMACION
PROFESORES
dni
nombre
21111222
21222333
21333444
EVA GOMEZ
MANUEL PALOMAR
RAFAEL ROMERO
IMPARTE
ficha dni asignatura
1
2
3
54
21111222
21111222
21333444
FBD
DGBD
PC
4.5
6.0
6.0
6.0
9.0
categora ingreso
TEU
TEU
ASO6
01/10/1993
16/06/1989
16/06/1992
1.5
3.0
1.5
4.5
1 fila borrada
El sistema puede borrar la fila de la profesora Eva GOMEZ, poniendo nulos en cualquier referencia
que halle en la clave ajena afectada de IMPARTE.
PROFESORES
dni nombre
21222333
21333444
MANUEL PALOMAR
RAFAEL ROMERO
IMPARTE
ficha dni
1
2
3
categoria ingreso
21333444
TEU
ASO6
16/06/1989
16/06/1992
asignatura
FBD
DGBD
PC
55
RDENES MANIPULACIN3
Los siguientes ejercicios se ejecutarn sobre la base de datos de Proveedores, ya conocida. Antes de comenzar,
debers ejecutar las instrucciones contenidas en el fichero BD1CreateBD2.sql para la creacin de la BD e
insercin de datos iniciales. Ntese que se han efectuado cambios en la definicin de ciertas claves ajenas para
incorporar las polticas de mantenimiento de la integridad referencial ante borrados:
PRECIOSUM
PEDIDO
LINPED
INVENTARIO
Para la comprobacin de los efectos de las siguientes rdenes es conveniente tener a mano la sesin Select 1
donde se muestra el contenido original de la BD PROVEEDORES.
1.
Borra el vendedor 1.
2.
3.
Borra el vendedor 3.
4.
5.
6.
7.
Borra el pedido 6
8.
9.
Ante borrados en PIEZA, rechazar la operacin si existen referencias, y as con todas las claves ajenas
definidas.
56
Conjuntos
OPERACIONES DE
CONJUNTOS
Objetivos:
Contenidos
Intersect
Minus
Resolucin de requerimientos.
nombre
RAFAEL ROMERO
57
select nombre
from profesores p, imparte i, asignaturas where
p.dni=i.dni and asignatura=codigo and creditos=6
resultado:
nombre
RAFAEL ROMERO
EVA GOMEZ
EVA GOMEZ
En el resultado final aparecern todas las filas que estn en cualquiera de los dos resultados.
select nombre from
profesores
where categoria=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 GOMEZ
EVA GOMEZ
con UNION
nombre
RAFAEL ROMERO
EVA GOMEZ
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 categoria=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.
58
Supongamos que queremos saber el nombre de los profesores que son ASO6 y no imparten
asignaturas de 6 crditos.
select nombre from
profesores
where categoria=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
categoria=ASO6
resultado:
nombre EVA
GOMEZ
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.
CONSULTAS CONJUNTOS
1.
Nombre de las empresas que tienen vendedores con pedidos O que puedan suministrar la pieza
A-1001-L.
2.
Nombre de las empresas que tienen vendedores con pedidos Y que puedan suministrar la pieza
A-1001-L.
3.
Nombre de las empresas que tienen vendedores con pedidos PERO NO suministran la pieza A1001-L.
4.
5.
Nmero y nombre de las piezas que suministra el vendedor nmero 1, pero no el vendedor
nmero 2.
6.
Nmero y nombre de las piezas con un precio de venta mayor que 1000, y todas las que pueden
ser suministradas por el vendedor nmero 1, ordenado por nombre.
7.
Nmero y nombre de las piezas que han sido pedidas pero no inventariadas
8.
Nmero y nombre de los vendedores de la empresa MECEMSA que, adems, tienen suministros
de precio unitario mayor que 10 o se les ha hecho algn pedido
59
Funciones
ARITMTICA Y
FUNCIONES
AGREGADAS
Objetivos:
Contenidos
operaciones aritmticas: +, -, *, /
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 descripcion, (creditos/3)*2 from asignaturas
resultado:
descripcion
Historia de la Informtica
Fundamentos de las Bases de Datos
Diseo y Gestin de Bases de Datos
Programacin Concurrente
Fundamentos de Programacin
(creditos/3)*2
3
4
4
4
6
Descripcin de las asignaturas y nmero de horas semanales de las asignaturas con menos de 4
horas semanales de clase:
select descripcion, creditos from asignaturas where (creditos/3)*2 < 4
resultado:
60
descripcion
Historia de la Informtica
creditos
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 )
nmero de filas
nmero de valores distintos en la columna 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 ( creditos ) ) no est permitido.
( count( * ) ) 3
( count( * ) ) 4
( count )
3
Cul es la media de crditos por asignatura?
select avg( creditos ) from asignaturas
resultado:
( avg )
61
6.3
( avg )
4.2
sum( creditos )
12
62
num_asignaturas mediactos
5
6.30
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.
Obtener la cantidad de provincias distintas de las que tenemos conocimiento de algn proveedor.
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.
63
Group by
INFORMACIN
AGRUPADA
Objetivos:
Contenidos
GROUP BY
Resolucin de requerimientos.
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 GOMEZ
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.
64
ERROR
( count(*) )
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.
( count(*) )
1
1
NOMBRE
JUAN
JUAN
INGRESO
OPERACIN
1
2
3
CLIENTE
21
22
22
INGRESO
1000
2000
3000
65
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 un 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
resultado: dni
21333444
21111222
66
asignaturas
1
2
CONSULTAS GROUP BY
NOTA: es muy recomendable, aunque no se especifique explcitamente en el
requerimiento, que la salida se ordene ascendentemente (por defecto) por
las columnas no calculadas de la lista de la clusula select.
NOTA: as mismo, se deben etiquetar las columnas calculadas.
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.
67
group by - having
SELECCIN DE
INFORMACIN
AGRUPADA
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 GOMEZ
asignaturas
2
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 GOMEZ 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.
68
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.
69
Subselect
CONSULTAS ANIDADAS
Objetivos:
Utilizar el resultado de una sentencia select para establecer las condiciones de otra sentencia
select.
Contenidos
Subqueries.
Resolucin de requerimientos.
Cuando una orden select se encuentra dentro de la clusula where de otra select recibe el nombre
de subconsulta (subquery). Por ejemplo :
creditos
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.
70
nada
Siempre que la subselect devuelva algo, nicamente ser en una y nada ms que una
columna (salvo el operador EXISTS).
Nombre de la asignatura que tiene el mnimo nmero de crditos (es equivalente al primer ejemplo)
:
select descripcion from
asignaturas
where creditos <= ALL ( select creditos from asignaturas )
resultado: descripcion
Historia de la Informtica
creditos
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).
Nombre de las asignaturas que no tienen el mnimo nmero de crditos:
select descripcion from
asignaturas
where creditos > ANY ( select creditos from asignaturas )
resultado:
creditos
descripcion
6
Fundamentos de las Bases de Datos
6
Diseo y Gestin de Bases de Datos
71
6
9
Programacin Concurrente
Fundamentos de la Programacin
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 descripcion from
asignaturas
where creditos != ( select min(creditos) 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
resultado:
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
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.
73
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 codigo from asignaturas a
where not exists ( select asignatura from imparte i
where i.asignatura=a.codigo 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 :
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.
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.
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).
75
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
76
Adicionales 2
EJERCICIOS
ADICIONALES
CONSULTAS
1.
Obtener el nombre de los vendedores y la cantidad de piezas que pueden suministrar, ordenado
alfabticamente por vendedor.
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
EJERCICIOS ADICIONALES
CONSULTAS
78
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.
Para las piezas recibidas en domingo, obtener el nmero de la pieza, su nombre y el nmero y nombre
del vendedor al que se le solicitaron. Ordena el resultado por el nombre de la pieza.
Adicionales 4
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.
Obtener para los vendedores de Alicante o Madrid, el nmero y nombre de vendedor junto con el
importe total que les hemos pagado a travs de todos los pedidos que se les ha solicitado.
79
Adicionales 5
CONSULTAS
80
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.
Obtener el nombre de la empresa que tiene ms de tres vendedores, y al menos dos de ellos son de
la provincia de Alicante.
6.
Obtener los nombres y empresas de los vendedores que no son de la Comunidad Valenciana, de los
que se desconoce el telfono.
Adicionales 6
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.
Para la pieza (o piezas) de precio de venta mayor, obtener el nombre de la pieza y nmero
total de vendedores que la pueden suministrar.
4.
Obtener el nombre de vendedor para los vendedores cuya media de precio unitario de
suministro sea mxima.
5.
6.
7.
Nmero de pedido, y nmero y nombre de vendedor del pedido que no es el de menor importe
de venta (preciocompra*cantrecibida) siendo el ao del pedido posterior al 1992 (>1992).
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.
81
Adicionales 7
CONSULTAS
82
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.