Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
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.
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
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
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.
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:
• Blob y Text:
• MediumBlob y MediumText:
• 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.
CHAR(n) n bytes
VARCHAR(n) n +1 bytes
MEDIUMBLOB,
Longitud +3 bytes
MEDIUMTEXT
Almace Almace
Valor CHAR(4) VARCHAR(4)
namiento namiento
SELECT 1
Objetivos:
Contenidos:
LA ORDEN SELECT-FROM-WHERE
pág. 5
Sintaxis general de la orden select
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
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
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:
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.
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 >, <, >=, <=, <>
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.
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:
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
LA BASE DE DATOS
PROVEEDORES
Objetivos:
pág. 9
LA BASE DE DATOS PROVEEDORES
Básicamente, las tareas que se pretenden mecanizar son las siguientes (entre paréntesis aparecen
las tablas directamente relacionadas con cada una):
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.
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.
pág. 11
tabla VENDEDOR
tabla PIEZA
numpieza nompieza preciovent
A-1001-L MOUSE ADL 3B 7,00
C-1002-H 4,00
C-1002-J 7,00
tabla PEDIDO
tabla LINPED
tabla INVENTARIO
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
CONSULTAS SELECT1
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.
8. Obtener todos los números de los vendedores de los que se sepa que pueden suministrar alguna
pieza.
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:
Contenidos
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,
¿Qué pasaría si no utilizáramos la cláusula where para enlazar las tablas? Supongamos el
siguiente requerimiento:
El SGBD primero combinaría todas las tuplas con todas de las tablas especificadas en el from:
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
asignatura nombre
FBD EVA GOMEZ
DGBD EVA GOMEZ
PC RAFAEL ROMERO
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.
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):
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.
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.
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%.
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.
EXPRESIONES DE
SELECCIÓN DE FILAS
Objetivos:
Contenidos
• BETWEEN, IN
• LIKE, subcadenas.
RANGOS
Expresiones del tipo 10 <= x <= 100 se pueden construir utilizando el operador de construcción
de rangos BETWEEN.
Por ejemplo, deseamos conocer los créditos y descripción de las asignaturas cuyo número de
créditos está entre 5 y 8.
LISTAS
Mediante el operador IN se puede buscar un determinado valor en una lista construida usando
constantes.
pág. 21
Descripción de las asignaturas FBD y DGBD:
resultado: descripcion
Fundamentos de las Bases de Datos
Diseño y Gestión de Bases de Datos
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:
resultado: codigo
FBD
DGBD
VALORES NULOS
pág. 23
RESUMEN DE OPERADORES
Recopilamos todos los operadores y conectivas lógicas vistos hasta ahora para la construcción de
expresiones condicionales:
> 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.
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.
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.
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.
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.
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.
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.
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.
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