You are on page 1of 23

T01 Concepto de Base de Datos y Relacin

Contenidos

1.

1 Base de Datos: Ejemplo

1.

1.1 Extensiones de Ejemplo:

2.

2 Eleccin de la BD de trabajo

3.

3 Tipos de datos

Una base de datos es un conjunto de informacin interrelacionada que representa un sistema de informacin particular, y EST
ms comnmente tablas, que almacenan los datos referentes a un objeto o a una interrelacin ENTRE objetos.

compuesta por relaciones, o

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 : varchar(10),
asignatura :
char(5) )
Clave primaria: (dni, asignatura)
Clave ajena: dni PROFESORES
Clave ajena: asignatura ASIGNATURAS

Extensiones de Ejemplo:
PROFESORES
dni

NOMBRE

categoria

ingreso

21111222

EVA GOMEZ

TEU

1993-10-01

21222333

MANUEL PALOMAR

TEU

1989-06-16

21333444

RAFAEL ROMERO

ASO6

1992-06-16

ASIGNATURAS
codigo

descripcion

CREDITOS

creditosp

DGBD

DISEO Y GESTION DE BASES DE DATOS

6.0

3.0

FBD

FUNDAMENTOS DE LAS BASES DE DATOS

6.0

1.5

FP

FUNDAMENTOS DE LA PROGRAMACION

9.0

4.5

HI

HISTORIA DE LA INFORMATICA

4.5

PC

PROGRAMACION CONCURRENTE

6.0

1.5

IMPARTE
dni

asignatura

21111222

DGBD

21111222

FBD

21333444

PC

Eleccin de la BD de trabajo
MySQL utiliza el concepto de base de datos como contenedores independientes de tal forma que para acceder a una tabla en particular se pueden usar dos
alternativas:
Acompaar al NOMBRE de tabla con la base de DATOS
Seleccionar la base de datos: use ejemplo

a la que pertenece: select * from ejemplo.profesores

La opcin 2 permite realizar las consultas sin especificar la base de datos en la que estn definidas las tablas.

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
entreimparte y profesor, y cdigo de asignatura, para la relacin entre asignatura e imparte. Ntese, sin embargo, que en la tabla imparte el cdigo de
asignatura se llama asignatura y en la tabla asignaturas cdigo. En realidad, tales atributos son comunes porque el dominio es el mismo para ambos y
se PUEDEN comparar. Los dominios vienen definidos por los TIPOS de datos que ofrece el SGBD.
Los tipos de datos que acompaan en el esquema de BD a cada columna en cada tabla determinan los valores que pueden tomar stas. Son de capital importancia
a la hora de relacionar tablas en una sentencia select, puesto que slo podremos comparar columnas con idntico tipo de datos, o a la hora de manipular datos,
dado que, como veremos en prximas sesiones, cada tipo de datos presenta unos requisitos especficos para su manipulacin.
Algunos de los tipos de datos que nos podemos encontrar en MySQL son:

VARCHAR(x): cadena de caracteres de longitud variable con un mximo de x (1<=x<=4000)

CHAR(x): cadena de caracteres de longitud fija de longitud n (1<=x<=2000)

INT,INTEGER: NMEROS

DECIMAL(p,s): nmeros con precisin p y escala s (1<=p<=38) (-84<=s<=127)

DATE

enteros

: datos de tipo FECHA

T02 Consultas

, con la forma yyyy-mm-dd (ao, mes y da). Los valores date deben manejarse encerrados entre comillas simples.

Contenidos

1.

1 Select-from

2.

2 Where

3.

3 Order by

Select-from
PARA realizar consultas sobre una base de DATOS vamos a utilizar la orden select de SQL. 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.
Vamos a recuperar toda la informacin que se ENCUENTRA en la tabla profesores:
select * from profesores

dni

NOMBRE

categoria

ingreso

21111222

EVA GOMEZ

TEU

1993-10-01

21222333

MANUEL PALOMAR

TEU

1989-06-16

21333444

RAFAEL ROMERO

ASO6

1992-06-16

Al especificar en la lista de columnas un asterisco le indicamos al SGBD que deseamos la informacin de todas
las columnas definidas para la tabla profesores.
select categoria from profesores
categoria
TEU
TEU
ASO6

AHORA solo hemos obtenido la columna categoria desechando la salida de las otras columnas. Podemos pedir,
eso s, cuantas columnas queramos y estn definidas en la tabla.
select nombre, categoria from profesores
nombre

categoria

EVA GOMEZ

TEU

MANUEL PALOMAR

TEU

RAFAEL ROMERO

ASO6

Una opcin de la que podemos HACER uso es la eliminacin de duplicados en la salida usando el
modificador distinct.
select distinct categoria from profesores
categoria
TEU

ASO6

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.
select NOMBRE
from profesores
where categoria = 'TEU'
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 >, <, >=, <=, <>, !=. Ante la duda, hay que consultar la tabla de precedencia de operadores, que en el
caso de MySQL se puede encontrar aqu: : no es lo mismo "A and B or C" que "A and (B or C)".

select nombre
from profesores
where categoria = 'TEU' or categoria = 'ASO6'
nombre
EVA GOMEZ
MANUEL PALOMAR
RAFAEL ROMERO

Order by
Podemos ordenar la salida producida por nuestra orden select por valores ascendentes o descendentes de una
columna en particular.
select CREDITOS , descripcion
from asignaturas
order by CREDITOS
CREDITOS

descripcion

4.5

HISTORIA DE LA INFORMATICA

6.0

DISEO Y GESTION DE BASES DE DATOS

6.0

FUNDAMENTOS DE LAS BASES DE DATOS

6.0

PROGRAMACION CONCURRENTE

9.0

FUNDAMENTOS DE LA PROGRAMACION

El resultado anterior estaba ordenado ascendentemente. Se puede especificar DESC para hacer la ordenacin de
forma descendente (igual que se puede hacerASC para ascendente, aunque no es necesario, como ya se ha visto)

select CREDITOS , descripcion


from asignaturas
where creditos > 4.5
order by creditos DESC
creditos

descripcion

9.0

FUNDAMENTOS DE LA PROGRAMACION

6.0

DISEO Y GESTION DE BASES DE DATOS

6.0

FUNDAMENTOS DE LAS BASES DE DATOS

6.0

PROGRAMACION CONCURRENTE

PUEDEN aplicarse criterios ms complejos de ordenacin. El siguiente es un ejemplo de ordenacin por dos
atributos: a igualdad de los valores del primer atributo, el orden lo determinan los valores del segundo. Ntese que
es posible combinar en el criterio de ordenacin distintos tipos de datos.
select creditos, descripcion
from asignaturas
order by creditos, descripcion
creditos

descripcion

4.5

HISTORIA DE LA INFORMATICA

6.0

DISEO Y GESTION DE BASES DE DATOS

6.0

FUNDAMENTOS DE LAS BASES DE DATOS

6.0

PROGRAMACION CONCURRENTE

9.0

FUNDAMENTOS DE LA PROGRAMACION

T02B Consultas 2
Contenidos

1.

1 Nulos (NULL)

2.

2 Constantes

3.

3 Uso de ms de una tabla

4.

4 Nombres cualificados de atributo

5.

5 Sinnimos temporales de tabla

Nulos (NULL)
Las BD relacionales TRABAJAN con un valor especial, NULL, que significa "ignorancia", se desconoce si
tiene valor o no, y en el caso de tenerlo, cul es.
Ntese que NULL no es "cadena vaca" ni "blanco"; stos son valores concretos, pertenecientes al tipo de DATOS
cadena de caracteres.
Normalmente, se simplifica su significado dejndolo en "no tiene valor" aunque es discutible.
A la pregunta de "asignaturas que no tienen CRDITOS prcticos" todas estas soluciones dan resultados vacos

o errneos
select *
from asignaturas
where creditosp = ''
--comilla-simple + comilla-simple = cadena vaca

select *
from asignaturas
where creditosp = ' '
--comilla-simple + espacio + comilla-simple = espacio_en_blanco

select *
from asignaturas
where creditosp = 0
select *
from asignaturas
where creditosp = NULL

Lo que estamos buscando realmente es


select *
from asignaturas
where creditosp is NULL
codigo

descripcion

HI

HISTORIA DE LA INFORMATICA

creditosp

CREDITOS
4.5

Efectivamente, hay una asignatura que no tiene CRDITOS prcticos. Esto se debe a que, en la carga de la
BD, se introdujo el valor NULL en la columnacreditosp de la fila de la asignatura HI.
Ntese que ni tan siquiera es posible utilizar la comparacin habitual (signo "igual"), es obligado utilizar el
operador IS NULL o IS NOT NULL.

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 , ' CRDITOS '
from asignaturas
order by creditos
La asignatura

descripcion

tiene

creditos

crditos

La asignatura

HISTORIA DE LA INFORMATICA

tiene

4.5

crditos

La asignatura

DISEO Y GESTION DE BASES DE DATOS

tiene

6.0

crditos

La asignatura

FUNDAMENTOS DE LAS BASES DE DATOS

tiene

6.0

crditos

La asignatura

PROGRAMACION CONCURRENTE

tiene

6.0

crditos

La asignatura

FUNDAMENTOS DE LA PROGRAMACION

tiene

9.0

crditos

Uso 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
Dnde est la informacin solicitada?
Consultando el esquema de la base de datos Ejemplo:
NOMBRE (del profesor) se ENCUENTRA en la tabla PROFESORES y
descripcin (de la asignatura) en ASIGNATURAS.
Si no lo pensamos mucho podramos ejecutar la siguiente orden confiando en el todopoderoso SGBD:
select nombre, descripcion
from asignaturas, profesores
nombre

descripcion

EVA GOMEZ

DISEO Y GESTION DE BASES DE DATOS

MANUEL PALOMAR

DISEO Y GESTION DE BASES DE DATOS

RAFAEL ROMERO

DISEO Y GESTION DE BASES DE DATOS

EVA GOMEZ

FUNDAMENTOS DE LAS BASES DE DATOS

MANUEL PALOMAR

FUNDAMENTOS DE LAS BASES DE DATOS

RAFAEL ROMERO

FUNDAMENTOS DE LAS BASES DE DATOS

EVA GOMEZ

FUNDAMENTOS DE LA PROGRAMACION

MANUEL PALOMAR

FUNDAMENTOS DE LA PROGRAMACION

RAFAEL ROMERO

FUNDAMENTOS DE LA PROGRAMACION

EVA GOMEZ

HISTORIA DE LA INFORMATICA

MANUEL PALOMAR

HISTORIA DE LA INFORMATICA

RAFAEL ROMERO

HISTORIA DE LA INFORMATICA

EVA GOMEZ

PROGRAMACION CONCURRENTE

MANUEL PALOMAR

PROGRAMACION CONCURRENTE

RAFAEL ROMERO

PROGRAMACION CONCURRENTE

Obviamente, el resultado anterior no se corresponde con la informacin solicitada, hemos hecho un producto
cartesiano entre dos conjuntos, la combinacin de todos los nombres de profesor con todas las descripciones de
asignatura.
En este caso, la relacin entre profesores y asignaturas se encuentra en imparte que tiene 2 claves ajenas, una est
asociada a la clave primaria de profesor y la otra a la clave primaria de asignaturas. Pensemos
en imparte como un "puente" que nos permite enlazar la informacin de la primera tabla con la segunda:
deprofesores pasamos a imparte mediante el dni, y de imparte a asignaturas mediante el cdigo de la
asignatura PROFESORES dni=dni IMPARTE asignatura=codigo ASIGNATURAS
Necesitamos, por tanto, incluir la tabla imparte en el from, y especificar en el where las CONDICIONES para

concatenar las tuplas deseadas.


Nombre de los profesores y descripcin de las asignaturas que imparten
(lo que debemos mostar): select nombre, descripcion
(donde EST la informacin necesaria): from asignaturas, profesores, imparte
(igualando claves ajenas y claves primarias): where imparte.dni = profesores.dni and asignatura = codigo
nombre

descripcion

EVA GOMEZ

DISEO Y GESTION DE BASES DE DATOS

EVA GOMEZ

FUNDAMENTOS DE LAS BASES DE DATOS

RAFAEL ROMERO

PROGRAMACION CONCURRENTE

Para entender mejor CMO se obtienen los resultados de una consulta podemos pensar que el orden de
ejecucin es
from asignaturas, profesores, imparte (producto cartesiano)
where profesores.dni = imparte.dni and asignatura = codigo (seleccin)
select nombre, descripcion (proyeccin)
1.
select * from asignaturas, profesores, imparte
codigo

descripcion

CREDITOS

creditosp

dni

NOMBRE

categoria

ingreso

dni

asignatura

DGBD

DISEO Y GESTION DE BASES DE DATOS

6.0

3.0

21111222

EVA GOMEZ

TEU

1993-10-01

21111222

DGBD

DGBD

DISEO Y GESTION DE BASES DE DATOS

6.0

3.0

21222333

MANUEL PALOMAR

TEU

1989-06-16

21111222

DGBD

DGBD

DISEO Y GESTION DE BASES DE DATOS

6.0

3.0

21333444

RAFAEL ROMERO

ASO6

1992-06-16

21111222

DGBD

DGBD

DISEO Y GESTION DE BASES DE DATOS

6.0

3.0

21111222

EVA GOMEZ

TEU

1993-10-01

21111222

FBD

DGBD

DISEO Y GESTION DE BASES DE DATOS

6.0

3.0

21222333

MANUEL PALOMAR

TEU

1989-06-16

21111222

FBD

DGBD

DISEO Y GESTION DE BASES DE DATOS

6.0

3.0

21333444

RAFAEL ROMERO

ASO6

1992-06-16

21111222

FBD

DGBD

DISEO Y GESTION DE BASES DE DATOS

6.0

3.0

21111222

EVA GOMEZ

TEU

1993-10-01

21333444

PC

DGBD

DISEO Y GESTION DE BASES DE DATOS

6.0

3.0

21222333

MANUEL PALOMAR

TEU

1989-06-16

21333444

PC

DGBD

DISEO Y GESTION DE BASES DE DATOS

6.0

3.0

21333444

RAFAEL ROMERO

ASO6

1992-06-16

21333444

PC

FBD

FUNDAMENTOS DE LAS BASES DE DATOS

6.0

1.5

21111222

EVA GOMEZ

TEU

1993-10-01

21111222

DGBD

FBD

FUNDAMENTOS DE LAS BASES DE DATOS

6.0

1.5

21222333

MANUEL PALOMAR

TEU

1989-06-16

21111222

DGBD

FBD

FUNDAMENTOS DE LAS BASES DE DATOS

6.0

1.5

21333444

RAFAEL ROMERO

ASO6

1992-06-16

21111222

DGBD

FBD

FUNDAMENTOS DE LAS BASES DE DATOS

6.0

1.5

21111222

EVA GOMEZ

TEU

1993-10-01

21111222

FBD

FBD

FUNDAMENTOS DE LAS BASES DE DATOS

6.0

1.5

21222333

MANUEL PALOMAR

TEU

1989-06-16

21111222

FBD

FBD

FUNDAMENTOS DE LAS BASES DE DATOS

6.0

1.5

21333444

RAFAEL ROMERO

ASO6

1992-06-16

21111222

FBD

FBD

FUNDAMENTOS DE LAS BASES DE DATOS

6.0

1.5

21111222

EVA GOMEZ

TEU

1993-10-01

21333444

PC

FBD

FUNDAMENTOS DE LAS BASES DE DATOS

6.0

1.5

21222333

MANUEL PALOMAR

TEU

1989-06-16

21333444

PC

FBD

FUNDAMENTOS DE LAS BASES DE DATOS

6.0

1.5

21333444

RAFAEL ROMERO

ASO6

1992-06-16

21333444

PC

FP

FUNDAMENTOS DE LA PROGRAMACION

9.0

4.5

21111222

EVA GOMEZ

TEU

1993-10-01

21111222

DGBD

FP

FUNDAMENTOS DE LA PROGRAMACION

9.0

4.5

21222333

MANUEL PALOMAR

TEU

1989-06-16

21111222

DGBD

FP

FUNDAMENTOS DE LA PROGRAMACION

9.0

4.5

21333444

RAFAEL ROMERO

ASO6

1992-06-16

21111222

DGBD

FP

FUNDAMENTOS DE LA PROGRAMACION

9.0

4.5

21111222

EVA GOMEZ

TEU

1993-10-01

21111222

FBD

FP

FUNDAMENTOS DE LA PROGRAMACION

9.0

4.5

21222333

MANUEL PALOMAR

TEU

1989-06-16

21111222

FBD

FP

FUNDAMENTOS DE LA PROGRAMACION

9.0

4.5

21333444

RAFAEL ROMERO

ASO6

1992-06-16

21111222

FBD

FP

FUNDAMENTOS DE LA PROGRAMACION

9.0

4.5

21111222

EVA GOMEZ

TEU

1993-10-01

21333444

PC

FP

FUNDAMENTOS DE LA PROGRAMACION

9.0

4.5

21222333

MANUEL PALOMAR

TEU

1989-06-16

21333444

PC

FP

FUNDAMENTOS DE LA PROGRAMACION

9.0

4.5

21333444

RAFAEL ROMERO

ASO6

1992-06-16

21333444

PC

HI

HISTORIA DE LA INFORMATICA

4.5

21111222

EVA GOMEZ

TEU

1993-10-01

21111222

DGBD

HI

HISTORIA DE LA INFORMATICA

4.5

21222333

MANUEL PALOMAR

TEU

1989-06-16

21111222

DGBD

HI

HISTORIA DE LA INFORMATICA

4.5

21333444

RAFAEL ROMERO

ASO6

1992-06-16

21111222

DGBD

HI

HISTORIA DE LA INFORMATICA

4.5

21111222

EVA GOMEZ

TEU

1993-10-01

21111222

FBD

HI

HISTORIA DE LA INFORMATICA

4.5

21222333

MANUEL PALOMAR

TEU

1989-06-16

21111222

FBD

HI

HISTORIA DE LA INFORMATICA

4.5

21333444

RAFAEL ROMERO

ASO6

1992-06-16

21111222

FBD

HI

HISTORIA DE LA INFORMATICA

4.5

21111222

EVA GOMEZ

TEU

1993-10-01

21333444

PC

HI

HISTORIA DE LA INFORMATICA

4.5

21222333

MANUEL PALOMAR

TEU

1989-06-16

21333444

PC

HI

HISTORIA DE LA INFORMATICA

4.5

21333444

RAFAEL ROMERO

ASO6

1992-06-16

21333444

PC

PC

PROGRAMACION CONCURRENTE

6.0

1.5

21111222

EVA GOMEZ

TEU

1993-10-01

21111222

DGBD

PC

PROGRAMACION CONCURRENTE

6.0

1.5

21222333

MANUEL PALOMAR

TEU

1989-06-16

21111222

DGBD

PC

PROGRAMACION CONCURRENTE

6.0

1.5

21333444

RAFAEL ROMERO

ASO6

1992-06-16

21111222

DGBD

PC

PROGRAMACION CONCURRENTE

6.0

1.5

21111222

EVA GOMEZ

TEU

1993-10-01

21111222

FBD

PC

PROGRAMACION CONCURRENTE

6.0

1.5

21222333

MANUEL PALOMAR

TEU

1989-06-16

21111222

FBD

PC

PROGRAMACION CONCURRENTE

6.0

1.5

21333444

RAFAEL ROMERO

ASO6

1992-06-16

21111222

FBD

PC

PROGRAMACION CONCURRENTE

6.0

1.5

21111222

EVA GOMEZ

TEU

1993-10-01

21333444

PC

PC

PROGRAMACION CONCURRENTE

6.0

1.5

21222333

MANUEL PALOMAR

TEU

1989-06-16

21333444

PC

PC

PROGRAMACION CONCURRENTE

6.0

1.5

21333444

RAFAEL ROMERO

ASO6

1992-06-16

21333444

PC

2.
select * from asignaturas, profesores, imparte
where profesores.dni = imparte.dni and asignatura = codigo
codigo

descripcion

creditosp

CREDITOS

dni

NOMBRE

categoria

ingreso

dni

asignatura

DGBD

DISEO Y GESTION DE BASES DE DATOS

6.0

3.0

21111222

EVA GOMEZ

TEU

1993-10-01

21111222

DGBD

FBD

FUNDAMENTOS DE LAS BASES DE DATOS

6.0

1.5

21111222

EVA GOMEZ

TEU

1993-10-01

21111222

FBD

PC

PROGRAMACION CONCURRENTE

6.0

1.5

21333444

RAFAEL ROMERO

ASO6

1992-06-16

21333444

PC

3.
select nombre, descripcion
from asignaturas, profesores, imparte where
profesores.dni=imparte.dni and asignatura=codigo
nombre

descripcion

EVA GOMEZ

DISEO Y GESTION DE BASES DE DATOS

EVA GOMEZ

FUNDAMENTOS DE LAS BASES DE DATOS

RAFAEL ROMERO

PROGRAMACION CONCURRENTE

Resumiendo, podemos decir que


1. from establece la fuente de datos,
2. where la informacin objetivo en bruto, y
3. select la extraccin de la informacin deseada.
IMPORTANTE: 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. Es slo una forma de comprender las
acciones bsicas que representa cada parmetro de la orden select.

Nombres cualificados de atributo


Un NOMBRE cualificado de atributo es el que especifica el nombre de la tabla a la que pertenece la
columna:
profesores.dni
asignaturas.descripcin
Es obligatorio utilizar nombres cualificados de atributo si hay ambigedad, si varias tablas de
la select TIENEN columnas que se llaman igual:
profesores.dni

imparte.dni
En cualquier otro caso no es necesario.
DNI y nombre de los profesores que imparten alguna asignatura
select profesores.dni, nombre
from profesores, imparte
where profesores.dni = imparte.dni
dni

nombre

21111222

EVA GOMEZ

21111222

EVA GOMEZ

21333444

RAFAEL ROMERO

Igual que el anterior PERO no cualificando el dni de la proyeccin


select dni, nombre
from profesores, imparte
where profesores.dni = imparte.dni
Error at Command Line:3 Column:0
Error report:
SQL Error: Column 'dni' in field list is ambiguous
Tambin es til cuando, a PARTIR de varias tablas, se quieren todas las columnas de una y slo alguna de las
otras
select profesores.*, descripcion
from profesores, asignaturas, imparte
where profesores.dni = imparte.dni
and codigo = asignatura
dni

nombre

categoria

ingreso

descripcion

21111222

EVA GOMEZ

TEU

1993-10-01

DISEO Y GESTION DE BASES DE DATOS

21111222

EVA GOMEZ

TEU

1993-10-01

FUNDAMENTOS DE LAS BASES DE DATOS

21333444

RAFAEL ROMERO

ASO6

1992-06-16

PROGRAMACION CONCURRENTE

Sinnimos temporales de tabla


select * from tabla alias
Una cadena de caracteres a CONTINUACIN del nombre de la tabla en el from, es un alias temporal, un
nombre sustitutivo.
Es recomendable para simplificar la escritura de la orden select o para hacerla ms legible.
Es obligatorio para un producto cartesiano de una tabla por si misma: select p1.NOMBRE , p2.nombre
from profesores p1, profesores p2
where p1.nombre <> p2.nombre
nombre

nombre

MANUEL PALOMAR

EVA GOMEZ

RAFAEL ROMERO

EVA GOMEZ

EVA GOMEZ

MANUEL PALOMAR

RAFAEL ROMERO

MANUEL PALOMAR

EVA GOMEZ

RAFAEL ROMERO

MANUEL PALOMAR

RAFAEL ROMERO

Cuando se define el sinnimo en el from, sustituye totalmente al nombre de la tabla (no se permite utilizar los dos
simultneamente en el select o el where)
Por otro lado, no es necesario definir sinnimos para todas las tablas del from.
DNI y nombre de los profesores que imparten alguna asignatura (utilizando sinnimos temporales de tabla)
select p.dni, nombre
from profesores p, imparte i
where p.dni = i.dni
dni

nombre

21111222

EVA GOMEZ

21111222

EVA GOMEZ

21333444

RAFAEL ROMERO

T03 Expresiones de seleccin de filas


Contenidos

1.

1 Rangos

2.

2 Listas

3.

3 Subcadenas de caracteres

4.

4 Consultas anidadas

1.

4.1 de valor escalar

2.

4.2 de lista de valores

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

CREDITOS

descripcion

6.0

DISEO Y GESTION DE BASES DE DATOS

6.0

FUNDAMENTOS DE LAS BASES DE DATOS

6.0

PROGRAMACION CONCURRENTE

Listas
Mediante el operador IN se puede buscar un determinado valor en una lista construida usando constantes.
expresin [NOT] IN (listaValores)
Descripcin de las asignaturas FBD y DGBD.
select descripcion
from asignaturas
where codigo in ('FBD', 'DGBD')

descripcion
DISEO Y GESTION DE BASES DE DATOS
FUNDAMENTOS DE LAS 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')
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:
expresin [NOT] LIKE 'cadena'
La cadena de caracteres cadena admite los comodines % (tanto por ciento) y _ (subrayado):

% indica una cadena de caracteres de cualquier longitud (Ali% = Alicante, Aligerar, Ali, ...)

_ un carcter cualquiera (Ali_ = Alic, Alig, Ali, ...)

Profesores que atiendan al nombre de 'RAFA'.


select * from profesores where nombre like 'RAFA%'
dni

nombre

21333444

RAFAEL ROMERO

categoria
ASO6

ingreso
1992-06-16

Cdigo de las asignaturas de 'Bases de Datos'


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

Cdigo de las asignaturas, siendo tal cdigo de 2 caracteres


select codigo from asignaturas where codigo like '__'
codigo
FP
HI
PC

Descripcin de las asignaturas cuya ltima palabra contiene 'INFORMATIC' y un caracter adicional.
select descripcion from asignaturas where descripcion like '%INFORMATIC_'
descripcion
HISTORIA DE LA INFORMATICA

Consultas anidadas
A veces, las condiciones de filtrado de tuplas o de clculos de agregacin son ms complejas que la simple
comparacin con una constante o un valor almacenado en una tabla. Este DATO intermedio, no un resultado
final, ha de obtenerse mediante una consulta auxiliar, una subconsulta.
En la condicin de filtrado 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 obtenido alguna fila.

Descripcin y crditos de las asignaturas con menos crditos.


select descripcion, CREDITOS
from asignaturas
where CREDITOS = ( select min(creditos) from asignaturas )
descripcion
HISTORIA DE LA INFORMATICA

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.
Las subconsultas, dependiendo del valor esperado y del tipo de comparacin deseado se PUEDEN utilizar de 3
formas:

expr opcompara {ALL|[ANY|SOME]} (orden select)

expr [NOT] IN (orden select)

[NOT] EXISTS (orden select)

donde opcompara es cualquier operador de comparacin.


Los valores posibles a devolver por una orden select anidada son :

nada

un valor nico (una fila y una columna),

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

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

de valor escalar
expr opcompara (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 subconsulta, siempre y cuando sta devuelva una nica fila y una
nica columna, es decir, un valor escalar.
select descripcion

from asignaturas
where CREDITOS = (select CREDITOS

from asignaturas where CREDITOS

< 9)

SQL Error: Subquery returns more than 1 row


Aunque tambin se puede utilizar cualquier consulta de la que estamos seguros que nos va a devolver una fila y
una columna, lo ms habitual es que sea el resultado de buscar un valor concreto de una clave primaria (en
general, de cualquier combinacin de columnas que no admita duplicados)
Asignaturas que tienen ms CRDITOS que la asignatura HI.
select * from asignaturas
where creditos >(select creditos
from asignaturas
where codigo = 'HI')
codigo

descripcion

CREDITOS

creditosp

DGBD

DISEO Y GESTION DE BASES DE DATOS

6.0

3.0

FBD

FUNDAMENTOS DE LAS BASES DE DATOS

6.0

1.5

FP

FUNDAMENTOS DE LA PROGRAMACION

9.0

4.5

PC

PROGRAMACION CONCURRENTE

6.0

1.5

de lista de valores
expr opcompara 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.
Asignaturas que tienen ms crditos que las dems (asignaturas que tienen la mxima cantidad DE CRDITOS
en la base de datos)
select descripcion
from asignaturas
where CREDITOS >= ALL (select CREDITOS

from asignaturas)

descripcion
FUNDAMENTOS DE LA PROGRAMACION

El NMERO en crditos de la asignatura tiene que ser mayor o igual que todos (all) los valores obtenidos en
la subconsulta (que es la relacin DE CRDITOS de todas las asignaturas). Tambin se podra haber formulado
como
select descripcion
from asignaturas
where CREDITOS = (select max(creditos) from asignaturas)

Nombre de las asignaturas que no son las que menos crditos tienen.
select descripcion
from asignaturas
where creditos > ANY (select creditos from asignaturas)
descripcion
DISEO Y GESTION DE BASES DE DATOS
FUNDAMENTOS DE LAS BASES DE DATOS
FUNDAMENTOS DE LA PROGRAMACION
PROGRAMACION CONCURRENTE

Seran todas aquellas asignaturas cuyos crditos superen al menos a uno (any) de los valores devueltos por la
subconsulta. Los modificadores some y any son sinnimos. Una solucin alternativa es
select descripcion
from asignaturas
where CREDITOS != (select min(CREDITOS ) from asignaturas)

Nombre de los profesores que imparten una asignatura que no sea la mxima en nmero DE CRDITOS
select nombre
from profesores p, asignaturas a, imparte i
where p.dni = i.dni and i.asignatura = a.codigo
and CREDITOS < ANY ( select CREDITOS from asignaturas )
nombre
EVA GOMEZ
EVA GOMEZ
RAFAEL ROMERO

NOTA IMPORTANTE:
Por un cambio de configuracin que, a su vez, descubre un fallo de la versin INSTALADA de MySQL, las
expresiones expr opcompara {ALL|[ANY|SOME]} provocan un error de compilacin y no pueden
ejecutarse. Por fortuna, la mayor parte tienen que ver con "el mximo, el mnimo x" por lo que se puede
utilizar la forma del ejemplo:
NO funcionar (en nuestra versin de MySQL)
select descripcion, creditos
from asignaturas
where creditos <= ALL( select creditos from asignaturas )
S funcionara, y es equivalente en su resultado
select descripcion, creditos
from asignaturas
where creditos = ( select min(creditos) from asignaturas )

expr [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)
dni

NOMBRE

categoria

ingreso

21111222

EVA GOMEZ

TEU

1993-10-01

21333444

RAFAEL ROMERO

ASO6

1992-06-16

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
NOTA: el resultado no es exactamente el mismo porque el uso de IN consigue el mismo resultado que si
hubiramos aplicado el modificador distinct. Mientras que IN va recorriendo la tabla profesores y
preguntando por cada uno si se ENCUENTRA en la tabla imparte o no, la segunda realiza el producto cartesiano
y descarta las filas en las que no coinciden los valores de DNI. Es decir, la segunda consulta muestra filas
duplicadas (en este estado de base de datos) mientras que la anterior no. Lo que queremos decir, no obstante, es
que ambas dan como resultado "profesores que imparten algo".
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)
dni
21222333

nombre
MANUEL PALOMAR

categoria
TEU

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


expr IN (orden select) expr=ANY(orden select)
expr NOT IN (orden select) expr<>ALL(orden select)

T04 Fechas y tiempo


Contenidos

1.

1 De cadenas de caracteres, nmeros y fechas y tiempos

2.

2 Funciones de fecha y hora

ingreso
1989-06-16

1.

2.1 Ahora

2.

2.2 Formato

3.

2.3 Extraccin

La administracin y manejo de valores temporales es la parte de los motores de base de DATOS menos
estandarizada y con ms diferencias entre uno y otro. Aparte, y junto con la codificacin de caracteres y las
caractersticas regionales (por ejemplo, formato de las FECHAS ) forma parte de un conjunto de parmetros
globales del sistema que el administrador del mismo debe comprender y tener presente dependiendo del medio en
el que se vayan a ver los resultados de una consulta. Si fuera a formar parte de un conjunto de pginas web
dinmicas no solo el servidor de base de datos debe estar correctamente configurado sino que debe tener
en CUENTA el servidor http, el del lenguaje huesped (php, por ejemplo) e incluso los clientes (navegadores,
ordenadores, etc.). Es muy posible que la misma fecha, en SQL Developer, vista en la pestaa resultados o en la
script output tenga formato diferente (la primera est controlada por el programa cliente y la segunda muestra los
datos tal cual se los enva el servidor.
Puestas as las cosas, aqu se va a tratar la superficie de todo lo que se puede hacer con fechas y tiempos y siempre
desde el punto de vista estrictamente de la consulta SQL.
MySQL ofrece varios tipos de datos relacionados con el tiempo:
DATETIME '0000-00-00 00:00:00'
DATE '0000-00-00'
TIMESTAMP 00000000000000
TIME '00:00:00'
YEAR 0000
Lo que se muestra en la lista anterior da una idea de qu datos maneja cada tipo. En realidad, lo anterior es la
relacin de "valores cero" que pueden almacenar y que tienen carcter de valor por defecto o valor de prueba.
Dejando de lado el tipo TIMESTAMP que tiene unas propiedades y aplicaciones propias, todos los tipos estn
relacionados y difieren en cuanto a las limitaciones de almacenamiento y, ms importante, de conversin
automtica de tipos.

De cadenas de caracteres, nmeros y fechas y tiempos


Profesores que han ingresado antes de 1990.
select *
from profesores
where ingreso < '1990-01-01';
dni
21222333

NOMBRE
MANUEL PALOMAR

categoria
TEU

ingreso
1989-06-16

Ntese que se est comparando un tipo date con una cadena de caracteres. Lo que ocurre es que MySQL analiza
la cadena y determina si tiene un formato adecuado para el tipo de datos y la procesa si as es. De hecho, aunque
la salida genrica de una fecha siempre es aaaa-mm-dd, la cadena de caracteres que usamos para la comparacin
asume cierta libertad de formato:
ingreso < '1990@01@01'

ingreso < '1990/01/01'


ingreso < '1990.01.01'
ingreso < '1990:01:01'
En todos los casos el resultado es idntico al anterior. Lo que ya no funciona es
select *
from profesores
where ingreso < '01-01-1990'
0 rows selected
Y, adems, no se genera ningn mensaje de error, simplemente, no muestra fila alguna en el resultado. Tampoco se
comporta COMO nosotros esperaramos
select *
from profesores
where ingreso < 1990-01-01;
0 rows selected
PERO s de
select *
from profesores
where ingreso < 19900101;
dni
21222333

NOMBRE
MANUEL PALOMAR

categoria
TEU

ingreso
1989-06-16

Otro aspecto en el que se da cierta libertad en es la FORMA del ao:


select *
from profesores
where ingreso < '90-01-01';

dni
21222333

nombre
MANUEL PALOMAR

categoria
TEU

ingreso
1989-06-16

Ahora bien, hay que tener en CUENTA que MySQL hace una interpretacin de esa parte de la fecha de tal forma
que AOS en el rango 00-69 los convierte en 2000-2069, y los 70-99 en 1970-1999. Si manejamos aos
anteriores o posteriores debemos usar los 4 caracteres.

Funciones de fecha y hora


En el manual de referencia de MySQL 5.0 PUEDE consultarse la funcionalidad completa relativa al manejo del
tiempo. Aqu solo expondremos algunas:
now(), curdate(), curtime()
date_format(), str_to_date()
day(), dayofweek(), dayname(), month(), year(), hour(), minute(), second()

Ahora
now() devuelve la FECHA y hora del servidor en formato datetime. curdate() y curtime() hacen lo
mismo PERO con la fecha y la hora respectivamente.
select now(), curdate(), curtime();
now()

curdate()

2010-12-03 19:40:17

curtime()

2010-12-03

19:40:17

Formato
Las funciones principales de formato podemos decir que son date_format() y str_to_date(). Una es la inversa de la
otra: dateformat() transforma la fecha a un formato de texto determinado y str_to_date() una cadena de caracteres
en un formato concreto a fecha. Las dos TRABAJAN con 2 parmetros, una expresin y una cadena de formato.
La cadena de formato indica a la funcin que aspecto tiene o queremos que tenga (depende de si es una u otra
funcin) el DATO que le suministramos en el primer parmetro:
Profesores, con la fecha de ingreso en formato "dd/mm/aaaa".
select dni, NOMBRE , date_format(ingreso, '%d/%m/%Y') ingreso from
profesores;
dni

nombre

ingreso

21111222

EVA GOMEZ

01/10/1993

21222333

MANUEL PALOMAR

16/06/1989

21333444

RAFAEL ROMERO

16/06/1992

Profesores que han ingresado antes de 1/1/1990.


select *
from profesores
where ingreso < str_to_date('1/1/90','%d/%m/%y');.
dni
21222333

nombre
MANUEL PALOMAR

categoria
TEU

ingreso
1989-06-16

As, la cadena de formato para la primera consulta representa "cmo queremos la salida" y la de la segunda "cmo
est escrita la fecha que quiero comparar". La totalidad de los cdigos posibles se PUEDE consultar en la
descripcin de la funcin date_format() en http://dev.mysql.com/doc/refman/5.0/es/date-and-time-functions.html.

Extraccin
Las otras funciones a las que vamos a PRESTAR atencin son las que extraen parte de la expresin temporal.
select day(ingreso) da, month(ingreso) mes, year(ingreso) ao
from profesores
where NOMBRE ='EVA GOMEZ';

da
1

mes

ao

10

1993

select dayname(ingreso) da, dayofweek(ingreso) nda, monthname(ingreso)


mes
from profesores
where nombre='EVA GOMEZ';
d
Friday

nd
6

m
October

select date_format(now(),'%Y%m%d -- %H:%i:%s') AHORA ;


ahora
20101203 -- 20:12:49

T05 Reunin (join)

Contenidos

1.

2.

1 Tipos de reunin

1.

1.1 Equijoin

2.

1.2 Self join

3.

1.3 Producto cartesiano

4.

1.4 Inner join, simple join

5.

1.5 Outer join

6.

1.6 Antijoin

7.

1.7 Semijoin

2 Outer join

El uso de varias tablas en una consulta, y su concatenacin siguiendo cualquier criterio, se conoce
habitualmente COMO join, el trmino en ingls adoptado y utilizado. Estamos hablando, por ejemplo, de:
select *
from asignaturas, profesores, imparte
where profesores.dni = imparte.dni and asignatura = codigo

Tipos de reunin
Dependiendo de qu tablas se especifiquen en el from y del TIPO de condicin exigida para relacionar las filas
de esas tablas, el join recibe distintos NOMBRES (terminologa que se puede considerar estndar):

Equijoin
Consultas que conllevan el uso de igualdades PARA la concatenacin de filas de varias tablas. El ejemplo
anterior es una equijoin.

Self join
Estas consultas concatenan una tabla consigo misma:
select i1.dni, ' imparte la misma asignatura que ', i2.dni
from imparte i1, imparte i2
where i1.asignatura= i2.asignatura
COUNT( * )
NMERO de filas
COUNT( [DISTINCT] expr )
nmero de valores distintos en expr
dni
imparte la misma asignatura que
SUM( [DISTINCT]
expr ) imparte la misma asignatura
suma
21111222
que de todos los valores en expr
21111222
que
AVG( [DISTINCT]
expr ) imparte la misma asignatura
promedio
de todos los valores en expr
21333444
imparte la misma asignatura que
MIN( expr )
el ms pequeo de todos los valores en expr
MAX( expr )
el mayor de todos los valores en expr

dni
21111222
21111222
21333444