10.DML 2
10.DML 2
Introducción
Anteriormente se estudió la estructura básica de la sentencia SELECT del SQL. Esta
es la sentencia nativa del SQL para recuperar datos de una base de datos relacional,
siendo una sentencia muy poderosa y compleja, que depende su efectividad de una
correcta definición de las tablas de la Base de Datos.
En esta ocasión se profundizará en el OUTER JOIN, en las cláusulas Group By, Having
y las funciones de agrupamiento de la sentencia SELECT.
Hasta este momento se ha visto cómo obtener la información almacenada en una base
de datos, pero para lograr esto hay que realizar antes operaciones de inserción en las
tablas de la base de datos.
Una vez que se tiene definida la estructura de una tabla se pueden insertar datos,
modificarlos o borrarlos de la tabla.
Esta tarea entra dentro de las operaciones que se realizan con el lenguaje DML. Este
lenguaje permite manipular los objetos de la base de datos, insertando, modificando y/o
borrando el contenido de las tablas.
Desarrollo
Para unir información que se encuentra distribuida por varias tablas se utiliza el
operador inner join, que devuelve la unión de las filas que comparten un atributo o
atributos en cada una de las tablas. Esta no es la única variante de este operador,
pues en ocasiones se necesita obtener incluso las tuplas que no se relacionan con
ninguna en otra tabla. A continuación se muestran otras variantes para este operador.
OUTER JOIN
Tiene 3 variantes: LEFT, RIGHT y FULL con el siguiente significado:
LEFT: Incluye todas las filas de la tabla de la izquierda (la que aparece a la izquierda
de la palabra LEFT) y las que casan de la derecha. Aplicando esta combinación al
ejemplo anterior la instrucción quedaría:
SELECT Provincia.nombre, Municipio. nombre, Cliente.telefono
FROM Municipio INNER JOIN Provincia
ON Municipio.codigo_provincia = Provincia.codigo_provincia
LEFT OUTER JOIN Cliente
ON Municipio. codigo_provincia = Cliente. codigo_provincia
AND Municipio.codigo_municipio = Cliente. codigo_municipio
Y en el resultado estarían todos los municipios de las provincias y los teléfonos que
poseen. En el caso de los que no tienen teléfonos, en la columna “telefono” aparece un
NULL.
RIGHT: Incluye todas las filas de la tabla de la derecha, más las que se relacionan.
Rellena con NULL en los campos en que no hayan valores por tratarse de filas que no
se relacionan.
SELECT Cliente.telefono, Cliente.ci, Cliente.nombre, Cliente.direccion,
ServiciosSup.descripcion, ServiciosSup.importe
FROM ServiciosSup INNER JOIN Cliente_Servicio
ON ServiciosSup.codigo_servicio = Cliente_Servicio.codigo_servicio
RIGHT OUTER JOIN Cliente
ON Cliente_Servicio.telefono = Cliente.telefono.
CROSS JOIN
Devuelve todas las filas de la tabla izquierda y cada fila de la tabla izquierda se
combina con todas las filas de la tabla de la derecha. O sea, muestra la combinación de
todas las filas de una tabla con la otra. Una combinación cruzada que no tenga una
cláusula WHERE produce el producto cartesiano de las tablas involucradas en la
combinación. No requiere de una columna común.
Sintaxis:
SELECT {column_name} [,..n]
FROM {table_or_view_name}
[ [ INNER | {{LEFT | RIGHT | FULL} [OUTER] }] JOIN
table_or_view_name ON search_conditions] ] [...n]
Sobre valores nulos: Es importante destacar que en el caso de existir valor nulo para
algún atributo, al tratar de operarlo aritméticamente con un valor el resultado será NULL
y al tratar de comparar un valor nulo con otro valor el resultado será UNKNOWN.
Ejemplos:
A = NULL
A+3 -> NULL
A < 5 -> UNKNOWN
Para saber si un valor es nulo o no sólo se puede lograr con el operador IS. Por
ejemplo: A IS NULL o A IS NOT NULL.
Funciones de Agregación
Es posible utilizar funciones que en general operan sobre los valores de una columna.
Estas son:
AVG………..realiza una media de una columna de datos numéricos.
COUNT…....cuenta el número de elementos seleccionados en una columna.
COUNT(*)….cuenta el número de filas en el resultado de la consulta.
MIN…………determina el menor valor de una columna.
MAX………..determina el mayor valor de una columna.
SUM………..proporciona el total de la suma de una columna de datos
numéricos.
Ejemplos:
Sólo mostrará las cantidades de teléfonos de aquellas provincias que tengan más de
1000 teléfonos. En un SELECT pueden combinarse cláusulas WHERE y HAVING
como hemos estado viendo en el ejemplo con que estamos trabajando. En tal caso,
primero se aplica el predicado del WHERE a todas las tuplas y sólo estas serán
agrupadas según el Group By para luego aplicar el predicado del Having.
Comparaciones: (<,>,<=,>=,=).
Ej: SELECT Cliente_Servicio.telefono, ServiciosSup.importe
FROM Cliente_Servicio, ServiciosSup
WHERE (Cliente_Servicio.codigo_servicio = ServiciosSup. codigo_servicio)
AND ServiciosSup.importe > (SELECT Importe
FROM ServiciosSup
WHERE codigo_servicio = 2)
Mostrar los teléfonos de todos los clientes que posean servicios con un importe mayor
que el importe correspondiente al servicio con código igual a 2.
IN: Compara un único valor de datos con una columna de valores producida por una
subconsulta y devuelve un resultado Verdadero si el valor coincide con uno de los
valores de la columna.
El ejemplo demostrativo del uso de consultas con múltiples tablas se puede expresar
también de la siguiente manera:
SELECT telefono
FROM CLIENTE
WHERE telefono IN (SELECT telefono FROM CLIENTE_SERVICIO)
Lo que significa que una misma consulta puede ser expresada de diferentes formas.
Esta consulta encuentra los nombres de los servicios, cuyo importe es mayor que los
importes de todos los servicios que empiecen con C.
Inserción
INSERT añade una tupla completa a una relación. Incluye el nombre de la Relación y la
lista de los atributos en igual orden al especificado en la sentencia CREATE TABLE de
la relación. Si se desea poner los valores de los atributos en cualquier orden o no
insertar todos los atributos, hay que especificar los nombres de los mismos en el orden
deseado. Aquellos atributos que no se especifican en la orden INSERT tomarán el valor
por defecto que se especificó en la creación de la tabla, si lo tiene, o valor NULL si es
posible.
INSERT INTO R VALUES(constante[,constante…]). Inserta tuplas con los valores
organizados en correspondencia con el orden en que aparecen los atributos en la tabla.
La lista de atributos se puede truncar en un valor, lo que significa que los valores
subsiguientes van a tomar valores por defecto o valor null.
INSERT INTO R (atr[,atr…]) VALUES(constante[,constante…]). Inserta tuplas con
los valores en un orden que puede ser distinto al de los atributos de la tabla. La
correspondencia entre los valores los atributos de la tabla se expresa en la lista de
atributos de la sentencia INSERT.
Se pueden insertar varias tuplas en una misma orden INSERT encerrando cada una de
ellas entre paréntesis y separándolas por comas.
Se puede insertar también múltiples tuplas que sean el resultado de una consulta:
INSERT INTO R [(atr[,atr…])] SELECT … FROM ... WHERE …
Ejemplos:
INSERT INTO PAIS (codigo_pais, nombre, codigo_tele_selecion, codigo_region)
Values (5,‟Jamaica‟, 180, 1)
Inserta un nuevo país Jamaica, que posee como código de tele-selección el 180 y su
región es la 1 (supongamos que ese es el código de la región: América Latina y el
Caribe)
INSERT INTO CLIENTE_SERVICIO (telefono, codigo_servicio) SELECT telefono, 7 AS
codigo_servicio FROM CLIENTE WHERE codigo_provincia =3
Inserta en la tabla CLIENTE_SERVICIOS todos los teléfonos de los clientes que viven
en la tercera provincia (supongamos que es Ciudad de La Habana) añadiéndoles un
nuevo servicio, que tiene código 7.
Actualización:
Cambiar los valores de las tuplas deseadas.
– Modifica valores de atributos en una o más tuplas de una relación
– Se modifican tuplas de una sola tabla a la vez UPDATE R SET Atr=Exp[,Atr=exp..]
Where P
– R es la relación. – Cláusula SET especifica atributos que modificar (Atr) y nuevos
valores (Exp)
– Cláusula WHERE para seleccionar tuplas que actualizar mediante un predicado
(P)
Si no hay WHERE, se aplica la modificación a todas las tuplas.
Si se cambia el valor de una llave primaria de la tabla que se modifica el nuevo valor se
propagará a todas las tablas donde este valor aparezca como llave foránea.
Ejemplos:
a) Update SERVICIOS Set Importe = Importe+10 Where Importe <=100
En la tabla SERVICIOS a todos los servicios cuyo importe sea inferior a 100 se
le incrementara en 10 ese valor.
Conclusiones
Hasta aquí se abordaron cada una de las sentencias que incluye el DML para la
manipulación de la información. Cada una de ellas tiene su sintaxis específica y
propiedades, y puede incluir otros elementos importantes que aporta el lenguaje SQL.
Mediante las sentencias Insert, Delete y Update se puede insertar, eliminar y actualizar
información en una BD. La sentencia Select es la más poderosa y permite la
recuperación de la información con las propiedades que un usuario requiera.
Para la utilización de estos comandos es importante crear habilidades prácticas que se
adquieren mediante la resolución de ejercicios, utilizando las herramientas hasta ahora
estudiadas y otras en las que puede profundizar si lo desea.