Documente Academic
Documente Profesional
Documente Cultură
Contenidos
1.
1.
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.
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.
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
6.0
3.0
FBD
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
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:
INT,INTEGER: NMEROS
DATE
enteros
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
6.0
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)
descripcion
9.0
FUNDAMENTOS DE LA PROGRAMACION
6.0
6.0
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
6.0
6.0
PROGRAMACION CONCURRENTE
9.0
FUNDAMENTOS DE LA PROGRAMACION
T02B Consultas 2
Contenidos
1.
1 Nulos (NULL)
2.
2 Constantes
3.
4.
5.
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
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
tiene
6.0
crditos
La asignatura
tiene
6.0
crditos
La asignatura
PROGRAMACION CONCURRENTE
tiene
6.0
crditos
La asignatura
FUNDAMENTOS DE LA PROGRAMACION
tiene
9.0
crditos
descripcion
EVA GOMEZ
MANUEL PALOMAR
RAFAEL ROMERO
EVA GOMEZ
MANUEL PALOMAR
RAFAEL ROMERO
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
descripcion
EVA GOMEZ
EVA GOMEZ
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
6.0
3.0
21111222
EVA GOMEZ
TEU
1993-10-01
21111222
DGBD
DGBD
6.0
3.0
21222333
MANUEL PALOMAR
TEU
1989-06-16
21111222
DGBD
DGBD
6.0
3.0
21333444
RAFAEL ROMERO
ASO6
1992-06-16
21111222
DGBD
DGBD
6.0
3.0
21111222
EVA GOMEZ
TEU
1993-10-01
21111222
FBD
DGBD
6.0
3.0
21222333
MANUEL PALOMAR
TEU
1989-06-16
21111222
FBD
DGBD
6.0
3.0
21333444
RAFAEL ROMERO
ASO6
1992-06-16
21111222
FBD
DGBD
6.0
3.0
21111222
EVA GOMEZ
TEU
1993-10-01
21333444
PC
DGBD
6.0
3.0
21222333
MANUEL PALOMAR
TEU
1989-06-16
21333444
PC
DGBD
6.0
3.0
21333444
RAFAEL ROMERO
ASO6
1992-06-16
21333444
PC
FBD
6.0
1.5
21111222
EVA GOMEZ
TEU
1993-10-01
21111222
DGBD
FBD
6.0
1.5
21222333
MANUEL PALOMAR
TEU
1989-06-16
21111222
DGBD
FBD
6.0
1.5
21333444
RAFAEL ROMERO
ASO6
1992-06-16
21111222
DGBD
FBD
6.0
1.5
21111222
EVA GOMEZ
TEU
1993-10-01
21111222
FBD
FBD
6.0
1.5
21222333
MANUEL PALOMAR
TEU
1989-06-16
21111222
FBD
FBD
6.0
1.5
21333444
RAFAEL ROMERO
ASO6
1992-06-16
21111222
FBD
FBD
6.0
1.5
21111222
EVA GOMEZ
TEU
1993-10-01
21333444
PC
FBD
6.0
1.5
21222333
MANUEL PALOMAR
TEU
1989-06-16
21333444
PC
FBD
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
6.0
3.0
21111222
EVA GOMEZ
TEU
1993-10-01
21111222
DGBD
FBD
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
EVA GOMEZ
RAFAEL ROMERO
PROGRAMACION CONCURRENTE
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
nombre
categoria
ingreso
descripcion
21111222
EVA GOMEZ
TEU
1993-10-01
21111222
EVA GOMEZ
TEU
1993-10-01
21333444
RAFAEL ROMERO
ASO6
1992-06-16
PROGRAMACION CONCURRENTE
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
1.
1 Rangos
2.
2 Listas
3.
3 Subcadenas de caracteres
4.
4 Consultas anidadas
1.
2.
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
6.0
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
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, ...)
nombre
21333444
RAFAEL ROMERO
categoria
ASO6
ingreso
1992-06-16
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:
determinar si el valor de una expresin est incluido en los resultados de otra orden select
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:
nada
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
< 9)
descripcion
CREDITOS
creditosp
DGBD
6.0
3.0
FBD
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 )
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
1.
2.
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.
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'
NOMBRE
MANUEL PALOMAR
categoria
TEU
ingreso
1989-06-16
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.
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
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
nd
6
m
October
Contenidos
1.
2.
1 Tipos de reunin
1.
1.1 Equijoin
2.
3.
4.
5.
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