Consultas Complejas: SELECCIÓN-AGRUPAMIENTO Un grupo se puede entender como un conjunto de filas con el mismo valor para el conjunto de columnas por las que se agrupa (las incluidas en la cláusula GROUP BY). Obtener Obtener el el nombre nombre de de cada cada equipo equipo yy la la edad edad media media de de los ciclistas de dicho equipo: los ciclistas de dicho equipo: select select nomeq, nomeq, AVG(edad) AVG(edad) from Ciclista from Ciclista group by nomeq ;; Bases de Datos Curso 2006/07 Nomeq Banesto ONCE PDM Banesto Kelme ONCE Kelme Banesto Edad 22 25 32 25 28 30 29 28 DSIC-UPV 1 Consultas Complejas: SELECCIÓN-AGRUPAMIENTO Las funciones agregadas en las consultas agrupadas funcionan de forma diferente que en las consultas normales, devolviendo un valor por cada grupo formado. Nomeq Banesto Banesto Banesto ONCE ONCE PDM Kelme Kelme Edad 22 25 28 25 30 32 29 28 Un Valor por Grupo select select nomeq, nomeq, AVG(edad) AVG(edad) from Ciclista from Ciclista group group by by nomeq nomeq ;; Bases de Datos Curso 2006/07 DSIC-UPV 2 1 Consultas Complejas: SELECCIÓN-AGRUPAMIENTO Entonces para la consulta: select select nomeq, nomeq, AVG(edad) AVG(edad) from Ciclista from Ciclista group group by by nomeq nomeq ;; La solución, es: Bases de Datos Nomeq Banesto ONCE PDM Kelme Curso 2006/07 Edad 25 27,5 32 28,5 DSIC-UPV 3 Consultas Complejas: SELECCIÓN-AGRUPAMIENTO Ejemplo Ejemplo incorrecto: incorrecto: select select nomeq, nomeq, nombre, nombre, AVG(edad) AVG(edad) from Ciclista from Ciclista group group by by nomeq nomeq ;; La La regla regla sintáctica sintáctica que que aplican aplican los los sistemas sistemas relacionales para asegurar el buen relacionales para asegurar el buen funcionamiento funcionamiento de de las las consultas consultas agrupadas agrupadas es es la la siguiente: siguiente: “en “en la la selección selección de de una una consulta consulta agrupada, agrupada, sólo sólo pueden pueden aparecer aparecer referencias referencias aa columnas columnas por por las las cuales cuales se se agrupa, agrupa, referencias referencias aa funciones funciones agregadas agregadas oo literales”. literales”. Bases de Datos Curso 2006/07 DSIC-UPV 4 2 Consultas Complejas: SELECCIÓN-AGRUPAMIENTO GROUP GROUP yy WHERE: WHERE: Si Si se se incluye incluye la la cláusula cláusula where, where, la la aplicación aplicación de de esta cláusula se produce previamente esta cláusula se produce previamente aa la la agrupación agrupación 4 1 2 3 Bases de Datos select select nomeq, nomeq, AVG(edad) AVG(edad) from Ciclista from Ciclista where where edad>25 edad>25 group group by by nomeq nomeq ;; Curso 2006/07 DSIC-UPV 5 Consultas Complejas: SELECCIÓN-AGRUPAMIENTO GROUP, GROUP, WHERE WHERE yy HAVING: HAVING: La La cláusula cláusula HAVING HAVING sólo sólo puede puede ir ir en en consultas consultas agrupadas agrupadas yy es es similar similar aa WHERE, WHERE, pero pero en en un un orden orden diferente: diferente: 1º) 1º) Condición Condición WHERE WHERE (se (se usa usa para para las las filas) filas) 2º) 2º) Agrupamiento Agrupamiento yy cálculo cálculo de de valores valores agregados agregados 3º) 3º) Condición Condición HAVING HAVING (se (se usa usa para para los los grupos) grupos) En En la la cláusula cláusula HAVING HAVING sólo sólo podrán podrán aparecer aparecer directamente referencias a columnas directamente referencias a columnas por por las las cuales se agrupan o a funciones agregadas. cuales se agrupan o a funciones agregadas. Bases de Datos Curso 2006/07 DSIC-UPV 6 3 Consultas Complejas: SELECCIÓN-AGRUPAMIENTO Obtener Obtener el el nombre nombre de de cada cada equipo equipo yy la la edad edad media media de de sus ciclistas con más de 25 años, de aquellos sus ciclistas con más de 25 años, de aquellos equipos equipos con con más más de de 33 corredores corredores mayores mayores de de 25 25 años. años. select select nomeq, nomeq, AVG(edad) AVG(edad) from Ciclista from Ciclista where where edad>25 edad>25 group group by by nomeq nomeq having COUNT(dorsal)>3; having COUNT(dorsal)>3; Bases de Datos Curso 2006/07 DSIC-UPV 7 Consultas Complejas: SELECCIÓN-AGRUPAMIENTO Obtener Obtener el el nombre nombre del del ciclista ciclista yy el el número número de de puertos puertos que ha ganado, siendo la media de la pendiente que ha ganado, siendo la media de la pendiente de de éstos éstos superior superior aa 10. 10. select select C.nombre, C.nombre, COUNT(P.nompuerto) COUNT(P.nompuerto) from Ciclista C, Puerto from Ciclista C, Puerto PP where where C.dorsal=P.dorsal C.dorsal=P.dorsal group group by by dorsal, dorsal, nombre nombre Agrupar Agrupar siempre siempre por por CP CP having AVG(P.pendiente)>10; having AVG(P.pendiente)>10; Bases de Datos Curso 2006/07 DSIC-UPV 8 4 Trabajo a realizar Consultas Agrupadas y Generales (Ciclismo, Música y Biblioteca) Bases de Datos Curso 2006/07 DSIC-UPV 9 Combinaciones de Tablas Existen Existen varias varias formas formas de de combinar combinar dos dos tablas tablas en en el el lenguaje lenguaje SQL SQL dando dando lugar lugar aa una una “expresión “expresión de de tabla”: tabla”: √ 1º) 1º) Incluir Incluir varias varias tablas tablas en en la la cláusula cláusula FROM. FROM. √ 2º) 2º) Uso Uso de de subconsultas subconsultas en en las las condiciones condiciones de de las las cláusulas cláusulas WHERE WHERE oo HAVING. HAVING. 3º) 3º) Combinaciones Combinaciones conjuntistas conjuntistas de de tablas: tablas: utilizando operadores de la utilizando operadores de la teoría teoría de de conjuntos conjuntos para para combinar combinar las las tablas. tablas. 4º) 4º) Concatenaciones Concatenaciones de de tablas: tablas: utilizando utilizando diferentes formas variantes diferentes formas variantes del del operador operador concatenación del Álgebra Relacional. concatenación del Álgebra Relacional. Bases de Datos Curso 2006/07 DSIC-UPV 10 5 Combinaciones Conjuntistas de Tablas Corresponden Corresponden aa los los operadores operadores unión, unión, diferencia diferencia ee intersección del Álgebra Relacional: intersección del Álgebra Relacional: 1º) 1º) UNION UNION 2º) 2º) EXCEPT EXCEPT 3º) 3º) INTERSECT INTERSECT Permiten Permiten combinar combinar tablas tablas que que tengan tengan esquemas esquemas compatibles . compatibles. Bases de Datos Curso 2006/07 DSIC-UPV 11 Combinaciones Conjuntistas de Tablas UNIÓN: UNIÓN: expresión_tabla expresión_tabla union union [all] [all] término_tabla término_tabla Realiza Realiza la la unión unión de de las las filas filas de de las las tablas tablas provenientes de las dos expresiones. provenientes de las dos expresiones. Se Se permitirán permitirán oo no no duplicados duplicados según según se se incluya incluya oo no la opción all. no la opción all. Obtener Obtener el el nombre nombre de de todo todo el el personal personal de de la la vuelta: vuelta: (select (select nombre nombre from from Ciclista) Ciclista) UNION UNION (select (select director director from from Equipo); Equipo); Bases de Datos Curso 2006/07 DSIC-UPV 12 6 Combinaciones Conjuntistas de Tablas INTERSECCIÓN: INTERSECCIÓN: expresión_tabla expresión_tabla intersect intersect término_tabla término_tabla Realiza Realiza la la intersección intersección de de las las filas filas de de las las tablas provenientes de las dos expresiones. tablas provenientes de las dos expresiones. Obtener Obtener los los nombres nombres de de las las personas personas que que son son tanto tanto ciclistas como directores de equipo : ciclistas como directores de equipo : (select (select nombre nombre from from Ciclista) Ciclista) INTERSECT INTERSECT (select (select director director from from Equipo); Equipo); Bases de Datos Curso 2006/07 DSIC-UPV 13 Combinaciones Conjuntistas de Tablas DIFERENCIA: DIFERENCIA: expresión_tabla expresión_tabla except except término_tabla término_tabla En Oracle es Minus Realiza Realiza la la diferencia diferencia de de las las filas filas de de las las tablas provenientes de las dos expresiones. tablas provenientes de las dos expresiones. Obtener Obtener los los nombres nombres que que aparecen aparecen en en la la tabla tabla de de ciclistas ciclistas yy no no en en la la de de directores: directores: (select (select nombre nombre from from Ciclista) Ciclista) MINUS MINUS (select (select director director from from Equipo); Equipo); Bases de Datos Curso 2006/07 DSIC-UPV 14 7 Concatenaciones de Tablas Corresponden Corresponden aa variantes variantes del del operador operador concatenación concatenación del Álgebra Relacional: del Álgebra Relacional: 1º) 1º) Producto Producto cartesiano cartesiano (cross (cross join) join) 2º) 2º) Concatenación Concatenación interna interna (natural (natural join) join) 3º) 3º) Concatenación Concatenación externa externa (Left, (Left, Right, Right, Full) Full) 4º) 4º) Concatenación Concatenación unión unión (union (union join) join) Bases de Datos Curso 2006/07 DSIC-UPV 15 Concatenaciones de Tablas Producto Producto Cartesiano Cartesiano (cross (cross join): join): tabla1 tabla1 CROSS CROSS JOIN JOIN tabla2 tabla2 Equivale Equivale a: a: SELECT SELECT ** FROM FROM tabla1, tabla1, tabla2 tabla2 Bases de Datos Curso 2006/07 DSIC-UPV 16 8 Concatenaciones de Tablas Concatenación Concatenación Interna Interna (1): (1): referencia_tabla referencia_tabla [natural] [natural] join join [inner]referencia_tabla [inner]referencia_tabla [on [on expresión_condicional| expresión_condicional| using using (comalista_columna) (comalista_columna) ]] tabla1 tabla1 JOIN JOIN tabla2 tabla2 ON ON expresión_condicional expresión_condicional Equivale Equivale a: a: Select Select ** FROM FROM tabla1, tabla1, tabla2 tabla2 WHERE expresión_condicional WHERE expresión_condicional Bases de Datos Curso 2006/07 DSIC-UPV 17 Concatenaciones de Tablas Concatenación Concatenación Interna Interna (2): (2): tabla1 tabla1 JOIN JOIN tabla2 tabla2 USING USING (c1, (c1, c2, c2, .., .., cn) cn) Equivale Equivale a: a: tabla1 tabla1 JOIN JOIN tabla2 tabla2 ON ON tabla1.c1 tabla1.c1 == tabla2.c1 tabla2.c1 AND tabla1.c2 = tabla2.c2 AND tabla1.c2 = tabla2.c2 AND AND …… AND AND tabla1.cn tabla1.cn == tabla2.cn tabla2.cn Equivale Equivale a: a: Select Select ** FROM FROM tabla1, tabla1, tabla2 tabla2 WHERE tabla1.c1 WHERE tabla1.c1 == tabla2.c1 tabla2.c1 AND AND tabla1.c2 tabla1.c2 == tabla2.c2 tabla2.c2 AND AND …… AND AND tabla1.cn tabla1.cn == tabla2.cn tabla2.cn Bases de Datos Curso 2006/07 DSIC-UPV 18 9 Concatenaciones de Tablas Concatenación Concatenación Interna Interna (3): (3): tabla1 tabla1 NATURAL NATURAL JOIN JOIN tabla2 tabla2 Equivale Equivale a: a: tabla1 tabla1 join join tabla2 tabla2 using using (( c1, c1, c2, c2, ...., ...., cn) cn) Donde Donde tabla1 tabla1 yy tabla2 tabla2 tienen tienen nn atributos atributos Es Es de de un un JOIN JOIN por por todos todos los los atributos atributos comunes comunes las tablas). las tablas). Bases de Datos Curso 2006/07 DSIC-UPV 19 Concatenaciones de Tablas Concatenación Concatenación Interna Interna (4): (4): Obtener Obtener el el dorsal dorsal yy nombre nombre de de los los ciclistas ciclistas que que han han llevado maillots: llevado maillots: SELECT SELECT cl.dorsal, cl.dorsal, cl.nombre cl.nombre FROM FROM (Ciclista (Ciclista NATURAL NATURAL JOIN JOIN Llevar) Llevar) AS AS cl; cl; Equivale Equivale a: a: SELECT SELECT c.dorsal, c.dorsal, c.nombre c.nombre FROM Ciclista c, FROM Ciclista c, Llevar Llevar ll WHERE c.dorsal = l.dorsal; WHERE c.dorsal = l.dorsal; Bases de Datos Curso 2006/07 DSIC-UPV 20 10 Concatenaciones de Tablas Concatenación Concatenación Externa Externa (1): (1): referencia_tabla referencia_tabla [natural] [natural] {left || {left [outer] [outer] right || right [outer] [outer] full [outer] } full [outer] } JOIN JOIN referencia_tabla referencia_tabla [on expresión_condicional [on expresión_condicional || using using (comalista_columna) (comalista_columna) ]] FULL, FULL, se se muestran muestran las las tuplas tuplas no no concatenadas concatenadas de tabla1 y tabla2 de tabla1 y tabla2 Bases de Datos Curso 2006/07 DSIC-UPV 21 Concatenaciones de Tablas Concatenación Concatenación Externa Externa (2): (2): tabla1 tabla1 LEFT LEFT JOIN JOIN tabla2 tabla2 ON ON expresión_condicional expresión_condicional (Concat. (Concat. interna interna de de tabla1 tabla1 yy tabla2) tabla2) union union (tuplas (tuplas de de la la tabla1 tabla1 que que no no están están en en la la concatenación interna con valores concatenación interna con valores nulos nulos en en el el resto resto de de columnas) columnas) RIGHT RIGHT equivale equivale que que las las tuplas tuplas tabla2. tabla2. Bases de Datos aa LEFT LEFT que que se se Curso 2006/07 con con la la diferencia diferencia de de muestran muestran son son las las de de DSIC-UPV 22 11 Concatenaciones de Tablas Concatenación Concatenación Externa Externa (3): (3): EJERCICIO EJERCICIO 33: 33: Obtener Obtener nombre nombre de de todos todos los los equipos equipos indicando cuantos ciclistas tiene cada indicando cuantos ciclistas tiene cada uno: uno: 1ª 1ª Opción Opción (Incorrecta) (Incorrecta) El equipo PDM SELECT SELECT e.nomeq, e.nomeq, count(c.dorsal) count(c.dorsal) con 0 ciclistas FROM Equipo E, Ciclista no aparece FROM Equipo E, Ciclista CC WHERE E.nomeq=C.nomeq WHERE E.nomeq=C.nomeq GROUP GROUP BY BY e.nomeq; e.nomeq; 2ª 2ª Opción Opción (Correcta) (Correcta) SELECT SELECT e.nomeq, e.nomeq, count(c.dorsal) count(c.dorsal) FROM ( Equipo FROM ( Equipo EE LEFT LEFT JOIN JOIN Ciclista Ciclista CC )) on E.nomeq=C.nomeq on E.nomeq=C.nomeq GROUP GROUP BY BY e.nomeq; e.nomeq; Bases de Datos Curso 2006/07 DSIC-UPV 23 Concatenaciones de Tablas Concatenación Concatenación Externa Externa (4): (4): EJERCICIO EJERCICIO 33: 33: Obtener Obtener nombre nombre de de todos todos los los equipos equipos indicando cuantos ciclistas tiene cada indicando cuantos ciclistas tiene cada uno: uno: En En No No versiones versiones existe existe el el anteriores anteriores de de ORACLE ORACLE JOIN como tal. JOIN como tal. SELECT SELECT e.nomeq, e.nomeq, count(c.dorsal) count(c.dorsal) Se pone (+) en FROM Equipo FROM Equipo E, E, Ciclista Ciclista CC la parte de la WHERE WHERE E.nomeq=C.nomeq(+) E.nomeq=C.nomeq(+) ICA de la tabla GROUP GROUP BY BY e.nomeq; e.nomeq; de la que no se quieren mantener las tuplas Bases de Datos Curso 2006/07 DSIC-UPV 24 12 Concatenaciones de Tablas Concatenación Concatenación Unión: Unión: tabla1 tabla1 UNION UNION JOIN JOIN tabla2 tabla2 Crea Crea una una tabla tabla donde donde el el esquema esquema es es la la unión unión de de los los esquemas esquemas de de las las dos dos tablas, tablas, que que pueden pueden ser ser distintos. distintos. tuplas tuplas de de tabla1 tabla1 con con columnas de columnas de tabla2 tabla2 union union tuplas de tabla2 tuplas de tabla2 con con columnas columnas de de tabla1 tabla1 .. Bases de Datos valores valores nulos nulos en en las las valores valores nulos nulos en en las las Curso 2006/07 DSIC-UPV 25 Introducción de Información Instrucción Instrucción INSERT: INSERT: insert insert into into tabla tabla [(comalista_columna)] [(comalista_columna)] {default values {default values || values values (comalista_átomos) (comalista_átomos) || expresión_tabla} expresión_tabla} Si no se incluye la lista de columnas se deberán insertar filas completas de tabla. Si se incluye la opción default values se insertará una única fila en la tabla con los valores por defecto apropiados en cada columna (según la definición de tabla). En la opción values (comalista_átomos) los átomos vienen dados por expresiones escalares. En la opción expresión_tabla, se insertarán las filas resultantes de la ejecución de la expresión ( SELECT ). Bases de Datos Curso 2006/07 DSIC-UPV 26 13 Introducción de Información Instrucción Instrucción INSERT: INSERT: Añadir Añadir un un ciclista ciclista de de dorsal dorsal 101, 101, nombre nombre ‘Joan ‘Joan Peris’, Peris’, edad 20 años y del equipo ‘Kelme’: edad 20 años y del equipo ‘Kelme’: insert insert values values Bases de Datos into into Ciclista Ciclista (101, (101, ‘Joan ‘Joan Peris’, Peris’, 20, 20, ‘Kelme’); ‘Kelme’); Curso 2006/07 DSIC-UPV 27 Modificación de Información Instrucción Instrucción UPDATE: UPDATE: update update tabla tabla set comalista_asignaciones set comalista_asignaciones [where [where expresión_condicional] expresión_condicional] En donde una asignación es de la forma: columna = {default | null | expresión_escalar} Si se incluye la cláusula where sólo se aplicará a las filas que hagan cierta la condición. Bases de Datos Curso 2006/07 DSIC-UPV 28 14 Modificación de Información Instrucción Instrucción UPDATE: UPDATE: Incrementar Incrementar un un 10% 10% la la pendiente pendiente del del puerto puerto ‘Aitana’ ‘Aitana’ al haberse cerrado la carretera que había al haberse cerrado la carretera que había en en buen buen estado estado yy ser ser necesario necesario subir subir por por otra otra peor: peor: UPDATE UPDATE Puerto Puerto SET SET pendiente pendiente == pendiente pendiente ** 1.10 1.10 WHERE WHERE nompuerto nompuerto == ‘Aitana’ ‘Aitana’ ;; Bases de Datos Curso 2006/07 DSIC-UPV 29 Eliminación de Información Instrucción Instrucción DELETE: DELETE: delete delete from from tabla tabla [where [where expresión_condicional] expresión_condicional] Si se incluye la cláusula where se eliminarán aquéllas que hagan cierta la condición. Eliminar Eliminar la la información información del del ciclista ciclista ‘Miguel ‘Miguel Indurain’ ya que se ha jubilado: Indurain’ ya que se ha jubilado: DELETE DELETE FROM FROM Ciclista Ciclista WHERE nombre WHERE nombre == ‘Miguel ‘Miguel Indurain’; Indurain’; Bases de Datos Curso 2006/07 DSIC-UPV 30 15 Trabajo a realizar Consultas Generales (Ciclismo, Música y Biblioteca) Bases de Datos Curso 2006/07 DSIC-UPV 31 16