Capítulo 6 CLASE 6

6.1 Predicados SQL

Antes de moverse hacia otros predicados, es una buena idea revisar los predicados que ya han sido discutidos. Éstos incluyen los seis tipos de predicados de comparación, el predicado BETWEEN, el predicado NULL y el predicado LIKE. En este ejercicio se probarán varios de estos predicados mediante el uso de instrucciones SELECT que incluirán las cláusulas WHERE apropiadas. Se consultarán las tablas que se crearon en la base de datos INVENTARIO. Debido a que se utilizarán solamente instrucciones SELECT, de cualquier manera no se modificarán las tablas o las estructuras de las bases de datos.

6.2 PASO A PASO: Predicados SQL

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

  2. En la primera instrucción creada, se consultará la tabla TIPO_MUSICA para arrojar los nom bres de aquellas filas cuyo valor ID_TIPO sea igual a 11 o 12. Ingrese y ejecute la siguiente instrucción SQL

SELECT ID_TIPO, NOMBRE_TIPO

FROM TIPO_MUSICA

WHERE ID_TIPO = 11

OR ID_TIPO = 12;

La instrucción deberá arrojar dos filas, una para Blues y otra para Jazz. Observe que la palabra clave OR se utiliza para indicar que cualesquiera de los dos valores es aceptable.

  1. Ahora se consultará la tabla ARTISTAS para buscar artistas diferentes a Patsy Cline y Bing Crosby. Ingrese y ejecute la siguiente instrucción SQL:

SELECT NOMBRE_ARTISTA, LUGAR_DE_NACIMIENTO

FROM ARTISTAS

WHERE NOMBRE_ARTISTA <> ‘Patsy Cline’

AND NOMBRE_ARTISTA <> ‘Bing Crosby’;

La consulta deberá arrojar 16 filas y no deberá incluir las filas Patsy Cline o Bing Crosby.

  1. Ahora combinemos un par de predicados de comparación para crear un tipo diferente de condi ción de búsqueda. En esta instrucción se consultará una vez más la tabla ARTISTAS, pero ahora sólo se peticionarán aquellas filas cuyos valores ID_ARTISTA se encuentren entre 2004 y 2014 (excluyendo los puntos límite). Ingrese y ejecute la siguiente instrucción SQL:

SELECT ID_ARTISTA, NOMBRE_ARTISTA

FROM ARTISTAS

WHERE ID_ARTISTA > 2004

AND ID_ARTISTA < 2014;

La consulta deberá arrojar nueve filas.

  1. Ahora modifiquemos la instrucción SELECT que se acaba de ejecutar. Deberá utilizarse un pre dicado BETWEEN en lugar de los dos predicados de comparación. Ingrese y ejecute la siguien te instrucción SQL:

SELECT ID_ARTISTA, NOMBRE_ARTISTA

FROM ARTISTAS

WHERE ID_ARTISTA BETWEEN 2004 AND 2014;

Ahora deberán aparecer 11 filas, en lugar de las nueve que se arrojaron en el paso anterior, debido a que BETWEEN siempre incluye los puntos límite. Si en el paso anterior se hubiera utilizado el operador Mayor que o igual a y el operador Menor que o igual a, los resultados de la consulta habrían sido los mismos que en este paso.

  1. Ahora consultemos una vez más la tabla ARTISTAS, sólo que esta vez se utilizará el predicado NULL. Ingrese y ejecute la siguiente instrucción SQL:

SELECT *

FROM ARTISTAS

WHERE LUGAR_DE_NACIMIENTO IS NULL;

La búsqueda no arrojará resultados debido a que la columna LUGAR_DE_NACIMIENTO no contiene valores nulos.

  1. Intentemos la misma consulta que en el paso anterior, sólo que esta vez se agregará la palabra clave NOT al predicado NULL. Ingrese y ejecute la siguiente instrucción SQL:

SELECT *

FROM ARTISTAS

WHERE LUGAR_DE_NACIMIENTO IS NOT NULL;

La consulta ahora deberá arrojar todas las filas de la tabla (18 en total).

  1. En la siguiente instrucción se utilizará el predicado LIKE para encontrar títulos de CD que incluyan la palabra Best o la palabra Greatest. El predicado hará referencia a la columna TITU LO_CD de la tabla DISCOS_COMPACTOS. Ingrese y ejecute la siguiente instrucción SQL:

SELECT TITULO_CD, EN_EXISTENCIA

FROM DISCOS_COMPACTOS

WHERE TITULO_CD LIKE (‘%Greatest%’)

OR TITULO_CD LIKE (‘%Best%’);

La consulta deberá arrojar tres filas. En todas estas filas, el valor TITULO_CD deberá contener las palabras Greatest o Best.

  1. Esta vez se modificará la instrucción en el paso anterior para incluir la palabra clave NOT en ambos predicados. También deberá cambiarse la palabra clave OR por la palabra AND. Ingrese y ejecute la siguiente instrucción SQL:

SELECT TITULO_CD, EN_EXISTENCIA

FROM DISCOS_COMPACTOS

WHERE TITULO_CD NOT LIKE (’ % Greatest % ’)

AND TITULO_CD NOT LIKE (’ % Best % ’);

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

Los resultados de la consulta deberán ahora incluir 12 filas. Si no se hubiera cambiado la pala bra clave OR por AND, los resultados habrían incluido todas las 15 filas. Esto se debe a que la instrucción siempre se habría evaluado como verdadera (el primer predicado se evaluaría como verdadero para una fila que contenga Greatest; el segundo predicado se evaluaría como verda dero para una fila que contenga Best, y ambos predicados se evaluarían como verdaderos para cualquier otra fila).

  1. Cierre la aplicación cliente.

En este ejercicio se crearon varias instrucciones SELECT que incluían varios predicados. Los predicados estaban contenidos en cláusulas WHERE que eran parte de las instrucciones SELECT; sin embargo, estas cláusulas también pudieron haber sido parte de las instrucciones UPDATE y DELETE.

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

6.3 IN

El predicado IN permite determinar si los valores en la columna especificada de una tabla están contenidos en una lista definida o contenidos dentro de otra tabla. En el primer caso, se debe es pecificar el nombre de la columna, la palabra clave IN y una lista de valores que son comparados a los valores en la columna especificada. En el segundo caso, se debe especificar el nombre de la columna, la palabra clave IN y una subconsulta, que hace referencia a la segunda tabla. En cada caso, si el valor de la columna coincide con uno de los valores en la lista o en los resultados de la subconsulta, el predicado se evalúa como verdadero y la fila es arrojada en los resultados de la consulta.

SELECT TITULO_CD, EN_EXISTENCIA

FROM DISCOS_COMPACTOS

WHERE EN_EXISTENCIA IN ( 12, 22, 32, 42 );

SELECT TITULO, ARTISTA

FROM ARTISTAS_DISCO_COMPACTO

WHERE TITULO IN

 ( SELECT NOMBRE_CD
  FROM INVENTARIO_DISCO_COMPACTO
  WHERE EN_EXISTENCIA > 10 );

6.4 EXISTS

A pesar de ser similar al predicado IN, el predicado EXISTS tiene un enfoque ligeramente diferen te. Está dedicado únicamente a determinar si la subconsulta arroja alguna fila o no. Si ésta arroja una o más filas, el predicado se evalúa como verdadero; de otra manera, el predicado se evalúa como falso. El predicado consiste de la palabra clave EXISTS y una subconsulta. Para que la sub consulta sea un valor real (y subsecuentemente el predicado EXISTS por sí mismo), debe incluir un predicado que coincida con dos columnas en diferentes tablas. Por ejemplo, la tabla INVENTARIO_DISCO_COMPACTO incluye la columna TITULO. Las dos columnas pue den hacerse coincidir juntas para asegurar que sólo las filas relevantes sean arrojadas por la sub consulta. Veamos un ejemplo para ayudar a aclarar este tema.

SELECT *

FROM INVENTARIO_DISCO_COMPACTO

WHERE EXISTS

 ( SELECT TITULO
  FROM ARTISTAS_DISCO_COMPACTO
  WHERE ARTISTA = 'Joni Mitchell'
  AND INVENTARIO_DISCO_COMPACTO.NOMBRE_CD =
  ARTISTAS_DISCO_COMPACTO.TITULO );
  

6.5 ALL

El predicado ALL funciona muy parecido a los predicados SOME y ANY porque también compa ra valores de columna con los resultados de la subconsulta. Sin embargo, en lugar de que los valo res de columna tengan que evaluarse como verdaderos para cualquiera de los valores resultantes, los valores de columna deben evaluarse como verdaderos para todos los valores resultantes; si no es así, la fila no será arrojada. Regresemos al ejemplo anterior, solamente que esta vez se sustituirá la palabra clave ANY por la palabra clave ALL. La nueva instrucción SELECT lucirá de la siguiente manera:

SELECT TITULO, REBAJA

FROM REBAJA_CD

WHERE REBAJA < ALL

         ( SELECT MENUDEO
             FROM MENUDEO_CD
            WHERE EN_EXISTENCIA > 9 );
            

6.6 PASO A PASO: PREDICADOS 2 SQL

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

  2. En su primera instrucción utilizará un predicado IN para consultar datos de la tabla DISCOS_ COMPACTOS. Se quiere ver la información de CD y de inventario para los CD publicados por la compañía Decca Record Company. Para averiguar cuáles son estos CD, se debe crear una subconsulta que consulte los datos de la tabla DISQUERAS_CD. Ingrese y ejecute la siguiente instrucción SQL:

SELECT TITULO_CD, EN_EXISTENCIA FROM DISCOS_COMPACTOS

WHERE ID_DISQUERA IN

       ( SELECT ID_DISQUERA
          FROM DISQUERAS_CD
          WHERE NOMBRE_COMPAÑIA = 'Decca Record Company' );

Los resultados de la consulta deberán incluir solamente dos filas. Ambas filas tendrán un va lor ID_DISQUERA de 833, que es el valor arrojado por la subconsulta.

  1. Ahora se intentará una instrucción SELECT similar a la del paso 2, sólo que esta vez se utili zará un predicado EXISTS para arrojar los datos. Adicionalmente, tendrá que agregar un pre dicado a la cláusula WHERE de la subconsulta que hará coincidir el valor ID_DISQUERA en la tabla DISCOS_COMPACTOS con el valor ID_DISQUERA en la tabla DISQUERAS_CD. Ingrese y ejecute la siguiente instrucción SQL:

SELECT TITULO_CD, EN_EXISTENCIA FROM DISCOS_COMPACTOS

WHERE EXISTS ( SELECT ID_DISQUERA FROM DISQUERAS_CD

       WHERE DISCOS_COMPACTOS.ID_DISQUERA = DISQUERAS_CD.ID_DISQUERA
       
       AND ID_DISQUERA > 830 );

Observe que uno de los predicados en la cláusula WHERE de la subconsulta utiliza un ope rador de comparación para buscar los valores ID_DISQUERA mayores a 830. Si se busca en la tabla DISQUERAS_CD, se encontrará que hay seis filas que contienen valores ID_DISQUERA mayores a 830. Entonces, si se fuera a hacer coincidir estos seis valores con los valores ID_DISQUERA en la tabla DISCOS_COMPACTOS, se encontraría que 11 filas se evaluarían como verdaderas. Éstas serán las 11 filas arrojadas por la instrucción SELECT.

  1. En esta instrucción se utilizará un predicado ANY para comparar los valores ID_DISQUERA en la tabla DISQUERAS_CD con los valores ID_DISQUERA en la tabla DISCOS_COM PACTOS que están incluidos en filas con un valor EN_EXISTENCIA mayor a 20. Los valores ID_DISQUERA en la tabla DISQUERAS_CD pueden coincidir con cualquier valor en los re sultados de la subconsulta. Ingrese y ejecute la siguiente instrucción SQL:

SELECT ID_DISQUERA, NOMBRE_COMPAÑIA

FROM DISQUERAS_CD

WHERE ID_DISQUERA = ANY

   ( SELECT ID_DISQUERA
    FROM DISCOS_COMPACTOS
      WHERE EN_EXISTENCIA > 20 );

La consulta deberá arrojar solamente cinco filas.

  1. Ahora trate de crear la misma instrucción SELECT del paso 4, sólo que esta vez utilizando un predicado ALL en lugar de un predicado ANY. Ingrese y ejecute la siguiente instrucción SQL:

SELECT ID_DISQUERA, NOMBRE_COMPAÑIA

FROM DISQUERAS_CD

WHERE ID_DISQUERA = ALL

    ( SELECT ID_DISQUERA
      FROM DISCOS_COMPACTOS
      WHERE EN_EXISTENCIA > 20 );

Encontrará que con esta consulta no se arroja ninguna fila. Esto se debe a que la subconsulta arroja ocho filas con cinco diferentes valores. El valor ID_DISQUERA para cada fila en la ta bla DISQUERAS_CD no puede hacer coincidir todos los valores, solamente uno o algunos de ellos. La única forma en que se arrojaría alguna fila en este caso sería si la subconsulta arrojara solamente una fila o múltiples filas, todas con el mismo valor.

  1. Ahora intente modificar la instrucción SELECT cambiando el predicado de comparación en la cláusula WHERE de la subconsulta a mayor que 40. Ingrese y ejecute la siguiente instrucción SQL:

SELECT ID_DISQUERA, NOMBRE_COMPAÑIA

FROM DISQUERAS_CD

WHERE ID_DISQUERA = ALL

     ( SELECT ID_DISQUERA
      FROM DISCOS_COMPACTOS
      WHERE EN_EXISTENCIA > 40 );

Los resultados de la consulta ahora arrojarán una fila. Esto se debe a que la subconsulta arro ja sólo una fila que cumple la condición del predicado ALL.

  1. Cierre la aplicación de cliente.