• La mayor parte de bases de datos que se usan son relacionales. • Pueden contener un conjunto de tablas relacionadas entre sí. • Las tablas están definidas por campos y conformada por una lista de tuplas. • Los campos forman las columnas de las tablas. • Definen el tipo y variedad de sus datos. • Las filas de datos se denominan tuplas o registros. • Una tabla puede estar vacía o contener un número variable de las mismas. • Por ejemplo se puede tener una tabla Clientes que definen datos básicos de una persona, o una tabla llamada Productos define los datos necesarios de cada producto disponible. Bases de Datos Relacionales • Cada tabla de una base de datos puede tener un número de tuplas diferente al de las demás tablas. • A cada valor de un campo definido en una tupla, se lo denomina atributo. • Las tablas pueden “relacionarse” entre sí utilizando campos clave comunes entre las tablas. • En el siguiente ejemplo, el campo DNI de la tabla Clientes y el campo DNI de la tabla Pedidos permiten determinar el Nombre, Apellido, Edad de las personas que han realizado pedidos. Bases de Datos Relacionales
Ejemplo de conformación de una base de datos
Bases de Datos Relacionales • Además de los atributos, existe información importante, que son los metadatos. • Se encuentran recopilados en un conjunto de tablas del sistema, denominado catálogo. • Los catálogos almacenan información acerca de las bases de datos, las tablas y la composición de dichas tablas. • Utilizando un programa DBMS (Data Base Management System) se puede manipular las tablas de datos (consultar, modificar, insertar, y borrar). • Algunas manipulaciones se pueden realizar usando JAVA aunque existe un lenguaje estándar para manipulación de tablas, el lenguaje SQL. Structured Query Language (SQL) • Es un lenguaje de manipulación de bases de datos relacionales. • Es legible y potente, y recomendado cuando se desarrollan aplicaciones JAVA que emplean Bases de Datos. • Se dividen en dos grupos: • Data Definition Language (DDL) • Data Manipulation Language (DML). • Para crear tablas en la base de datos se utiliza la sentencia CREATE. • Esta instrucción pertenece al tipo DDL. • Se pueden crear tablas de manera estática con software de gestión como Oracle, SQL, Access, etc. • Otras veces se necesita utilizar tablas dinámicas como por ejemplo en un foro cuando se necesita incluir un nuevo tema de discusión. SQL - Create • La sentencia CREATE que genera la tabla Cliente presenta el siguiente aspecto: CREATE TABLE Clients( DNI CHAR (10) NOT NULL PRIMARY KEY, Nombre CHAR (10) NOT NULL, Apellido CHAR (25) NOT NULL, Edad INT NOT NULL); • Se define el campo DNI como clave primaria. • Provoca la creación de un índice y nos asegura que no podrán existir dos atributos iguales. • Por ser NOT NULL, no se permite la inserción de un atributo vacío. • El resto de campos, de tipo alfanumérico y entero, también ha sido defino como NOT NULL. • Una vez definidas las tablas, se pueden insertar, borrar, modificar y seleccionar los atributos que irán conformando el contenido de cada tabla. Trabajando con una sola tabla • Para añadir una tupla en la tabla Clientes, utilizamos la sentencia INSERT: INSERT INTO Clientes (DNI, Nombre, Apellido, Edad) INSERT INTO Clientes VALUES (‘5084’, ‘Luis’, ‘Rodriguez’, 47) • Por lo que se están añadiendo todos los campos, podemos prescindir su enumeración. • En general, tenemos la posibilidad de incluir únicamente un subconjunto de atributos de la tupla. • En este caso no es permitido dejar campos sin definir, es decir, con valor NULL. INSERT INTO Clientes (DNI,Apellido) VALUES (‘5084’,’Rodriguez’) Ejercicio • Crear la tabla Clientes con los siguientes valores: DNI Nombre Apellido Edad 5084 Luis Rodriguez 47 2300 Jorge López 20 5024 Jesus Cando 35 5055 Elena Sarmiento 19 4302 Jhon Toapanta 60 5014 Arnold Suasnavas 15 3400 Patricio Estrella 25 5020 Jhony Torroja 33 5019 Juan Rojas 30 5060 Ismael Benitez 50 4030 Jorge Tapia 13 5043 Belardo Brito 18 5048 Elba Racines 52 5050 Roberto Espín 17 Trabajando con una sola tabla • La sentencia SQL que se utiliza de manera habitual es SELECT. • En la siguiente sentencia se selecciona todos los atributos correspondientes a los campos Nombre y Apellido en todas las tuplas de la tabla Clientes. SELECT Nombre, Apellido FROM Clientes • Análogamente, para seleccionar únicamente las edades: SELECT Edad FROM Clientes • Si deseamos seleccionar todos los campos, podemos incluir de manera explícita cada uno de ellos, o bien hacer uso del carácter ‘*’, que significa “todos los campos de la tabla”. SELECT DNI, Nombre, Apellido, Edad FROM Clientes SELECT * FROM Clientes Trabajando con una sola tabla • Para restringir las tuplas que nos devuelve una sentencia SELECT, debemos emplear la palabra WHERE. • La siguiente sentencia nos proporciona los número de DNI de los clientes menores de 30 años: SELECT DNI FROM Clientes WHERE Edad<30 • Para obtener el apellido de los clients menores de edad que se llaman ‘Jorge’ podemos escribir la sentencia: SELECT Apellido FROM Clientes WHERE Edad<18 AND Nombre = ‘Jorge’ • SQL permite incluir en sus condiciones los operadores <, <=, >, >=, <>, AND, OR, NOT, IS NULL, IS NOT NULL, LIKE, BETWEEN AND, IN, ALL, ANY, EXISTS, etc. Trabajando con una sola tabla • La palabra LIKE funciona en combinación con el caraceter ‘%’, que hace de “comodín”. • Por ejemplo, la siguiente sentencia selecciona todos los atributos de la tabla Clientes en los que el campo Nombre comienza con la letra ‘J’. SELECT * FROM Clientes WHERE Nombre LIKE ‘J%’ • Si deseamos seleccionar todos los campos pertenecientes a las tuplas cuyos atributos DNI se encuentran entre el 2000 y el 5000: SELECT * FROM Clientes WHERE DNI BETWEEN 2000 AND 5000 • El operador IN nos permite trabajar con un conjunto de valores. Por ejemplo, podemos seleccionar los apellidos de los clientes que se llamen, Jorge ,Jesús o Elena: SELECT Apellido FROM Clientes WHERE Nombre = ‘Jorge’ OR Nombre = ‘JESUS’ OR Nombre = ‘Elena’ Trabajando con una sola tabla • También SELECT Apellido FROM Clientes WHERE Nombre IN (‘Jorge’, ’Jesús’, ’Elena’) • Para borrar tuplas utilizamos la sentencia DELETE, estableciendo las condiciones que deseemos: DELETE FROM Clientes WHERE Nombre = ‘Jorge’ AND Apellido = ‘Lopez’ DELETE FROM Clientes WHERE Edad >= 65 DELETE FROM Clientes WHERE Nombre NOT IN (‘Jorge’) • La modificación de datos se hace a través de la sentencia UPDATE, indicando con SET las modificaciones deseadas: UPDATE Clientes SET Edad = 15 WHERE DNI = ‘5050’ UPDATE Clientes SET Nombre = ‘Ana’ WHERE Nombre = ‘Elena’ Trabajando con varias tablas • Con SQL podemos realizar consultas sobre varias tablas a la vez, para unificar el contenido esto nos permite no repetir datos en varias tablas. • A veces no es necesario insertar información detallada sobre las tuplas. • Un código puede proveer suficiente información sobre algún elemento de las tuplas. • De este modo se puede encontrar el resto de los datos buscando en la tabla de clientes el código correspondiente al pedido. Trabajando con varias tablas • Trabajar con varias tablas puede ser un problema. • Cómo diferenciar atributos con el mismo nombre en las distintas tablas? • La solución es utilizar el nombre de la tabla antes de referenciar el campo • Por ejemplo, existe una tabla Clientes y una tabla Pedidos y coinciden en el campo DNI: utilizaremos Clientes.Codigo para referirnos ala tabla Clientes y Pedidos.Codigo para hacerlo de Pedidos. • Se necesitan definir nuevas tablas. • Una tabla de Clientes, que contendrá los campos Código, Nombre y Dirección. • Una tabla Productos contendrá datos de productos que existen en una tienda, tendrá los campos Referencia, Nombre, Precio y Concepto. • Una tabla Pedidos que contendrá los pedidos de cada producto realizados por clientes, tendrá los campos Código, Referencia y Cantidad. Trabajando con varias tablas • Crear las tablas Clientes, Producto y Pedidos. Trabajando con varias tablas • Producto Trabajando con varias tablas • Pedido Trabajando con varias tablas • Un ejemplo sencillo consiste en seleccionar a partir de la tabla de pedidos una lista con las direcciones a las que hay enviar cada pedido y el nombre del destinatario. • Se utiliza en campo código las tablas de pedidos y clientes. • Cuando se lea un registro de la tabla de pedidos, se busca los Clientes del registro cuyo campo Código coincida con el de Pedidos. • Con la siguiente sentencia buscamos los registros que coincidan por el campo Código: SELECT Nombre, Dirección, Referencia, Cantidad FROM Clientes, Pedidos WHERE Clientes.Código = Pedidos.Código. Trabajando con varias tablas • Seleccionamos los campos Nombre, Dirección, Referencia y Cantidad de las tablas Clientes y Pedidos, donde el campo Código del registro de clientes sea igual al campo Código del registro de Pedidos. • Se debe notar la manera en que se diferencia el campo Código de Clientes y Pedidos. • No es necesario utilizarlo cuando hacemos referencia a los campos Dirección, Nombre o Cantidad, ya que esos campos no se repiten en las dos tablas. • La selección se ha realizado sobre dos tablas, pero SQL nos permite utilizar más tablas con los operadores booleanos. • Así se podrán seleccionar sobre varias tablas utilizando distintas condiciones para unirlas entre ellas de dos en dos. Trabajando con varias tablas • Por ejemplo: • Si además de los datos se quiere mostrar el producto que se pide, se debe utilizar la tercera tabla de productos. • Buscaremos tres registros en los que coincidan un lado el campo código de las tablas Pedidos y Clientes. Y otro campo Referencia de las tablas Pedidos y Productos. • La tabla Pedidos servirá de enlace entre las tablas Productos y Clientes que no tienen ningún campo en común. • En el siguiente ejemplo se verá el resultado de esta selección, pero se sustituye el campo Referencia por el del nombre del producto. Trabajando con varias tablas • Con la siguiente sentencia realizaremos el ejemplo anterior: SELECT Clientes.Nombre, Dirección, Productos.Nombre, Cantidad FROM Clientes, Productos, Pedidos WHERE Clientes.Código = Pedidos.Código AND Pedidos.Referencia = Productos.Referencia. • En este caso si se debe utilizar el nombre de la tabla en el campo Nombre, ya que lo tienen tanto la tabla Clientes como Productos, y no hacen referencia a la misma cosa. • Se utiliza el operador booleano para que se cumplan las dos condiciones, uniendo de este modo las tres tablas. • Seleccionamos tres registros, uno de cada tabla. Trabajando con varias tablas • Los registros de las tablas Clientes y Pedidos coinciden en el campo Código, y los de las tablas Pedidos y Productos coinciden en el campo Referencia. • En el siguiente ejemplo se seleccionará los clientes que no hayan comprado algo • En este ejemplo no se mostrarán repeticiones de los seleccionados como en el ejemplo anterior. • Cada cliente que haya realizado una compra sólo aparecerá una vez. • Se utiliza la cláusula DISTINC que hace que todos los registros seleccionados sean distintos. Trabajando con varias tablas • Si aparecen dos clientes con dos pedidos, solo se mostrará una vez ya que los campos seleccionados (Nombre y Dirección), coinciden en los dos pedidos. SELECT DISTINCT Nombre, Dirección FROM Clientes, Pedidos WHERE Clientes.Código = Pedidos.Código • Esta sentencia busca las coincidencias de las tablas Pedidos y Clientes por el campo código. • Cuando encuentre varias veces el mismo cliente lo mostrará sólo una vez. • Hay que tener en cuenta que todos los campos seleccionados deben ser iguales para todos los registros que se unan. Trabajando con varias tablas • Si se tienen dos registros de nombres de cliente iguales pero direcciones diferentes, se mostrarán los dos registros. • Se debe tener cuidado con los campos que se seleccionen para que aparezcan los registros que se deseen. • Si se quiere hacer más restrictiva la selección y buscar solamente los clientes que han comprado un producto, se añade una nueva condición a la sentencia: SELECT DISTINCT Nombre, Dirección FROM Clientes, Pedidos WHERE Clientes.Código = Pedidos.Código AND Referencia = 5 • Se puede añadir todas las condiciones deseadas a través de los operadores booleanos AND y OR. Trabajando con varias tablas • Las condiciones podrán hacer referencia a cualquiera de las tablas o, mezclar campos de tablas. • Otra forma de seleccionar los clientes que han comprado cierto producto es usar el operador EXISTS: SELECT Nombre, Dirección FROM Clientes WHERE EXIST (SELECT Código FROM Pedidos WHERE Clientes.Código-Pedidos.Código AND Referencia=2) • El operador EXISTS nos devolverá los registros que se encuentren dentro de la primera selección. • Lo siguiente que se hará es seleccionar los clientes que todavía no han comprado. Trabajando con varias tablas • Se buscará elementos de una tabla que no se encuentran en otra. • Para esto se utiliza el operador IN y más concretamente NOT IN. • Se busca los clientes cuyo código no se encuentre en la tabla de Pedidos. • Se necesita saber qué código de cliente contiene la tabla de pedidos. • Esto se consigue con la sentencia: SELECT Código FROM Pedidos • Una vez que se han conseguido los códigos, debemos comparar los registros de la tabla de Clientes, viendo en cada momento si el código de cada registro está o no en la selección previa que se ha realizado. SELECT Nombre, Dirección FROM Clientes WHERE Código NOT IN (Lista_de_códigos) Trabajando con varias tablas • Unido con lo anterior se tendrá la siguiente sentencia SQ: SELECT Nombre, Dirección FROM Clientes WHERE Código NOT IN (SELECT Códigos FROM Pedidos). • En la selección que se hace sobre la tabla Pedidos sólo se emplea el campo Código, ya que es el que queremos comparar. • Se puede realiza la selección de los clientes que han comprado alguna vez, utilizando el operador IN de la siguiente forma: • SELECT Nombre, Dirección FROM Clientes WHERE Código IN (SELECT Código from Pedidos WHERE Referencia = 5); • Ahora utilizaremos los cuantificadores ALL y ANY para obtener el pedido con mayor número de unidades. Trabajando con varias tablas • Los operadores ALL y ANY Siempre van acompañados por un operador de comparación (<,>,=,<>,…) • Se utilizarán para seleccionar valores que sean mayor, menor, igual, etc. Que todos o alguno de los valores de una selección previa. • Se quiere seleccionar el pedido de mayor número de unidades, es decir, el que tenga el campo Cantidad mayor. • Se busca el registro cuyo campo Cantidad sea mayor que el de todos los pedidos. • Se utiliza el cuantificador ALL de la siguiente forma: SELECT Nombre, Dirección, Referencia, Cantidad FROM Clientes, Pedidos WHERE Cantidad >= ALL (SELECT Cantidad FROM Pedidos) AND Clientes.Código = Pedidos.Código. Trabajando con varias tablas • Se debe utilizar también la condición de que coincidan los códigos, ya que se están utilizando dos tablas. • Si no la utilizásemos, aparecerían todos los registros de la tabla de clientes con el valor del mayor pedido. • De la misma forma que se utiliza ALL, se puede usar ANY. • Este sirve para seleccionar valores que se encuentren en algún campo. • Otra forma de seleccionar los clientes que han comprado algo, sería lo siguiente: SELECT Nombre, Dirección FROM Clientes WHERE Código = ANY(SELECT Código FROM Pedidos) Trabajando con varias tablas • Para seleccionar clientes que no tienen ningún pedido utilizaríamos: SELECT Nombre, Dirección FROM Clientes WHERE Código <> ALL (SELECT Código FROM Pedidos) • Los operadores de comparación no sólo sirven para comparar campos numéricos, sino que se los puede utilizar para comparar cualquier campo. • Por ejemplo, se puede utilizar para saber cuál es el nombre menor, alfabéticamente hablando: SELECT Nombre FROM Clientes WHERE Nombre <= ALL (SELECT Nombre FROM Cliente)