Você está na página 1de 13

Unidad 4

Subconsultas

[MySQL Intermedio]
De Intecap-TICS
[En MysQL se pueden realizar consultas ms complejas incluyendo una consulta dentro de otra consulta; los Objetivos de la Unidad son adquirir las competencias de los siguientes contenidos.]

Unidad 4

MySQL Intermedio
Subconsultas Esta unidad presenta la tcnica de anidar una sentencia SELECT dentro de otra. La Figura 4.1 muestra la estructura bsica de una sentencia SELECT que contiene otra sentencia SELECT anidada dentro. La sentencia SELECT anidada se denomina subconsulta o subselect, o SELECT interna. Nos referiremos a la primera SELECT como consulta principal o SELECT externa. La mayora de las consultas modelo presentadas en esta unidad se pueden resolver utilizando la operacin join. Sin embargo, el uso de subconsultas es considerado, a menudo, para proporcionar soluciones ms sencillas. Hay algunas circunstancias en que la utilizacin de una subconsulta se hace necesaria. Tambin es importante mencionar que existen otro tipo de subconsultas llamadas subconsultas correlacionadas, pero su exposicin esta fuera de los objetivos de este curso. BACKGROUND Primero examinaremos una consulta sencilla, que no podra ser expresada adecuadamente en una sentencia SELECT sencilla, dadas las tcnicas SQL bsicas de consultas. Consulta 1: Visualizar el nmero y nombre del/de los curso/s con la tarifa ms elevada. Recuerde que es fcil visualizar la tarifa ms elevada. Esto se consigue ejecutando la siguiente sentencia: SELECT MAX (CTARIFA) FROM CURSO; El sistema devolver 500.00, lo que nos permite escribir la siguiente sentencia: SELECT CNO, CNOMBRE FROM CURSO WHERE CTARIFA = 500.00; Aunque este procedimiento funciona, requiere la ejecucin de dos sentencias SELECT independientes. No resulta cmodo, por las mismas razones que explicbamos antes, cuando discutamos la operacin join. Recuerde que la siguiente sentencia no funciona:

MySQL es Software Libre

SELECT CNO, CNOMBRE, MAX(CTARIFA) FROM CURSO; Puesto que la clusula SELECT contiene una funcin construida MAX(CTARIFA), y las otras columnas, CNO y CNOMBRE, deben estar referenciadas en una clusula GROUP BY. El problema bsico es que no sabemos cul es el valor de la mxima CTARIFA. Esencialmente queremos construir una clusula WHERE para un valor desconocido. Esto representa una clase de consulta en donde una subconsulta puede ser utilizada para determinar un valor desconocido. Una segunda razn para utilizar una subconsulta es evitar la codificacin explcita de una operacin join para una consulta que requiere examinar varias tablas, pero visualizar slo columnas de una de ellas. La siguiente consulta ilustra esta situacin.

MySQL Intermedio
Consulta 2: Visualizar el nombre y cargo de cada miembro del personal que trabaja en el edificio Humanidades. La Consulta modelo 3.4 present una solucin a esta consulta al hacer join con las tablas DEPARTAMENTO y PERSONAL. Era as: SELECT FROM WHERE AND ENOMBRE, CARGO PERSONAL, DEPARTAMENTO PERSONAL.DEPT = DEPARTAMENTO.DEPT DBLD = 'HU';

Puesto que las columnas visualizadas, ENOMBRE y CARGO, estn en una tabla simple, la tabla PERSONAL, es posible codificar una solucin de subconsulta a este problema. La Consulta modelo 4.8 representar esta solucin. Muchos usuarios preferirn esta solucin, puesto que evita las complejidades lgicas asociadas a la operacin join. Las consultas modelo presentadas en esta unidad emplean soluciones de subconsulta para solucionar diferentes problemas. Los primeros siete ejemplos presentan subconsultas que producen un nico valor. El ejemplo que queda contiene subconsultas que pueden producir varios valores. Veremos cmo usted deber estar al tanto de si una subconsulta puede producir ms de un solo valor.

Figura 4.1. Subconsulta de tendencia SELECT. Subconulta: La clusula WHERE examina un valor desconocido Las siete primeras consultas modelo de esta unidad tienen una clusula WHERE que compara una columna con un valor simple desconocido. Este valor desconocido se averigua con una subconsulta anidada. Despus de evaluar la subconsulta, se devuelve su resultado a la clusula WHERE de la consulta principal, que es entonces evaluada para determinar qu filas deberan ser seleccionadas para su visualizacin. Modelo de consulta 4.1: Visualiza el nmero y nombre/s del/de los curso/s con mxima tarifa. mysql> -> -> -> -> SELECT CNO, CNOMBRE FROM CURSO WHERE CTARIFA = (SELECT MAX(CTARIFA) FROM CURSO); +-----+----------------------+ | CNO | CNOMBRE | +-----+----------------------+ | C66 | BASE D. RELACIONALES | +-----+----------------------+

MySQL es Software Libre

MySQL Intermedio
Comentarios 1. Lgica: El sistema ejecutar primero la subconsulta. En este caso, encontrar el valor mximo de tarifa de 500.00 y sustituir este valor en la clusula contener una clusula WHERE de la consulta principal. La consulta principal se convertira entonces: SELECT CNO, CNOMBRE FROM CURSO WHERE CTARIFA = 500.00; La consulta principal se ejecuta entonces y se visualiza el resultado. Observe que no se visualiza el resultado de la subconsulta (500.00). Slo se sustituye en la clusula WHERE de la consulta principal. Si tambin quiere visualizar el valor de la tarifa mxima, incluira CTARIFA en la clusula SELECT de la consulta principal. La sentencia completa sera: SELECT CNO, CNOMBRE, CTARIFA FROM CURSO WHERE CTARIFA = (SELECT MAX(CTARIFA) FROM CURSO); 2. Sintaxis: La subconsulta debe estar entre parntesis. La clusula WHERE, en la consulta principal, lleva un signo igual. En realidad, se establece donde CTARIFA es igual a algn valor (no valores). Puesto que se escribe la clusula WHERE para comparar la CTARIFA con un valor simple, la subconsulta debe ser codificada para que en ella slo se devuelva un nico valor. En este ejemplo, la subconsulta devuelve el valor mximo de tarifa, el cual es un valor nico (500.00). Observe que esto ocurrira aun cuando varias filas CURSO contuviesen el mismo valor mximo. Por casualidad tanto la consulta principal como la subconsulta, hacen referencia a la misma tabla CURSO. Esto no es necesario, ni siempre ser as!. Como en todas las sentencias SQL anteriores, el formato es libre. Y la identificacin es arbitraria. Ejercicio

MySQL es Software Libre

4A. Visualiza el nmero, nombre y departamento del/de los curso/s con la mnima tarifa. Subconsulta que contiene una clusula WHERE Para delimitar an ms el resultado de la consulta principal, la subconsulta podra contener una clusula WHERE que excluyera ciertas filas, Una subconsulta puede contener cualquier clusula WHERE vlida. Modelo de consulta 4.2: Visualiza el nmero, nombre y tarifa del/de los curso/s con la mnima tarifa, que no sea cero. mysql> SELECT CNO, CNOMBRE, CTARIFA -> FROM CURSO -> WHERE CTARIFA = -> (SELECT MIN(CTARIFA) -> FROM CURSO -> WHERE NOT CTARIFA = 0);

MySQL Intermedio
+-----+------------------+---------+ | CNO | CNOMBRE | CTARIFA | +-----+------------------+---------+ | P22 | RACIONALISMO | 50.00 | | C22 | ESTRUC. DE DATOS | 50.00 | +-----+------------------+---------+ Comentarios 1. Lgica: La clusula WHERE, en la subconsulta, excluir cero como valor mnimo, Asumiendo que no hay valores negativos para tarifas, la subconsulta devolver la mnima tarifa positiva a la clusula WHERE de la consulta principal. La consulta principal seleccionar filas basndose en este valor. La salida visualizar este valor despus del nmero y nombre de cualquier curso que tuviera este valor por tarifa. Esta clusula WHERE es sencilla. Tiene slo una condicin. En general, la clusula WHERE puede incluir cualquier nmero de condiciones conectadas con operadores booleanos. 2. La clusula WHERE de la subconsulta podra haber sido escrita como WHERE CTARIFA > 0 Esto eliminara cualquier problema en cuanto a posibles tarifas con valor negativo. 3. Sintaxis: No existen requerimientos especiales de sintaxis. La subconsulta es una sentencia SELECT estndar encerrada entre parntesis. Ejercicio 4B. Asumiremos que ya sabe que la mxima tarifa es 500.00. Escriba una sentencia SELECT que visualice el nmero, nombre, departamento, y tarifa del/de los curso/s que tienen la segunda tarifa ms alta.

El siguiente modelo de consulta incluye la misma clusula WHERE, tanto en la consulta principal como en la subconsulta. La lgica de la consulta nos fuerza a codificar de esta manera. Una vez ms, vemos que, aunque SQL es sencillo, la lgica de una consulta puede ser compleja.

MySQL es Software Libre

Modelo de consulta 4.3: Visualizar el nmero y nombre del/de los cursos de Filosofa con la mxima tarifa. mysql> -> -> -> -> -> -> SELECT FROM WHERE AND CNO, CNOMBRE CURSO CDEPT = 'PHIL' CTARIFA = (SELECT MAX(CTARIFA) FROM CURSO WHERE CDEPT = 'PHIL'); +-----+-----------------+ | CNO | CNOMBRE | +-----+-----------------+ | P33 | EXISTENCIALISMO | +-----+-----------------+

MySQL Intermedio
Comentarios 1. Lgica: La subconsulta determina la mxima tarifa para cualquier curso de Filosofa. Este valor (200.00) se sustituye en la clusula WHERE de la consulta principal. Por lo tanto, la sentencia se reduce a: SELECT FROM WHERE AND CNO, CNOMBRE, CTARIFA CURSO CDEPT = 'PHIL' CTARIFA = 200.00;

Tanto la consulta principal, como la subconsulta, deben contener la misma condicin (WHERE CDEPT = 'PHTL') con el fin de restringir los cursos visualizados a aquellos ofrecidos por el departamento de Filosofa. Esto podra parecer redundante, pero no lo es. Considere el caso de excluir la condicin WHERE, tanto de la consulta principal como de la subconsulta. SELECT FROM WHERE AND CNO, CNOMBRE CURSO CDEPT = 'PHIL' CTARIFA = (SELECT MAx(CTARIFA) FROM CURSO WHERE CDEPT = 'PHIL');

Esta sentencia visualiza todos los cursos con una tarifa de 200.00. En particular, visualizara la fila del curso de Teologa T44. Esto no es consistente con el objetivo de visualizar slo los cursos de filosofa. La siguiente sentencia tambin es incorrecta, pero por una razn diferente. SELECT FROM WHERE AND CNO, CNOMBRE CURSO CDEPT = 'PHIL' CTARIFA = (SELECT MAX (CTARIFA) FROM CURSO);

Esta sentencia no tiene xito porque la subconsulta evala a 500.00, y la consulta principal determina que ningn curso de Filosofa tiene una tarifa igual a este valor.

MySQL es Software Libre

2. Sintaxis: La subconsulta es, simplemente, otra condicin que est conectada por AND a la clusula WHERE de la consulta principal. Las subconsultas no tienen que ser escritas al final. La siguiente sentencia es correcta. SELECT CNO, CNOMBRE, CTARIFA FROM CURSO WHERE CTARIFA = (SELECT MAX(CTARIFA) FROM CURSO WHERE CDEPT = 'PHIL') AND CDEPT 'PHIL'; Ejercicio 4C. Visualiza el nmero de curso, nombre, departamento, y tarifa del curso/s de seis crditos con mayor tarifa.

La lgica del modelo de consulta anterior requera que la misma clusula WHERE estuviera tanto, en la consulta principal como en la subconsulta. No siempre es este el caso. Hace falta ser sensible al objeto de la consulta y la lgica para alcanzar el objetivo. Una vez ms, este es un
6

MySQL Intermedio
tema que trasciende a las reglas sintcticas relativamente simples de SQL (o al de cualquier otro lenguaje de computacin). Los dos prximos modelos de consulta demuestran este punto. Tienen diferentes objetivos, pero son lo suficientemente parecidos para que pueda existir una ambigedad, a menos que los objetivos sean articulados y comprendidos con exactitud. Modelo de consulta 4.4: Visualizar el nmero y nombre de algn curso de CIS con la mnima tarifa. (Esta es la menor tarifa registrada en la tabla CURSO, que incluye filas para cursos CIS). mysql> -> -> -> -> -> SELECT FROM WHERE AND CNO, CNOMBRE CURSO NOT CDEPT = 'CIS' CTARIFA = (SELECT MIN(CTARIFA) FROM CURSO); +-----+------------+ | CNO | CNOMBRE | +-----+------------+ | T33 | HEDONISMO | | P44 | SOLIPSISMO | +-----+------------+ Comentario El Modelo de consulta examina los cursos ofrecidos por cada departamento, incluyendo CIS, para determinar la tarifa mnima. Sin embargo, debido la clusula WHERE de la consulta principal, la salida no contendr ningn curso CIS con esta tarifa mnima. Observe la diferencia entre este ejemplo y el modelo de consulta 4.5, que tiene una clusula WHERE tanto en la consulta principal como en la subconsulta. Modelo de consulta 4.5: No consideraremos los cursos CIS. Visualizar el nmero y nombre del/de los curso/s con la menor tarifa. mysql> -> -> -> -> -> -> SELECT FROM WHERE AND CNO, CNOMBRE CURSO NOT CDEPT = 'CIS' CTARIFA = (SELECT MIN(CTARIFA) FROM CURSO WHERE NOT CDEPT = 'CIS'); +-----+------------+ | CNO | CNOMBRE | +-----+------------+ | T33 | HEDONISMO | | P44 | SOLIPSISMO | +-----+------------+ Comentario Este resultado es el mismo que en la consulta anterior. Sin embargo, es importante observar que es slo una coincidencia. Sucedi porque los contenidos actuales de la tabla CURSO tienen filas CIS y no-CIS con la misma tarifa mnima de cero.
7

MySQL es Software Libre

MySQL Intermedio
Supongamos que la tabla CURSO estuviera actualizada de modo que los cursos T33 y P44 tuvieran tarifas de 5.00. Esto quiere decir que ni el departamento de Filosofa ni el de Teologa tendrn cursos con tarifa cero. Bajo esta circunstancia, la diferencia entre las dos consultas anteriores sera apreciable en los resultados visualizados. El modelo de consulta 4.4 resultara un fracaso, puesto que ninguno de los cursos no-CIS tiene la tarifa mnima de cero. Sin embargo, el modelo de consulta 4.5 visualizara las mismas dos filas para los cursos T33 y P44. Todos los ejemplos de subconsultas anteriores mostraban la clusula WHERE de la subconsulta principal con un operador de comparacin igual. En la prctica, se puede utilizar cualquiera de los otros operadores de comparacin (<, >, < =, >=, < >). El siguiente modelo de consulta utiliza el operador menor que al comparar el resultado interme dio producido por la subconsulta. Modelo de consulta 4.6: Visualizar el nmero, nombre y tarifa de cualquier curso con tarifa menor que la media. mysql> SELECT CNO, CNOMBRE, CTARIFA -> FROM CURSO -> WHERE CTARIFA < -> (SELECT AVG(CTARIFA) FROM CURSO); +-----+----------------------+---------+ | CNO | CNOMBRE | CTARIFA | +-----+----------------------+---------+ | T12 | FUNDAMENTALISMO | 90.00 | | T33 | HEDONISMO | 0.00 | | P11 | EMPIRISMO | 100.00 | | P22 | RACIONALISMO | 50.00 | | P44 | SOLIPSISMO | 0.00 | | C11 | INTROD. A LOS CC | 100.00 | | C22 | ESTRUC. DE DATOS | 50.00 | | C33 | MATEMAT. DISCRETAS | 0.00 | | C44 | CIRCUITOS DIGITALES | 0.00 | | C55 | ARQUIT. COMPUTADORAS | 100.00 | +-----+----------------------+---------+ Comentarios

MySQL es Software Libre

1. La cl usula WHERE, de la consulta principal, contiene un operador de comparacin menor que. Se permite cualquier operador de comparacin vlido. 2. La subconsulta hace referencia a la funcin construida AVG, sta devuelve un valor simple, que se utiliza como valor de comparacin en la clusula WHERE de la consulta principal. Debido a que la tarifa media es 110.00, consulta principal se reduce a: SELECT CNO, CNOMBRE, CTARIFA FROM CURSO WHERE CTARIFA < 110.00 Ejercicios 4D. 4E. Visualiza el nmero de curso, nombre y tarifa de cualquier curso con una tarifa menor que la media de los cursos ofrecidos por el departamento de Teologa. Visualizar toda la informacin acerca de cualquier curso con una tarifa que exceda a la mxima de cualquiera de los cursos de Filosofa o Teologa.
8

MySQL Intermedio
Todos los ejemplos anteriores representaban subconsultas que hacan referencia a la misma tabla que la consulta principal. Aunque esto es lo ms frecuente, no es imprescindible. En el prximo ejemplo, la consulta principal y la subconsulta hacen referencia a dos tablas diferentes. Para comprender las bases de esta consulta, supondremos que pueda ser una mala poltica tener una tarifa de curso mayor o igual que el sueldo de cualquier miembro del personal. Modelo de consulta 4.7: Visualizar el nmero, nombre y tarifa de cualquier curso que tenga una tarifa mayor o igual al sueldo de cualquier miembro del personal. mysql> SELECT CNO, CNOMBRE, CTARIFA -> FROM CURSO -> WHERE CTARIFA >= -> (SELECT MIN(ESUELDO) -> FROM PERSONAL); +-----+----------------------+---------+ | CNO | CNOMBRE | CTARIFA | +-----+----------------------+---------+ | T11 | ESCOLASTICISMO | 150.00 | | T12 | FUNDAMENTALISMO | 90.00 | | T44 | COMUNISMO | 200.00 | | P11 | EMPIRISMO | 100.00 | | P33 | EXISTENCIALISMO | 200.00 | | C11 | INTROD. A LOS CC | 100.00 | | C55 | ARQUIT. COMPUTADORAS | 100.00 | | C66 | BASE D. RELACIONALES | 500.00 | +-----+----------------------+---------+ Comentarios 1. La lgica determina el sueldo ms bajo pagado a cualquier miembro del personal y, despus, qu cursos, si los hay, tienen tarifas mayores o iguales a esta cantidad. 2. La consulta principal hace referencia a la tabla CURSO, y la subconsulta hace referencia a la tabla PERSONAL. La subconsulta devuelve el sueldo mnimo que, como valor numrico legtimo, puede compararse con los valores de tarifas en la consulta principal. Puesto que el mnimo valor SUELDO es 51, la consulta principal se reduce a: SELECT CNO, CNOMBRE, CTARIFA FROM CURSO WHERE CTARIFA >= 51 3. Existe una solucin alternativa a este problema utilizando el join theta pero su exposicin queda fuera de los objetivos de este curso. Ejercicios 4F. 4O. Visualizar el nombre y salario de cualquier empleado miembro del personal, cuyo sueldo sea menor o igual al de la mxima tarifa de curso. Visualizar toda la informacin acerca de cualquier curso de CIS con una tarifa menor que el sueldo medio de cualquiera asignado al departamento de Teologa.

MySQL es Software Libre

MySQL Intermedio
Subconsulta: La clusula WHERE examina valores desconocidos Todos los ejemplos anteriores de subconsulta y ejercicios de prctica implicaban una subconsulta que devolva un valor simple. El valor era sustituido en la clusula WHERE de la consulta principal. El formato bsico es: WHERE columna operador-comparacin valor-simple Las prximas consultas modelo ilustrarn subconsultas que pueden devolver mltiples valores para ser referenciados por la consulta principal. En vez de un simple operador de comparacin, la clusula WHERE utiliza el comando IN. WHERE columna IN conjunto-de-valores Permitir a la subconsulta devolver varios valores, aade a la utilizacin de la tcnica de la subconsulta una serie de problemas ms lejanos. Tambin permite soluciones SQL alternativas a algunos problemas que podran resolverse utilizando la operacin join. Modelo de Consulta 4.8: Visualizar el nombre y cargo de cada miembro del personal que trabaja en el edificio Humanidades. (Igual que en el Modelo de consulta 3.4). mysql> SELECT ENOMBRE, CARGO -> FROM PERSONAL -> WHERE DEPT IN -> (SELECT DEPT -> FROM DEPARTAMENTO -> WHERE DEDIF = 'HU'); +---------+------------+ | ENOMBRE | CARGO | +---------+------------+ | LUCAS | TITULAR 1 | | MARCOS | TITULAR 2 | | MATEO | TITULAR 3 | | DICK | PROFESOR 1 | | HANS | PROFESOR 2 | | JUAN | TITULAR 4 | +---------+------------+

MySQL es Software Libre

Comentarios 1. La lgica de este modelo de consulta es que la subconsulta examina la tabla DEPARTAMENTO para determinar qu departamentos estn localizados el edificio Humanidades. Entonces, la consulta principal examinar la tabla PERSONAL para determinar el nombre y cargo de los miembros del personal que trabajan en esos departamentos. 2. La subconsulta devolver los identificadores de departamento de los departamentos localizados en el edificio Humanidades. Estos sern THEO y PHIL. Estos valores sern sustituidos en la clusula WHERE, de la consulta principal, del siguiente modo: SELECT ENOMBRE, CARGO FROM PERSONAL WHERE DEPT IN ('THEO', 'PHIL') 3. Observe que, a diferencia de las subconsultas anteriores, se devuelven valores mltiples como resultado intermedio. Por esta razn, la clusula WHERE de la consulta
10

MySQL Intermedio
principal debe utilizar el comando IN. Si la clusula WHERE contena un signo igual, el resultado dar error. Esto es debido, despus de sustituir los valores de la subconsulta, a que la clusula sera WHERE DEPT = (THEO, PHIL). Esto no es vlido, pues to que los operadores de comparacin slo pueden aplicarse a un valor simple. 4. Este mismo problema fue resuelto utilizando la tcnica join en el Modelo de consulta 3.4. La razn de que la tcnica de la subconsulta se pueda aplicar, es que todas las columnas visualizadas provienen de una misma tabla (PERSONAL). Esta es la nica tabla referenciada en la consulta principal. Muchos usuarios encuentran la utilizacin de la subconsulta ms fcil de entender que la tcnica de join. Esto depende de las preferencias personales de cada uno, en cuanto al punto de vista de la resolucin de un problema lgico. (Deberemos anotar que, desde el punto de vista de la eficiencia de la mquina, las actuales versiones de MySQL se inclinan por la tcnica join). Ejercicio 4H. Visualizar el nombre de departamento y nmero facultativo del jefe de departamento de todos aquellos departamentos responsables de un curso de 6 crditos.

Se destac, en nuestra anterior explicacin de la operacin join, que, a veces, tienen lugar muchas coincidencias y pueden visualizarse filas duplicadas. En el Modelo de consulta 3.5 se daba este caso, en donde la misma fila era visualizada cuatro veces, usted, ya ha sido instruido en el uso del comando DISTINCT para evitar esta duplicacin. A continuacin, mostramos una solucin de subconsulta para el mismo modelo de consulta. Observe que esta solucin no contiene DISTINCT, sin embargo no se visualizan columnas duplicadas. Nuestros comentarios se centrarn en este punto. Modelo de consulta 4.9: Dnde puedo encontrar un TITULAR? Visualizar el edificio y la sala de cualquier departamento acadmico que emplee a un miembro del personal cuyo cargo contenga la cadena de caracteres TITULAR. mysql> SELECT DEDIF, DDESPACHO -> FROM DEPARTAMENTO -> WHERE DEPT IN -> (SELECT DEPT -> FROM PERSONAL -> WHERE CARGO LIKE 'TITULAR%');

MySQL es Software Libre

+-------+-----------+ | DEDIF | DDESPACHO | +-------+-----------+ | HU | 200 | +-------+-----------+ Comentarios 1. Por qu no se visualizaron las filas duplicadas? Considere el resultado intermedio devuelto por la subconsulta. Si fuera ejecutada como una consulta independiente, visualizara la siguiente tabla: THEO THEO THEO THEO

11

MySQL Intermedio
Esta tabla es interpretada por el sistema como un conjunto de cuatro valores de departamento. Estos mismos valores fueron sustituidos dentro de la clusula WHERE de la consulta principal, la consulta se evaluara como: SELECT DEDIFE, DDESPACHO FROM DEPARTAMENTO WHERE DEPT IN ('THEO', 'THEO', 'THEO', 'THEO') La ejecucin de la sentencia anterior visualizara la misma fila individual mostrada en la solucin de la subconsulta. La explicacin exacta implica el reconocimiento del hecho de que un conjunto matemtico no contiene elementos duplicados. SQL interpretara las cuatro ocurrencias de THEO como un valor. Por lo tanto, la consulta principal, realmente, se convertira en: SELECT DEDIF, DDESPACHO FROM DEPARTAMENTO WHERE DEPT IN ('THEO') 2. La solucin siguiente hace explcita la lgica al utilizar DISTINCT en la subconsulta. SELECT DEDIF, DDESPACHO FROM DEPARTAMENTO WHERE DEPT IN (SELECT DISTINCT DEPT FROM PERSONAL WHERE ECARGO LIKE 'TITULAR%'); La utilizacin de DISTINCT en una subconsulta es siempre superflua. Sin embargo, este no es el caso con la consulta principal. El siguiente modelo de consulta describe una situacin en donde DISTINCT debe estar presente en la clusula SELECT de la consulta principal. El prximo modelo de consulta utiliza DISTINCT en la clusula principal. Esto es necesario si suponemos que un miembro de la facultad podra ser jefe de ms de un departamento acadmico. Modelo de consulta 4.10: Visualizar el nmero facultativo de cualquier miembro de la facultad que sea jefe de algn departamento que ofrezca un curso de 6 crditos. No visualizar valores duplicados.

MySQL es Software Libre

mysql> SELECT DISTINCT DCHFNO -> FROM DEPARTAMENTO -> WHERE DEPT IN -> (SELECT CDEPT -> FROM CURSO -> WHERE CRED = 6); +--------+ | DCHFNO | +--------+ | 10 | | 60 | +--------+ Comentarios 1. En este ejemplo, la subconsulta devuelve los valores CDEPT de las filas de filas, en la tabla CURSO, que tienen un valor CRED de 6. Slo dos filas cumplen esta condicin. Sus valores CDEPT son THEO y PHIL. Por lo tanto, la consulta principal se evala como:
12

MySQL Intermedio
SELECT DISTINCT DCHFNO FROM DEPARTAMENTO WHERE DEPT IN ('THEO', 'PHIL') 2. El examen del contenido actual de la tabla DEPARTAMENTO revela que los valores DCHFNO no son nicos. (Hasta aqu, parece ser que ningn miembro de la facultad es jefe de ms de un departamento). Por lo tanto, el resultado habra sido el mismo si hubiese omitido DISTINCT en la clusula principal. Es importante sealar que esto ha sido, simplemente, suerte. Puesto que la poltica acadmica permite que un miembro del colegio dirija varios departamentos, es posible que para un mismo DCHFNO haya varias filas de la tabla DEPATAMENTO. Sin embargo, DISTINCT debera estar incluido dentro de la clusula SELECT de la consulta principal. Ejercicio 4I. Visualizar el nmero de curso y edificio de cualquier clase que sea impartida en el mismo edificio en donde trabaja el miembro del personal Dick. BIBLIOGRAFIAS 1. FUNDAMENTOS DE BASES DE DATOS. Abraham S. Henry F. Cuarta edicin. McGrawHill. 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

MySQL es Software Libre

13

Você também pode gostar