You are on page 1of 13

Unidad 1

Funciones Incorporadas

[MySQL Intermedio]
De Intecap-TICS
[Esta Unidad trata de sentencias SQL que se conocen como funciones incorporadas las cuales permiten hacer valoraciones de atributos en las tablas; los Objetivos de la Unidad son adquirir las competencias de los siguientes contenidos.]

Unidad 1

MySQL Intermedio
Funciones incorporadas En el curso bsico de MySQL se presentaron las expresiones aritmticas que permiten realizar clculos con datos seleccionados. Esta unidad contina con el mismo tema. Introducimos las funciones incorporadas SQL, que ofrecen utilidades adicionales de clculo y tambin permite tipos adicionales de procesamiento de datos seleccionados. El SQL tiene dos tipos de funciones incorporadas. El primero son las funciones de columna que operan sobre un grupo de filas y produce un solo valor descriptivo de una columna diseada para todas las filas en el grupo. El segundo, son las funciones escalares, que operan sobre filas individuales modificando los valores visualizados a partir de una columna especificada. La categora escalar se subdivide en funciones de conversin de tipos de datos, funciones de manejo de cadenas y funciones de fecha y hora. Esta unidad examinar todas las funciones de columna y la mayora, aunque no todas, de las funciones escalares. La Figura 1.1 presenta un esquema general de las funciones incorporadas del SQL.
Funciones de columna SUM AVG MIN MAX COUNT Funciones escalares Manipulacin de cadenas LENGTH SUBSTR VALUE Fecha/Hora DATE DAY DAYS MONTH YEAR TIME TI M ESTAMP MICROSECOND SECOND MINUTE HOUR CHAR

Conversiones de tipos de datos DECIMAL INTEGER FLOAT DIGITS HEX VARGRAPHIC

Figura 1.1. Funciones incorporadas SQL. FUNCIONES DE COLUMNA Una funcin de columna se usa para explorar una columna de valores seleccionados y realizar un clculo basado en esos valores. Las funciones de columnas son: AVG, SLM, MAX, MIN y COUNT.

MySQL es Software Libre

Las funciones de columna operan sobre grupos de filas, y generan una sola fila para cada grupo. Al principio, consideraremos nicamente la tabla CURSO como un nico grupo. Las consultas-ejemplo de la 1.1 a la 1.8 seleccionarn filas de este grupo y, despus, aplicar las funciones de columna para producir un resultado consistente en una sola fila. Posteriormente, introducimos la clusula GROUP BY, que descompone las filas seleccionadas en grupos mltiples, y aplica la funcin a cada grupo por separado. FUNCION AVG La primera consulta-ejemplo aplica la funcin AVG a toda la tabla CURSO que se trata como un slo grupo. Consulta-ejemplo 1.1: Cul es el valor de TARIFA media para todos los cursos descritos en la tabla CURSO? mysql> SELECT AVG(CTARIFA) -> FROM CURSO;
2

MySQL Intermedio
+--------------+ | AVG(CTARIFA) | +--------------+ | 110.000000 | +--------------+ Comentario 1. Una funcin de columna proporciona un resultado expresado en el ltimo tipo de datos que la columna a la que se aplica. CTARIFA se ha definido como un valor decimal. Por lo tanto, el resultado producido por la funcin AVG es tambin decimal. 2. La funcin AVG se aplica a todos los valores CTARIFA en la tabla CURSO. Debido a que esta funcin debe realizar una divisin, el resultado aparecer por pantalla con la mxima precisin decimal de dgitos. 3. El resultado es un valor calculado, no un valor almacenado en la tabla. Por lo tanto, se aplican las mismas reglas que afectaban a las cabeceras de columna, como se hace con las columnas calculadas. 4. Notar que el valor que produce la funcin AVG es una fila nica. Por este motivo, no tiene sentido incluir una clusula ORDER BY para ordenar el resultado. Sin embargo, no producir un error. 5. En este ejemplo, el grupo procesado ha sido toda la tabla. Esto no es imprescindible. Una funcin de columna podra aplicarse a un subconjunto de filas, usando una clusula WHERE para formar un grupo ms pequeo. Veamos la siguiente consulta-ejemplo. FUNCIONES MIN Y MAX La consulta-ejemplo que aparece a continuacin, aplica funciones de columna mltiple a un grupo que es un subconjunto de filas de la tabla CURSO. Consulta-ejemplo 1.2: Cules son los valores TARIFA ms bajo y el ms alto para los cursos ofrecidos por el departamento de Filosofa? mysql> SELECT MIN(CTARIFA), MAX(CTARIFA) -> FROM CURSO -> WHERE CDEPT = 'PHIL'; +--------------+--------------+ | MIN(CTARIFA) | MAX(CTARIFA) | +--------------+--------------+ | 0.00 | 200.00 | +--------------+--------------+ Comentarios 1. La consulta demuestra que las funciones de columna pueden aplicarse a un subconjunto de la tabla, especificando los criterios de seleccin una clusula WHERE. 2. La clusula SELECT contiene funciones incorporadas mltiples, MIN y MAX, y ambas se aplican a la misma columna CTARIFA. Tambin es posible usar la misma funcin con diferentes columnas. Es, incluso, posible aplicar la misma funcin a la misma columna ms de una vez en una sola clusula SELECT.

MySQL es Software Libre

MySQL Intermedio
3. Observamos, tambin, que una funcin de columna produce un resultado expresado en el mismo tipo de datos que la columna a la que se aplica. La columna TARIFA se define como valor decimal. Por lo tanto, el resultado de las funciones MIN y MAX es tambin decimal. Es razonable preguntar por los valores ms grandes y ms pequeos de datos expresados en forma de caracteres. Por lo tanto, el sistema permitir que se apliquen las funciones MAX y MIN que contengan datos en forma de caracteres. Consulta-ejemplo 1.3: Cules son los nmeros de curso de los cursos con los valores ms grandes y ms pequeos en la columna CNO? En otras palabras, si los valores de la columna CNO se colocaran en orden alfabtico, cules seran los valores primero y ltimo? mysql> SELECT MIN(CNO), MAX(CNO) -> FROM CURSO; +----------+----------+ | MIN(CNO) | MAX(CNO) | +----------+----------+ | C11 | T44 | +----------+----------+ Comentarios 1. Cuando se usan MAX y MIN con datos en forma de caracteres, se usa el esquema de codificacin EBCDIC para determinar los valores mximos y mnimos. 2. No es razonable aplicar las funciones SUM y AVG a los datos en forma de caracteres. Por lo tanto, el sistema rechazar cualquier intento para realizarlo. Ejercicios 1A. 1B. Obtener los valores medios, mximos y mnimos de TARIFA, para todos los cursos CIS cuyo valor TARIFA no sea igual a cero. Obtener el nombre del primer curso que aparece en la secuencia alfabtica.

FUNCION COUNT (*)

MySQL es Software Libre

Las dos prximas consultas-ejemplo ilustran las variaciones de la funcin COUNT. La primera variacin, COUNT(*), determina el nmero de filas seleccionadas por una sentencia SELECT. Consulta-ejemplo 1.4: Cuntos cursos de Teologa estn registrados en la tabla CURSO? mysql> SELECT COUNT(*) -> FROM CURSO -> WHERE CDEPT = 'THEO'; +----------+ | COUNT(*) | +----------+ | 4 | +----------+

MySQL Intermedio
Comentarios 1. COUNT (*) simplemente cuenta el nmero de filas que cumplen los criterios de seleccin. El resultado es siempre un entero. 2. COUNT (*) es distinto de otras funciones de columna, en cuanto que no considera ningn valor dentro de las filas seleccionadas. Simplemente detecta la presencia de una fila que cumple los criterios de seleccin. FUNCION COUNT (DSTINCT) La segunda variacin de la funcin COUNT nos permite examinar los valores de una columna especificada, para determinar cuantos valores nicos aparecen en esa columna. Consulta-ejemplo 1.5: Cuntos departamentos acadmicos diferentes ofrecer cursos? mysql> SELECT COUNT(DISTINCT CDEPT) -> FROM CURSO; +-----------------------+ | COUNT(DISTINCT CDEPT) | +-----------------------+ | 3 | +-----------------------+ Comentario 1. La funcin incorporada COUNT (DISTINCT) se usa para determinar el nmero de valores nicos que existen en una columna concreta. A diferencia de COUNT (*), esta forma de la funcin COUNT debe examinar valores de columna. 2. El resultado nos informa de que existen tres departamentos diferentes que ofrecen cursos. (No conocemos los nombres de los departamentos o cuntos cursos ofrece cada departamento). Si un departamento ofrece ms de un curso, slo se cuenta una vez, debido a la palabra reservada DISTINCT. Esto es similar a la forma en que la palabra reservada DISTINCT eliminaba filas duplicadas del resultado de las consultas realizadas anteriormente. Ahora se utiliza para ignorar valores duplicados en el recuento realizado por la funcin COUNT.

MySQL es Software Libre

FUNCION SUM Consulta-ejemplo 1.6: Cul es la suma de todos los valores TARIFA de los cursos CIS? mysql> SELECT SUM(CTARIFA) -> FROM CURSO -> WHERE CDEPT = 'CIS'; +--------------+ | SUM(CTARIFA) | +--------------+ | 750.00 | +--------------+

MySQL Intermedio
Comentario Esta consulta muestra la funcin SUM, que permite sumar los valores de una columna numrica. En esta consulta, se han seleccionado las seis filas que identificaban los cursos ofrecidos por el departamento de Informtica. Sus valores TARIFA se han sumado, y el total aparece como resultado de la consulta. Ejercicio 1C. Cuntos cursos ofrece el departamento de Filosofa y cul es la TARIFA total para estos cursos?

USO DE DISTINCT Todas las funciones de columna permiten que la palabra clave DISTINCT se use como parte de la sentencia, haciendo, de esta forma, que slo se consideren los valores nicos. Cualquier valor que aparezca en ms de una fila, en la columna identificada se usar solamente una vez para producir la funcin resultado. La Consulta-ejemplo 1.5 ha demostrado ya el uso de DISTINCT con la funcin COUNT. La prxima consulta-ejemplo muestra el uso de DISTINCT con la funcin SUM. Consulta-ejemplo 1.7: Cul es el total de los valores TARIFA no duplicados para los cursos de Informtica? mysql> SELECT SUM(DISTINCT CTARIFA) -> FROM CURSO -> WHERE CDEPT = 'CIS'; +-----------------------+ | SUM(DISTINCT CTARIFA) | +-----------------------+ | 650.00 | +-----------------------+ Comentarios 1. El valor de salida (650.00) es el resultado de aplicar la funcin SUM a todos los valores CTARIFA distintos para filas que correspondan al departamento CIS. Si examinamos las filas CIS, observamos que existen dos cursos CIS que tienen el mismo valor TARIFA de 100.00. El efecto de especificar DISTINCT antes de CTARIFA en el argumento de la funcin es usar slo una vez este valor en el clculo. Esto justifica la diferencia entre el resultado mencionado anteriormente (650.00) y el que ofrece la anterior Consulta-ejemplo. 2. DISTINCT puede usarse con cualquier funcin de columna. Con la funcin AVG slo se consideran los valores distintos. Cuando se usa con las funciones MIN y MAX, no sirve para un propsito real, ya que los valores mximo y mnimo sern los mismos, incluso si existen valores duplicados en ms de una fila. USO DE LAS FUNCIONES INCORPORADAS CON EXPRESIONES ARITMETICAS Las funciones incorporadas pueden usarse para que el sistema ejecute clculos ms complejos. Se puede aplicar una funcin a una expresin o una expresin puede contener una funcin. Consulta-ejemplo 1.8: Obtener dos valores. El primero es la suma de todos los valores TARIFA, asumiendo que se han incrementado en $ 25. El segundo es el resultado de sumar $25 a la suma de todos los TARIFA.
6

MySQL es Software Libre

MySQL Intermedio
mysql> SELECT SUM(CTARIFA + 25), -> SUM(CTARIFA) + 25 -> FROM CURSO; +-------------------+-------------------+ | SUM(CTARIFA + 25) | SUM(CTARIFA) + 25 | +-------------------+-------------------+ | 1890.00 | 1565.00 | +-------------------+-------------------+ Comentarios 1. COL1: SUM(CTARIFA + 25) Esta consulta-ejemplo demuestra las posibilidades del uso de valores calculados. La expresin CTARIFA + 25, constituye el argumento de la funcin. El sistema incrementar cada CTARIFA en 25 y, despus, aplicar SUM a estos valores para determinar el resultado. 2. COL2: SUM(CTARIFA) + 25 Observar la diferencia entre este clculo y el anterior. Aqu, la funcin SUM se ejecut en primer lugar, usando slo CTARIFA como su argumento Este resultado intermedio (1540.00) se increment despus en 25, para producir el resultado definitivo. 3. Expresiones aritmticas complejas: No estamos limitados a expresiones con una sola columna y constante, sino que las funciones incorporadas pueden aplicarse a cualquier expresin aritmtica, con una excepcin importante. Una funcin de columna no puede usar una expresin como argumento, si esa expresin ya contiene una funcin de columna. En otras palabras, no podemos anidar una funcin de columna con otra. Ejercicio 1D. Supongamos que se van a calcular los nuevos valores de TARIFA a $50 para cada crdito. Cul sera el valor medio de TARIFA para los cursos que ofrece el departamento de Teologa? Obtener el resultado como valor decimal.

UN ERROR COMUN

MySQL es Software Libre

Las clusulas SELECT, en los ejemplos presentados anteriormente en esta unidad, contenan exclusivamente funciones incorporadas. Parece razonable que podamos necesitar que la salida contenga valores puros de una tabla, junto con algunos valores calculados producidos por una funcin incorporada. Por ejemplo, podramos desear calcular el valor medio de TARIFA para todos los departamentos acadmicos y, despus, cada valor junto con su nombre de departamento. Quiz, entonces, el programador pensara en codificar la sentencia siguiente para lograr este objetivo. SELECT CDEPT, AVG(CTARIFA) FROM CURSO; Esta sentencia produce un error. Observar que la clusula SELECT contiene un nombre de columna y una funcin incorporada. Esto no est permitido, a menos que el nombre de columna se referencie con una clusula GROUP BY. La siguiente seccin presentar la clusula GROUP BY.

MySQL Intermedio
CLAUSULA GROUP BY El SQL ofrece la posibilidad de formar grupos ms pequeos a partir de las filas de toda la tabla y, despus, aplicar las funciones de columna a cada grupo. De la misma forma, podramos separar manualmente cada grupo en la clusula WHERE y operar sobre ese grupo. El sistema hace esto por nosotros en el contexto de una sola consulta. La columna en la que se van a agrupar las filas se identifica con la clusula GROUP BY. Cuando se incluye una clusula GROUP BY en una consulta, todas las filas seleccionadas son agrupadas, posteriormente, por un valor comn dentro del nombre de la columna. Este proceso se realiza automticamente, sin necesidad de especificar los valores reales que pueden aparecer en la columna de grupo. Entonces, se aplica la funcin de columna a cada grupo. Consulta-ejemplo 1.9: Para todos los departamentos que ofrezcan cursos, determinar los valores medio de TARIFA para los cursos ofrecidos por el departamento. mysql> SELECT CDEPT, AVG(CTARIFA) -> FROM CURSO -> GROUP BY CDEPT; +-------+--------------+ | CDEPT | AVG(CTARIFA) | +-------+--------------+ | CIS | 125.000000 | | PHIL | 81.500000 | | THEO | 110.000000 | +-------+--------------+ Comentarios 1. La clusula GROUP BY hace que todas las filas CURSO se reorganicen en un resultado intermedio, en el que las filas se agrupan por la columna CDEPT. Este resultado intermedio tiene todas las filas con el mismo valor en la columna CDEPT colocados en grupos separados. En el actual ejemplo, todas las filas se han colocado por valores CDEPT comunes. Despus de formar los grupos, se ha aplicado la funcin AVG a los valores CTARIFA en cada grupo. Al existir tres valores CDEPT distintos (CIS, PHIL, THEO), se han formado tres grupos y hemos obtenido tres valores medios, cada uno en una fila independiente.

MySQL es Software Libre

2. Observar que la clusula SELECT contiene un nombre de columna, CDEPT, seguido de una funcin de columna. El valor CDEPT puede aparecer con los resultados de la funcin, debido a la presencia de la clusula GROUP BY CDEPT. Este valor de columna es una caracterstica del grupo. (Es la misma para todos los valores incluidos en un grupo). Por lo tanto, puede ser visualizado con la informacin resumen producida por la funcin. 3. La base de datos no se ve modificada por la clusula GROUP BY. Las filas de la tabla que van a ser seleccionadas no son reordenadas en realidad. 4. Debido a que se visualizan mltiples filas, parece aconsejable ordenar el resultado. Notemos, sin embargo, que la salida ya est ordenada por la columna CDEPT. Esto ocurre porque el sistema establece una secuencia interna para fijar los grupos. Por este motivo, la secuencia final es algo as como el resultado de un efecto accidental en la agrupacin. Las futuras mejoras en el sistema podran significar que el agrupamiento se hace por otra tcnica. Debido a esto, es mejor incluir una clusula ORDER BY para indicar explcitamente la secuencia deseada, que puede ser la misma o no que la realizada para el propsito de agrupamiento. (Ver la siguiente consulta-ejemplo).
8

MySQL Intermedio
La clusula WHERE puede usarse para incluir o excluir antes de la formacin de grupos. La siguiente consulta ilustra este punto. Tambin especifica la secuencia de la salida. Consulta-ejemplo 1.10: Para cada departamento que ofrezca cursos, determinar el valor medio de TARIFA de todos los cursos que tengan tres crditos ofrecidos para cada departamento. Visualizar la salida en secuencia ascendente por identificacin de departamento. mysql> -> -> -> -> SELECT CDEPT, AVG(CTARIFA) FROM CURSO WHERE CRED = 3 GROUP BY CDEPT ORDER BY; +-------+--------------+ | CDEPT | AVG(CTARIFA) | +-------+--------------+ | CIS | 125.000000 | | PHIL | 116.666667 | | THEO | 80.000000 | +-------+--------------+ Comentarios 1. El ejemplo ha seleccionado nicamente los cursos con tres crditos para incluirlos en los grupos. Destacamos que esta seleccin se aplica a filas individuales (no a grupos) y se realiza antes de la formacin de grupos. 2. Comparemos la salida obtenida con la de los ejemplos anteriores. El valor medio de TARIFA para el departamento CIS no ha variado, porque todos sus cursos valen tres crditos. Sin embargo, los cursos de seis crditos, ofrecidos por los departamentos de Filosofa y Teologa, se han excluido de los grupos. Por lo tanto, sus valores TARIFA medios difieren del ejemplo anterior. 3. Qu ocurrir silos criterios de seleccin excluyen a todas las filas de un grupo? En ese caso, no se forma ningn grupo y no aparece ningn grupo en la salida. (Ver Consulta-ejemplo 1.12).

MySQL es Software Libre

4. La clusula ORDER BY establece la secuencia de ordenacin. Al corresponder esta secuencia con la realizada por el sistema para establecer los grupos, la salida sera la misma si hubiramos omitido la clusula ORDER BY. Sin embargo, es mejor incluirla. Reiteremos que: la clusula ORDER BY es siempre la ltima clusula en una sentencia SELECT. 5. Recordemos que la clusula ORDER BY puede referenciar una columna por su posicin relativa. La clusula ORDER BY puede escribirse como ORDER BY 1. Sin embargo, la clusula GROUP BY debe referenciar, explcitamente, una columna por su nombre (es decir, GROUP BY 1 no es vlido).

MySQL Intermedio
Ejercicios 1E. 1F. Para cada departamento que ofrezca cursos, obtener la identificacin de departamento, seguida del nmero total de crditos ofrecidos por el departamento. No considerar los cursos de seis crditos. Para cada departamento que ofrezca cursos, obtener la identificacin del departamento, seguida por el total de TARIFAS para los cursos ofrecidos por el departamento. A veces, un grupo concreto puede contener una sola fila. La siguiente consulta ilustra esta situacin.

Consulta-ejemplo 1.11: Para cada valor distinto de TARIFA, determinar el nmero total de crditos para los cursos que tengan este valor TARIFA. Ordenar el resultado por TARIFA en orden descendente. mysql> -> -> -> SELECT FROM GROUP ORDER CTARIFA, SUM(CRED) CURSO BY CTARIFA BY CTARIFA DESC; +---------+-----------+ | CTARIFA | SUM(CRED) | +---------+-----------+ | 500.00 | 3 | | 200.00 | 9 | | 150.00 | 3 | | 100.00 | 9 | | 90.00 | 3 | | 50.00 | 6 | | 0.00 | 15 | +---------+-----------+ Comentarios 1. Existen siete valores distintos de TARIFA registrados en la tabla CURSO. El sistema ha formado un grupo para cada uno de estos siete valores. Los valores CTARIFA de 90.00, 150.00 y 500.00, slo aparecen una vez en la tabla. Por lo tanto, el sistema ha formado un grupo que consiste en una fila para cada uno de estos valores. La suma de los crditos para tales valores es la que esperamos, es decir, simplemente el valor del crdito. 2. Se ha usado la clusula ORDER BY para establecer una secuencia de ordenacin que es diferente, probablemente, de la realizada por el sistema para el propsito de la agrupacin. A veces se produce una situacin en la que los criterios de seleccin implican que no se van a seleccionar filas para un grupo en particular. Esto significa, simplemente, que el grupo no se llega a formar. Por esto, la salida no contendr ninguna fila que corresponda a uno de esos grupos. Consulta-ejemplo 1.12: Para todos los departamentos que ofrezcan cursos de seis crditos, obtener la TARIFA media de estos cursos. mysql> -> -> -> SELECT FROM WHERE GROUP CDEPT, AVG(CTARIFA) CURSO CRED = 6 BY CDEPT;

MySQL es Software Libre

10

MySQL Intermedio
+-------+--------------+ | CDEPT | AVG(CTARIFA) | +-------+--------------+ | PHIL | 0.000000 | | THEO | 200.000000 | +-------+--------------+

Comentarios 1. La clusula WHERE ha despreciado todos los cursos de tres crditos. Por lo tanto, el grupo formado por el departamento CIS, que slo ofrece cursos de tres crditos, se encuentre vaco. El sistema no ofrece informacin sobre estos grupos en la salida. 2. Observar que, debido a que los departamentos de Filosofa y Teologa ofrecen cada uno slo un curso de seis crditos, los grupos PHIL y THEO contienen, cada uno, una sola fila. Si deseramos conocer el nmero de filas para cada grupo, podramos aplicar la funcin COUNT (*). CLAUSULA HAVING La ausencia de un grupo CIS, en el ejemplo anterior, se deba a que la clusula WHERE exclua todas las filas CIS del grupo. A veces, podemos desear incluir, explcitamente, al gunos grupos identificables en la salida. La clusula HAVING se usa para este propsito. Destacamos que la clusula HAVING slo se puede aplicar a grupos, mientras que la clusula WHERE slo se aplica a filas individuales. Consulta-ejemplo 1.13: Obtener la identificacin de departamento y el valor medio de TARIFA, para todos los departamentos en los que la media exceda de $ 100. mysql> -> -> -> SELECT FROM GROUP ORDER CDEPT, AVG(CTARIFA) CURSO BY CDEPT BY AVG(CTARIFA) > 100; +-------+--------------+ | CDEPT | AVG(CTARIFA) | +-------+--------------+ | PHIL | 81.500000 | | THEO | 110.000000 | | CIS | 125.000000 | +-------+--------------+ Comentarios 1. Hemos presentado otra clusula en la sentencia SELECT llamada HAVING. Su funcin es especificar condiciones para grupos, de la misma forma que la clusula WHERE lo hace para filas. En el procesamiento a nivel de filas, la clusula WHERE identifica condiciones que las filas deben cumplir para ser recuperadas. Cualquier fila que no cumpla las condiciones, no ser seleccionada y ser eliminada de cualquier procesamiento posterior. La clusula HAVING funciona de una forma similar, pero en relacin con los grupos. La clusula GROUP BY se usa para especificar cmo se forman los grupos. Una vez que se han formado los grupos, para que un grupo sea visualizado debe cumplir la condicin especificada en la clusula HAVING.

MySQL es Software Libre

11

MySQL Intermedio
2. Sintaxis: La clusula HAVING slo puede estar presente si la sentencia contiene una clusula GROUP BY. La clusula HAVING debe estar colocada inmediatamente despus de la sentencia GROUP BY. 3. La condicin especificada en la clusula HAVING, contiene una referencia al valor de la funcin, AVG(CTARIFA). Esto ocurre casi siempre. En el ejemplo que ahora estamos tratando, la clusula condicin HAVING no puede referenciar una columna especfica a nivel de filas. Por ejemplo, HAVING CTARIFA = 0 producira un error. Esto ocurre porque el valor CTARIFA no est presente en el grupo despus de que la funcin AVG haya sido aplicada. La condicin puede slo referenciar un valor que est presente una vez que el grupo haya sido formado. 4. Como en las condiciones WHERE, podemos usar NOT para excluir ciertos grupos de visualizacin. Por ejemplo, la siguiente clusula no hara que aquellos grupos con un TARIFA medio que no sea mayor de $100 aparecieran en pantalla. HAVING NOT AVG (CTARIFA) > 100 Ejercicios 1G. 1H. Obtener la identificacin de departamento y TARIFA mxima para todos los departamentos que ofrezcan cursos en los que TARIFA exceda de $ 300. Obtener la identificacin de departamento y el nmero total de crditos ofrecidos por el departamento, si el total excede de 15.

Una sentencia puede contener, tanto una clusula WHERE como una clusula HAVING. La clusula WHERE seleccionar inicialmente filas para su inclusin en los grupos, y la clusula HAVING seleccionar slo ciertos grupos para que aparezcan en pantalla. La siguiente consulta es una modificacin de la anterior, que excluye el departamento de Teologa. Consulta-ejemplo 1.14: Para todos los departamentos, excepto el de Teologa, que tengan un valor TARIFA medio mayor que $ 100, obtener su identificacin de departamento, seguida por su TARIFA media. mysql> -> -> -> -> SELECT FROM WHERE GROUP HAVING CDEPT, AVG(CTARIFA) CURSO NOT CDEPT = 'THEO' BY CDEPT AVG(CTARIFA) > 100; +-------+--------------+ | CDEPT | AVG(CTARIFA) | +-------+--------------+ | CIS | 125.000000 | +-------+--------------+ Comentario Es importante que se entienda la secuencia lgica que sigue el SQL en respuesta a esta orden. Primero, la clusula WHERE prohbe la formacin de un grupo para el departamento de Teologa (incluso aunque su TARIFA media exceda de $ 100). Esto significa que el resultado intermedio consiste en dos grupos que corresponden al departamento de Filosofa y al de Informtica. Posteriormente, la clusula HAVING selecciona el Departamento CIS, porque, a diferencia del departamento de Filosofa, su TARIFA media excede de $ 100. Este proceso aparece esquematizado en la Figura 1.2.
12

MySQL es Software Libre

MySQL Intermedio

Figura 1.2 Secuencia lgica de operaciones para la consulta-ejemplo 1.14 Ejercicios

MySQL es Software Libre

1I.

Consideremos, nicamente, los cursos con tres crditos. Obtener la identificacin del departamento y la TARIFA total para los cursos ofrecidos por cada departamento, si el total es menor o igual que $ 150. Ahora vamos a despreciar los cursos con un valor TARIFA mayor de $ 400. Obtener la identificacin de departamento y el mximo TARIFA cobrado por el departamento, si ese mximo excede de $ 175.

1J.

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.
13

You might also like