Sei sulla pagina 1di 31

Bases de Datos

Bases de Datos Relacionales


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

Potrebbero piacerti anche