PREVIO 6 LENGUAJE DE MANIPULACIÓN DE DATOS (DML) OPERADORES DE ÁLGEBRA RELACIONAL INTRODUCCIÓN La manera en que los usuarios solicitan información de la base de datos es a través del lenguaje de consultas, que es un lenguaje de nivel superior a los de los lenguajes de programación, pues a través del menor número de instrucciones se puede obtener la información solicitada. Dentro del lenguaje de consulta se encuentra el lenguaje procedimental, también llamado álgebra relacional, el cual consiste en un conjunto de operaciones que toman una o dos relaciones como entrada y generan otra relación nueva como resultado. Dentro del álgebra relacional tenemos dos tipos de operadores: Operadores básicos o fundamentales que son selección, proyección, unión, diferencia y producto cartesiano. Operadores compuestos o derivados: intersección y producto unión natural (join). OPERADORES BÁSICOS Estos operadores son utilizados por cualquier manejador de bases de datos para la obtención de consultas y se encuentran dentro del lenguaje de manipulación de datos. Selección Extrae las tuplas específicas de una relación dada presentando sólo aquellas que satisfagan las condiciones específicas. FROM tabla WHERE <condición>;
MANUAL DE PRÁCTICAS DE BASES DE DATOS Proyección Extrae los atributos especificados de una relación dada. Unión FROM tabla; Construye una relación formada por todas las tuplas que aparecen en las dos relaciones especificadas sin repeticiones. FROM tabla1 UNION FROM tabla2; O bien, con tuplas repetidas: Diferencia FROM tabla1 UNION all FROM tabla2; Construye una relación formada por todas las tuplas de la primera relación que no aparezcan en la segunda, de las dos relaciones especificadas. Producto cartesiano FROM tabla1 MINUS FROM tabla2; Combina cada dato de una tabla con cada dato de otra tabla. SELECT <columnaa>,<columnab> FROM tabla1, tabla2; 64 Ing. Luciralia Hernández Hernández
PREVIO 6. OPERADORES DE ÁLGEBRA RELACIONAL OPERADORES COMPUESTOS Estos operadores simplifican las consultas habituales, pues existe una operación equivalente usando sólo los operadores básicos. Intersección De dos relaciones específicas se obtienen las tuplas que coinciden en ambas. FROM tabla1 INTERSECT FROM tabla2; Producto o unión natural (JOIN) Es usado para consultar datos de más de una tabla. Los datos se combinan relacionando valores comunes, típicamente valores de primary key y foreign key. Su combinación está basada en todas las columnas comunes entre ambas tablas. Si dos tablas en una consulta no tienen ninguna condición de combinación, entonces ORACLE devuelve su producto cartesiano. Se tienen las opciones siguientes: <nombre tabla> NATURAL JOIN <nombre tabla> <nombre tabla> JOIN <nombre tabla> USING (<columnas>) <nombre tabla> JOIN <nombre tabla> ON <condición> EJEMPLO 1. Considere las siguientes tablas: CUENTAHABIENTE clavecte nomcte domcte telefono 1325 Juan Perez San Angel 17 54983726 1215 Pedro Gonzalez Xoquipa 25 57612947 2343 Miriam Zaragoza San Pablo 18 38929837 2574 Jose Rubalcaba Convento 97 56481635 1234 Rosa Ramirez Xoquipa 28 57897657 Ing. Lucila Arellano Mendoza 65
MANUAL DE PRÁCTICAS DE BASES DE DATOS PREST numpres clavecte importe fechapres numsuc 325 2343 2500 17-mar-06 5 128 1234 3000 25-may-06 2 256 1325 1500 05-jun-06 8 653 2574 500 11-may-06 8 DEPOSITO numcta clavecte saldo fecha numsuc 2342 1325 10500 15-ene-05 4 2846 1215 15734 05-feb-06 4 9847 2343 12865 17-oct-05 5 3726 2574 11923 25-dic-05 8 4321 1234 7894 02-jun-06 1 SUCURSAL numsuc nomsuc activo 1 Insurgentes 50000000 2 Plateros 368945800 3 Coyoacan 857000000 4 Division 10255844 5 Ermita 658720000 8 Del Valle 269875120 Enseguida, realice las siguientes consultas: 1) Obtenga la clave de cliente y nombre de todos aquellos cuentahabientes que tienen una cuenta, un préstamo o ambas, evitando repeticiones. SELECT clavecte,nomcte FROM cuentahabiente NATURAL JOIN prest UNION SELECT clavecte,nomcte FROM cuentahabiente NATURAL JOIN deposito; Se obtienen los siguientes resultados: CLAV NOMCTE ------ ----------------- 1215 Pedro Gonzalez 1234 Rosa Ramirez 1325 Juan Perez 2343 Miriam Zaragoza 2574 Jose Ruvalcaba 66 Ing. Luciralia Hernández Hernández
PREVIO 6. OPERADORES DE ÁLGEBRA RELACIONAL 2) Realice la consulta anterior considerando repeticiones de tuplas. SELECT clavecte,nomcte FROM cuentahabiente NATURAL JOIN prest UNION ALL SELECT clavecte,nomcte FROM cuentahabiente NATURAL JOIN deposito; Se obtienen los siguientes resultados: CLAV NOMCTE ------- ----------------- 1325 Juan Perez 2343 Miriam Zaragoza 2574 Jose Ruvalcaba 1234 Rosa Ramirez 1325 Juan Perez 1215 Pedro Gonzalez 2343 Miriam Zaragoza 2574 Jose Ruvalcaba 1234 Rosa Ramirez 3) Muestre los nombres de los cuentahabientes que tienen una cuenta, pero que no han obtenido un préstamo. SELECT nomcte FROM cuentahabiente NATURAL JOIN deposito MINUS SELECT nomcte FROM cuentahabiente NATURAL JOIN prest; El resultado se muestra enseguida: NOMCTE ---------------------- Pedro Gonzalez 4) Proporcione la clave de cliente y teléfono de todos aquellos cuentahabientes que tienen una cuenta con un saldo mayor a $10000. SELECT clavecte,telcte FROM cuentahabiente NATURAL JOIN deposito WHERE saldo >=10000; Ing. Lucila Arellano Mendoza 67
MANUAL DE PRÁCTICAS DE BASES DE DATOS Se obtiene la siguiente tabla: CLAVECTE TELCTE --------- ----------- 1325 54983726 2343 38929837 2574 56481635 1215 57612947 5) Proporcione el nombre de la sucursal y activo, de aquellos depositantes que viven en Xoquipa. SELECT nomsuc,activo FROM sucursal,deposito NATURAL JOIN cuentahabiente WHERE sucursal.numsuc=deposito.numsuc AND domcte like 'Xoquipa %'; Se obtiene lo siguiente: NOMSUC ACTIVO ------------- ---------- Insurgentes 50000000 Division 10255844 6) Liste los nombres de los cuentahabientes que tienen una cuenta y un préstamo en la sucursal Ermita. SELECT c.clavecte, c.nomcte, s.numsuc FROM cuentahabiente c, prest p, sucursal s WHERE c.clavecte=p.clavecte AND p.numsuc=s.numsuc AND s.nomsuc='ermita' INTERSECT SELECT c.clavecte, c.nomcte, s.numsuc FROM cuentahabiente c, deposito p, sucursal s WHERE c.clavecte=p.clavecte AND p.numsuc=s.numsuc AND s.nomsuc='ermita'; Se obtiene lo siguiente: CLAVEC NOMCTE NU --------- ------------------- ---- 2343 Miriam Zaragoza 5 68 Ing. Luciralia Hernández Hernández
PREVIO 6. OPERADORES DE ÁLGEBRA RELACIONAL 7) Obtenga el total de los préstamos de todas las sucursales. SELECT SUM(importe) AS Total FROM prest; El resultado es el siguiente: TOTAL ------- 7500 8) Obtenga el total de depósitos por sucursal en orden alfabético. SELECT s.nomsuc,sum(d.saldo) AS Total FROM deposito d, sucursal s WHERE d.numsuc=s.numsuc GROUP BY s.nomsuc; El resultado es el siguiente: NOMSUC TOTAL ------------ --------- Division 26234 Del Valle 11923 Ermita 12865 Insurgentes 7894 9) Obtenga un listado del nombre de las sucursales y el número de préstamos otorgados. SELECT s.nomsuc, COUNT(p.numsuc) AS NumPres FROM prest p, sucursal s WHERE p.numsuc=s.numsuc GROUP BY s.nomsuc; Se obtienen los siguientes resultados: NOMSUC NUMPRES ----------- ---------- Del Valle 2 Plateros 1 Ermita 1 Ing. Lucila Arellano Mendoza 69
MANUAL DE PRÁCTICAS DE BASES DE DATOS Utilizando subconsultas 10) Obtenga el nombre de la sucursal que tiene el mayor número de préstamos otorgados SELECT s.nomsuc, COUNT(*) AS NumPres FROM prest p, sucursal s WHERE p.numsuc=s.numsuc GROUP BY s.nomsuc HAVING COUNT(*)=(SELECT MAX(prestamo) FROM (SELECT COUNT(p.numsuc) AS prestamo ); FROM prest p, sucursal s WHERE p.numsuc=s.numsuc GROUP BY s.nomsuc) Se obtiene lo siguiente: NOMSUC NUMPRES ---------- ----------- Del Valle 2 11) Obtenga los datos del cuentahabiente que solicitó el préstamo más alto en cualquier sucursal. SELECT * FROM cuentahabiente c, prest p WHERE c.clavecte=p.clavecte AND p.importe= (SELECT MAX(importe) FROM prest); Se obtiene el siguiente resultado: CLAVE NOMCTE DOMCTE TELCTE NUMP NUMC IMPORTE FECHAPRE NU -------- ------------------- ---------------- -------------- ------- --------- ------------- ---------------- ---- 1234 Rosa Ramirez Xoquipa 28 57897657 128 1234 3000 25/05/06 2 70 Ing. Luciralia Hernández Hernández