Capítulo 5 CLASE 5

5.1 Modificar datos SQL

La sintaxis de una instrucción INSERT básica es relativamente sencilla:

INSERT INTO < nombre de la tabla >

[ ( < nombre de la columna > ) [ { , < nombre de la columna > }… ] ) ]

VALUES ( < valor > [ { , }… ] )

En la sintaxis, sólo son obligatorias la primera y la última líneas. La segunda línea es opcional. Tanto la primera como la segunda línea son parte de la cláusula INSERT INTO. En esta cláusula se debe identificar el nombre de la tabla (o vista) en la cual se agregarán los datos.

En la tercera línea de la sintaxis, que se refiere a la cláusula VALUES, se deben especificar uno o más valores que serán ingresados en la tabla. La lista de valores deberá estar encerrada en paréntesis y, si se especifica más de uno, deberán estar separados utilizando comas. Asimismo, los valores deben cumplir los siguientes requisitos:

  • Si los nombres de columna no se especifican en la cláusula INSERT INTO, entonces deberá haber un valor por cada columna en la tabla y los valores deberán estar en el mismo orden en el que están definidos en la tabla.

  • Si los nombres de columna se especifican en la cláusula INSERT INTO, entonces deberá haber exactamente un valor por cada columna especificada y esos valores deberán estar en el mismo orden en el que están definidos en la cláusula INSERT INTO. Sin embargo, los nombres y valores de columna no tienen que estar en el mismo orden que las columnas en la definición de la tabla.

  • Se debe proporcionar un valor por cada columna en la tabla excepto para las columnas que permiten valores nulos o que tienen un valor definido por defecto.

  • Cada valor con un carácter del tipo de datos de cadena debe estar encerrado en comillas sencillas.

  • Se puede utilizar la palabra clave NULL (o null) como el valor de los datos en la cláusula VALUES para asignar un valor nulo a cualquier columna que permita valores nulos.

En el primer ejemplo se mostrarán los valores insertados en cada columna en la tabla INVENTARIO_CD:

INSERT INTO INVENTARIO_CD

VALUES ( ‘Patsy Cline: 12 Greatest Hits,’ ‘Country,’ ‘MCA Records,’ 32 );

Observe que la cláusula INSERT INTO incluye solamente el nombre de la tabla INVENTARIO_CD, pero no especifica ninguna columna. En la cláusula VALUES se han especificado cuatro valores. Los valores están separados por comas, y los valores con caracteres del tipo de datos de cadena están encerrados en comillas sencillas.

Cuando se ejecuta la instrucción INSERT mostrada en el ejemplo, los datos son añadidos a la tabla INVENTARIO_CD, como se muestra en la Figura:

se puede especificar un valor nulo, como se muestra en el siguiente ejemplo:

INSERT INTO INVENTARIO_CD

VALUES ( ‘Out of Africa,’ null, ‘MCA Records,’ 29 );

Si se ejecuta la instrucción INSERT, la tabla no incluirá una fila adicional:

En lugar de proporcionar un valor para cada columna cuando se inserta una fila, se puede especificar cuáles columnas recibirán valores. Por ejemplo, se puede especificar los valores para las columnas NOMBRE_CD, EDITOR y EN_EXISTENCIA de la tabla INVENTARIO_CD, como se muestra en el siguiente ejemplo:

INSERT INTO INVENTARIO_CD ( NOMBRE_CD, EDITOR, EN_EXISTENCIA )

VALUES ( ‘Fundamental,’ ‘Capitol Records,’ 34 );

La siguiente instrucción INSERT omite la columna EDITOR en lugar de la columna TIPO_MUSICA:

INSERT INTO INVENTARIO_CD ( NOMBRE_CD, TIPO_MUSICA, EN_EXISTENCIA ) VALUES ( ‘Orlando,’ ‘Soundtrack,’ 5 );

Cuando la fila es agregada a la tabla INVENTARIO_CD, el valor por defecto (Independiente) es agregado a la columna EDITOR, como se muestra la Tabla:

también es posible especificar todas las columnas en la cláusula INSERT INTO. Si se realiza esto, debe especificarse correctamente el mismo número de valores, en el mismo orden en el cual están especificadas las columnas. La siguiente instrucción INSERT ingresa valores a todas las columnas de la tabla INVENTARIO_CD:

INSERT INTO INVENTARIO_CD

( NOMBRE_CD, MUSIC_TYPE, EDITOR, EN_EXISTENCIA )

VALUES ( ‘Court and Spark,’ ‘Pop,’ ‘Asylum Records,’ 22 );

Cuando se ejecuta esta instrucción, una fila es agregada a la tabla INVENTARIO_CD, con un valor para cada columna.

5.2 Desde una instrucción SELECT

Supongamos que, además de la tabla INVENTARIO_CD que se ha estado utilizando en los ejemplos anteriores, la base de datos también tuviera una segunda tabla llamada INVENTARIO_ CD_2, que incluyera dos columnas, como se muestra en la siguiente definición de tabla:

CREATE TABLE INVENTARIO_CD_2

( NOMBRE_CD_2 VARCHAR(60) NOT NULL,

EN_EXISTENCIA_2 INT NOT NULL );

La columna NOMBRE_CD_2 en la tabla INVENTARIO_CD_2 tiene los mismos tipos de datos que la columna NOMBRE_CD en la tabla INVENTARIO_CD, y la columna EN_EXISTENCIA_2 en la tabla INVENTARIO_CD_2 tiene los mismos tipos de datos que la columna EN_EXISTENCIA en la tabla INVENTARIO_CD. Como resultado, los valores tomados de las dos columnas en una tabla pueden ser insertados en las dos columnas de la segunda tabla.

Al utilizar la instrucción INSERT, se pueden copiar valores de la tabla INVENTARIO_CD a la tabla INVENTARIO_CD_2. La siguiente instrucción INSERT incluye una instrucción SELECT que consulta a la tabla INVENTARIO_CD:

INSERT INTO INVENTARIO_CD_2

SELECT NOMBRE_CD, EN_EXISTENCIA

FROM INVENTARIO_CD;

Los valores serán entonces insertados en sus columnas respectivas en la tabla INVENTARIO_CD_2:

Como se puede ver, ninguna columna está especificada en la cláusula INSERT INTO; como resultado, los valores serán insertados en ambas columnas en la tabla INVENTARIO_CD_2

Al igual que cualquier otra instrucción SELECT, la instrucción SELECT que se utiliza en una instrucción INSERT puede contener una cláusula WHERE. En la siguiente instrucción INSERT, la instrucción SELECT contiene una cláusula WHERE que limita los valores de EN_EXISTENCIA a una cantidad mayor a 10:

INSERT INTO INVENTARIO_CD_2

SELECT NOMBRE_CD, EN_EXISTENCIA

FROM INVENTARIO_CD

WHERE EN_EXISTENCIA > 10;

Si se ejecutara esta instrucción, solamente cuatro filas serían añadidas a la tabla INVENTARIO_CD_2, en lugar de las cinco filas que se vieron en el ejemplo anterior.

5.3 Actualizar datos SQL

La sintaxis para la instrucción UPDATE se puede mostrar de la manera siguiente:

UPDATE < nombre de la tabla >

SET < determinar expresión de la cláusula >

[ {, < determinar expresión de la cláusula > }… ] [ WHERE < condición de búsqueda > ]

Como se puede ver, la cláusula UPDATE y la cláusula SET son obligatorias, mientras que la cláusula WHERE es opcional.

Ahora regresemos a la cláusula SET. Como se puede ver, la cláusula incluye el marcador de posición < determinar expresión de la cláusula >. Se deben especificar una o más determinar expresión de la cláusula. Si se especifica más de una, se deben separar utilizando comas. La sintaxis del marcador de posición < determinar expresión de la cláusula > puede descomponerse como se muestra a continuación:

< nombre de la columna > = < expresión de valor >

En el primer ejemplo se utiliza la instrucción UPDATE para cambiar los valores de la columna EN_EXISTENCIA a 27, como se muestra en la siguiente instrucción SQL:

UPDATE INVENTARIO_CD

SET EN_EXISTENCIA = 27;

Esta instrucción realiza exactamente lo que se pudiera esperar: cambia cada fila en la tabla INVENTARIO_CD para que la columna EN_EXISTENCIA contenga un valor de 27 para cada fila.

En el siguiente ejemplo se modifica la instrucción UPDATE anterior para incluir una cláusula WHERE:

UPDATE INVENTARIO_CD

SET EN_EXISTENCIA = 27

WHERE NOMBRE_CD = ‘Out of Africa’;

La instrucción UPDATE aún cambia la columna EN_EXISTENCIA a un valor de 27, pero sólo lo hace para las filas que concuerdan con la condición de búsqueda en la cláusula WHERE. En este caso, solamente una fila cumple con esa condición: Out of Africa.

Algunas veces también se requiere cambiar un valor basado en un valor que ya exista, por ejemplo, la cantidad de inventario en existencia. Por ejemplo, se pueda añadir 2 al valor en la columna EN_EXISTENCIA:

UPDATE INVENTARIO_CD

SET EN_EXISTENCIA = (EN_EXISTENCIA + 2)

WHERE NOMBRE_CD = ‘Out of Africa’;

Si la fila Out of Africa contiene el valor 27 en la columna EN_EXISTENCIA, y se ejecuta esta instrucción UPDATE, el nuevo valor será 29. Si se ejecuta esta instrucción sin la cláusula WHERE, el valor 2 será agregado al valor EN_EXISTENCIA para cada fila en la tabla.

La cláusula WHERE también permite especificar más de un predicado, al igual que se puede hacer con una cláusula WHERE en la instrucción SELECT. En el siguiente ejemplo, se sustrae 2 del valor EN_EXISTENCIA para cualquier fila que contenga un valor TIPO_MUSICA de Country y un valor EN_EXISTENCIA mayor a 30:

UPDATE INVENTARIO_CD

SET EN_EXISTENCIA = (EN_EXISTENCIA – 2)

WHERE TIPO_MUSICA = ‘Country’ AND EN_EXISTENCIA > 30;

Solamente una fila (Patsy Cline: 12 Greatest Hits) cumple con las condiciones de búsqueda especificadas en la cláusula WHERE. El valor EN_EXISTENCIA para esa fila ha sido cambiado de 32 a 30. También es posible especificar múltiples expresiones en la cláusula SET. En otras palabras, se pueden cambiar los valores de más de una columna al mismo tiempo. Por ejemplo, supongamos que se quiere cambiar el valor EDITOR y el valor EN_EXISTENCIA de la fila Orlando. La instrucción UPDATE necesaria podría lucir de la siguiente forma:

UPDATE INVENTARIO_CD

SET PLUBLISHER = ‘Sarabande Records,’

EN_EXISTENCIA = (EN_EXISTENCIA * 2)

WHERE NOMBRE_CD = ‘Orlando’;

Observe que las dos expresiones en la cláusula SET están separadas por una coma. Cuando se ejecuta esta instrucción, el valor EDITOR se cambia de Independiente a Sarabande Records, y el valor EN_EXISTENCIA se cambia de 5 a 10. (El valor 5 se multiplica por 2.)

Algo que no se puede realizar, sin embargo, es cambiar el valor para la misma columna para dos diferentes filas si se está tratando de dar diferentes valores para esas filas. Veamos un ejemplo para hacer esto más claro. Supongamos que se quiere actualizar el valor para la fila Out of Africa y para la fila Fundamental, pero se quiere actualizar estas filas con diferentes valores. La fila Out of Africa debe contener el valor Soundtrack para TIPO_MUSICA, y la fila Fundamental debe contener el valor Blues para TIPO_MUSICA. Como resultado, se puede intentar ejecutar una instrucción similar a la siguiente:

UPDATE INVENTARIO_CD

SET TIPO_MUSICA = ‘Soundtrack,’

TIPO_MUSICA = ‘Blues’

WHERE NOMBRE_CD = ‘Out of Africa’ OR NOMBRE_CD = ‘Fundamental’;

Si se intenta ejecutar esta instrucción, la implementación de SQL no sabrá cuál valor de TIPO_MUSICA debe poner en qué fila, y arrojará un error. Para manejar una situación como ésta, se necesitarán crear dos instrucciones UPDATE separadas:

UPDATE INVENTARIO_CD

SET TIPO_MUSICA = ‘Soundtrack’

WHERE NOMBRE_CD = ‘Orlando’;

UPDATE INVENTARIO_CD

SET TIPO_MUSICA = ‘Blues’

WHERE NOMBRE_CD = ‘Fundamental’;

5.4 Actualizar valores desde SELECT

Supongamos que se quieren actualizar los datos en la tabla INVENTARIO_CD_2 utilizando valores de la tabla INVENTARIO_CD. Se puede crear una instrucción UPDATE que sea similar a la siguiente: UPDATE INVENTARIO_CD_2

SET EN_EXISTENCIA_2 = ( SELECT AVG(EN_EXISTENCIA)

FROM INVENTARIO_CD );

La instrucción SELECT calcula el promedio de los valores EN_EXISTENCIA en la tabla INVENTARIO_CD, el cual es 24, por lo que determinar la expresión de la cláusula puede ser interpretado como sigue: EN_EXISTENCIA_2 = 24. Como resultado, todos los valores EN_EXISTENCIA_2 en la tabla INVENTARIO_CD_2 son determinados a 24. Desde luego, probablemente no se requiere que todos los valores de EN_EXISTENCIA_2 sean iguales, por lo que puede limitarse cuáles filas serán actualizadas al agregar una cláusula WHERE a la instrucción UPDATE:

UPDATE INVENTARIO_CD_2

SET EN_EXISTENCIA_2 =

( SELECT AVG(EN_EXISTENCIA) FROM INVENTARIO_CD )

WHERE NOMBRE_CD_2 = ‘Orlando’;

Ahora, solamente la fila Orlando será actualizada y el valor de EN_EXISTENCIA_2 será cambiado a 24.

Incluso se puede agregar una cláusula WHERE a la instrucción SELECT, como se muestra en el siguiente ejemplo:

UPDATE INVENTARIO_CD_2

SET EN_EXISTENCIA_2 =

( SELECT EN_EXISTENCIA
               
FROM INVENTARIO_CD
        
WHERE NOMBRE_CD = 'Orlando' )
   

WHERE NOMBRE_CD_2 = ‘Orlando’;

En este caso, el valor EN_EXISTENCIA de 5 se toma directamente desde la fila Orlando de la tabla INVENTARIO_CD y se utiliza como la porción de la expresión determinar cláusula. Como resultado, determinar la expresión de la cláusula puede ser interpretado como lo siguiente: EN_EXISTENCIA_2 = 5. (Por supuesto, el valor en la tabla INVENTARIO_CD_2 no cambiará debido a que ya es 5, pero si tuviera cualquier otro valor diferente, éste se habría actualizado a 5.)

Se puede agregar una capa más de complejidad a la instrucción UPDATE modificando la cláusula SET todavía más. Por ejemplo, supongamos que se quiere incrementar el valor en 2 antes de insertarlo en la columna EN_EXISTENCIA_2. Para hacer eso, se puede cambiar la expresión de valor a la siguiente:

UPDATE INVENTARIO_CD_2

SET EN_EXISTENCIA_2 =

   ( SELECT EN_EXISTENCIA
       
    FROM INVENTARIO_CD
           
    WHERE NOMBRE_CD = 'Orlando' ) + 2
    

WHERE NOMBRE_CD_2 = ‘Orlando’;

Una vez más, la cláusula SELECT toma el valor de 5 desde la columna EN_EXISTENCIA de la tabla INVENTARIO_CD, pero esta vez el valor 2 es agregado al valor arrojado por la instrucción SELECT, resultando un total de 7. Como resultado, el nuevo determinar la expresión de la cláusula puede ser representado así: EN_EXISTENCIA_2 = (5) + 2. Si se ejecutara esta instrucción, el valor de EN_EXISTENCIA_2 cambiaría a 7 en la fila Orlando de la tabla INVENTARIO_CD_2.

5.5 Eliminar datos SQL

La siguiente sintaxis muestra qué tan básica es la instrucción DELETE:

DELETE FROM

[ WHERE ]

Si no se incluye una cláusula WHERE en la instrucción DELETE, todas las filas serán eliminadas de la tabla especificada. Es importante comprender que la instrucción DELETE no elimina la tabla en sí, sino solamente filas en la tabla

El primer ejemplo elimina todos los datos (todas las filas) de la tabla INVENTARIO_CD,

DELETE FROM INVENTARIO_CD;

Eso es todo lo que se necesita.

Se puede modificar la instrucción que acabamos de ver para eliminar solamente filas donde el valor TIPO_ MUSICA sea Country:

DELETE FROM INVENTARIO_CD

WHERE TIPO_MUSICA = ‘Country’;

Cuando se ejecuta esta instrucción, todas las filas cuyo valor TIPO_MUSICA es Country serán eliminadas de la tabla INVENTARIO_CD, que en este caso es la fila Patsy Cline: 12 Greatest Hits. Ahora modificamos la instrucción DELETE un poco más incluyendo dos predicados en la cláusula WHERE:

DELETE FROM INVENTARIO_CD

WHERE TIPO_MUSICA = ‘Pop’

OR EDITOR = ‘Independiente’;

Esta instrucción eliminará cualquier fila en la tabla CD_INVENTORY que incluya a un valor TIPO_MUSICA de Pop o un valor EDITOR de Independiente, lo que significa que la fila Court and Spark y la fila Orlando serán eliminadas.

5.6 PASO A PASO: MODIFICAR DATOS SQL

  1. Abra la aplicación cliente para su RDBMS y conéctese con la base de datos INVENTARIO.

  2. Primero se añadirá una nueva compañía a la tabla DISQUERAS_CD. La compañía es DRG Records y tendrá un valor ID_DISQUERA de 837. Ingrese y ejecute la siguiente instrucción SQL:

INSERT INTO DISQUERAS_CD

VALUES ( 837, ‘DRG Records’ );

Una fila se añadirá a la tabla DISQUERAS_CD.

  1. Ahora agreguemos un nuevo CD a la tabla DISCOS_COMPACTOS. El CD tiene el nombre Ann Hampton Callaway, el cual tiene un valor ID_DISCO_COMPACTO de 116. Se encuentran 14 de estos CD en existencia y el valor ID_DISQUERA deberá ser 836. (Éste no es el valor ID_DISQUERA correcto, pero se utilizará aquí para propósitos de este ejercicio.) Ingrese y ejecute la siguiente instrucción SQL:

INSERT INTO DISCOS_COMPACTOS

VALUES ( 116, ‘Ann Hampton Callaway,’ 836, 14 );

Una fila se añadirá a la tabla DISCOS_COMPACTOS. El valor ID_DISQUERA de 836 representa Sarabande Records.

  1. Ahora agregaremos otra fila en la tabla DISCOS_COMPACTOS; sólo que esta vez, la instrucción INSERT especificará los nombres de las columnas de la tabla destino. Se insertará un CD llamado Rhythm Country and Blues. La nueva fila contendrá un valor ID_DISCO_COMPACTO de 117, un valor ID_DISQUERA de 832 (MCA Records) y un valor EN_EXISTENCIA de 21.

Ingrese y ejecute la siguiente instrucción SQL:

INSERT INTO DISCOS_COMPACTOS

( ID_DISCO_COMPACTO, TITULO_CD,

ID_DISQUERA, EN_EXISTENCIA)

VALUES ( 117, ‘Rhythm Country and Blues,’ 832, 21 );

Una fila se añadirá a la tabla DISCOS_COMPACTOS.

Después de ingresar la fila Rhythm Country and Blues, se puede observar que el valor EN_ EXISTENCIA es incorrecto y que es necesario actualizar ese valor a 25. Ingrese y ejecute la siguiente instrucción SQL:

UPDATE DISCOS_COMPACTOS

SET EN_EXISTENCIA = 25

WHERE ID_DISCO_COMPACTO = 117;

El valor EN_EXISTENCIA de la fila Rhythm Country and Blues será cambiado a 25.

  1. Ahora se puede observar que se ingresó el valor incorrecto ID_DISQUERA para la fila Ann Hampton Callaway. Sin embargo, se quiere modificar el valor existente especificando el nombre de la compañía en lugar del valor ID_DISQUERA. El nombre de la compañía es DRG Records, que se añadió a la tabla DISQUERAS_CD en el paso 2. Ingrese y ejecute la siguiente instrucción SQL:

UPDATE DISCOS_COMPACTOS

SET ID_DISQUERA =

     ( SELECT ID_DISQUERA
     
      FROM DISQUERAS_CD
         
      WHERE NOMBRE_COMPAÑIA = 'DRG Records' )
        

WHERE ID_DISCO_COMPACTO = 116;

En esta instrucción se utilizó la instrucción SELECT para tomar el valor ID_DISQUERA de la tabla DISQUERAS_CD.

La instrucción arrojó un valor de 837. El valor 837 fue entonces utilizado como el valor ID_DISQUERA para la tabla DISCOS_COMPACTOS.

Observe que no hubiera sido posible ingresar el valor de 837 en la columna ID_DISQUERA de la tabla DISCOS_COMPACTOS si no hubiera existido antes en la tabla DISQUERAS_CD. No sólo sucede esto debido a que una instrucción SELECT fue utilizada para tomar el valor, sino también debido a que la columna ID_DISQUERA en la tabla DISCOS_COMPACTOS es una clave externa que hace referencia a la tabla DISQUERAS_CD.

Como resultado, el valor debe existir en la tabla referenciada antes de que pueda ser agregado a la tabla que hace referencia a ella.

  1. Ahora echemos un vistazo a los datos que se han ingresado y actualizado. Ingrese y ejecute la siguiente instrucción SQL:

SELECT *

FROM DISCOS_COMPACTOS

WHERE ID_DISCO_COMPACTO = 116

OR ID_DISCO_COMPACTO = 117;

La instrucción SELECT pide los datos de todas las columnas en la tabla DISCOS_COMPACTOS, pero sólo para aquellas filas que tengan un valor ID_DISCO_COMPACTO de 116 o 117. Los resultados de la consulta deberán incluir dos filas. Verifique que la información en esas filas esté correcta. La fila Ann Hampton Callaway deberá tener un valor ID_DISQUERA de 837 y un valor EN_EXISTENCIA de 14, y la fila Rhythm Country and Blues deberá tener un valor ID_DISQUERA de 832 y un valor EN_EXISTENCIA de 25.

Ahora elimine las dos filas que se agregaron a la tabla DISCOS_COMPACTOS. Ingrese y ejecute la siguiente instrucción SQL:

DELETE FROM DISCOS_COMPACTOS

WHERE ID_DISCO_COMPACTO = 116

OR ID_DISCO_COMPACTO = 117;

La filas Ann Hampton Callaway y Rhythm Country and Blues deberán haber sido eliminadas de la tabla DISCOS_COMPACTOS.

  1. Por último elimine la fila que se añadió a la tabla DISQUERAS_CD. Ingrese y ejecute la siguiente instrucción SQL:

DELETE FROM DISQUERAS_CD

WHERE ID_DISQUERA = 837;

La fila DRG Records deberá haber sido eliminada de la tabla DISQUERAS_CD.

Si se hubiera intentado eliminar esta fila anteriormente eliminando la fila Ann Hampton Callaway en la tabla DISCOS_COMPACTOS, se habría recibido un error debido a que el valor ID_DISQUERA en DISCOS_COMPACTOS hace referencia a la fila DRG Records en DISQUERAS_CD. La fila Ann Hampton Callaway tenía que ser eliminada primero, o el valor ID_DISQUERA tenía que ser cambiado a otro valor que cumpliera con la limitante de la clave externa.

  1. Cierre la aplicación cliente.

Al momento de terminar el ejercicio, la base de datos INVENTARIO deberá contener lo mismo que cuando se empezó el ejercicio.