BASES DE DATOS I CONSULTA DE DATOS curso 2008 Agenda • Repaso. • Consultas Anidadas. • Operadores : • IN • NOT IN • EXIST • NOT EXIST • Agrupamiento. • JOIN • División. 17/09/2008 Bases de Datos I Fernández, Mariano 1 Sentencia SELECT SELECT [ DISTINCT ] <lista items> FROM <lista tablas> [ WHERE condición ] [ GROUP BY <lista atributos grupo> [ HAVING (condición grupo) ] ] [ ORDER BY <lista atributos orden> ] ; • El resultado es una tabla (si el resultado es un número, se considera como una tabla con una fila y una columna) • DISTINCT permite eliminar duplicados • La condición del WHERE restringir el conjunto de tuplas a recuperar • GROUP BY `factorea´ la relación resultante en grupos, y se puede aplicar un filtro sobre el grupo mediante HAVING (<lista ítems> debe coincidir con <lista atributos grupo>, aunque puede incluir funciones de agregado) • ORDER BY permite ordenar el resultado mediante una lista de campos en <lista atributos orden> 17/09/2008 Bases de Datos I Fernández, Mariano Ejemplo INVESTIGADOR id_inv nom_inv N categ 17/09/2008 N trabaja proy_id N PROYECTO nombre tema 1 INSTITUTO corresponde duracion Bases de Datos I id_inst nombre facultad Fernández, Mariano 2 Consultas de una tabla Ej. 1: 1: Listar los identificadores y nombres de los proyectos Ej. 2: Listar todos los datos de los Institutos SELECT proy_id, nombre FROM PROYECTO ; 17/09/2007 SELECT * FROM INSTITUTO; Bases de Datos I Fernández, Mariano Consultas de más de una tabla Ej. 3: Obtener los nombres de los proyectos del Instituto Inst2 SELECT P.nombre FROM PROYECTO P, INSTITUTO I WHERE P.id_inst = I.id_inst AND I.nombre = ´Inst2´ 17/09/2008 Bases de Datos I Fernández, Mariano 3 Consultas de más de una tabla Ej. 3: Obtener los nombres de los proyectos del Instituto Inst2 Mediante consultas anidadas: SELECT nombre FROM PROYECTO WHERE id_inst IN ( SELECT id_inst FROM INSTITUTO WHERE nombre = ´Inst2´ ); 17/09/2008 Bases de Datos I Consultas anidadas Fernández, Mariano Consultas de más de una tabla Ej. 3: Obtener los nombres de los proyectos del Instituto Inst2 Mediante consultas anidadas: SELECT nombre FROM PROYECTO WHERE id_inst IN ( SELECT id_inst FROM INSTITUTO WHERE nombre = ´Inst2´ ); 17/09/2008 Bases de Datos I Consultas anidadas Fernández, Mariano 4 Consultas de más de una tabla Ej. 3: Obtener los nombres de los proyectos del Instituto Inst2 Mediante consultas anidadas: SELECT nombre FROM PROYECTO WHERE id_inst IN ( SELECT id_inst FROM INSTITUTO WHERE nombre = ´Inst2´ ); 17/09/2008 Bases de Datos I Fernández, Mariano Consultas de más de una tabla Ej. 3: Obtener los nombres de los proyectos del Instituto Inst2 Mediante consultas anidadas: SELECT nombre Consultas anidadas FROM PROYECTO WHERE EXISTS ( SELECT * FROM INSTITUTO WHERE nombre = ´Inst2´ AND PROYECTO.id_inst = INSTITUTO. id_inst ); 17/09/2008 Bases de Datos I Fernández, Mariano 5 Consultas – agrupamiento Ej. 4: Listar los diferentes temas y la cantidad de proyectos de cada uno SELECT tema, COUNT(*) AS CantProy FROM PROYECTO GROUP BY tema; 17/09/2008 Bases de Datos I Fernández, Mariano Consultas – agrupamiento Ej. 5: Listar los códigos de los institutos con menos de 2 proyectos SELECT id_inst FROM PROYECTO GROUP BY id_inst HAVING COUNT(*) < 2; 17/09/2008 Bases de Datos I Fernández, Mariano 6 Consultas – agrupamiento Ej. 6: Listar los datos completos de institutos con menos de 3 proyectos SELECT I.* FROM PROYECTO P, INSTITUTO I WHERE P.id_inst = I.id_inst GROUP BY P.id_inst HAVING Count(*)<3 ; 17/09/2008 SELECT * FROM INSTITUTO WHERE id_inst IN ( SELECT id_inst FROM PROYECTO GROUP BY PROYECTO.id_inst HAVING Count(*)<3 ); Bases de Datos I Fernández, Mariano Consultas – agrupamiento Ej. 17: Listar los datos completos de institutos con menos de 3 proyectos SELECT I.* FROM PROYECTO P, INSTITUTO I WHERE P.id_inst = I.id_inst GROUP BY P.id_inst HAVING Count(*)<3 ; 17/09/2008 SELECT * FROM INSTITUTO WHERE id_inst IN ( SELECT id_inst FROM PROYECTO GROUP BY PROYECTO.id_inst HAVING Count(*)<3 ); Bases de Datos I Fernández, Mariano 7 JOIN • La sentencia JOIN permite combinar registros de dos o más tablas. • Tipos de JOIN: • NATURAL JOIN • OUTER JOIN z LEFT OUTER JOIN z RIGHT OUTER JOIN z FULL OUTER JOIN 17/09/2008 Bases de Datos I Fernández, Mariano JOIN Ej. 7: Listar los datos de los Proyectos junto con el nombre del Instituto en el cual se desarrolla. Opción 1: SELECT P.*, I.nombre FROM PROYECTO P, INSTITUTO I WHERE P.id_ins = I.id_ins; Opción 2: SELECT P.*, I.nombre FROM PROYECTO P JOIN INSTITUTO I; • Ensamble por nombre de columnas. Problemas: • Coinciden más columnas de las necesarias. • Necesitamos ver tablas. • Bug en Oracle. 17/09/2008 Bases de Datos I Fernández, Mariano 8 JOIN Ej. 7: Listar los datos de los Proyectos junto con el nombre del Instituto en el cual se desarrolla. Opción 3: SELECT P.*, I.nombre FROM PROYECTO P JOIN INSTITUTO I USING( id_ins) ; • Se indica que columna usar. Opción 4: SELECT P.*, I.nombre FROM PROYECTO P JOIN INSTITUTO I ON P.id_ins = I.id_ins; Se indica que columnas utilizar para el Ensamble 17/09/2008 Bases de Datos I Fernández, Mariano LEFT JOIN Ej. 8: Listar los Investigadores junto con la cantidad de Proyectos en los que trabaja. SELECT I.nom_inv, I.id_inv, COUNT(*) as cant FROM INVESTIGADOR I LEFT JOIN TRABAJA T ON I.id_inv = T.id_inv GROUP BY I.nom_inv, I.id_inv; 17/09/2008 Bases de Datos I Fernández, Mariano 9 RIGHT JOIN Ej. 8: Listar los Investigadores junto con la cantidad de Proyectos en los que trabaja. SELECT I.nom_inv, I.id_inv, COUNT(*) as cant FROM INVESTIGADOR I RIGHT JOIN TRABAJA T ON I.id_inv = T.id_inv GROUP BY I.nom_inv, I.id_inv; 17/09/2008 Bases de Datos I Fernández, Mariano FULL JOIN Ej. 9: Listar los Investigadores que trabajan en los Proyectos. SELECT I.nom_inv, I.id_inv FROM INVESTIGADOR I FULL JOIN TRABAJA T ON I.id_inv = T.id_inv ; 17/09/2008 Bases de Datos I Fernández, Mariano 10 División Ej.: PROF: id_p p1 p2 p3 nom_p nom1 nom2 nom3 DICTA ÷ MAT: MAT: id_mat m1 m2 DICTA: id_p id_mat p1 m1 p1 m2 p2 m1 p3 m2 id_p profesor que dicta todas las materias p1 • “DICTA” debe tener columnas de “MAT” y el número de columnas de “DICTA” ha de ser mayor que el de “MAT” • “MAT” debe tener al menos una tupla •El cociente es una nueva tabla cuyo esquema está formado por las columnas de “DICTA” que no están en “MAT”. El resultado incluye las instancias que aparecen en combinación con todas las tuplas de “MAT” 17/09/2008 Bases de Datos I Fernández, Mariano División Ej.: PROF: id_p p1 p2 p3 nom_p nom1 nom2 nom3 DICTA ÷ MAT: MAT: id_mat m1 m2 DICTA: id_p id_mat p1 m1 p1 m2 p2 m1 p3 m2 id_p p1 profesor que dicta todas las materias • SQL no provee un operador División, pero es posible resolver este tipo de consultas mediante el operador lógico EXISTS • Cuando se requieran servicios del tipo “todos los x que satisfagan c”, se debe reemplazar por “no existe ningún x que no satisfaga c” 17/09/2008 Bases de Datos I Fernández, Mariano 11 División en SQL Ej. 10 : Obtener los Investigadores que trabajan en todos los Proyectos SELECT * FROM INVESTIGADOR I WHERE NOT EXISTS ( SELECT * FROM PROYECTO P WHERE NOT EXISTS ( SELECT * FROM TRABAJA T WHERE T.id_inv = I.id_inv AND P.proy_id = T.proy_id ) ); INVESTIGADOR id_inv nom_inv N categ 17/09/2008 N PROYECTO trabaja proy_id nombre tema duracion Bases de Datos I Fernández, Mariano División en SQL Ej. 10: Obtener los Investigadores que trabajan en todos los Proyectos SELECT * FROM INVESTIGADOR I WHERE NOT EXISTS ( SELECT * FROM PROYECTO P WHERE NOT EXISTS ( SELECT * FROM TRABAJA T WHERE T.id_inv = I.id_inv AND P.proy_id = T.proy_id ) ); 17/09/2008 Bases de Datos I Fernández, Mariano 12 Recomendaciones… • Completar con textos de la Bibliografía (en todos se explica SQL y se plantean ejemplos, incluso en algunos -Date por ej.- hay ejercicios y soluciones para chequear) • Consultar en Internet (sitios confiables) • Consultar la Documentación del standard y de Oracle • Resolver ejercicios (propuestos en la práctica, laboratorio, etc.) • Probar ejercicios en Oracle (accesible vía web… en la página está la URL y los datos para conexión), aprovechar las prácticas de laboratorio • Practicar… Practicar… Practicar… !!! 13