0% encontró este documento útil (0 votos)
66 vistas12 páginas

10.DML 2

Este documento describe el lenguaje de manipulación de datos (DML) de SQL. Explica cómo se pueden insertar, modificar y eliminar datos de las tablas de una base de datos usando sentencias DML como INSERT, UPDATE y DELETE. También describe operadores como JOIN para unir tablas, y cláusulas como GROUP BY, HAVING y funciones de agregación para agrupar y resumir datos. Finalmente, introduce el concepto de subconsultas para anidar consultas SQL.

Cargado por

Yoandy Perez
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
66 vistas12 páginas

10.DML 2

Este documento describe el lenguaje de manipulación de datos (DML) de SQL. Explica cómo se pueden insertar, modificar y eliminar datos de las tablas de una base de datos usando sentencias DML como INSERT, UPDATE y DELETE. También describe operadores como JOIN para unir tablas, y cláusulas como GROUP BY, HAVING y funciones de agregación para agrupar y resumir datos. Finalmente, introduce el concepto de subconsultas para anidar consultas SQL.

Cargado por

Yoandy Perez
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 12

LENGUAJE DE MANIPULACIÓN DE DATOS (DML) DEL SQL.

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.

En el resultado estarán todos los clientes existentes en la BD y los servicios que


tengan, si algún cliente no tiene ningún servicio se pondrá NULL en los campos
Descripción e Importe.
FULL: Incluye todas las filas de las 2 tablas, se relacionen o no. Rellena con NULL en
los campos en que no hayan valores por tratarse de filas que no se relacionan.

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

SELECT [DISTINCT] (6) elementos (5)


FROM tables (1)
[WHERE condición] (2)
[GROUP BY campos] (3)
[HAVING condición] (4)
[ORDER BY campos] (7)

Los elementos a seleccionar en una sentencia SELECT pueden contener constantes,


expresiones y atributos. Si se usa en combinación con GROUP BY se pueden poner
además funciones agregadas de columnas (AVG([DISTINCT] columna),
SUM([DISTINCT] columna), MIN(columna), MAX(columna), COUNT( * | [DISTINCT]
columna)) que producen un único valor, columnas de agrupación del GROUP BY, o
expresiones con las anteriores (No considera llaves primarias ni foráneas).
El HAVING se aplica una vez que se hayan formado los grupos. Siempre incluye
funciones de columna, de lo contrario se trataría igual que el WHERE, pero el WHERE
se aplica antes.

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.

Las funciones de agregado sólo se aceptan como expresiones en:


• La lista de selección de una instrucción SELECT (en una subconsulta o en la
consulta externa)
• Cláusulas HAVING

Ejemplos:

a) SELECT COUNT(*) FROM CLIENTE


Devuelve cantidad de clientes

b) SELECT COUNT(DISTINCT telefono) FROM CLIENTE_SERVICIO


Cantidad de clientes que tienen servicios

c) SELECT SUM (Importe) FROM SERVICIOS


Suma de los importes de todos los servicios.
Estas funciones son llamadas “de agregación” pues pueden operar sobre grupos de
tuplas. Para ello se combinan con la cláusula GROUP BY. En esta cláusula se
especifica un atributo (o varios atributos) y el efecto es como si se formaran “grupos” en
la tabla, donde en cada grupo formado estarán las tuplas con igual valor en el
atributo(s) especificado(s) en el GROUP BY.
Al usar la cláusula GROUP BY debe tener presente:
• Las columnas especificadas en la lista de selección del SELECT deben estar
incluidas en la cláusula GROUP BY.
• Las columnas incluidas en GROUP BY no necesitan ser especificadas en la lista
del SELECT.
• En la lista de selección pueden aparecer expresiones que devuelvan un solo
valor por cada valor de las columnas de agrupamiento. Por ejemplo, las
funciones agregadas que tienen un nombre de columna como uno de sus
parámetros.
• Si las columnas utilizadas en la cláusula GROUP BY contienen valores NULL,
ellos serán procesados como un grupo

Ej. SELECT PROVINCIA.nombre, COUNT(CLIENTE.telefono)


FROM CLIENTE, PROVINCIA
WHERE CLIENTE. codigo_provincia = PROVINCIA.codigo_provincia
GROUP BY PROVINCIA.nombre

De esta forma es posible calcular la cantidad de teléfonos por provincias. Cuando se va


a calcular una suma, o un promedio, es importante considerar los duplicados. En
muchas ocasiones eliminar un valor duplicado puede significar que el resultado que se
obtenga sea falso.
Por ej, si tuviéramos el siguiente resultado de una consulta:
Si quisiéramos calcular la suma de los importes aunque está duplicado el par de
valores (telefono, importe) (555-1111, 10), no es posible eliminarlo pues el valor que se
obtendría de la suma no sería 40 (el correcto) sino 30. En otras circunstancias podrá
ser conveniente eliminarlos, para lo que puede emplearse el DISTINCT que ya vimos.
También es posible usar funciones en una subconsulta. A veces es necesario declarar
una condición o predicado para que sea aplicado a los grupos y no a las tuplas. Para
ello se usa HAVING.
La cláusula HAVING puede usarse con la cláusula GROUP BY para restringir cuales
grupos de filas son retornados en el conjunto de resultados. La cláusula HAVING
establece las condiciones de la cláusula GROUP BY de la misma forma que WHERE
interactúa con SELECT. Pero mientras que las condiciones de búsqueda de WHERE
se aplican antes de que se produzca la operación de agrupamiento, las condiciones de
búsqueda de HAVING se aplican después.
La sintaxis de la cláusula HAVING es exactamente igual que la cláusula WHERE, salvo
que en HAVING puede contener funciones agregadas. Las cláusulas HAVING
pueden hacer referencia a cualquiera de los elementos que aparecen en la lista de
selección.
Ej: SELECT PROVINCIA.nombre, COUNT(CLIENTE.telefono)
FROM CLIENTE, PROVINCIA
WHERE CLIENTE.cliente_provincia = PROVINCIA.cliente_provincia
GROUP BY PROVINCIA.nombre
HAVING COUNT(CLIENTE.telefono)> 1000

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.

Consultas anidadas (subconsulta)

En SQL es posible anidar un SELECT dentro de otro (sin restricciones de profundidad


en el anidamiento, al menos en teoría)
Las subconsultas se pueden especificar en muchos sitios:
• Con alias
• Con IN o NOT IN
• En las instrucciones UPDATE, DELETE e INSERT
• Con los operadores de comparación
• Con ANY, ALL
• Con EXISTS o NOT EXISTS
• En lugar de una expresión
Observar que la subconsulta siempre está encerrada entre paréntesis, pero por otra
parte tiene un formato similar al de una sentencia SELECT, con las siguientes
particularidades:
1. Una subconsulta debe producir una única columna de datos como resultado.
Esto significa que una subconsulta siempre tiene un único elemento de selección
en su cláusula SELECT.
2. La cláusula ORDER BY no puede ser especificada en una subconsulta. Los
resultados de la subconsulta se utilizan internamente por parte de la consulta
principal y nunca son visibles al usuario, por lo que no tiene sentido ordenarlos.
3. Una subconsulta no puede ser la UNION de varias sentencias SELECT
diferentes; sólo se permite una única sentencia SELECT.
4. Los nombres que aparecen en una subconsulta pueden referirse a columnas de
tablas de la consulta principal. Esto se llama referencias externas.
Las operaciones que se pueden realizar entre atributos externos y subconsultas son los
siguientes:

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.

El operador IN permite comparación de conjuntos, al igual que SOME, ANY, ALL.


SOME, ANY……..Significa “Algún, cualquier”. Se utiliza conjuntamente con uno de los
seis operadores de comparación para comparar un único valor (el de la expresión) con
una columna de valores producidos por una subconsulta. Para efectuar el test el SQL
compara el valor de la expresión con los valores de la subconsulta, si alguna de las
comparaciones individuales es verdadera, entonces el test da verdadero.
ALL………Significa “Todos”. Similar al funcionamiento del ANY pero el test es
verdadero si se cumple para todas las comparaciones.

Ejs: SELECT nombre


FROM SERVICIOS
WHERE importe > ALL (SELECT importe
FROM SERVICIOS
WHERE nombre LIKE C%)

Esta consulta encuentra los nombres de los servicios, cuyo importe es mayor que los
importes de todos los servicios que empiecen con C.

Uso del cuantificador Existencial EXISTS.


SQL da la posibilidad de comprobar si una subconsulta tiene alguna tupla en su
resultado. EXISTS devuelve TRUE si la subconsulta del argumento no está vacía.
Ej. Encontrar los nombres de los clientes que reciben el servicio de código 1.
SELECT nombre
FROM CLIENTE
WHERE EXISTS (SELECT *
FROM CLIENTE_SERVICIO
WHERE (CLIENTE.telefono = CLIENTE_SERVICIO.telefono)
AND (codigo_servicio = 1))

Obsérvese la referencia externa.


EXISTS representa el cuantificador existencial y devolverá verdadero cuando el
resultado del SELECT anidado tenga alguna tupla. Puede combinarse con NOT como
NOT EXISTS.

Ordenamiento de la presentación del resultado.


Es posible que las tuplas obtenidas aparezcan en cierto orden. Esto se logra con la
cláusula ORDER BY listado de atributos al final de la consulta.
El orden implícito es ascendente pero puede especificarse según se quiera ASC o
DESC.
El ordenamiento puede ser sobre múltiples atributos, y puede usarse el número de
orden en las columnas de salida en lugar del nombre Ejemplo: ORDER BY 3.
Comandos para modificar tuplas en tablas de una BD:
Eliminación
DELETE FROM R WHERE P donde R es el nombre de la relación en la que queremos
borrar y P es un predicado que puede contener un grupo de operadores que
estudiaremos en profundidad cuando analicemos la sentencia SELECT.
DELETE elimina tuplas completas de una única relación. La cláusula WHERE es para
seleccionar las tuplas a eliminar, si no se especifica se eliminan todas las tuplas de la
tabla. Es importante destacar que no se altera la estructura de la tabla, lo que se
modifica es la información que esta contiene.
Ejemplos:
a) Delete From SERVICIO Where Importe < 100 -> Elimina los datos de aquellos
servicios cuyo importe es inferior a 100 pesos.
b) Delete From CLIENTE_SERVICIOS Where codigo_servicio Between 10 and
13 -> Elimina los datos de todos los clientes que tengan servicios con código 10,
11, 12 y 13.
c) Delete From SERVICIO -> Elimina los datos de todos los servicios.

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.

También podría gustarte