Inicio‎ > ‎SQL‎ > ‎Lecciones SQL‎ > ‎

T01 Base de Datos, Relación y consultas

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 : 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 DISEÑO 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


Elección 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:

Acompañar al nombre de tabla con la base de datos a la que pertenece: select * from ejemplo.profesores
Seleccionar la base de datos: use ejemplo

La opción 2 permite realizar las consultas sin especificar la base de datos en la que están definidas las tablas.


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 código 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 código. 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.

Algunos de los tipos de datos que nos podemos encontrar en MySQL son:

  • VARCHAR(x): cadena de caracteres de longitud variable con un máximo de x (1<=x<=4000)
  • CHAR(x): cadena de caracteres de longitud fija de longitud n (1<=x<=2000)
  • INT,INTEGER: números enteros
  • DECIMAL(p,s): números con precisión p y escala s (1<=p<=38) (-84<=s<=127)
  • DATE: datos de tipo fecha, con la forma yyyy-mm-dd (año, mes y día). Los valores date deben manejarse encerrados entre comillas simples. 


Select-from

Para realizar consultas sobre una base de datos vamos a utilizar la orden select de SQL. 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.

Vamos a recuperar toda la información 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 información 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 estén definidas en la tabla.

select nombre, categoria from profesores

nombre categoria
EVA GOMEZ TEU
MANUEL PALOMAR TEU
RAFAEL ROMERO ASO6

Una opción de la que podemos hacer uso es la eliminación 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 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.

select nombre
from profesores
where categoria = 'TEU'

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 >, <, >=, <=, <>, !=. 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 DISEÑO 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 ordenación de forma descendente (igual que se puede hacer ASC 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 DISEÑO Y GESTION DE BASES DE DATOS
6.0 FUNDAMENTOS DE LAS BASES DE DATOS
6.0 PROGRAMACION CONCURRENTE

Pueden aplicarse criterios más complejos de ordenación. El siguiente es un ejemplo de ordenación por dos atributos: a igualdad de los valores del primer atributo, el orden lo determinan los valores del segundo. Nótese que es posible combinar en el criterio de ordenación distintos tipos de datos.

select creditos, descripcion
from asignaturas
order by creditos, descripcion

creditos descripcion
4.5 HISTORIA DE LA INFORMATICA
6.0 DISEÑO Y GESTION DE BASES DE DATOS
6.0 FUNDAMENTOS DE LAS BASES DE DATOS
6.0 PROGRAMACION CONCURRENTE
9.0 FUNDAMENTOS DE LA PROGRAMACION



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, cuál es.

Nótese que NULL no es "cadena vacía" ni "blanco"; éstos son valores concretos, pertenecientes al tipo de datos cadena de caracteres.

Normalmente, se simplifica su significado dejándolo en "no tiene valor" aunque es discutible.

A la pregunta de "asignaturas que no tienen créditos prácticos" todas estas soluciones dan resultados vacíos o erróneos

select *
from asignaturas
where creditosp = ''

--comilla-simple + comilla-simple = cadena vacía

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 creditos creditosp
HI HISTORIA DE LA INFORMATICA 4.5  

Efectivamente, hay una asignatura que no tiene créditos prácticos. Esto se debe a que, en la carga de la BD, se introdujo el valor NULL en la columna creditosp de la fila de la asignatura HI.

Nótese que ni tan siquiera es posible utilizar la comparación 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, ' créditos'
from asignaturas
order by creditos

La asignatura descripcion tiene creditos créditos
La asignatura HISTORIA DE LA INFORMATICA tiene 4.5 créditos
La asignatura DISEÑO Y GESTION DE BASES DE DATOS tiene 6.0 créditos
La asignatura FUNDAMENTOS DE LAS BASES DE DATOS tiene 6.0 créditos
La asignatura PROGRAMACION CONCURRENTE tiene 6.0 créditos
La asignatura FUNDAMENTOS DE LA PROGRAMACION tiene 9.0 créditos