unidad 5 conectores booleanos

Upload: wvaliente2011

Post on 18-Oct-2015

46 views

Category:

Documents


0 download

TRANSCRIPT

  • [MySQL Bsico] De Intecap-TICS [Esta Unidad trata de los conectores booleanos y otras sentencias que permiten combinar varias condiciones en una sola consulta; los Objetivos de la Unidad son adquirir las competencias de los siguientes contenidos.]

    Unidad

    5 Conectores

    Booleanos

    Unidad 5

  • M

    ySQ

    L e

    s S

    oft

    ware

    Lib

    re

    2

    MMyySSQQLL BBssiiccoo

    Conectores booleanos: AND-OR-NOT La seleccin de filas, en las unidades anteriores, se basa en una sola condicin. En esta unidad presentamos el uso de los conectores booleanos para facilitar la seleccin de filas basada en

    condiciones mltiples. Las primeras doce consultas-ejemplo muestran los conectores booleanos clsicos: AND, OR y NOT. El resto de las consultas-ejemplo presenta las palabras clave IN y BETWEEN. Aprenderemos todo lo que se puede hacer sin IN y BETWEEN, porque los operadores clsicos ofrecen la posibilidad de formular cualquier criterio de seleccin de filas. Sin embargo, tambin veremos que IN y BETWEEN son muy tiles, ya que proporcionan una forma ms

    compacta de expresar ciertas condiciones de seleccin de filas. EL CONECTOR AND

    La primera consulta-ejemplo trata sobre el conector AND. Este se coloca entre dos condiciones de seleccin de filas, dentro de la clusula WHERE. El objetivo es pedir al sistema que seleccione una sola columna nicamente si ambas condiciones se cumplen.

    Consulta-ejemplo 5.1: Obtener toda la informacin sobre todos los cursos CIS que tengan TARIFA igual a cero. mysql> SELECT * -> FROM CURSO -> WHERE CTARIFA = 0 -> AND CDEPT = 'CIS'; +-----+---------------------+-------------------------+------+---------+-------+ | CNO | CNOMBRE | CDESCP | CRED | CTARIFA | CDEPT | +-----+---------------------+-------------------------+------+---------+-------+ | C33 | MATEMAT. DISCRETAS | ABSOLUTAMENTE NECESARIO | 3 | 0.00 | CIS | | C44 | CIRCUITOS DIGITALES | AH HA! | 3 | 0.00 | CIS | +-----+---------------------+-------------------------+------+---------+-------+

    Comentarios 1. Lgica: El ejemplo muestra dos condiciones que se encuentran relacionadas por el conector

    booleano AND. Estas dos condiciones son:

    a. CTARIFA = 0 b. CDEPT = 'CIS' Recordemos que una nica fila debe cumplir las condiciones para que sea seleccionada. Observe que las dos filas obtenidas en el output cumplen los criterios de seleccin. Observar que la tabla CURSO contiene filas adicionales que cumplen bien una condicin u otra, pero no ambas. Hay cursos de Filosofa y de Teologa que tienen TARIFA igual a cero. De la misma forma, hay cursos de Informtica (CIS) que tienen TARIFA distinta de cero. Estas filas no han sido seleccionadas porque slo cumplen una de las dos condiciones especificadas.

    2. Sintaxis: El primer requisito es que las condiciones se expresen de forma sintcticamente

    correcta. La consulta-ejemplo presenta las condiciones escritas en lneas separadas. Esto no es imprescindible, pero aumenta la legibilidad. Recordemos que una sentencia SELECT es libre en su forma, y puede escribirse utilizando el nmero de lneas que se desee. Por lo tanto, cada una de las siguientes sentencias es equivalente al ejemplo que estamos presentando.

  • M

    ySQ

    L e

    s S

    oft

    ware

    Lib

    re

    3

    MMyySSQQLL BBssiiccoo

    SELECT * FROM CURSO WHERE CTARIFA = 0 AND CDEPT = 'CIS'; SELECT * FROM CURSO WHERE CTARIFA = 0 AND

    CDEPT = 'CIS';

    SELECT * FROM CURSO WHERE CTARIFA = 0 AND CDEPT = 'CIS'; SELECT * FROM CURSO WHERE CTARIFA = 0 AND CDEPT = 'CIS';

    3. El orden en el que se especifiquen las condiciones no influye en la ejecucin. La siguiente condicin compuesta WHERE debe ejecutarse con la misma eficacia y producir el mismo resultado. WHERE CTARIFA = 0 AND CDEPT = 'CIS' WHERE CDEPT 'CIS' AND CTARIFA = 0

    Ejercicio 5A. Seleccionar toda la informacin sobre los cursos de tres crditos, ofrecidos por el

    departamento de Filosofa. Al igual que en la consulta-ejemplo anterior, el siguiente ejemplo conecta mltiples condiciones usando AND. Esta vez, ambas condiciones se refieren a la misma columna (CTARIFA). La intencin es seleccionar filas donde el valor de CTARIFA se encuentre dentro de un cierto rango. Consulta-ejemplo 5.2: Obtener toda la informacin sobre cualquier curso que tenga un valor TARIFA que se encuentre entre cero y cien dlares. mysql> SELECT * -> FROM CURSO -> WHERE CTARIFA > 0 -> AND CTARIFA < 100;

    +-----+------------------+-------------------+------+---------+-------+ | CNO | CNOMBRE | CDESCP | CRED | CTARIFA | CDEPT | +-----+------------------+-------------------+------+---------+-------+ | T12 | FUNDAMENTALISMO | PARA DESCUIDADOS | 3 | 90.00 | THEO | | P22 | RACIONALISMO | PARA USUARIOS CIS | 3 | 50.00 | PHIL | | C22 | ESTRUC. DE DATOS | MUY UTIL | 3 | 50.00 | CIS | +-----+------------------+-------------------+------+---------+-------+

    Comentarios 1. Lgica: El ejemplo seleccionaba filas en las que el valor CTARIFA fuera estrictamente mayor

    que cero y menor que cien. Observe que las filas con valores CTARIFA igual a 0 y 100 no han sido seleccionadas.

    2. Sintaxis: El nombre de columna debe estar especificado en ambas condiciones. La siguiente

    clusula WHERE no es vlida y producir un error. WHERE CTARIFA > 0 AND < 100

  • M

    ySQ

    L e

    s S

    oft

    ware

    Lib

    re

    4

    MMyySSQQLL BBssiiccoo

    Ejercicio 5B. Obtener toda la informacin sobre cualquier curso que tenga un valor TARIFA entre $100 y

    $500, ambos inclusive.

    ANDS MULTIPLES Es posible conectar condiciones mltiples usando muchos conectores AND. El siguiente ejemplo muestra cuatro condiciones que estn conectadas por AND. En este caso, una fila dada ser

    seleccionada slo si cumple las cuatro condiciones especificadas. Consulta-ejemplo 5.3: Obtener toda la informacin existente sobre todos los curso de Filosofa que ofrezcan tres crditos y que tengan un valor TARIFA que se encuentre entre cero y cien

    dlares. mysql> SELECT * -> FROM CURSO -> WHERE CTARIFA > 0 -> AND CTARIFA < 100 -> AND CDEPT = 'PHIL' -> AND CRED = 3;

    +-----+--------------+-------------------+------+---------+-------+ | CNO | CNOMBRE | CDESCP | CRED | CTARIFA | CDEPT | +-----+--------------+-------------------+------+---------+-------+ | P22 | RACIONALISMO | PARA USUARIOS CIS | 3 | 50.00 | PHIL | +-----+--------------+-------------------+------+---------+-------+

    Comentario En la prctica, no existe lmite en el nmero de condiciones que pueden usarse en una clusula

    WHERE. Ejercicio

    5C. Seleccionar la informacin existente sobre todos los cursos de Teologa que tengan un valor TARIFA que se encuentre entre $100 y $400, ambos inclusive.

    CONECTOR OR

    Al igual que el conector AND, el conector OR conectar condiciones mltiples dentro de una clusula WHERE. Sin embargo, los conectores OR tienen un efecto diferente en la lgica del proceso de seleccin de filas. Suponiendo que se conecten con un OR slo dos condiciones, una

    fila ser seleccionada si cumple cualquiera de las condiciones especificadas o ambas. La siguiente consulta-ejemplo ilustra este punto. Consulta-ejemplo 5.4: Obtener toda la informacin existente sobre cualquier curso ofrecido por

    los Departamentos CIS o PHIL.

  • M

    ySQ

    L e

    s S

    oft

    ware

    Lib

    re

    5

    MMyySSQQLL BBssiiccoo

    mysql> SELECT * -> FROM CURSO -> WHERE CDEPT = 'CIS' -> OR CDEPT = 'PHIL';

    +-----+----------------------+-------------------------+------+---------+-------+ | CNO | CNOMBRE | CDESCP | CRED | CTARIFA | CDEPT | +-----+----------------------+-------------------------+------+---------+-------+ | P11 | EMPIRISMO | VER PARA CREER | 3 | 100.00 | PHIL | | P22 | RACIONALISMO | PARA USUARIOS CIS | 3 | 50.00 | PHIL | | P33 | EXISTENCIALISMO | PARA USUARIOS CIS | 3 | 200.00 | PHIL | | P44 | SOLIPSISMO | PARA MI MISMO | 6 | 0.00 | PHIL | | C11 | INTROD. A LOS CC | PARA NOVATOS | 3 | 100.00 | CIS | | C22 | ESTRUC. DE DATOS | MUY UTIL | 3 | 50.00 | CIS | | C33 | MATEMAT. DISCRETAS | ABSOLUTAMENTE NECESARIO | 3 | 0.00 | CIS | | C44 | CIRCUITOS DIGITALES | AH HA! | 3 | 0.00 | CIS | | C55 | ARQUIT. COMPUTADORAS | MAQ. DE VON NEUMAN | 3 | 100.00 | CIS | | C66 | BASE D. RELACIONALES | IMPRESCINDIBLE | 3 | 500.00 | CIS | +-----+----------------------+-------------------------+------+---------+-------+

    Comentarios

    1. Lgica: El OR es inclusivo. Esto quiere decir que una fila ser seleccionada, en un caso especial, cuando cumpla las dos condiciones especificadas. Esto no puede ocurrir en el ejemplo que ahora nos ocupa, porque las dos condiciones especifican diferentes comparaciones de igualdad sobre el mismo campo CDEPT. La siguiente consulta-ejemplo ilustrar un caso en el que varias filas cumplen ambas condiciones.

    2. Sintaxis: Como en los anteriores ejemplos, el SQL permite gran flexibilidad. Las siguientes

    sentencias son equivalentes al ejemplo que ahora estamos tratando.

    SELECT * FROM CURSO WHERE CDEPT = 'CIS' OR CDEPT 'PHIL'; SELECT * FROM CURSO WHERE CDEPT = 'CIS' OR

    CDEPT = 'PHIL'; SELECT * FROM CURSO WHERE CDEPT = 'CIS' OR CDEPT = 'PHIL'; SELECT * FROM CURSO

    WHERE CDEPT = 'CIS' OR

    CDEPT = 'PHIL';

    3. Sintaxis: Ambas condiciones se refieren a la misma columna CDEPT. Sin embargo, como ocurra con el conector AND, esta columna debe aparecer especificada, explcitamente, cada condicin. Esto implica que la siguiente clusula WHERE no es vlida. WHERE CDEPT 'CIS' OR 'PHIL'

  • M

    ySQ

    L e

    s S

    oft

    ware

    Lib

    re

    6

    MMyySSQQLL BBssiiccoo

    4. El orden en que se especifiquen los nombres de columna no afecta a la ejecucin. Las siguientes clusulas WHERE compuestas se ejecutarn con la misma eficacia y producirn idntico resultado.

    WHERE CDEPT = 'CIS' OR CDEPT = 'PHIL' WHERE CDEPT = 'PHIL' OR CDEPT = 'CIS'

    Ejercicio

    5D. Obtener toda la informacin disponible sobre los cursos ofrecidos por los departamentos de Filosofa o de Teologa.

    La siguiente consulta-ejemplo presenta una situacin en la que es posible que un

    determinado registro cumpla las dos condiciones. Esto demuestra el comportamiento inclusivo del conector OR. Consulta-ejemplo 5.5: Obtener toda la informacin sobre cualquier curso CIS o cualquier curso con valor TARIFA igual a cero.

    mysql> SELECT * -> FROM CURSO -> WHERE CTARIFA = 0.00 -> OR CDEPT = 'CIS'; +-----+----------------------+-------------------------+------+---------+-------+ | CNO | CNOMBRE | CDESCP | CRED | CTARIFA | CDEPT | +-----+----------------------+-------------------------+------+---------+-------+ | T33 | HEDONISMO | PARA SANOS | 3 | 0.00 | THEO | | P44 | SOLIPSISMO | PARA MI MISMO | 6 | 0.00 | PHIL | | C11 | INTROD. A LOS CC | PARA NOVATOS | 3 | 100.00 | CIS | | C22 | ESTRUC. DE DATOS | MUY UTIL | 3 | 50.00 | CIS | | C33 | MATEMAT. DISCRETAS | ABSOLUTAMENTE NECESARIO | 3 | 0.00 | CIS | | C44 | CIRCUITOS DIGITALES | AH HA! | 3 | 0.00 | CIS | | C55 | ARQUIT. COMPUTADORAS | MAQ. DE VON NEUMAN | 3 | 100.00 | CIS | | C66 | BASE D. RELACIONALES | IMPRESCINDIBLE | 3 | 500.00 | CIS | +-----+----------------------+-------------------------+------+---------+-------+

    Comentarios Esta sentencia SELECT har que visualicemos cualquier fila que tenga un valor CTARIFA igual a cero o un valor CDEPT de CIS. Observemos que todos los cursos que tienen un valor CTARIFA igual a cero han sido seleccionados independientemente del departamento al que pertenezcan. Y todos los cursos CIS estn seleccionados sin tener en cuenta su valor CTARIFA. Adems, las filas que cumplen ambas condiciones sern tambin seleccionadas. Observe que una fila que cumpla

    las dos condiciones, como las filas con valores CNO de C33 y C44, slo aparecer en el output final. Ejercicio

    5E. Seleccionar la informacin disponible sobre todos los cursos que ofrezca el departamento

    de Teologa o que ofrezcan seis crditos.

  • M

    ySQ

    L e

    s S

    oft

    ware

    Lib

    re

    7

    MMyySSQQLL BBssiiccoo

    ORS MULTIPLES

    De la misma forma que el conector AND, es posible conectar cualquier nmero de condiciones usando conectores OR mltiples. El siguiente ejemplo presenta cuatro condiciones que estn

    conectadas mediante un OR. En este caso se seleccionar una fila si cumple cualquiera de las cuatro condiciones especificadas.

    Consulta-ejemplo 5.6: Obtener toda la informacin existente sobre cualquier curso que tenga un valor TARIFA igual a 50, 100, 150 200 dlares.

    mysql> SELECT * -> FROM CURSO -> WHERE CTARIFA = 50 -> OR CTARIFA = 100 -> OR CTARIFA = 150 -> OR CTARIFA = 200;

    +-----+----------------------+--------------------+------+---------+-------+ | CNO | CNOMBRE | CDESCP | CRED | CTARIFA | CDEPT | +-----+----------------------+--------------------+------+---------+-------+ | T11 | ESCOLASTICISMO | PARA BEATOS | 3 | 150.00 | THEO | | T44 | COMUNISMO | PARA AVAROS | 6 | 200.00 | THEO | | P11 | EMPIRISMO | VER PARA CREER | 3 | 100.00 | PHIL | | P22 | RACIONALISMO | PARA USUARIOS CIS | 3 | 50.00 | PHIL | | P33 | EXISTENCIALISMO | PARA USUARIOS CIS | 3 | 200.00 | PHIL | | C11 | INTROD. A LOS CC | PARA NOVATOS | 3 | 100.00 | CIS | | C22 | ESTRUC. DE DATOS | MUY UTIL | 3 | 50.00 | CIS | | C55 | ARQUIT. COMPUTADORAS | MAQ. DE VON NEUMAN | 3 | 100.00 | CIS | +-----+----------------------+--------------------+------+---------+-------+

    Comentarios

    1. En la prctica, no existe lmite en el nmero de condiciones que pueden conectarse mediante un OR.

    2. Observe que la columna CTARIFA debe ser mencionada explcitamente en cada una de las

    cuatro condiciones. La consulta-ejemplo 5.11 presentar el operador IN, que ofrece una forma ms compacta de expresar esta consulta.

    Ejercicio 5F. Obtener la informacin disponible sobre todos los cursos que tengan un valor TARIFA que

    se encuentre en el siguiente conjunto { 0.00, 90.00. 150.00).

    LA PALABRA RESERVADA NOT

    En los anteriores ejemplos se especificaban condiciones que identificaban, explcitamente, las filas

    que se iban a seleccionar para ser visualizadas. La siguiente consulta-ejemplo presenta el uso de la palabra reservada NOT, que permite indicar aquellas filas que no deseamos seleccionar para ser visualizadas.

    Consulta-ejemplo 5.7: Obtener el nombre de curso y la identificacin del departamento de todos los cursos que no sean ofrecidos por el departamento CIS.

  • M

    ySQ

    L e

    s S

    oft

    ware

    Lib

    re

    8

    MMyySSQQLL BBssiiccoo

    mysql> SELECT CNOMBRE, CDEPT -> FROM CURSO -> WHERE NOT CDEPT = 'PHIL';

    +----------------------+-------+ | CNOMBRE | CDEPT | +----------------------+-------+ | ESCOLASTICISMO | THEO | | FUNDAMENTALISMO | THEO | | HEDONISMO | THEO | | COMUNISMO | THEO | | INTROD. A LOS CC | CIS | | ESTRUC. DE DATOS | CIS | | MATEMAT. DISCRETAS | CIS | | CIRCUITOS DIGITALES | CIS | | ARQUIT. COMPUTADORAS | CIS | | BASE D. RELACIONALES | CIS | +----------------------+-------+

    Comentarios 1. Sintaxis: El operador NOT puede colocarse antes de cualquier expresin condicional vlida. El

    ejemplo que ahora vamos a tratar tiene una sola condicin que se niega usando NOT. El formato de la condicin WHERE es:

    WHERE NOT (expresin condicional)

    Posteriormente, veremos ejemplos ms complejos, donde se usa NOT junto con clusulas WHERE que contengan condiciones mltiples.

    2. La siguiente sentencia es equivalente al ejemplo actual. Usa el operador de comparacin

    especial no igual ( =) [Es ms utilizada la palabra NOT que el operador =].

    3. Evitar cometer el error comn de colocar el NOT antes que el operador de comparacin. La siguiente clusula WHERE no es vlida, porque el NOT precede inmediatamente al signo igual.

    En general, NOT no puede ser intercambiado con .

    4. Si usted est familiarizado con los puntos bsicos de la teora de conjuntos, puede ser muy til pensar en NOT como palabra clave que identifica el complemento de un subconjunto de filas

    de una tabla. La condicin (CDEPT = CIS) identifica, efectivamente, un subconjunto de filas de la tabla CURSO. Colocando un NOT delante de esta condicin, estamos pidiendo al sistema que seleccione el complementario de este subconjunto.

    Ejercicio 5G. Seleccionar el nmero de curso, nombre y TARIFA de todos los cursos con TARIFA distinta

    de 100.

    La siguiente consulta-ejemplo muestra una clusula WHERE con dos condiciones, cada una de las cuales es negada usando NOT y, por lo tanto, conectadas con AND. Clasificaremos esta clusula WHERE como compleja, debido a que, a diferencia de las clusulas WHERE vistas

    anteriormente, contiene dos operadores booleanos diferentes (NOT y AND). Nuestros comentarios sobre la lgica de esta consulta-ejemplo, sirven como preludio a la discusin posterior y detallada sobre la jerarqua de los operadores booleanos.

  • M

    ySQ

    L e

    s S

    oft

    ware

    Lib

    re

    9

    MMyySSQQLL BBssiiccoo

    Consulta-ejemplo 5.8: Obtener el nombre y la identificacin del departamento de todos los cursos, con la excepcin de aquellos cursos ofrecidos por los departamentos CIS y PHIL. mysql> SELECT CNOMBRE, CDEPT -> FROM CURSO -> WHERE NOT CDEPT = 'CIS' -> AND NOT CDEPT = 'PHIL';

    +-----------------+-------+ | CNOMBRE | CDEPT | +-----------------+-------+ | ESCOLASTICISMO | THEO | | FUNDAMENTALISMO | THEO | | HEDONISMO | THEO | | COMUNISMO | THEO | +-----------------+-------+

    Comentarios

    1. Esta es la primera consulta-ejemplo en la que hemos utilizado dos operadores booleanos

    diferentes (NOT y AND). Esto plantea la cuestin de la jerarqua de ejecucin que describiremos prximamente. Con respecto a nuestro ejemplo, notamos simplemente que el

    sistema evala el NOT antes que el AND. Esto significa que la clusula WHERE es el AND de dos condiciones negadas. Por lo tanto, el sistema seleccionar cualquier fila que rena ambas condiciones negadas. Si una fila tienen un valor CDEPT que no sea igual a CIS y que no sea igual a PHIL, ser seleccionada.

    2. Debemos, tambin, prestar atencin cuando realicemos consultas que usen distintos operados booleanos. Por ejemplo, mucha gente expresara el ejemplo que estamos tratando como:

    Seleccionar nombres de curso y departamentos para cursos que no sean ofrecidos por el departamento CIS o PHIL.

    Esta sentencia puede ser gramaticalmente correcta. Sin embargo, observe que usando or, en la anterior sentencia expresada en el idioma ingls, puede tentar al usuario poco exigente a colocar un OR en la clusula WHERE. La sentencia SELECT resultante (mostrada a continuacin) parece inocua en una primera inspeccin. Pero, si consideramos su significado exacto, observamos que es una forma muy poco inteligente de seleccionar todas las filas de la tabla CURSO.

    SELECT CNOMBRE, CDEPT FROM CURSO WRERE NOT CDEPT = 'CIS' OR NOT CDEPT = 'PHIL';

    Cualquier curso CIS sera seleccionado por la segunda expresin (NOT CDEPT = PHIL) y cualquier curso PHIL sera seleccionado por la primera expresin (NOT CDEPT = CIS).

    3. Observar que el problema identificado anteriormente y los subsiguientes problemas lgicos descritos en las pginas siguientes, estn nicamente indirectamente relacionados con el lenguaje SQL. La fuente primaria de tales problemas es el uso ambiguo del lenguaje natural o una falta de atencin a la semntica de los operadores booleanos. Esto afecta no slo al SQL, sino a todos los dems lenguajes de programacin.

  • M

    ySQ

    L e

    s S

    oft

    ware

    Lib

    re

    10

    MMyySSQQLL BBssiiccoo

    Ejercicio 5H. Seleccionar el nmero de curso y TARIFA de todos los cursos que tengan un valor TARIFA

    distinto de 100 y 200 dlares.

    JERARQUIA DE OPERADORES BOOLEANOS Siempre que una clusula WHERE contenga ms de dos condiciones que estn conectadas por diferentes operadores booleanos, el sistema debe decidir el orden de ejecucin. Si la clusula

    WHERE no contiene ningn parntesis, el sistema seguir una secuencia especfica. Esta secuencia est definida por la jerarqua siguiente:

    NOTs se evalan primero. ANDs se evalan en segundo lugar. ORs se evalan en ltimo lugar.

    Si el usuario ha programado en cualquier otro lenguaje, reconocer que sta es la misma

    jerarqua usada en ese lenguaje. Si el SQL es el primer lenguaje en el que programa, deber, entonces, prestar atencin a las consultas-ejemplo que aparecen a continuacin y que ilustran la jerarqua de los operadores booleanos.

    Consulta-ejemplo 5.9: Presentar toda la informacin disponible sobre los cursos de Teologa cuyo valor TARIFA sea cero o de cualquier curso (independientemente de su departamento y TARIFA) que tenga un valor de seis crditos. mysql> SELECT * -> FROM CURSO -> WHERE CDEPT = 'THEO' AND CTARIFA = 0 -> OR CRED = 6;

    +-----+------------+---------------+------+---------+-------+ | CNO | CNOMBRE | CDESCP | CRED | CTARIFA | CDEPT | +-----+------------+---------------+------+---------+-------+ | T33 | HEDONISMO | PARA SANOS | 3 | 0.00 | THEO | | T44 | COMUNISMO | PARA AVAROS | 6 | 200.00 | THEO | | P44 | SOLIPSISMO | PARA MI MISMO | 6 | 0.00 | PHIL | +-----+------------+---------------+------+---------+-------+

    Comentarios

    1. Lgica: Observar el efecto del AND que se evala antes del OR. Una fila dada se seleccionar,

    si cumple cualquiera de las dos condiciones siguientes.

    a. CDEPT = THEO AND CTARIFA = 0 b. CRED = 6

    El sistema examinar cada fila de la tabla CURSO. Si una fila determinada tiene tanto un valor CDEPT de THEO y un valor CTARIFA de 0, ser seleccionado. La primera fila (nmero de curso T33) es la nica fila que cumple esa condicin. Adems, si una fila dada tiene un valor CRED de 6, tambin ser seleccionada. Las dos ltimas filas (nmeros de curso T44 y P44) cumplen esa condicin. La tabla CURSO no contiene ninguna fila que cumpla las dos condiciones mencionadas arriba. Si existieran, tales filas habran sido

    seleccionadas.

  • M

    ySQ

    L e

    s S

    oft

    ware

    Lib

    re

    11

    MMyySSQQLL BBssiiccoo

    2. Sintaxis: No podemos cambiar arbitrariamente el orden de las condiciones. Consideremos la siguiente sentencia, que no es equivalente a la consulta-ejemplo.

    SELECT * FROM CURSO WHERE CDEPT = 'THEO' AND CRED OR TARIFA = 0;

    Esta consulta seleccionara cualquier curso de Teologa de seis crditos o cualquier curso

    con un valor TARIFA cero (independientemente de su departamento y crditos).

    3. Las dos siguientes sentencias son equivalentes al ejemplo que estamos tratando. La primera, reordena las condiciones sin afectar a la lgica. La segunda, hace uso de los parntesis que se explicaran en el prximo punto. Los parntesis son superfluos, pero facilitan la legibilidad.

    SELECT * FROM CURSO WRERE CRED = 6 OR CDEPT = 'THEO' AND CTARIFA = 0; SELECT * FROM CURSO WHERE (CDEPT = 'THEO' AND CTARIFA = 0) OR CRED = 6;

    USO DEL PARENTESIS El SQL permite el uso del parntesis para anular la jerarqua de los operadores booleanos. Los parntesis hacen explcito el orden de evaluacin y permiten la legibilidad. La siguiente consulta-ejemplo incorpora las tres condiciones empleadas en la consulta-ejemplo anterior. Esta vez empleamos los parntesis para cambiar el orden de evaluacin del sistema. Las dos condiciones adyacentes al OR estn incluidas entre parntesis. Esto implica que sern evaluadas primero. Notemos que el significado semntico de esta consulta-ejemplo es muy diferente al de la anterior. El nico cambio sintctico, el parntesis, cambia el significado semntico de la clusula WHERE. Consulta-ejemplo 5.10: Obtener toda la informacin sobre los cursos de Teologa que tengan un valor TARIFA = 0 o que valgan 6 crditos. mysql> SELECT * -> FROM CURSO -> WHERE CDEPT = 'THEO' -> AND (CTARIFA = 0 OR CRED = 6);

    +-----+-----------+-------------+------+---------+-------+ | CNO | CNOMBRE | CDESCP | CRED | CTARIFA | CDEPT | +-----+-----------+-------------+------+---------+-------+ | T33 | HEDONISMO | PARA SANOS | 3 | 0.00 | THEO | | T44 | COMUNISMO | PARA AVAROS | 6 | 200.00 | THEO | +-----+-----------+-------------+------+---------+-------+

    Comentarios 1. Lgica: Observemos que los parntesis hacen que la sentencia OR sea evaluadas antes que la

    sentencia AND. El efecto es que una fila dada ser seleccionada si cumple cualquiera de las siguientes condiciones.

    a. CDEPT = 'THEO' b. CTARIFA = 0 OR CRED = 6

  • M

    ySQ

    L e

    s S

    oft

    ware

    Lib

    re

    12

    MMyySSQQLL BBssiiccoo

    Por lo tanto, este ejemplo, a diferencia del anterior, slo seleccionar los cursos de Teologa. Y lo que es ms, estos cursos de Teologa deben cumplir, al menos, una de las condiciones CTARIFA = 0 o CRED = 6. Si observamos el resultado obtenido, vemos que la fila de curso nmero P44, que apareca en el ejemplo anterior, ahora no aparece. Esto se debe a

    que no es un curso de Teologa.

    2. Sintaxis: Las dos condiciones que estn conectadas mediante OR, dentro del parntesis, aparecen escritas en una lnea. Esto facilita la legibilidad, pero no es imprescindible. La siguiente consulta es equivalente al ejemplo actual.

    SELECT * FROM CURSO WHERE CDEPT = 'THEO' AND (CTARIFA = 0) OR CRED = 6

    3. Si observamos que deseamos obtener todos los cursos de Teologa de seis crditos, podramos

    haber escrito la siguiente sentencia equivalente: SELECT * FROM CURSO WHERE (CDEPT = 'THEO' AND CRED = 6) OR (CDEPT = 'THEO' AND CTARIFA = 0) Algunos programadores podran pensar que sentencia es una representacin ms explcita

    del objetivo de la consulta. Hay que destacar que los parntesis no son necesarios en esta sentencia. La jerarqua, por defecto, producir el mismo resultado.

    4. Recomendacin general: Es mejor utilizar siempre parntesis, para hacer ms explcita la

    lgica de la clusula WHERE.

    Ejercicios

    5I. Seleccionar toda la informacin sobre los cursos de Filosofa de seis crditos, o de cualquier curso con un TARIFA que exceda $200 (independientemente de su identificacin de departamento o crditos).

    5J. Seleccionar toda la informacin disponible sobre todos los cursos de tres crditos cuya

    TARIFA sea menor de $100 o mayor de $300.

    JERARQUIA DE LA CLAUSULA NOT El orden de la jerarqua es NOT, seguida de AND, seguida por OR. Los ejemplos estn fuera de los objetivos de este curso. LA PALABRA RESERVADA IN La siguiente consulta-ejemplo presenta el uso de IN. Esta palabra permite pedir al sistema que seleccione una fila, si una determinada columna contiene alguno de los valores especificados.

    Consulta-ejemplo 5.11: Obtener el nmero curso, la descripcin y los crditos para cada curso que valga 2, 6 9 crditos.

  • M

    ySQ

    L e

    s S

    oft

    ware

    Lib

    re

    13

    MMyySSQQLL BBssiiccoo

    mysql> SELECT CNO, CDESCP, CRED -> FROM CURSO -> WHERE CRED IN (2, 6, 9);

    +-----+---------------+------+ | CNO | CDESCP | CRED | +-----+---------------+------+ | T44 | PARA AVAROS | 6 | | P44 | PARA MI MISMO | 6 | +-----+---------------+------+

    Comentarios

    1. Sintaxis: El conjunto de valores debe ser incluido entre parntesis, y cada valor debe ir separado por comas. Estos valores pueden ser numricos (como en el ejemplo actual) o caracteres. Los valores que estn expresados en forma de caracteres deben ir incluidos entre comillas simples. (Ver la siguiente consulta-ejemplo). Los valores que aparecen en el ejemplo que ahora estamos estudiando estn escritos en orden. Esto facilita la legibilidad, pero no es un requisito imprescindible. En la prctica, no hay lmite en el nmero de valores que comprende el conjunto a comparar. (Sin embargo, en el MySQL, deben especificarse al menos dos valores en el conjunto a comparar).

    2. Aunque la palabra IN es til, es al mismo tiempo superflua. Esto se debe a que cualquier condicin que use IN puede ser reemplazada por una secuencia equivalente de condiciones OR. La sentencia siguiente es equivalente al ejemplo que ahora estamos tratando.

    SELECT CNO, CDESCEP, CRED FROM CURSO WHERE CRED = 2 OR CRED = 6 OR CRED = 9

    Ejercicio 5M. Obtener toda la informacin disponible sobre cualquier curso que tenga un valor TARIFA

    igual a cualquiera de los valores contenidos en el siguiente conjunto de valores:

    {12.12, 50.00, 75.00, 90.00, 100.00, 500.00} NOT IN

    La siguiente consulta presenta el uso de la frase NOT IN, que es la opuesta de IN. NOT IN pide al sistema que seleccione una fila, si un valor de una columna dada contiene algn valor distinto de cero especificado en un conjunto de valores. Consulta-ejemplo 5.12: Obtener el nmero de curso, descripcin e identificacin de departamento de todos los cursos que no dependan de los departamentos de Teologa o Informtica (CIS).

  • M

    ySQ

    L e

    s S

    oft

    ware

    Lib

    re

    14

    MMyySSQQLL BBssiiccoo

    mysql> SELECT CNOMBRE, CDESCP, CDEPT -> FROM CURSO -> WHERE CDEPT NOT IN ('THEO', 'CIS');

    +-----------------+-------------------+-------+ | CNOMBRE | CDESCP | CDEPT | +-----------------+-------------------+-------+ | EMPIRISMO | VER PARA CREER | PHIL | | RACIONALISMO | PARA USUARIOS CIS | PHIL | | EXISTENCIALISMO | PARA USUARIOS CIS | PHIL | | SOLIPSISMO | PARA MI MISMO | PHIL | +-----------------+-------------------+-------+

    Comentarios

    1. Lgica: La frase NOT IN, como la IN, es til, pero superflua. El actual ejemplo podra haber

    contenido cualquiera de las siguientes clusulas WHERE equivalentes. WHERE NOT CDEPT = 'THEO' AND NOT CDEPI = 'CIS' WHERE CDEPT 'THEO' AND CDEPT 'CIS' WHERE NOT (CDEPT = THEO OR CDEPT = CIS)

    Se puede colocar un NOT antes de una condicin que contenga IN. La siguiente clusula WHERE tambin es equivalente al ejemplo que ahora estamos estudiando. Observe que NOT

    aparece antes que CDEPT en lugar de IN. WHERE NOT CDEPT IN ('THEO', 'CIS')

    El uso de NOT IN parece ser ms compacto y comprensible.

    2. Sintaxis: Debido a que CDEPT contiene datos en forma de caracteres, los valores especificados (THEO, CIS) deben ser incluidos entre apstrofos y el sistema realizar la comparacin carcter a carcter.

    3. En esta ocasin, tampoco podemos sustituir el smbolo por la palabra reservada NOT.

    Ejercicio 5N. Obtener toda la informacin disponible sobre todos los cursos en los que TARIFA no sea

    uno de los siguientes valores: {12.12, 50.00, 75.00, 90.00, 100.00, 500.00)

    LA PALABRA RESERVADA BETWEEN La siguiente consulta-ejemplo ilustra el uso de BETWEEN para identificar un rango de valores. Una

    fila ser seleccionada, si una determinada columna tiene un valor que se encuentre dentro del rango especificado. Consulta-ejemplo 5.13: Obtener el nombre de curso y TARIFA de todos los cursos con una

    TARIFA que se encuentre entre 100 y 200 dlares, incluyendo ambos valores.

  • M

    ySQ

    L e

    s S

    oft

    ware

    Lib

    re

    15

    MMyySSQQLL BBssiiccoo

    mysql> SELECT CNOMBRE, CTARIFA -> FROM CURSO -> WHERE CTARIFA BETWEEN 100.00 AND 200.00;

    +----------------------+---------+ | CNOMBRE | CTARIFA | +----------------------+---------+ | ESCOLASTICISMO | 150.00 | | COMUNISMO | 200.00 | | EMPIRISMO | 100.00 | | EXISTENCIALISMO | 200.00 | | INTROD. A LOS CC | 100.00 | | ARQUIT. COMPUTADORAS | 100.00 | +----------------------+---------+

    Comentarios 1. Observemos que BETWEEN, realmente, significa entre e incluidos. El sistema seleccionar

    filas que coincidan con los valores extremos.

    2. La palabra reservada BETWEEN es tambin superflua. Siempre podemos formular una clusula WHERE equivalente usando el conector AND. La clusula WHERE que estamos tratando podra

    haber sido formulada de la siguiente forma: WHERE CTARIFA > = 100.00 AND CTARIFA < = 200.00

    Observemos que el mtodo anterior requiere que se especifique el nombre de columna (CTARIFA) en ambas expresiones condicionales. El uso de la frase BETWEEN AND ofrece otro mtodo que podra ser preferido por otros usuarios.

    3. Aunque gramaticalmente es correcto expresar donde TARIFA est entre 200 y 100, no sera muy inteligente expresar la siguiente clusula WHERE. WHERE CTARIFA BETWEEN 200.00 AND 100.00

    El sistema interpretara esta clusula como la siguiente clusula conectada mediante AND, lo cual siempre producira una situacin sin solucin.

    WHERE CTARIFA > = 200.00 AND CTARIFA < = 100.00

    No existe un nmero que sea mayor que 200 y menor que 100. Por lo tanto, cuando se use BETWEEN, hay que referenciar siempre primero el menor valor, tal y como ilustra el ejemplo.

    Ejercicio 5O. Obtener el nmero de curso y TARIFA para todos los cursos que tengan un valor TARIFA

    que se encuentre entre 50.00 y 400.00 dlares.

    NOT BETWEEN

    La sentencia NOT BETWEEN se usa para seleccionar filas, cuando un valor para una columna dada

    se encuentra fuera del rango especificado. La siguiente consulta-ejemplo es la inversa de la anterior. Seleccionar todas las filas de la tabla CURSO que no aparecan en el resultado anterior.

  • M

    ySQ

    L e

    s S

    oft

    ware

    Lib

    re

    16

    MMyySSQQLL BBssiiccoo

    Consulta-ejemplo 5.14: Obtener el nombre de curso y TARIFA de todos los cursos que tengan un valor TARIFA menor que $100 o mayor que $200. mysql> SELECT CNOMBRE, CTARIFA -> FROM CURSO -> WHERE CTARIFA NOT BETWEEN 100 AND 200;

    +----------------------+---------+ | CNOMBRE | CTARIFA | +----------------------+---------+ | FUNDAMENTALISMO | 90.00 | | HEDONISMO | 0.00 | | RACIONALISMO | 50.00 | | SOLIPSISMO | 0.00 | | ESTRUC. DE DATOS | 50.00 | | MATEMAT. DISCRETAS | 0.00 | | CIRCUITOS DIGITALES | 0.00 | | BASE D. RELACIONALES | 500.00 | +----------------------+---------+

    Comentarios

    1. Observe que la sentencia NOT BETWEEN excluir los valores extremos del resultado. Esto se debe a que es la negacin del resultado que se habra producido si hubiramos usado BETWEEN. (Ms formalmente, produce el complementario del conjunto identificado por la condicin BETWEEN).

    2. La siguiente clusula WHERE es equivalente a la del ejemplo actual.

    WEHERE CTARIFA < 100 OR CTARIFA > 200 Observemos que los operadores de comparacin son estrictamente mayor que y estrictamente menor que. Esto se debe a que la clusula NOT BETWEEN excluye los valores extremos de la seleccin.

    Al igual que cualquier expresin condicional, un NOT puede preceder a la condicin. Por lo tanto, podramos colocar el NOT antes del nombre de columna en lugar de codificar la frase NOT BETWEEN. De esta forma, la siguiente clusula WHERE es tambin equivalente a la del ejemplo que estamos ahora estudiando. WHERE NOT CTARIFA BETWEEN 100 AND 200

    3. La frase BETWEEN debe referenciar siempre el valor ms pequeo en primer lugar. Si furamos a introducir la siguiente clusula WHERE:

    WHERE CTARIFA NOT BETWEEN 200 AND 100

    el sistema la interpretara como:

    WHERE CTARIFA < 200 OR CTARIFA > 100

    Todos los valores deben cumplir esta condicin, lo que significa que todas las filas seran recuperadas. Este no es el objetivo de la consulta.

  • M

    ySQ

    L e

    s S

    oft

    ware

    Lib

    re

    17

    MMyySSQQLL BBssiiccoo

    Ejercicio 5P. Obtener el nmero de curso y TARIFA de todos los cursos con un valor TARIFA que sea

    menor que $50 o mayor que $400.

    La siguiente consulta-ejemplo muestra que BETWEEN puede usarse tambin para identificar un rango para datos expresados como cadenas de caracteres. Consulta-ejemplo 5.15: Obtener el nombre y TARIFA de todos los cursos con un nombre de

    curso que comience con la letra D o mayor. mysql> SELECT CNOMBRE, CTARIFA -> FROM CURSO -> WHERE CNOMBRE BETWEEN 'D' AND 'ZZZ';

    +--------------------+---------+ | CNOMBRE | CTARIFA | +--------------------+---------+ | ESCOLASTICISMO | 150.00 | | FUNDAMENTALISMO | 90.00 | | HEDONISMO | 0.00 | | EMPIRISMO | 100.00 | | RACIONALISMO | 50.00 | | EXISTENCIALISMO | 200.00 | | SOLIPSISMO | 0.00 | | INTROD. A LOS CC | 100.00 | | ESTRUC. DE DATOS | 50.00 | | MATEMAT. DISCRETAS | 0.00 | +--------------------+---------+

    Comentarios

    1. Recordemos que el cdigo EBCDIC define la secuencia de caracteres para el MySQL. Esta

    secuencia se describi anteriormente en los comentarios de la Consulta-ejemplo 1.5. Si suponemos que no exista ningn nombre de curso que comience con D que sea mayor que DZZZ, este ejemplo recupera, en realidad, todos los cursos cuyo nombre comience con la letra D. Es importante entender la idea de la secuencia de caracteres. Notemos que si DZZZXXX fuera un nombre de curso real, no sera seleccionado por la sentencia SELECT, ya que es mayor que DZZZ.

    2. El objetivo de esta consulta es hacer que el sistema busque un modelo de cadena de caracteres en el campo CNAME. Este modelo es D, seguido de cualquier cadena. De hecho la palabra reservada LIKE ofrece un modo mucho ms adecuado para buscar modelos de cadenas de caracteres.

    Ejercicio

    5Q. Obtener el nombre de curso y la descripcin de todos los cursos cuya descripcin comience

    con la palabra FOR.

    El ltimo ejemplo de esta unidad no presenta ningn concepto o tcnica nueva. El nico propsito del mismo es demostrar que cualquiera de las tcnicas mencionadas anteriormente puede usarse dentro de una sentencia SELECT simple. La nica razn de que esta sentencia sea

  • M

    ySQ

    L e

    s S

    oft

    ware

    Lib

    re

    18

    MMyySSQQLL BBssiiccoo

    ms larga que las anteriores es la relativa complejidad del objetivo de la consulta. Examinar cada lnea del cdigo dentro de la sentencia y observar que cada una implementa una construccin del lenguaje SQL presentada anteriormente en este curso.

    Consulta-ejemplo 5.16: Obtener la identificacin de departamento, nombre de curso y TARIFA de cualquier curso dependiente de los departamentos CIS o THEO que valga tres crditos y que tenga un TARIFA entre $50 y $300, ambos inclusive. Presentar el resultado por nombre de curso, dentro de la secuencia de identificacin de departamento (ascendente). mysql> SELECT CDEPT, CNOMBRE, CTARIFA -> FROM CURSO -> WHERE CDEPT IN ('CIS', 'THEO') -> AND CTARIFA BETWEEN 50 AND 300 -> AND CRED = 3 -> ORDER BY CDEPT, CNOMBRE;

    +-------+----------------------+---------+ | CDEPT | CNOMBRE | CTARIFA | +-------+----------------------+---------+ | CIS | ARQUIT. COMPUTADORAS | 100.00 | | CIS | ESTRUC. DE DATOS | 50.00 | | CIS | INTROD. A LOS CC | 100.00 | | THEO | ESCOLASTICISMO | 150.00 | | THEO | FUNDAMENTALISMO | 90.00 | +-------+----------------------+---------+

    Ejercicio 5R. Seleccionar la identificacin de departamento, nmero de curso y descripcin de todos los

    cursos de Informtica o Teologa que tengan una TARIFA que sea menor que $100 o mayor que $400. Presentar el resultado por nmero de curso, dentro del departamento.

    BIBLIOGRAFIAS

    1. FUNDAMENTOS DE BASES DE DATOS. Abraham S. Henry F. Cuarta edicin. McGraw-Hill. Mxico. 2008.

    2. Beginning Oracle SQL. Oracle Lex de Haan Et.Al Apress. USA. 2009.

    3. http://dev.mysql.com/doc/refman/5.6/en/ MySQL 5.6 Reference Manual