Base de datos. Las bases de datos existen desde que el ser humano empezó a almacenar datos en algún soporte. Si por datos entendemos dibujos, que lo son, entonces las primeras bases de datos fueron las paredes de las cuevas donde nuestros ancestros dibujaron las pinturas rupestres. Posteriormente los egipcios crearon grandes estructuras arquitectónicas que usaron, entre otras cosas, como soporte para almacenar datos y narrar la historia del antiguo Egipto en sus paredes. El tiempo transcurrió hasta el punto de que el significado de todos esos símbolos se perdió, sin embargo la base de datos perduró lo suficiente para que alguien consiguiera descifrar los jeroglíficos a tiempo, de modo que todos esos datos, esa faraónica base de datos, cobró de nuevo todo su sentido. De hecho el valor de toda esa información es mayor que todos los tesoros que pudiesen esconder tumbas y templos. Los arqueólogos esperan encontrar en los nuevos hallazgos, antes que objetos y tesoros, nuevos jeroglíficos que les permitan conocer algún episodio olvidado de la historia de esta fascinante civilización. En ocasiones es esa misma información la que proporciona las pistas para descubrir nuevos hallazgos. En la actualidad las bases de datos informáticas han quitado todo el protagonismo a sus antecesoras, los archivos de papel, que aun se siguen usando en algunos ámbitos concretos. De bases de datos informáticas han habido de varios tipos, pero las que más han proliferando son las que se tratarán en este curso, las bases de datos relacionales. Mencionar que antes de estas últimas se usaron las bases de datos jerárquicas y posteriormente las bases de datos en red, actualmente sistemas en desuso. Para encauzar el aprendizaje del lenguaje de consulta SQL empezaremos por conocer la estructura de almacenamiento que usa una base de datos relacional. En este caso no son paredes, ni montones de papel lo que se usa para almacenar la información, sino que se almacena en soportes informáticos bajo una estructura lógica de almacenamiento, como la tiene un archivo de papel, por ejemplo: edificio, planta, pasillo, ubicación, ficha. De este modo es posible recuperar la información que interesa de un modo ágil, gracias a los incides y la estructura organizada del archivo. A continuación se verá como estructura la información una base de datos relacional, pero antes, establezcamos una pocas definiciones. Base de datos relacional: Una base de datos (BD), o mejor dicho, un sistema gestor de bases de datos (SGBD), es un software que gestiona una o más bases de datos y nos permite explotar los datos almacenados en ellas de forma relativamente simple mediante SQL. Esta es una definición muy simplificada, pero para que el aprendizaje sea distendido lo supondremos así, de ese modo podemos centrarnos en aprender como y con que propósito accedemos a los datos, dejando para el final como creamos, alimentamos o modificamos la BD.Algunos ejemplos de SGBD son: Oracle, MySQL, MS SQL Server etc. Estructura mínima de almacenamiento: Tabla: Objeto de almacenamiento perteneciente a una BD. Es una estructura en forma de cuadrante donde se almacenan registros o filas de datos. Cada tabla tiene un nombre único en la BD. Registro: Cada una de las filas de una tabla, esta compuesto por campos o atributos. Campo: Cada uno de los “cajoncitos” de un registro donde se guardan los datos. Cada campo tiene un nombre único para la tabla de la cual forma parte, además es de un tipo (naturaleza) determinado, por tanto no podemos guardar limones en el cajón de las naranjas, en términos informáticos y a modo de ejemplo, no encontraremos un dato alfanumérico (letras y números) en un campo diseñado para guardar datos numéricos. Por el momento estas son las definiciones que necesitamos, veamos ahora un ejemplo concreto de tabla. Ejemplo de tabla: Tabla EMPLEADOS Cada registro o fila de datos contiene información de un empleado. En el ejemplo observamos que la tabla tiene un diseño de siete campos y que almacena cuatro registros. El nombre de cada campo viene dado por la fila de encabezado. El dato que contiene el campo ID_EMPLEADO identifica cada registro, pero por ahora no le demos importancia a esto. Los registros o miembros de una tabla tienen en común sus atributos, no el dato en sí, que lo más probable es que difiera de un registro a otro, pero sí el hecho de que todos ellos poseen esos atributos. En el ejemplo los miembros de la tabla EMPLEADOS tiene en común que todos ellos son personas empleadas en una empresa, que tienen un nombre y un salario, una fecha de nacimiento, etc... Por lo tanto las tablas de una BD guardan información de individuos o unidades de una misma naturaleza con una serie de atributos en común. CREACION DE TABLAS. Las tablas son la estructura básica donde se almacena la información en la base de datos. Las tablas se dividen en filas y columnas. Cada fila representa una parte de los datos, y cada columna puede pensarse como la representación de un componente de aquella parte de los datos. Entonces, por ejemplo, si tenemos una tabla para registrar la información del cliente, las columnas pueden incluir información tal como Primer Nombre, Apellido, Dirección, Ciudad, País, Fecha de Nacimiento y demás. Como resultado, cuando especificamos una tabla, incluimos los títulos de columna y los tipos de datos para esta columna en particular. Entonces ¿Qué son los tipos de datos? Generalmente, los datos se generan en formas variadas. Podría ser un entero (tal como 1), un número real (tal como 0,55), una línea (tal como 'sql'), una fecha/expresión de tiempo (tal como '25ene-2000 03:22:22'), o incluso en formato binario. Cuando especificamos una tabla, necesitamos especificar el tipo de dato asociado con cada columna (es decir, especificaremos que „First_Name‟ es de char(50) tipo – lo que significa que es una línea con 50 caracteres). La sintaxis SQL para CREATE TABLE es CREATE TABLE "nombre_tabla" ("columna 1" "tipo_de_datos_para_columna_1", "columna 2" "tipo_de_datos_para_columna_2", ... ); Entonces, si debemos crear una tabla para el cliente tal como se especifica anteriormente, ingresaríamos CREATE TABLE Customer (First_Name char(50), Last_Name char(50), Address char(50), City char(50), Country char(25), Birth_Date datetime); A veces, deseamos brindar un valor predeterminado a cada columna. Se utiliza un valor predeterminado cuando no especifica un valor de columna cuando ingresa datos a la tabla. Para establecer un valor predeterminado, agregue “[valor] Predeterminado” luego de la instrucción de tipo de datos. En el ejemplo anterior, si deseamos predeterminar una columna “Address” como “Desconocida” y Ciudad como “Barcelona”, ingresaríamos CREATE TABLE Customer (First_Name char(50), Last_Name char(50), Address char(50) default 'Unknown', City char(50) default 'Barcelona', Country char(25), Birth_Date datetime); Puede colocar restricciones para limitar el tipo de dato que puede ingresarse en una tabla. Dichas restricciones pueden especificarse cuando la tabla se crea por primera vez a través de la instrucción CREATE TABLE, o luego de crear la tabla a través de la instrucción ALTER TABLE. Los tipos comunes de restricciones incluyen las siguientes: - NOT NULL - UNIQUE - CHECK - Clave primaria - Clave externa Cada uno se describe en detalle a continuación. NOT NULL En forma predeterminada, una columna puede ser NULL. Si no desea permitir un valor NULL en una columna, querrá colocar una restricción en esta columna especificando que NULL no es ahora un valor permitido. Por ejemplo, en la siguiente instrucción, CREATE TABLE Customer (SID integer NOT NULL, Last_Name varchar (30) NOT NULL, First_Name varchar(30)); Las columnas “SID” y “Last_Name” no incluyen NULL, mientras que “First_Name” puede incluir NULL. UNIQUE La restricción UNIQUE asegura que todos los valores en una columna sean distintos. Por ejemplo, en la siguiente instrucción, CREATE TABLE Customer (SID integer Unique, Last_Name varchar (30), First_Name varchar(30)); La columna “SID” no puede incluir valores duplicados, mientras dicha restricción no se aplica para columnas “Last_Name” y “First_Name”. Por favor note que una columna que se especifica como clave primaria también puede ser única. Al mismo tiempo, una columna que es única puede o no ser clave primaria. CHECK La restricción CHECK asegura que todos los valores en una columna cumplan ciertas condiciones. Por ejemplo, en la siguiente instrucción, CREATE TABLE Customer (SID integer CHECK (SID > 0), Last_Name varchar (30), First_Name varchar(30)); La columna “SID” sólo debe incluir enteros mayores a 0. CLAVE PRIMARIA: La clave primaria se utiliza para identificar en forma única cada línea en la tabla. Puede ser parte de un registro real, o puede ser un campo artificial (uno que no tiene nada que ver con el registro real). Una clave primaria puede consistir en uno o más campos en una tabla. Cuando se utilizan múltiples campos como clave primaria, se los denomina claves compuestas. Las claves primarias pueden especificarse cuando se crea la tabla (utilizando CREATE TABLE) o cambiando la estructura existente de la tabla (utilizando ALTER TABLE). A continuación se presentan ejemplos para la especificación de una clave primaria cuando se crea una tabla: MySQL: CREATE TABLE Customer (SID integer, Last_Name varchar(30), First_Name varchar(30), PRIMARY KEY (SID)); First_Name varchar(30)); A continuación se presenta un ejemplo para la especificación de una clave primaria al modificar una tabla: MySQL: ALTER TABLE Customer ADD PRIMARY KEY (SID); CLAVE EXTERNA: Una clave externa es un campo (o campos) que señala la clave primaria de otra tabla. El propósito de la clave externa es asegurar la integridad referencial de los datos. En otras palabras, sólo se permiten los valores que se esperan que aparezcan en la base de datos. Por ejemplo, digamos que tenemos dos tablas, una tabla CUSTOMER que incluye todos los datos del CUSTOMER, y la tabla ORDERS que incluye los pedidos del CUSTOMER. La restricción aquí es que todos los pedidos deben asociarse con un CUSTOMER que ya se encuentra en la tabla CUSTOMER. En este caso, colocaremos una clave externa en la tabla ORDERS y la relacionaremos con la clave primaria de la tabla CUSTOMER. De esta forma, nos aseguramos que todos los pedidos en la tabla ORDERS estén relacionadas con un CUSTOMER en la tabla CUSTOMER. En otras palabras, la tabla ORDERS no puede contener información de un CUSTOMER que no se encuentre en la tabla CUSTOMER. La estructura de estas dos tablas será la siguiente: Tabla CUSTOMER Nombre de Columna Característica SID Clave Primaria Last_Name First_Name Tabla ORDERS Nombre de Columna Característica Order_ID Clave Primaria Order_Date Customer_SID Clave Externa Amount En el ejemplo anterior, la columna Customer_SID en la tabla ORDERS es una clave externa señalando la columna SID en la tabla CUSTOMER. A continuación se muestran ejemplos de cómo especificar la clave externa a la hora de crear la tabla ORDERS: MySQL: CREATE TABLE ORDERS (Order_ID integer, Order_Date date, Customer_SID integer, Amount double, PRIMARY KEY (Order_ID), FOREIGN KEY (Customer_SID) REFERENCES CUSTOMER (SID)); A continuación se presentan ejemplos para la especificación de una clave externa al modificar una tabla: Esto asume que se ha creado la tabla ORDERS, y que la clave externa todavía no se ha ingresado: MySQL: ALTER TABLE ORDERS ADD FOREIGN KEY (Customer_SID) REFERENCES CUSTOMER (SID);