You are on page 1of 89

I.E.

S LA ARBOLEDA (ALCORCÓN)

CASE
DESARROLLO DE APLICACIONES INFORMÁTICAS EN ENTORNOS DE CUARTA GENERACIÓN CON HERRAMIENTAS CASE

De M o N

Case

CASE Apuntes tomados de la clase de CASE del I.E.S. La Arboleda de Alcorcón durante el curso 2002/2003. Pasados por David “DeMoN” Rodríguez. Queda totalmente prohibida la NO distribución de estos apuntes, así que “COMPARTE” ;-).

2

Case

COMPOSICIÓN DEL CURSO
1. OBJETIVO GENERAL Capacitación en el uso de herramientas de desarrollo de 4ª Generación para el desarrollo rápido de aplicaciones basadas en Bases de Datos (desde ahora BD) a partir de un correcto diseño de una BD. CAPACITACIÓN PROFESIONAL: Desarrollador en “Sistemas Integrados de gestión de BD Relacionales” y particularmente en el entorno ORACLE. 2. OBJETIVOS ESPECÍFICOS Realizar diseños 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 módulos de programación con SQL embebido (ORACLE PL/SQL) Utilizar generadores de pantallas y menús (ORACLE DEVELOPER FORMS BUILDER) Utilizar generadores de informes (ORACLE DEVELOPER REPORTS BUILDER) Conocer el uso de herramientas CASE para modelización 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. Introducción a SQL Definición 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 programación ORACLE PL/SQL Generación de pantallas y menús DEVELOPER 2000, ORACLE FORMS BUILDER Generación de informes DEVELOPER 2000, ORACLE REPORTS BUILDER Proyecto integrador. Desarrollo de una aplicación de gestión. Uso de herramientas CASE para la modelización de datos. ORACLE DESIGNER

4. TEMPORALIZACIÓN 1ª Evaluación ! Temas 1- 6/7 2ª Evaluación ! Temas 7- 11 5. CONTENIDOS MÍNIMOS Son los temas del 1-8 y el tema 10. Son los temas fundamentales de la asignatura.

3

Case 6. EVALUACIONES 40% de la nota final 1ª evaluación 30% de la nota final 2ª evaluación 30% de la nota final proyecto integrador 7. RECUPERACIONES Las recuperaciones se realizarán por bloques en Marzo. El proyecto integrador NO tiene recuperación. Si se suspende la recuperación se hará una convocatoria extraordinaria en Junio, y si se aprueba se realizarán las FCT en cuanto sea posible. 8. BIBLIOGRAFÍA ORACLE GUÍA 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. PROGRAMACIÓN PL/SQL Scott Urman. Ed. Osborne/ McGraw Hill DISEÑO Y USO DE BASES DE DATOS RELACIONALES Irene Luque/ M. Ángel Gómez Nieto Ed. Ramos

-

-

-

4

Case I bloque 5 .

Case 6 .

Modelo de datos. A los sistemas de BD se les llama “Sistemas Orientados al Dato”. 1.1. Ventajas de los sistemas de BD sobre los sistemas de ficheros tradicionales. La definición de los datos se almacena en la misma BD. 7 . 4. DEFINICIÓN. Por tanto. A los sistemas de ficheros tradicionales se les llama “Sistemas Orientados al Proceso”. Una BD es una colección de datos que están lógicamente relacionados entre sí.2.1. 2. Definición 1. en estos sistemas de ficheros los datos son dependientes de los tratamientos que se realizan sobre ellos.Case TEMA 1. • Descripción centralizada de los datos. ya que los datos se estructuran según un modelo que refleja las características que tienen en el mundo real. Que es una BD 1. QUE ES UNA BD 1. La descripción y la definición de los datos están almacenados en la misma BD. de tal manera que si un dato es utilizado por más de una aplicación aparecerá repetido en dos o más ficheros. Arquitectura CLIENTE-SERVIDOR 5. Características de los sistemas gestores de BD. Los datos están estructurados según un modelo de BD que refleja las relaciones y restricciones que tienen estos datos en el mundo real. ya que los datos se almacenan en ficheros diseñados específicamente para cada aplicación. de manera que los tratamientos no tienen que especificar de nuevo la definición de los datos. En estos sistemas los datos son independientes de los tratamientos que se realizan sobre ellos. y ese modelo permite que cualquier proceso pueda tratar los datos. Elementos de un sistema de BD. Además. CONCEPTO DE BASE DE DATOS. 3. si se modifica el tratamiento que realiza un proceso sobre los datos es necesario reestructurar los ficheros. Además. Los tratamientos que se realizan con los datos han de conservar la integridad y la seguridad de la BD. 1. VENTAJAS DE LOS SISTEMAS DE BD SOBRE LOS SISTEMAS DE FICHEROS • Independencia de los datos respecto de los tratamientos y viceversa.2. 1. esto ofrece una mejor y más normalizada documentación de la información.

y si no se modifica en alguno de los ficheros. es decir. Es el conjunto de programas. ya que al modificar un dato habría que hacerlo en todos los ficheros en que aparece. es decir. que contiene la descripción física de los datos. actualizar y recuperar los datos contenidos en la BD. A este conjunto de datos es lo que suele denominarse Base de Datos.Sistema de seguridad. 2. Los sistemas de BD están integrados en los sistemas de desarrollo de 4ª Generación. Permite que el usuario pueda crear. . es decir. que permite pasar de la representación externa a la interna. la BD sería inconsistente. Estos programas realizan tareas como por ejemplo: modificación del 8 . Al estar los datos estructurados según un modelo. Se evita la corrupción de la BD. contiene la descripción desde el punto de vista del usuario. relación entre ficheros. etc. • La metabase: es la información sobre los datos de la BD.Case • Eficiencia en la estructuración de los datos. Estos elementos son: Sistema gestor de BD. ELEMENTOS DE UNA BD. que el mismo dato no aparece en dos o más ficheros. 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 información que necesita sobre los datos almacenados y su funcionamiento. procedimientos. Esta información es: tipo de dato. no se producen redundancias de datos. . • Mayor nivel informático Los sistemas de BD ofrecen herramientas más potentes y más sencillas para la modificación de los datos. la seguridad lógica que contiene y controla los permisos de acceso de los usuarios a los datos. Utilidades de administración de la BD. núcleo de un sistema de BD. Se ahorra tiempo de proceso al no tener que modificar el dato en varios ficheros. Lenguaje de definición de datos (DDL) y lenguaje de manipulación de datos (DML). Esto evita 3 problemas: Por un lado no se desperdicia espacio de memoria almacenando la misma información varias veces. capaces de realizar todos los tratamientos exigidos para el funcionamiento del sistema. lenguajes. En contra. los sistemas por ficheros pertenecen a los sistemas de 3ª Generación. que facilitan las tareas de mantenimiento y seguridad de la BD. o seguridad física. • Los datos: es el conjunto de datos que estructurados y almacenados en un soporte magnético u óptico de acceso directo. con el objeto de poder deshacerlas en caso de error. Los elementos fundamentales de la metabase son: Catalogo o diccionario de datos. • El software de gestión de sistema: también llamado logical. que contiene la descripción lógica de cada uno de los datos. que es a dos niveles. interpreta las órdenes del usuario y la ejecuta físicamente. etc. fichero en que se encuentra.Directorio de datos. que consiste en registrar en unos ficheros llamados log o dietario las operaciones realizadas en la BD.

A este tipo de recuperación se le denomina recuperación en caliente. es decir. caídas del sistema. CARACTERÍSTICAS DE LOS SISTEMAS GESTORES DE BD Los sistemas de BD proporcionan mecanismos para proteger los datos contra fallos que los alteren y corrompan.Case tamaño del fichero. integridad y confidencialidad. • El administrador de la BD (BDA): es la persona cuya misión es asegurar la calidad y permitir el uso de los datos. Un caso muy común que provoca la inconsistencia de la BD es cuando una operación lógica se traduce en varias acciones en la BD. En este caso la información se recuperaría desde una copia de respaldo o Backup. secuencias de operaciones que han de ejecutarse de forma atómica. • Seguridad: Se trata de recuperar un estado consistente de los datos ante fallos que los destruyen total o parcialmente. Otro tipo de fallo que se puede sufrir es el que afecta a la memoria del disco. herramientas para la exportación e importación de datos. o lógicos. etc.Herramientas de desarrollo que es el conjunto de lenguajes para el desarrollo de aplicaciones. diseñando la BD de manera que el diseño de su estructura lógica y la implementación de su estructura física responda lo mejor posible a las necesidades de los distintos usuarios. a saber. Los fallos que pueden alterar los datos son físicos. de tal manera que la operación sólo tiene sentido cuando se realizan todas las acciones. realizar copias de seguridad. Este problema lo soluciona el SGBD con las transacciones. estadísticas de utilización de los datos. Cuando hay que deshacer las acciones de una transacción inconclusa el sistema se apoya en el fichero log. . Para proteger los datos. fallos en la memoria RAM o de disco. ORACLE INFORMIX DB II INTGRES SQL SERVER MOTOR JET servidor clientes 4GL C Base de Datos JAVA SQL SGBD FORMS REPORTS Diccionario Privilegios Directorio LOG de datos SYSADM DBA 3. El tercer tipo de fallo es el fallo humano. o se realizan todas las operaciones que componen la transacción o ninguna de ellas. que es un fichero en el que el sistema va grabando todas las operaciones que se realizan sobre la BD. que 9 . por ejemplo. que puede ser intencionado o no intencionado.. interrupción de la energía. como fallos del programa o del SO o del SGBD. el SGBD debe tener 3 características: seguridad.

no permitiendo operaciones que la violen. En el primer caso las restricciones de integridad son definidas en el momento del diseño de la BD. ARQUITECTURA CLIENTE-SERVIDOR Un sistema de BD posee una estructura compuesta por 2 partes: Un servidor (backend) y un conjunto de clientes (frontend). pero cuando requieren acceder a los datos se comunican con el servidor. Para ello el SGBD debe detectar y corregir las operaciones incorrectas que introduzcan inconsistencias en la BD. Existen varias tipologías para implementar la estructura cliente-servidor: 10 . Los clientes son aplicaciones ejecutadas en torno al SGBD. de tal manera que los datos están grabados en la BD cifrados. no decisiones técnicas. A esta operación se la denomina recuperación en frío. Para que el control de accesos se pueda ejecutar. de modo que el SGBD vela por que se cumplan. En el caso del control concurrente a los datos. el servidor el propio SGBD. 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. otro mecanismo para mantener la seguridad en la confidencialidad es facilitar la auditoría. El servidor ofrece servicios para realizar operaciones físicas sobre los datos. en los que se realizan varias operaciones. siendo necesario conocer la clave para descifrarlos. y los privilegios. • Integridad: El objetivo de la integridad es lograr que los datos contenidos sean correctos. registrando en unos ficheros auditores todos los accesos de los usuarios a los datos. es necesario que los usuarios del sistema se identifiquen mediante un login y un password. que atiende los requerimientos y devuelve los resultados. Interferencias por accesos concurrentes. es decir. Las decisiones sobre a que usuarios se les debe permitir realizar operaciones sobre qué objetos son decisiones de política de empresa. el sistema lo soluciona con el mecanismo de bloqueos.Case conserva el estado de los datos en una fecha determinada. permisos y autorizaciones han de estar registrados en la BD. 4. Los sistemas que requieren una gran seguridad utilizan sistemas de criptografía. Por último. • Confidencialidad: La confidencialidad se refiere a la protección de los datos contra accesos de usuarios no autorizados. pudiendo detectar a posteriori accesos no permitidos y por tanto mejorar el sistema de seguridad. sobre todo de interfaz de usuario y tratamientos procedimentales.

y cada uno de ellos contiene parte de la BD.Case • El cliente y el servidor se ejecutan en la misma máquina. SGBD Aplicaciones datos Red de Comunicaciones Aplicaciones Aplicaciones SGBD datos 11 . Aplicaciones SGBD datos Aplicaciones • Existen varios servidores. Requiere de un sistema de comunicaciones. (BD’s distribuidas). Aplicac iones SGBD datos • El servidor y el cliente están en distintas máquinas (proceso distribuido).

que es una representación de la realidad no comprometida con ningún entorno informático. INGRES. toda la información necesaria para el cumplimiento de sus fines. controlar stocks de almacén. mediante una abstracción del mundo real. INFORMIX. Los SGBD comerciales se basan en un modelo lógico concreto y determinan en parte el modelo físico. Existen 2 tipos de modelos: • • Modelo conceptual. Históricamente. Modelo lógico. El objetivo de cualquier sistema de información es representar. tanto en intranet como en internet. pero la parte de cliente se reparte en 2 niveles: 1 máquina servidor de aplicaciones y 1 máquina cliente. Se usa en aplicaciones de la web. El modelo conceptual más popular es el modelo entidadrelación de Chen. Servidor de aplicaciones Servidor de aplicaciones Servidor de la BD datos 5. los modelos lógicos de datos son: Modelo jerárquico (IMS [IBM]). MODELO DE DATOS. que determina unos criterios de almacenamiento y de operaciones de manipulación de datos dentro de un tipo de entorno informático. DB II [IBM]. Estos fines pueden ser obtener facturas.Case • Arquitectura a 3 niveles (World Wide Web). Aquí el servidor se instala en una máquina. Modelo orientado a objetos (Eiffel). Modelo en red (CODASYL). 12 - . Modelo relacional (ORACLE. SQL SERVER). Esta abstracción se realiza mediante un modelo de datos que es un conjunto de métodos y reglas que indican cómo se ha de almacenar la información y cómo se ha de manipular los datos. gestionar las matrículas de un centro educativo.

Uno de los objetivos fundamentales del modelo relacional es que la estructura lógica de los datos es independiente de su almacenamiento interno. 1. que queda en manos de los constructores de SGBD comerciales. que tienen como directrices el mejor rendimiento posible de sus sistemas. 0. el modelo no contempla en absoluto los aspectos físicos de la BD. EL MODELO RELACIONAL DE DATOS 0. Es un modelo de datos basado en la teoría matemática de las relaciones. 3. de integridad y de manipulación. que son estructurales. ESTRUCTURA DEL MODELO Las estructuras de datos están formadas por tablas o relaciones. filas o tuplas. Sistema de Ficheros Fichero Registro Campo Teoría relacional Relación 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: • Representación tabular: NUMEXP NOMBRE FECHA DIRECCIÓN CODCICLO Alumno DNI 13 . El modelo relacional es propuesto por CODD en la década de 1970. El modelo relacional se puede considerar como una combinación de 3 componentes.Case T. INTRODUCCIÓN ESTRUCTURA DEL MODELO RESTRICCIONES DEL MODELO MANIPULACIÓN DE DATOS. columnas o atributos y claves primarias y claves ajenas. 1. 2. Así. INTRODUCCIÓN El modelo relacional constituye el fundamento teórico de los SGBD comerciales más utilizados en la actualidad.2. en la que los datos se estructuran en el ámbito lógico en forma de relaciones.

Una vista es una tabla derivada de otras tablas. - - La estructura del modelo relacional en los SGBD relacionales se amplía con tablas virtuales llamadas Vistas o Views. Algunas vistas pueden ser actualizables y otras no. Los índices son lógica y físicamente independientes de las tablas a las que se asocia. En una tabla no hay dos columnas con el mismo nombre. FECHA. así que se pueden crear y eliminar índices sin que por ello se vean afectados los datos de la tabla. es decir. Son una visión distinta de los datos almacenados en las tablas. Otro elemento estructural de los SGBD relacionales son los índices. que permite acelerar el acceso a los datos de la tabla. ya que según el modelo no puede haber dos filas iguales. El SGBD ORACLE crea automáticamente un índice asociado a cada columna definida como clave primaria o alternativa. El que existan índices es totalmente transparente a los programadores y usuarios. 14 . que se representa dentro del sistema por su definición. (Primary Key. pero que no posee datos almacenados propios separados de las tablas reales. NUMEXP. por criterios ajenos al modelo relacional. Es un conjunto de columnas de una tabla T2 cuyos valores han de coincidir con los valores de la PK de otra tabla T1. Es un subconjunto de columnas de la tabla que identifican cada fila de forma unívoca. el hecho de definir índices es una decisión que atañe al BDA para mejorar el rendimiento del sistema. que consiste en representar la tabla mediante el nombre de la tabla seguido por los atributos separados por comas. El resto de las claves candidatas pasarán a llamarse claves alternativas (AK). NOMBRE. De entre todas las claves candidatas. Una clave candidata ha de ser irreductible. CODCICLO) Las características de las tablas son: En una tabla no hay filas repetidas. Así. DIRECCIÓN. La clave primaria es de gran importancia en el modelo. siguiendo criterios propios del sistema de información. (Foreing Key. FK). pero el SGBD utiliza siempre los índices existentes. PK). pues es la que permite la relación entre las tablas. Las tablas T1 y T2 pueden ser la misma. En cuanto a las claves se definen los siguientes conceptos: Clave candidata. el diseñador ha de elegir una de ellas como clave primaria. En toda tabla hay al menos 1 clave candidata. que ningún subconjunto de las columnas que forman la clave candidata sea a su vez clave candidata.Case • Representación en forma de Tupla. subrayando los atributos que son clave principal. Alumno (DNI. Las filas no están ordenadas dentro de la tabla por ningún criterio. Clave ajena. Clave primaria. Un índice es una estructura opcional asociada a columnas de una tabla. En una celda de la tabla puede haber como máximo 1 valor.

sino que es una marca que se aplica a una columna para indicar que no tiene asignado ningún valor. es decir. 15 . y tienen en común que no son lenguajes navegacionales. Estos lenguajes son: Álgebra relacional orientada a tuplas. Un nulo no es ningún valor. que dice que una FK debe tener un valor de la clave primaria de la tabla con la que se relaciona. Operación con propagación en cascada: (Cascade) El borrado o la modificación de la PK lleva consigo el borrado o modificación de las filas con los mismos valores en la FK. Regla de integridad referencial. Codd definió 3 sistemas matemáticos pertenecientes al álgebra de conjuntos. Operación con puesta a valor por defecto: (Set Default) El borrado o modificación de las filas de la tabla que contiene la PK provoca la asignación de un valor por defecto en las FK’s con el mismo valor. especificando qué debe hacer el sistema en caso de borrado o modificación que atente contra la integridad referencial. que se indican en el momento de la definición de la BD. o bien tener valor nulo. Las restricciones pueden ser inherentes al modelo (restricciones de integridad) y restricciones de usuario. Éstas restricciones de usuario pueden estar relacionadas en el diccionario de la BD o bien estar soportadas como procedimientos o disparadores. Hay una serie de reglas para evitar estos estados incorrectos. que son unos predicados definidos sobre columnas o filas que deben ser verificados por el sistema para determinan si son válidos en el sistema de información. " Reglas para FK: Cualquier estado de la BD que no satisfaga la integridad referencial es incorrecto por definición. Estos lenguajes son equivalentes entre sí. Cálculo relacional orientado a Tuplas y Cálculo relacional orientado a dominios. • Restricciones de usuario: es un predicado definido sobre columnas o filas que han de ser verificadas por el sistema para determinar si la información es válida. Una restricción de usuario ha de tener un nombre. es decir. de identidad o existencial. para manipular los datos estructurados según el modelo relacional. Hay las siguientes posibilidades: ‫א‬ ‫א‬ ‫א‬ ‫א‬ Operación restringida: (Restrict) No se permite borrar filas ni modificar el valor de su clave primaria si existen FK’s que contengan su valor. 3. Operación con puesta a nulos: (Set Null) El borrado o modificación de las filas de la tabla que contiene la PK provoca la asignación de un valor nulo en las FK’s con el mismo valor. el predicado que ha de ser satisfecho y una respuesta a la operación que intenta violar la restricción.Case 2. estructura u ocurrencias no permitidas. sino que son lenguajes de especificación que actúan sobre conjuntos de filas. que no actúan sobre filas individuales. • Restricciones inherentes al modelo: Son: Regla de integridad. RESTRICCIONES DEL MODELO (INTEGRIDAD) El modelo relacional tiene una serie de restricciones. MANIPULACIÓN DE LOS DATOS. que dice que ninguna columna de las que forman parte de la PK puede tener un valor nulo.

el SQL está basado en el álgebra relacional y en el cálculo relacional orientado a tuplas. 16 . Por ejemplo.Case Los lenguajes DML de los SGBD comerciales se basan en uno o varios de estos lenguajes matemáticos.

lo que le da una gran capacidad expresiva con una estructura muy simple. otras empresas como ORACLE. y los resultados del acceso son recogidos por el programa que los tratará.Case T. para listarlos. 4. La 1ª versión SQL la desarrolló IBM en la década de los 70. Esta tendencia se vio consolidada debido a que ANSI (American National Standard Institute) desarrolló sus propias especificaciones para el lenguaje SQL.3. JAVA. 1. FUNCIONES. Se puede utilizar de forma interactiva. 3. PL/SQL. ELEMENTOS DE UNA SENTENCIA SQL.. Las características principales del SQL frente a los sistemas tradicionales son: • • • Permite manejar conjunto de registros en lugar de registro a registro. 2. Las sentencias se pueden dirigir al sistema de 2 formas: • • Modo interactivo: la sentencia se escribe directamente en la pantalla del ordenador. 1. es decir. CÓMO SE USA SQL. tanto para microoordenadores. de autorizaciones de acceso a los datos y de consulta y actualización de datos almacenados en la BD relacionales. DIGITAL o UNISYS desarrollaron sus propios lenguajes SQL. PARA QUE SIRVE SQL. QUE ES SQL El SQL es un lenguaje que permite expresar operaciones de definición de estructura de datos. lo que ha llevado a que sea una herramienta ampliamente utilizada en el mundo de las BD’s relacionales. lo que permite realizar consultas no planificadas. Tiene una fuerte base teórica matemática. que no están incluidas en programas.. Ello permite mediante una sola sentencia expresar consultas complejas que tradicionalmente requerían de uno o varios programas. se ejecuta y sobre la misma pantalla aparecen los resultados de la consulta. SQL embebido en un lenguaje de programación: en un lenguaje de 3ª o 4ª generación se insertan sentencias SQL para acceder a los datos de una BD relacional. miniordenadores y mainframes. Ante el éxito de esta primera versión. INTRODUCCIÓN A SQL. 5. Al lenguaje donde se insertan sentencias SQL se le llama lenguaje anfitrión y puede ser C. por lo que los mismos usuarios finales pueden acceder directamente a los datos. La palabra SQL está formada por las iniciales inglesas Structured Query Languaje. 6. que posteriormente fueron aceptadas por la organización ISO (International Standard Organization). por ejemplo. Hay dos técnicas para utilizar SQL embebido en programas: 17 . QUE ES SQL. 2. CÓMO SE USA SQL. TIPOS DE DATOS.

que permite asignar y retirar autorizaciones de acceso a los datos y controlar transacciones. que tienen un significado predefinido en el lenguaje. usuarios. espacios en blanco. como tablas. ELEMENTOS DE UNA SENTENCIA SQL Las sentencias SQL tienen los siguientes componentes: • • • • • Palabras reservadas. Lenguajes de manipulación de datos (DML). vistas o columnas.Case SQL estático. Update: para modificar el valor de columnas de una o varias filas de una tabla. Drop: para eliminar objetos de la BD. que pueden ser numéricos o alfanuméricos entre comillas simples. Nombres de variables huéspedes. SQL dinámico. Constantes. etc. que permite crear. Nombres de tablas. Lenguaje de control de datos (DCL). disparadores. como paréntesis. Signos delimitadores. Alter: para alterar objetos ya creados de la BD. Estas sentencias son: Grant: para otorgar autorizaciones de acceso. El SQL se compone de 3 sublenguajes: • Lenguaje de definición de datos (DDL). Puede ser una sentencia. 18 . 3. PARA QUE SIRVE SQL. inventadas por los creadores de la BD que se asignan en el momento de la creación. Revoke: para retirar autorizaciones de acceso. borrar y consultar datos de la BD. que permite añadir. modificar. que son nombres de variables de programa que se insertan dentro de una sentencia. índices. • • - 4. Delete: para borrar filas de una tabla. Commit: para confirmar transacciones. Insert: para añadir una o varias filas en una tabla. Rollback: para anular transacciones. operadores relacionales. donde las sentencias SQL incluidas en el programa no pueden cambiar durante la ejecución. Las sentencias son: Create: para crear objetos. Estas tareas son propias del DBA. alterar y eliminar objetos de la BD. donde una sentencia SQL puede ser modificada total o parcialmente por el propio programa durante su ejecución. restricciones. operaciones aritméticas. Las sentencias son: Select: para consultar datos de una o varias tablas. una cláusula o una función. vistas.

Los elementos de la máscara para datos de tipo fecha son: mm: número del mes (1-12). dy: abreviatura del día de la semana (Mar. El parámetro p indica la cantidad máxima de dígitos totales que podrá tener el número. rm: mes en números romanos ( I ). RAW (n): que contiene información binaria.. tanto para char como para varchar2 es el operador de concatenación de cadenas ||. mes. VARCHAR2 (n): para declarar cadenas de caracteres de longitud variable entre 0 y n caracteres.fecha[. Los parámetros p y s son opcionales.712 A.Case 5.s): para declarar valores numéricos. ‘3’. ddd: número del día del año (1-366) dd: día del mes (1-31). ‘&’. El operador para cadenas. DATE: que almacena datos del tipo fecha y hora. day: nombre del día de la semana (Martes). sonidos. según el formato especificado en la máscara.). Si no se especifica ningún formato lo presenta en el formato por defecto. TIPOS DE DATOS Los tipos de datos de los que se puede declarar una columna de una tabla en ORACLE son: • NUMBER (p. En las consultas se presenta el dato con el formato por defecto DD-MM-YY.C. hora. yyyy: año con 4 dígitos (2002).. * y /. como ‘A’.). hasta el 30 de diciembre de 4712 D. yy: año con 2 dígitos (02). 19 • • • • • • ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ . El tamaño máximo es de 4. minuto y segundo.. -.C. TO_CHAR (dato. Los valores permitidos van desde el 1 de junio de 4. En un dato de tipo fecha viene almacenado: año. Los operadores son +. month: nombre del mes (Enero). Esta variable de entorno se encuentra en la clave de registro del sistema HKEY_LOCAL_MACHINE\Software\Oracle\Home0. día. LONG RAW: que contiene información binaria hasta 2 GB. El parámetro s indica la cantidad de dígitos que tendrá la parte digital. a) Funciones para tratamientos de fechas: SYSDATE: que devuelve la fecha del sistema. Su longitud máxima es de 255 bytes.’nlsparams’]]): Esta función convierte el dato de tipo DATE al tipo de VARCHAR2. CHAR (n): para declarar cadenas de caracteres de longitud fija de ‘n’ caracteres. El formato por defecto se especifica en la variable de entorno NLS_DATE_FORMAT. Para indicarle la lengua especificamos ‘NLS_DATE_LANGUAGE = idioma’. Si no se especifican ni p ni s el valor se almacena tal y como se signe a la columna. LONG: que contiene cualquier dato imprimible.000 bytes. mon: abreviatura del mes (Ene. Su longitud máxima es de 2 GB y se utiliza para guardar textos. Se utiliza para almacenar información gráfica. El dato almacenado en la BD es en realidad un número al que se le aplica un algoritmo de conversión y se presenta en el formato que se especifique.. El máximo de ‘n’ es 255 bytes. El parámetro NLS_PARAMS especifica el lenguaje en que aparecerán escritos los nombres y las abreviaturas de los nombres y las abreviaturas de los meses y días de la semana. Si se omite el parámetro ‘n’ asume el valor 1. d: día de la semana (1-7).máscara[.

0 si n=0 y 1 si n>0..n): Eleva m a n. TRUNC(n. POWER(m.Case ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ year: año en letra (dos mil dos). hh: hora del día (1.24). ww: semana del año (1. La máscara es un formato de fecha en el que está representado el dato alfanumérico.5). y 1/86400= 1sg. • Para datos numéricos: ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ABS(n): Devuelve el valor absoluto de n. c) Operadores de fechas: Con las fechas se pueden utilizar los operadores + y -. TO_DATE: Convierte el dato de tipo char o varchar2 a 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.. hh12: hora del día (1.12).. CEIL(n): Devuelve el entero más grande menor o igual que n. q: número del cuatrimestre (1. ss: segundo del minuto (1. Si se omite la máscara el dato ha de estar en el formato de fecha por defecto. 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 instrucción TO_DATE. MOD(m. hh24: hora del día (1.. SIGN(n): Devuelve –1 si n<0. FUNCIONES..12).4).[m]): Redondea n.. 20 . Si a una fecha se le suma un entero ‘n’ devuelve la fecha pasado n días.. FLOOR(n): Devuelve el entero más grande menor o igual que n.. b) Asignación 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. mi: minuto de la hora (1. Si m no es 0 no trunca los m primeros decimales. Si a una fecha se le resta un entero n nos da la fecha de n días antes. 1/1440= 1min. am: muestra AM o PM según sea antes o después del mediodía. SQRT(n): Devuelve la raíz cuadrada de n.n): Devuelve el resto de dividir m entre n. 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. que convierte una cadena de caracteres a un dato de tipo DATE.[m]): Trunca n.60). w: semana del mes (1. ROUND(n. Si m no es 0 redondea a m decimales. 6.60). pues el sistema hace automáticamente la conversión.53). Si se restan dos fechas devuelve el número de días que hay entre ellas.

) LENGTH(A): Devuelve la longitud de la cadena. m y n por defecto son 1. REPLACE(A. TO_CHAR (dato. SUBSTR(A. LOWER(A): Convierte en minúsculas el argumento.B): Elimina empezando por la izquierda del argumento A los caracteres que coinciden con el argumento B. CONCATA (A. ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ 21 . month: nombre del mes (Enero).[C]): Reemplaza en la cadena A. Para indicarle la lengua especificamos ‘NLS_DATE_LANGUAGE = idioma’.4). Si no aparece C. ddd: número del día del año (1-366) dd: día del mes (1-31).n. yyyy: año con 4 dígitos (2002). ASCII(A): Devuelve el código ASCII de un carácter.’g’.[n]): Devuelve una subcadena de A de longitud n. o la ocurrencia que ocupe el emésimo lugar. yy: año con 2 dígitos (02).fecha[. d: día de la semana (1-7).’nlsparams’]]): Esta función convierte el dato de tipo DATE al tipo de VARCHAR2. según el formato especificado en la máscara. Equivale a ||.B[n. (select length(‘DeMoN’) from dual. INITCAP(A): Convierte a mayúsculas la letra inicial de cada palabra contenida en el argumento.).[m]]): Busca el argumento A. INSTR(A.B): Concatena las cadenas o variables A y B. Los elementos de la máscara para datos de tipo fecha son: mm: número del mes (1-12). LTRIM(A.. la cadena B.[B]): Lo mismo que LPAD pero por la derecha. El parámetro NLS_PARAMS especifica el lenguaje en que aparecerán escritos los nombres y las abreviaturas de los nombres y las abreviaturas de los meses y días de la semana. LPAD(A. mon: abreviatura del mes (Ene.2. day: nombre del día de la semana (Martes). la subcadena B por la subcadena C. q: número del cuatrimestre (1.m.Case • Para las cadenas de caracteres: ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ CHR(n): Devuelve el carácter asociado al código ASCII de n. reemplaza con nada.) ‫א‬ • - Para fechas y conversión de datos: SYSDATE: que devuelve la fecha del sistema.máscara[.).1) from dual.n. RPAD(A. devolviendo la posición de comienzo. Sin m es negativo comienza por la derecha. dy: abreviatura del día de la semana (Mar.B. UPPER(A): Convierte a mayúsculas el argumento.[B]): Devuelve A ajustada a la derecha rellenada por la izquierda con el parámetro B hasta completar n. hasta que encuentre uno diferente. rm: mes en números romanos ( I ).B): Lo mismo que LTRIM pero por la derecha. (select instr(‘gabcdefghigg’. year: año en letra (dos mil dos). comenzando en la posición m. de lo contrario comienza a buscar a partir del carácter que ocupa la posición n. RTRIM(A.

0: Visualiza los ceros a la izquierda no significativos. hh12: hora del día (1.. USER: Devuelve el nombre del usuario con el que se está conectado. w: semana del mes (1. TO_CHAR(dato. De propósito general: NVL(expresión1.: Puntuación de millar cuando proceda.[‘nlsparams’]]): Convierte el dato de tipo char o varchar2 a tipo DATE. ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ - • - ORACLE proporciona una pequeña tabla con una fila y una columna llamada dual. LAST_DAY(fecha): Devuelve la fecha correspondiente al último día del mes de la fecha indicada.. especificando la tablas dual en la cláusula FROM de la sentencia SELECT... . Se utiliza cuando se quiere hacer trabajar con constantes en lugar de con columnas.[máscara. hh24: hora del día (1.): Devuelve el mayor de todos los valores especificados.fecha2): Devuelve el número de meses entre dos fechas. expresión2): Se utiliza para sustituir nulos por un valor real. para realizar pruebas y cálculos rápidos.): Devuelve el menor valor de los especificados en la lista.. Los elementos de esta máscara pueden ser: 9: Devuelve el valor numérico eliminando los ceros a la izquierda. MONTHS_BETWEEN(fecha1.valor2.. S: Devuelve + si es positivo o – si es negativo.60).24). según el formato de la máscara. si no es nula devuelve expresión1. ADD_MONTHS(fecha.. hh: hora del día (1. TO_DATE (dato.12).. mi: minuto de la hora (1.Case ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ‫א‬ ww: semana del año (1. LEAST(valor1. am: muestra AM o PM según sea antes o después del mediodía.53). valor2..[máscara]): Convierte el dato de tipo NUMBER al tipo de VARCHAR2 según el formato especificado en la máscara. GREATEST(valor1.: Puntuación de decimal cuando proceda. 22 . La máscara es un formato de fecha en el que está representado el dato alfanumérico.60). cantidad de meses): Suma meses a una fecha.5).12). TO_NUMBER (dato.. MI: Devuelve el signo menos por la derecha si el valor es negativo. [máscara... . que es como no especificar ninguna tabla.. ss: segundo del minuto (1.[‘nlsparams’]]): Convierte un dato de tipo CHAR o VARCHAR2 en un valor de tipo NUMBER. Si se omite la máscara el dato ha de estar en el formato de fecha por defecto. Si expresión1 es nula devuelve expresión2.

EL DICCIONARIO DE DATOS. 6. DEFINICIÓN DE ESTRUCTURAS DE DATOS Y OTROS OBJETOS DEL SISTEMA DE BD MEDIANTE SQL 1. Para conseguir la confidencialidad en la BD es necesario definir usuarios que accedan a la BD y otorgarles permisos de acceso según su grado de responsabilidad en el sistema de información. llamadas tablespace. éste no puede hacer nada porque todavía no se le han asignado permisos sobre el sistema. 11. ELIMINACIÓN DE UNA TABLA. que permiten al usuario conectarse a ORACLE: CONNECT: permite al usuario conectarse. Para facilitar la asignación de privilegios ORACLE utiliza el concepto de ROL. CONFIDENCIALIDAD DE LOS DATOS. CREACIÓN DE VISTAS. En el caso de ORACLE se definen unas áreas de memoria en disco que son espacios para ubicar las tablas.4. entre ellos están: SYSTEM/manager: usuario administrador del sistema. CREACIÓN DE ÍNDICES. Una vez creado un usuario. así que se le asigna al usuario todos los privilegios. 3. SYS/change_on_install: que es el propietario del diccionario de datos. Son utilizadas por el DBA para optimizar el almacenamiento y el rendimiento del sistema. que es un grupo de privilegios con un nombre que pueden ser concedidos o denegados a un usuario. 5. 10. CREACIÓN DE ROLES. Para conectarse al sistema con un nuevo usuario se utiliza el comando de SQL/PLUS ‘connect nombre_usuario/password’. ALTERACIÓN DE UNA TABLA. DBA: que es el privilegio del DBA. CREACIÓN DE SINÓNIMOS. ORACLE ofrece 3 roles. CREACIÓN DE USUARIOS Y PERMISOS DEL SISTEMA. 9. RESOURCE: que permite al usuario crear sus propias tablas. CREACIÓN DE UNA TABLA. 8. 23 . pero no le permite crear objetos en la BD. 7. LENGUAJE DE DEFINICIÓN DE DATOS (DDL). 2. SCOTT/tiger: Para crear un nuevo usuario se usa el comando ‘create user nombre_usuario IDENTIFIED BY password [definiciones de almacenamiento físico]’ Las definiciones de almacenamiento físico son diferentes en cada SGBD. El SGBD ORACLE viene con varios usuarios ya creados. 4.Case T. 1. CREACIÓN DE USUARIOS Y PERMISOS DEL SISTEMA.

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 información sobre la BD, y en ellas sólo puede escribir el SGBD. Los usuarios pueden acceder a las vistas del diccionario de datos mediante SQL para consultar. La mayoría de las vistas del diccionario aparecen en conjuntos de 3, que contienen información similar y que se diferencian con el prefijo. El prefijo USER_ visualizará sólo los objetos creados por el propio usuario. El prefijo ALL_ visualizará los objetos sobre los que el usuario tiene algún tipo de permiso. El Prefijo DBA_ visualizará todos los objetos que hay en el SGBD. Este tipo de vistas sólo 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 descripción 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 descripción de las tablas creadas en el diccionario de datos. DBA, ALL, USER_CONSTRAINTS: contienen la descripción de las restricciones definidas sobre las tablas. DBA, ALL, USER_USERS: contienen la descripción 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 descripción de una tabla concreta. Este comando es DESC. SQL> DESC nombre_tabla;

3. LENGUAJE DE DEFINICIÓN 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 definición 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. CREACIÓN DE UNA TABLA.
El formato general para la creación de una tabla es: SQL> CREATE TABLE nombre_tabla (nombre_columna1 tipo_dato [restricción1], nombre_columna2 tipo_dato [restricción2], ······························································ nombre_columnaN tipo_dato [restricciónN]); Los nombres de las tablas y de las columnas debe empezar por una letra y puede incluir letras, dígitos y el guión bajo (_), hasta un máximo de 30 caracteres, no pudiendo utilizarse palabras reservadas del lenguaje. El lenguaje no distingue entre mayúsculas y minúsculas, pero en el diccionario de datos se graban en mayúsculas. 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 restricción 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 paréntesis y separados por comas. En caso de insertar una fila donde el valor no coincida con alguno de los permitidos no permite la inserción. 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 restricción 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 después 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 sería: SQL> CREATE TABLE nombre_tabla ( nombre_col1 tipo_dato [restricción_col1], nombre_col2 tipo_dato [restricción1_col2], nombre_colN tipo_dato [restricción1_colN], [restricción1_tabla], [restricción2_tabla], [restricciónN_tabla]); En una misma sentencia de creación 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_restricción] PRIMARY KEY; a nivel de tabla:

>[CONSTRAINT nombre_restricción] PRIMARY KEY (nombre_columna.pk); • UNIQUE: a nivel de columna:

>nombre_columna tipo_dato [CONSTRAINT nombre_restricción] UNIQUE; a nivel de tabla:

>[CONSTRAINT nombre_restricción] UNIQUE (nombre_columna); • DEFAULT: sólo 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_restricción] CHECK (nombre_columna IN (valor1, valor2,...valorN)); a nivel de tabla:

>[CONSTRAINT nombre_restricción] CHECK (nombre_columna IN (valor1, valor2,...valorN));

26

Case • NOT NULL: sólo puede ser definido a nivel de tabla.

>nombre_columna tipo_dato [CONSTRAINT nombre_restricción] NOT NULL; • FOREIGN KEY: a nivel de columna: REFERENCES

>nombre_columna tipo_dato [CONSTRAINT nombre_restricción] nombre_tabla_pk (nombre_columna_pk) [ON DELETE CASCADE]; a nivel de tabla:

>[CONSTRAINT nombre_restricción] FOREIGN KEY (nombre_columna_fk) REFERENCES nombre_tabla_pk (nombre_columna_pk) [ON DELETE CASCADE]; Con la opción 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. ALTERACIÓN DE UNA TABLA.
La sentencia ALTER se utiliza para alterar la estructura de una tabla, pudiendo añadir nuevas columnas, redefinir los tipos de datos y sus tamaños, añadir 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 opción ADD se añaden nuevas columnas, y con la opción MODIFY se modifica la definición de las columnas, pudiendo cambiar su tamaño 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 tamaño de una columna si contiene datos.

27

Los privilegios que un usuario puede otorgar a otros usuarios sobre objetos de su propiedad son: select: selecciona tablas. si se omite el nombre del esquema el sistema asume el esquema del usuario con el que se está conectado a la BD. con el siguiente formato: [nombre_esquema]. sigue presente en el diccionario de datos pero no está activa.Case • > > FORMATO PARA ALTERAR LAS CONSTRAINTS ALTER TABLE nombre_tabla {DROP|DISABLE|ENABLE} constraint nombre_restricción. CON EL MISMO NOMBRE DEL USUARIO. CONFIDENCIALIDAD DE LOS DATOS. Hay dos tipos de privilegios: privilegios del sistema y privilegios de objeto. ELIMINACIÓN DE UNA TABLA. • PRIVILEGIOS DEL SISTEMA: son permisos para realizar aciones sobre los tipos de objetos de la BD. insert: inserta datos en tablas. Con ADD se añade una nueva restricción a una tabla. 6. alter: permite alterar la estructura del objeto. La vista DBA_SYS_PRIVS contiene los privilegios del sistema otorgados a usuarios y roles. Cuando se hagan referencias al objeto. El usuario creador de un objeto es propietario de ese objeto. crear una sesión. índices. Un usuario puede acceder a los objetos propiedad de otros usuarios si se le conceden los privilegios correspondientes. El formato es: > DROP table nombre_table. eliminando toda referencia dentro del diccionario de datos y sin posibilidad de recuperarlos. 28 • - . y un propietario tiene todos los privilegios sobre su objeto. es decir.. index: permite incluir un índice. Cuando se crea un usuario ORACLE crea una estructura lógica ‘ESQUEMA’.. Elimina los datos y la estructura de la tabla . crear tablas. hay hasta 60 privilegios del sistema. La vista ROLE_SYS_PRIVS contiene los privilegios del sistema otorgados a roles. 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. 7. PRIVILEGIOS DE OBJETOS: son permisos para realizar acciones sobre objetos concretos de la BD. references: permite crear FK. Con DISABLE se deshabilita una constraint. por ejemplo. ALTER TABLE nombre_tabla add constraint nombre_restricción definición de restricción a nivel de nivel de tabla. Con ENABLE se habilita una restricción que estaba previamente deshabilitada. Con DROP se elimina una restricción del diccionario de datos sin posibilidad de recuperación. update: actualiza tablas.nombre_objeto. delete: borrar.

sólo se pueden especificar para los privilegios insert. Las vistas del diccionario de datos asociadas a los privilegios son: USER. update y references. columna1. Se puede crear un rol mediante la sentencia >CREATE ROLE nombre_rol. DBA_SYS_PRIVS. La sintaxis para conceder privilegios es: > GRANT {lista_privilegios|ALL[privileges]} [(columna1. Se puede indexar una tabla en aquellas columnas que necesitan un acceso rápido. Lista_usuarios y lista_roles son los nombres de uno o mas usuarios o roles a los que se otorgan los privilegios. otorgado o propietario. ℘ VISTAS DEL DICCIONARIO DE DATOS ORIENTADA A ROLES℘ USER_ROLE_PRIVS. entonces al retirar los privilegios al usuario B se le retira también al usuario C. 8. ALL_COL_PRIVS. otorgado o propietario.Case execute: da permiso para ejecutar subprogramas. que contienen los privilegios sobre tablas en las que el usuario es otorgador. CREACIÓN DE ROLES. 9. Es posible conceder un rol a otro rol. La cláusula 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. que contiene los privilegios sobre tablas otorgados a los roles... DBA_ROLES. que contiene los roles otorgados al usuario actual. El rol se crea vacío y posteriormente se le concederán los privilegios mediante la sentencia >GRANT. La otra es USER. columna2 especifican las columnas de la tabla sobre las que se concede los privilegios. CREACIÓN DE ÍNDICES. 29 . El SGBD ORACLE crea automáticamente índices cuando se establecen constraints de PK o UNIQUE. Con la sentencia REVOKE se puede retirar privilegios que previamente se han concedido a un rol. {lista_usuarios|lista_roles|public} [with grant option]. ROLE_TAB_PRIVS. columna2. que contiene todos los roles que existen en la BD. que contiene los privilegios sobre columnas en las que el usuario es otorgador. Objeto es el nombre de la tabla. Si se especifica PUBLIC se otorgan los privilegios a todos los usuarios del sistema. All privileges concede todos los privilegios sobre el objeto. que contiene los privilegios del sistema otorgado a los roles. ALL_TAB_PRIVS. vista u otro objeto sobre el que se otorga el privilegio.)] on objeto to Donde lista_priviegios consiste en uno o más nombres de privilegios separados por comas. 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 cláusula with grant option hace que los usuarios a los que se les conceden los privilegios puedan a su vez otorgarlos a otros usuarios.

UPDATE.columna[ASC|DESC]].. Para borrar un sinónimo se utiliza: >DROP SYNONYM nombre_sinonimo. CREACIÓN DE VISTAS. Los sinónimos son nombres alternativos que se pueden emplear para gestionar tablas y otros objetos como vistas. Las vistas permiten restringir el acceso a los datos. si no se especifica sólo podrá ser reconocido por el usuario que lo creó. contiene los sinónimos privados accesibles por el usuario. Las vistas permiten organizar los datos de diferentes formas. CREACIÓN DE SINÓNIMOS. funciones. Los sinónimos pueden ser utilizados por las sentencias INSERT. Una vista define una tabla virtual basada en una o más tablas o vistas. 30 . Si se especifica la cláusula PUBLIC el sinónimo es accesible para todos los usuarios. haciendo que determinados usuarios accedan a las vistas que sólo contienen determinadas columnas y filas de las tablas reales. Aquellos que tienen en la columna OWNER el valor PUBLIC son sinónimos públicos. La instrucción para crear un sinónimo es la siguiente: >CREATE [PUBLIC] SYNONYM nombre_sinonimo FOR nombre_objeto. USER_SYNONYMS.Case El formato es: >CREATE INDEX [.). sin necesidad de especificar el propietario al ir implícito en el nombre del sinónimo. 10. Los sinónimos proporcionan independencia para tratar los objetos ya que se puede acceder a objetos de otros propietarios o situados en BD’s remotas. La diferencia entre tabla y vista es que en una vista no se almacenan los datos físicamente y en una vista a los usuarios se les presentan unos datos que son el resultados de una consulta sobre las tablas reales. 11. Desde el punto de vista del usuario no se encuentra diferencia entre tabla y vista. de modo que los usuarios los ven desde diferentes perspectivas. DELETE. >DROP PUBLIC SYNONYM nombre_sinonimo. nombre_indice ON nombre_tabla (columna[ASC|DESC] ℘VISTAS DEL DICCIONARIO DE DATOS ASOCIADAS A LOS ÍNDICES℘ USER_INDEXES. paquetes y otros sinónimos. contiene todos los sinónimos accesibles por el usuario. GRANT y REVOKE.. que contiene los índices propiedad del usuario que consulta la vista. ℘VISTAS DEL DICCIONARIO DE DATOS ASOCIADAS A LOS SINÓNIMOS℘ ALL_SYNONYMS. procedimientos. SELECT.

ni actualizaciones sobre la vista. El formato completo sería: >CREATE VIEW nombre_vista [(columna1[.columna2]. y en este caso si hay que darle nombre a las columnas de la vista..Case El formato simple para crear un vista es: >CREATE VIEW nombre_vista [(columna1 [. Si se omiten los nombres de las columnas de la vista... La sentencia CREATE VIEW tiene dos cláusulas más. WITH READ ONLY: no permite borrados. 31 ..columna2]. que son: WITH CHECK OPTION: que obliga a que los datos modificados a través de la vista cumplan las condiciones de selección de la definición de la vista. Las vistas también se pueden crear a través de una consulta con agrupamiento. ni inserciones.)] AS consulta.)] AS consulta [WITH READ ONLY] [WITH CHECK OPTION]. las columnas de la vista tendrán los mismos nombres que las columnas de las tablas sobre las que se realiza la consulta. especificadas entre paréntesis. También se pueden crear vistas de las columnas de varias tablas.

Case 32 .

CONSULTAS COMPLEJAS EN SISTEMAS DE INFORMACIÓN COMPLEJOS..X] [paso 3. 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 . CONSULTAS SENCILLAS.X] CODDE [paso 2. PREDICADOS FUNCIONES DEL LENGUAJE SQL. 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 creación.√] [paso 3. EXPRESIONES. El resultado de ejecutar una sentencia SELECT es otra tabla.√] [paso 3. SENTENCIAS PARA MODIFICAR DATOS.. 9. CONSULTAS CON AGRUPAMIENTOS.|*} FROM columna[ASC|DESC] [.√] 100 110 111 112 120 NOMDE Dirección General Dirección Comercial Sección Técnica Sección Servicios Organi. [paso1=DEPTO.5. El predicado de la cláusula WHERE es una condición..WORK] [paso 3.X] [paso 3. 7. CONSULTAS SOBRE VARIAS TABLAS. 3. 5.columna]. 1. 6. CONSULTAS SENCILLAS.. 2..Case T. 1.1. donde la lista de columnas de la cláusula SELECT son columnas de la tabla que se especifique en la cláusula FROM. Los pasos que sigue el SGBD para ejecutar una sentencia SELECT son: DEPTO. 4. 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[. OTRAS CARACTERÍSTICAS DE LA SENTENCIA SELECT.√] [paso 3.X] [paso 3.X] [paso 2.√] [paso 2. 1.columna[ASC|DESC]. y es la información resultante de la consulta. 8. En la cláusula ORDER BY se especifican las columnas por las que se presenta ordenado el resultado de la consulta.X] [paso 2.√] [paso 2. USO DE SQL EN MODO INTERACTIVO.

Cuando se especifica la cláusula ORDER BY los datos aparecen por defecto en orden ascendente.. Además se retiran las columnas de la tabla no especificadas en la cláusula SELECT. Si en la cláusula SELECT se especifica en el lugar de una columna un literal entre comillas simples..Case >SELECT codde. 1. que incluso puede variar de una ejecución a otra. 1. La tabla resultante se puede ordenar por más de una columna. éste literal aparecerá en todas las filas resultantes de la consulta. En la cláusula ORDER BY se puede especificar un número en lugar de un nombre de columna. columna2. Si el encabezado es una sola palabra no necesita comillas. Si se desea una ordenación por orden decreciente se especifica la palabra DESC detrás de nombre de columna o del número en el que se desea la ordenación. que consiste en evaluar las condiciones contenidas en la cláusula SELECT y la opción DISTICT si existen. 4. Ejecución de la cláusula ORDER BY. que serán eliminadas por el SGBD antes de enviarlas a la tabla resultante. ℘CARACTERÍSTICAS DE FUNCIONAMIENTO℘ Si no se especifica la cláusula ORDER BY. FROM depto WHERE tidir=’P’ ORDER BY nomde. y si hay valores nulos se presentan al final de la lista. el SGBD presenta las filas en cualquier orden. que consiste en seleccionar de entre todas las tablas de la BD las tablas especificadas en la cláusula FROM. Esto implica que en el resultado de la consulta no pueden aparecer filas repetidas. Ejecución de la cláusula WHERE. Para ello se especifican en la cláusula ORDER BY las columnas separadas por comas. En el caso concreto de ORACLE las presenta ordenadas por la PK. 2. Eliminación de filas repetidas: En la cláusula SELECT se puede incluir la palabra reservada DISTINCT antes de todos los nombres de las columnas: >SELECT DISTINCT columna1. Ejecución de la cláusula FROM. dejando las filas que cumplan la condición y suprimiendo las que no la cumplan. y ésta será la tabla resultante de la sentencia SELECT hasta este momento.2. nomde. Este número se refiere a la columna que aparece en la cláusula SELECT en el lugar indicado por el número. codjefe. Se puede cambiar el encabezado de una columna en el resultado de la consulta poniendo el nuevo encabezado entre comillas dobles a continuación de la columna. que consiste en presentar la tabla resultante del paso anterior ordenada por las columnas especificadas en la cláusula ORDER BY. Ejecución de la cláusula SELECT. 3. 34 .. que aplica el predicado especificado en la cláusula WHERE a la tabla resultante del paso anterior.

Case 2. Las operaciones pueden aparecer en dos sitios: • • En la cláusula SELECT. falso o desconocido. Nulos: Su formato es: nombre_columna IS [NOT] NULL. Un predicado tiene resultado desconocido cuando en alguno de los elementos de la comparación tiene nulos. exist. es decir. A esta SELECT subordinada se la denomina SUBSELECT o SUBCONSULTA.1. 35 . like. En la formulación de una consulta se pueden realizar operaciones con los datos. constantes u otras expresiones. Estas operaciones se especifican mediante expresiones. Un predicado expresa una condición entre valores y el resultado de la condición puede ser verdadero. La tabla debe tener una sola columna y una sola fila o ninguna. En la cláusula WHERE. Un predicado en la cláusula WHERE da lugar a que se seleccionen todas aquellas filas que se evalúen con el valor verdadero. Los operadores pueden ser nombres de columnas. EXPRESIONES. donde uno o ambos de los valores a comparar pueden ser una expresión. some. que el SGBD cuando las ejecuta devuelve como resultado un único valor resultante de evaluar la expresión. Se especifican con los operadores relacionales < > = != <> <= >=.3. in. donde las expresiones aparecen en el lugar donde se especifican los nombres de columna. Los predicados se expresan en las cláusulas WHERE y HAVING. la cual ha de ir entre paréntesis. PREDICADOS. null. Una expresión es una combinación de operadores operandos y paréntesis.2. 3. 3. between. 3. Los operadores actúan sobre datos del mismo tipo. some). cuantificados (all. Este predicado NO puede tener valor desconocido. any) la tabla resultante de la columna podrá tener una columna y ninguna.1. los operandos pueden ser numéricos o alfanuméricos. Si se utilizan los predicados cuantificados (all. El resultado de la subconsulta ha de ser un valor único. 3.1. y no serán seleccionadas las que se evalúen con el valor falso o desconocido. una o varias filas. Los elementos comparados son expresiones.1. any. Los predicados se clasifican en 2 grupos: 3. Simples: Se subdividen en predicados básicas. Cuantificados: En un predicado básico se utiliza una subconsulta como segundo elemento del predicado. Básicos: Son predicados que expresan condición de comparación entre dos valores. 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. la tabla resultante ha de tener una sola columna y una o ninguna fila.1. El segundo elemento comparado puede ser el resultado de otra sentencia SELECT.

3. La columna ha de ser de tipo alfanumérico. Si se especifica SOME y la subconsulta devuelve una tabla vacía.1. El patrón es una constante que puede contener cualquier cadena de caracteres. • SOME: se evaluará a verdadero si la comparación es verdadera para al menos uno de los valores resultantes de la subconsulta. mientras que el ‘%’ equivale a una cadena de caracteres de cualquier tamaño. Su formato es: >nombre_columna [NOT] LIKE ‘patrón’.4. ℘CASOS ESPECIALES DE LOS PREDICADOS ALL Y SOME℘ Por convenio se evalúan de la siguiente manera: Si se especifica ALL y la subconsulta devuelve una tabla vacía el predicado toma el valor verdadero. Su formato es: >Expresión1 [NOT] BETWEEN expresión2 AND expresión3. ambos inclusive. El predicado se evalúa verdadero si el valor de expresión1 es mayor o igual que el valor de expresión2 menor o igual que el valor de expresión3. El predicado se evalúa falso en caso contrario.Case • ALL: el predicado cuantificado se evalúa verdadero si la comparación es verdadera para todos y cada uno de los valores resultantes de la subconsulta. expresión2 o expresión3 es nula entonces el predicado se evalúa desconocido.5. el predicado toma valor falso. Si el patrón no contiene caracteres comodines. El ‘_’ equivale a una cadena de caracteres de longitud 1. Predicado LIKE: Sirve para seleccionar valores que se ajusten a un patrón. Predicado BETWEEN: Sirve para determinar si un valor está comprendido entre otros dos valores. • ANY: es igual que some. incluido 0 caracteres. 36 . Si la evaluación de la expresión1. entonces el valor de la columna para que la fila sea seleccionada ha de ser igual que el patrón. Este predicado se puede expresar también mediante operadores lógicos: >expresión1 BETWEEN expresión2 AND expresión3 ! >exp1>=exp2 AND exp1<=exp3 >expresión1 NOT BETWEEN expresión2 AND expresión3! >exp1<exp2 OR exp1>exp3 3.1. pero hay dos caracteres que funcionan como comodín: ‘%’ y ‘_’.

Este predicado no puede tomar el valor desconocido. OR y NOT. Este predicado se evalúa verdadero si el resultado de la subconsulta es una tabla que contiene una o más filas.) Si el valor de la expresión es igual a alguno de los valores de la lista. Si el valor de la expresión es nulo. Formato 2: >expresión [NOT] IN (subconsulta) Este segundo formato tiene sus equivalentes con los predicados cuantificados. Tiene dos formatos: Formato 1: >expresión [NOT] IN (constante1[. Su formato es: >[NOT] EXISTS (subconsulta) La tabla resultante de la subconsulta puede contener cualquier número de filas y columnas. Si el valor de la expresión no es igual a ninguno de los valores de la lista se evalúa como falso. 37 . es decir.. 3. El predicado se evalúa a falso si la tabla resultante de la subconsulta es una tabla vacía. Predicado EXISTS: Sirve para determinar si existen filas o no existe ninguna fila que cumplan con un determinado requerimiento.2. Predicado IN: Sirven para preguntar si el resultado de una expresión está incluido en una lista de valores.Case 3. Así ‘expresión IN (subconsulta)’ ! ‘expresión = some(subconsulta)’ 3.6. el predicado se evalúa como verdadero. 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. Un predicado compuesto se evalúa a verdadero. si no es una tabla vacía. el predicado se evalúa como desconocido.1.constante2].1.7.. falso o desconocido según la siguiente tabla de verdad. Compuestos: Son los predicados simples vistos hasta ahora combinados con los operadores lógicos AND.

Su formato es: >LENGTH (expresión). El argumento es una expresión cuyo resultado ha de ser de tipo alfanumérico.2. El argumento de una función puede ser una expresión. que es el nombre de la función. Funciones escalares: 4. el resultado de la función es nulo. En las funciones colectivas el argumento es una columna.2.1. En SQL hay dos tipos de funciones: escalares y colectivas o de columna. Si el argumento es nulo. 4. En una función escalar el argumento es un único valor. FUNCIONES DEL LENGUAJE SQL. seguida de los argumentos entre paréntesis y separados por comas. 4. Una función se especifica mediante una palabra reservada. El resultado de la función es un entero que indica el número de caracteres que tiene la cadena pasada como argumento. 38 . Función LENGTH: Obtiene la longitud de una cadena de caracteres. Por lo tanto la función se aplica a un conjunto de valores. Las funciones a su vez pueden ser operandos de una función. Definición de función: Una función representa un valor único que se obtiene aplicando unas determinadas operaciones a unos valores llamados argumentos.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. [(max(salar)+min(salar))/2].1.

39 . por ejemplo. Funciones de columnas o colectivas: Estas funciones devuelven un único valor como resultado de aplicar una determinada operación a los valores contenidos en una columna. AVG: calcula la media aritmética de un conjunto de valores. MAX: obtiene el valor máximo de un conjunto de valores. SUM: obtiene la suma de un conjunto de valores. MIN: obtiene el valor mínimo de un conjunto de valores. si el resultado de la cláusula WHERE no lo satisface ninguna fila.3. El primer argumento es la cadena de caracteres de la que se va a extraer la subcadena.ℑ ℘REGLAS Y FORMATOS DE LAS FUNCIONES COLECTIVAS℘ 1. 4. Si se hacen grupos mediante la cláusula GROUP BY se aplica la función a cada grupo.Case 4. Los valores a los que se aplica son a las columnas de las filas seleccionadas en la cláusula WHERE. 3. por ejemplo. la suma de todos los valores de una columna o la media aritmética. pues carecería de valor para el SGBD. El argumento de la función puede ser una expresión: ‘sum(salar)’ o ‘sum(salar+comis)’ por ejemplo. MAX. El tercer argumento es un valor entero que indica la longitud de la subcadena. El tipo de argumento debe ser numérico para las funciones AVG y SUM y pueden ser de cualquier tipo para las funciones MAX. todas las filas se consideran como un único grupo. COUNT: obtiene cuantos valores hay en una colección. Las funciones colectivas son: AVG.expresion3]). SUM. ℑ Cuando se especifican funciones colectivas en la cláusula SELECT no se puede incluir en el resultado valores no colectivos. y el resultado de la sentencia SELECT es una tabla con una única fila. COUNT. El segundo argumento es un valor entero que indica la posición inicial de la subcadena dentro de la cadena.2. MIN y COUNT. Para las funciones AVG. MIN. Su formato es: >SUBSTR(expresion1. MIN. 2. Si este argumento no se especifica la subcadena será desde la posición inicial indicada en el segundo argumento hasta el final de la cadena. por ejemplo. Las funciones pueden actuar como operandos de una expresión: ‘(max(salar)+min(salar))/2’ por ejemplo. Función SUBSTR: Obtiene una subcadena de caracteres de una cadena de caracteres. Que el conjunto de valores sea vacío puede ser. SUM el resultado tiene el mismo tipo de datos que el argumento. Si el conjunto de valores es vacío la función COUNT da como resultado 0 y las otras funciones dan como resultado NULL. Antes de aplicar una función colectiva al conjunto de valores de su argumento se eliminan los valores nulos. Si no hay cláusula GROUP BY. MAX.expresion2[. el resultado de la función es nulo. El argumento de estas funciones es un conjunto de valores tomados de una o más columnas: ‘sum(salar)’ o ‘sum(salar+comis)’. Estas funciones sólo aparecen en las cláusulas SELECT y HAVING.2. Si alguno de los argumentos de la función es nulo.

la cláusula HAVING selecciona entre los grupos formados por la cláusula GROUP BY aquellos grupos que cumplen una condición. En el predicado de la cláusula HAVING sólo puede aparecer columnas de agrupamiento y columnas que no sean de agrupamiento pero como argumento de funciones colectivas. En este punto se verá como formar grupos de filas de acuerdo con un determinado criterio para aplicarle posteriormente las funciones colectivas.1. La palabra DISTINCT indica que antes de aplicar la función al conjunto de valores de la columna se eliminan los valores repetidos. La cláusula aparece a continuación de la cláusula GROUP BY.. Su formato es: >HAVING condición. COUNT(*): sólo es válido para la función COUNT. CONSULTAS CON AGRUPAMIENTO DE FILAS.Case ℘FORMATOS DE LAS FUNCIONES COLECTIVAS℘ Las funciones colectivas tienen dos posibles formatos: 1.columna2]. 5. 40 . Su formato es: >GROUP BY columna1 [.. Cláusula HAVING: Esta cláusula se utiliza para seleccionar grupos de filas. nombre_funcion ([DISTINCT] expresion): este formato es aplicable a las cinco funciones. Cada grupo está formado por el conjunto de filas que tienen el mismo valor en las columnas de agrupamiento. Las funciones de columna que se especifican en la cláusula HAVING se aplican a los valores de cada grupo. La cláusula GROUP BY agrupa las filas de la tabla en grupos. La condición es un predicado simple o compuesto. La cláusula GROUP BY especifica que se ha de agrupar las filas de una tabla en grupos. Una vez formados los grupos. para cada uno de ellos se evalúan las expresiones de la cláusula SELECT. donde columna1 y columna2 son nombres de columnas y por aparecer en la cláusula GROUP BY se las denomina columnas de agrupamiento. ‘avg(salar+comis)’ o ‘max(nomem)’. Devuelve como resultado el número de filas que hay al grupo que aplica. Cláusula GROUP BY: Esta cláusula de la sentencia SELECT sirve para agrupar filas. 5. 5. En la cláusula SELECT sólo pueden aparecer columnas de agrupamiento y columnas que no sean de agrupamiento pero como argumento de funciones de columnas. Aparece a continuación de la cláusula WHERE si esta existe. Como por ejemplo ‘sum(DISTINCT comis)’. Por cada grupo se produce una fila en la tabla final resultante de la sentencia SELECT.2. Los valores nulos en las columnas de agrupamiento se incluyen en el mismo grupo. 2.

HAVING.Case 5. y ORDER BY los pasos que sigue el SGBD para obtener el resultado son: Ex: Para cada departamento que tenga más de dos empleados con hijos. 3. Sentencia SELECT por agrupamiento: Recopilación de las reglas de agrupamiento de filas: 1. GROUP BY. obtener el salario máximo y el salario mínimo de aquellos empleados que tienen hijos. WHERE. Se hace agrupamiento cuando se especifica la cláusula GROUP BY o se usan funciones de columna o ambas cosas. max(salar). Si se utiliza una sentencia SELECT formada por cláusulas SELECT.3. FROM. Para cada grupo seleccionado se evalúan las expresiones de la cláusula SELECT. dando como resultado una fila por cada grupo. Si no se especifica GROUP BY todas las filas forman un grupo. 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 . Si se especifica la cláusula GROUP BY se agrupan las filas que tengan iguales valores en las columnas de agrupamiento. 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’. Presentarlo ordenado por código de departamento. 2. min(salar) FROM emple WHERE numhi>0 GROUP BY codde HAVING count(*)>2 ORDER BY codde. Las columnas que no sean de agrupamiento solo pueden usarse como argumentos de funciones de columna tanto en la cláusula SELECT como en la condición de la cláusula HAVING. >SELECT codde. Una vez formados los grupos se seleccionan los grupos que cumplen las condiciones de la cláusula HAVING.

4. Ejecución de la cláusula SELECT. 42 . Ejecución de la cláusula ORDER BY. Ejecución de la cláusula GROUP BY. Ejecución de la cláusula HAVING. 3. 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 condición del HAVING tiene la columna de agrupamiento en su condición de selección. Ejecución de la cláusula FROM. que consiste en ordenar la tabla resultante del paso anterior por los criterios especificados en la cláusula ORDER BY. que consiste en seleccionar la tabla especificada en esta cláusula que de momento pasa a ser la tabla resultante de la sentencia. que consiste en evaluar las expresiones especificadas en esta cláusula para cada uno de los grupos seleccionados en el paso anterior. Si aparece la palabra DISTINCT se eliminaran de la tabla resultante las filas repetidas. Ejecución de la cláusula WHERE que consiste en eliminar de la tabla resultante las filas que no satisfagan la condición especificada en esta cláusula. que consiste en eliminar los grupos que no satisfagan la condición especificada en esta cláusula. que consiste en formar grupos con las filas de la tabla resultante del paso anterior que tengan iguales valores en las columnas de agrupamiento. 2. entonces esta condición de selección se puede expresar en la cláusula HAVING o en la cláusula WHERE. El resultado es una tabla en la que aparecen una fila por cada grupo y tantas columnas como expresiones aparezcan en la cláusula SELECT. 6.Case Los pasos del SGBD son: 1.ℑ 5.

CONSULTAS SOBRE VARIAS TABLAS. un punto. 6.nomem FROM emple e.codde. A este tipo de consultas se las llama consultas subordinadas correlacionadas. Si se especifica un alias a una tabla.codde.1. Consultas con JOIN o YUNCIÓN: 6. >SELECT nomde FROM depto WHERE presu*2>(select sum(salar) from emple where codde=depto. . 2. 3. con lo que se obtiene como resultado datos combinados de las distintas tablas que intervienen en la consulta. para eliminar la ambigüedad. pues se da la ambigüedad de que no se sabe a qué columna de qué tabla nos estamos refiriendo.2.codde= depto. Sin embargo. Poniendo los nombres de las distintas tablas en la cláusula FROM de la SELECT principal. lo que se hace es calificar las columnas especificando el nombre de la tabla a la que pertenecen. Para consultar datos de varias tablas en una sentencia SELECT se puede realizar de 3 formas: 1. todas las referencias calificadas a sus columnas deben usar el nombre alias.1. nomem FROM emple. depto d WHERE e. Calificación de columnas: Dentro de una tabla todos los nombres de columnas son diferentes.000).1. cuando se opera con una sola tabla basta con especificar el nombre de la columna y no hay ningún tipo de ambigüedad. Utilizando subconsultas en las que se hace referencia a datos de tablas mencionadas en una SELECT antecedente. En una sentencia SELECT.columna). En este caso no basta con especificar una columna únicamente por su nombre. Alias para tablas: En la cláusula FROM de una sentencia SELECT se pueden especificar alias para los nombres de las tablas. A este tipo de consultas se las denomina consultas subordinadas no correlacionales.codde=d. 6. mediante una operación llamada JOIN o YUNCIÓN. >SELECT nomem FROM emple WHERE codde in (select codde from depto where presu>100. En estos casos. >SELECT nomde.1. Utilizando subconsultas en las que no se hace referencia a datos de las tablas mencionadas en la SELECT principal. >SELECT d. que son nombres alternativos para referirse a la tabla dentro de la misma sentencia SELECT. nomde.codde. Conceptos previos: 6.1.codde).1. y el nombre de la columna (tabla.1. La forma de definir un alias es poniendo en la cláusula FROM a continuación del nombre de la tabla el nombre del alias.Case 6. depto WHERE emple. . si interviene más de una tabla en la misma sentencia puede ocurrir que haya columnas con el mismo nombre en distintas tablas.1. 43 .

Una tabla puede especificarse más de una vez en la cláusula FROM de una misma sentencia SELECT. centro c. Producto cartesiano: Si una sentencia SELECT utiliza varias tablas. En este caso es obligatorio utilizar nombres alias. en la tabla resultante el número de columnas es igual a la suma del número de columnas de las tablas especificadas. d. La tabla resultante es donde se aplican el resto de las cláusulas de la sentencia SELECT (WHERE.nomde D1 D1 D2 D2 D3 D3 D4 D4 d. 6. ORDER BY). GROUP BY. entonces los nombres de las tablas se han de especificar en la cláusula FROM separados por comas.FROM emple e1.1.codce 100 200 100 200 100 200 100 200 c.nomce C1 C2 C1 C2 C1 C2 C1 C2 44 . 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. 2. HAVING. para utilizar unos nombres de tablas más cortos y más mnemotécnicos.3. y el número de filas es el producto del número de filas de las tablas especificadas.Case Los nombres alias se utilizan por dos razones: 1. Por comodidad. SELECT.codce 100 100 100 100 200 200 200 200 c.1.codde 10 10 20 20 30 30 40 40 d. emple [e2] ------------. Cuando el sistema ejecuta la cláusula FROM genera una tabla que es el resultado del producto cartesiano de las tablas especificadas. es decir. >SELECT ------------------.

En SQL la operación join natural se realiza en la sentencia SELECT utilizando las cláusulas FROM y WHERE. >SELECT * FROM depto.nomce C1 C2 C1 C2 C1 C2 C1 C2 En la cláusula WHERE debe haber por lo menos n-1 condiciones de JOIN. 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 .codde=d. d. Ejecución de la sentencia con JOIN: >SELECT nomde.Case 6. count(*) FROM emple e.codde 10 10 20 20 30 30 40 40 d.3.codde=centro.codce 100 100 100 100 200 200 200 200 c.2.codce. centro WHERE depto.codde AND presu>50000 GROUP BY nomde HAVING max(salar)>1500 ORDER BY nomde desc. depto d WHERE e.1. 6.1. Operación JOIN: En la teoría de BD’s relacionales.codce 100 200 100 200 100 200 100 200 c. y concretamente en el álgebra relacional orientada a tuplas se define una operación llamada JOIN NATURAL.nomde D1 D1 D2 D2 D3 D3 D4 D4 d. donde n es el número de tablas especificadas en la cláusula FROM. que se utiliza para relacionar datos de distintas tablas.

Ejecución de la cláusula WHERE. e.salar 1600 900 1000 1700 e.nomde D1 D1 D2 D3 d.nomde D1 D2 D3 D4 D1 D2 D3 D4 D1 D2 D3 D4 D1 D2 D3 D4 D1 D2 D3 D4 d.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.presu 55000 70000 60000 45000 55000 70000 60000 45000 55000 70000 60000 45000 55000 70000 60000 45000 55000 70000 60000 45000 d.codde 10 20 30 40 10 20 30 40 10 20 30 40 10 20 30 40 10 20 30 40 d.codde 10 10 20 30 d.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.presu 55000 55000 70000 60000 d.codjefe 2 2 1 1 46 .codde 10 10 10 10 10 10 10 10 20 20 20 20 30 30 30 30 40 40 40 40 d.nomem 1 E1 2 E2 3 E3 4 E4 e. donde forma una tabla con el producto cartesiano de las tablas especificadas en la cláusula FROM.salar 1600 1600 1600 1600 900 900 900 900 1000 1000 1000 1000 1700 1700 1700 1700 1700 1700 1700 1700 e.codjefe 2 1 1 3 2 1 1 3 2 1 1 3 2 1 1 3 2 1 1 3 2. Ejecución de la cláusula FROM.codem e. eliminando las filas que no satisfagan la condición.tidir F F P F d.codde 10 10 20 30 d.tidir F P F F F P F F F P F F F P F F F P F F d.codem e. e. donde se aplican las condiciones especificadas en la cláusula WHERE a la tabla resultante del paso anterior.

tidir F F P F d. 3. e. 6. A estas sentencias SELECT se las denomina sentencia SELECT o consulta SUBORDINADA. Predicado básico de comparación: >SELECT nomem FROM emple WHERE salar>(select avg(salar) from emple).presu 55000 55000 60000 d.salar 1600 900 1000 1700 e. Ejecución de la cláusula HAVING.nomde D1 D1 D3 d.codem e.codde 10 10 20 30 d. como parte de uno de los siguientes predicados: 1. 47 . que consiste en obtener una fila de cada grupo de los que quedan del paso anterior.nomem 1 E1 2 E2 4 E4 e.presu 55000 55000 70000 60000 d. 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. Si varios empleados trabajan en el mismo departamento toda la información del departamento viene repetida por cada uno de los empleados que tiene asignado.codjefe 2 2 1 5.Consultas Subordinadas NO Correlacionales: Una sentencia SELECT puede tener en sus predicados otras sentencias SELECT con la función de subconsulta. Ejecución de la cláusula ORDER BY.Case Después de hacer el JOIN hay tantas filas como filas tenga la tabla que contiene la última clave ajena relacionada. Cada fila tendrá los valores resultantes de calcular las expresiones incluidas en la cláusula SELECT. nomde D3 D1 Count(*) 1 2 6. Ejecución de la cláusula SELECT.codde 10 10 20 30 d.nomde D1 D1 D2 D3 d.codde 10 10 30 d. e. Las consultas subordinadas se pueden especificar en las cláusulas WHERE y HAVING. En cada fila viene toda la información del empleado y toda la información del departamento al que está asignado.codem e.nomem 1 E1 2 E2 3 E3 4 E4 e. que consiste en presentar la tabla resultante del paso anterior ordenada por los criterios especificados en la cláusula ORDER BY.2. Ejecución de la cláusula GROUP BY. que consiste en eliminar de los grupos formados en el paso anterior los que no satisfagan la condición expresada en esta cláusula.tidir F F F d. Con todas las filas obtenidas se forma la tabla resultante de la sentencia SELECT.salar 1600 900 1700 e.codde 10 10 30 d.codjefe 2 2 1 1 4.

en las sentencias correlacionadas.0)>=all (select nvl(comis.. 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. 48 . .Consultas Subordinadas Correlacionadas: En las consultas subordinadas vistas hasta el momento sólo se hacía referencia a columnas de tablas que estén en su propia cláusula FROM. Predicados cuantificados: >SELECT nomem FROM emple WHERE nvl(comis. la que no es subordinada de ninguna otra. Por lo tanto el SGBD evalúa la sentencia subordinada múltiples veces. Una sentencia subordinada de otra puede a su vez tener otras subordinadas a ella: >SELECT --------. Una sentencia subordinada correlacionada no puede evaluarse independientemente de las sentencias antecedentes.where (select --------.where ------------))). es decir. Predicado EXISTS: >SELECT nomem FROM emple WHERE EXISTS (select * from emple where salar>1800).FROM ------------.En las tablas de su propia cláusula FROM. pues su resultado cambia según la fila de la sentencia antecedente que se evalúe en cada momento. 6. 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: . 4. 3. Predicado IN: >SELECT nomem FROM emple WHERE codem IN (select codjefe from depto where tidir=’P’).En la sentencia antecedente de siguiente nivel superior. y así hasta llegar hasta la sentencia externa. Se llama sentencia externa a la primera sentencia SELECT de todas.from ---------. en la consulta subordinada se especifica alguna columna de alguna tabla especificada en la cláusula FROM de alguna de sus sentencias antecedentes. Puede haber hasta 50 niveles de anidamiento de la sentencia SELECT. Esto implica que le resultado de la consulta subordinada puede evaluarse independientemente de sus sentencias antecedentes.3. Por lo tanto el SGBD evalúa la consulta subordinada una sola vez y reemplaza los valores resultantes de la consulta en el predicado en el que se encuentra..Case 2.En la sentencia antecedente inmediata.from ----------------.0) from emple). UPDATE o INSERT.WHERE (select -----. La sentencia externa puede ser en lugar de SELECT algunas de las sentencias DELETE. Sin embargo. .

Sentencia DELETE: La sentencia DELETE permite borrar filas de una tabla. al insertar la fila el sistema asigna nulo a esta columna. Si en la lista de columnas no se especifica alguna columna que permita valores nulos. Por tanto. 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).valor2. Este formato permite insertar una fila completa y solo una por cada sentencia.. donde tabla es el nombre de la tabla en la que se quiere borrar filas. etc. 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 definición de la tabla. asignándole el valor de la primera de ellas a la primera columnas de la lista.)] subconsulta.. si se omiten. Puede especificarse con dos formatos: Formato 1: >INSERT INTO tabla[(col1. La sentencia DELETE borra todas las filas que cumplan la condición expresada en la cláusula WHERE. Sentencia INSERT: La sentencia INSERT permite añadir una o más filas completas a una tabla. 49 . predicado es un predicado que puede contener subconsultas subordinadas... SENTENCIAS PARA MODIFICAR DATOS. la palabra NULL o bien variables de programa (si se está en modo programación) y debe haber tantos valores como en la lista anterior nombres de columnas. etc. la segunda a la segunda. este formato de INSERT permite insertar con una sola sentencia una o varias filas. el segundo valor a la segunda columna.col2. Formato 2: >INSERT INTO tabla [(col1.. Estas sentencias son INSERT.col2.) donde tabla es el nombre de la tabla en la que se desea insertar. Si se omite la cláusula WHERE borra todas las filas de la tabla. 7. Su formato es: >DELETE FROM tabla WHERE predicado. En este formato todas las filas que resulten de ejecutar la subconsulta se insertan en la tabla. donde el primer valor de la lista se asigna a la primera columna..)] VALUES (valor1. Valor1..1.Case 7. valor2....... DELETE y UPDATE. El número de columnas del resultado de la subconsulta debe ser igual al número de nombres de columnas especificado en las lista de columnas. 7..2. pueden ser constantes. col1.

8. Con esto se obtienen todos los departamentos relacionados o no y los centros relacionados. nomce FROM depto d. 8.codce(+)=centro.1. JOIN externo a izquierda: >SELECT nomde. El JOIN EXTERNO puede ser JOIN externo a izquierda o JOIN externo a derecha. centro WHERE depto. que la columna tiene una restricción de integridad referencial pero tiene el valor NULL. 50 .. centro WHERE depto. es decir.Case 7. NO SE PUEDEN INCLUIR JOIN’s EXTERNOS A IZQUIERDA Y DERECHA A LA VEZ!!!! Si se desea realizarlo ha de ser mediante el operador UNION.codce=c. JOIN externo a derecha: >SELECT nomde.codce(+)=c. >SELECT nomde. Con esto se obtendría los departamentos que están relacionados y los centros que están relacionados o no. aunque sí en las subconsultas.columna2=expresion2]. En el lugar de una expresión se puede especificar una subconsulta. centro c WHERE d. Se puede modificar algunas columnas o todas las columnas de la tabla.codce.. En las expresiones no se pueden utilizar funciones colectivas. nomce FROM depto.codce. a continuación de la columna en el predicado con el que se implementa el JOIN. las expresiones de la cláusula SET se evalúan y su valor se asigna a las columnas indicadas. OTRAS CARACTERÍSTICAS DE LA SENTENCIA SELECT. donde tabla es el nombre de la tabla que se quiere actualizar.codce(+) UNION SELECT nomde. Esta subconsulta debe devolver un valor único. centro c WHERE d.codce(+). Su formato es: >UPDATE tabla SET columna1=expresion1 [. nomce FROM depto d.codce=centro. Si se omite la cláusula WHERE se actualizan todas las filas de la tabla. [WHERE predicado]. El JOIN EXTERNO se especifica con un “(+)” en ORACLE. En las expresiones se puede hacer referencia a las columnas de la fila que actualmente se modifica.3. 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 están relacionadas con ninguna fila de la tabla con la que se relaciona. Sentencia UPDATE: La sentencia UPDATE permite modificar o actualizar varias filas de una tabla. nomce FROM depto. La sentencia UPDATE actualiza todas las filas de la tabla que cumplen la condición expresada en el predicado de la cláusula WHERE.

>SELECT nomde. >SELECT nomde FROM (select * from depto) WHERE tidir=’F’.codem)=some (select codde. utilizando los operadores de conjuntos UNIÓN. después se combinan estas tablas de acuerdo con el operador de conjuntos obteniéndose como resultado de la consulta compuesta una única tabla. 8. por tanto la SELECT principal hace la consulta sobre una vista. eliminando las filas duplicadas. MINUS: selecciona las filas que pertenezcan a la primera tabla. la intersección. codjefe from depto where tidir=’F’).codce=B. INTERSECCIÓN y DIFERENCIA: Se pueden formular consultas en las que aparezcan más de una sentencia SELECT. Operadores de conjuntos: UNIÓN. lo que se denomina consultas compuestas. >SELECT max(total) FROM (select nomde. INTERSECT: selecciona las filas que aparezcan en todas las tablas resultantes de las SELECT combinadas.3. Los operadores son: UNIÓN: selecciona las filas de las tablas resultantes de las consultas combinadas.codde group by codde). (select * from centro) B WHERE A. 51 . Subconsultas de la cláusula FROM: Se pueden especificar subconsultas en la cláusula FROM de una SELECT en lugar de un nombre de tabla. INTERSECCIÓN y DIFERENCIA. depto d where e.Case 8. pero no a la segunda. nomce FROM (select * from depto) A.4.codce. es decir. UNION ALL: selecciona las filas de las tablas resultantes de las SELECT combinadas sin eliminar las filas duplicadas. Cada sentencia SELECT daría como resultado una tabla. 8. La subconsulta especificada en la cláusula FROM está definiendo una vista.codde=d. Comparación simultánea de varias columnas en la cláusula WHERE: >SELECT nomem FROM emple WHERE (codde. Las expresiones que aparecen en las cláusulas SELECT han de ser iguales en número y tipo en todas las sentencias SELECT y en el mismo orden. sum(salar) total from emple e.2.

Case 52 .

Case Apéndices 53 .

Case 54 .

APENDICE TEMA 3.’dd-mm-yyyy’)). 6. ‘dd-mm-yyyy/hh:mi:ss’) from dual. 5. Obtener la fecha completa de todos los registros que se hayan insertado a partir de las 11 am. Calcular el número de días que he vivido. >SELECT sysdate . CASE 5.’mm’)=to_char(sysdate.1 Insertar una fila con el valor ‘10-01-2002/13:54:32’ >INSERT into prueba values(3. >SELECT * FROM prueba WHERE to_char(fecha)=to_char(sysdate.50) from dual.3.Seleccionar los registros que se han insertado en la fecha de hoy. >SELECT Lpad(to_char(sysdate. Seleccionar los registros insertados en el presente mes >SELECT * FROM prueba WHERE to_char(fecha. 5. 55 .’dd-mm-yyyy’) from dual. to_date(sysdate. ’dd-mm-yyyy’). TIPOS DE DATOS 5. 5. >INSERT into prueba values(4.2.’mm’).’dd-mm-yyyy/hh:mi:ss’)).6.to_date(‘10-01-2002/13:54:32’.5. to_char(fecha.to_date(‘02-08-1981’.’ ”En Alcorcón a “ dd “ de “ month “ de “ yyyy ’).1.4. 5. FUNCIONES 6. Visualizar la fecha del sistema con el formato: “Alcorcón a 4 de Octubre de 2002”.7. 5. Dar la fecha y la hora 10 minutos antes del momento actual. 5. >SELECT to_char(sysdate – 10/1440. Insertar una fila con la fecha del sistema.’dd-mm-yyyy/hh24:mi:ss’) FROM prueba WHERE to_char(fecha.’hh24’)>=11. >SELECT orden.

APENDICE TEMA 3. CASE 56 .

numcop[FK* **]codsocio [FK**]. >CREATE TABLE pelicula(codpel number constraint pk_pelicula primary key. numcopia) references copia(codpel. pagado char default ‘N’ constraint chk_alquiler_pagado check(pagado in(‘S’. CREACIÓN DE UNA TABLA 4. fecha_adquisicion[NN. dengen[UN y NN VARCHAR2]) . precio_alquiler char(4) constraint nn_pelicula_precio not null). codgen[NN. >CREATE TABLE copia(codpel number constraint fk_copia_pelicula references pelicula(codpel). 57 . >CREATE TABLE alquiler(codpel number. nomsocio varchar2(50) constraint nn_socio_nomsocio not null. PK]. DEFAULT sysdate].Socio (codsocio[PK NUMBER]. numcopia number(3). director varchar2(25).numcopia)). nomsocio [NN VARCHAR2]. fecha_adquision date.’N’)). constraint pk_copia primary key (codpel.1Crear una tabla videoclub con los siguientes campos: CASE .numcopia.APENDICE TEMA 4. fecha_alquiler date default sysdate.numcopia) on delete cascade.Copia (codpel[FK. direccion [NN].FK]. duracion number(3). fecha_alquiler[**PK. dengenero varchar2(20) constraint nn_genero_dengenero not null constraint un_genero_dengenero unique). codsocio number constraint fk_alquiler_socio references socio(codsocio). 4.codsocio. constraint fk_alquiler_copia foreign key (codpel.Genero(codgen[PK CHAR(3)]. numcopia[PK]. pagado[CHK(‘S’. titulo[NN].fecha_alquiler)). titulo varchar2(25) constraint nn_pelicula_titulo not null. direccion varchar2(50) constraint nn_socio_direccion not null. DEFAULT sysdate] . telefono char(11)). Duracion.Pelicula (codpel[PK NUMBER]. numcopia number(3). Precio_alquiler[NN]) . ‘N’) DEFAULT ‘N’) >CREATE TABLE genero(codgenero char(3) constraint pk_genero primary key. constraint pk_alquiler primary key (codpel.NN.Alquiler (codpel[FK*]. >CREATE TABLE socio(codsocio number(5) constraint pk_socio primary key. telefono) . Director. codgenero char(3) constraint nn_pelicula_codgenero not null constraint fk_pelicula_genero references genero(codgenero).

Otorgar update sobre la columna titulo de la tabla pelicula a Tercero y Cuarto.7. 7.2. Seleccionar todas las filas de pelicula. Insertar fila en pelicula. >INSERT into puesto13. 7. Otorgar los privilegios select e insert sobre pelicula a Tercero with grant option.. 7. Conectarse como tercero. >GRANT delete on pelicula to Tercero. Añadir a la tabla pelicula la columna catalogacion.. >SELECT * from puesto13. Insertar fila en pelicula. 7.’sus’.). 7. >CONNECT Cuarto/matrix. [Insuficientes Privilegios] 58 .’Misión Imposible 2’. de tipo de dato char y longitud 1. 7.3. CONFIDENCIALIDAD DE LOS DATOS. >INSERT into puesto13. CASE 5. Otorgar DELETE sobre pelicula a Tercero. >GRANT select.APENDICE TEMA 4.pelicula values(4.’sus’. >ALTER TABLE pelicula add catalogacion char. insert on pelicula to Tercero WITH GRANT OPTION. 7. ALTERACIÓN DE UNA TABLA.2. >GRANT update(titulo) on pelicula to Tercero.pelicula values(5. >CONNECT Tercero/matrix.4.1.8. 7. Cuarto. 7. 5.9.1.50.pelicula.6. 7. Conectarse como Puesto13.’Top Gun’.125.’John Woo’.5. >CONNECT puesto13/matrix.’M’). Conectarse con Cuarto.

7. 7.pelicula to Cuarto. >CONNECT Tercero/matrix. >INSERT into puesto13.17. >GRANT delete on pelicula to Cuarto. >CONNECT Cuarto/matrix. >DELETE from puesto13. [Privilegios Insuficientes] 7. Otorgar insert sobre pelicula a Cuarto.10.APENDICE TEMA 4. >GRANT insert on puesto13. >CONNECT Tercero/matrix.pelicula to Cuarto.15. 59 . 7.’Top Gun’.18. 7.19. Conectarse como puesto13.14. 7. Borrar la pelicula con codpel3.. >CONNECT Cuarto/matrix. 7.). Borrar la pelicula con codpel=3. Conectarse como tercero. [Privilegios Insuficientes] 7. >GRANT delete on puesto13. 7. >DELETE from puesto13.pelicula WHERE codpel=3. 7.16.20. Insertar fila en pelicula.’sus’. Otorgar DELETE sobre pelicula a Cuarto. Conectarse como Tercero. Conectarse como Cuarto.pelicula WHERE codpel=3.. CASE 7.pelicula values(5. >CONNECT Puesto13/matrix. Conectarse como Cuarto.12. Otorgar DELETE sobre pelicula a Cuarto.11.13.

numcopia ASC). 7. Conectarse como Puesto13. >REVOKE insert on pelicula from Tercero CASCADE CONSTRAINT.). Retirar el privilegio INSERT sobre pelicula a Tercero con cascade constraint.pelicula SET titulo=’Guay del Paraguay’ WHERE codpel=1. >CONNECT Cuarto/matrix. >GRANT select ON genero TO palvideoclub.pelicula values(6. 7. >CONNECT Cuarto/matrix. >CREATE INDEX idx_pelicula_titulo ON pelicula (titulo ASC). SELECT * from puesto13. >SELECT index_name. Posteriormente conceder este rol a Tercero. ‘Grease’. >SELECT * from puesto13. Conectarse como Cuarto. CASE 7. table_name FROM user_indexes. >GRANT palvideoclub TO Cuarto. 60 . index_type.. >CREATE INDEX idx_alquiler_copia ON alquiler(codpel. Insertar una fila en pelicula.APENDICE TEMA 4. 8. >CONNECT Tercero/matrix. >CREATE ROLE palvideoclub. >UPDATE puesto13. Crear un rol llamado palvideoclub que conceda el permiso de consulta sobre la tabla género.. >CONNECT Puesto13/matrix. [ERROR] 9. y consultar la tabla genero con Tercero y con Cuarto.21. CREACIÓN DE ROLES. CREACION DE ÍNDICES.genero. >INSERT into puesto13. [Privilegios Insuficientes] 8. 7.1.25.. 7.23.24. table_owner.22.genero. Modificar el Título de la pelicula con codpel=1.

>CREATE PUBLIC SYNONYM pelicula for pelicula. Código_Género. 61 . >SELECT * from pelis. Título. Crear una vista ‘cartelera’ que tenga las columnas de la tabla pelicula que no permiten nulos. titulo. titulo. > CREATE VIEW peliculas_suspense AS select * FROM pelicula WHERE codgen=’sus’ WITH CHECK OPTION. Precio_Alquiler) AS select codpel.APENDICE TEMA 4. 10. Precio_Alquiler) AS select codpel. >SELECT * from pelicula. Crear de nuevo la vista ‘peliculas_suspense’ con la cláusula check option. titulo. Crear una vista ‘cartelera2’ con las mismas columnas de la vista anterior pero asignándole los nombres de las columnas completos. Título. >DROP VIEW peliculas_suspense. Código_Género.4. precio_alquiler from pelicula. >CREATE VIEW peliculas_suspense AS select * FROM pelicula WHERE codgen=’sus’. codgen.1. 11. >CREATE VIEW cartelera2 (codigo_pelicula. codgen. >SELECT * from puesto13. 11. >CREATE VIEW cartelera2 (Codigo_Pelicula. >CREATE SYNONYM pelis for pelicula.pelicula. >CREATE VIEW cartelera AS select codpel.5.3. 11. >SELECT * from pelicula. CREACIÓN DE SINÓNIMOS. Crear de nuevo la vista ‘cartelera2’ con la cláusula with read only >DROP VIEW cartelera2. precio_alquiler from pelicula WITH READ ONLY. CREACIÓN DE VISTAS. precio_alquiler FROM pelicula. codgen.2. Crear una vista llamada ‘peliculas_suspense’ que contenga las películas de suspense. >CONNECT Tercero/matrix. CASE 11. 11. 11.

1 en CENTRO. 62 . 5. Cada departamento tiene un empleado jefe de departamento y varios empleados que trabajan en el departamento. Cada departamento está ubicado en un centro. 2. 5. actualizar y consultar las tablas de personal. CENTRO 1 UBICA N N 1 DEPENDE DEPARTAMENTO 1 N D/E N DP/E 1 EMPLEADO N E/C 1 CATEGORÍA 1. 7. sinónimos. 6. Cada empleado tiene una categoría laboral. y 4 en EMPLE. Crear el rol DBGESTOR con los privilegios del sistema para crear roles y 2. Es posible que un empleado esté asignado a un departamento pero que sea jefe de otros departamentos distintos al que está asignado. 4. Crear el usuario DAI2/DAI2 Conceder a DAI2 los roles de CONNECT. Esta empresa tiene la siguiente organización: 1. 6. Un empleado está asignado a un departamento. 8. borrar.APENDICE TEMA 4. 3. Un departamento puede depender orgánicamente de otro departamento. Crear las tablas de la BD de personal. SISTEMA DE INFORMACIÓN CASE Se desea informatizar mediante una BD relacional la información referente al personal de una empresa de servicios ubicada en Madrid. 4. RESOURCES y DBGESTOR. La empresa tiene en la actualidad 3 centros o edificios donde se ubican sus oficinas. 3. 2 en DEPTO (asignando jefe de departamento). Crear el rol QUERYPERSONAL que de permisos para insertar. Insertar 2 filas en CATEGO. Crear sinónimos públicos para las 4 tablas de personal con los mismos nombres de las tablas originales. Crear el usuario PROGRAMADOR otorgándole los roles CONNECT y QUERYPERSONAL. La empresa está estructurada en departamentos.

extel char(4). >GRANT create role. dbgestor to DAI2. codcat number(2) constraint nn_emple_codcat not null). comis number(7. >CREATE TABLE emple(codem number(3) constraint nn_emple_codem not null constraint pk_emple primary key. codjefe number(3) constraint fk_depto_emple references emple(codem). >ALTER TABLE emple ADD constraint fk_emple_depto FOREIGN KEY (codde) references depto(codde) ON DELETE CASCADE. CREATE TABLE depto(codde number(3) constraint pk_depto primary key. >CREATE role DBGESTOR. codce number(2) constraint nn_depto_codce not null constraint fk_depto_centro references centro(codce). >ALTER TABLE emple ADD constraint fk_emple_catego FOREIGN KEY (codcat) references catego(codcat) ON DELETE CASCADE.APENDICE TEMA 4. nomem varchar2(25) constraint nn_emple_nomem not null constraint un_emple_nomem unique. fecnac date constraint nn_emple_fecnac not null. 4. numhi number(2) constraint nn_emple_numhi not null. CASE 1. nomce varchar2(20) constraint nn_centro_nomce not null constraint un_centro_nomce unique.2). resource. 3. 2. nomde varchar2(20) constraint nn_depto_nomde not null constraint un_depto_nomde unique.2) constraint nn_emple_salar not null. 63 . create synonym TO DBGESTOR. >GRANT connect.2). salar number(7. >CREATE user DAI2 IDENTIFIED BY DAI2 default tablespace user. tidir char(1) constraint chk_depto_tidir check(tidir in(‘P’. nomcat varchar2(20) constraint nn_catego:nomcat not null constraint un_catego_nomcat unique). CREATE TABLE catego(codcat number(2) constraint pk_catego primary key. dirce vasrchar2(40)).’F’)) constraint nn_depto_tidir not null. depde number(3) constraint fk_depto_depto references depto(codde)). presu number(9. fecing date constraint nn_emple_fecing not null. >CONNECT DAI2/DAI2. CREATE TABLE centro(codce number(2) constraint pk_centro primary key. codde number(3) constraint nn_emple_codde not null.

select ON catego TO querypersonal. select On depto TO querypersonal. >GRANT create public synonym TO dbgestor. update. ‘DIRECTOR GENERAL’).1. delete. >CREATE PUBLIC SYNONYM centro FOR centro.’’. >CONNECT dai2/dai2.’’). ‘ATNCION AL CLIENTE’. >CREATE PUBLIC SYNONYM emple FOR emple. >INSERT INTO depto VALUES (2. >CONNECT DeMoN/matrix >CREATE USER programador IDENTIFIED BY matrix default tablespace user. >ALTER TABLE emple ENABLE constraint fk_emple_depto. ‘LA ARBOLEDA’. >GRANT insert. >ALTER TABLE emple DISABLE constraint fk_emple_depto. delete. >INSERT INTO catego VALUES (2. >INSERT INTO depto VALUES (1. >CREATE PUBLIC SYNONYM catego FOR catego. querypersonal TO programador. >CREATE ROLE querypersonal. select ON centro TO querypersonal. >ALTER TABLE depto DISABLE constraint fk_depto_emple. update. >GRANT insert. select ON emple TO querypersonal. 8.’F’. DAVID’. >GRANT insert. delete. >GRANT connect. ‘INFORMATICA’. ‘OPERADOR’).) x4.APENDICE TEMA 4.’P’.1. >INSERT INTO emple VALUES(1. 7. >ALTER TABLE depto ENABLE constraint fk_depto_emple.’’. OESTE S/N’).’’). 6. >INSERT INTO catego VALUES (1. delete. 64 . update. update. >INSERT INTO centro VALUES (1.’RODRIGUEZ RINCON.. ‘AVDA. catego.’’. status FROM user_constraints. depto. >CREATE PUBLIC SYNONYM depto FOR depto.. >SELECT * FROM emple. SELECT constraint_name.1. >GRANT insert. centro. CASE 5. >CONNECT DeMoN/matrix.

clasificándolos por departamento en orden descendente. CONSULTAS SENCILLAS.200€. >SELECT nomem FROM emple WHERE codde=121 ORDER BY 1. >SELECT * FROM depto WHERE codde=121. Obtener un listín telefónico de los empleados del departamento 121 en el que se incluya nombre de empleado. 1. Obtener por orden alfabético los nombres de los departamentos cuyo presupuesto sea superior a 120. codem. código de empleado y extensión telefónica. comis FROM emple WHERE salar<1200 ORDER BY 1 DESC. >SELECT codde. extel FROM emple WHERE codde=121.8. Obtener los nombres y salarios de los empleados con más de 3 hijos. CASE Obtener todos los nombres de los centros de trabajo de la empresa ordenados alfabéticamente. 1.1.000€.4. 65 . Obtener los nombres de los empleados que trabajan en el departamento 121 ordenados por orden alfabético.5. Obtener el código del departamento en que trabajan.7. >SELECT nomde FROM depto WHERE presu>120000 ORDER BY 1. ordenado alfabéticamente. 3 ASC. 1.APENDICE TEMA 5. 1. 1. Obtener por orden alfabético los nombres de los departamentos que tienen jefe en propiedad.2. >SELECT DISTINCT nomde FROM depto WHERE tidir=’P’ ORDER BY 1. el nombre del empleado y su comisión de aquellos empleados cuyo salario es inferior a 1. >SELECT nomem. por comisión en orden ascendente dentro de cada departamento. nomem.6. 1. >SELECT nomce FROM centro ORDER BY nomce.3. 1. >SELECT nomem. Obtener toda la información del departamento 121. 1. 1. salar FROM emple WHERE numhi>=3 ORDER BY 1.

>SELECT nomem.1. >SELECT extel. 2. Obtener los nombres y salarios anuales de los empleados. 2. >SELECT nomem FROM emple WHERE comis>salar*0.05 ORDER BY 1. salario y comisión de aquellos empleados con más de 3 hijos clasificados por comisión. 2. salar+comis+((numhi-3)*50) FROM emple WHERE numhi>=4 ORDER BY (numhi-3)*50.APENDICE TEMA 5.3.1. EXPRESIONES. 2.9. En una campaña de ayuda familiar se ha decidido dar a los empleados una paga extra de 50€ por hijo a partir del 4º hijo inclusive. 2. expresados en ptas. >SELECT nomem FROM emple WHERE numhi*30>salar*0.20.10. >SELECT nomem. salar. 66 . A los empleados se les concede una gratificación de 30€/hijo.2.386 *12 FROM emple WHERE codde=100 ORDER BY salar DESC. y dentro de ésta por orden alfabético. presentados ordenados en orden decreciente de salario anual. CASE Obtener una relación de todas las extensiones telefónicas con el nombre del empleado que la tiene asignada. Obtener los nombres de los empleados cuya gratificación supere el 5% de su salario.1. ordenado alfabéticamente. Obtener el nombre. de los empleados del departamento 100. 1. nomem FROM emple ORDER BY 1 DESC. salar*166. comis FROM emple WHERE numhi>3 ORDER BY 3. >SELECT nomem. Obtener los nombres de los empleados cuya comisión es superior o igual al 20% de su salario.2. 1.4. ordenándola en orden decreciente de extensión telefónica y dentro de cada extensión en orden alfabético. Obtener por orden de paga extra y dentro de ésta ordenado alfabéticamente el nombre del empleado y el sueldo que incluya la paga extra.

el gobierno se empeña en decir que será de un 3%. su suelda anual actual y su sueldo anual con la subida. Obtener los códigos de departamento en los que haya algún empleado cuya comisión supere el 15% de su salario. >SELECT DISTINCT codde FROM emple WHERE comis>salar*0. Ordenar por código de departamento y dentro de éstos alfabéticamente. 2.00’) FROM emple ORDER BY 1.999. 2.6. >SELECT codem.800€. Los empresarios. deciden aumentar el salario de los empleados en un 3%.10)/12)*3+presu FROM depto WHERE presu/12=10000 ORDER BY 1.’99. Obtener la relación de empleados que comparten la extensión 880 o 3131.APENDICE TEMA 5. to_char((salar+comis)*12.00’). su sueldo en pesetas de aquellos empleados que tienen un sueldo superior a 1. nomem.5. to_char((salar*1. 2. nomem.386 FROM emple WHERE salar+comis>1800 ORDER BY codem. CASE Llamamos presupuesto medio anual de un departamento al resultado de dividir su presupuesto anual entre 12. >SELECT codde. ((presu*0. 67 . más interesados en la previsión del gobierno del 3%.8. Se decide aumentar los presupuestos medios mensuales de todos los departamentos en un 10% a partir del mes de octubre inclusive. A pesar de que en el próximo año todos los indicadores económicos preveen una inflacción del 2%.999.03+comis)*12. Obtener el código de empleado. 2.9. 2. Ordenar por departamento y alfabéticamente. nomem FROM emple WHERE extel=3131 or 880 ORDER BY codde. Presentar las magnitudes separadas por puntos decimales y comas de millar. su nombre. su presupuesto anual después del incremento de aquellos departamentos cuyo presupuesto mensual medio anterior a octubre es de 10. nomem. >SELECT nomem.15. Obtener por orden alfabético el nombre de departamento. >SELECT nomde. Obtener por orden alfabético el nombre del empleado.7.’99.000€. (salar+comis)*166.

Obtener los empleados que no tengan extensión telefónica. 3. >SELECT nomem FROM emple WHERE salar<=1.2. >SELECT nomde FROM depto WHERE depde IS NULL. 3.7. Obtener los nombres de los empleados que trabajen en un departamento con presupuesto inferior a 100.3. >SELECT nomem FROM emple WHERE codde=SOME(select codde from depto where presu<100000).4.000€. 68 . >SELECT nomem. obtener su nombre y sueldo total.8. 3. RUBEN’) ORDER BY nomem. Obtener los nombres de departamento que no dependen orgánicamente de otros. PREDICADOS. Obtener el sueldo total de los empleados que no tienen extensión telefónica.APENDICE TEMA 5.0)<150. salar+comis FROM emple WHEER comis IS NOT NULL. >SELECT nomem FROM emple WHERE extel IS NULL. salar+nvl(comis. 3. 3. Obtener los nombres de los empleados que cobran menos de 150€ de comisión.6. RUBEN’).5.0) FROM emple WHERE extel IS NULL. RUBEN’. comis FROM emple WHERE nvl(comis. 3. >SELECT nomem FROM emple WHERE codde=(select codde from emple where nomem=’NIETO ORTEGA. RUBÉN. De los empleados que cobran comis. Obtener por orden alfabético los nombres de los empleados cuyo salario sea igual o superior en más del 15% al salario del empleado ‘NIETO ORTEGA. 3.15*(select salar from emple where nomem=’NIETO ORTEGA. >SELECT nomem. 3. CASE Obtener por orden alfabético los empleados que trabajan en el mismo departamento que NIETO ORTEGA.1. >SELECT nomem. 3.

Obtener el nombre del empleado que más cobra del departamento 100. >SELECT nomem FROM emple WHERE codde=SOME (select codde from depto where codce= (select codce from centro where nomce=’SEDE CENTRAL’)). 69 . Obtener el nombre de los empleados que comparten extensión telefónica con el empleado “EGIDO COLL. 3. salar+nvl(comis.14. Obtener el nombre y el sueldo total de los empleados que tienen un jefe en funciones. Obtener los nombres de los empleados que trabajan en el departamento del cual es jefe el empleado con código 180.10. 3. CASE Obtener por orden alfabético los nombres de los empleados cuyo salario supera al máximo salario de los empleados del departamento 122. 3. Obtener los nombres de los empleados que van a trabajar a la ‘SEDE CENTRAL’. 3. OSCAR’). >SELECT nomem FROM emple WHERE salar>ALL (select salar from emple where codde=122) ORDER BY 1.11.15. 3. 3.12. >SELECT nomem FROM emple WHERE codde=SOME (select codde from depto where codjefe=180). >SELECT nomde FROM depto WHERE presu > (select presu*1. >SELECT nomem.APENDICE TEMA 5. OSCAR”. Obtener los nombres de departamento cuyo presupuesto supere en un 25% el presupuesto del departamento ‘ORGANIZACIÓN’. 3. >SELECT nomem FROM emple WHERE extel= (select extel from emple where nomem=’EGIDO COLL.Ø) FROM emple WHERE codde=SOME (select codde from depto where tidir=’F’).9.25 from depto where nomde=’ORGANIZACIÓN’).13. >SELECT nomem FROM emple WHERE codd=100 AND salar>=ALL(select salar from emple where codde=100).

q.20. >SELECT nomem. >SELECT nomde FROM depto WHERE codjefe= (select codem from emple where nomem=’COZAR MENCHERO. 3.JOSE%’ 70 .23.Ø) BETWEEN 1200 and 1400.%JOSE’ OR nomem LIKE ‘%. Obtener los empleados cuyo primer apellido es ‘MARTIN’. IVAN’). Obtener los nombres de los empleados que trabajan en el departamento del que es jefe el empleado ‘MONROY DE CELIS. 3. 3. >SELECT nomem FROM emple WHERE nomem LIKE ‘%. Obtener el nombre de departamento del que es jefe el empleado ‘COZAR MENCHERO.19. >SELECT nomem FROM emple WHERE nomem LIKE ‘MARTIN%’.Ø) FROM emple WHERE codem= SOME (select codjefe from depto).200€ y 1.16.r ó s. >SELECT nomem FROM emple WHERE salar+nvl(comis. 3. 3.18. >SELECT nomem FROm emple WHERE nomem BETWEEN ‘P’ and ‘T’. Obtener el nombre de los empleados cuyo primer apellido empiece por las letras p. salar+nvl(comis.21. >SELECT nomem FROM emple WHERE codem= (select codjefe from depto where nomde=’INFORMATICA’). Obtener los nombres de los empleados cuyo salario este entre 1. CASE 3.APENDICE TEMA 5. >SELECT nomem FROM emple WHERE codde=SOME (select codde from depto where codjefe= (select codem from emple where nomem=’MONROY DE CELIS. JAIME’.22. 3. Obtener el nombre del jefe de departamento de informática. IVÁN’.17. 3. JAIME’)). Obtener por orden alfabético los nombres y sueldos de los jefes de departamento de la empresa. Obtener los empleados cuyo nombre de pila contenga el nombre ‘JOSÉ’.400€.

Obtener los empleados que tengan un nombre de pila de más de 7 letras.29. >SELECT nomem FROM emple WHERE extel IN(‘880’.%’). 3.’650’. y si no no visualizar nada. visualizar los nombres de todos los empleados del departamento 100.28. JOSE’. Si en el departamento 100 hay algún empleado que se llama de primer apellido MARTIN. 3. 3. 3. >SELECT nomem FROM emple WHERE codde=100 AND EXISTS (select * from emple where nomem like’MARTIN %. CASE 3. Obtener los nombres de departamento en los que haya empleados que no cobren comisión. Obtener en orden alfabético los nombres de los empleados cuya extensión telefónica sea 880/650/780. >SELECT nomem.APENDICE TEMA 5. >SELECT nomem FROM emple WHERE EXISTS (select * from emple where nomem like ‘%MARTIN.’780’) ORDER BY 1.24._ _ _ _ _ _ _%’. >SELECT nomde FROM depto WHERE codde IN (select codde from emple where comis is null). 3. salar FROM emple WHERE (numhi=Ø AND salar>1500) OR (numhi<>Ø AND salar<1500) ORDER BY 1. LEONARDO’. JOSÉ’ y ‘RINCÓN FERNANDEZ.30. LEONARDO’)).25.26. 3. 71 . >SELECT nomem FROM emple WHERE codde IN (select codde from emple where nomem in(‘PUMAR REY.500€ o tienen hijos y ganan menos de 1.27. entonces visualizar el nombre de todos los empleados de la empresa. ‘RINCON FERNANDEZ. Obtener los nombres de los empleados que son compañeros de trabajo de ‘PUMAR REY. >SELECT nomem FROM emple WHERE nomem LIKE ‘%.500€. Si algún empleado se apellida de segundo apellido ‘MARTIN’. Obtener en orden alfabético los nombres y salarios de los empleados que no tienen hijos y ganan más de 1.%’ AND codde=100).

nomem.33. salar FROM emple WHERE (codde=110 OR codde=112) AND salar>1400 ORDER BY 1. Obtener el código de departamento. Obtener el nombre y fecha de nacimiento de los empleados que ingresaron en la empresa hace más de 8 años.32.386 FROM emple WHERE comis>salar*0. 3. fecnac FROM emple WHERE (SYSDATE. >SELECT codde. Obtener los nombres de los empleados que trabajan en la calle Alcalá. >SELECT codde.10 AND codde>SOME (select codde from depto where presu>100000 and codce <>all(select codce from centro where dirce like ‘C/ALCALA. salar+nvl(comis.APENDICE TEMA 5. nomem. CASE 3.34. Obtener los nombres de departamento que no sean de dirección ni de sección.31. el nombre del empleado y el sueldo total de los empleados que no tienen hijos y no cobran comisión. 3. 3. el nombre del empleado y el sueldo de los empleados que trabajan en los departamento 110 y 112. >SELECT nomem. 3. Obtener el nombre del empleado y el sueldo total en pesetas de aquellos empleados cuya comisión supere el 10% de su salario y trabajen en un departamento que tenga un presupuesto superior a 100. Obtener el código de departamento. >SELECT codde.36. 72 .2.000€ y que no esté ubicado en la calle Alcalá. Obtener el código de departamento. nomde. 3.37.fecing)/365>8. salar D¡FROM emple WHERE numhi=Ø AND comis IS NULL ORDER BY 1. >SELECT nomde FROM depto WHERE nomde<>ALL (select nomde from depto where nomde like ‘DIRECCION%’ or nomde like ‘SECCION%’). (salar+nvl(comis. 3.400€.%’)).%’)). >SELECT nomem FROM emple WHERE codde=SOME (select codde from depto where codce=some (select codce from centro where dirce like ‘C/ALCALA.Ø) FROM emple WHERE codde=110 OR codde=112 ORDER BY 1. >SELECT nomem. nombre de empleado y salario de los empleados que trabajan en el departamento 110y 112 y cobran más de 1.Ø))*166.35. Presentarlo ordenado por departamento y dentro de él alfabéticamente.

3. 73 .Ø)>1200)). salar+nvl(comis. Presentarlos ordenados por código de departamento y sueldo total.42. CASE 3. Obtener los nombres de centro en los que haya jefes de departamento en funciones con un sueldo total superior a 1.41.40.200€. >SELECT nomem FROM emple WHERE salar> (select salar*Ø.APENDICE TEMA 5. 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.75 from emple where codem= (select codjefe from depto where nomde=’INGENIERIA’)) AND codde=SOME (select codde from depto where tidir=’F’). 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. el nombre de empleado y el código del departamento en que trabaja de aquellos empleados que tienen la categoría profesional ‘ASESOR TÉCNICO’ y su salario supera los salarios de los empleados con categoría profesional ‘CONSULTOR’ del departamento informático. Obtener los nombres de departamento donde no haya empleados de la categoría ‘RELACIONES PUBLICAS’. >SELECT nomem. 3. >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. 3.39.Ø). Obtener los nombres de los empleados que tienen la misma extensión telefónica que el empleado 120 y trabajan en un departamento cuyo presupuesto es inferior al presupuesto del departamento 110.38. 3. Obtener el sueldo total . >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)).2. >SELECT nomde FROM depto WHERE codde<>ALL (select codde from emple where codcat= (select codcat from catego where nomcat=’RELACIONES PUBLICAS’)).

>SELECT MAX(salar). 74 . SUBSTR(nomde. AVG(salar) FROM emple.1. 4. >SELECT nomem. Obtener el nombre y sueldo total de los empleados cuyo sueldo total supera al salario mínimo de la empresa en 250€.LENGTH(nomem)-3) FROM emple WHERE nomem LIKE ‘%. 4._ _ _ _ _ _%’.4.INSTR(nomem.6. mínimo. Obtener los códigos de departamento y las 5 últimos caracteres de su nombre de aquellos departamentos que tengan en nombre con más de 12 caracteres. SUBSTR(nomde.’.’. media aritmética y suma de los salarios de los empleados de la empresa. Obtener los códigos de departamento y los 5 caracteres siguientes que están a continuación del carácter 12 de sus nombres. CASE 3.’)+2. >SELECT codde.Ø)>SOME (select salar+250 from emple).3.APENDICE TEMA 5.12.5. INSTR(nomem.5) FROM depto. >SELECT SUBSTR(nomem.10) FROM depto.2.-5) FROM depto WHERE LENGTH(nomde)>12. 4. >SELECT codde. MIN(salar).’)+2))>6 ORDER BY nomem. >SELECT SUBSTR(nomem. 4. >SELECT nomem FROM emple WHERE LENGTH(nomem)>20.43. 4. INSTR(nomem. LENGTH(SUBSTR(nomem.Ø) FROM emple WHERE salar+nvl(comis. 4.’)+2))-3) FROM emple WHERE LENGTH(SUBSTR(nomem. >SELECT SUBSTR(nomde. 4. SUM(salar). FUNCIONES DEL LENGUAJE SQL. Obtener por orden alfabético los nombres de los empleados suprimiendo las 3 últimas cifras del nombre de pila para aquellos empleados cuyo nombre de pila tenga más de 6 letras. Obtener en orden alfabético los nombres de los empleados que tengan más de 20 caracteres en su nombre completo.’.1. Obtener el valor máximo. salar+nvl(comis. Obtener los nombres abreviados de los departamentos tomando las 10 primeras letras.1.

COUNT (DISTINCT extel) FROM emple WHERE codde=112. 4.12.13. 4.9.10.’yyyy’)<’1970’. 4. >SELECT nomem. AVG(salar) FROM emple WHERE codde=120 AND comis IS NULL. Obtener cuantos empleados hay en la empresa. >SELECT MAX(salar).8. nomem.11. CASE Obtener los mismos datos del ejercicio anterior de los empleados que trabajan en el departamento 120 y no cobran comisión. salar+nvl(comis. Obtener cuantos empleados y cuantas extensiones telefónicas hay en el departamento 112.Ø)> (select min(salar)+400 from emple where codde= (select codde from depto where nomde=’INFORMATICA’)). su nombre y su sueldo total de los empleados cuyo sueldo total supera al salario mínimo de informática en más de 400€.60 from emple) ORDER BY 1. Obtener el código de empleado.Ø) FROM emple WHERE salar+nvl(comis.7. salar FROM emple WHERE salar> (select max(salar)*0.20 from emple where salar/numhi>300 and numhi>Ø). 4. 4. Obtener el salario medio de los empleados cuyo salario supera en más del 20% al salario mínimo de los empleados que tienen hijos y su salario medio por hijo es mayor de 300€. Obtener el preupuesto medio de los departamentos cuyo presupuesto supera al presupuesto medio de todos los departamentos de la empresa. 4. >SELECT COUNT(*) FROM emple. 4. >SELECT AVG(salar) FROM emple WHERE salar> (select min(salar)*1. >SELECT AVG(presu) FROM depto WHERE presu>(select avg(presu) from depto). 4. >SELECT COUNT(nomem) FROM emple WHERE to_char(fecnac. >SELECT COUNT(*). >SELECT codem.14. Obtener cuantos empleados han nacido antes del año 1970. 75 . MIN(salar). Obtener en orden alfabético los salarios y nombres de los empleados cuyo salario sea mayor aquel 60% del máximo salario de la empresa.APENDICE TEMA 5.

COUNT(*) FROM emple GROUP BY codde HAVING count(*)>3.APENDICE TEMA 5. numhi.1. >SELECT codde. >SELECT codde.3. MIN(salar) FROM emple GROUP BY codde ORDER BY codde. CONSULTAS CON AGRUPAMIENTO DE FILAS. COUNT(*) FROM emple GROUP BY codde. Agrupando por código de departamento y número de hijos obtener cuántos empleados hay en cada grupo. CASE 4. >SELECT extel. 5. Obtener el código de departamento y la suma de los salarios de sus empleados para aquellos departamentos en los que trabajan m´s de 3 empleados. Obtener para cada departamento la suma de los salarios de sus empleados. el máximo y el mínimo salario. 5.15. Presentar las extensiones telefónicas de la empresa indicando cuantos empleados la utilizan. MIN(fecnac) FROM emple WHERE comis IS NOT NULL GROUP BY codde. >SELECT nomde. 76 . MAX(salar). >SELECT codde. 5.2. 5. >SELECT codde. 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%’)).4. numhi. 5. 5. Obtener el nombre y presupuesto de los departamentos ubicados en la C/Alcalá cuyo presupuesto supere al mínimo presupuesto de los departamentos no ubicados en la C/Alcalá.5. SUM(salar). Obtener de cada departamento la fecha de nacimiento del empleado con mayor edad que tenga comisión. COUNT(*) FROM emple GROUP BY extel. SUM(salar).

9. MIN(salar). AVG(salar) FROM emple GROUP BY extel. >SELECT AVG(salar) FROM emple GROUP BY codde HAVING MAX(salar)<(select avg(salar) from emple). 77 .6. Obtener para cada departamento cuantos empleados trabajna en el. CASE Obtener el salario máximo y mínimo de los empleados que cobran comisión para cada grupo de empleados con igual número de hijos. numhi. 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.11.400€. 5. Para cada departamento obtener la media de las comisiones con respecto a los empleados que reciben comisión y la media aritmética de comisiones con respecto al total de empleados.Ø)) FROM emple GROUP BY CODDE.Ø)) FROM emple GROUP BY codde HAVING codde=SOME(select codde from emple where salar>1700).APENDICE TEMA 5. >SELECT MAX(salar). 5.10. 5. 5. 5. SUM(nvl(comis. COUNT(*). COUNT(*). tanto de los que tienen hijos como los que no. MIN(salar) FROM emple GROUP BY codde HAVING codde=SOME(select codde from emple where numhi)Ø group by codde having count(*)>2).7. 5. Para cada departamento que tenga más 2 empleados con hijos obtener el salario máximo y el salario mínimo de los empleados que trabajan en el departamento. Para cada extensión telefónica obtener cuantos empleados la utilizan y su salario medio. de aquellos grupos en los que hay más de 4 empleados y el salario máximo del grupo supera los 1. >SELECT extel. COUNT(*) FROM emple WHERE comis IS NOT NULL GROUP BY numhi HAVING COUNT(*)>4 AND MAX(salar)>1400. SUM(salar). Obtener la media aritmética de los salarios de los empleados de cada departamento para aquellos departamentos cuyo salario máximo es menor a la media de salarios de la empresa.8. >SELECT codde. AVG(nvl(comis. >SELECT codde. >SELECT codde. AVG(comis).700€. MAX(salar).

78 . codde. >SELECT codde. COUNT(DISTINCT extel) FROM emple GROUP BY codde HAVING AVG(salar)>(select avg(salar) from emple). SUM(salar) FROM emple GROUP BY codde HAVING SUM(salar)>=all(select sum(salar) from emple group by codde). codde. CASE 5. 5. obtener cuantas extensiones telefónicas tiene asignadas. COUNT(*) FROM emple GROUP BY extel.APENDICE TEMA 5. Para los departamentos en los que la media de salario supera la media de salarios de todos lod empleados de la empresa. >SELECT extel. De cada extensión telefónica cuantos empleados la utilizan en cada departamento.’sin extension’).17. >SELECT AVG(salar) FROM emple WHERE codem=SOME (select codjefe from depto where tidir’F’). COUNT(DISTINCT codde) FROM emple GROUP BY extel. 5. 5.13. >SELECT codde.15. Para los departamentos en los que hay algún empleado que no cobra comisión obtener cuantos empleados hay en promedio por extensión telefónica. Obtener la media de salarios de los empleados que son jefes de departamento en funciones. >SELECT extel.12.16. COUNTcodem)/COUNT(DISTINCT extel) FROM emple GROUP BY codde HAVING codde=SOME(select codde from emple where comis IS NULL). Para cada extensión telefónica obtener en cuantos departamentos se utiliza. nomem FROM emple WHERE extel=SOME(select extel from emple group by extel having count(*)>2). >SELECT codde. 5. 5.18. >SELECT nvl(extel. Obtener la extensión telefónica y los nombres de los empleados que la tienen asignada de aquellas extensiones que son utilizadas por más de 3 empleados.14. Obtener la suma de los salarios de aquel departamento que tenga mayor coste de salarios de sus empleados. 5.

AVG(salar) FROM emple GROUP BY codde HAVING codde=SOME (select codde from emple where salar>1400 group by codde having count(*)>3). 6. >SELECT codde.nomde. extel HAVING count(*) BETWEEN 1 AND 5. depto d.nomde.codce=centro.APENDICE TEMA 5.codce.nomce FROM depto.codce=c. >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)). 5. centro WHERE depto.codde ORDER BY 1.21. depto. 5.codce AND e. CASE 5. 6.19. Obtener las extensiones telefónicas que pertenezcan a un departamento en el que hayan más de 2 extensiones telefónicas y que estén compartidas por mas de un empleado y por menos de 5 empleados del mismo departamento.codde.nomce FROM emple e. c.400€ obtener la media aritmética de los salrios de todos los empleados del departamento.codde=d. d. CONSULTAS SOBRE VARIAS TABLAS. centro c WHERE d.1. centro. 79 . 6. 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.20. Obtener el nombre del departamento con mayor índice de natalidad. De cada departamento en el que trabajan más de 3 empleados cuyo salario supere los 1.2. >SELECT depto. >SELECT e.nomem. Obtener los nombres de todos los empleados indicando el nombre del departamento donde están asignados y el nombre del centro al que van a trabajar. Obtener todos los departamentos de la empresa indicando el código de departamento. >SELECT codde. el nombre del departamento y el nombre del centro en el que se ubica.

depto d WHERE e2.depde. 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. CASE Obtener los nombres de los empleados que cobran comisión indicando los nombres de departamento en que trabajan y el centro en el que se ubica su departamento. depto d2 WHERE d2.codde. depto d. 6. Obtener los nombres de los jefes del departamento y los nombres de departamento de los que son jefes cuando los jefes son en funciones.codjefe AND e1.nomem.codde=d. >SELECT e.codce=SOME(select codce from centro where dirce like ‘C/ALCALA%’). 6.salar>e2.nomde. c. e2.codce AND e. d2. >SELECT e. Obtener los nombres de y los nombres de sus jefes de departamento de aquellos empleados que cobran más que sus jefes.codde AND d.dirce FROM emple e.codde=d. 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á.codjefe. >SELECT e.codde AND e1.nomde FROM depto d1.presu<100000 AND d2.codde.codem=d.3. c. d.nomce FROM emple e.000€. c.nomem.APENDICE TEMA 5.salar. depto d.codce=c.nomde.nomde FROM emple e.nomem. d. >SELECT e. centro c WHERE d. 6.nomce FROM emple e.5.6.7. 80 . depto d WHERE tidir?’F’ AND e. centro c WHERE e.codde=d1.4.salar FROM emple e1. d.nomem. emple e2.nomde.codde=d. centro c WHERE e. depto d.salar.nomem.codde=e2.codce=c.codem=d.nomem. e2.codce AND e. >SELECT e1. Obtener los nombres de los empleados de la empresa y la dirección a la que van a trabajar. >SELECT d1.codce AND c.comis IS NOT NULL AND c. e1. Obtener el nombre de empleado. 6. 6.codce=d.8. 6.

codde) GROUP BY nomde.codde=d. 81 .codjefe=e2. count(*) FROM depto d. >SELECT nomem FROM emple WHERE salar>(select avg(salar) from emple e1 where e1.codde and codem<>e1. emple e1 WHERE e1. >SELECT nomde.codde AND d.fecnac GROUP BY nomde.codem AND e1.codem). De cada departamento obtener cuantos empleados son mayores que su jefe de departamento.12.APENDICE TEMA 5.9. Obtener el nombre de empleado cuyo salario supere la media de salarios de los compañeros de departamento sin incluirse él. CASE Obtener los nombres de los empleados cuyos salarios superen a la media de los salarios de sus compañeros de departamento.codde=d.10.fecnac<e2.codde). emple e2 WHERE e1. 6.codde=emple. Presentar el nombre de empleado y el número de empleados. count(*) FROM depto d. >SELECT nomde.codde=d. Presentar el nombre de empleado y el número de empleados. emple e WHERE e. (sin usar correlacionadas).codde AND fecnac<(select fecnac from emple where codem=some (select codjefe from depto) and emple. 6. 6. De cada departamento obtener cuantos empleados son mayores que su jefe de departamento.codjefe) GROUP BY nomde. >SELECT nomde. >SELECT nomem FROM emple e1 WHERE salar>(select avg(salar) from emple where codde=e1. emple e1.codde=d.11. 6.codde AND fecnac<(select fecnac from emple where codem=d. count(*) FROM depto d.

centro c WHERE d.APENDICE TEMA 5. centro c WHERE d. De cada departamento que tenga un presupuesto inferior a 100.Ø)>1000 GROUP BY codde.codce AND d.presu>(select avg(presu) from depto where depde=d.presu<(select sum(salar)*10 from emple where comis is not null And emple.13. 6. 82 . depto d WHERE d. >SELECT codde. 6. emple e WHERE d.codde).000€.nomde.15. Para los departamentos cuyo presupuesto supera los 90.16. count(*) FROM emple e. >SELECT nomde. dirce FROM depto d.Ø)>1000 GROUP BY nomde.codde AND d.14. >SELECT d.codce=c. count(*) FROM emple WHERE codde=some (select codde from depto where presu<100000) AND salar+nvl(comis.codce AND d.000€ obtener el promedio de empleados por extensión telefónica.codde AND d.codde). 6. Obtener los nombres de departamento y la dirección donde se ubican de aquellos departamentos cuyo presupuesto es inferior a 10 veces la suma de los salarios de sus empleados que cobran comisión.codce=c. >SELECT d. >SELECT nomde. nomce FROM depto d.salar+nvl(comis. count(distinct extel)/count(*) FROM depto d. >SELECT codde. Obtener los nombres de departamento y los nombres de centro donde se ubican de aquellos departamentos cuyo presupuesto es superior a la media aritmética de los presupuestos de los departamentos que dependen de él.codde=d.000€ obtener cuantos empleados cobran más de 1.presu<100000 AND e. CASE 6.codde=e. count(distinct extel)/count(*) FROM emple WHERE codde=some(slect codde from depto where presu>90000) GROUP BY codde.presu>90000 GROUP BY nomde.codde=e.nomde.

codem and depde is null). es decir. depto d WHERE d. >SELECT nomem FROM emple. que sean jefes de un departamento del cual no dependen otros departamentos.17. >SELECT codde.codjefe AND NOT EXISTS (select * from depto where depde=d. CASE 6. >SELECT nomem FROM emple e. depto WHERE codem=codjefe AND depto.codjefe=emple. 6. >SELECT nomem FROM emple e WHERE EXISTS (select * from depto where codjefe=e.20. Obtener los nombres de jefes de primer nivel. >SELECT nomem FROM emple.APENDICE TEMA 5. 83 .18.codde<>ALL(select depde from depto where depde is not null).19. nomde FROM emple WHERE codem=SOME(select codjefe FROM depto where tidir=’F’). 6. Obtener el nombre de los jefes de departamento en funciones. >SELECT nomde FROM depto WHERE tidir<>’P’ AND NOT EXISTS (select * from emple where codde=depto.tidir=’F’.codem AND d.codde) GROUP BY nomem. Obtener los nombres de departamento que son de nueva creación. que no tenga empleados asignados y no tengan jefe en propiedad.codde). es decir. depto WHERE depto.codem AND depto. nomem FROM emple e. >SELECT nomem FROM emple WHERE EXISTS(slect * from depto where codjefe=codem and tidir=’F’).codem=d. Obtener los nombres de jefe de último nivel. >SELECT nomde.codjefe=e. depto d WHERE e. 6. es decir. que son jefes de un departamento que no depende de otro departamento.depde IS NULL.

codde).666.codde AND NOT EXISTS (select * from emple where codde=e. depde. depto d WHERE e.150000.codde AND tidir=’P’ AND EXISTS (select * from depto where tidir=’F’ and codjefe=d.codde=d. >SELECT nomde FROM depto WHERE codde=SOME (select codde from emple where codcat=all (select codcat from emple where codde=depto. CASE 6. codjefe.150000. >INSERT INTO depto VALUES(666. >SELECT distinct nomde FROM emple e. 84 . 7.10).codde=d. depto d WHERE e. Obtener los nombres de los empleados que trabajan en un departamento que tiene jefe en propiedad y además ese jefe es jefe en funciones de otro departamento.codjefe=SOME(select codjefe from depto where tidir=’F’). >INSERT INTO depto (nomde.’F’. 6.110). codde. codce) VALUES (’DeMoN’. Se ha creado un nuevo departamento que depende del 110.’DeMoN’. depto d WHERE e. >SELECT nomem FROM emple e.110. >SELECT nomem FROM emple e. presu.codcat).21. SENTENCIAS PARA MODIFICAR DATOS.10.180.codde AND codcat=ALL (select codcat from emple where codde=d.codjefe). 7. tidir.’F’.22. >SELECT distinct nomde FROM emple e. depto d WHERE e.1. Darlo de alta.codde AND d.codde=d.codde=d.codde and codcat<>e.180.codde)).APENDICE TEMA 5.tidir=’P’ AND d. Obtener los nombres de departamento en que todos sus empleados tienen la misma categoría laboral.

Obtener la lista de alumnos asistentes a cada grupo y en cada asignatura.dni=al. 9. CASE 7. codce. >INSERT INTO emplea2 SELECT * FROM emple WHERE to_char(fecing.dni=al.denasigna.2.’F’).codasigna AND turno=’M’ ORDER BY 1. a. CONSULTAS COMPLEJAS EN SISTEMAS DE INFORMACIÓN COMPLEJOS.2.. tidir) VALUES (666. orden alfabético de alumno y orden alfabético de asignatura. >SELECT g. asigna a WHERE al.nomalumno FROM alumno al. >CREATE TABLE emplea2(codem.dni AND e.dni AND e.2.3.dni=al.2. Se desea insertar en esta tabla los empleados de emple que hayan ingresado en la empresa a partir de la década de los 90. al.codasigna=a.2. 9.codasigna ORDER BY 1.). al. substr(denasigna. 9. Obtener un listado de los grupos que asisten en turno de mañana. estudia e WHERE e.APENDICE TEMA 5.codasigna=a.1. 85 . >SELECT al.’DeMoN’.codasigna=’CASE’ ORDER BY 1. >SELECT al. nomalumno.’yyyy’)>=’1990’. estudia e.dni AND e.codgrupo. >INSERT INTO depto (codde. estudia e. nomce.codgrupo AND e..25) FROM alumno al.3.codgrupo=g.1.codgrupo.nomalumno FROM alumno al. Obtener los nombres de los alumnos que estudias CASE organizados por grupos. presentando el código del grupo. 9. grupo g. Ordenados por grupos. el nombre de los alumnos que asisten al grupo y el nombre de las asignaturas que estudian cada uno de los alumnos. asigna a WHERE e.codgrupo.10. Supongamos que disponemos de una tabla vacía llamada EMPLEA2 con las mismas columnas de la tabla EMPLE.

coddepar ORDER BY 1.coddepar AND c. el nombre del profesor y la relación de asignaturas que imparte cada profesor.ordenprofe AND c. 9.codgrupo.5. p. g.APENDICE TEMA 5. Obtener un listado de los profesores presentando el nombre del departamento.nomprofe FROM departamento d. Presentarlo ordenado por profesor. a. Obtener un listado de los profesores presentando el nombre de departamento.rama=’DAI’ ORDER BY al. CASE Obtener un listado de los profesores presentando el nombre del departamento al que está asignado y el nombre del profesor.7. >SELECT al.4.coddepar AND c. 9.curso=2 AND g.coddepar=p. profesor p WHERE d. departamento d WHERE d. 9. asigna a.codgrupo AND g.dendepar.coddepar=p.curso FROM alumno al. Obtener los alumnos de la rama DAI del segundo curso. clasificados por grupo. profesor p. al.coddepar ORDER BY 2. >SELECT d.codgrupo. clase c WHERE c. profesor p. >SELECT d. Obtener los nombres de los alumnos que asisten al mismo grupo que ‘ROIG FELIU. 9. >SELECT nomalumno FROM añumno WHERE codgrupo=(select codgrupo from alumno where nomalumno=’ROIG FELIU.coddepar ORDER BY 1. JORGE’). JORGE’.ordenprofe=p. Clasificar por departamento y profesor.codgrupo FROM clase c.p.nomprofe.c.codasigna AND d.ordenprofe=p.6.nomprofe.coddepar=c. el nombre del profesor y la relación de los grupos a los que imparte clase cada profesor.coddepar=p. 86 .dendepar.8. >SELECT distinct d. p.nomalumno.denasigna FROM departamento d.ordenprofe AND c.codgrupo=al.dendepar.codasigna=a.2.2. grupo g WHERE g. 9.coddepar=p. Presentarlo por departamentos.

dni and estudia.codasigna AND g.dni=al. asigna a where e.codasigna=a. grupo g.APENDICE TEMA 5. nomalumno.codasigna and curso=1).codasigna=a. rama r WHERE al. 9.codrama=’DAI’ AND EXISTS (select * from estudia.11.codasigna AND g.denasigna FROM alumno al.denrama=’DESARROLLO DE APLICACIONES INFORMATICAS’ AND g. Obtener el grupo y el nombre de los alumnos de DAI que están matriculados en un grupo de 2º y cursan alguna asignatura de 1º. asigna a WHERE al.codasigna=a.codgrupo.codgrupo AND al.codasigna AND g. grupo g.curso=2 AND al.codgrupo AND al.codgrupo AND g. 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.codgrupo AND al.dni=al.dni AND a.codrama=al. >SELECT nomalumno. denasigna FROM alumno al.dni=al.codrama=r. grupo g. >SELECT distinct g. 9. 9.codrama=’DAI’ AND g.curso=1.curso=2 AND e.9. >SELECT g. estudia e. nomalumno FROM alumno al.dni AND e.codrama=r. >SELECT nomalumno FROM alumno al.codasigna=e.codgrupo=g.codgrupo=al. asigna where estudia.codgrupo=al. estudia e. asigna a WHERE r.codgrupo=al. Se han de visualizar los nombres delas asignaturas de 1º en las que están matriculados.estudia e.codrama AND r. a.codrama AND denrama=’DESARROLLO DE APLICACIONES INFORMATICAS’ AND curso=2 AND dni IN (select dni from estudia e.codgrupo. 87 .dni=e. CASE Obtener el grupo y nombre de los alumnos de la rama ‘Desarrollo de Aplicaciones Informáticas’ que están matriculados en un grupo de 2º y cursan alguna asignatura de 1º. grupo g.curso=1).10.codasigna=asigna. rama r.curso=2 AND a. asigna a WHERE e.codrama AND e.codasigna= SOME (select codasigna from asigna where curso=1).dni AND e.codasigna and asigna.

coddepar=p.12. >SELECT nomalumno.APENDICE TEMA 5. obtener los nombres de los alumnos que no tienen que presentarse al examen final de GRAF y CASE.codgrupo=g.dni=SOME(select dni from estudia.15. >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’). Obtener el nombre de los alumnos que tengan clase con el profesor ‘FOLGUERA PEREZ.codgrupo AND c. profesor p. Obtener de cada grupo cuántos alumnos han de presentarse al examen final de alguna asignatura (los alumnos que tengan más de 1 asignatura suspensa han de ser contados como 1 solo alumno).dni=e.codgrupo=al. denasigna FROM alumno al. asigna where estudia.codasigna=e.nomprofe=’FOLGUERA PEREZ. >SELECT codgrupo FROM grupo WHERE NOT EXISTS (select * from alumno where alumno. 88 . count(al.dni and (nota1+nota2+nota3)/3<5) GROUP BY codgrupo.curso=2 AND al.codgrupo AND al. LUIS’.codgrupo=grupo.codasigna AND p. grupo g. clase c. Obtener los grupos en los que no hay matriculados alumnos. 9. estudia e WHERE c.codasigna AND al.codasigna=asigna.nomalumno) FROM alumno al WHERE EXISTS (select * from estudia where estudia. 9.dni AND c.13. CASE 9.codgrupo.codrama=’DAI’ AND g.dni=al.coddepar AND e. >SELECT al.dni=al. asigna a WHERE al.codgrupo).codasigna=a.ordenprofe=p. estudia e. LUIS’.codasigna and curso=1). >SELECT nomalumno FROM alumno al. 9.dni AND e.ordenprofe AND c.14.

clase c.dni=al.dni=al.dni=al.dni=estudia. 9.codasigna))).dni=e. 9. Obtener cuantos alumnos tiene cada profesor. Obtener aquellos alumnos cuya nota media de cada asignatura sea la mejor de lsa notas medias obtenidas por los alumnos de esa asignatura.coddepar AND c.ordenprofe AND p. > SELECT nomprofe. >SELECT nomalumno FROM alumno WHERE dni=SOME(select dni from estudia where not exists (select * from estudia e where e.19. estudia e.dni GROUP BY al.dni)). >SELECT nomalumno FROM alumno al WHERE NOT EXISTS (select * from estudia e where e. count(*) FROM profesor p.dni=estudia.ordenprofe=c.APENDICE TEMA 5. CASE 9. Obtener los nombres de los alumnos que estén matriculados de todas las asignaturas de 2º DAI.dni GROUP BY nomprofe. >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.18.17.codgrupo AND e.20. alumno al where e. Obtener los nombres de los alumnos que han aprobado todos los parciales de todas las asignaturas que estudia. Obtener el grupo que tiene la nota media más alta.codasigna=e. 9.dni group by al.codasigna=estudia. alumno al WHERE p. alumno al WHERE al.codgrupo) 89 .codgrupo=al.dni and (nota1+nota2+nota3)/3<some(select (nota1+nota2+nota3)/3 from estudia where e.codgrupo HAVING avg((nota1+nota2+nota3)/3)>=all (select avg((nota1+nota2+nota3)/3) from estudia e. > SELECT codgrupo FROM estudia e.codasigna AND c.16. 9.coddepar=c.dni and (nota1<5 or nota2<5 or nota3<5)).