Вы находитесь на странице: 1из 89

I.E.

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

COMPOSICIN DEL CURSO


1. OBJETIVO GENERAL Capacitacin en el uso de herramientas de desarrollo de 4 Generacin para el desarrollo rpido de aplicaciones basadas en Bases de Datos (desde ahora BD) a partir de un correcto diseo de una BD. CAPACITACIN PROFESIONAL: Desarrollador en Sistemas Integrados de gestin de BD Relacionales y particularmente en el entorno ORACLE. 2. OBJETIVOS ESPECFICOS Realizar diseos correctos de BD Relacionales. Conocer los principios de los sistemas de BD relacionales. Definir y manipular en modo interactivo una BD relacional mediante SQL (ORACLE SQL*PLUS). Desarrollar mdulos de programacin con SQL embebido (ORACLE PL/SQL) Utilizar generadores de pantallas y mens (ORACLE DEVELOPER FORMS BUILDER) Utilizar generadores de informes (ORACLE DEVELOPER REPORTS BUILDER) Conocer el uso de herramientas CASE para modelizacin de datos (ORACLE DESIGNER)

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

TEMA 1. CONCEPTO DE BASE DE DATOS.


1. Que es una BD 1.1. Definicin 1.2. Ventajas de los sistemas de BD sobre los sistemas de ficheros tradicionales. 2. Elementos de un sistema de BD. 3. Caractersticas de los sistemas gestores de BD. 4. Arquitectura CLIENTE-SERVIDOR 5. Modelo de datos.

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.

2. ELEMENTOS DE UNA BD.


Los datos: es el conjunto de datos que estructurados y almacenados en un soporte magntico u ptico de acceso directo. A este conjunto de datos es lo que suele denominarse Base de Datos. La metabase: es la informacin sobre los datos de la BD. Es imprescindible para que el sistema autodocumentado pueda suministrar a los usuarios, al administrador de la BD y al sistema gestor de BD (SGBD) la informacin que necesita sobre los datos almacenados y su funcionamiento. Los elementos fundamentales de la metabase son: Catalogo o diccionario de datos, que contiene la descripcin lgica de cada uno de los datos, es decir, contiene la descripcin desde el punto de vista del usuario. Esta informacin es: tipo de dato, fichero en que se encuentra, relacin entre ficheros, etc. - Directorio de datos, que contiene la descripcin fsica de los datos, que permite pasar de la representacin externa a la interna. - Sistema de seguridad, que es a dos niveles, la seguridad lgica que contiene y controla los permisos de acceso de los usuarios a los datos, o seguridad fsica, que consiste en registrar en unos ficheros llamados log o dietario las operaciones realizadas en la BD, con el objeto de poder deshacerlas en caso de error. El software de gestin de sistema: tambin llamado logical. Es el conjunto de programas, procedimientos, lenguajes, etc. capaces de realizar todos los tratamientos exigidos para el funcionamiento del sistema. Estos elementos son: Sistema gestor de BD, ncleo de un sistema de BD. Permite que el usuario pueda crear, actualizar y recuperar los datos contenidos en la BD, es decir, interpreta las rdenes del usuario y la ejecuta fsicamente. Lenguaje de definicin de datos (DDL) y lenguaje de manipulacin de datos (DML). Utilidades de administracin de la BD, que facilitan las tareas de mantenimiento y seguridad de la BD. Estos programas realizan tareas como por ejemplo: modificacin del
8

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

Diccionario Privilegios Directorio LOG de datos

SYSADM

DBA 3. CARACTERSTICAS DE LOS SISTEMAS GESTORES DE BD


Los sistemas de BD proporcionan mecanismos para proteger los datos contra fallos que los alteren y corrompan. Los fallos que pueden alterar los datos son fsicos, por ejemplo, fallos en la memoria RAM o de disco, cadas del sistema, interrupcin de la energa, etc., o lgicos, como fallos del programa o del SO o del SGBD. El tercer tipo de fallo es el fallo humano, que puede ser intencionado o no intencionado. Para proteger los datos, el SGBD debe tener 3 caractersticas: seguridad, integridad y confidencialidad. Seguridad: Se trata de recuperar un estado consistente de los datos ante fallos que los destruyen total o parcialmente. Un caso muy comn que provoca la inconsistencia de la BD es cuando una operacin lgica se traduce en varias acciones en la BD, de tal manera que la operacin slo tiene sentido cuando se realizan todas las acciones. Este problema lo soluciona el SGBD con las transacciones, a saber, secuencias de operaciones que han de ejecutarse de forma atmica, es decir, o se realizan todas las operaciones que componen la transaccin o ninguna de ellas. Cuando hay que deshacer las acciones de una transaccin inconclusa el sistema se apoya en el fichero log, que es un fichero en el que el sistema va grabando todas las operaciones que se realizan sobre la BD. A este tipo de recuperacin se le denomina recuperacin en caliente. Otro tipo de fallo que se puede sufrir es el que afecta a la memoria del disco. En este caso la informacin se recuperara desde una copia de respaldo o Backup, que

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

Case El cliente y el servidor se ejecutan en la misma mquina.


Aplicac iones

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

T.2. EL MODELO RELACIONAL DE DATOS


0. 1. 2. 3. INTRODUCCIN ESTRUCTURA DEL MODELO RESTRICCIONES DEL MODELO MANIPULACIN DE DATOS.

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.

3. MANIPULACIN DE LOS DATOS.


Codd defini 3 sistemas matemticos pertenecientes al lgebra de conjuntos, para manipular los datos estructurados segn el modelo relacional. Estos lenguajes son equivalentes entre s, y tienen en comn que no son lenguajes navegacionales, es decir, que no actan sobre filas individuales, sino que son lenguajes de especificacin que actan sobre conjuntos de filas. Estos lenguajes son: lgebra relacional orientada a tuplas, Clculo relacional orientado a Tuplas y Clculo relacional orientado a dominios.

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

T.3. INTRODUCCIN A SQL.


1. 2. 3. 4. 5. 6. QUE ES SQL. CMO SE USA SQL. PARA QUE SIRVE SQL. ELEMENTOS DE UNA SENTENCIA SQL. TIPOS DE DATOS. FUNCIONES.

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.

2. CMO SE USA SQL.


Las sentencias se pueden dirigir al sistema de 2 formas: Modo interactivo: la sentencia se escribe directamente en la pantalla del ordenador, se ejecuta y sobre la misma pantalla aparecen los resultados de la consulta. SQL embebido en un lenguaje de programacin: en un lenguaje de 3 o 4 generacin se insertan sentencias SQL para acceder a los datos de una BD relacional, y los resultados del acceso son recogidos por el programa que los tratar, por ejemplo, para listarlos. Al lenguaje donde se insertan sentencias SQL se le llama lenguaje anfitrin y puede ser C, JAVA, PL/SQL... Hay dos tcnicas para utilizar SQL embebido en programas:

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.

3. PARA QUE SIRVE SQL.


El SQL se compone de 3 sublenguajes: Lenguaje de definicin de datos (DDL), que permite crear, alterar y eliminar objetos de la BD, como tablas, vistas, ndices, restricciones, usuarios, disparadores, etc. Estas tareas son propias del DBA. Las sentencias son: Create: para crear objetos. Alter: para alterar objetos ya creados de la BD. Drop: para eliminar objetos de la BD. Lenguajes de manipulacin de datos (DML), que permite aadir, modificar, borrar y consultar datos de la BD. Las sentencias son: Select: para consultar datos de una o varias tablas. Insert: para aadir una o varias filas en una tabla. Update: para modificar el valor de columnas de una o varias filas de una tabla. Delete: para borrar filas de una tabla. Lenguaje de control de datos (DCL), que permite asignar y retirar autorizaciones de acceso a los datos y controlar transacciones. Estas sentencias son: Grant: para otorgar autorizaciones de acceso. Revoke: para retirar autorizaciones de acceso. Commit: para confirmar transacciones. Rollback: para anular transacciones.

4. ELEMENTOS DE UNA SENTENCIA SQL


Las sentencias SQL tienen los siguientes componentes: Palabras reservadas, que tienen un significado predefinido en el lenguaje. Puede ser una sentencia, una clusula o una funcin. Nombres de tablas, vistas o columnas, inventadas por los creadores de la BD que se asignan en el momento de la creacin. Nombres de variables huspedes, que son nombres de variables de programa que se insertan dentro de una sentencia. Constantes, que pueden ser numricos o alfanumricos entre comillas simples. Signos delimitadores, como parntesis, operadores relacionales, operaciones aritmticas, espacios en blanco.

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;

3. LENGUAJE DE DEFINICIN DE DATOS (DDL).


El conjunto de sentencias SQL que permiten crear, alterar y eliminar las estructuras de datos y otros objetos de la BD relacional reciben el nombre de DDL. El lenguaje DDL est basado en 3 verbos de SQL:
24

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.

4. CREACIN DE UNA TABLA.


El formato general para la creacin de una tabla es: SQL> CREATE TABLE nombre_tabla (nombre_columna1 tipo_dato [restriccin1], nombre_columna2 tipo_dato [restriccin2], nombre_columnaN tipo_dato [restriccinN]); Los nombres de las tablas y de las columnas debe empezar por una letra y puede incluir letras, dgitos y el guin bajo (_), hasta un mximo de 30 caracteres, no pudiendo utilizarse palabras reservadas del lenguaje. El lenguaje no distingue entre maysculas y minsculas, pero en el diccionario de datos se graban en maysculas. El tipo de dato de las columnas ha de ser alguno de los permitidos en ORACLE. El formato para especificar las restricciones o CONSTRAINTS es: SQL> [CONSTRAINT nombre_restriccion] tipo_restriccion; Los tipos de restricciones pueden ser: PRIMARY KEY: determina que columna(s) forma(n) la clave primaria de la tabla. UNIQUE: determina que en la columna no puede haber valores repetidos, es decir, cada valor debe ser nico en toda la tabla. Se suele declarar para claves alternativas. DEFAULT: determina el valor por defecto que se asignar a una columna cuando se inserte una fila en la tabla en la que no se da valor a la columna. Si la columna no tiene asignada esta restriccin se le asigna el valor nulo. CHECK: permite controlar el valor que se le asigna a una columna, comprobando el valor signado con una lista de valores que se especifican entre parntesis y separados por comas. En caso de insertar una fila donde el valor no coincida con alguno de los permitidos no permite la insercin. NOT NULL: impide que se inserten en la tabla filas a las que no se ha asignado valor en la columna que tiene asignada la restriccin not null. FOREIGN KEY / REFERENCES: define claves ajenas indicando el nombre de la tabla y las columnas que forman la PK a la que hacen referencia.

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:

>nombre_columna tipo_dato [CONSTRAINT nombre_restriccin] PRIMARY KEY; a nivel de tabla:

>[CONSTRAINT nombre_restriccin] PRIMARY KEY (nombre_columna.pk); UNIQUE: a nivel de columna:

>nombre_columna tipo_dato [CONSTRAINT nombre_restriccin] UNIQUE; a nivel de tabla:

>[CONSTRAINT nombre_restriccin] UNIQUE (nombre_columna); DEFAULT: slo puede ser especificado a nivel de columna.

>nombre_columna tipo_dato DEFAULT valor_por_defecto; CHECK: a nivel de columna:

>nombre_columna tipo_dato [CONSTRAINT nombre_restriccin] CHECK (nombre_columna IN (valor1, valor2,...valorN)); a nivel de tabla:

>[CONSTRAINT nombre_restriccin] CHECK (nombre_columna IN (valor1, valor2,...valorN));

26

Case NOT NULL: slo puede ser definido a nivel de tabla.

>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

5. ALTERACIN DE UNA TABLA.


La sentencia ALTER se utiliza para alterar la estructura de una tabla, pudiendo aadir nuevas columnas, redefinir los tipos de datos y sus tamaos, aadir y eliminar restricciones y activar y desactivar restricciones. La sentencia ALTER tiene dos formatos: > FORMATO PARA ALTERAR COLUMNAS DE UNA TABLA

ALTER TABLE nombre_tabla {ADD|MODIFY} nombre_columna tipo_dato;

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

Case > > FORMATO PARA ALTERAR LAS CONSTRAINTS

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.

6. ELIMINACIN DE UNA TABLA.


El formato es: > DROP table nombre_table. Elimina los datos y la estructura de la tabla , eliminando toda referencia dentro del diccionario de datos y sin posibilidad de recuperarlos.

7. CONFIDENCIALIDAD DE LOS DATOS.


Cuando se crea un usuario ORACLE crea una estructura lgica ESQUEMA, CON EL MISMO NOMBRE DEL USUARIO. Cuando un usuario crea una tabla en la BD es el propietario del objeto y el nombre del objeto est calificado por el nombre del esquema, con el siguiente formato: [nombre_esquema].nombre_objeto. Cuando se hagan referencias al objeto, si se omite el nombre del esquema el sistema asume el esquema del usuario con el que se est conectado a la BD. El usuario creador de un objeto es propietario de ese objeto, y un propietario tiene todos los privilegios sobre su objeto. Un usuario puede acceder a los objetos propiedad de otros usuarios si se le conceden los privilegios correspondientes. Hay dos tipos de privilegios: privilegios del sistema y privilegios de objeto. PRIVILEGIOS DEL SISTEMA: son permisos para realizar aciones sobre los tipos de objetos de la BD, por ejemplo, crear una sesin, crear tablas, ndices... hay hasta 60 privilegios del sistema. La vista DBA_SYS_PRIVS contiene los privilegios del sistema otorgados a usuarios y roles. La vista ROLE_SYS_PRIVS contiene los privilegios del sistema otorgados a roles. PRIVILEGIOS DE OBJETOS: son permisos para realizar acciones sobre objetos concretos de la BD. Los privilegios que un usuario puede otorgar a otros usuarios sobre objetos de su propiedad son: select: selecciona tablas. insert: inserta datos en tablas. update: actualiza tablas. delete: borrar. alter: permite alterar la estructura del objeto. index: permite incluir un ndice. references: permite crear FK.
28

Case execute: da permiso para ejecutar subprogramas.

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

Case El formato es: >CREATE INDEX [,columna[ASC|DESC]]...); nombre_indice ON nombre_tabla (columna[ASC|DESC]

VISTAS DEL DICCIONARIO DE DATOS ASOCIADAS A LOS NDICES USER_INDEXES, que contiene los ndices propiedad del usuario que consulta la vista.

10. CREACIN DE SINNIMOS.


Los sinnimos son nombres alternativos que se pueden emplear para gestionar tablas y otros objetos como vistas, procedimientos, funciones, paquetes y otros sinnimos. La instruccin para crear un sinnimo es la siguiente: >CREATE [PUBLIC] SYNONYM nombre_sinonimo FOR nombre_objeto; Si se especifica la clusula PUBLIC el sinnimo es accesible para todos los usuarios, si no se especifica slo podr ser reconocido por el usuario que lo cre. Los sinnimos pueden ser utilizados por las sentencias INSERT, UPDATE, SELECT, DELETE, GRANT y REVOKE. Los sinnimos proporcionan independencia para tratar los objetos ya que se puede acceder a objetos de otros propietarios o situados en BDs remotas, sin necesidad de especificar el propietario al ir implcito en el nombre del sinnimo. Para borrar un sinnimo se utiliza: >DROP SYNONYM nombre_sinonimo; >DROP PUBLIC SYNONYM nombre_sinonimo; VISTAS DEL DICCIONARIO DE DATOS ASOCIADAS A LOS SINNIMOS ALL_SYNONYMS, contiene todos los sinnimos accesibles por el usuario. Aquellos que tienen en la columna OWNER el valor PUBLIC son sinnimos pblicos. USER_SYNONYMS, contiene los sinnimos privados accesibles por el usuario.

11. CREACIN DE VISTAS.


Una vista define una tabla virtual basada en una o ms tablas o vistas. Las vistas permiten organizar los datos de diferentes formas, de modo que los usuarios los ven desde diferentes perspectivas. Las vistas permiten restringir el acceso a los datos, haciendo que determinados usuarios accedan a las vistas que slo contienen determinadas columnas y filas de las tablas reales. Desde el punto de vista del usuario no se encuentra diferencia entre tabla y vista. La diferencia entre tabla y vista es que en una vista no se almacenan los datos fsicamente y en una vista a los usuarios se les presentan unos datos que son el resultados de una consulta sobre las tablas reales.
30

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

T.5. USO DE SQL EN MODO INTERACTIVO.


1. 2. 3. 4. 5. 6. 7. 8. 9. CONSULTAS SENCILLAS. EXPRESIONES. PREDICADOS FUNCIONES DEL LENGUAJE SQL. CONSULTAS CON AGRUPAMIENTOS. CONSULTAS SOBRE VARIAS TABLAS. SENTENCIAS PARA MODIFICAR DATOS. OTRAS CARACTERSTICAS DE LA SENTENCIA SELECT. CONSULTAS COMPLEJAS EN SISTEMAS DE INFORMACIN COMPLEJOS.

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

>SELECT {columna[,columna]...|*} FROM columna[ASC|DESC] [,columna[ASC|DESC]...;

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

Case PREDICADO X V V V F F F D D D PREDICADO Y V F D V F D V F D X AND Y V F D F F F D F D X OR Y V V V V F D V D D

PREDICADO X V F D

NOT X F V D

4. FUNCIONES DEL LENGUAJE SQL.


4.1. Definicin de funcin: Una funcin representa un valor nico que se obtiene aplicando unas determinadas operaciones a unos valores llamados argumentos. Una funcin se especifica mediante una palabra reservada, que es el nombre de la funcin, seguida de los argumentos entre parntesis y separados por comas. El argumento de una funcin puede ser una expresin. Las funciones a su vez pueden ser operandos de una funcin. [(max(salar)+min(salar))/2]. En SQL hay dos tipos de funciones: escalares y colectivas o de columna. En una funcin escalar el argumento es un nico valor. En las funciones colectivas el argumento es una columna. Por lo tanto la funcin se aplica a un conjunto de valores. 4.2. Funciones escalares: 4.2.1. Funcin LENGTH: Obtiene la longitud de una cadena de caracteres. Su formato es: >LENGTH (expresin). El argumento es una expresin cuyo resultado ha de ser de tipo alfanumrico. El resultado de la funcin es un entero que indica el nmero de caracteres que tiene la cadena pasada como argumento. Si el argumento es nulo, el resultado de la funcin es nulo.

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.

5. CONSULTAS CON AGRUPAMIENTO DE FILAS.


En este punto se ver como formar grupos de filas de acuerdo con un determinado criterio para aplicarle posteriormente las funciones colectivas. 5.1. Clusula GROUP BY:

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

Case 5.3. Sentencia SELECT por agrupamiento:

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

6. CONSULTAS SOBRE VARIAS TABLAS.


Para consultar datos de varias tablas en una sentencia SELECT se puede realizar de 3 formas: 1. Poniendo los nombres de las distintas tablas en la clusula FROM de la SELECT principal, con lo que se obtiene como resultado datos combinados de las distintas tablas que intervienen en la consulta, mediante una operacin llamada JOIN o YUNCIN. >SELECT nomde, nomem FROM emple, depto WHERE emple.codde= depto.codde; 2. Utilizando subconsultas en las que no se hace referencia a datos de las tablas mencionadas en la SELECT principal. A este tipo de consultas se las denomina consultas subordinadas no correlacionales. . >SELECT nomem FROM emple WHERE codde in (select codde from depto where presu>100.000); 3. Utilizando subconsultas en las que se hace referencia a datos de tablas mencionadas en una SELECT antecedente. A este tipo de consultas se las llama consultas subordinadas correlacionadas. . >SELECT nomde FROM depto WHERE presu*2>(select sum(salar) from emple where codde=depto.codde); 6.1. Consultas con JOIN o YUNCIN: 6.1.1. Conceptos previos: 6.1.1.1. Calificacin de columnas: Dentro de una tabla todos los nombres de columnas son diferentes. En una sentencia SELECT, cuando se opera con una sola tabla basta con especificar el nombre de la columna y no hay ningn tipo de ambigedad. Sin embargo, si interviene ms de una tabla en la misma sentencia puede ocurrir que haya columnas con el mismo nombre en distintas tablas. En este caso no basta con especificar una columna nicamente por su nombre, pues se da la ambigedad de que no se sabe a qu columna de qu tabla nos estamos refiriendo. En estos casos, para eliminar la ambigedad, lo que se hace es calificar las columnas especificando el nombre de la tabla a la que pertenecen, un punto, y el nombre de la columna (tabla.columna). 6.1.1.2. Alias para tablas: En la clusula FROM de una sentencia SELECT se pueden especificar alias para los nombres de las tablas, que son nombres alternativos para referirse a la tabla dentro de la misma sentencia SELECT. La forma de definir un alias es poniendo en la clusula FROM a continuacin del nombre de la tabla el nombre del alias. Si se especifica un alias a una tabla, todas las referencias calificadas a sus columnas deben usar el nombre alias. >SELECT d.codde, nomde,nomem FROM emple e, depto d WHERE e.codde=d.codde;

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

7. SENTENCIAS PARA MODIFICAR DATOS.


Estas sentencias son INSERT, DELETE y UPDATE. 7.1. Sentencia INSERT: La sentencia INSERT permite aadir una o ms filas completas a una tabla. Puede especificarse con dos formatos: Formato 1:

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

8. OTRAS CARACTERSTICAS DE LA SENTENCIA SELECT.


8.1. OUTER JOIN o JOIN EXTERNO: Un JOIN EXTERNO se realiza cuando se incluye en el resultado de una SELECT filas de una tabla que no estn relacionadas con ninguna fila de la tabla con la que se relaciona, es decir, que la columna tiene una restriccin de integridad referencial pero tiene el valor NULL. El JOIN EXTERNO se especifica con un (+) en ORACLE, a continuacin de la columna en el predicado con el que se implementa el JOIN. El JOIN EXTERNO puede ser JOIN externo a izquierda o JOIN externo a derecha. JOIN externo a izquierda:

>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.2. Insertar una fila con la fecha del sistema.


>INSERT into prueba values(4, to_date(sysdate,dd-mm-yyyy));

5.3.Seleccionar los registros que se han insertado en la fecha de hoy.


>SELECT * FROM prueba WHERE to_char(fecha)=to_char(sysdate, dd-mm-yyyy);

5.4. Seleccionar los registros insertados en el presente mes


>SELECT * FROM prueba WHERE to_char(fecha,mm)=to_char(sysdate,mm);

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;

5.6. Dar la fecha y la hora 10 minutos antes del momento actual.


>SELECT to_char(sysdate 10/1440, dd-mm-yyyy/hh:mi:ss) from dual;

5.7. Calcular el nmero de das que he vivido.


>SELECT sysdate - to_date(02-08-1981,dd-mm-yyyy) from dual;

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

APENDICE TEMA 4. 5. ALTERACIN DE UNA TABLA.

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. CONFIDENCIALIDAD DE LOS DATOS. 7.1. Conectarse como Puesto13.


>CONNECT puesto13/matrix;

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;

7.4. Otorgar DELETE sobre pelicula a Tercero.


>GRANT delete on pelicula to Tercero;

7.5. Conectarse como tercero.


>CONNECT Tercero/matrix;

7.6. Insertar fila en pelicula.


>INSERT into puesto13.pelicula values(4,Misin Imposible 2,sus,125,John Woo,2.50,M);

7.7. Seleccionar todas las filas de pelicula.


>SELECT * from puesto13.pelicula;

7.8. Conectarse con Cuarto.


>CONNECT Cuarto/matrix;

7.9. Insertar fila en pelicula;


>INSERT into puesto13.pelicula values(5,Top Gun,sus...); [Insuficientes Privilegios]

58

APENDICE TEMA 4. 7.10. Conectarse como tercero.


>CONNECT Tercero/matrix;

CASE

7.11. Otorgar insert sobre pelicula a Cuarto.


>GRANT insert on puesto13.pelicula to Cuarto;

7.12. Conectarse como Cuarto.


>CONNECT Cuarto/matrix;

7.13. Insertar fila en pelicula.


>INSERT into puesto13.pelicula values(5,Top Gun,sus...);

7.14. Borrar la pelicula con codpel=3.


>DELETE from puesto13.pelicula WHERE codpel=3; [Privilegios Insuficientes]

7.15. Conectarse como Tercero.


>CONNECT Tercero/matrix;

7.16. Otorgar DELETE sobre pelicula a Cuarto.


>GRANT delete on puesto13.pelicula to Cuarto; [Privilegios Insuficientes]

7.17. Conectarse como puesto13.


>CONNECT Puesto13/matrix;

7.18. Otorgar DELETE sobre pelicula a Cuarto.


>GRANT delete on pelicula to Cuarto;

7.19. Conectarse como Cuarto.


>CONNECT Cuarto/matrix;

7.20. Borrar la pelicula con codpel3.


>DELETE from puesto13.pelicula WHERE codpel=3;

59

APENDICE TEMA 4. 7.21. Modificar el Ttulo de la pelicula con codpel=1.


>UPDATE puesto13.pelicula SET titulo=Guay del Paraguay WHERE codpel=1;

CASE

7.22. Conectarse como Puesto13.


>CONNECT Puesto13/matrix;

7.23. Retirar el privilegio INSERT sobre pelicula a Tercero con cascade constraint.
>REVOKE insert on pelicula from Tercero CASCADE CONSTRAINT;

7.24. Conectarse como Cuarto.


>CONNECT Cuarto/matrix;

7.25. Insertar una fila en pelicula.


>INSERT into puesto13.pelicula values(6, Grease,...); [Privilegios Insuficientes]

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

APENDICE TEMA 4. 10. CREACIN DE SINNIMOS.


>CREATE PUBLIC SYNONYM pelicula for pelicula; >CREATE SYNONYM pelis for pelicula; >SELECT * from pelicula; >SELECT * from pelis; >CONNECT Tercero/matrix; >SELECT * from puesto13.pelicula; >SELECT * from pelicula;

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;

11.5. Crear de nuevo la vista peliculas_suspense con la clusula check option.


>DROP VIEW peliculas_suspense; > CREATE VIEW peliculas_suspense AS select * FROM pelicula WHERE codgen=sus WITH CHECK OPTION;

61

APENDICE TEMA 4. SISTEMA DE INFORMACIN

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

APENDICE TEMA 5. 1. CONSULTAS SENCILLAS. 1.1.

CASE

Obtener todos los nombres de los centros de trabajo de la empresa ordenados alfabticamente.

>SELECT nomce FROM centro ORDER BY nomce;

1.2.

Obtener los nombres de los empleados que trabajan en el departamento 121 ordenados por orden alfabtico.

>SELECT nomem FROM emple WHERE codde=121 ORDER BY 1;

1.3.

Obtener toda la informacin del departamento 121.

>SELECT * FROM depto WHERE codde=121;

1.4.

Obtener los nombres y salarios de los empleados con ms de 3 hijos, ordenado alfabticamente.

>SELECT nomem, salar FROM emple WHERE numhi>=3 ORDER BY 1;

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.

>SELECT nomde FROM depto WHERE presu>120000 ORDER BY 1;

1.7.

Obtener por orden alfabtico los nombres de los departamentos que tienen jefe en propiedad.

>SELECT DISTINCT nomde FROM depto WHERE tidir=P ORDER BY 1;

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.

>SELECT nomem, codem, extel FROM emple WHERE codde=121;

65

APENDICE TEMA 5. 1.9.

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.

>SELECT extel, nomem FROM emple ORDER BY 1 DESC,2;

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.

>SELECT nomem FROM emple WHERE comis>salar*0.20;

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.

>SELECT nomem, salar+comis+((numhi-3)*50) FROM emple WHERE numhi>=4 ORDER BY (numhi-3)*50,1;

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.

>SELECT nomem FROM emple WHERE numhi*30>salar*0.05 ORDER BY 1;

66

APENDICE TEMA 5. 2.5.

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.

>SELECT nomde, ((presu*0.10)/12)*3+presu FROM depto WHERE presu/12=10000 ORDER BY 1;

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.

>SELECT nomem, to_char((salar+comis)*12,99,999.00), to_char((salar*1.03+comis)*12,99,999.00) FROM emple ORDER BY 1;

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.

>SELECT DISTINCT codde FROM emple WHERE comis>salar*0.15;

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

APENDICE TEMA 5. 3. PREDICADOS. 3.1.

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.

Obtener los empleados que no tengan extensin telefnica.

>SELECT nomem FROM emple WHERE extel IS NULL;

3.4.

Obtener los nombres de departamento que no dependen orgnicamente de otros.

>SELECT nomde FROM depto WHERE depde IS NULL;

3.5.

De los empleados que cobran comis, obtener su nombre y sueldo total.

>SELECT nomem, salar+comis FROM emple WHEER comis IS NOT NULL;

3.6.

Obtener los nombres de los empleados que cobran menos de 150 de comisin.

>SELECT nomem, comis FROM emple WHERE nvl(comis,0)<150;

3.7.

Obtener el sueldo total de los empleados que no tienen extensin telefnica.

>SELECT nomem, salar+nvl(comis,0) FROM emple WHERE extel IS NULL;

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

APENDICE TEMA 5. 3.9.

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.17. Obtener el nombre del jefe de departamento de informtica.


>SELECT nomem FROM emple WHERE codem= (select codjefe from depto where nomde=INFORMATICA);

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.22. Obtener los empleados cuyo primer apellido es MARTIN.


>SELECT nomem FROM emple WHERE nomem LIKE MARTIN%;

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.24. Obtener los empleados que tengan un nombre de pila de ms de 7 letras.


>SELECT nomem FROM emple WHERE nomem LIKE %,_ _ _ _ _ _ _%;

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.34. Obtener los nombres de departamento que no sean de direccin ni de seccin.


>SELECT nomde FROM depto WHERE nomde<>ALL (select nomde from depto where nomde like DIRECCION% or nomde like SECCION%);

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.

>SELECT nomem FROM emple WHERE LENGTH(nomem)>20;

4.2.

Obtener los nombres abreviados de los departamentos tomando las 10 primeras letras.

>SELECT SUBSTR(nomde,1,10) FROM depto;

4.3.

Obtener los cdigos de departamento y los 5 caracteres siguientes que estn a continuacin del carcter 12 de sus nombres.

>SELECT codde, SUBSTR(nomde,12,5) FROM depto,

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.

>SELECT codde, SUBSTR(nomde,-5) FROM depto WHERE LENGTH(nomde)>12;

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.

>SELECT MAX(salar), MIN(salar), SUM(salar), AVG(salar) FROM emple;

74

APENDICE TEMA 5. 4.7.

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.

Obtener cuantos empleados hay en la empresa.

>SELECT COUNT(*) FROM emple;

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.11. Obtener cuantos empleados han nacido antes del ao 1970.


>SELECT COUNT(nomem) FROM emple WHERE to_char(fecnac,yyyy)<1970;

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.

Presentar las extensiones telefnicas de la empresa indicando cuantos empleados la utilizan.

>SELECT extel, COUNT(*) FROM emple GROUP BY extel;

5.4.

Agrupando por cdigo de departamento y nmero de hijos obtener cuntos empleados hay en cada grupo.

>SELECT codde, numhi, COUNT(*) FROM emple GROUP BY codde, numhi;

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

APENDICE TEMA 5. 5.6.

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.12. De cada extensin telefnica cuantos empleados la utilizan en cada departamento.


>SELECT extel, codde, COUNT(*) FROM emple GROUP BY extel, codde;

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.14. Para cada extensin telefnica obtener en cuantos departamentos se utiliza.


>SELECT nvl(extel,sin extension), COUNT(DISTINCT codde) FROM emple GROUP BY extel;

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;

5.21. Obtener el nombre del departamento con mayor ndice de natalidad.


>SELECT nomde FROOM depto WHERE codde= (select codde from emple group by codde having sun(numhi)>=all (select sum(numhi) from emple group by codde));

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.

>SELECT depto.codde, depto.nomde, centro.nomce FROM depto, centro WHERE depto.codce=centro.codce;

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

APENDICE TEMA 5. 6.3.

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

APENDICE TEMA 5. 6.9.

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

APENDICE TEMA 5. 6.17. Obtener el nombre de los jefes de departamento en funciones.


>SELECT codde, nomde FROM emple WHERE codem=SOME(select codjefe FROM depto where tidir=F); >SELECT nomde, nomem FROM emple e, depto d WHERE d.codjefe=e.codem AND d.tidir=F; >SELECT nomem FROM emple WHERE EXISTS(slect * from depto where codjefe=codem and tidir=F);

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.

Obtener la lista de alumnos asistentes a cada grupo y en cada asignatura.

>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

APENDICE TEMA 5. 9.4.

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

APENDICE TEMA 5. 9.9.

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.13. Obtener los grupos en los que no hay matriculados alumnos.


>SELECT codgrupo FROM grupo WHERE NOT EXISTS (select * from alumno where alumno.codgrupo=grupo.codgrupo);

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.18. Obtener cuantos alumnos tiene cada profesor.


> SELECT nomprofe, count(*) FROM profesor p, clase c, estudia e, alumno al WHERE p.ordenprofe=c.ordenprofe AND p.coddepar=c.coddepar AND c.codasigna=e.codasigna AND c.codgrupo=al.codgrupo AND e.dni=al.dni GROUP BY nomprofe;

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)));

9.20. Obtener el grupo que tiene la nota media ms alta.


> SELECT codgrupo FROM estudia e, alumno al WHERE al.dni=e.dni GROUP BY al.codgrupo HAVING avg((nota1+nota2+nota3)/3)>=all (select avg((nota1+nota2+nota3)/3) from estudia e, alumno al where e.dni=al.dni group by al.codgrupo)

89

Вам также может понравиться