🎃 Grandes descuentos en libros en línea, eformaciones y vídeos*. Código CALABAZA30. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. SQL
  3. La manipulación de los datos (LMD)
Extrait - SQL Fundamentos del lenguaje (con ejercicios corregidos) - (4ª edición)
Extractos del libro
SQL Fundamentos del lenguaje (con ejercicios corregidos) - (4ª edición) Volver a la página de compra del libro

La manipulación de los datos (LMD)

Introducción

El lenguaje de manipulación de datos permite a los usuarios y a los desarrolladores acceder a los datos de la base, modificar su contenido, insertar o eliminar filas.

Se basa en cuatro comandos básicos que son SELECT, INSERT, DELETE y UPDATE. 

El administrador de la base de datos, que es el único que puede asignar o no los derechos, no siempre autoriza estos cuatro comandos.

Para un usuario x, se podrá indicar que solo puede utilizar el comando SELECT. Por razones evidentes de seguridad, no todos los usuarios tendrán acceso a los comandos de modificación.

La selección de datos

El comando SELECT permite realizar consultas simples de forma rápida sin conocimientos profundos sobre lenguajes de programación. Es la cláusula básica la que permite indicar al servidor que queremos extraer datos.

De todos modos, puede ser muy potente si se conocen todas las funciones y todas las posibilidades del lenguaje. Se pueden realizar consultas complejas, con numerosas tablas pero siempre hay que poner atención al rendimiento que puede disminuir rápidamente en un comando SQL mal construido o que no utilice los índices correctos en las tablas. Hay que vigilar y utilizar las herramientas de análisis de consultas (vea el capítulo Profundizando - Algunos conceptos de rendimiento) antes de ejecutar una consulta sobre una base de datos real con tablas importantes.

Los principales elementos de una consulta de selección

Cláusula

Expresión

SELECT

Lista de columna(s) y / o de los elementos de extracción

FROM

Tabla(s) fuente(s)

WHERE

Condición (condiciones) o restricción (restricciones), opcional

GROUP BY

Agrupación (agrupaciones), opcional

HAVING

Condición (condiciones) o restricción (restricciones) sobre la(s) agrupación (agrupaciones), opcional

ORDER BY

Ordenación (ordenaciones)

Las tablas de base que se utilizan en las siguientes secciones son:

images/2.png

Atención, los resultas completos de las consultas no siempre se presentan. A veces, solo se muestran las primeras líneas.

1. El comando de selección de datos SELECT

El SELECT es el comando más importante y el más utilizado en SQL. Con este comando podemos recuperar las filas de una o más tablas y transformar los datos para su utilización o incluso realizar cálculos.

Vamos a describir poco a poco las posibilidades de este comando en los siguientes párrafos.

La utilización más normal consiste en seleccionar filas de una tabla:

SELECT NumeroCamas, Descripcion FROM TiposHabitacion; 

En este ejemplo, hemos seleccionado dos columnas de la tabla TipoHabitacion.

El comando nos va a devolver todas las filas de la tabla para estas dos columnas.

NumeroCamas

Descripción

1

1 cama individual con ducha

2

2 camas individuales con ducha

2

2 camas individuales con ducha y WC separados

1

1 cama doble con ducha

1

1 cama doble con ducha y WC separados

1

1 cama doble...

La inserción de datos

Después de haber creado la estructura de las tablas y antes de poder seleccionar datos de la base, hay que insertar valores.

Hemos visto en el capítulo sobre el LDD, (véase. capítulo La definición de datos (LDD) - Crear una tabla a partir de una selección de datos) que es posible rellenar una tabla a partir de otra al crearla. Mediante CREATE TABLE, en la mayoría de los casos, la tabla se crea vacía y a continuación se insertan los datos. 

1. El comando INSERT

El comando INSERT permite insertar valores en una tabla.

El método más simple consiste en insertar de una vez en una fila todas las columnas de la tabla.

En este caso, basta con indicar al sistema todos los valores que se quieren insertar en el orden de las columnas de la tabla.

Ejemplo de inserción en la tabla Tarifas

INSERT INTO Tarifas 
VALUES 
(57, 1, 1, '2025-04-15', '2025-09-30', 58.49); 

En este caso, es imprescindible que los valores estén en el orden de las columnas. Es bastante arriesgado trabajar así, ya que si la tabla evoluciona en el tiempo con nuevas columnas, este orden no funcionará. El sistema indicará que faltan valores.

Es preferible indicar las columnas de este modo:

INSERT INTO Tarifas 
(idTarifa, Hotel, TipoHabitacion, FechaInicio, FechaFin, Precio) 
VALUES 
(58, 1, 2, '2025-04-15', '2025-09-30', 69.99); 

Para la sintaxis MySQL, basta con cambiar el TO_DATE(’10/04/1985’,’DD/MM/YYYY’) por STR_TO_DATE(’10/04/1985’,’%d/%m/%Y’).

Es posible insertar varias filas al mismo tiempo, separando las filas de valores por medio de comas, de la siguiente manera:

INSERT INTO Tarifas 
(idTarifa, Hotel, TipoHabitacion, FechaInicio, FechaFin, Precio) 
VALUES 
(59, 1, 3, '2025-04-15', '2025-09-30', 81.49), 
(60, 1, 4, '2025-04-15', '2025-09-30', 69.99), 
(61, 1, 5, '2025-04-15', '2025-09-30', 81.49); 

Como no hay opción de autoincremento sobre la columna idTarifa, es necesario indicar esta columna con un nombre diferente para cada fila, ya que se trata de la clave primaria.

La mayor parte de las columnas de la tabla no se habían declarado como NOT NULL, es posible no rellenar algunas columnas. No obstante, ponga atención a las posibles restricciones...

La eliminación de datos

La eliminación no es el comando más utilizado pero es importante conocer su sintaxis. Hay que poner mucha atención al utilizar el DELETE ya que frecuentemente se eliminan más filas de las previstas.

Para evitar esto, dos consejos: probar previamente con un SELECT la cláusula WHERE para verificar el número de filas afectadas, y utilizar con buen criterio los comandos COMMIT y ROLLBACK que detallaremos en el capítulo El control de transacciones (TCL).

1. El comando DELETE

El comando DELETE permitirá eliminar una o varias filas de una tabla.

La sintaxis del comando DELETE es simple si no limitamos las filas. Si no se indica la cláusula WHERE, se borrarán todas las filas de la tabla.

Si son tablas grandes, se desaconseja utilizar un DELETE sin WHERE, ya que existe riesgo de colapsar el sistema, que no podrá almacenar todas las filas borradas para poderlas restituir si se pide un ROLLBACK (ver capítulo Profundizando).

Una consulta DELETE puede no realizarse si no se cumple una restricción de integridad al eliminar una fila.

Ejemplo de eliminación de todas las filas de una tabla

DELETE FROM Habitaciones; 

Para eliminar solo algunas filas hay que añadir la cláusula WHERE.

Se pueden utilizar todas las posibilidades de la sintaxis utilizada para el SELECT. 

Por ejemplo, para eliminar las filas de la tabla Habitaciones insertadas anteriormente...

La modificación de datos

Hemos visto la inserción y la eliminación de datos; solo queda la modificación de una o más filas de una tabla con el comando UPDATE.

1. El comando UPDATE

Este comando es, sintácticamente, sencillo de implementar. Permite actualizar de 1 a n columnas de una tabla con el mismo comando.

Igual que el DELETE es posible añadir condiciones con la cláusula WHERE.

Ejemplo de modificación en la tabla Tarifas

UPDATE Tarifas SET Precio = 99; 

Si no se pone ninguna condición, todos los precios de la tabla Tarifas serán 99.

idTarifa

hotel

tipoHabitacion

FechaInicio

FechaFin

Precio

1

1

1

2024-10-01

2025-04-14

99

2

1

2

2024-10-01

2025-04-14

99

3

1

3

2024-10-01

2025-04-14

99

4

1

4

2024-10-01

2025-04-14

99

5

1

5

2024-10-01

2025-04-14

99

6

1

6

2024-10-01

2025-04-14

99

7

1

7

2024-10-01

2025-04-14

99

8

2

1

2024-12-15

2025-04-15

99

Antes de ejecutar un comando UPDATE es importante comprobar el número de filas afectadas por esta modificación. Se aconseja hacer un SELECT para visualizar las filas seleccionadas.

En Oracle, en caso de error, siempre es posible ejecutar un ROLLBACK justo después del UPDATE para restablecer los datos de origen.

Ejemplo de modificación de una sola fila en la tabla Tarifas

UPDATE Tarifas SET Precio = 68.99 
WHERE idTarifa = 3; 

Solo la fila con el número 3 se actualiza.

idTarifa

hotel

tipoHabitacion

FechaInicio

FechaFin

Precio

1

1

1

2024-10-01

2025-04-14

49,99

2

1

2

2024-10-01

2025-04-14

59,99

3

1

3

2024-10-01

2025-04-14

68,99

4

1

4

2024-10-01

2025-04-14

59,99

5

1

5

2024-10-01

2025-04-14

69,99

UPDATE Tarifas SET Precio = 58.99 
WHERE hotel = 1 AND Precio BETWEEN 50 AND 60; 

En este caso se actualizan dos filas: la 2 y 4. Observe que el sistema actualiza aunque el valor ya sea 58.99.

En el UPDATE se pueden utilizar todas las opciones del WHERE.

También...

Actuar sobre los datos a partir de otra tabla

1. La cláusula MERGE

Esta función permite insertar, modificar o eliminar registros en una tabla a partir de datos de otra tabla o vista.

Sintaxis

MERGE INTO <nombre tabla1> 
  USING <nombre tabla2> 
  ON <condiciones> 
  WHEN MATCHED THEN 
    UPDATE SET <tabla1.columna1> = valor1, <tabla1.columna2> =  
valor2, ... ... 
    DELETE WHERE <condiciones2> 
  WHEN NOT MATCHED THEN 
    INSERT <columna1>, <columna3>, ... ... 
    VALUES (valor1, valor3, ... ...) 
  • MERGE INTO: tabla a modificar.

  • USING: los datos fuente.

  • ON: condiciones.

  • WHEN MATCHED THEN: las modificaciones o eliminaciones realizadas cuando la condición o las condiciones se verifican.

  • WHEN NOT MATCHED THEN: los registros añadidos cuando la condición no se verifica.

Ejemplo

Deseamos aumentar el precio un 15 % en la tabla Tarifas cuando la columna Comentario de la habitación contiene un dato.

A continuación se muestra la consulta que selecciona las tarifas que se han de aumentar un 15 %. El join se realiza sobre las dos claves extranjeras de la tabla Tarifas para que no haya registros duplicados. Se muestra el idTarifa para estar seguros. La restricción permite seleccionar solo los comentarios cuyo valor es NULL o contiene un espacio.

SELECT idTarifa, Precio, Comentario FROM Tarifas 
INNER JOIN Hoteles ON Hoteles.idHotel = Tarifas.hotel 
INNER JOIN Habitaciones ON Hoteles.idHotel = Habitaciones.Hotel AND 
Habitaciones.TipoHabitacion = Tarifas.tipoHabitacion 
WHERE Comentario IS NOT NULL AND Comentario <> ''; 

Resultado

idTarifa

Precio

Comentario

1

49,99

Vistas agradables

5

69,99

Vistas agradables

11

68,99

Vistas al mar

12

80,49

Vistas al mar

16

68,99

Vistas al mar

18

68,99

Vistas al mar

29

57,49

Vistas agradables

33

80,49

Vistas agradables

46

59,99

Vistas al mar

47

69,99

Vistas al mar

51

59,99

Vistas al mar

53

59,99

Vistas al mar

57

58,49

Vistas agradables

61

81,49

Vistas agradables

Y una consulta para verificar algunas filas que no se van a modificar:

SELECT idTarifa, Precio FROM Tarifas ...

Soluciones de los ejercicios

1. Soluciones de los ejercicios sobre la selección de datos

a. Preguntas generales

1. ¿Cuáles son los cuatro tipos de unión descritos en este libro?

Interna, externa, natural y cruzada

2. ¿Cuáles son las funciones de agrupamiento que se pueden utilizar con un GROUP BY?

Las más utilizadas son COUNT, SUM, AVG, MIN, MAX. También existen VARIANCE y STDDEV y GROUP_CONCAT para SQL.

3. ¿Cuáles son los tres operadores de conjuntos?

UNION, INTERSECT y EXCEPT

b. Ejercicios de aplicación

Las soluciones propuestas pueden diferir ligeramente en función del tipo de base de datos. Descargue los archivos adicionales que contienen los scripts exactos para los cuatro SGBDR (SQL Server, Oracle, MySQL y PostgreSQL).

Primer ejercicio

Seleccionar toda la información sobre las películas realizadas por un REALIZADOR francés ordenado por el nombre de la película.

Primera posibilidad, se conoce el valor de columna NACIONALIDAD que corresponde a FRANCIA: 1.

SELECT * FROM PELICULA T1, REALIZADOR T2 WHERE 
       T1.IDENT_REALIZADOR = T2.IDENT_REALIZADOR AND 
       T2.NACIONALIDAD = 1 
ORDER BY T1.TITULO; 

Segunda posibilidad, se agrega una unión con la tabla PAIS y se iguala con la descripción « FRANCIA ».

SELECT * FROM PELICULA T1, REALIZADOR T2, PAIS T3 WHERE 
       T1.IDENT_REALIZADOR = T2.IDENT_REALIZADOR AND 
       T2.NACIONALIDAD = T3.IDENT_PAIS AND 
       T3.DESCRIPCION = 'FRANCIA' 
ORDER BY T1.TITULO; 

otra posible sintaxis:

SELECT * FROM PELICULA T1 
       INNER JOIN REALIZADOR T2 ON T1.IDENT_REALIZADOR = 
                                    T2.IDENT_REALIZADOR 
       INNER JOIN PAIS T3        ON T2.NACIONALIDAD = T3.IDENT_PAIS 
WHERE T3.DESCRIPCION = 'FRANCIA' 
ORDER BY T1.TITULO; 

Resultados

Se comprueba que TODAS las columnas de las tres tablas se tienen en cuenta....