Академический Документы
Профессиональный Документы
Культура Документы
S LA ARBOLEDA (ALCORCN)
CASE
DESARROLLO DE APLICACIONES INFORMTICAS EN ENTORNOS DE CUARTA GENERACIN CON HERRAMIENTAS CASE
De M o N
Case
CASE Apuntes tomados de la clase de CASE del I.E.S. La Arboleda de Alcorcn durante el curso 2002/2003. Pasados por David DeMoN Rodrguez. Queda totalmente prohibida la NO distribucin de estos apuntes, as que COMPARTE ;-).
Case
3. T E M A R I O 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Concepto de Base de Datos El modelo relacional de datos. Introduccin a SQL Definicin de estructuras de datos y otros objetos relacionales mediante SQL Uso de SQL en modo interactivo. Principios operativos de la herramienta ORACLE SQL*PLUS Uso de SQL en modo programacin ORACLE PL/SQL Generacin de pantallas y mens DEVELOPER 2000, ORACLE FORMS BUILDER Generacin de informes DEVELOPER 2000, ORACLE REPORTS BUILDER Proyecto integrador. Desarrollo de una aplicacin de gestin. Uso de herramientas CASE para la modelizacin de datos. ORACLE DESIGNER
4. TEMPORALIZACIN 1 Evaluacin ! Temas 1- 6/7 2 Evaluacin ! Temas 7- 11 5. CONTENIDOS MNIMOS Son los temas del 1-8 y el tema 10. Son los temas fundamentales de la asignatura.
Case 6. EVALUACIONES 40% de la nota final 1 evaluacin 30% de la nota final 2 evaluacin 30% de la nota final proyecto integrador 7. RECUPERACIONES Las recuperaciones se realizarn por bloques en Marzo. El proyecto integrador NO tiene recuperacin. Si se suspende la recuperacin se har una convocatoria extraordinaria en Junio, y si se aprueba se realizarn las FCT en cuanto sea posible. 8. BIBLIOGRAFA ORACLE GUA DE APRENDIZAJE. Michael Abbeg/ Michael J. Coreg. Ed. Oracle-Press/ McGraw Hill MANUAL DE ORACLE DEVELOPER 2000 Robert J. Miller Ed. Oracle-Press/ McGraw Hill ORACLE 8. PROGRAMACIN PL/SQL Scott Urman. Ed. Osborne/ McGraw Hill DISEO Y USO DE BASES DE DATOS RELACIONALES Irene Luque/ M. ngel Gmez Nieto Ed. Ramos
Case
I bloque
Case
Case
1. QUE ES UNA BD
1.1. DEFINICIN. Una BD es una coleccin de datos que estn lgicamente relacionados entre s. Los datos estn estructurados segn un modelo de BD que refleja las relaciones y restricciones que tienen estos datos en el mundo real. La descripcin y la definicin de los datos estn almacenados en la misma BD. Los tratamientos que se realizan con los datos han de conservar la integridad y la seguridad de la BD. 1.2. VENTAJAS DE LOS SISTEMAS DE BD SOBRE LOS SISTEMAS DE FICHEROS Independencia de los datos respecto de los tratamientos y viceversa. A los sistemas de ficheros tradicionales se les llama Sistemas Orientados al Proceso, ya que los datos se almacenan en ficheros diseados especficamente para cada aplicacin, de tal manera que si un dato es utilizado por ms de una aplicacin aparecer repetido en dos o ms ficheros. Adems, si se modifica el tratamiento que realiza un proceso sobre los datos es necesario reestructurar los ficheros. Por tanto, en estos sistemas de ficheros los datos son dependientes de los tratamientos que se realizan sobre ellos. A los sistemas de BD se les llama Sistemas Orientados al Dato, ya que los datos se estructuran segn un modelo que refleja las caractersticas que tienen en el mundo real, y ese modelo permite que cualquier proceso pueda tratar los datos. En estos sistemas los datos son independientes de los tratamientos que se realizan sobre ellos. Descripcin centralizada de los datos. La definicin de los datos se almacena en la misma BD, de manera que los tratamientos no tienen que especificar de nuevo la definicin de los datos. Adems, esto ofrece una mejor y ms normalizada documentacin de la informacin.
Case Eficiencia en la estructuracin de los datos. Al estar los datos estructurados segn un modelo, no se producen redundancias de datos, es decir, que el mismo dato no aparece en dos o ms ficheros. Esto evita 3 problemas: Por un lado no se desperdicia espacio de memoria almacenando la misma informacin varias veces. Se ahorra tiempo de proceso al no tener que modificar el dato en varios ficheros. Se evita la corrupcin de la BD, ya que al modificar un dato habra que hacerlo en todos los ficheros en que aparece, y si no se modifica en alguno de los ficheros, la BD sera inconsistente.
Mayor nivel informtico Los sistemas de BD ofrecen herramientas ms potentes y ms sencillas para la modificacin de los datos. Los sistemas de BD estn integrados en los sistemas de desarrollo de 4 Generacin. En contra, los sistemas por ficheros pertenecen a los sistemas de 3 Generacin.
Case tamao del fichero, realizar copias de seguridad, herramientas para la exportacin e importacin de datos, estadsticas de utilizacin de los datos. - Herramientas de desarrollo que es el conjunto de lenguajes para el desarrollo de aplicaciones. El administrador de la BD (BDA): es la persona cuya misin es asegurar la calidad y permitir el uso de los datos, diseando la BD de manera que el diseo de su estructura lgica y la implementacin de su estructura fsica responda lo mejor posible a las necesidades de los distintos usuarios.
ORACLE INFORMIX DB II INTGRES SQL SERVER MOTOR JET
servidor clientes
4GL
Base de Datos
JAVA
SQL
SGBD
FORMS
REPORTS
SYSADM
Case conserva el estado de los datos en una fecha determinada. A esta operacin se la denomina recuperacin en fro. Integridad: El objetivo de la integridad es lograr que los datos contenidos sean correctos. Para ello el SGBD debe detectar y corregir las operaciones incorrectas que introduzcan inconsistencias en la BD. Hay dos tipos de operaciones que pueden afectar a la integridad de los datos: Operaciones que atentan contra las reglas de integridad: Existencial o Referencial. Interferencias por accesos concurrentes.
En el primer caso las restricciones de integridad son definidas en el momento del diseo de la BD, de modo que el SGBD vela por que se cumplan, no permitiendo operaciones que la violen. En el caso del control concurrente a los datos, el sistema lo soluciona con el mecanismo de bloqueos. Confidencialidad: La confidencialidad se refiere a la proteccin de los datos contra accesos de usuarios no autorizados. Las decisiones sobre a que usuarios se les debe permitir realizar operaciones sobre qu objetos son decisiones de poltica de empresa, no decisiones tcnicas. Para que el control de accesos se pueda ejecutar, es necesario que los usuarios del sistema se identifiquen mediante un login y un password, y los privilegios, permisos y autorizaciones han de estar registrados en la BD. Los sistemas que requieren una gran seguridad utilizan sistemas de criptografa, de tal manera que los datos estn grabados en la BD cifrados, siendo necesario conocer la clave para descifrarlos. Por ltimo, otro mecanismo para mantener la seguridad en la confidencialidad es facilitar la auditora, registrando en unos ficheros auditores todos los accesos de los usuarios a los datos, pudiendo detectar a posteriori accesos no permitidos y por tanto mejorar el sistema de seguridad.
4. ARQUITECTURA CLIENTE-SERVIDOR
Un sistema de BD posee una estructura compuesta por 2 partes: Un servidor (backend) y un conjunto de clientes (frontend). El servidor ofrece servicios para realizar operaciones fsicas sobre los datos, es decir, el servidor el propio SGBD. Los clientes son aplicaciones ejecutadas en torno al SGBD, en los que se realizan varias operaciones, sobre todo de interfaz de usuario y tratamientos procedimentales, pero cuando requieren acceder a los datos se comunican con el servidor, que atiende los requerimientos y devuelve los resultados. Existen varias tipologas para implementar la estructura cliente-servidor:
10
SGBD
datos
El servidor y el cliente estn en distintas mquinas (proceso distribuido). Requiere de un sistema de comunicaciones.
Aplicaciones SGBD
datos
Aplicaciones
Existen varios servidores, y cada uno de ellos contiene parte de la BD. (BDs distribuidas).
SGBD Aplicaciones
datos
Red de Comunicaciones
Aplicaciones
Aplicaciones
SGBD
datos
11
Case
Arquitectura a 3 niveles (World Wide Web). Se usa en aplicaciones de la web, tanto en intranet como en internet. Aqu el servidor se instala en una mquina, pero la parte de cliente se reparte en 2 niveles: 1 mquina servidor de aplicaciones y 1 mquina cliente.
Servidor de aplicaciones
Servidor de aplicaciones
Servidor de la BD datos
5. MODELO DE DATOS.
El objetivo de cualquier sistema de informacin es representar, mediante una abstraccin del mundo real, toda la informacin necesaria para el cumplimiento de sus fines. Estos fines pueden ser obtener facturas, controlar stocks de almacn, gestionar las matrculas de un centro educativo. Esta abstraccin se realiza mediante un modelo de datos que es un conjunto de mtodos y reglas que indican cmo se ha de almacenar la informacin y cmo se ha de manipular los datos. Existen 2 tipos de modelos: Modelo conceptual, que es una representacin de la realidad no comprometida con ningn entorno informtico. El modelo conceptual ms popular es el modelo entidadrelacin de Chen. Modelo lgico, que determina unos criterios de almacenamiento y de operaciones de manipulacin de datos dentro de un tipo de entorno informtico. Los SGBD comerciales se basan en un modelo lgico concreto y determinan en parte el modelo fsico. Histricamente, los modelos lgicos de datos son: Modelo jerrquico (IMS [IBM]). Modelo en red (CODASYL). Modelo relacional (ORACLE, DB II [IBM], INFORMIX, INGRES, SQL SERVER). Modelo orientado a objetos (Eiffel).
12
Case
0. INTRODUCCIN
El modelo relacional constituye el fundamento terico de los SGBD comerciales ms utilizados en la actualidad. El modelo relacional es propuesto por CODD en la dcada de 1970. Es un modelo de datos basado en la teora matemtica de las relaciones, en la que los datos se estructuran en el mbito lgico en forma de relaciones. Uno de los objetivos fundamentales del modelo relacional es que la estructura lgica de los datos es independiente de su almacenamiento interno. As, el modelo no contempla en absoluto los aspectos fsicos de la BD, que queda en manos de los constructores de SGBD comerciales, que tienen como directrices el mejor rendimiento posible de sus sistemas. El modelo relacional se puede considerar como una combinacin de 3 componentes, que son estructurales, de integridad y de manipulacin. 1. ESTRUCTURA DEL MODELO Las estructuras de datos estn formadas por tablas o relaciones, filas o tuplas, columnas o atributos y claves primarias y claves ajenas. Sistema de Ficheros Fichero Registro Campo Teora relacional Relacin Tupla Atributo SGBD relacionales Tabla Fila Columna
Una tabla es una matriz rectangular dispuesta en filas y columnas y se puede representar de dos formas: Representacin tabular: NUMEXP NOMBRE FECHA DIRECCIN CODCICLO
Alumno DNI
13
Case Representacin en forma de Tupla, que consiste en representar la tabla mediante el nombre de la tabla seguido por los atributos separados por comas, subrayando los atributos que son clave principal. Alumno (DNI, NUMEXP, NOMBRE, FECHA, DIRECCIN, CODCICLO) Las caractersticas de las tablas son: En una tabla no hay filas repetidas. Las filas no estn ordenadas dentro de la tabla por ningn criterio. En una tabla no hay dos columnas con el mismo nombre. En una celda de la tabla puede haber como mximo 1 valor.
En cuanto a las claves se definen los siguientes conceptos: Clave candidata. Es un subconjunto de columnas de la tabla que identifican cada fila de forma unvoca. Una clave candidata ha de ser irreductible, es decir, que ningn subconjunto de las columnas que forman la clave candidata sea a su vez clave candidata. En toda tabla hay al menos 1 clave candidata, ya que segn el modelo no puede haber dos filas iguales. Clave primaria. (Primary Key, PK). De entre todas las claves candidatas, el diseador ha de elegir una de ellas como clave primaria, por criterios ajenos al modelo relacional, siguiendo criterios propios del sistema de informacin. El resto de las claves candidatas pasarn a llamarse claves alternativas (AK). La clave primaria es de gran importancia en el modelo, pues es la que permite la relacin entre las tablas. Clave ajena. (Foreing Key, FK). Es un conjunto de columnas de una tabla T2 cuyos valores han de coincidir con los valores de la PK de otra tabla T1. Las tablas T1 y T2 pueden ser la misma.
La estructura del modelo relacional en los SGBD relacionales se ampla con tablas virtuales llamadas Vistas o Views. Una vista es una tabla derivada de otras tablas, que se representa dentro del sistema por su definicin, pero que no posee datos almacenados propios separados de las tablas reales. Son una visin distinta de los datos almacenados en las tablas. Algunas vistas pueden ser actualizables y otras no. Otro elemento estructural de los SGBD relacionales son los ndices. Un ndice es una estructura opcional asociada a columnas de una tabla, que permite acelerar el acceso a los datos de la tabla. El que existan ndices es totalmente transparente a los programadores y usuarios, pero el SGBD utiliza siempre los ndices existentes. As, el hecho de definir ndices es una decisin que atae al BDA para mejorar el rendimiento del sistema. Los ndices son lgica y fsicamente independientes de las tablas a las que se asocia, as que se pueden crear y eliminar ndices sin que por ello se vean afectados los datos de la tabla. El SGBD ORACLE crea automticamente un ndice asociado a cada columna definida como clave primaria o alternativa.
14
Case 2. RESTRICCIONES DEL MODELO (INTEGRIDAD) El modelo relacional tiene una serie de restricciones, es decir, estructura u ocurrencias no permitidas. Las restricciones pueden ser inherentes al modelo (restricciones de integridad) y restricciones de usuario, que son unos predicados definidos sobre columnas o filas que deben ser verificados por el sistema para determinan si son vlidos en el sistema de informacin. Restricciones inherentes al modelo: Son: Regla de integridad, de identidad o existencial, que dice que ninguna columna de las que forman parte de la PK puede tener un valor nulo. Un nulo no es ningn valor, sino que es una marca que se aplica a una columna para indicar que no tiene asignado ningn valor. Regla de integridad referencial, que dice que una FK debe tener un valor de la clave primaria de la tabla con la que se relaciona, o bien tener valor nulo. " Reglas para FK: Cualquier estado de la BD que no satisfaga la integridad referencial es incorrecto por definicin. Hay una serie de reglas para evitar estos estados incorrectos, que se indican en el momento de la definicin de la BD, especificando qu debe hacer el sistema en caso de borrado o modificacin que atente contra la integridad referencial. Hay las siguientes posibilidades: Operacin restringida: (Restrict) No se permite borrar filas ni modificar el valor de su clave primaria si existen FKs que contengan su valor. Operacin con propagacin en cascada: (Cascade) El borrado o la modificacin de la PK lleva consigo el borrado o modificacin de las filas con los mismos valores en la FK. Operacin con puesta a nulos: (Set Null) El borrado o modificacin de las filas de la tabla que contiene la PK provoca la asignacin de un valor nulo en las FKs con el mismo valor. Operacin con puesta a valor por defecto: (Set Default) El borrado o modificacin de las filas de la tabla que contiene la PK provoca la asignacin de un valor por defecto en las FKs con el mismo valor.
Restricciones de usuario: es un predicado definido sobre columnas o filas que han de ser verificadas por el sistema para determinar si la informacin es vlida. stas restricciones de usuario pueden estar relacionadas en el diccionario de la BD o bien estar soportadas como procedimientos o disparadores. Una restriccin de usuario ha de tener un nombre, el predicado que ha de ser satisfecho y una respuesta a la operacin que intenta violar la restriccin.
15
Case Los lenguajes DML de los SGBD comerciales se basan en uno o varios de estos lenguajes matemticos. Por ejemplo, el SQL est basado en el lgebra relacional y en el clculo relacional orientado a tuplas.
16
Case
1. QUE ES SQL
El SQL es un lenguaje que permite expresar operaciones de definicin de estructura de datos, de autorizaciones de acceso a los datos y de consulta y actualizacin de datos almacenados en la BD relacionales. La palabra SQL est formada por las iniciales inglesas Structured Query Languaje. La 1 versin SQL la desarroll IBM en la dcada de los 70. Ante el xito de esta primera versin, otras empresas como ORACLE, DIGITAL o UNISYS desarrollaron sus propios lenguajes SQL, tanto para microoordenadores, miniordenadores y mainframes, lo que ha llevado a que sea una herramienta ampliamente utilizada en el mundo de las BDs relacionales. Esta tendencia se vio consolidada debido a que ANSI (American National Standard Institute) desarroll sus propias especificaciones para el lenguaje SQL, que posteriormente fueron aceptadas por la organizacin ISO (International Standard Organization). Las caractersticas principales del SQL frente a los sistemas tradicionales son: Permite manejar conjunto de registros en lugar de registro a registro. Tiene una fuerte base terica matemtica, lo que le da una gran capacidad expresiva con una estructura muy simple. Ello permite mediante una sola sentencia expresar consultas complejas que tradicionalmente requeran de uno o varios programas. Se puede utilizar de forma interactiva, lo que permite realizar consultas no planificadas, es decir, que no estn incluidas en programas, por lo que los mismos usuarios finales pueden acceder directamente a los datos.
17
Case SQL esttico, donde las sentencias SQL incluidas en el programa no pueden cambiar durante la ejecucin. SQL dinmico, donde una sentencia SQL puede ser modificada total o parcialmente por el propio programa durante su ejecucin.
18
Case
5. TIPOS DE DATOS
Los tipos de datos de los que se puede declarar una columna de una tabla en ORACLE son: NUMBER (p,s): para declarar valores numricos. Los parmetros p y s son opcionales. El parmetro p indica la cantidad mxima de dgitos totales que podr tener el nmero. El parmetro s indica la cantidad de dgitos que tendr la parte digital. Si no se especifican ni p ni s el valor se almacena tal y como se signe a la columna. Los operadores son +, -, * y /. CHAR (n): para declarar cadenas de caracteres de longitud fija de n caracteres. El mximo de n es 255 bytes. Si se omite el parmetro n asume el valor 1. VARCHAR2 (n): para declarar cadenas de caracteres de longitud variable entre 0 y n caracteres. El tamao mximo es de 4.000 bytes. El operador para cadenas, tanto para char como para varchar2 es el operador de concatenacin de cadenas ||. LONG: que contiene cualquier dato imprimible, como A, 3, &... Su longitud mxima es de 2 GB y se utiliza para guardar textos. RAW (n): que contiene informacin binaria. Su longitud mxima es de 255 bytes. LONG RAW: que contiene informacin binaria hasta 2 GB. Se utiliza para almacenar informacin grfica, sonidos... DATE: que almacena datos del tipo fecha y hora. Los valores permitidos van desde el 1 de junio de 4.712 A.C. hasta el 30 de diciembre de 4712 D.C. En las consultas se presenta el dato con el formato por defecto DD-MM-YY. El dato almacenado en la BD es en realidad un nmero al que se le aplica un algoritmo de conversin y se presenta en el formato que se especifique. Si no se especifica ningn formato lo presenta en el formato por defecto. El formato por defecto se especifica en la variable de entorno NLS_DATE_FORMAT. Esta variable de entorno se encuentra en la clave de registro del sistema HKEY_LOCAL_MACHINE\Software\Oracle\Home0. En un dato de tipo fecha viene almacenado: ao, mes, da, hora, minuto y segundo. a) Funciones para tratamientos de fechas: SYSDATE: que devuelve la fecha del sistema. TO_CHAR (dato.fecha[,mscara[,nlsparams]]): Esta funcin convierte el dato de tipo DATE al tipo de VARCHAR2, segn el formato especificado en la mscara. El parmetro NLS_PARAMS especifica el lenguaje en que aparecern escritos los nombres y las abreviaturas de los nombres y las abreviaturas de los meses y das de la semana. Para indicarle la lengua especificamos NLS_DATE_LANGUAGE = idioma. Los elementos de la mscara para datos de tipo fecha son: mm: nmero del mes (1-12). mon: abreviatura del mes (Ene.). month: nombre del mes (Enero). rm: mes en nmeros romanos ( I ). ddd: nmero del da del ao (1-366) dd: da del mes (1-31). d: da de la semana (1-7). dy: abreviatura del da de la semana (Mar.). day: nombre del da de la semana (Martes). yyyy: ao con 4 dgitos (2002). yy: ao con 2 dgitos (02).
19
Case year: ao en letra (dos mil dos). q: nmero del cuatrimestre (1..4). ww: semana del ao (1..53). w: semana del mes (1..5). hh: hora del da (1..12). hh12: hora del da (1..12). hh24: hora del da (1..24). mi: minuto de la hora (1..60). ss: segundo del minuto (1..60). am: muestra AM o PM segn sea antes o despus del medioda. TO_DATE: Convierte el dato de tipo char o varchar2 a tipo DATE. La mscara es un formato de fecha en el que est representado el dato alfanumrico. Si se omite la mscara el dato ha de estar en el formato de fecha por defecto. b) Asignacin de valor a una columna de tipo DATE: Se puede asignar directamente valor a una columna de tipo DATE si la cadena de caracteres utiliza el formato por defecto, pues el sistema hace automticamente la conversin. Si se ha de asignar un valor a una columna de tipo DATE con un formato distinto al formato por defecto se ha de utilizar la instruccin TO_DATE, que convierte una cadena de caracteres a un dato de tipo DATE. Si se asigna un valor a una columna de tipo fecha sin indicar hora:minutos:segundos se almacena por defecto 12:00:00 am. c) Operadores de fechas: Con las fechas se pueden utilizar los operadores + y -. Si a una fecha se le suma un entero n devuelve la fecha pasado n das. Si a una fecha se le resta un entero n nos da la fecha de n das antes. Si se restan dos fechas devuelve el nmero de das que hay entre ellas. Si se suma o resta fracciones de enteros devuelve la fecha pasadas las horas, los minutos o los segundos teniendo en cuenta que 1/24= 1h. 1/1440= 1min. y 1/86400= 1sg.
6. FUNCIONES.
Para datos numricos: ABS(n): Devuelve el valor absoluto de n. CEIL(n): Devuelve el entero ms grande menor o igual que n. FLOOR(n): Devuelve el entero ms grande menor o igual que n. MOD(m,n): Devuelve el resto de dividir m entre n. POWER(m,n): Eleva m a n. ROUND(n,[m]): Redondea n. Si m no es 0 redondea a m decimales. SIGN(n): Devuelve 1 si n<0, 0 si n=0 y 1 si n>0. SQRT(n): Devuelve la raz cuadrada de n. TRUNC(n,[m]): Trunca n. Si m no es 0 no trunca los m primeros decimales.
20
Case Para las cadenas de caracteres: CHR(n): Devuelve el carcter asociado al cdigo ASCII de n. ASCII(A): Devuelve el cdigo ASCII de un carcter. CONCATA (A,B): Concatena las cadenas o variables A y B. Equivale a ||. INITCAP(A): Convierte a maysculas la letra inicial de cada palabra contenida en el argumento. LOWER(A): Convierte en minsculas el argumento. UPPER(A): Convierte a maysculas el argumento. LPAD(A,n,[B]): Devuelve A ajustada a la derecha rellenada por la izquierda con el parmetro B hasta completar n. RPAD(A,n,[B]): Lo mismo que LPAD pero por la derecha. LTRIM(A,B): Elimina empezando por la izquierda del argumento A los caracteres que coinciden con el argumento B, hasta que encuentre uno diferente. RTRIM(A,B): Lo mismo que LTRIM pero por la derecha. REPLACE(A,B,[C]): Reemplaza en la cadena A, la subcadena B por la subcadena C. Si no aparece C, reemplaza con nada. SUBSTR(A,m,[n]): Devuelve una subcadena de A de longitud n, comenzando en la posicin m. Sin m es negativo comienza por la derecha. INSTR(A,B[n,[m]]): Busca el argumento A, la cadena B, devolviendo la posicin de comienzo. m y n por defecto son 1, de lo contrario comienza a buscar a partir del carcter que ocupa la posicin n, o la ocurrencia que ocupe el emsimo lugar. (select instr(gabcdefghigg,g,2,1) from dual;) LENGTH(A): Devuelve la longitud de la cadena. (select length(DeMoN) from dual;)
Para fechas y conversin de datos: SYSDATE: que devuelve la fecha del sistema. TO_CHAR (dato.fecha[,mscara[,nlsparams]]): Esta funcin convierte el dato de tipo DATE al tipo de VARCHAR2, segn el formato especificado en la mscara. El parmetro NLS_PARAMS especifica el lenguaje en que aparecern escritos los nombres y las abreviaturas de los nombres y las abreviaturas de los meses y das de la semana. Para indicarle la lengua especificamos NLS_DATE_LANGUAGE = idioma. Los elementos de la mscara para datos de tipo fecha son: mm: nmero del mes (1-12). mon: abreviatura del mes (Ene.). month: nombre del mes (Enero). rm: mes en nmeros romanos ( I ). ddd: nmero del da del ao (1-366) dd: da del mes (1-31). d: da de la semana (1-7). dy: abreviatura del da de la semana (Mar.). day: nombre del da de la semana (Martes). yyyy: ao con 4 dgitos (2002). yy: ao con 2 dgitos (02). year: ao en letra (dos mil dos). q: nmero del cuatrimestre (1..4).
21
Case ww: semana del ao (1..53). w: semana del mes (1..5). hh: hora del da (1..12). hh12: hora del da (1..12). hh24: hora del da (1..24). mi: minuto de la hora (1..60). ss: segundo del minuto (1..60). am: muestra AM o PM segn sea antes o despus del medioda. TO_CHAR(dato,[mscara]): Convierte el dato de tipo NUMBER al tipo de VARCHAR2 segn el formato especificado en la mscara. Los elementos de esta mscara pueden ser: 9: Devuelve el valor numrico eliminando los ceros a la izquierda. 0: Visualiza los ceros a la izquierda no significativos. MI: Devuelve el signo menos por la derecha si el valor es negativo. S: Devuelve + si es positivo o si es negativo. ,: Puntuacin de millar cuando proceda. .: Puntuacin de decimal cuando proceda. TO_DATE (dato,[mscara.[nlsparams]]): Convierte el dato de tipo char o varchar2 a tipo DATE. La mscara es un formato de fecha en el que est representado el dato alfanumrico. Si se omite la mscara el dato ha de estar en el formato de fecha por defecto. TO_NUMBER (dato, [mscara.[nlsparams]]): Convierte un dato de tipo CHAR o VARCHAR2 en un valor de tipo NUMBER, segn el formato de la mscara. ADD_MONTHS(fecha, cantidad de meses): Suma meses a una fecha. MONTHS_BETWEEN(fecha1,fecha2): Devuelve el nmero de meses entre dos fechas. LAST_DAY(fecha): Devuelve la fecha correspondiente al ltimo da del mes de la fecha indicada. De propsito general: NVL(expresin1, expresin2): Se utiliza para sustituir nulos por un valor real. Si expresin1 es nula devuelve expresin2, si no es nula devuelve expresin1. LEAST(valor1,valor2,...): Devuelve el menor valor de los especificados en la lista. GREATEST(valor1, valor2,...): Devuelve el mayor de todos los valores especificados. USER: Devuelve el nombre del usuario con el que se est conectado.
ORACLE proporciona una pequea tabla con una fila y una columna llamada dual, para realizar pruebas y clculos rpidos. Se utiliza cuando se quiere hacer trabajar con constantes en lugar de con columnas, especificando la tablas dual en la clusula FROM de la sentencia SELECT, que es como no especificar ninguna tabla.
22
Case
T.4. DEFINICIN DE ESTRUCTURAS DE DATOS Y OTROS OBJETOS DEL SISTEMA DE BD MEDIANTE SQL
1. CREACIN DE USUARIOS Y PERMISOS DEL SISTEMA. 2. EL DICCIONARIO DE DATOS. 3. LENGUAJE DE DEFINICIN DE DATOS (DDL). 4. CREACIN DE UNA TABLA. 5. ALTERACIN DE UNA TABLA. 6. ELIMINACIN DE UNA TABLA. 7. CONFIDENCIALIDAD DE LOS DATOS. 8. CREACIN DE ROLES. 9. CREACIN DE NDICES. 10. CREACIN DE SINNIMOS. 11. CREACIN DE VISTAS. 1. CREACIN DE USUARIOS Y PERMISOS DEL SISTEMA.
Para conseguir la confidencialidad en la BD es necesario definir usuarios que accedan a la BD y otorgarles permisos de acceso segn su grado de responsabilidad en el sistema de informacin. El SGBD ORACLE viene con varios usuarios ya creados, entre ellos estn: SYSTEM/manager: usuario administrador del sistema. SYS/change_on_install: que es el propietario del diccionario de datos. SCOTT/tiger: Para crear un nuevo usuario se usa el comando create user nombre_usuario IDENTIFIED BY password [definiciones de almacenamiento fsico] Las definiciones de almacenamiento fsico son diferentes en cada SGBD. Son utilizadas por el DBA para optimizar el almacenamiento y el rendimiento del sistema. En el caso de ORACLE se definen unas reas de memoria en disco que son espacios para ubicar las tablas, llamadas tablespace. Para conectarse al sistema con un nuevo usuario se utiliza el comando de SQL/PLUS connect nombre_usuario/password. Una vez creado un usuario, ste no puede hacer nada porque todava no se le han asignado permisos sobre el sistema. Para facilitar la asignacin de privilegios ORACLE utiliza el concepto de ROL, que es un grupo de privilegios con un nombre que pueden ser concedidos o denegados a un usuario. ORACLE ofrece 3 roles, que permiten al usuario conectarse a ORACLE: CONNECT: permite al usuario conectarse, pero no le permite crear objetos en la BD. RESOURCE: que permite al usuario crear sus propias tablas. DBA: que es el privilegio del DBA, as que se le asigna al usuario todos los privilegios.
23
Case Para otorgar un privilegio se utiliza la sentencia GRANT, con el siguiente formato: SQL> GRANT rol1[,rol2]... TO nombre_usuario; Para retirar un privilegio se utiliza la sentencia REVOKE, con el siguiente formato: SQL> REVOKE rol1[,rol2]... FROM nombre_usuario;
2. EL DICCIONARIO DE DATOS
Un SGBD est constituido en torno a un Diccionario de Datos, que es utilizado por el sistema y por los usuarios para controlar los objetos existentes en la BD. En ORACLE el diccionario de datos est implementado mediante un conjunto de tablas y vistas que almacenan la informacin sobre la BD, y en ellas slo puede escribir el SGBD. Los usuarios pueden acceder a las vistas del diccionario de datos mediante SQL para consultar. La mayora de las vistas del diccionario aparecen en conjuntos de 3, que contienen informacin similar y que se diferencian con el prefijo. El prefijo USER_ visualizar slo los objetos creados por el propio usuario. El prefijo ALL_ visualizar los objetos sobre los que el usuario tiene algn tipo de permiso. El Prefijo DBA_ visualizar todos los objetos que hay en el SGBD. Este tipo de vistas slo pueden ser consultadas por un usuario que sea DBA, es decir, que tenga concedido el rol DBA. Algunas de las vistas del diccionario de datos son: DICTIONARY o DICT: contiene la descripcin de las tablas y vistas que componen el diccionario. SQL> select * from dict; Select table_name, substr(comments,1,40) from dict; DBA, ALL, USER_TABLES: contienen la descripcin de las tablas creadas en el diccionario de datos. DBA, ALL, USER_CONSTRAINTS: contienen la descripcin de las restricciones definidas sobre las tablas. DBA, ALL, USER_USERS: contienen la descripcin de los usuarios definidos en la BD. DBA, ALL_TABLESPACES: contienen el nombre de los TABLESPACES definidos en la BD.
El SGBD ORACLE ofrece un comando que permite ver la descripcin de una tabla concreta. Este comando es DESC. SQL> DESC nombre_tabla;
Case
CREATE: que define y crea objetos en la BD. DROP: que elimina un objeto existente en la BD. ALTER: que modifica la definicin de un objeto de la BD.
Los objetos de la BD a los que afectan estas instrucciones son: tablas, vistas, ndices, restricciones, usuarios, roles, etc.
Las restricciones pueden ser definidas a nivel de columna o de tabla dependiendo de si se especifican al lado de la columna a la que afectan o despus de haber declarado todas las columnas. Las restricciones que afectan a varias columnas han de ser definidas a nivel de tabla.
25
Case
En el caso de definirse as el formato para crear la tabla sera: SQL> CREATE TABLE nombre_tabla ( nombre_col1 tipo_dato [restriccin_col1], nombre_col2 tipo_dato [restriccin1_col2], nombre_colN tipo_dato [restriccin1_colN], [restriccin1_tabla], [restriccin2_tabla], [restriccinN_tabla]); En una misma sentencia de creacin de una tabla se pueden especificar restricciones a nivel de columna y a nivel de tabla. Los formatos de las restricciones a nivel de columna o a nivel de tabla son los siguientes: PRIMARY KEY: a nivel de columna:
>[CONSTRAINT nombre_restriccin] UNIQUE (nombre_columna); DEFAULT: slo puede ser especificado a nivel de columna.
>nombre_columna tipo_dato [CONSTRAINT nombre_restriccin] CHECK (nombre_columna IN (valor1, valor2,...valorN)); a nivel de tabla:
26
>nombre_columna tipo_dato [CONSTRAINT nombre_restriccin] NOT NULL; FOREIGN KEY: a nivel de columna: REFERENCES
>nombre_columna tipo_dato [CONSTRAINT nombre_restriccin] nombre_tabla_pk (nombre_columna_pk) [ON DELETE CASCADE]; a nivel de tabla:
>[CONSTRAINT nombre_restriccin] FOREIGN KEY (nombre_columna_fk) REFERENCES nombre_tabla_pk (nombre_columna_pk) [ON DELETE CASCADE]; Con la opcin ON DELETE CASCADE al eliminar una fila de la tabla maestra, es decir, la tabla que contiene la PK a la que se hace referencia, se borran todas las filas de la tabla relacionada cuyo valor de FK coincida con el valor de la PK borrada. PROPUESTA PARA LOS NOMBRES DE LAS RESTRICCIONES PRIMARY KEY: UNIQUE: NOT NULL: CHECK: FOREIGN KEY: PK_tabla. UN_tabla_columna NN_tabla_columna CHK_tabla_columna FK_tabladetalle_tablamaestra
Con la opcin ADD se aaden nuevas columnas, y con la opcin MODIFY se modifica la definicin de las columnas, pudiendo cambiar su tamao y tipo de dato. Esta sentencia tiene las siguientes limitaciones: No se puede borrar una columna de una tabla. No se puede cambiar el tipo de datos de una columna si contiene datos. No se puede disminuir el tamao de una columna si contiene datos.
27
ALTER TABLE nombre_tabla {DROP|DISABLE|ENABLE} constraint nombre_restriccin; ALTER TABLE nombre_tabla add constraint nombre_restriccin definicin de restriccin a nivel de nivel de tabla;
Con DISABLE se deshabilita una constraint, es decir, sigue presente en el diccionario de datos pero no est activa. Con ENABLE se habilita una restriccin que estaba previamente deshabilitada. Con DROP se elimina una restriccin del diccionario de datos sin posibilidad de recuperacin. Con ADD se aade una nueva restriccin a una tabla.
La sintaxis para conceder privilegios es: > GRANT {lista_privilegios|ALL[privileges]} [(columna1, {lista_usuarios|lista_roles|public} [with grant option]; columna2...)] on objeto to
Donde lista_priviegios consiste en uno o ms nombres de privilegios separados por comas. All privileges concede todos los privilegios sobre el objeto. columna1, columna2 especifican las columnas de la tabla sobre las que se concede los privilegios, slo se pueden especificar para los privilegios insert, update y references. Objeto es el nombre de la tabla, vista u otro objeto sobre el que se otorga el privilegio. Lista_usuarios y lista_roles son los nombres de uno o mas usuarios o roles a los que se otorgan los privilegios. Si se especifica PUBLIC se otorgan los privilegios a todos los usuarios del sistema. La clusula with grant option hace que los usuarios a los que se les conceden los privilegios puedan a su vez otorgarlos a otros usuarios. Para retirar privilegios se utiliza la sentencia REVOKE con el siguiente formato: > REVOKE {lista_privilegios|ALL[privileges]} on objeto from {lista_usuarios o roles |public} [cascade constraint]; La clusula cascade constraint hace que si un usuario A concedi privilegios sobre un objeto a un usuario B y ste concedi privilegios sobre ese objeto a un usuario C, entonces al retirar los privilegios al usuario B se le retira tambin al usuario C. Las vistas del diccionario de datos asociadas a los privilegios son: USER, ALL_TAB_PRIVS, que contienen los privilegios sobre tablas en las que el usuario es otorgador, otorgado o propietario. La otra es USER, ALL_COL_PRIVS, que contiene los privilegios sobre columnas en las que el usuario es otorgador, otorgado o propietario.
8. CREACIN DE ROLES.
Se puede crear un rol mediante la sentencia >CREATE ROLE nombre_rol; El rol se crea vaco y posteriormente se le concedern los privilegios mediante la sentencia >GRANT. Con la sentencia REVOKE se puede retirar privilegios que previamente se han concedido a un rol. Es posible conceder un rol a otro rol. VISTAS DEL DICCIONARIO DE DATOS ORIENTADA A ROLES USER_ROLE_PRIVS, que contiene los roles otorgados al usuario actual. DBA_ROLES, que contiene todos los roles que existen en la BD. DBA_SYS_PRIVS, que contiene los privilegios del sistema otorgado a los roles. ROLE_TAB_PRIVS, que contiene los privilegios sobre tablas otorgados a los roles.
9. CREACIN DE NDICES.
Se puede indexar una tabla en aquellas columnas que necesitan un acceso rpido. El SGBD ORACLE crea automticamente ndices cuando se establecen constraints de PK o UNIQUE.
29
VISTAS DEL DICCIONARIO DE DATOS ASOCIADAS A LOS NDICES USER_INDEXES, que contiene los ndices propiedad del usuario que consulta la vista.
Case El formato simple para crear un vista es: >CREATE VIEW nombre_vista [(columna1 [,columna2]...)] AS consulta; Si se omiten los nombres de las columnas de la vista, especificadas entre parntesis, las columnas de la vista tendrn los mismos nombres que las columnas de las tablas sobre las que se realiza la consulta. Las vistas tambin se pueden crear a travs de una consulta con agrupamiento, y en este caso si hay que darle nombre a las columnas de la vista. Tambin se pueden crear vistas de las columnas de varias tablas. La sentencia CREATE VIEW tiene dos clusulas ms, que son: WITH CHECK OPTION: que obliga a que los datos modificados a travs de la vista cumplan las condiciones de seleccin de la definicin de la vista. WITH READ ONLY: no permite borrados, ni inserciones, ni actualizaciones sobre la vista.
El formato completo sera: >CREATE VIEW nombre_vista [(columna1[,columna2]...)] AS consulta [WITH READ ONLY] [WITH CHECK OPTION];
31
Case
32
Case
1. CONSULTAS SENCILLAS.
1.1. Sentencia SELECT simplificada: es: El formato de la sentencia SELECT para realizar consultas sencillas sobre una sola tabla tabla [WHERE predicado] [ODER BY
donde la lista de columnas de la clusula SELECT son columnas de la tabla que se especifique en la clusula FROM, y es la informacin resultante de la consulta. Si se especifica * es equivalente a s se especifican todas las columnas de la tabla en el mismo orden que estuvieron en su proceso de creacin. El predicado de la clusula WHERE es una condicin. En la clusula ORDER BY se especifican las columnas por las que se presenta ordenado el resultado de la consulta. El resultado de ejecutar una sentencia SELECT es otra tabla. Los pasos que sigue el SGBD para ejecutar una sentencia SELECT son: DEPTO. [paso1=DEPTO.WORK] [paso 3,] [paso 3,] [paso 3,X] [paso 3,] [paso 3,X] [paso 3,X] [paso 3,X] CODDE [paso 2,] [paso 2,] [paso 2,X] [paso 2,X] [paso 2,] 100 110 111 112 120 NOMDE Direccin General Direccin Comercial Seccin Tcnica Seccin Servicios Organi. CODCE CODJEFE 10 20 30 20 10 260 180 270 180 150 TIDIR P P F F P PRESU 77344 94760 276364 56550 20733 DEPDE 100 100 100 112
33
Case >SELECT codde, nomde, codjefe, FROM depto WHERE tidir=P ORDER BY nomde; 1. Ejecucin de la clusula FROM, que consiste en seleccionar de entre todas las tablas de la BD las tablas especificadas en la clusula FROM, y sta ser la tabla resultante de la sentencia SELECT hasta este momento. 2. Ejecucin de la clusula WHERE, que aplica el predicado especificado en la clusula WHERE a la tabla resultante del paso anterior, dejando las filas que cumplan la condicin y suprimiendo las que no la cumplan. 3. Ejecucin de la clusula SELECT, que consiste en evaluar las condiciones contenidas en la clusula SELECT y la opcin DISTICT si existen. Adems se retiran las columnas de la tabla no especificadas en la clusula SELECT. 4. Ejecucin de la clusula ORDER BY, que consiste en presentar la tabla resultante del paso anterior ordenada por las columnas especificadas en la clusula ORDER BY. CARACTERSTICAS DE FUNCIONAMIENTO Si no se especifica la clusula ORDER BY, el SGBD presenta las filas en cualquier orden, que incluso puede variar de una ejecucin a otra. En el caso concreto de ORACLE las presenta ordenadas por la PK. Cuando se especifica la clusula ORDER BY los datos aparecen por defecto en orden ascendente, y si hay valores nulos se presentan al final de la lista. En la clusula ORDER BY se puede especificar un nmero en lugar de un nombre de columna. Este nmero se refiere a la columna que aparece en la clusula SELECT en el lugar indicado por el nmero. Si se desea una ordenacin por orden decreciente se especifica la palabra DESC detrs de nombre de columna o del nmero en el que se desea la ordenacin. La tabla resultante se puede ordenar por ms de una columna. Para ello se especifican en la clusula ORDER BY las columnas separadas por comas. Si en la clusula SELECT se especifica en el lugar de una columna un literal entre comillas simples, ste literal aparecer en todas las filas resultantes de la consulta. Se puede cambiar el encabezado de una columna en el resultado de la consulta poniendo el nuevo encabezado entre comillas dobles a continuacin de la columna. Si el encabezado es una sola palabra no necesita comillas. 1.2. Eliminacin de filas repetidas: En la clusula SELECT se puede incluir la palabra reservada DISTINCT antes de todos los nombres de las columnas: >SELECT DISTINCT columna1, columna2...; Esto implica que en el resultado de la consulta no pueden aparecer filas repetidas, que sern eliminadas por el SGBD antes de enviarlas a la tabla resultante.
34
Case
2. EXPRESIONES.
En la formulacin de una consulta se pueden realizar operaciones con los datos. Estas operaciones se especifican mediante expresiones. Una expresin es una combinacin de operadores operandos y parntesis, que el SGBD cuando las ejecuta devuelve como resultado un nico valor resultante de evaluar la expresin. Los operadores pueden ser nombres de columnas, constantes u otras expresiones. Los operadores actan sobre datos del mismo tipo; los operandos pueden ser numricos o alfanumricos. Las operaciones pueden aparecer en dos sitios: En la clusula SELECT, donde las expresiones aparecen en el lugar donde se especifican los nombres de columna. En la clusula WHERE, donde uno o ambos de los valores a comparar pueden ser una expresin.
3. PREDICADOS.
Un predicado expresa una condicin entre valores y el resultado de la condicin puede ser verdadero, falso o desconocido. Los predicados se expresan en las clusulas WHERE y HAVING. Un predicado en la clusula WHERE da lugar a que se seleccionen todas aquellas filas que se evalen con el valor verdadero, y no sern seleccionadas las que se evalen con el valor falso o desconocido. Un predicado tiene resultado desconocido cuando en alguno de los elementos de la comparacin tiene nulos. Los predicados se clasifican en 2 grupos: 3.1. Simples: Se subdividen en predicados bsicas, null, cuantificados (all, any, some), between, like, in, exist. 3.1.1. Bsicos: Son predicados que expresan condicin de comparacin entre dos valores. Se especifican con los operadores relacionales < > = != <> <= >=. Los elementos comparados son expresiones. El segundo elemento comparado puede ser el resultado de otra sentencia SELECT, la cual ha de ir entre parntesis. A esta SELECT subordinada se la denomina SUBSELECT o SUBCONSULTA. El resultado de la subconsulta ha de ser un valor nico, es decir, la tabla resultante ha de tener una sola columna y una o ninguna fila. 3.1.2. Nulos: Su formato es: nombre_columna IS [NOT] NULL. Sirve para preguntar si el valor contenido en una columna de una fila determinada es o no nulo y el predicado se evaluar a los valores verdadero o falso. Este predicado NO puede tener valor desconocido. 3.1.3. Cuantificados: En un predicado bsico se utiliza una subconsulta como segundo elemento del predicado. La tabla debe tener una sola columna y una sola fila o ninguna. Si se utilizan los predicados cuantificados (all, some, any) la tabla resultante de la columna podr tener una columna y ninguna, una o varias filas.
35
Case ALL: el predicado cuantificado se evala verdadero si la comparacin es verdadera para todos y cada uno de los valores resultantes de la subconsulta. SOME: se evaluar a verdadero si la comparacin es verdadera para al menos uno de los valores resultantes de la subconsulta. ANY: es igual que some. CASOS ESPECIALES DE LOS PREDICADOS ALL Y SOME Por convenio se evalan de la siguiente manera: Si se especifica ALL y la subconsulta devuelve una tabla vaca el predicado toma el valor verdadero. Si se especifica SOME y la subconsulta devuelve una tabla vaca, el predicado toma valor falso. 3.1.4. Predicado BETWEEN: Sirve para determinar si un valor est comprendido entre otros dos valores, ambos inclusive. Su formato es: >Expresin1 [NOT] BETWEEN expresin2 AND expresin3. El predicado se evala verdadero si el valor de expresin1 es mayor o igual que el valor de expresin2 menor o igual que el valor de expresin3. El predicado se evala falso en caso contrario. Si la evaluacin de la expresin1, expresin2 o expresin3 es nula entonces el predicado se evala desconocido. Este predicado se puede expresar tambin mediante operadores lgicos: >expresin1 BETWEEN expresin2 AND expresin3 ! >exp1>=exp2 AND exp1<=exp3 >expresin1 NOT BETWEEN expresin2 AND expresin3! >exp1<exp2 OR exp1>exp3 3.1.5. Predicado LIKE: Sirve para seleccionar valores que se ajusten a un patrn. Su formato es: >nombre_columna [NOT] LIKE patrn. La columna ha de ser de tipo alfanumrico. El patrn es una constante que puede contener cualquier cadena de caracteres, pero hay dos caracteres que funcionan como comodn: % y _. El _ equivale a una cadena de caracteres de longitud 1, mientras que el % equivale a una cadena de caracteres de cualquier tamao, incluido 0 caracteres. Si el patrn no contiene caracteres comodines, entonces el valor de la columna para que la fila sea seleccionada ha de ser igual que el patrn.
36
Case 3.1.6. Predicado IN: Sirven para preguntar si el resultado de una expresin est incluido en una lista de valores. Tiene dos formatos: Formato 1:
>expresin [NOT] IN (constante1[,constante2]...) Si el valor de la expresin es igual a alguno de los valores de la lista, el predicado se evala como verdadero. Si el valor de la expresin no es igual a ninguno de los valores de la lista se evala como falso. Si el valor de la expresin es nulo, el predicado se evala como desconocido. Existe otro formato en el que en lugar de una lista de constantes se puede especificar una subconsulta que devuelva una tabla con una sola columna. Formato 2:
>expresin [NOT] IN (subconsulta) Este segundo formato tiene sus equivalentes con los predicados cuantificados. As expresin IN (subconsulta) ! expresin = some(subconsulta) 3.1.7. Predicado EXISTS: Sirve para determinar si existen filas o no existe ninguna fila que cumplan con un determinado requerimiento. Su formato es: >[NOT] EXISTS (subconsulta) La tabla resultante de la subconsulta puede contener cualquier nmero de filas y columnas. Este predicado se evala verdadero si el resultado de la subconsulta es una tabla que contiene una o ms filas, es decir, si no es una tabla vaca. El predicado se evala a falso si la tabla resultante de la subconsulta es una tabla vaca. Este predicado no puede tomar el valor desconocido. 3.2. Compuestos: Son los predicados simples vistos hasta ahora combinados con los operadores lgicos AND, OR y NOT. Un predicado compuesto se evala a verdadero, falso o desconocido segn la siguiente tabla de verdad.
37
PREDICADO X V F D
NOT X F V D
38
Case 4.2.2. Funcin SUBSTR: Obtiene una subcadena de caracteres de una cadena de caracteres. Su formato es: >SUBSTR(expresion1,expresion2[,expresion3]); El primer argumento es la cadena de caracteres de la que se va a extraer la subcadena. El segundo argumento es un valor entero que indica la posicin inicial de la subcadena dentro de la cadena. El tercer argumento es un valor entero que indica la longitud de la subcadena. Si este argumento no se especifica la subcadena ser desde la posicin inicial indicada en el segundo argumento hasta el final de la cadena. Si alguno de los argumentos de la funcin es nulo, el resultado de la funcin es nulo. 4.3. Funciones de columnas o colectivas: Estas funciones devuelven un nico valor como resultado de aplicar una determinada operacin a los valores contenidos en una columna, por ejemplo, la suma de todos los valores de una columna o la media aritmtica. El argumento de estas funciones es un conjunto de valores tomados de una o ms columnas: sum(salar) o sum(salar+comis), por ejemplo. Las funciones colectivas son: AVG, MAX, MIN, SUM, COUNT. AVG: calcula la media aritmtica de un conjunto de valores. MAX: obtiene el valor mximo de un conjunto de valores. MIN: obtiene el valor mnimo de un conjunto de valores. SUM: obtiene la suma de un conjunto de valores. COUNT: obtiene cuantos valores hay en una coleccin.
El argumento de la funcin puede ser una expresin: sum(salar) o sum(salar+comis) por ejemplo. Las funciones pueden actuar como operandos de una expresin: (max(salar)+min(salar))/2 por ejemplo. Estas funciones slo aparecen en las clusulas SELECT y HAVING. Los valores a los que se aplica son a las columnas de las filas seleccionadas en la clusula WHERE. Si se hacen grupos mediante la clusula GROUP BY se aplica la funcin a cada grupo. Si no hay clusula GROUP BY, todas las filas se consideran como un nico grupo, y el resultado de la sentencia SELECT es una tabla con una nica fila. REGLAS Y FORMATOS DE LAS FUNCIONES COLECTIVAS 1. Antes de aplicar una funcin colectiva al conjunto de valores de su argumento se eliminan los valores nulos. 2. Si el conjunto de valores es vaco la funcin COUNT da como resultado 0 y las otras funciones dan como resultado NULL. Que el conjunto de valores sea vaco puede ser, por ejemplo, si el resultado de la clusula WHERE no lo satisface ninguna fila. 3. Para las funciones AVG, MAX, MIN, SUM el resultado tiene el mismo tipo de datos que el argumento. El tipo de argumento debe ser numrico para las funciones AVG y SUM y pueden ser de cualquier tipo para las funciones MAX, MIN y COUNT.
Cuando se especifican funciones colectivas en la clusula SELECT no se puede incluir en el resultado valores no colectivos, pues carecera de valor para el SGBD. 39
Case FORMATOS DE LAS FUNCIONES COLECTIVAS Las funciones colectivas tienen dos posibles formatos: 1. nombre_funcion ([DISTINCT] expresion): este formato es aplicable a las cinco funciones. La palabra DISTINCT indica que antes de aplicar la funcin al conjunto de valores de la columna se eliminan los valores repetidos. Como por ejemplo sum(DISTINCT comis), avg(salar+comis) o max(nomem). 2. COUNT(*): slo es vlido para la funcin COUNT. Devuelve como resultado el nmero de filas que hay al grupo que aplica.
Esta clusula de la sentencia SELECT sirve para agrupar filas. Aparece a continuacin de la clusula WHERE si esta existe. Su formato es: >GROUP BY columna1 [,columna2]... donde columna1 y columna2 son nombres de columnas y por aparecer en la clusula GROUP BY se las denomina columnas de agrupamiento. La clusula GROUP BY especifica que se ha de agrupar las filas de una tabla en grupos. Cada grupo est formado por el conjunto de filas que tienen el mismo valor en las columnas de agrupamiento. Los valores nulos en las columnas de agrupamiento se incluyen en el mismo grupo. Una vez formados los grupos, para cada uno de ellos se evalan las expresiones de la clusula SELECT. Por cada grupo se produce una fila en la tabla final resultante de la sentencia SELECT. En la clusula SELECT slo pueden aparecer columnas de agrupamiento y columnas que no sean de agrupamiento pero como argumento de funciones de columnas. 5.2. Clusula HAVING:
Esta clusula se utiliza para seleccionar grupos de filas. Su formato es: >HAVING condicin. La clusula aparece a continuacin de la clusula GROUP BY. La clusula GROUP BY agrupa las filas de la tabla en grupos; la clusula HAVING selecciona entre los grupos formados por la clusula GROUP BY aquellos grupos que cumplen una condicin. La condicin es un predicado simple o compuesto. En el predicado de la clusula HAVING slo puede aparecer columnas de agrupamiento y columnas que no sean de agrupamiento pero como argumento de funciones colectivas. Las funciones de columna que se especifican en la clusula HAVING se aplican a los valores de cada grupo.
40
Recopilacin de las reglas de agrupamiento de filas: 1. Se hace agrupamiento cuando se especifica la clusula GROUP BY o se usan funciones de columna o ambas cosas, como por ejemplo select sum(salar) from emple, select sum(salar) from emple group by codde o select codde from emple group by codde having count(*)>2. 2. Si se especifica la clusula GROUP BY se agrupan las filas que tengan iguales valores en las columnas de agrupamiento. Si no se especifica GROUP BY todas las filas forman un grupo. Una vez formados los grupos se seleccionan los grupos que cumplen las condiciones de la clusula HAVING. Para cada grupo seleccionado se evalan las expresiones de la clusula SELECT, dando como resultado una fila por cada grupo. 3. Las columnas que no sean de agrupamiento solo pueden usarse como argumentos de funciones de columna tanto en la clusula SELECT como en la condicin de la clusula HAVING. Si se utiliza una sentencia SELECT formada por clusulas SELECT, FROM, WHERE, GROUP BY, HAVING, y ORDER BY los pasos que sigue el SGBD para obtener el resultado son: Ex: Para cada departamento que tenga ms de dos empleados con hijos, obtener el salario mximo y el salario mnimo de aquellos empleados que tienen hijos. Presentarlo ordenado por cdigo de departamento. >SELECT codde, max(salar), min(salar) FROM emple WHERE numhi>0 GROUP BY codde HAVING count(*)>2 ORDER BY codde; EMPLEADO codem 1 2 3 4 5 6 7 8 9 10 11 salar 1200 1300 1350 1100 1200 1150 1200 1150 1250 1300 1100 numhi 3 2 0 1 1 2 2 0 1 3 2 codde 20 20 20 20 10 10 10 30 30 30 40
41
Case Los pasos del SGBD son: 1. Ejecucin de la clusula FROM, que consiste en seleccionar la tabla especificada en esta clusula que de momento pasa a ser la tabla resultante de la sentencia. 2. Ejecucin de la clusula WHERE que consiste en eliminar de la tabla resultante las filas que no satisfagan la condicin especificada en esta clusula. 3. Ejecucin de la clusula GROUP BY, que consiste en formar grupos con las filas de la tabla resultante del paso anterior que tengan iguales valores en las columnas de agrupamiento. 4. Ejecucin de la clusula HAVING, que consiste en eliminar los grupos que no satisfagan la condicin especificada en esta clusula. 5. Ejecucin de la clusula SELECT, que consiste en evaluar las expresiones especificadas en esta clusula para cada uno de los grupos seleccionados en el paso anterior. El resultado es una tabla en la que aparecen una fila por cada grupo y tantas columnas como expresiones aparezcan en la clusula SELECT. Si aparece la palabra DISTINCT se eliminaran de la tabla resultante las filas repetidas. 6. Ejecucin de la clusula ORDER BY, que consiste en ordenar la tabla resultante del paso anterior por los criterios especificados en la clusula ORDER BY.
codem 1 2 3 4 5 6 7 8 9 10 11
salar 1200 1300 1350 1100 1200 1150 1200 1150 1250 1300 1100
numhi 3 2 0 1 1 2 2 0 1 3 2
codde 20 20 20 20 10 10 10 30 30 30 40 2 4 4 3 4 3 3 3 2
TABLA RESULTANTE [paso 5] [paso 6] codde 10 20 max(salar) 1200 1300 min(salar) 1150 1100
Cuando la condicin del HAVING tiene la columna de agrupamiento en su condicin de seleccin, entonces esta condicin de seleccin se puede expresar en la clusula HAVING o en la clusula WHERE. 42
Case
43
Case Los nombres alias se utilizan por dos razones: 1. Por comodidad, para utilizar unos nombres de tablas ms cortos y ms mnemotcnicos. 2. Una tabla puede especificarse ms de una vez en la clusula FROM de una misma sentencia SELECT. En este caso es obligatorio utilizar nombres alias. >SELECT ------------------- FROM emple e1, emple [e2] ------------; 6.1.1.3. Producto cartesiano: Si una sentencia SELECT utiliza varias tablas, entonces los nombres de las tablas se han de especificar en la clusula FROM separados por comas. Cuando el sistema ejecuta la clusula FROM genera una tabla que es el resultado del producto cartesiano de las tablas especificadas, es decir, en la tabla resultante el nmero de columnas es igual a la suma del nmero de columnas de las tablas especificadas, y el nmero de filas es el producto del nmero de filas de las tablas especificadas. La tabla resultante es donde se aplican el resto de las clusulas de la sentencia SELECT (WHERE, GROUP BY, HAVING, SELECT, ORDER BY). CENTROS codce 100 200 nomce C1 C2 DEPTO codde 10 20 30 40 nomde D1 D2 D3 D4 codce 100 100 200 200
>SELECT * FROM depto d, centro c; d.codde 10 10 20 20 30 30 40 40 d.nomde D1 D1 D2 D2 D3 D3 D4 D4 d.codce 100 100 100 100 200 200 200 200 c.codce 100 200 100 200 100 200 100 200 c.nomce C1 C2 C1 C2 C1 C2 C1 C2
44
Case 6.1.2. Operacin JOIN: En la teora de BDs relacionales, y concretamente en el lgebra relacional orientada a tuplas se define una operacin llamada JOIN NATURAL, que se utiliza para relacionar datos de distintas tablas. En SQL la operacin join natural se realiza en la sentencia SELECT utilizando las clusulas FROM y WHERE. >SELECT * FROM depto, centro WHERE depto.codde=centro.codce; d.codde 10 10 20 20 30 30 40 40 d.nomde D1 D1 D2 D2 D3 D3 D4 D4 d.codce 100 100 100 100 200 200 200 200 c.codce 100 200 100 200 100 200 100 200 c.nomce C1 C2 C1 C2 C1 C2 C1 C2
En la clusula WHERE debe haber por lo menos n-1 condiciones de JOIN, donde n es el nmero de tablas especificadas en la clusula FROM. 6.1.3. Ejecucin de la sentencia con JOIN: >SELECT nomde, count(*) FROM emple e, depto d WHERE e.codde=d.codde AND presu>50000 GROUP BY nomde HAVING max(salar)>1500 ORDER BY nomde desc; EMPLE codem 1 2 3 4 5 nomem E1 E2 E3 E4 E5 salar 1600 900 1000 1700 1700 codde 10 10 20 30 40
45
Case
DEPTO codde 10 20 30 40 nomde D1 D2 D3 D4 presu 55000 70000 60000 45000 tidir F P F F codjefe 2 1 1 3
Los pasos que sigue el SGBD para ejecutar una sentencia SELECT con JOIN son: 1. Ejecucin de la clusula FROM, donde forma una tabla con el producto cartesiano de las tablas especificadas en la clusula FROM.
e.codem e.nomem 1 E1 1 E1 1 E1 1 E1 2 E2 2 E2 2 E2 2 E2 3 E3 3 E3 3 E3 3 E3 4 E4 4 E4 4 E4 4 E4 5 E5 5 E5 5 E5 5 E5 e.salar 1600 1600 1600 1600 900 900 900 900 1000 1000 1000 1000 1700 1700 1700 1700 1700 1700 1700 1700 e.codde 10 10 10 10 10 10 10 10 20 20 20 20 30 30 30 30 40 40 40 40 d.codde 10 20 30 40 10 20 30 40 10 20 30 40 10 20 30 40 10 20 30 40 d.nomde D1 D2 D3 D4 D1 D2 D3 D4 D1 D2 D3 D4 D1 D2 D3 D4 D1 D2 D3 D4 d.presu 55000 70000 60000 45000 55000 70000 60000 45000 55000 70000 60000 45000 55000 70000 60000 45000 55000 70000 60000 45000 d.tidir F P F F F P F F F P F F F P F F F P F F d.codjefe 2 1 1 3 2 1 1 3 2 1 1 3 2 1 1 3 2 1 1 3
2. Ejecucin de la clusula WHERE, donde se aplican las condiciones especificadas en la clusula WHERE a la tabla resultante del paso anterior, eliminando las filas que no satisfagan la condicin.
e.codem e.nomem 1 E1 2 E2 3 E3 4 E4 e.salar 1600 900 1000 1700 e.codde 10 10 20 30 d.codde 10 10 20 30 d.nomde D1 D1 D2 D3 d.presu 55000 55000 70000 60000 d.tidir F F P F d.codjefe 2 2 1 1
46
Case Despus de hacer el JOIN hay tantas filas como filas tenga la tabla que contiene la ltima clave ajena relacionada. En cada fila viene toda la informacin del empleado y toda la informacin del departamento al que est asignado. Si varios empleados trabajan en el mismo departamento toda la informacin del departamento viene repetida por cada uno de los empleados que tiene asignado.
3. Ejecucin de la clusula GROUP BY, que consiste en formar grupos con las filas de la tabla resultante de paso anterior de manera que cada grupo tenga los mismos valores en la columna de agrupamiento.
e.codem e.nomem 1 E1 2 E2 3 E3 4 E4 e.salar 1600 900 1000 1700 e.codde 10 10 20 30 d.codde 10 10 20 30 d.nomde D1 D1 D2 D3 d.presu 55000 55000 70000 60000 d.tidir F F P F d.codjefe 2 2 1 1
4. Ejecucin de la clusula HAVING, que consiste en eliminar de los grupos formados en el paso anterior los que no satisfagan la condicin expresada en esta clusula.
e.codem e.nomem 1 E1 2 E2 4 E4 e.salar 1600 900 1700 e.codde 10 10 30 d.codde 10 10 30 d.nomde D1 D1 D3 d.presu 55000 55000 60000 d.tidir F F F d.codjefe 2 2 1
5. Ejecucin de la clusula SELECT, que consiste en obtener una fila de cada grupo de los que quedan del paso anterior. Cada fila tendr los valores resultantes de calcular las expresiones incluidas en la clusula SELECT. Con todas las filas obtenidas se forma la tabla resultante de la sentencia SELECT. 6. Ejecucin de la clusula ORDER BY, que consiste en presentar la tabla resultante del paso anterior ordenada por los criterios especificados en la clusula ORDER BY.
nomde D3 D1 Count(*) 1 2
6.2.Consultas Subordinadas NO Correlacionales: Una sentencia SELECT puede tener en sus predicados otras sentencias SELECT con la funcin de subconsulta. A estas sentencias SELECT se las denomina sentencia SELECT o consulta SUBORDINADA. Las consultas subordinadas se pueden especificar en las clusulas WHERE y HAVING, como parte de uno de los siguientes predicados: 1. Predicado bsico de comparacin: >SELECT nomem FROM emple WHERE salar>(select avg(salar) from emple);
47
Case 2. Predicados cuantificados: >SELECT nomem FROM emple WHERE nvl(comis,0)>=all (select nvl(comis,0) from emple); 3. Predicado IN: >SELECT nomem FROM emple WHERE codem IN (select codjefe from depto where tidir=P); 4. Predicado EXISTS: >SELECT nomem FROM emple WHERE EXISTS (select * from emple where salar>1800); Una sentencia subordinada de otra puede a su vez tener otras subordinadas a ella: >SELECT --------- FROM ------------- WHERE (select ------ from ---------- where (select --------- from ----------------- where ------------))); Se llama sentencia externa a la primera sentencia SELECT de todas, es decir, la que no es subordinada de ninguna otra. Puede haber hasta 50 niveles de anidamiento de la sentencia SELECT. La sentencia externa puede ser en lugar de SELECT algunas de las sentencias DELETE, UPDATE o INSERT. Cuando hay sentencias anidadas diremos que una sentencia es antecedente de sta cuando sta es su subordinada directa o subordinada de su subordinada a cualquier nivel. 6.3.Consultas Subordinadas Correlacionadas: En las consultas subordinadas vistas hasta el momento slo se haca referencia a columnas de tablas que estn en su propia clusula FROM. Esto implica que le resultado de la consulta subordinada puede evaluarse independientemente de sus sentencias antecedentes. Por lo tanto el SGBD evala la consulta subordinada una sola vez y reemplaza los valores resultantes de la consulta en el predicado en el que se encuentra. Sin embargo, en las sentencias correlacionadas, en la consulta subordinada se especifica alguna columna de alguna tabla especificada en la clusula FROM de alguna de sus sentencias antecedentes. Una sentencia subordinada correlacionada no puede evaluarse independientemente de las sentencias antecedentes, pues su resultado cambia segn la fila de la sentencia antecedente que se evale en cada momento. Por lo tanto el SGBD evala la sentencia subordinada mltiples veces. Cuando en una sentencia subordinada se especifica un nombre de columna sin calificar se interpreta que se refiere a la primera tabla que conteniendo una columna con este nombre se encuentre a buscar en el siguiente orden: - En las tablas de su propia clusula FROM. - En la sentencia antecedente inmediata. - En la sentencia antecedente de siguiente nivel superior... y as hasta llegar hasta la sentencia externa.
48
Case
>INSERT INTO tabla[(col1,col2,...)] VALUES (valor1,valor2...) donde tabla es el nombre de la tabla en la que se desea insertar, col1, col2... es una lista de nombres de columnas de esta tabla (no necesariamente todas las columnas de la tabla ni en el mismo orden en que se han definido en la BD); si se omiten, el sistema lo interpreta como si se especificara una lista en la que se incluye todas las columnas de la tabla en el mismo orden en que aparecen en la definicin de la tabla. Valor1, valor2... pueden ser constantes, la palabra NULL o bien variables de programa (si se est en modo programacin) y debe haber tantos valores como en la lista anterior nombres de columnas. Este formato permite insertar una fila completa y solo una por cada sentencia, donde el primer valor de la lista se asigna a la primera columna, el segundo valor a la segunda columna, etc.. Si en la lista de columnas no se especifica alguna columna que permita valores nulos, al insertar la fila el sistema asigna nulo a esta columna. Formato 2:
>INSERT INTO tabla [(col1,col2,...)] subconsulta; En este formato todas las filas que resulten de ejecutar la subconsulta se insertan en la tabla. Por tanto, este formato de INSERT permite insertar con una sola sentencia una o varias filas. El nmero de columnas del resultado de la subconsulta debe ser igual al nmero de nombres de columnas especificado en las lista de columnas, asignndole el valor de la primera de ellas a la primera columnas de la lista, la segunda a la segunda, etc.. 7.2. Sentencia DELETE: La sentencia DELETE permite borrar filas de una tabla. Su formato es: >DELETE FROM tabla WHERE predicado; donde tabla es el nombre de la tabla en la que se quiere borrar filas, predicado es un predicado que puede contener subconsultas subordinadas. La sentencia DELETE borra todas las filas que cumplan la condicin expresada en la clusula WHERE. Si se omite la clusula WHERE borra todas las filas de la tabla.
49
Case 7.3. Sentencia UPDATE: La sentencia UPDATE permite modificar o actualizar varias filas de una tabla. Se puede modificar algunas columnas o todas las columnas de la tabla. Su formato es: >UPDATE tabla SET columna1=expresion1 [,columna2=expresion2]... [WHERE predicado]; donde tabla es el nombre de la tabla que se quiere actualizar, las expresiones de la clusula SET se evalan y su valor se asigna a las columnas indicadas. En las expresiones se puede hacer referencia a las columnas de la fila que actualmente se modifica. En el lugar de una expresin se puede especificar una subconsulta. Esta subconsulta debe devolver un valor nico. En las expresiones no se pueden utilizar funciones colectivas, aunque s en las subconsultas. La sentencia UPDATE actualiza todas las filas de la tabla que cumplen la condicin expresada en el predicado de la clusula WHERE. Si se omite la clusula WHERE se actualizan todas las filas de la tabla.
>SELECT nomde, nomce FROM depto, centro WHERE depto.codce(+)=centro.codce; Con esto se obtendra los departamentos que estn relacionados y los centros que estn relacionados o no. JOIN externo a derecha:
>SELECT nomde, nomce FROM depto, centro WHERE depto.codce=centro.codce(+); Con esto se obtienen todos los departamentos relacionados o no y los centros relacionados. NO SE PUEDEN INCLUIR JOINs EXTERNOS A IZQUIERDA Y DERECHA A LA VEZ!!!! Si se desea realizarlo ha de ser mediante el operador UNION. >SELECT nomde, nomce FROM depto d, centro c WHERE d.codce=c.codce(+) UNION SELECT nomde, nomce FROM depto d, centro c WHERE d.codce(+)=c.codce;
50
Case 8.2. Operadores de conjuntos: UNIN, INTERSECCIN y DIFERENCIA: Se pueden formular consultas en las que aparezcan ms de una sentencia SELECT, lo que se denomina consultas compuestas, utilizando los operadores de conjuntos UNIN, INTERSECCIN y DIFERENCIA. Cada sentencia SELECT dara como resultado una tabla, despus se combinan estas tablas de acuerdo con el operador de conjuntos obtenindose como resultado de la consulta compuesta una nica tabla. Las expresiones que aparecen en las clusulas SELECT han de ser iguales en nmero y tipo en todas las sentencias SELECT y en el mismo orden. Los operadores son: UNIN: selecciona las filas de las tablas resultantes de las consultas combinadas, eliminando las filas duplicadas. UNION ALL: selecciona las filas de las tablas resultantes de las SELECT combinadas sin eliminar las filas duplicadas. INTERSECT: selecciona las filas que aparezcan en todas las tablas resultantes de las SELECT combinadas, es decir, la interseccin. MINUS: selecciona las filas que pertenezcan a la primera tabla, pero no a la segunda.
8.3. Subconsultas de la clusula FROM: Se pueden especificar subconsultas en la clusula FROM de una SELECT en lugar de un nombre de tabla. La subconsulta especificada en la clusula FROM est definiendo una vista, por tanto la SELECT principal hace la consulta sobre una vista. >SELECT nomde FROM (select * from depto) WHERE tidir=F; >SELECT nomde, nomce FROM (select * from depto) A, (select * from centro) B WHERE A.codce=B.codce; >SELECT max(total) FROM (select nomde, sum(salar) total from emple e, depto d where e.codde=d.codde group by codde); 8.4. Comparacin simultnea de varias columnas en la clusula WHERE: >SELECT nomem FROM emple WHERE (codde,codem)=some (select codde, codjefe from depto where tidir=F);
51
Case
52
Case
Apndices
53
Case
54
APENDICE TEMA 3. 5. TIPOS DE DATOS 5.1 Insertar una fila con el valor 10-01-2002/13:54:32
>INSERT into prueba values(3,to_date(10-01-2002/13:54:32,dd-mm-yyyy/hh:mi:ss));
CASE
5.5. Obtener la fecha completa de todos los registros que se hayan insertado a partir de las 11 am.
>SELECT orden, to_char(fecha,dd-mm-yyyy/hh24:mi:ss) FROM prueba WHERE to_char(fecha,hh24)>=11;
6. FUNCIONES 6.1. Visualizar la fecha del sistema con el formato: Alcorcn a 4 de Octubre de 2002.
>SELECT Lpad(to_char(sysdate, En Alcorcn a dd de month de yyyy ),50) from dual;
55
APENDICE TEMA 3.
CASE
56
APENDICE TEMA 4. 4. CREACIN DE UNA TABLA 4.1Crear una tabla videoclub con los siguientes campos:
CASE
- Genero(codgen[PK CHAR(3)], dengen[UN y NN VARCHAR2]) - Socio (codsocio[PK NUMBER], nomsocio [NN VARCHAR2], direccion [NN], telefono) - Pelicula (codpel[PK NUMBER], titulo[NN], codgen[NN,FK], Duracion, Director, Precio_alquiler[NN]) - Copia (codpel[FK, PK], numcopia[PK], fecha_adquisicion[NN, DEFAULT sysdate] - Alquiler (codpel[FK*], numcop[FK* **]codsocio [FK**], fecha_alquiler[**PK,NN, DEFAULT sysdate], pagado[CHK(S, N) DEFAULT N)
>CREATE TABLE genero(codgenero char(3) constraint pk_genero primary key, dengenero varchar2(20) constraint nn_genero_dengenero not null constraint un_genero_dengenero unique); >CREATE TABLE socio(codsocio number(5) constraint pk_socio primary key, nomsocio varchar2(50) constraint nn_socio_nomsocio not null, direccion varchar2(50) constraint nn_socio_direccion not null, telefono char(11)); >CREATE TABLE pelicula(codpel number constraint pk_pelicula primary key, titulo varchar2(25) constraint nn_pelicula_titulo not null, codgenero char(3) constraint nn_pelicula_codgenero not null constraint fk_pelicula_genero references genero(codgenero), duracion number(3), director varchar2(25), precio_alquiler char(4) constraint nn_pelicula_precio not null); >CREATE TABLE copia(codpel number constraint fk_copia_pelicula references pelicula(codpel), numcopia number(3), fecha_adquision date, constraint pk_copia primary key (codpel,numcopia)); >CREATE TABLE alquiler(codpel number, numcopia number(3), codsocio number constraint fk_alquiler_socio references socio(codsocio), fecha_alquiler date default sysdate, pagado char default N constraint chk_alquiler_pagado check(pagado in(S,N)), constraint fk_alquiler_copia foreign key (codpel, numcopia) references copia(codpel,numcopia) on delete cascade, constraint pk_alquiler primary key (codpel,numcopia,codsocio,fecha_alquiler));
57
CASE
5.1. Aadir a la tabla pelicula la columna catalogacion, de tipo de dato char y longitud 1.
>ALTER TABLE pelicula add catalogacion char;
7.2. Otorgar los privilegios select e insert sobre pelicula a Tercero with grant option.
>GRANT select, insert on pelicula to Tercero WITH GRANT OPTION;
7.3. Otorgar update sobre la columna titulo de la tabla pelicula a Tercero y Cuarto.
>GRANT update(titulo) on pelicula to Tercero, Cuarto;
58
CASE
59
CASE
7.23. Retirar el privilegio INSERT sobre pelicula a Tercero con cascade constraint.
>REVOKE insert on pelicula from Tercero CASCADE CONSTRAINT;
8. CREACIN DE ROLES. 8.1. Crear un rol llamado palvideoclub que conceda el permiso de consulta sobre la tabla gnero. Posteriormente conceder este rol a Tercero, y consultar la tabla genero con Tercero y con Cuarto.
>CREATE ROLE palvideoclub; >GRANT select ON genero TO palvideoclub; >GRANT palvideoclub TO Cuarto; >CONNECT Tercero/matrix; >SELECT * from puesto13.genero; >CONNECT Cuarto/matrix; SELECT * from puesto13.genero; [ERROR]
9. CREACION DE NDICES.
>CREATE INDEX idx_pelicula_titulo ON pelicula (titulo ASC); >CREATE INDEX idx_alquiler_copia ON alquiler(codpel,numcopia ASC); >SELECT index_name, index_type, table_owner, table_name FROM user_indexes;
60
CASE
11. CREACIN DE VISTAS. 11.1. Crear una vista cartelera que tenga las columnas de la tabla pelicula que no permiten nulos.
>CREATE VIEW cartelera AS select codpel, titulo, codgen, precio_alquiler FROM pelicula;
11.2. Crear una vista cartelera2 con las mismas columnas de la vista anterior pero asignndole los nombres de las columnas completos.
>CREATE VIEW cartelera2 (codigo_pelicula, Ttulo, Cdigo_Gnero, Precio_Alquiler) AS select codpel, titulo, codgen, precio_alquiler from pelicula;
11.3. Crear una vista llamada peliculas_suspense que contenga las pelculas de suspense.
>CREATE VIEW peliculas_suspense AS select * FROM pelicula WHERE codgen=sus;
11.4. Crear de nuevo la vista cartelera2 con la clusula with read only
>DROP VIEW cartelera2; >CREATE VIEW cartelera2 (Codigo_Pelicula, Ttulo, Cdigo_Gnero, Precio_Alquiler) AS select codpel, titulo, codgen, precio_alquiler from pelicula WITH READ ONLY;
61
CASE
Se desea informatizar mediante una BD relacional la informacin referente al personal de una empresa de servicios ubicada en Madrid. Esta empresa tiene la siguiente organizacin: 1. La empresa tiene en la actualidad 3 centros o edificios donde se ubican sus oficinas. 2. La empresa est estructurada en departamentos. Cada departamento est ubicado en un centro. 3. Un departamento puede depender orgnicamente de otro departamento. 4. Cada departamento tiene un empleado jefe de departamento y varios empleados que trabajan en el departamento. 5. Un empleado est asignado a un departamento. Es posible que un empleado est asignado a un departamento pero que sea jefe de otros departamentos distintos al que est asignado. 6. Cada empleado tiene una categora laboral.
CENTRO
1 UBICA N N 1
DEPENDE
DEPARTAMENTO
1 N D/E N
DP/E
EMPLEADO
N E/C
CATEGORA
1. Crear el rol DBGESTOR con los privilegios del sistema para crear roles y 2. 3. 4. 5. 6. 7. 8.
sinnimos. Crear el usuario DAI2/DAI2 Conceder a DAI2 los roles de CONNECT, RESOURCES y DBGESTOR. Crear las tablas de la BD de personal. Insertar 2 filas en CATEGO, 1 en CENTRO, 2 en DEPTO (asignando jefe de departamento), y 4 en EMPLE. Crear el rol QUERYPERSONAL que de permisos para insertar, borrar, actualizar y consultar las tablas de personal. Crear sinnimos pblicos para las 4 tablas de personal con los mismos nombres de las tablas originales. Crear el usuario PROGRAMADOR otorgndole los roles CONNECT y QUERYPERSONAL.
62
APENDICE TEMA 4.
CASE
1. >CREATE role DBGESTOR; >GRANT create role, create synonym TO DBGESTOR; 2. >CREATE user DAI2 IDENTIFIED BY DAI2 default tablespace user; 3. >GRANT connect, resource, dbgestor to DAI2; >CONNECT DAI2/DAI2; 4. >CREATE TABLE emple(codem number(3) constraint nn_emple_codem not null constraint pk_emple primary key, nomem varchar2(25) constraint nn_emple_nomem not null constraint un_emple_nomem unique, codde number(3) constraint nn_emple_codde not null, extel char(4), fecnac date constraint nn_emple_fecnac not null, fecing date constraint nn_emple_fecing not null, salar number(7,2) constraint nn_emple_salar not null, comis number(7,2), numhi number(2) constraint nn_emple_numhi not null, codcat number(2) constraint nn_emple_codcat not null); CREATE TABLE centro(codce number(2) constraint pk_centro primary key, nomce varchar2(20) constraint nn_centro_nomce not null constraint un_centro_nomce unique, dirce vasrchar2(40)); CREATE TABLE catego(codcat number(2) constraint pk_catego primary key, nomcat varchar2(20) constraint nn_catego:nomcat not null constraint un_catego_nomcat unique); CREATE TABLE depto(codde number(3) constraint pk_depto primary key, nomde varchar2(20) constraint nn_depto_nomde not null constraint un_depto_nomde unique, codce number(2) constraint nn_depto_codce not null constraint fk_depto_centro references centro(codce), codjefe number(3) constraint fk_depto_emple references emple(codem), tidir char(1) constraint chk_depto_tidir check(tidir in(P,F)) constraint nn_depto_tidir not null, presu number(9,2), depde number(3) constraint fk_depto_depto references depto(codde)); >ALTER TABLE emple ADD constraint fk_emple_depto FOREIGN KEY (codde) references depto(codde) ON DELETE CASCADE; >ALTER TABLE emple ADD constraint fk_emple_catego FOREIGN KEY (codcat) references catego(codcat) ON DELETE CASCADE;
63
APENDICE TEMA 4.
CASE
5. >INSERT INTO catego VALUES (1, DIRECTOR GENERAL); >INSERT INTO catego VALUES (2, OPERADOR); >INSERT INTO centro VALUES (1, LA ARBOLEDA, AVDA. OESTE S/N); >ALTER TABLE depto DISABLE constraint fk_depto_emple; >INSERT INTO depto VALUES (1, INFORMATICA,1,1,P..); >INSERT INTO depto VALUES (2, ATNCION AL CLIENTE,1,,F,,); >ALTER TABLE emple DISABLE constraint fk_emple_depto; >INSERT INTO emple VALUES(1,RODRIGUEZ RINCON, DAVID...) x4; >ALTER TABLE emple ENABLE constraint fk_emple_depto; >ALTER TABLE depto ENABLE constraint fk_depto_emple; 6. >CREATE ROLE querypersonal; >GRANT insert, delete, update, select ON emple TO querypersonal; >GRANT insert, delete, update, select On depto TO querypersonal; >GRANT insert, delete, update, select ON centro TO querypersonal; >GRANT insert, delete, update, select ON catego TO querypersonal; >SELECT * FROM emple, depto, centro, catego; 7. >CONNECT DeMoN/matrix; >GRANT create public synonym TO dbgestor; >CONNECT dai2/dai2; >CREATE PUBLIC SYNONYM depto FOR depto; >CREATE PUBLIC SYNONYM emple FOR emple; >CREATE PUBLIC SYNONYM centro FOR centro; >CREATE PUBLIC SYNONYM catego FOR catego; 8. >CONNECT DeMoN/matrix >CREATE USER programador IDENTIFIED BY matrix default tablespace user; >GRANT connect, querypersonal TO programador; SELECT constraint_name, status FROM user_constraints;
64
CASE
Obtener todos los nombres de los centros de trabajo de la empresa ordenados alfabticamente.
1.2.
Obtener los nombres de los empleados que trabajan en el departamento 121 ordenados por orden alfabtico.
1.3.
1.4.
Obtener los nombres y salarios de los empleados con ms de 3 hijos, ordenado alfabticamente.
1.5.
Obtener el cdigo del departamento en que trabajan, el nombre del empleado y su comisin de aquellos empleados cuyo salario es inferior a 1.200, clasificndolos por departamento en orden descendente, por comisin en orden ascendente dentro de cada departamento.
>SELECT codde, nomem, comis FROM emple WHERE salar<1200 ORDER BY 1 DESC, 3 ASC;
1.6.
Obtener por orden alfabtico los nombres de los departamentos cuyo presupuesto sea superior a 120.000.
1.7.
Obtener por orden alfabtico los nombres de los departamentos que tienen jefe en propiedad.
1.8.
Obtener un listn telefnico de los empleados del departamento 121 en el que se incluya nombre de empleado, cdigo de empleado y extensin telefnica.
65
CASE
Obtener una relacin de todas las extensiones telefnicas con el nombre del empleado que la tiene asignada, ordenndola en orden decreciente de extensin telefnica y dentro de cada extensin en orden alfabtico.
1.10. Obtener el nombre, salario y comisin de aquellos empleados con ms de 3 hijos clasificados por comisin, y dentro de sta por orden alfabtico.
>SELECT nomem, salar, comis FROM emple WHERE numhi>3 ORDER BY 3,1;
2. EXPRESIONES. 2.1. Obtener los nombres y salarios anuales de los empleados, expresados en ptas. de los empleados del departamento 100, presentados ordenados en orden decreciente de salario anual.
>SELECT nomem, salar*166.386 *12 FROM emple WHERE codde=100 ORDER BY salar DESC;
2.2.
Obtener los nombres de los empleados cuya comisin es superior o igual al 20% de su salario.
2.3.
En una campaa de ayuda familiar se ha decidido dar a los empleados una paga extra de 50 por hijo a partir del 4 hijo inclusive. Obtener por orden de paga extra y dentro de sta ordenado alfabticamente el nombre del empleado y el sueldo que incluya la paga extra.
2.4.
A los empleados se les concede una gratificacin de 30/hijo. Obtener los nombres de los empleados cuya gratificacin supere el 5% de su salario, ordenado alfabticamente.
66
CASE
Llamamos presupuesto medio anual de un departamento al resultado de dividir su presupuesto anual entre 12. Se decide aumentar los presupuestos medios mensuales de todos los departamentos en un 10% a partir del mes de octubre inclusive. Obtener por orden alfabtico el nombre de departamento, su presupuesto anual despus del incremento de aquellos departamentos cuyo presupuesto mensual medio anterior a octubre es de 10.000.
2.6.
A pesar de que en el prximo ao todos los indicadores econmicos preveen una inflaccin del 2%, el gobierno se empea en decir que ser de un 3%. Los empresarios, ms interesados en la previsin del gobierno del 3%, deciden aumentar el salario de los empleados en un 3%. Obtener por orden alfabtico el nombre del empleado, su suelda anual actual y su sueldo anual con la subida. Presentar las magnitudes separadas por puntos decimales y comas de millar.
2.7.
Obtener el cdigo de empleado, su nombre, su sueldo en pesetas de aquellos empleados que tienen un sueldo superior a 1.800. Ordenar por departamento y alfabticamente.
>SELECT codem, nomem, (salar+comis)*166.386 FROM emple WHERE salar+comis>1800 ORDER BY codem, nomem;
2.8.
Obtener los cdigos de departamento en los que haya algn empleado cuya comisin supere el 15% de su salario.
2.9.
Obtener la relacin de empleados que comparten la extensin 880 o 3131. Ordenar por cdigo de departamento y dentro de stos alfabticamente.
>SELECT codde, nomem FROM emple WHERE extel=3131 or 880 ORDER BY codde, nomem;
67
CASE
Obtener por orden alfabtico los empleados que trabajan en el mismo departamento que NIETO ORTEGA, RUBN.
>SELECT nomem FROM emple WHERE codde=(select codde from emple where nomem=NIETO ORTEGA, RUBEN) ORDER BY nomem;
3.2.
Obtener por orden alfabtico los nombres de los empleados cuyo salario sea igual o superior en ms del 15% al salario del empleado NIETO ORTEGA, RUBEN.
>SELECT nomem FROM emple WHERE salar<=1.15*(select salar from emple where nomem=NIETO ORTEGA, RUBEN);
3.3.
3.4.
3.5.
3.6.
Obtener los nombres de los empleados que cobran menos de 150 de comisin.
3.7.
3.8.
Obtener los nombres de los empleados que trabajen en un departamento con presupuesto inferior a 100.000.
>SELECT nomem FROM emple WHERE codde=SOME(select codde from depto where presu<100000);
68
CASE
Obtener por orden alfabtico los nombres de los empleados cuyo salario supera al mximo salario de los empleados del departamento 122.
>SELECT nomem FROM emple WHERE salar>ALL (select salar from emple where codde=122) ORDER BY 1;
3.10. Obtener el nombre del empleado que ms cobra del departamento 100.
>SELECT nomem FROM emple WHERE codd=100 AND salar>=ALL(select salar from emple where codde=100);
3.11. Obtener el nombre y el sueldo total de los empleados que tienen un jefe en funciones.
>SELECT nomem, salar+nvl(comis,) FROM emple WHERE codde=SOME (select codde from depto where tidir=F);
3.12. Obtener el nombre de los empleados que comparten extensin telefnica con el empleado EGIDO COLL, OSCAR.
>SELECT nomem FROM emple WHERE extel= (select extel from emple where nomem=EGIDO COLL, OSCAR);
3.13. Obtener los nombres de los empleados que trabajan en el departamento del cual es jefe el empleado con cdigo 180.
>SELECT nomem FROM emple WHERE codde=SOME (select codde from depto where codjefe=180);
3.14. Obtener los nombres de departamento cuyo presupuesto supere en un 25% el presupuesto del departamento ORGANIZACIN.
>SELECT nomde FROM depto WHERE presu > (select presu*1.25 from depto where nomde=ORGANIZACIN);
3.15. Obtener los nombres de los empleados que van a trabajar a la SEDE CENTRAL.
>SELECT nomem FROM emple WHERE codde=SOME (select codde from depto where codce= (select codce from centro where nomce=SEDE CENTRAL));
69
APENDICE TEMA 5.
CASE
3.16. Obtener los nombres de los empleados que trabajan en el departamento del que es jefe el empleado MONROY DE CELIS, JAIME.
>SELECT nomem FROM emple WHERE codde=SOME (select codde from depto where codjefe= (select codem from emple where nomem=MONROY DE CELIS, JAIME));
3.18. Obtener el nombre de departamento del que es jefe el empleado COZAR MENCHERO, IVN.
>SELECT nomde FROM depto WHERE codjefe= (select codem from emple where nomem=COZAR MENCHERO, IVAN);
3.19. Obtener por orden alfabtico los nombres y sueldos de los jefes de departamento de la empresa.
>SELECT nomem, salar+nvl(comis,) FROM emple WHERE codem= SOME (select codjefe from depto);
3.20. Obtener los nombres de los empleados cuyo salario este entre 1.200 y 1.400.
>SELECT nomem FROM emple WHERE salar+nvl(comis,) BETWEEN 1200 and 1400;
3.21. Obtener el nombre de los empleados cuyo primer apellido empiece por las letras p,q,r s.
>SELECT nomem FROm emple WHERE nomem BETWEEN P and T;
3.23. Obtener los empleados cuyo nombre de pila contenga el nombre JOS.
>SELECT nomem FROM emple WHERE nomem LIKE %,%JOSE OR nomem LIKE %,JOSE%
70
APENDICE TEMA 5.
CASE
3.25. Obtener en orden alfabtico los nombres de los empleados cuya extensin telefnica sea 880/650/780.
>SELECT nomem FROM emple WHERE extel IN(880,650,780) ORDER BY 1;
3.26. Obtener los nombres de los empleados que son compaeros de trabajo de PUMAR REY, JOS y RINCN FERNANDEZ, LEONARDO.
>SELECT nomem FROM emple WHERE codde IN (select codde from emple where nomem in(PUMAR REY, JOSE, RINCON FERNANDEZ, LEONARDO));
3.27. Obtener los nombres de departamento en los que haya empleados que no cobren comisin.
>SELECT nomde FROM depto WHERE codde IN (select codde from emple where comis is null);
3.28. Si algn empleado se apellida de segundo apellido MARTIN, entonces visualizar el nombre de todos los empleados de la empresa, y si no no visualizar nada.
>SELECT nomem FROM emple WHERE EXISTS (select * from emple where nomem like %MARTIN,%);
3.29. Si en el departamento 100 hay algn empleado que se llama de primer apellido MARTIN, visualizar los nombres de todos los empleados del departamento 100.
>SELECT nomem FROM emple WHERE codde=100 AND EXISTS (select * from emple where nomem likeMARTIN %,% AND codde=100);
3.30. Obtener en orden alfabtico los nombres y salarios de los empleados que no tienen hijos y ganan ms de 1.500 o tienen hijos y ganan menos de 1.500.
>SELECT nomem, salar FROM emple WHERE (numhi= AND salar>1500) OR (numhi<> AND salar<1500) ORDER BY 1;
71
APENDICE TEMA 5.
CASE
3.31. Obtener el cdigo de departamento, el nombre del empleado y el sueldo total de los empleados que no tienen hijos y no cobran comisin. Presentarlo ordenado por departamento y dentro de l alfabticamente.
>SELECT codde, nomem, salar DFROM emple WHERE numhi= AND comis IS NULL ORDER BY 1,2;
3.32. Obtener el cdigo de departamento, el nombre del empleado y el sueldo de los empleados que trabajan en los departamento 110 y 112.
>SELECT codde, nomem, salar+nvl(comis,) FROM emple WHERE codde=110 OR codde=112 ORDER BY 1;
3.33. Obtener el cdigo de departamento, nombre de empleado y salario de los empleados que trabajan en el departamento 110y 112 y cobran ms de 1.400.
>SELECT codde, nomde, salar FROM emple WHERE (codde=110 OR codde=112) AND salar>1400 ORDER BY 1;
3.35. Obtener el nombre y fecha de nacimiento de los empleados que ingresaron en la empresa hace ms de 8 aos.
>SELECT nomem, fecnac FROM emple WHERE (SYSDATE- fecing)/365>8;
3.36. Obtener los nombres de los empleados que trabajan en la calle Alcal.
>SELECT nomem FROM emple WHERE codde=SOME (select codde from depto where codce=some (select codce from centro where dirce like C/ALCALA,%));
3.37. Obtener el nombre del empleado y el sueldo total en pesetas de aquellos empleados cuya comisin supere el 10% de su salario y trabajen en un departamento que tenga un presupuesto superior a 100.000 y que no est ubicado en la calle Alcal.
>SELECT nomem, (salar+nvl(comis,))*166.386 FROM emple WHERE comis>salar*0.10 AND codde>SOME (select codde from depto where presu>100000 and codce <>all(select codce from centro where dirce like C/ALCALA,%));
72
APENDICE TEMA 5.
CASE
3.38. Obtener los nombres de los empleados que tienen la misma extensin telefnica que el empleado 120 y trabajan en un departamento cuyo presupuesto es inferior al presupuesto del departamento 110.
>SELECT nomem FROM emple WHERE extel= (select extel from emple where codem=120) AND codde=SOME (select codde from depto where presu< (select presu from depto where codde=110));
3.39. Obtener los nombres de centro en los que haya jefes de departamento en funciones con un sueldo total superior a 1.200.
>SELECT nomce FROM centro WHERE codce=SOME (select codce from depto where tidir=F and codjefe=SOME (select codem from emple where salar+nvl(comis,)>1200));
3.40. Obtener los nombres de empleado cuyo salario es superior al 75% del salario del jefe del departamento INGENIERIA y trabaja en un departamento con jefe en funciones.
>SELECT nomem FROM emple WHERE salar> (select salar*.75 from emple where codem= (select codjefe from depto where nomde=INGENIERIA)) AND codde=SOME (select codde from depto where tidir=F);
3.41. Obtener el sueldo total , el nombre de empleado y el cdigo del departamento en que trabaja de aquellos empleados que tienen la categora profesional ASESOR TCNICO y su salario supera los salarios de los empleados con categora profesional CONSULTOR del departamento informtico. Presentarlos ordenados por cdigo de departamento y sueldo total.
>SELECT nomem, salar+nvl(comis,), codde FROM emple WHERE codcat= (select codcat from catego where nomcat=ASESOR TECNICO) AND salar>ALL (select salar from emple where codcat= (select codcat from catego where nomcat=CONSULTOR) and codde= (select codde from depto where nomde=INFORMATICA)) ORDER BY 3,2;
3.42. Obtener los nombres de departamento donde no haya empleados de la categora RELACIONES PUBLICAS.
>SELECT nomde FROM depto WHERE codde<>ALL (select codde from emple where codcat= (select codcat from catego where nomcat=RELACIONES PUBLICAS));
73
APENDICE TEMA 5.
CASE
3.43. Obtener el nombre y sueldo total de los empleados cuyo sueldo total supera al salario mnimo de la empresa en 250.
>SELECT nomem, salar+nvl(comis,) FROM emple WHERE salar+nvl(comis,)>SOME (select salar+250 from emple);
4. FUNCIONES DEL LENGUAJE SQL. 4.1. Obtener en orden alfabtico los nombres de los empleados que tengan ms de 20 caracteres en su nombre completo.
4.2.
Obtener los nombres abreviados de los departamentos tomando las 10 primeras letras.
4.3.
Obtener los cdigos de departamento y los 5 caracteres siguientes que estn a continuacin del carcter 12 de sus nombres.
4.4.
Obtener los cdigos de departamento y las 5 ltimos caracteres de su nombre de aquellos departamentos que tengan en nombre con ms de 12 caracteres.
4.5.
Obtener por orden alfabtico los nombres de los empleados suprimiendo las 3 ltimas cifras del nombre de pila para aquellos empleados cuyo nombre de pila tenga ms de 6 letras.
>SELECT SUBSTR(nomem,1,LENGTH(nomem)-3) FROM emple WHERE nomem LIKE %,_ _ _ _ _ _%; >SELECT SUBSTR(nomem, INSTR(nomem,,)+2, LENGTH(SUBSTR(nomem, INSTR(nomem,,)+2))-3) FROM emple WHERE LENGTH(SUBSTR(nomem,INSTR(nomem,,)+2))>6 ORDER BY nomem;
4.6.
Obtener el valor mximo, mnimo, media aritmtica y suma de los salarios de los empleados de la empresa.
74
CASE
Obtener los mismos datos del ejercicio anterior de los empleados que trabajan en el departamento 120 y no cobran comisin.
>SELECT MAX(salar), MIN(salar), AVG(salar) FROM emple WHERE codde=120 AND comis IS NULL;
4.8.
Obtener en orden alfabtico los salarios y nombres de los empleados cuyo salario sea mayor aquel 60% del mximo salario de la empresa.
>SELECT nomem, salar FROM emple WHERE salar> (select max(salar)*0.60 from emple) ORDER BY 1;
4.9.
4.10. Obtener cuantos empleados y cuantas extensiones telefnicas hay en el departamento 112.
>SELECT COUNT(*), COUNT (DISTINCT extel) FROM emple WHERE codde=112;
4.12. Obtener el cdigo de empleado, su nombre y su sueldo total de los empleados cuyo sueldo total supera al salario mnimo de informtica en ms de 400.
>SELECT codem, nomem, salar+nvl(comis,) FROM emple WHERE salar+nvl(comis,)> (select min(salar)+400 from emple where codde= (select codde from depto where nomde=INFORMATICA));
4.13. Obtener el preupuesto medio de los departamentos cuyo presupuesto supera al presupuesto medio de todos los departamentos de la empresa.
>SELECT AVG(presu) FROM depto WHERE presu>(select avg(presu) from depto);
4.14. Obtener el salario medio de los empleados cuyo salario supera en ms del 20% al salario mnimo de los empleados que tienen hijos y su salario medio por hijo es mayor de 300.
>SELECT AVG(salar) FROM emple WHERE salar> (select min(salar)*1.20 from emple where salar/numhi>300 and numhi>);
75
APENDICE TEMA 5.
CASE
4.15. Obtener el nombre y presupuesto de los departamentos ubicados en la C/Alcal cuyo presupuesto supere al mnimo presupuesto de los departamentos no ubicados en la C/Alcal.
>SELECT nomde, presu FROM depto WHERE codce= SOME (select codce from centro where dirce like C/ALCALA%) AND presu>(select min(presu) from depto where codce<>all (select codce from centro where dirce like C/ALCALA%));
5. CONSULTAS CON AGRUPAMIENTO DE FILAS. 5.1. Obtener para cada departamento la suma de los salarios de sus empleados, el mximo y el mnimo salario.
>SELECT codde, SUM(salar), MAX(salar), MIN(salar) FROM emple GROUP BY codde ORDER BY codde;
5.2.
Obtener de cada departamento la fecha de nacimiento del empleado con mayor edad que tenga comisin.
>SELECT codde, MIN(fecnac) FROM emple WHERE comis IS NOT NULL GROUP BY codde;
5.3.
5.4.
Agrupando por cdigo de departamento y nmero de hijos obtener cuntos empleados hay en cada grupo.
5.5.
Obtener el cdigo de departamento y la suma de los salarios de sus empleados para aquellos departamentos en los que trabajan ms de 3 empleados.
>SELECT codde, SUM(salar), COUNT(*) FROM emple GROUP BY codde HAVING count(*)>3;
76
CASE
Obtener el salario mximo y mnimo de los empleados que cobran comisin para cada grupo de empleados con igual nmero de hijos, de aquellos grupos en los que hay ms de 4 empleados y el salario mximo del grupo supera los 1.400.
>SELECT MAX(salar), MIN(salar), numhi, COUNT(*) FROM emple WHERE comis IS NOT NULL GROUP BY numhi HAVING COUNT(*)>4 AND MAX(salar)>1400;
5.7.
Obtener la media aritmtica de los salarios de los empleados de cada departamento para aquellos departamentos cuyo salario mximo es menor a la media de salarios de la empresa.
>SELECT AVG(salar) FROM emple GROUP BY codde HAVING MAX(salar)<(select avg(salar) from emple);
5.8.
Para cada departamento que tenga ms 2 empleados con hijos obtener el salario mximo y el salario mnimo de los empleados que trabajan en el departamento, tanto de los que tienen hijos como los que no.
>SELECT codde, MAX(salar), MIN(salar) FROM emple GROUP BY codde HAVING codde=SOME(select codde from emple where numhi) group by codde having count(*)>2);
5.9.
Obtener para cada departamento cuantos empleados trabajna en el, la suma de sus salarios y la suma de sus comisiones para aquellos departamentos en los que haya empleados cuyo salario sea mayor de 1.700.
>SELECT codde, COUNT(*), SUM(salar), SUM(nvl(comis,)) FROM emple GROUP BY codde HAVING codde=SOME(select codde from emple where salar>1700);
5.10. Para cada extensin telefnica obtener cuantos empleados la utilizan y su salario medio.
>SELECT extel, COUNT(*), AVG(salar) FROM emple GROUP BY extel;
5.11. Para cada departamento obtener la media de las comisiones con respecto a los empleados que reciben comisin y la media aritmtica de comisiones con respecto al total de empleados.
>SELECT codde, AVG(comis), AVG(nvl(comis,)) FROM emple GROUP BY CODDE;
77
APENDICE TEMA 5.
CASE
5.13. Obtener la media de salarios de los empleados que son jefes de departamento en funciones.
>SELECT AVG(salar) FROM emple WHERE codem=SOME (select codjefe from depto where tidirF);
5.15. Para los departamentos en los que hay algn empleado que no cobra comisin obtener cuantos empleados hay en promedio por extensin telefnica.
>SELECT codde, COUNTcodem)/COUNT(DISTINCT extel) FROM emple GROUP BY codde HAVING codde=SOME(select codde from emple where comis IS NULL);
5.16. Para los departamentos en los que la media de salario supera la media de salarios de todos lod empleados de la empresa, obtener cuantas extensiones telefnicas tiene asignadas.
>SELECT codde, COUNT(DISTINCT extel) FROM emple GROUP BY codde HAVING AVG(salar)>(select avg(salar) from emple);
5.17. Obtener la suma de los salarios de aquel departamento que tenga mayor coste de salarios de sus empleados.
>SELECT codde, SUM(salar) FROM emple GROUP BY codde HAVING SUM(salar)>=all(select sum(salar) from emple group by codde);
5.18. Obtener la extensin telefnica y los nombres de los empleados que la tienen asignada de aquellas extensiones que son utilizadas por ms de 3 empleados.
>SELECT extel, nomem FROM emple WHERE extel=SOME(select extel from emple group by extel having count(*)>2);
78
APENDICE TEMA 5.
CASE
5.19. De cada departamento en el que trabajan ms de 3 empleados cuyo salario supere los 1.400 obtener la media aritmtica de los salrios de todos los empleados del departamento.
>SELECT codde, AVG(salar) FROM emple GROUP BY codde HAVING codde=SOME (select codde from emple where salar>1400 group by codde having count(*)>3);
5.20. Obtener las extensiones telefnicas que pertenezcan a un departamento en el que hayan ms de 2 extensiones telefnicas y que estn compartidas por mas de un empleado y por menos de 5 empleados del mismo departamento.
>SELECT codde, extel FROM emple WHERE codde=SOME (select codde from emple group by codde having count(distinct extel)>2) AND estel IS NOT NULL GROUP BY codde, extel HAVING count(*) BETWEEN 1 AND 5;
6. CONSULTAS SOBRE VARIAS TABLAS. 6.1. Obtener todos los departamentos de la empresa indicando el cdigo de departamento, el nombre del departamento y el nombre del centro en el que se ubica.
6.2.
Obtener los nombres de todos los empleados indicando el nombre del departamento donde estn asignados y el nombre del centro al que van a trabajar.
>SELECT e.nomem, d.nomde, c.nomce FROM emple e, depto d, centro c WHERE d.codce=c.codce AND e.codde=d.codde ORDER BY 1;
79
CASE
Obtener los nombres de los empleados que cobran comisin indicando los nombres de departamento en que trabajan y el centro en el que se ubica su departamento.
>SELECT e.nomem, d.nomde, c.nomce FROM emple e, depto d, centro c WHERE e.comis IS NOT NULL AND c.codce=d.codce AND e.codde=d.codde;
6.4.
Obtener los nombres de los empleados de la empresa y la direccin a la que van a trabajar.
>SELECT e.nomem, c.dirce FROM emple e, depto d, centro c WHERE d.codce=c.codce AND e.codde=d.codde;
6.5.
Obtener el nombre de empleado, el nombre del departamento en el que trabaja y el nombre del centro en que se ubica el departamento de aquellos empleados que van a trabajar a la C/Alcal.
>SELECT e.nomem, d.nomde, c.nomce FROM emple e, depto d, centro c WHERE e.codde=d.codde AND d.codce=c.codce AND c.codce=SOME(select codce from centro where dirce like C/ALCALA%);
6.6.
obtener el nombre de departamento y el nombre del departamento del que depende de aquellos departamentos que dependen de un departamento con presupuesto inferior a 100.000.
>SELECT d1.nomde, d2.nomde FROM depto d1, depto d2 WHERE d2.presu<100000 AND d2.codde=d1.depde;
6.7.
Obtener los nombres de los jefes del departamento y los nombres de departamento de los que son jefes cuando los jefes son en funciones.
>SELECT e.nomem, d.nomde FROM emple e, depto d WHERE tidir?F AND e.codem=d.codjefe;
6.8.
Obtener los nombres de y los nombres de sus jefes de departamento de aquellos empleados que cobran ms que sus jefes.
>SELECT e1.nomem, e1.salar, e2.nomem, e2.salar FROM emple e1, emple e2, depto d WHERE e2.codem=d.codjefe AND e1.codde=e2.codde AND e1.salar>e2.salar;
80
CASE
Obtener los nombres de los empleados cuyos salarios superen a la media de los salarios de sus compaeros de departamento.
>SELECT nomem FROM emple WHERE salar>(select avg(salar) from emple e1 where e1.codde=emple.codde);
6.10. Obtener el nombre de empleado cuyo salario supere la media de salarios de los compaeros de departamento sin incluirse l.
>SELECT nomem FROM emple e1 WHERE salar>(select avg(salar) from emple where codde=e1.codde and codem<>e1.codem);
6.11. De cada departamento obtener cuantos empleados son mayores que su jefe de departamento. Presentar el nombre de empleado y el nmero de empleados.
>SELECT nomde, count(*) FROM depto d, emple e1 WHERE e1.codde=d,codde AND fecnac<(select fecnac from emple where codem=some (select codjefe from depto) and emple.codde=d.codde) GROUP BY nomde; >SELECT nomde, count(*) FROM depto d, emple e WHERE e.codde=d.codde AND fecnac<(select fecnac from emple where codem=d.codjefe) GROUP BY nomde;
6.12. De cada departamento obtener cuantos empleados son mayores que su jefe de departamento. Presentar el nombre de empleado y el nmero de empleados. (sin usar correlacionadas).
>SELECT nomde, count(*) FROM depto d, emple e1, emple e2 WHERE e1.codde=d.codde AND d.codjefe=e2.codem AND e1.fecnac<e2.fecnac GROUP BY nomde;
81
APENDICE TEMA 5.
CASE
6.13. Obtener los nombres de departamento y la direccin donde se ubican de aquellos departamentos cuyo presupuesto es inferior a 10 veces la suma de los salarios de sus empleados que cobran comisin.
>SELECT nomde, dirce FROM depto d, centro c WHERE d.codce=c.codce AND d.presu<(select sum(salar)*10 from emple where comis is not null And emple.codde=d.codde);
6.14. Obtener los nombres de departamento y los nombres de centro donde se ubican de aquellos departamentos cuyo presupuesto es superior a la media aritmtica de los presupuestos de los departamentos que dependen de l.
>SELECT nomde, nomce FROM depto d, centro c WHERE d.codce=c.codce AND d.presu>(select avg(presu) from depto where depde=d.codde);
6.15. Para los departamentos cuyo presupuesto supera los 90.000 obtener el promedio de empleados por extensin telefnica.
>SELECT codde, count(distinct extel)/count(*) FROM emple WHERE codde=some(slect codde from depto where presu>90000) GROUP BY codde; >SELECT d,nomde, count(distinct extel)/count(*) FROM depto d, emple e WHERE d.codde=e.codde AND d.presu>90000 GROUP BY nomde;
6.16. De cada departamento que tenga un presupuesto inferior a 100.000 obtener cuantos empleados cobran ms de 1.000.
>SELECT codde, count(*) FROM emple WHERE codde=some (select codde from depto where presu<100000) AND salar+nvl(comis,)>1000 GROUP BY codde; >SELECT d.nomde, count(*) FROM emple e, depto d WHERE d.codde=e.codde AND d.presu<100000 AND e,salar+nvl(comis,)>1000 GROUP BY nomde;
82
CASE
6.18. Obtener los nombres de departamento que son de nueva creacin, es decir, que no tenga empleados asignados y no tengan jefe en propiedad.
>SELECT nomde FROM depto WHERE tidir<>P AND NOT EXISTS (select * from emple where codde=depto.codde);
6.19. Obtener los nombres de jefes de primer nivel, es decir, que son jefes de un departamento que no depende de otro departamento.
>SELECT nomem FROM emple e WHERE EXISTS (select * from depto where codjefe=e.codem and depde is null); >SELECT nomem FROM emple, depto WHERE depto.codjefe=emple.codem AND depto.depde IS NULL;
6.20. Obtener los nombres de jefe de ltimo nivel, es decir, que sean jefes de un departamento del cual no dependen otros departamentos.
>SELECT nomem FROM emple e, depto d WHERE e.codem=d.codjefe AND NOT EXISTS (select * from depto where depde=d.codde) GROUP BY nomem; >SELECT nomem FROM emple, depto WHERE codem=codjefe AND depto.codde<>ALL(select depde from depto where depde is not null);
83
APENDICE TEMA 5.
CASE
6.21. Obtener los nombres de los empleados que trabajan en un departamento que tiene jefe en propiedad y adems ese jefe es jefe en funciones de otro departamento.
>SELECT nomem FROM emple e, depto d WHERE e.codde=d.codde AND d.tidir=P AND d.codjefe=SOME(select codjefe from depto where tidir=F); >SELECT nomem FROM emple e, depto d WHERE e.codde=d.codde AND tidir=P AND EXISTS (select * from depto where tidir=F and codjefe=d.codjefe);
6.22. Obtener los nombres de departamento en que todos sus empleados tienen la misma categora laboral.
>SELECT distinct nomde FROM emple e, depto d WHERE e.codde=d.codde AND codcat=ALL (select codcat from emple where codde=d.codde); >SELECT distinct nomde FROM emple e, depto d WHERE e.codde=d.codde AND NOT EXISTS (select * from emple where codde=e.codde and codcat<>e.codcat); >SELECT nomde FROM depto WHERE codde=SOME (select codde from emple where codcat=all (select codcat from emple where codde=depto.codde));
7. SENTENCIAS PARA MODIFICAR DATOS. 7.1. Se ha creado un nuevo departamento que depende del 110. Darlo de alta.
>INSERT INTO depto VALUES(666,DeMoN,10,180,F,150000,110); >INSERT INTO depto (nomde, codde, depde, presu, codjefe, tidir, codce) VALUES (DeMoN,666,110,150000,180,F,10);
84
APENDICE TEMA 5.
>INSERT INTO depto (codde, nomce, codce, tidir) VALUES (666,DeMoN,10,F);
CASE
7.2.
Supongamos que disponemos de una tabla vaca llamada EMPLEA2 con las mismas columnas de la tabla EMPLE. Se desea insertar en esta tabla los empleados de emple que hayan ingresado en la empresa a partir de la dcada de los 90.
>CREATE TABLE emplea2(codem...); >INSERT INTO emplea2 SELECT * FROM emple WHERE to_char(fecing,yyyy)>=1990;
9. CONSULTAS COMPLEJAS EN SISTEMAS DE INFORMACIN COMPLEJOS. 9.1. Obtener un listado de los grupos que asisten en turno de maana, presentando el cdigo del grupo, el nombre de los alumnos que asisten al grupo y el nombre de las asignaturas que estudian cada uno de los alumnos. Ordenados por grupos, orden alfabtico de alumno y orden alfabtico de asignatura.
>SELECT g.codgrupo, nomalumno, substr(denasigna,1,25) FROM alumno al, grupo g, estudia e, asigna a WHERE al.codgrupo=g.codgrupo AND e.dni=al.dni AND e.codasigna=a.codasigna AND turno=M ORDER BY 1,2;
9.2.
Obtener los nombres de los alumnos que estudias CASE organizados por grupos.
>SELECT al.codgrupo, al.nomalumno FROM alumno al, estudia e WHERE e.dni=al.dni AND e.codasigna=CASE ORDER BY 1,2;
9.3.
>SELECT al.codgrupo, a.denasigna, al.nomalumno FROM alumno al, estudia e, asigna a WHERE e.dni=al.dni AND e.codasigna=a.codasigna ORDER BY 1,2,3;
85
CASE
Obtener un listado de los profesores presentando el nombre del departamento al que est asignado y el nombre del profesor. Presentarlo por departamentos.
>SELECT d.dendepar, p.nomprofe FROM departamento d, profesor p WHERE d.coddepar=p.coddepar ORDER BY 1,2;
9.5.
Obtener un listado de los profesores presentando el nombre del departamento, el nombre del profesor y la relacin de los grupos a los que imparte clase cada profesor. Clasificar por departamento y profesor.
>SELECT distinct d.dendepar,p.nomprofe,c.codgrupo FROM clase c, profesor p, departamento d WHERE d.coddepar=p.coddepar AND c.ordenprofe=p.ordenprofe AND c.coddepar=p.coddepar ORDER BY 1,2;
9.6.
Obtener un listado de los profesores presentando el nombre de departamento, el nombre del profesor y la relacin de asignaturas que imparte cada profesor. Presentarlo ordenado por profesor.
>SELECT d.dendepar, p.nomprofe, a.denasigna FROM departamento d, profesor p, asigna a, clase c WHERE c.ordenprofe=p.ordenprofe AND c.coddepar=p.coddepar AND c.codasigna=a.codasigna AND d.coddepar=c.coddepar ORDER BY 2;
9.7.
Obtener los alumnos de la rama DAI del segundo curso, clasificados por grupo.
>SELECT al.codgrupo, al.nomalumno, g.curso FROM alumno al, grupo g WHERE g.codgrupo=al.codgrupo AND g.curso=2 AND g.rama=DAI ORDER BY al.codgrupo;
9.8.
Obtener los nombres de los alumnos que asisten al mismo grupo que ROIG FELIU, JORGE.
>SELECT nomalumno FROM aumno WHERE codgrupo=(select codgrupo from alumno where nomalumno=ROIG FELIU, JORGE);
86
CASE
Obtener el grupo y nombre de los alumnos de la rama Desarrollo de Aplicaciones Informticas que estn matriculados en un grupo de 2 y cursan alguna asignatura de 1.
>SELECT distinct g.codgrupo, nomalumno FROM alumno al, rama r, grupo g, estudia e, asigna a WHERE r.codrama=al.codrama AND e.dni=al.dni AND e.codasigna=a.codasigna AND g.codgrupo=al.codgrupo AND al.codrama=r.codrama AND r.denrama=DESARROLLO DE APLICACIONES INFORMATICAS AND g.curso=2 AND e.codasigna= SOME (select codasigna from asigna where curso=1); >SELECT nomalumno FROM alumno al, grupo g, rama r WHERE al.codgrupo=g.codgrupo AND al.codrama=r.codrama AND denrama=DESARROLLO DE APLICACIONES INFORMATICAS AND curso=2 AND dni IN (select dni from estudia e, asigna a where e.codasigna=a.codasigna and curso=1);
9.10. Obtener el grupo y el nombre de los alumnos de DAI que estn matriculados en un grupo de 2 y cursan alguna asignatura de 1. Se han de visualizar los nombres delas asignaturas de 1 en las que estn matriculados.
>SELECT g.codgrupo, nomalumno, a.denasigna FROM alumno al, grupo g,estudia e, asigna a WHERE e.dni=al.dni AND e.codasigna=a.codasigna AND g.codgrupo=al.codgrupo AND al.codrama=DAI AND g.curso=2 AND a.curso=1;
9.11. Obtener el nombre de los alumnos de 2 DAI que cursan alguna asignatura de 1, visualizando tanto las asignaturas de 1 como las de 2 en las que est matriculado.
>SELECT nomalumno, denasigna FROM alumno al, grupo g, estudia e, asigna a WHERE al.dni=e.dni AND a.codasigna=e.codasigna AND g.codgrupo=al.codgrupo AND g.curso=2 AND al.codrama=DAI AND EXISTS (select * from estudia, asigna where estudia.dni=al.dni and estudia.codasigna=asigna.codasigna and asigna.curso=1);
87
APENDICE TEMA 5.
>SELECT nomalumno, denasigna FROM alumno al, grupo g, estudia e, asigna a WHERE al.codgrupo=g.codgrupo AND al.dni=e.dni AND e.codasigna=a.codasigna AND al.codrama=DAI AND g.curso=2 AND al.dni=SOME(select dni from estudia, asigna where estudia.codasigna=asigna.codasigna and curso=1);
CASE
9.12. obtener los nombres de los alumnos que no tienen que presentarse al examen final de GRAF y CASE.
>SELECT nomalumno FROM alumno WHERE dni NOT IN (select dni from estudia where codasigna=CASE and (nota1+nota2+nota3)/3<5) AND dni NOT IN (select dni from estudia where codasigna=GRAF and (nota1+nota2+nota3)/3<5) AND dni IN (select dni from estudia where codasigna=CASE or codasigna=GRAF);
9.14. Obtener de cada grupo cuntos alumnos han de presentarse al examen final de alguna asignatura (los alumnos que tengan ms de 1 asignatura suspensa han de ser contados como 1 solo alumno).
>SELECT al.codgrupo, count(al.nomalumno) FROM alumno al WHERE EXISTS (select * from estudia where estudia.dni=al.dni and (nota1+nota2+nota3)/3<5) GROUP BY codgrupo;
9.15. Obtener el nombre de los alumnos que tengan clase con el profesor FOLGUERA PEREZ, LUIS.
>SELECT nomalumno FROM alumno al, clase c, profesor p, estudia e WHERE c.codgrupo=al.codgrupo AND c.ordenprofe=p.ordenprofe AND c.coddepar=p.coddepar AND e.dni=al.dni AND c.codasigna=e.codasigna AND p.nomprofe=FOLGUERA PEREZ, LUIS;
88
APENDICE TEMA 5.
CASE
9.16. Obtener los nombres de los alumnos que estn matriculados de todas las asignaturas de 2 DAI.
>SELECT nomalumno FROM alumno al WHERE NOT EXISTS (select codasigna from asigna where codrama=DAI and curso=2 and codasigna<>all(select codasigna from estudia where al.dni=estudia.dni));
9.17. Obtener los nombres de los alumnos que han aprobado todos los parciales de todas las asignaturas que estudia.
>SELECT nomalumno FROM alumno al WHERE NOT EXISTS (select * from estudia e where e.dni=al.dni and (nota1<5 or nota2<5 or nota3<5));
9.19. Obtener aquellos alumnos cuya nota media de cada asignatura sea la mejor de lsa notas medias obtenidas por los alumnos de esa asignatura.
>SELECT nomalumno FROM alumno WHERE dni=SOME(select dni from estudia where not exists (select * from estudia e where e.dni=estudia.dni and (nota1+nota2+nota3)/3<some(select (nota1+nota2+nota3)/3 from estudia where e.codasigna=estudia.codasigna)));
89