You are on page 1of 82

Prctica

[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

Concepto de Base de Datos y Tabla.


Entrar en MySQL.
Manejo de mens.
Seleccin de Base de Datos.
Tipos de datos.
Ayuda en lnea.
Salvar y recuperar rdenes SQL.

Concepto de Base de Datos y Relacin (Tabla)


Una base de datos es un conjunto de informacin interrelacionada que representa un sistema de
informacin particular, y est compuesta por relaciones, o ms comnmente tablas, que almacenan
los datos referentes a un objeto o a una interrelacin entre objetos.
As, si queremos mantener mediante un gestor de bases de datos informacin docente, lo que
haremos (en este caso en particular) ser crear una base de datos que englobe tres tablas:
PROFESORES, ASIGNATURAS e IMPARTE. Cada tabla tendr sus columnas, que representan los
correspondientes atributos de la entidad o claves ajenas que permiten relacionar varias tablas entre
s. La BD que gestione esta informacin se llamar Ejemplo, y las tablas contenidas en ella se
presentan en el siguiente cuadro.

Base de Datos: Ejemplo


PROFESORES ( dni : varchar(10), nombre : varchar(40), categoria : char(4), ingreso : date )
Clave primaria: dni
ASIGNATURAS ( codigo : char(5), descripcion : varchar(35), creditos : number(3,1), creditosp :
number(3,1) )
Clave primaria: codigo
IMPARTE ( dni : varchar2(10), asignatura : char(5) )
Clave primaria: (dni, asignatura)
Clave ajena: dni PROFESORES
Clave ajena: asignatura ASIGNATURAS

Extensiones de Ejemplo:
2

Docente: Arturo Daz Pulido

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.

Docente: Arturo DazPulido

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

Docente: Arturo DazPulido

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

Docente: Arturo Daz Pulido

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',...)

del nmero de valores


1, 2, 3, 4 8 bytes,
dependiendo del nmero de

SET('value1','value2',...)

valores

Diferencia de almacenamiento entre los tipos Char y VarChar


CHAR(4

Almace

Almace

Valor

namiento VARCHAR(4) namiento

''

''

4 bytes

"

1 byte

'ab'

'ab '

4 bytes

'ab'

3 bytes

'abcd'

'abcd'

4 bytes

'abcd'

'abcdefgh'

'abcd'

4 bytes

'abcd'

5 bytes

Docente: Arturo DazPulido

Bases de Datos II

SELECT 1
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
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

Docente: Arturo Daz Pulido

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

Para evitar la salida de filas duplicadas podemos utilizar el modificador DISTINCT:


select distinct categoria from profesores
resultado:

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'

Docente: Arturo DazPulido

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

Docente: Arturo Daz

Bases de Datos II
6
6
6
9

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 ', 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

Docente: Arturo Daz

Bases de Datos II

LA BASE DE DATOS PROVEEDORES


TABLA COLUMNAS RESTRICCIONES
VENDEDOR
( numvend NUMBER(4),
nomvend VARCHAR2(30),
nombrecomer VARCHAR2(30),
telefono CHAR(11), calle
VARCHAR2(30), ciudad
VARCHAR2(20), provincia
VARCHAR2(20) )

Clave Primaria: (numvend)

PIEZA

( numpieza VARCHAR2(16),
nompieza VARCHAR2(30),
preciovent NUMBER(9,2))

Clave Primaria: (numpieza)

PRECIOSUM

( numpieza VARCHAR2(16),
numvend NUMBER(4),
preciounit NUMBER(9,2),
diassum NUMBER(3),
descuento NUMBER(2))

Clave Primaria: (numpieza, numvend)

( numpedido NUMBER(5),
numvend NUMBER(4), fecha
DATE )

Clave Primaria: (numpedido)

( numpedido NUMBER(5),
numlinea NUMBER(2),
numpieza VARCHAR2(16),
preciocompra NUMBER(9,2),
cantpedida NUMBER(4),

Clave Primaria: (numpedido, numlinea)

PEDIDO

LINPED

Clave Ajena: (numpieza) PIEZA,


Clave Ajena: (numvend) VENDEDOR

Clave Ajena: (numvend) VENDEDOR

Clave Ajena: (numpedido) PEDIDO


Clave Ajena: (numpieza) PIEZA

fecharecep DATE, cantrecibida


NUMBER(4))
INVENTARIO

( numpieza VARCHAR2(16),
numbin NUMBER(10),
cantdisponible NUMBER(5),
fecharecuento DATE,
periodorecuen NUMBER(2),
cantminima NUMBER(5) )

Clave Primaria: (numbin)


Clave Alternativa: (numpieza)
Clave Ajena: (numpieza) PIEZA

La base de datos pretende reflejar la poltica de compras de una empresa de distribucin. Se


compran (tablas PEDIDO y LINPED) ciertas mercancas a los distintos proveedores (tabla VENDEDOR)
y son vendidas posteriormente al pblico o a otros distribuidores (que no hemos considerado en la
BD)
Bsicamente, las tareas que se pretenden mecanizar son las siguientes (entre parntesis aparecen
las tablas directamente relacionadas con cada una):

Lista de suministradores (vendedor).


13

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.

Catlogo de venta (pieza)

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).

De aquellas mercancas que se solicitan a los proveedores, controlar si se han servido en el


tiempo estimado y en la cantidad pedida.
Cada pedido consta de:

Cabecera de pedido (tabla pedido), donde se especifica qu vendedor nos ha suministrado el


pedido completo, y la fecha en que se realiz el pedido.

Lneas de pedido (tabla linped), donde un conjunto de lneas pertenecientes a un mismo


pedido se numeran desde la nmero 1 en adelante. Contiene el cdigo de pieza que sirvi el
proveedor, la cantidad que se le pidi y la cantidad que realmente ha servido a nuestra
empresa y la fecha en la que se recibi, as como el precio al que se le compro (puede ser
diferente al estipulado en preciosum).
Slo aquellas piezas que aparezcan en una lnea de pedido han sido solicitadas al
correspondiente vendedor y, si la cantidad recibida es mayor que cero, habrn sido recibidas
por la empresa en esa cantidad.
Control de existencias (inventario, pieza).

Mediante la confeccin de un inventario, donde cada entrada, que corresponde a un nico


artculo, es el recuento real de existencias.

14
Pulido

Docente: Arturo Daz

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

FILTRO PANTALLA X200


DISCO DURO WESTERN DIG 210M 28
DISCO DURO 30M SEAGATE
DISKETTE 1.44 PANASONIC
PACK DISKETTE 144 PANASONIC
FLOPPY 1.44 IBM
FLOPPY 720K IBM
MONITOR SYNCMASTER 3 COLOR
MONITOR COLOR SONY BT
MONITOR IBM 3570 COLOR
PEGATINAS CONCIERTO JEVI
PACK PEGATINAS CONCIERTO JEVI
PLACA INTEL 33Mz
TECLADO XT IBM
TECLADO AT SUSUSU
TECLADO AT HP
TECLADO ESTANDAR 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

Docente: Arturo Daz

Bases de Datos II

numpieza numbin cantdisponible


DD-0001-30
1
120
P-0001-33
2
10
O-0002-PP
M-0001-C
M-0003-C
DD-0001210
FD-0001144

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.

Obtener todos los nmeros de piezas de las piezas de la base de datos.

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.

Nombre de los vendedores con nmero de vendedor menor que 6.

6.

Modificar el requerimiento anterior para eliminar duplicados.

7.

Nmero y nombre de los vendedores con nmero de vendedor menor que 6.

8.

Obtener todos los nmeros de los vendedores de los que se sepa que pueden suministrar alguna
pieza.

9.

Vendedores de la provincia de Alicante.

10. Nombre y empresa de los vendedores de la Comunidad Valenciana.


11. Nmeros de vendedores y das que tardaran en suministrar la pieza 'P-0001-33'
12. Cdigos de pieza solicitados en el pedido 1, ordenados de mayor a menor precio de compra.
13. Nmeros de pedido y nmeros de vendedor, para los pedidos solicitados el 15 de octubre de
1992.
14. Cdigos de pieza de los que se sabe que algn vendedor nos podra hacer descuento.
15. Cdigos de pieza, de posible suministrador y precio de suministro, ordenados por cdigo de
vendedor y cdigo de pieza.

18
Pulido

Docente: Arturo Daz

Bases de Datos II

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

UTILIZACIN DE MS DE UNA TABLA


Para la resolucin de la mayora de requerimientos es necesario trabajar con informacin que se
obtiene de relacionar varias tablas. La forma de especificar qu tablas vamos a consultar es construir
una lista de nombres de tablas en la clusula FROM.
Si seleccionamos la BD Ejemplo, podemos preguntar por el nombre de los profesores y la
descripcin de las asignaturas que imparten; esta informacin se encuentra almacenada en la tabla
imparte, que relaciona las claves primarias de cada una de las tablas asociadas por tal relacin.
select nombre, descripcion from
asignaturas, imparte, profesores where
profesores.dni = imparte.dni
and asignatura = codigo
resultado:

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

Si no indicamos nada en la clusula where la informacin que obtenemos es simplemente la


combinacin de cada tupla con todas las dems: si hay 3 tuplas en imparte y otras 3 en profesores,
la cardinalidad de la relacin resultante es 3 x 3 = 9 tuplas. Si en la clusula from pusiramos,
adems, la tabla asignaturas, el resultado final tendra 3 x 3 x 5 = 45 tuplas.
Veamos en detalle como funciona la orden select-from-where para el caso de la siguiente
consulta (cdigos de asignaturas y nombre de los profesores que las imparten) 1:
select asignatura, nombre
from profesores, imparte
where profesores.dni = imparte.dni
resultado:
asignatura
nombre
FBD
EVA GOMEZ
DGBD
EVA GOMEZ
PC
RAFAEL ROMERO
El SGBD primero combinara todas las tuplas con todas de las tablas especificadas en el from:
dni
nombre
categoria
21111222 EVA GOMEZ
TEU
21222333 MANUEL PALOMAR TEU
21333444 RAFAEL ROMERO
ASO6
21111222 EVA GOMEZ
TEU
21222333 MANUEL PALOMAR TEU
21333444 RAFAEL ROMERO
ASO6
21111222 EVA GOMEZ
TEU

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

Docente: Arturo Daz

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

Y por ltimo, las columnas especificadas en la select determinaran el resultado final:


asignatura
FBD
DGBD
PC

nombre
EVA GOMEZ
EVA GOMEZ
RAFAEL ROMERO

NOMBRES CUALIFICADOS DE ATRIBUTO


Si observamos la sentencia select anterior, al comparar los dni que aparecen en profesores y en
imparte hemos utilizado el nombre de la tabla a la que pertenecen cada uno, profesores.dni e
imparte.dni.
Si en el conjunto de columnas de todas las tablas que se especifican en la clusula from existen
varias con nombres iguales, deberemos especificar en todo momento la tabla de la que queremos
extraer la informacin. Caso de no existir ambigedad, no es necesario utilizar el nombre de la tabla;
ni asignatura ni codigo se utilizan en otras tablas.
Si deseamos conocer el dni y el nombre de los profesores que imparten alguna asignatura,
buscaremos en imparte los dni de los profesores (son los que tienen al menos una asignatura
asignada), y con este valor obtendremos el nombre en profesores.
select dni, nombre from profesores, imparte where
profesores.dni = imparte.dni
resultado:

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

Docente: Arturo Daz

Bases de Datos II

SINNIMOS TEMPORALES DE TABLA


Para facilitar la escritura de las sentencias select (entre otros posibles motivos) se pueden utilizar
alias temporales, nombres alternativos de las tablas. Se especifican en la lista de tablas del from,
antes de la , que separa el nombre de la tabla en cuestin de la siguiente.

select distinct p.dni, nombre


from profesores p, imparte i
where p.dni = i.dni
resultado: dni
21111222
21333444

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.

Modificar el requerimiento anterior para eliminar duplicados.

3.

Lista el nombre y nmero de las piezas.

4.

Obtener el nombre y nmero de proveedores de la provincia de Valencia.

5.

Obtener el nombre y nmero de proveedores de la provincia de Valencia a los que se les ha


solicitado un pedido.

6.

Obtener los nmeros de lnea y su precio de compra del pedido nmero 1.

7.

Obtener todas las piezas que se recuenten el 15 /10/1992.

8.

Obtener nmero y nombre de todas las piezas recibidas el 1 de Mayo de 1992.

9.

Precio unitario de suministro del nmero de pieza A-1001-L y el vendedor 100.

10. Nombres de proveedores que puedan suministrarnos la pieza numero A-1001-L


11. Obtener nombre, telfono, y ciudad del vendedor que puede suministrarnos piezas con valor
mayor de 100.
12. Obtener los vendedores que pueden suministrarnos piezas con un descuento de ms de 10%.
13. Obtener los nmeros de pedido del vendedor nmero 1.
14. Obtener los vendedores ordenados alfabticamente en orden descendente.
15. dem en orden ascendente.
16. Obtener los nmeros de pieza de las que conozcamos algn vendedor que nos la pueda
suministrar.
17. Nmero y nombre de las piezas que puedan suministrarnos el vendedor nmero 2 y el 4 (no
necesariamente que las puedan suministrar los dos).
18. Piezas que nos puedan suministrar los vendedores de la empresa Harw S.A.
19. Nmero, nombre y precio de venta de las piezas que han sido compradas en un pedido
servido por el vendedor 1.
20. Nmero y nombre de vendedor, y pieza que ha sido comprada a un precio mayor que el
estipulado en la lista de precios de suministro.
21. Nmero de pieza y nmero y nombre de vendedor de aquellas piezas cuyo precio de venta
es mayor que 50 o su descuento de suministro es mayor que 10.
22. Pedidos y datos del vendedor cuya fecha de pedido no sea el 22 de octubre de 1992.
23. Precios a los que nos pueden ser suministradas las piezas DD-0001-210 y FD-0001-144, y
nmero y nombre de los vendedores que las podran suministrar a esos precios.

24
Pulido

Docente: Arturo Daz

Bases de Datos II

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:

expresin [NOT] BETWEEN expresin AND expresin


Por ejemplo, deseamos conocer los crditos y descripcin de las asignaturas cuyo nmero de
crditos est entre 5 y 8.

select creditos, descripcion from asignaturas where creditos between 5 and 8


resultado:

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:

select descripcion from asignaturas where codigo in ('FBD', 'DGBD')


resultado:

descripcion
Fundamentos de las Bases de Datos
Diseo y Gestin de Bases de Datos

Nombre de los profesores que no imparten HI, FBD o DGBD:

select nombre from profesores p, imparte i


where p.dni = i.dni and asignatura not in ('HI', 'FBD', 'DGBD')
resultado:

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:

columna [NOT] LIKE 'cadena'


La cadena de caracteres cadena admite los comodines % y _ , equivalentes en uso a los
comodines de MS-DOS * y ?, es decir, el primero indica una cadena de caracteres de cualquier
longitud, y el segundo un carcter cualquiera.

Profesores que atiendan al nombre de 'RAFA':


select * from profesores where
nombre like 'RAFA%'
resultado: dni
21333444

nombre
RAFAEL ROMERO

categoria
ASO6

Cdigo de las asignaturas de 'Bases de Datos'


select codigo from asignaturas
where descripcion like '%BASES DE DATOS%'
26
Pulido

Docente: Arturo Daz

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:

select codigo, creditos from asignaturas


where creditos is not null
resultado:

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.

Nombres de vendedores que empieza su nombre por J.

5.

Nombres de vendedores que termina su nombre por Z.

6.

Nombres de vendedores que se apellidan Lpez.

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

Docente: Arturo Daz

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

Docente: Arturo Daz

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

Docente: Arturo Daz

Bases de Datos II

CONSULTAS SELECT FECHA


1.

Obtener el nmero de pieza de las piezas que se recuenten el 15/10/92.

2.

Nmeros de pieza de las piezas que se recuentan entre el 1 de Octubre de 1992 y el 31 de


Octubre de 1992.

3.

Nmero y fecha de los pedidos solicitados en el segundo semestre del 92.

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.

Aos en que se ha efectuado algn recuento.

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:

Introducir al alumno a la definicin de datos.

Contenidos

34

Las rdenes CREATE TABLE y DROP TABLE

Restricciones

La orden INSERT (1)

Informacin sobre las restricciones de una tabla

LA ORDEN CREATE TABLE


La definicin de tablas es el primer paso en la creacin de una base de datos. El conjunto de
descripciones de tablas conforma el esquema de base de datos y representa a un sistema de informacin
concreto.
Supongamos que vamos a implementar un esquema de base de datos relacional de profesores,
asignaturas (slo es un listado de profesores y asignaturas, sin relaciones entre ellos). En primer lugar
debemos decidir cules son los atributos de cada uno de ellos y sus tipos de datos:
PROFESORES
(DNI: varchar2(10), nombre:
varchar2(40), categoria:
char(4),
ingreso: datetime)
ASIGNATURAS
(codigo: char(5), descripcion:
varchar2(35),
creditos:
number(3,1)
creditosp:
number(3,1))
Para cumplir con las restricciones del modelo relacional, adems, debemos elegir las claves primarias
adecuadas5: DNI para profesores y codigo para asignaturas. Obviamente, la forma que tienen estas
tablas ha sido una decisin nuestra como diseadores de esta base de datos concreta, en otra situacin
hubiramos, probablemente, decidido definir otros atributos y otras tablas.
La orden CREATE TABLE nos permite crear cada una de las tablas necesarias para nuestra base de
datos:

CREATE TABLE nombreTabla ( {listaColumnas} [,{restricciones}] )


La lista de columnas, en su forma ms sencilla, es un conjunto de expresiones (tantas como columnas
deseemos, y separadas por comas) del tipo: columna tipoDatos[,columna tipoDatos[, ...]]

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.

Podemos contemplar los siguientes tipos de restricciones de integridad de datos:

NOT NULL: especifica que la columna no puede contener un valor nulo.

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.

CHECK: especifica una condicin que se debe evaluar a cierto.

De las restricciones, slo vamos a utilizar, de momento, la clave primaria, que puede contener tantas
columnas como se necesiten:

PRIMARY KEY (columna[,columna[, ...]])

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:

DROP TABLE nombreTabla


Por ejemplo:
drop table asignaturas
resultado:

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.

INSERT INTO nombreTabla


VALUES ( listaExpresiones )
Supongamos que en la base de datos anterior queremos dar de alta un nuevo profesor. Si dicho
profesor tiene como dni el 55555555, nombre PATRICIO MARTNEZ, categora TU y fecha de
incorporacin 01/01/2000, deberamos ejecutar la siguiente orden.
Insert into profesores values (55555555,PATRICIO MARTINEZ,TU,01/01/2000);
resultado:

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:

ERROR falta la palabra clave values

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

resultado: ERROR restriccin nica (BDI.SYS_C0033923) 8 violada

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

Insert into profesores (categoria,dni,nombre) values


(NULL, 88888888,ARMANDO SUAREZ);
resultado:

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.

INFORMACIN SOBRE UNA TABLA


Recordemos que ejecutar DESC nombreTabla o DESCRIBE nombreTabla, muestra informacin
sobre las columnas que componen la tabla, el orden interno de las mismas en la tabla, y sus tipos de
datos.

INFORMACIN SOBRE LAS RESTRICCIONES DE


UNA TABLA
En el momento de crear una restriccin, adems de especificar las reglas que se deben cumplir,
podemos dar un nombre a la misma. Para establecer los nombres de las restricciones, se suele seguir el
siguiente convenio: ser nombres descriptivos y empezar, por ejemplo, por PK_ si se trata de una Primary
Key o por FK_ si se trata de una Foreign Key o por C_ si se trata de una CHECK.
No vamos a profundizar ms en los nombres de las restricciones ni en la sintaxis para crearlos, pero
s que debemos saber que si no especificamos ningn nombre, Oracle asigna un nombre nico a cada
restriccin con el formato SYS_Cn, siendo n un valor entero.
La sentecia DESC slo muestra, a nivel de restriccin, si una columna determinada admite o no
nulos, pero no facilita ninguna informacin sobre otro tipo de restricciones.
Para obtener la informacin relativa a otras restricciones definidas sobre una tabla se deber ejecutar
una consulta, sobre la tabla USER_CONSTRAINTS, del tipo siguiente:
select constraint_name, constraint_type, search_condition from
user_constraints where table_name =nombreTabla 9 ;
Donde
Constraint_name es el nombre de la restriccin.
Constraint_type puede tomar distintos valores, P indica que la restriccin es de clave primaria,
R que es ajena y C una check.
Search_condition es la condicin impuesta en caso de que la restriccin sea de tipo check.
Si, por ejemplo, quisiramos saber las restricciones definidas sobre la tabla IMPARTE, ejecutaramos
la siguiente consulta
select constraint_name, constraint_type, search_condition
from user_constraints where table_name =IMPARTE;
resultado:
CONSTRAINT_NAME
C SEARCH_CONDITION
------------------------------ - ----------------SYS_C0058701
P
SYS_C0058702
R
SYS_C0058703
R

9 (1) nombreTabla

debe indicarse en maysculas.

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.

inserta en la tabla la fila (1,AA)

4.

ejecuta insert into XX values (BB,2)

5.

insert en la tabla la fila (2,BB)

6.

consulta la tabla XX

7.

cierra la sesin de Worksheet e identifcate de nuevo (salte y vuelve a entrar)

8.

comprueba que, efectivamente, los datos siguen estando ah

9.

borra la tabla XX

10. consulta la tabla XX


11. crea una tabla YY con 3 columnas col1(integer), col2(char(2)) y col3(varchar2(10)), cuya clave
primaria sea (col1, col2)
12. inserta los siguientes datos y consulta la tabla para ver los datos almacenados
(1,AA,primera)
(2,AA,segunda)
(2,BB,tercera)
(1,AA,cuarta)
(NULL,NULL,quinta)
(NULL,CC,sexta)
(3,NULL,sptima)
(0,,octava)10
(3,AA,NULL)
13. crea un listn de telfonos con los siguientes datos: apodo, nombre, telfono; rellnala con datos
(4 filas ser suficiente)
14. modifica la tabla anterior, adele una columna ms, grado de amistad, y vuelve a rellenarla de
datos
15. crea una lista de la compra y rellnala de datos

10

40

cero, dos comillas simples,octava

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 INSERT (2). Insertar las filas resultantes de una SELECT.

La orden DELETE. Borrar todas las filas de una tabla. Borrar determinadas filas.

Creacin de tablas con claves ajenas.

Influencia de las claves ajenas en la sentencia INSERT y DELETE.

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.

INSERT INTO nombreTabla [ ( listaColumnas ) ] consulta


Supongamos que sern optativas todas las asignaturas que tengan menos de 9 crditos. Se trata de
introducir los cdigos de dichas asignaturas en la tabla OPTATIVAS.
En este caso, como ya tenemos las asignaturas en la tabla ASIGNATURAS, tenemos dos opciones.
Una opcin es, hacer la SELECT e ir haciendo las INSERT una a una, copiando los datos de las filas
obtenidas. Otra opcin es insertar en una sola operacin el resultado de la SELECT en la tabla
OPTATIVAS.
Insert into optativas (asignatura, creditos)
select codigo, creditos from asignaturas where creditos < 9;
41

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:

ERROR demasiados valores

Insert into optativas (asignatura,creditos) select codigo from asignaturas where creditos < 9;
resultado:

ERROR no hay suficientes valores

Insert into optativas (asignatura,creditos) select dni,ingreso from profesores;


resultado:

ERROR tipos de dato inconsistentes

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:

ERROR falta una expresin

Pero s dentro de la propia orden select:


Insert into imparte (dni, asignatura) select
55555555,codigo from asignaturas;
resultado:

4 filas creadas

LA ORDEN DELETE
La sentencia DELETE nos permite borrar las filas contenidas en una tabla.

DELETE [FROM] nombreTabla


[WHERE condicin]
No se pueden borrar filas de varias tablas a la vez en una misma sentencia. Para borrar filas de varias
tablas habr que ejecutar tantas sentencias DELETE como de tablas queramos borrar.
Delete from asignaturas a, imparte i where a.codigo = i.asignatura and i.dni=21111222;
resultado:

42

ERROR comando SQL no terminado correctamente

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

CREACIN DE TABLAS CON CLAVES AJENAS


Relacionemos ahora las tablas PROFESORES y ASIGNATURAS mediante la tabla IMPARTE, de forma
que para cada profesor que tenga docencia, se indique en la tabla IMPARTE su dni junto con el cdigo
de la asignatura que imparta. Cada profesor tendr tantas filas, en esta nueva tabla, como asignaturas
imparta.
IMPARTE ( dni : varchar2(10), asignatura : char(5) )
Clave primaria: (dni, asignatura)
Clave ajena: dni PROFESORES
Clave ajena: asignatura ASIGNATURAS
Evidentemente, se deber exigir que el valor que tenga la columna dni exista en la tabla
PROFESORES, de la misma manera cada cdigo de asignatura deber existir en la tabla ASIGNATURAS,
esto es lo que se conoce como integridad referencial y se consigue mediante las denominadas claves
ajenas:.

columna REFERENCES tabla


La sentencia de creacin de esta tabla, junto con sus restricciones de clave primaria y claves ajenas
es
create table imparte (
dni varchar2(10)
references profesores,
asignatura char(5) references asignaturas, primary
key (dni,asignatura )
);
Con esta sintaxis a nivel de columna, cada clave ajena slo puede estar formada por una sola columna.

43

Veamos otra sintaxis para definir claves ajenas, mediante las palabras reservadas FOREIGN KEY, que
nos permite designar varias columnas como clave ajena.

FOREIGN KEY (columna[,columna[, ...]]) REFERENCES tabla


Con esta sintaxis, vamos a escribir una sentencia equivalente a la anterior
create table imparte (
dni varchar2(10), asignatura char(5),
primary key (dni,asignatura ),
foreign key (dni) references profesores (dni),
foreign key (asignatura) references asignaturas (codigo)
);
Sea cual sea la sintaxis elegida para su definicin, las columnas que conforman la clave ajena han
de coincidir en nmero (y orden) y tipo de datos con la clave primaria de la tabla a la que se va a hacer
referencia.
Una restriccin de integridad referencial designa una columna o combinacin de columnas como
clave ajena de una tabla (la tabla hija) y establece una relacin entre ella y la clave primaria de otra
tabla (la tabla padre11). Por ejemplo, en la ltima lnea de la sentencia, la clave ajena
asignatura hace referencia a la clave primaria codigo de la tabla padre asignaturas.
Toda clave ajena, si no tiene un valor nulo, debe tener un valor que coincida con un valor existente
en la tabla padre.

CLAVES AJENAS: influencia en el INSERT


En una tabla con claves ajenas, slo se podrn insertar aquellas filas cuyas claves ajenas existan en
la correspondiente tabla padre.
En el siguiente ejemplo la insercin no es posible pues no existe la asignatura AAA.

insert into imparte (dni, asignatura) values ('55555555','AAA');


resultado: ERROR restriccin de integridad (BDI.SYS_C0058700) violada - clave principal
no encontrada

insert into imparte (dni, asignatura) values ('21333444','FP');


resultado:

1 fila creada

CLAVES AJENAS: influencia en el DELETE


Slo se podrn borrar aquellas filas que no estn siendo referenciadas, a travs de ninguna clave
ajena, desde otra tabla. Si por ejemplo tenemos que la asignatura BDA es impartida por el profesor
con dni 21111222, no se podr borrar la asignatura si antes no se eliminan las lneas correspondientes
a esa asignatura en la tabla imparte.

Delete from asignaturas where codigo = FBD;


resultado:
11

44

ERROR:restriccin de integridad (BDI.SYS_C0058700) violada - registro

La tabla padre puede ser la misma tabla hija

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.

Delete from imparte where asignatura = FBD;


resultado:

1 fila suprimida

Delete from asignaturas where codigo = FBD;


Resultado:

1 fila suprimida

EJERCICIOS MANIPULACIN1
Si alguna de las sentencias no se puede realizar, explica el motivo del error
1.

Partiendo del ejercicio 13 de la sesin anterior, deberemos tener la sentencia de creacin de la


tabla LISTIN, con las siguientes columnas: apodo, nombre, telefono, grado. Como clave
primaria podemos elegir apodo. Tambin tendremos las sentencias insert para incorporar
algunas filas. Ejecutemos todo ello para tener la tabla LISTIN con algunas filas.

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.

Volvamos a ejecutar las sentencias del punto 4.

7.

Crear un nuevo grado de amistad en AMISTAD.

8.

Borremos TODAS las filas de AMISTAD. Mira las filas de AMISTAD y explica que sucede.

9.

Borremos ahora slo una fila, la ltima que hemos aadido.

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:

Introducir al alumno en la orden UPDATE.

Practicar con la integridad referencial. Contenidos

Actualizar los valores existentes en tablas de la base de datos.

Actualizar los valores existentes en tablas de la base de datos a travs de subconsultas.

LA ORDEN UPDATE
La sentencia UPDATE nos permite modificar la informacin contenida en una tabla.

UPDATE nombreTabla [aliasTabla]


SET columna=expresion
[WHERE condicin]
No se pueden modificar varias tablas a la vez en una misma sentencia. Para modificar los valores
de varias tablas varias habr que ejecutar tantas sentencias UPDATE como de tablas queramos
modificar.

Update asignaturas a, imparte i set creditos= 2 where


a.codigo = i.asignatura and i.dni=21111222;
resultado:

ERROR falta la palabra clave SET

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.

Update asignaturas set creditos = 0;


resultado:

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.

Update asignaturas set creditos=4, creditosp=2;


Resultado:

4 filas modificadas

Debe existir concordancia entre los tipos de datos de las columnas y el de los valores asignados a las
mismas.

Update asignaturas set creditos=01/01/2002, creditosp=2;


Resultado:

46

ERROR nmero no vlido

CLUSULA WHERE
Si no se especifica ninguna condicin, la sentencia causar la modificacin de todas las filas de la
tabla.

Update profesores set ingreso=01/01/2003;


resultado:

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.

Update profesores set ingreso=01/01/2003 where categoria = TEU;


resultado:

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.

Update asignaturas set creditos = 0 where codigo in


(select asignatura from imparte i, profesores p where
i.dni = p.dni and p.categoria=TEU);
Resultado:

1 fila modificada

47

MODIFICACIN DE MS DE UNA FILA


Existe la posibilidad de modificar la informacin contenida en una tabla asignando como nuevo valor
o valores, el resultado de una consulta.

UPDATE nombreTabla [aliasTabla]


SET { {columna=expresion|columna=subconsulta} | listaColumnas=subconsulta}
[WHERE condicin]
El resultado de la consulta puede asignarse a una nica columna o a una lista de columnas. En el
primer caso, la sentencia SELECT slo devolver un valor (una fila y una columna) el cual debe coincidir
en tipo de dato y longitud con el tipo de dato y longitud de la columna a la cual asignamos el valor.

Update imparte set asignatura=BDA, dni = (select dni from


profesores where categoria=ASO6)
where asignatura like %BD%;
resultado:

1 fila actualizada

Si la restriccin de que la consulta devuelva una fila y una columna no se cumple no se realiza la
actulizacin.

Update imparte set asignatura=BDA,


dni = (select dni from profesores)
where asignatura like %BD%;
resultado:

ERROR la subconsulta devuelve ms de una fila

Update imparte set asignatura=BDA, dni = (select dni, nombre from


profesores where categoria =ASO6)
where asignatura like %BD%;
resultado:

ERROR demasiados valores

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.

Update imparte set (dni,asignatura) =


(select dni, BDA from profesores where categoria =ASO6)
where asignatura like %BD%;
resultado:

1 fila actualizada

Update imparte set (dni,asignatura) =


(select dni, BDA from profesores) where
asignatura like %BD%;
resultado:

ERROR la subconsulta devuelve ms de una fila

Update imparte set (dni,asignatura) =


(select dni, BDA, nombre from profesores where categoria =ASO6)
where asignatura like %BD%;
resultado:

ERROR demasiados valores

Update imparte set (dni,asignatura) =


(select dni from profesores where categoria =ASO6)
where asignatura like %BD%;
48

resultado:

ERROR no hay suficientes valores

Deber existir una concordancia de tipo de dato y longitud entre los elementos de la lista de columnas
y las columnas seleccionadas.

CLAVES AJENAS: influencia en el UPDATE


En general, las claves ajenas generan las mismas restricciones de integridad referencial que el
DELETE salvo por la naturaleza de la operacin: el UPDATE slo generar problemas de integridad
referencial si el dato a modificar es un valor de clave primaria que est siendo referenciada por alguna
clave ajena. Suponiendo el estado de la base de datos original:

Update asignaturas set codigo = BD1 where codigo = FBD;


resultado: ERROR:restriccin de integridad (BDI.SYS_C005870012) violada registro secundario encontrado
Para poder realizar esta operacin, ser necesario insertar una nueva fila en asignaturas con el
identificador BD1 y copiando el resto de los valores, despus cambiar las referencias a FBD por BD1
y, por ltimo, borrar la fila de FBD.

Insert into asignaturas (codigo,descripcion,creditos,creditosp)


select BD1, descripcion,creditos,creditosp from
asignaturas where codigo = FBD;
resultado:

1 fila insertada

Update imparte set asignatura = BD1 where asignatura = FBD;


Resultado:

1 fila suprimida

Delete from asignaturas where codigo = FBD;

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.

Pon a 0 el descuento de las piezas cuyos das de suministro sea inferior a 3.

8.

Para pedidos anteriores al ao 2000, modifica el nmero de vendedor por el 3.

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

Clusula ON DELETE (polticas de mantenimiento de la integridad referencial en las claves


ajenas ante borrados en claves primarias)

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.

Delete from asignaturas where codigo = FBD;


resultado: ERROR:restriccin de integridad (BDI.SYS_C0058700) violada - registro
secundario encontrado
En ciertos sistemas de informacin es posible redefinir las restricciones de clave ajena para que no
se den estos mensajes de error. Ello es posible mediante la clusula ON DELETE al crear una tabla:

FOREIGN KEY (columna[,columna[, ...]]) REFERENCES tabla ON


DELETE {CASCADE | SET NULL}
La accin a realizar ante el borrado de una fila que est siendo referenciada por alguna clave ajena
puede ser el propagar la operacion (ON DELETE CASCADE) o anular (ON DELETE SET NULL),
dependiendo de la decisin del diseador de la base de datos.

PROPAGAR EL BORRADO
Supongamos que la tabla IMPARTE de la BD Ejemplo tiene la siguiente definicin:

create table IMPARTE ( dni varchar2(10), asignatura char(5),


primary key (dni, asignatura),
foreign key (dni) references PROFESORES (dni), foreign
key (asignatura) references ASIGNATURAS (codigo)
ON DELETE CASCADE);
El resultado del borrado anteriormente intentado sera ahora:

Delete from asignaturas where codigo = FBD;


resultado:

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

Como ya hemos dicho, eliminar la asignatura Historia de la Informtica no genera conflictos de


integridad referencial por lo que el sistema puede hacerlo sin problemas:

Delete from asignaturas where codigo = HI;


resultado:

1 fila suprimida

ASIGNATURAS
codigo descripcion
DGBD
PC
FP

creditos creditosp

DISEO Y GESTION DE BASES DE DATOS


PROGRAMACION CONCURRENTE
FUNDAMENTOS DE LA PROGRAMACION

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

dni nombre categoria ingreso dni

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:

Delete from profesores where dni = 21111222;


resultado:
ERROR:restriccin de integridad (BDI.SYS_xxxxx) violada - registro
secundario encontrado

Delete from profesores where dni = 21222333;


resultado:

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

DISEO Y GESTION DE BASES DE DATOS


PROGRAMACION CONCURRENTE
FUNDAMENTOS DE LA PROGRAMACION

PROFESORES

6.0
6.0
9.0

3.0
1.5
4.5

IMPARTE

dni nombre categoria ingreso dni asignatura


21111222
21222333

EVA GOMEZ
MANUEL PALOMAR

TEU
TEU

01/10/1993
16/06/1989

21111222
21333444

DGBD
PC

53

ANULAR EL VALOR DE CLAVE AJENA


Si la modificacin de una clave ajena es ON DELETE SET NULL, la accin que llevar a cabo
automticamente el SGBD es la de poner NULOS en aquellos casos en que la integridad referencial
se vea comprometida. Esta definicin tiene ms dificultad de aplicacin puesto que prevalecen las
definiciones de clave candidata. Por ejemplo, la siguiente definicin es intil puesto que dni en
IMPARTE forma parte de la clave primaria y no admite nulos en ningn caso:

create table IMPARTE ( dni varchar2(10), asignatura char(5),


primary key (dni, asignatura),
foreign key (dni) references PROFESORES (dni) ON DELETE SET NULL,
foreign key (asignatura) references ASIGNATURAS (codigo) );
Delete from profesores where dni = 21111222;
ERROR: no se puede actualizar (IMPARTE.DNI) a un valor NULL

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:

create table IMPARTE ( ficha integer, dni varchar2(10), asignatura char(5),


primary key (ficha),
foreign key (dni) references PROFESORES (dni) ON DELETE SET NULL,
foreign key (asignatura) references ASIGNATURAS (codigo) );
Y el contenido de la BD es ahora:

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

Delete from profesores where dni = 21111222;


resultado:

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

Clave Primaria: (numpieza, numvend)


Clave Ajena: (numpieza) PIEZA RECHAZAR13
Clave Ajena: (numvend) VENDEDOR PROPAGAR

PEDIDO

Clave Primaria: (numpedido)


Clave Ajena: (numvend) VENDEDOR PROPAGAR

LINPED

Clave Primaria: (numpedido, numlinea)


Clave Ajena: (numpedido) PEDIDO PROPAGAR
Clave Ajena: (numpieza) PIEZA ANULAR

INVENTARIO

Clave Primaria: (numbin)


Clave Alternativa: (numpieza)
Clave Ajena: (numpieza) PIEZA ANULAR

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.

Comprueba los efectos de la operacin anterior consultando todas las tablas.

3.

Borra el vendedor 3.

4.
5.

Comprueba los efectos de la operacin anterior consultando todas las tablas.


Borra el vendedor 8001.

6.

Comprueba los efectos de la operacin anterior consultando todas las tablas.

7.

Borra el pedido 6

8.
9.

Comprueba los efectos de la operacin anterior consultando todas las tablas.


Borra la pieza O-0001-PP.

10. Borra todos los suministros de la pieza O-0001-PP.


11. Borra la pieza O-0001-PP.
12. Comprueba los efectos de la operacin anterior consultando todas las tablas.
13. Borra todos los suministros de la pieza DD-0001-210.
14. Borra la pieza DD-0001-210.
15. Modifica BD1CreateBD2.sql (y ejectalo despus de realizada la modificacin) cambiando la
poltica de la clave ajena de INVENTARIO a PROPAGAR, y adele una nueva tabla con los
siguientes datos: NUEVA(orden entero) CP(orden)
Card(NUEVA, rel1) = (0,1)
Card(PRECIOSUM, rel1) = (0,N)
RECHAZAR
16. Inserta en NUEVA los 3 suministros de la pieza T-0001-IBM.
17. Intenta borrar el vendedor 2 y localiza el error producido.
18. Modifica la poltica de la clave ajena de NUEVA a ANULAR (y ejecuta), vuelve a insertar los
suministros del ejercicio 16, y vuelve a borrar el vendedor 2, comprobando los efectos sobre la
BD.
13

Ante borrados en PIEZA, rechazar la operacin si existen referencias, y as con todas las claves ajenas
definidas.

56

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.

OPERADORES SOBRE CONJUNTOS


Un operador sobre conjuntos combina el resultado de dos sentencias SELECT en un nico resultado.
Para que se pueda realizar, las sentencias SELECT deben tener ambas como resultado el mismo nmero
de columnas y los mismos tipos de datos (no es necesario que sean de igual longitud).
Los operadores de conjuntos son la UNION, UNION ALL, INTERSECT y MINUS. En la versin de
Oracle con la que trabajamos, todos tienen la misma precedencia y se evalan de izquierda a derecha.
Si queremos alterar este orden debemos utilizar los parntesis.

UNION, UNION ALL


Al utilizar el operador UNION entre dos sentencias SELECT, el resultado final estar compuesto por
todas aquellas filas que aparecen en el resultado de como mnimo una de las SELECT. El operador UNION
elimina filas duplicadas en el resultado final. El operador UNION ALL opera de igual modo que el operador
UNION, pero no elimina filas duplicadas en el resultado final.
Supongamos que queremos saber el nombre de los profesores que son ASO6 o imparten asignaturas
de 6 crditos.
Se calcula cada SELECT por separado.
select nombre from
profesores where
categoria=ASO6
resultado:

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.

Nmero de los pedidos en los que se soliciten teclados pero no monitores.

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:

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 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

SUM( [DISTINCT] expr )

suma de todos los valores en expr

AVG( [DISTINCT] expr )


MIN( expr )
MAX( expr )
ROUND( expr )
ABS( 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 ( creditos ) ) no est permitido.

Cuntos profesores hay en nuestra BD?


select count( * ) from profesores
resultado:

( count( * ) ) 3

Cuntas asignaturas de ms de 5 crditos hay en nuestra BD?


select count( * ) from asignaturas where creditos > 5
resultado:

( count( * ) ) 4

Cuntas valores de crditos distintos hay en nuestra BD?


select count( distinct creditos ) from asignaturas
resultado:

( count )

3
Cul es la media de crditos por asignatura?
select avg( creditos ) from asignaturas
resultado:

( avg )
61

6.3

Cul es la media de horas por asignatura?


select avg( creditos*2/3 ) from asignaturas
resultado:

( avg )
4.2

Total de crditos ofertados en asignaturas de Bases de Datos:


select sum( creditos ) from asignaturas where codigo like '%BD'
resultado:

sum( creditos )
12

ETIQUETAS PARA COLUMNAS


Dado que las expresiones calculadas no tienen un nombre especfico de columna en la salida por
pantalla, es conveniente "renombrarlas" para aclarar su significado.
Se pueden etiquetar las columnas de la tabla resultado aadiendo, antes de la coma si hubiera ms
columnas detrs, una cadena de no ms de 18 caracteres y sin espacios en blanco, tal como se hace
con los alias temporales de las tablas. Esta cadena de caracteres aparecer en el encabezado de la
columna.

select count( * ) num_asignaturas, avg(creditos) mediactos from


asignaturas
resultado:

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.

Media de precios distintos de venta de piezas.

6.

Mximo descuento (en euros) de las piezas suministradas.

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.

Mximo, mnimo y media de precio de venta de las piezas.

9.

Cantidad total de piezas que sabemos nos pueden suministrar los proveedores.

10. Cantidad de vendedores de nuestra BD.


11. Total de la diferencia en euros entre lo pagado por compra de artculos y sus respectivos precios
de suministro ofrecidos en su da por los proveedores si el segundo precio es menor que el primero.

63

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 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.

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:

64

ERROR

Si se pueden poner ms columnas en la lista del group by que en la de la select.

select nombre, count( * ) from


profesores p, imparte i where
p.dni = imparte.dni group by
p.dni, nombre
resultado: nombre
EVA GOMEZ
RAFAEL ROMERO

( 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.

select nombre, count( * )


from profesores p, imparte i
where p.dni = i.dni
and asignatura <> 'FBD' group
by p.dni, nombre
resultado:
nombre
EVA GOMEZ
RAFAEL ROMERO

( count(*) )
1
1

ATRIBUTOS NO CLAVE EN EL GROUP BY


Los nicos atributos que aseguran la identificacin de una tupla respecto de las dems son los que
forman la clave primaria (en general, la clave candidata).
As, si la clave primaria de una tabla de personas (profesores o alumnos, por ejemplo) es el D.N.I.,
podemos decir sin equivocarnos que no habr duplicados en este atributo. No obstante, el nombre no
ser clave y, por lo tanto, admite duplicados. Es decir, es perfectamente posible encontrar a dos
personas distintas (con nmeros de D.N.I. diferentes, obviamente) que se llamen igual (nombres y
apellidos).
Si, por ejemplo, agrupamos datos por el nombre y no por el D.N.I. podemos obtener informacin en
una nica fila de dos personas diferentes que se llaman igual. Sea una ocurrencia tal como sta:
CLIENTE
DNI
21
22

NOMBRE
JUAN
JUAN

INGRESO
OPERACIN
1
2
3

CLIENTE
21
22
22

INGRESO
1000
2000
3000
65

select nombre, avg( ingreso ) media


from cliente, ingreso
where dni = cliente group
by nombre
resultado:
nombre
media
JUAN
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
media
JUAN
1000
JUAN
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 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.

Obtener la cantidad de vendedores de cada empresa, indicando cantidad y nombre de la misma,


ordenado descendentemente por cantidad de empleados.

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.

De cada pieza obtener el precio unitario medio de suministro.

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:

select p.dni, nombre, count( * ) asignaturas


from profesores p, imparte i where p.dni = i.dni
group by p.dni, nombre having count(*) >= 2
order by nombre
resultado:

dni
21111222

nombre
EVA GOMEZ

select p.dni, nombre, count( * ) asignaturas


from profesores p, imparte i
where p.dni = i.dni and asignatura <>
'FBD' group by p.dni, nombre having
count(*) >= 2 order by nombre
resultado:
dni
nombre

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

CONSULTAS GROUP BY - HAVING


1.

Nombre de las empresas que tienen ms de dos vendedores.

2.

Nmeros de pedido que tengan ms de tres lneas de pedido.

3.

Nmeros de pedido donde el total de piezas pedidas es mayor que 40.

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.

Obtener aquellos nmeros de pedido y fecha en que se confeccionaron cuya cantidad de


artculos pedidos sea superior a 30 y la recibida inferior a 10.

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.

operadores de comparacin escalar.

IN, ALL, ANY, [NOT].

Resolucin de requerimientos.

CONSULTAS ANIDADAS (SUBQUERIES)


En la condicin de bsqueda de la orden select (en la clusula where o en la having) tambin
podemos:

comparar una expresin con el resultado de otra orden select


determinar si el valor de una expresin est incluido en los resultados de otra orden select

preguntar si una orden select ha seleccionado filas.

Cuando una orden select se encuentra dentro de la clusula where de otra select recibe el nombre
de subconsulta (subquery). Por ejemplo :

select descripcion, creditos


from asignaturas
where creditos = ( select min(creditos) from asignaturas )
resultado: descripcion
Historia de la Informtica

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.

sintaxis general de la subconsulta


expresin op_comparacin { ALL | [ ANY | SOME ] } ( orden select )
expresin [ NOT ] IN ( orden select )
[ NOT ] EXISTS ( orden select )
Los valores posibles a devolver por una orden select anidada son :

70

nada

un valor nico (una fila y una columna),

un conjunto de valores (varias filas y una columna).

Siempre que la subselect devuelva algo, nicamente ser en una y nada ms que una
columna (salvo el operador EXISTS).

DEVOLUCIN DE UN NICO VALOR


expresin op_comparacin ( orden select )
Podemos utilizar los operadores de comparacin para preguntar si el valor de una determinada
expresin es mayor, menor, igual, etc. que el resultado de la subselect, siempre y cuando sta
devuelva una nica fila y una nica columna, es decir, un valor simple.
En general sern rdenes select que calculan una funcin agregada (sum, min, max, avg, count).
select descripcion from
asignaturas
where creditos = ( select min(creditos) from asignaturas )
No sera correcto, porque la subselect devuelve ms de una fila, la siguiente orden :
select descripcion from
asignaturas
where creditos = ( select creditos from asignaturas where creditos < 9 )

DEVOLUCIN DE UNA LISTA DE VALORES


expresin op_comparacin ALL | [ ANY | SOME ] ( orden select )
Cuando la tabla resultado contiene ms de una fila (pero una nica columna, insistimos) hay que
utilizar un modificador para el operador de comparacin.

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:

and creditos < ANY ( select creditos from asignaturas )


nombre
Eva GOMEZ
Rafael Romero

expresin [ NOT ] IN ( orden select )


Tambin podemos consultar la pertenencia de un valor a la lista de valores devuelta por la
subconsulta.
Obtener todos los datos de los profesores que imparte alguna asignatura:
select * from profesores
where dni IN ( select dni from imparte )

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

Se ver ms clara la utilidad de este operador si preguntamos justo lo contrario.


Obtener todos los datos de los profesores que no imparten asignaturas :
select * from profesores where dni NOT IN ( select
dni from imparte )

Por ltimo, veamos que algunos de estos operadores son equivalentes :

expresin IN (orden select)


expresin =ANY (orden select) expresin
NOT IN (orden select) expresin !=ALL (orden select)
72

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.

Nmero y nombre de los vendedores que no ofertan ninguna pieza.

3.

Nmero y nombre de los vendedores a los que se les ha solicitado algn pedido.

4.

Nmero y nombre de los vendedores a los que no se les ha solicitado pedidos.

5.

Nombre de la empresa que ofrece la pieza ms barata de precio de suministro.

6.

Nmero y descripcin de la pieza ms cara (precio de venta).

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.

Nmero de pedido y precio total pagado del pedido ms caro.

9.

Nmero y nombre del vendedor al que se le ha solicitado el pedido ms caro.

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 :

En la primera select recorremos la tabla de profesores.

Para cada profesor, la segunda select recorre la tabla de asignaturas.

Para cada profesor y asignatura comprueba que el primero imparte la segunda.


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
74

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.

CONSULTAS SUBSELECT - EXISTS


1.

Nombre de los vendedores que pueden suministrar todas las piezas.

2.

Nombre de los vendedores que no pueden suministrar ninguna pieza, ordenados


alfabticamente.

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.

Nmero y nombre de todos los vendedores de la ciudad de Alicante.

6.

Empresas que no han servido ninguna pieza.

7.

Empresas que han servido la(s) pieza(s) de mayor precio de venta.

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.

Nombre de las empresas de Alicante a las que se ha comprado algn monitor

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.

Obtener el nmero y el nombre de los vendedores y la cantidad de piezas que pueden


suministrar ordenado alfabticamente por vendedor.

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.

Obtener para los vendedores de la provincia de Alicante, el nmero de vendedor, su nombre y la


cantidad total de pedidos que se les ha solicitado.

2.

Obtener la cantidad total de piezas que se solicitaron en el ao 1992.

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.

Obtener el nombre de las empresas de las que tengamos ms de 1 de un vendedor de Alicante y no


se les haya hecho ningn pedido (a ninguno de sus vendedores) antes del ao 1995.

4.

Obtener el nmero y nombre de las piezas que nunca hemos solicitado.

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.

Obtener el nombre de la pieza (o piezas) y su precio unitario mximo de la pieza de precio


unitario medio ms bajo.

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.

Obtener el nombre de la pieza y su precio unitario medio de la pieza ms barata de precio de


venta.

6.

Nombre y empresa de los vendedores de la ciudad a la que se le ha solicitado ms piezas.

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.

Nmero de pieza, descripcin y precio de venta de la pieza que ms veces se ha pedido.

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.

Obtener el nmero y el nombre de los vendedores y la cantidad de piezas que pueden


suministrar a un precio entre 15 y 20 euros, ordenado por el nombre de vendedor.

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.