Está en la página 1de 27

Practica Gestion de Datos e Informacion I

Objetivos:
• Adquirir la destreza mínima para trabajar en el entorno SQL.
Contenidos
• Concepto de Base de Datos y Tabla.
• Manejo de menús.
• Selección de Base de Datos.
• Tipos de datos.
• Ayuda en línea.
• Salvar y recuperar órdenes SQL.

Concepto de Base de Datos y Relación (Tabla)


Una base de datos es un conjunto de información interrelacionada que representa un sistema de
información particular, y está compuesta por relaciones, o más comúnmente tablas, que almacenan
los datos referentes a un objeto o a una interrelación entre objetos.

Así, si queremos mantener mediante un gestor de bases de datos información 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 información 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:

ASIGNATURAS
codigo descripcion creditos creditosp
HI HISTORIA DE LA INFORMATICA 4.5
FBD FUNDAMENTOS DE LAS BASES DE DATOS 6.0 1.5
DGBD DISEÑO Y GESTION DE BASES DE DATOS 6.0 3.0
PC PROGRAMACION CONCURRENTE 6.0 1.5
FP FUNDAMENTOS DE LA PROGRAMACION 9.0 4.5

pág. 1
PROFESORES IMPARTE

dni nombre categoria ingreso dni asignatura


21111222 EVA GOMEZ TEU 01/10/1993 21111222 FBD
21222333 MANUEL PALOMAR TEU 16/06/1989 21111222 DGBD
21333444 RAFAEL ROMERO ASO6 16/06/1992 21333444 PC

SQL Server
Una vez el sistema permite la conexión, disponemos de un área donde introducir órdenes SQL
cuyo resultado se obtiene pulsando el botón “Ejecutar”. Podemos probar con la siguiente consulta:
select * from profesores

resultado: dni nombre categoria


21111222 EVA GOMEZ TEU
21222333 MANUEL PALOMAR TEU
21333444 RAFAEL ROMERO ASO6

Tipos de datos

En general, la utilización de varias tablas necesita que ellas se puedan relacionar por una
columna común, en este caso dni de profesor, para la relación entre imparte y profesor, y codigo
de asignatura, para la relación entre asignatura e imparte. Nótese, sin embargo, que en la tabla
imparte el código 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 acompañan 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 sólo podremos comparar columnas con idéntico tipo
de datos, o a la hora de manipular datos, dado que, como veremos en próximas sesiones, cada
tipo de datos presenta unos requisitos específicos para su manipulación.

Tipos numéricos:
Listado de cada uno de los tipos de dato numéricos en MySQL, su ocupación en disco y valores.

• INT (INTEGER): Ocupación de 4 bytes con valores entre -2147483648 y 2147483647 o


entre 0 y 4294967295.
• SMALLINT: Ocupación de 2 bytes con valores entre -32768 y 32767 o entre 0 y 65535.
• TINYINT: Ocupación de 1 bytes con valores entre -128 y 127 o entre 0 y 255.
• MEDIUMINT: Ocupación de 3 bytes con valores entre -8388608 y 8388607 o entre 0 y
16777215.
• BIGINT: Ocupación de 8 bytes con valores entre -8388608 y 8388607 o entre 0 y 16777215.
• DECIMAL (NUMERIC): Almacena los números de coma flotante como cadenas o string.

MSc Ing Arturo Diaz Pulido.


• FLOAT (m,d): Almacena números de coma flotante, donde ‘m’ es el número de dígitos de la
parte entera y ‘d’ el número de decimales.
• DOUBLE (REAL): Almacena número de coma flotante con precisión doble. Igual que FLOAT,
la diferencia es el rango de valores posibles.
• BIT (BOOL, BOOLEAN): Número entero con valor 0 o 1.

Tipos fecha:

A la hora de almacenar fechas, hay que tener en cuenta que SQL no comprueba de una manera
estricta si una fecha es válida o no. Simplemente comprueba que el mes esta comprendido entre 0 y
12 y que el día 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 año-mes-dia

• DateTime:

Combinación 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 año-mes-dia horas:minutos:segundos

• TimeStamp:

Combinación de fecha y hora. El rango va desde el 1 de enero de 1970 al año 2037. El formato de
almacenamiento depende del tamaño del campo:

Tamaño Formato

AñoMesDiaHoraMinutoSegundo
14
aaaammddhhmmss

AñoMesDiaHoraMinutoSegundo
12
aammddhhmmss

8 ñoMesDia aaaammdd

6 AñoMesDia aammdd

4 AñoMes aamm

2 Año 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 de 'HH:MM:SS'

• Year:

Almacena un año. El rango de valores permitidos va desde el año 1901 al año 2155. El campo puede
tener tamaño dos o tamaño 4 dependiendo de si queremos almacenar el año con dos o cuatro dígitos.

Tipo de Tamaño de
Campo Almacenamiento

DATE 3 bytes

pág. 3
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 Mayúsculas y las
minúsculas, el tipo BLOB se ordena teniéndolas en cuenta.

Los tipos BLOB se utilizan para almacenar datos binarios como pueden ser ficheros.

• TinyText y TinyBlob:

Columna con una longitud máxima de 255 caracteres.

• Blob y Text:

Un texto con un máximo de 65535 caracteres.

• MediumBlob y MediumText:

Un texto con un máximo de 16.777.215 caracteres.

• LongBlob y LongText:

Un texto con un máximo de caracteres 4.294.967.295. Hay que tener en cuenta que debido a los
protocolos de comunicación los paquetes pueden tener un máximo 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

• Set:

Un campo que puede contener ninguno, uno ó varios valores de una lista. La lista puede tener un
máximo de 64 valores.

Tipo de campo Tamaño de Almacenamiento

CHAR(n) n bytes

VARCHAR(n) n +1 bytes

MSc Ing Arturo Diaz Pulido.


TINYBLOB, TINYTEXT Longitud+1 bytes

BLOB, TEXT Longitud +2 bytes

MEDIUMBLOB,
Longitud +3 bytes
MEDIUMTEXT

LONGBLOB, LONGTEXT Longitud +4 bytes

1 ó dos bytes dependiendo del número


ENUM('value1','value2',...)
de valores

1, 2, 3, 4 ó 8 bytes, dependiendo del


SET('value1','value2',...)
número de valores

Diferencia de almacenamiento entre los tipos Char y VarChar

Almace Almace
Valor CHAR(4) VARCHAR(4)
namiento namiento

'' '' 4 bytes " 1 byte

'ab' 'ab ' 4 bytes 'ab' 3 bytes

'abcd' 'abcd' 4 bytes 'abcd'

'abcdefgh' 'abcd' 4 bytes 'abcd' 5 bytes

SELECT 1
Objetivos:

• Introducir al alumno en el SQL y la orden SELECT.


• Comentar el esquema lógico propuesto.

Contenidos:

• Sistema de información propuesto.


• La orden SELECT-FROM-WHERE.
• Proyecciones, Selecciones.
• Tipos de datos.
• ORDER BY
Se proporciona información sobre las consultas más sencillas a realizar sobre una BD.

LA ORDEN SELECT-FROM-WHERE

pág. 5
Sintaxis general de la orden select

SELECT [ DISTINCT ] listaColumnas


FROM listaTablas
[ WHERE condición ]
[ GROUP BY listaColumnas
[ HAVING condición ] ]
[ 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
expresión mínima de la orden, formada por dos cláusulas, 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 sesión 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 nombre categoria


21111222 EVA GOMEZ TEU
21222333 MANUEL PALOMAR TEU
21333444 RAFAEL ROMERO ASO6

Al especificar en la lista de atributos un asterisco le indicamos al SGBD que deseamos la


información de todas las columnas definidas para la tabla PROFESORES.

Si deseamos conocer a qué categorías 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 categoria


EVA GOMEZ TEU
MANUEL PALOMAR TEU
RAFAEL ROMERO ASO6

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

select distinct categoria from profesores

MSc Ing Arturo Diaz Pulido.


resultado: categoria
TEU
ASO6

Nótese, sin embargo, que las dos órdenes siguientes obtienen el mismo resultado, puesto que la
duplicación 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 categoria


21111222 TEU
21222333 TEU
21333444 ASO6

La cláusula WHERE

Con la orden select-from obtenemos la información de las columnas requeridas de toda la tabla.
Si únicamente queremos información de aquellas filas que cumplen una determinada condición
utilizaremos la cláusula where.

Pretendemos obtener el nombre de los profesores titulares:

select nombre from profesores where categoria = 'TEU'

resultado: nombre
EVA GOMEZ
MANUEL PALOMAR

En la construcción de tales condiciones podemos utilizar las conectivas lógicas AND, OR, y NOT,
así como los paréntesis para alterar la evaluación de izquierda a derecha. También, los operadores
de comparación >, <, >=, <=, <>

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 cláusula 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 número de créditos:

select creditos, descripcion from asignaturas order by creditos

resultado: creditos descripcion


4.5 Historia de la Informática

pág. 7
6 Fundamentos de las Bases de Datos
6 Diseño y Gestión de Bases de Datos
6 Programación Concurrente
9 Fundamentos de la Programación
Si no se indica nada la ordenación será ascendente.

El mismo requerimiento anterior pero en orden descendente y de aquellas que tienen más de
4.5 créditos:

select creditos, descripcion from asignaturas


where creditos > 4.5 order by creditos desc

resultado: creditos descripcion


9 Fundamentos de la Programación
6 Fundamentos de las Bases de Datos
6 Diseño y Gestión de Bases de Datos
6 Programación Concurrente
Puede aplicarse más de un criterio de ordenación:

select creditos, descripcion from asignaturas order by creditos, descripcion

resultado: creditos descripcion


4.5 Historia de la Informática
6 Diseño y Gestión de Bases de Datos
6 Fundamentos de las Bases de Datos
6 Programación Concurrente
9 Fundamentos de la Programación

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 'créditos’
La asignatura HISTORIA DE LA INFORMATICA tiene 4.5 créditos La
asignatura FUNDAMENTOS DE LAS BASES DE DATOS tiene 6 créditos La
asignatura DISEÑO Y GESTION DE BASES DE DATOS tiene 6 créditos La
asignatura PROGRAMACION CONCURRENTE tiene 6 créditos La
asignatura FUNDAMENTOS DE LA PROGRAMACION tiene 9 créditos

MSc Ing Arturo Diaz Pulido.


BD Proveedores

LA BASE DE DATOS
PROVEEDORES
Objetivos:

• Ser capaz de interpretar un esquema de base de datos relacional (concretamente, el propuesto


para las prácticas de la asignatura: Proveedores)

Se detalla el esquema lógico que describe la BD de PROVEEDORES, ya creada y a disposición


del alumno, intentando que comprenda su significado, el sistema real que pretende representar. El
esquema lógico es la referencia que permite construir las órdenes select con las que interrogar a la
BD. Las extensiones de cada relación se incluyen como ayuda para comprobar la corrección de las
órdenes select utilizadas.

pág. 9
LA BASE DE DATOS PROVEEDORES

TABLA COLUMNAS RESTRICCIONES


VENDEDOR ( numvend NUMBER(4), Clave Primaria: (numvend)
nomvend VARCHAR2(30),
nombrecomer VARCHAR2(30),
telefono CHAR(11), calle
VARCHAR2(30), ciudad
VARCHAR2(20), provincia
VARCHAR2(20) )
PIEZA ( numpieza VARCHAR2(16), Clave Primaria: (numpieza)
nompieza VARCHAR2(30),
preciovent NUMBER(9,2))

PRECIOSUM ( numpieza VARCHAR2(16), Clave Primaria: (numpieza, numvend)


numvend NUMBER(4),
Clave Ajena: (numpieza)→ PIEZA,
preciounit NUMBER(9,2),
diassum NUMBER(3), Clave Ajena: (numvend)→ VENDEDOR
descuento NUMBER(2))

PEDIDO ( numpedido NUMBER(5), Clave Primaria: (numpedido)


numvend NUMBER(4), fecha
Clave Ajena: (numvend)→ VENDEDOR
DATE )

LINPED ( numpedido NUMBER(5), Clave Primaria: (numpedido, numlinea)


numlinea NUMBER(2),
Clave Ajena: (numpedido)→ PEDIDO
numpieza VARCHAR2(16),
preciocompra NUMBER(9,2), Clave Ajena: (numpieza)→ PIEZA
cantpedida NUMBER(4),
fecharecep DATE, cantrecibida
NUMBER(4))

INVENTARIO ( numpieza VARCHAR2(16), Clave Primaria: (numbin)


numbin NUMBER(10), Clave Alternativa: (numpieza)
cantdisponible NUMBER(5),
Clave Ajena: (numpieza)→ PIEZA
fecharecuento DATE,
periodorecuen NUMBER(2),
cantminima NUMBER(5) )

La base de datos pretende reflejar la política de compras de una empresa de distribución. Se


compran (tablas PEDIDO y LINPED) ciertas mercancías a los distintos proveedores (tabla VENDEDOR)
y son vendidas posteriormente al público o a otros distribuidores (que no hemos considerado en la
BD)

Básicamente, las tareas que se pretenden mecanizar son las siguientes (entre paréntesis aparecen
las tablas directamente relacionadas con cada una):

• Lista de suministradores (vendedor).

MSc Ing Arturo Diaz Pulido.


Los datos de los proveedores que nos suministran la mercadería que, posteriormente, es
vendida al público en general.

• Catálogo de venta (pieza)

Las piezas que distribuye nuestra empresa y el precio de venta al público de las mismas.
• Lista de precios de suministro (preciosum, vendedor, pieza).

Conocer los precios a los que los proveedores nos podrían suministrar las piezas. Es
información histórica cuyo origen no nos preocupa. No se debe confundir esta información
con la de los pedidos: los artículos 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 mercancías 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.

• Líneas de pedido (tabla linped), donde un conjunto de líneas pertenecientes a un mismo


pedido se numeran desde la número 1 en adelante. Contiene el código 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).

Sólo aquellas piezas que aparezcan en una línea de pedido han sido solicitadas al
correspondiente vendedor y, si la cantidad recibida es mayor que cero, habrán sido recibidas
por la empresa en esa cantidad.

• Control de existencias (inventario, pieza).

Mediante la confección de un inventario, donde cada entrada, que corresponde a un único


artículo, es el recuento real de existencias.

pág. 11
tabla VENDEDOR

numvend nomvend nombrecomer telefono calle Ciudad provincia


1 AGAPITO MECEMSA 96-5782401 Avda. Valencia ALICANTE ALICANTE
LAFUENTE DEL 3205
CORRAL
2 LUCIANO HARW S.A. 96-3232321 GENERAL LACY, ALICANTE ALICANTE
BLAZQUEZ 15 2 B
VAZQUEZ
3 GODOFREDO MECEMSA 96-4141722 AVDA. VALENCIA ALICANTE ALICANTE
MARTIN 3372
MARTINEZ
4 JUANITO REINA HARW S.A. 903-696969 DONDEQUIERAS, LO ANGELE LOS EU'S
PRINCESA 1000, 13F
5 JUANITO REINA LA DEAQUI 98-5363636 S. FRANCISCO GIJON ASTURIAS
PRINCESA DE ASIS, 10 1
6 MANOLO PIEDRA HUMP S.A. 96-5660727 AVIACION 92, 3 I SAN VICENTE ALICANTE
POMEZ
7 MANUEL PEREZ SOFTHARD 98-5696969 ARZOBISPO QUINTANAR DE TOLEDO
RODRIGUEZ DISTRIBUIDORA LOACES LA ORDE
S.A.
8 LUISA PINTO LA MEJOR S.A. 999- OXFORD BLUES NEW ORLEANS LOUISSIANA
HEREDIA 2014455
9 CHEMA PAMUNDI OLE ESPAÑA, S.A. RIVAS MADRID
VACIAMADRID
10 GUSTAVO DE OLE ESPAÑA, S.A. RIVAS MADRID
BASICA VACIAMADRID
11 MARIO DUQUE BANESTOESSOFT 98- MOROS, 19 GIJON ASTURIAS
LIZONDO S.L. 0101010
12 JOSE ANTONIO OLE ESPAÑA, S.A. 3667788 COLON, 21 VALENCIA VALENCIA
MARTINEZ JUAN
13 MANUEL GOMEZ OLE ESPAÑA, S.A. 3667789 COLON, 21 VALENCIA VALENCIA
SANTISTEBAN
8001 JUAN HALA S.A. ALMORADI ALICANTE
RODRIGUEZ
JUAN
8002 JUAN MARTINEZ HARW S.A. 3334455 CISCAR, 5 VALENCIA VALENCIA
GARCIA
8003 LUIS HARW S.A. 3335588 SALAMANCA, 102 VALENCIA VALENCIA
RODRIGUEZ
SALA
100 PEDRO GRACIA SOFT S.A. SALAMANCA, 100 VALENCIA VALENCIA
MORALES
101 SALVADOR PLA TABAC & SOFT 5661100 MAYOR, 44 SAN VICENTE ALICANTE
GARCIA
102 SOLEDAD ASX. S.A. 87879998 PEREZ GALDOS, ALICANTE ALICANTE
MARTINEZ 54
ORTEGA
200 SEVERINO SEVESOFT 5779988 GENERAL LACY, ALICANTE ALICANTE
MARTIN 17
MARTINEZ
55 LUIS GARCIA HARW S.A. 5889944 POETA ALONSO, ALICANTE ALICANTE
SATORRE 12
201 MANUEL HALA S.A. 5660788 MAYOR, 64 SAN VICENTE ALICANTE
ORTUÑO
LAFUENTE

tabla PIEZA
numpieza nompieza preciovent
A-1001-L MOUSE ADL 3B 7,00
C-1002-H 4,00
C-1002-J 7,00

MSc Ing Arturo Diaz Pulido.


C-400-Z FILTRO PANTALLA X200 18,00
DD-0001-210 DISCO DURO WESTERN DIG 210M 28 250,00
DD-0001-30 DISCO DURO 30M SEAGATE 200,00
DK144-0001 DISKETTE 1.44 PANASONIC 1,10
DK144-0002-P PACK DISKETTE 144 PANASONIC 10,00
FD-0001-144 FLOPPY 1.44 IBM 180,00
FD-0002-720 FLOPPY 720K IBM 150,00
M-0001-C MONITOR SYNCMASTER 3 COLOR 170,00
M-0002-C MONITOR COLOR SONY BT 350,00
M-0003-C MONITOR IBM 3570 COLOR 400,00
O-0001-PP PEGATINAS CONCIERTO JEVI 20,00
O-0002-PP PACK PEGATINAS CONCIERTO JEVI 100,00
P-0001-33 PLACA INTEL 33Mz 350,00
T-0001-IBM TECLADO XT IBM 110,00
T-0002-AT TECLADO AT SUSUSU 55,00
T-0003-AT TECLADO AT HP 120,00
X-0001-PC TECLADO ESTANDAR PC 70,00

tabla PEDIDO

numpedido numvend fecha


1 1 05/05/1992
2 1 11/10/1992
3 2 15/10/1992
4 2 16/10/1992
5 1 22/10/1992
6 5 22/08/1995
7 8002 02/10/1992

tabla LINPED

numpedido numlinea numpieza preciocompra cantpedida fecharecep cantrecibida


1 1 M-0001-C 300,00 10 10/05/1992 10
1 2 P-0001-33 210,00 20 10/05/1992 18
1 3 FD-0001- 135,00 20 10/05/1992 20
144
1 4 DD-0001- 150,00 20 10/05/1992 20
210
1 5 T-0002-AT 31,00 22 17/10/1992 22
2 1 DK144-0002- 5,45 100 15/10/1992 101
P
2 2 T-0002-AT 30,00 1 15/10/1992 1
3 1 DD-0001- 146,00 15 17/10/1992 15
210
3 2 P-0001-33 210,00 3 17/10/1992 3
4 1 O-0002-PP 99,00 10 17/10/1992 10
5 1 T-0002-AT 15,00 15 11/06/1993 13
6 1 O-0001-PP 15,00 1000 25/08/1995 1000
6 2 O-0002-PP 99,00 2000 25/08/1995 1998
7 1 C-400-Z 7,00 45 09/10/1992 8

tabla INVENTARIO

numpieza numbin cantdisponible fecharecuento periodorecuen cantminima


DD-0001-30 1 120 15/10/1990 1 15
P-0001-33 2 10 15/10/1992 5

pág. 13
O-0002-PP 3 110 15/10/1992 1 3
M-0001-C 4 15 15/10/1992 2 2
M-0003-C 5 2 20/10/1992 1 0
DD-0001- 6 10 12/11/1992 2 1
210
FD-0001- 7 10 12/11/1992 2 0
144

tabla PRECIOSUM
numpieza numvend preciounit diassum descuento
A-1001-L 3 5,00 1
A-1001-L 4 4,90 1
A-1001-L 100 4,00 3
A-1001-L 1 2,00 3
C-1002-H 1 0,50 2
C-1002-J 1 1,50 2
C-400-Z 1 8,50 4 5
C-400-Z 8002 7,00 3
DD-0001-210 1 150,00 3 15
DD-0001-210 2 170,00 5 12
DD-0001-210 101 140,00 15 14
DD-0001-30 1 120,00 4
DK144-0001 1 0,56 3
DK144-0002- 1 5,60 3
P
DK144-0002- 2 5,50 5
P
FD-0001-144 1 130,00 3
FD-0001-144 102 136,00 3 7
FD-0001-144 55 120,00 10 13
FD-0002-720 1 60,00 3
M-0001-C 1 155,00 3 10
M-0001-C 3 180,00 7 15
M-0002-C 9 300,00 1 5
M-0002-C 1 150,00 10 15
M-0003-C 3 350,00 2 15
M-0003-C 4 280,00 7
M-0003-C 1 200,00 7
O-0001-PP 5 19,50 1
O-0001-PP 55 15,00 7
O-0001-PP 1 15,00 1
O-0002-PP 2 99,00 1
O-0002-PP 5 98,75 1 12
O-0002-PP 101 80,00 10
O-0002-PP 1 75,00 1
P-0001-33 2 210,00 5
P-0001-33 1 250,00 3
P-0001-33 4 280,00 7
P-0001-33 3 250,00 2
P-0001-33 5 280,00 3 10
T-0001-IBM 2 90,00 5

MSc Ing Arturo Diaz Pulido.


T-0001-IBM 100 95,00 5 10
T-0001-IBM 1 90,00 15
T-0002-AT 1 30,00 3
T-0002-AT 2 35,00 5 7
T-0002-AT 4 25,00 7
T-0002-AT 5 33,00 3
T-0002-AT 100 34,00 2 5
T-0002-AT 201 30,00 1 5
T-0003-AT 1 77,50 3
T-0003-AT 3 81,45

CONSULTAS SELECT1

1. Obtener todos los números 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. Número, 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 algún suministrador, obtener el número de pieza y el
descuento, en orden descendente del valor de descuento.

5. Nombre de los vendedores con número de vendedor menor que 6.

6. Modificar el requerimiento anterior para eliminar duplicados.

7. Número y nombre de los vendedores con número de vendedor menor que 6.

8. Obtener todos los números 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. Números de vendedores y días que tardarían en suministrar la pieza 'P-0001-33'

12. Códigos de pieza solicitados en el pedido 1, ordenados de mayor a menor precio de compra.

13. Números de pedido y números de vendedor, para los pedidos solicitados el 15 de octubre de
1992.

14. Códigos de pieza de los que se sabe que algún vendedor nos podría hacer descuento.

15. Códigos de pieza, de posible suministrador y precio de suministro, ordenados por código de
vendedor y código de pieza.

pág. 15
select 2

CONSULTAS SOBRE
VARIAS TABLAS
Objetivos:

• Poder relacionar distintas tablas de la BD para obtener información más compleja.

Contenidos

• Utilización de más de una tabla.


• Nombres cualificados de atributo.
• Sinónimos temporales de tabla.
• Tipos de datos: dominios.
• Resolución de requerimientos

UTILIZACIÓN DE MÁS DE UNA TABLA

Para la resolución de la mayoría de requerimientos es necesario trabajar con información 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 cláusula FROM.

Si seleccionamos la BD Ejemplo, podemos preguntar por el nombre de los profesores y la


descripción de las asignaturas que imparten; esta información se encuentra almacenada en la tabla
imparte, que relaciona las claves primarias de cada una de las tablas asociadas por tal relación.

select nombre, descripcion from


asignaturas, imparte, profesores where
profesores.dni = imparte.dni
and asignatura = codigo

resultado: nombre descripcion


EVA GOMEZ Fundamentos de las Bases de Datos
EVA GOMEZ Diseño y Gestión de Bases de Datos
RAFAEL ROMERO Programación 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 relación entre
ambas tablas se encuentra en la tabla imparte, que asocia dni de profesor con codigo de asignatura
que imparte. Así, para obtener la información 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 código de
asignatura, en la columna nominada como asignatura; buscando en la tercera tabla, asignaturas,

MSc Ing Arturo Diaz Pulido.


obtendrá la descripcion y finalmente mostrará en pantalla el nombre y la descripción que le
corresponde.
Nótese que no aparece MANUEL PALOMAR, o la asignatura HISTORIA DE LA INFORMÁTICA,
puesto que ni el primero (en nuestra BD) imparte asignatura alguna, ni la segunda es impartida por
ningún profesor (de los conocidos por nuestro sistema).

¿Qué pasaría si no utilizáramos la cláusula where para enlazar las tablas? Supongamos el
siguiente requerimiento:

select asignatura, nombre from


profesores, imparte

resultado: asignatura nombre


FBD EVA GOMEZ
FBD MANUEL PALOMAR
FBD RAFAEL ROMERO
DGBD EVA GOMEZ
DGBD MANUEL PALOMAR
DGBD RAFAEL ROMERO
PC EVA GOMEZ
PC MANUEL PALOMAR
PC RAFAEL ROMERO

Si no indicamos nada en la cláusula where la información que obtenemos es simplemente la


combinación de cada tupla con todas las demás: si hay 3 tuplas en imparte y otras 3 en profesores,
la cardinalidad de la relación resultante es 3 x 3 = 9 tuplas. Si en la cláusula from pusiéramos,
además, la tabla asignaturas, el resultado final tendría 3 x 3 x 5 = 45 tuplas.

Veamos en detalle como funciona la orden select-from-where para el caso de la siguiente


consulta (códigos 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 combinaría todas las tuplas con todas de las tablas especificadas en el from:

dni nombre categoria ingreso dni asignatura


21111222 EVA GOMEZ TEU 01/10/1993 21111222 FBD
21222333 MANUEL PALOMAR TEU 16/06/1989 21111222 FBD
21333444 RAFAEL ROMERO ASO6 16/06/1992 21111222 FBD
21111222 EVA GOMEZ TEU 01/10/1993 21111222 DGBD
21222333 MANUEL PALOMAR TEU 16/06/1989 21111222 DGBD
21333444 RAFAEL ROMERO ASO6 16/06/1992 21111222 DGBD
21111222 EVA GOMEZ TEU 01/10/1993 21333444 PC
21222333 MANUEL PALOMAR TEU 16/06/1989 21333444 PC
21333444 RAFAEL ROMERO ASO6 16/06/1992 21333444 PC

1 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.
pág. 17
Por lo especificado por la where eliminaría aquellas tuplas que no cumplieran la condición, y nos
quedaría:
dni nombre categoria ingreso dni asignatura
21111222 EVA GOMEZ TEU 01/10/1993 21111222 FBD
21111222 EVA GOMEZ TEU 01/10/1993 21111222 DGBD
21333444 RAFAEL ROMERO ASO6 16/06/1992 21333444 PC

Y por último, las columnas especificadas en la select determinarían el resultado final:

asignatura nombre
FBD EVA GOMEZ
DGBD EVA GOMEZ
PC 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 cláusula from existen
varias con nombres iguales, deberemos especificar en todo momento la tabla de la que queremos
extraer la información. Caso de no existir ambigüedad, 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 nombre


21111222 EVA GOMEZ
21111222 EVA GOMEZ
21333444 RAFAEL ROMERO
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 idénticas ya se mostró en la sesión anterior.

MSc Ing Arturo Diaz Pulido.


SINÓNIMOS 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 cuestión de la siguiente.

select distinct p.dni, nombre


from profesores p, imparte i
where p.dni = i.dni

resultado: dni nombre


21111222 EVA GOMEZ
21333444 RAFAEL ROMERO

pág. 19
CONSULTAS SELECT2

1. Obtener el número de pieza junto con el nombre de todas las provincias desde las que puede
sernos suministrada, en orden descendente del número de pieza.

2. Modificar el requerimiento anterior para eliminar duplicados.

3. Lista el nombre y número de las piezas.

4. Obtener el nombre y número de proveedores de la provincia de Valencia.

5. Obtener el nombre y número de proveedores de la provincia de Valencia a los que se les ha


solicitado un pedido.

6. Obtener los números de línea y su precio de compra del pedido número 1.

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

8. Obtener número y nombre de todas las piezas recibidas el 1 de Mayo de 1992.

9. Precio unitario de suministro del número 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, teléfono, 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 más de 10%.

13. Obtener los números de pedido del vendedor número 1.

14. Obtener los vendedores ordenados alfabéticamente en orden descendente.

15. Ídem en orden ascendente.

16. Obtener los números de pieza de las que conozcamos algún vendedor que nos la pueda
suministrar.

17. Número y nombre de las piezas que puedan suministrarnos el vendedor número 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. Número, nombre y precio de venta de las piezas que han sido compradas en un pedido
servido por el vendedor 1.

20. Número 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. Número de pieza y número 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
número y nombre de los vendedores que las podrían suministrar a esos precios.

MSc Ing Arturo Diaz Pulido.


select 3

EXPRESIONES DE
SELECCIÓN DE FILAS
Objetivos:

• Comparaciones de cadenas de caracteres.

Contenidos

• BETWEEN, IN
• LIKE, subcadenas.

Construcción de expresiones de selección de filas utilizando rangos, listas, y funciones de


comparación de cadenas de caracteres.

RANGOS

Expresiones del tipo 10 <= x <= 100 se pueden construir utilizando el operador de construcción
de rangos BETWEEN.

La sintaxis de tal subexpresión de la cláusula where es la siguiente:

expresión [NOT] BETWEEN expresión AND expresión

Por ejemplo, deseamos conocer los créditos y descripción de las asignaturas cuyo número de
créditos está entre 5 y 8.

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

resultado: creditos descripcion


6 Fundamentos de las Bases de Datos
6 Diseño y Gestión de Bases de Datos
6 Programación Concurrente

LISTAS

Mediante el operador IN se puede buscar un determinado valor en una lista construida usando
constantes.

expresión [NOT] IN (listaValores)

pág. 21
Descripción de las asignaturas FBD y DGBD:

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

resultado: descripcion
Fundamentos de las Bases de Datos
Diseño y Gestión 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

Fijémonos en que MANUEL PALOMAR, que no imparte ninguna de las asignaturas objeto de la
búsqueda, 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 carácter. 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 carácter cualquiera.

Profesores que atiendan al nombre de 'RAFA':

select * from profesores where


nombre like 'RAFA%'

resultado: dni nombre categoria


21333444 RAFAEL ROMERO ASO6

Código de las asignaturas de 'Bases de Datos'


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

resultado: codigo
FBD
DGBD

MSc Ing Arturo Diaz Pulido.


Código de las asignaturas, siendo tal código 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


(información faltante) mediante el operador IS NULL, cuya sintaxis es:

columna IS [NOT] NULL

Código y créditos de las asignaturas de las que conocemos su número de créditos:

select codigo, creditos from asignaturas


where creditos is not null

resultado: codigo creditos


HI 4.5
FBD 6
DGBD 6
PC 6
FP 9

pág. 23
RESUMEN DE OPERADORES

Recopilamos todos los operadores y conectivas lógicas vistos hasta ahora para la construcción de
expresiones condicionales:

= AND BETWEEN LIKE {%,_}

> OR IN

< NOT
>=
<=
<>
IS
NULL

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 Martínez o Martín.

3. Obtener los nombres de los vendedores de las provincias de Valencia, Castellón 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 López.

7. Nombre de vendedores que el nombre empieza por M seguido de cualquier carácter 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 número de vendedor entre 1 y 100.

9. Listar los nombres y números de vendedores así como el número 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 'García'.

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

MSc Ing Arturo Diaz Pulido.


11. Piezas3 que sabemos que nos puede suministrar algún vendedor.

12. Obtener todos los vendedores que tengan teléfono.

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 número oscile entre el 1 y el 1000.

14. Obtener los nombres de vendedores en orden alfabético.

15. Obtener nombre de vendedores y nombre de piezas que pueden suministrar ordenado en orden
alfabético.

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 número 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 números de pieza que nos pueden suministrar, de aquellos
vendedores cuyo apellido comienza por Martín, y ordenados alfabéticamente.

3 Cuando no se especifica un atributo concreto, se entiende que se pide toda la información disponible en la
BD de los objetos solicitados.
pág. 25
select fecha

FUNCIONES DE FECHA4
FUNCIONES DE FECHA

Se presentan a continuación distintas funciones de manejo de fechas y hora, que se pueden utilizar
tanto en la lista de columnas que aparecerán en la tabla resultado de la select como en la construcción
de expresiones de la where.

En general, la comparación 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 visualización, calcular días, etc.) entonces debemos ayudarnos de estas
funciones.

CONSULTAS SELECT FECHA

1. Obtener el número de pieza de las piezas que se recuenten el 15/10/92.

2. Números de pieza de las piezas que se recuentan entre el 1 de Octubre de 1992 y el 31 de


Octubre de 1992.

3. Número 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 alfabéticamente.

5. Número, nombre de vendedor y mes en que se les solicitó un pedido de discos duros.

6. Años en que se ha efectuado algún recuento.

4 Aunque todas las demás sesiones de prácticas cumplen con el estándar 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 sesión es únicamente aplicable a Oracle.

MSc Ing Arturo Diaz Pulido.


7. Número y descripción de las piezas que sirvieron los proveedores los días 10 de cada mes.

8. Número y descripción 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. Número de pieza, descripción, fecha de recepción, cantidad recibida, de las piezas recibidas
en el 95 y de precio de venta entre 50 y 100 euros.

pág. 27

También podría gustarte