Sunteți pe pagina 1din 94

I.E.S.

TRASSIERRA Crdoba
http://www.iestrassierra.com

Departamento de Informtica

APUNTES DE SQL
Etapa: Ciclo: Nivel: Mdulo: Profesor: Formacin Profesional Especfica. Desarrollo de Aplicaciones Web. Superior. Bases de Datos. Juan Carlos Prez Jorge

INDICE:
Tema 1.- El lenguaje SQL .................................................................................. 1 Tema 2.- Sentencias SQL .................................................................................. 6 Tema 3.- El lenguaje de manipulacin de datos LMD ................................ 12 Tema 4.- Funciones ......................................................................................... 28 Tema 5.- Consultas sobre varias tablas ........................................................ 44 Tema 6.- Archivos de comandos e informes ................................................ 55 Tema 7.- Sentencias de actualizacin de datos y transaccionales ............... 66 Tema 8.- Lenguaje de definicin de datos LDD ............................................ 73 Bibliografa ....................................................................................................... 93

I.E.S. TRASSIERRA - Crdoba

SQL

TEMA 1.- EL LENGUAJE SQL.1.1.- Qu es SQL. 1.2.- Uso de SQL. 1.3.- Principales caractersticas. 1.4.- Sublenguajes SQL. 1.5.- El editor de SQL *Plus.

1.1.- QU ES SQL.El SQL es un lenguaje que permite comunicarnos con un SGBDR. A pesar de que su nombre proviene de las iniciales Structured Query Languaje (Lenguaje Estructurado de Consultas), actualmente el SQL es un lenguaje capaz de ser usado para consultas, para actualizacin y definicin de datos y para el control, consistencia y confidencialidad de los datos. El modelo de base de datos relacional fue enunciado por Codd en los aos 70. El lenguaje SQL (originalmente SEQUEL2) fue desarrollado en 1976 por IBM en un prototipo de base de datos relacional llamada SYSTEM R. En 1979 Oracle Corporation comercializa el primer producto de este lenguaje, vigente hasta la actualidad. Hoy, SQL est implementado en muchas grandes empresas y es aceptado como estndar cumpliendo las normas ANSI/ISO/FIPS. No obstante y como en cualquier otro lenguaje los estndares que no siempre son seguidos por los fabricantes de este tipo de productos con lo que nos encontramos con gran variedad de versiones.

1.2.- USO DE SQL.Las peticiones sobre los datos se expresan mediante sentencias que deben estar escritas segn las normas sintcticas y semnticas de este lenguaje. SQL puede ser usado como sentencias de un programa escrito en otro lenguaje (SQL embebido). Esta forma de trabajo est ms orientada a los programadores que adems de conocer la sintaxis SQL debern conocer el lenguaje de programacin correspondiente (COBOL, FORTRAN, PL71, C, etc.). Pero adems de embebido en un programa, SQL puede usarse de forma interactiva, esto es, ejecutando la sentencia de consulta y recibiendo instantneamente el resultado de la misma por pantalla. Esta posibilidad dota al lenguaje de mucha flexibilidad para su uso por parte de personal poco especializado (usuarios finales). Hay dos tcnicas para utilizar el SQL embebido en programas. En una de ellas, llamada SQL esttico, las sentencias incluidas en el programa no pueden cambiar durante su ejecucin. En la otra, llamada SQL dinmico, una sentencia puede ser modificada total o parcialmente por el propio programa durante su ejecucin. La mayora de los programas pueden codificarse empleando SQL esttico, ms sencillo y eficiente que el dinmico. ste, en cambio,
Dep. de Informtica 1

I.E.S. TRASSIERRA - Crdoba

SQL

proporciona una mayor flexibilidad, que puede ser til en algunos casos especiales, y suele requerir tcnicas de programacin ms avanzadas en el manejo dinmico de memoria. Oracle tiene una extensin procedural llamada PL/SQL que mezcla el SQL estndar con comandos puramente procedimentales (goto, while, for, ..). De esta forma se permite tratar una a una las tuplas devueltas por una sentencia SQL. El principal uso que harn del lenguaje los programadores y usuarios consistir en la realizacin de consultas y actualizaciones sobr datos almacenados en tablas relacionales. Pero tambin hay otras tareas que se pueden realizar mediante sentencias SQL, aunque pertenecen ms a las responsabilidades del Administrador de Bases de Datos o ABD (en ingls DBA). Son las siguientes: 1) Definicin y destruccin de objetos. Antes de poder usar una tabla para almacenar o consultar datos en ella, hay que describirla al SGBD, dndole su nombre y caractersticas. Esto se hace definindola. Hay otros muchos objetos que maneja un SGBD, tales como espacios para ficheros fsicos, ndices, etc. Todos ellos se definen con sentencias SQL. Normalmente, la definicin de tablas y vistas corre a cargo del ABD, pero en algunos casos se permite a algunos usuarios definir tablas para datos de uso privado. 2) Gestin de las autorizaciones de acceso. Un usuario final no podr consultar o actualizar datos de una tabla si previamente no ha sido autorizado para ello. Tampoco podr hacerlo un programa si la persona que ha solicitado su ejecucin no ha sido previamente autorizada. Estas autorizaciones se conceden o deniegan mediante sentencias SQL. Normalmente, las autorizaciones las concede el ABD, pero puede haber casos en que lo haga un usuario con respecto a sus datos privados, si se le permite tenerlos.

1.3.- CARACTERISTICAS.SQL es un lenguaje no procedural (se le indica qu hacer, no como hacerlo), en el cual hay que dar muy pocas instrucciones para manejar la base de datos. No es procedural (no admite estructuras de programacin) porque: Su potencia estriba en que procesa varias filas a la vez. La navegacin para buscar los datos es automtica, utilizando el optimizador.

SQL es un lenguaje relacionalmente completo, pues permite realizar cualquier consulta de datos: la consulta puede devolver una tabla completa, una fila (tupla), una columna (atributo), una celda (valor de un atributo para una tupla concreta) o un subconjunto de la tabla. SQL es un lenguaje muy sencillo y parecido al idioma ingls y los comandos bsicos pueden aprenderse en poco tiempo. Adems dispone de las mismas sentencias para cualquier tipo de usuario: administrador, programadores y usuarios finales.

Dep. de Informtica

I.E.S. TRASSIERRA - Crdoba

SQL

1.4.- SUBLENGUAJES SQL.SQL se compone de tres sublenguajes especializados cada uno de ellos en un tipo de operaciones sobre las tablas de la B.D.: L.M.D. Lenguaje de Manipulacin de datos. (Consultas). L.D.D. Lenguaje de Descripcin de datos. (Creacin de tablas). L.C.D. Lenguaje de Control de datos. (Confidencialidad).

SQL

1.4.1.- L.M.D.Agrupa a los comandos que permiten realizar consultas, modificaciones, inserciones y borrados sobre las tablas. Comando SELECT UPDATE INSERT DELETE Accin Consultar datos (sin modificarlos) de una o varias tablas Actualizar uno o varios valores de una o mas filas de una tabla. Aadir una o varias tuplas a una tabla. Borrar una o varias filas de una tabla.

Las sentencias UPDA TE, INSERT y DELETE deben validarse contra la Base de Datos o deshacerse empleando los comandos COMMIT o ROLLBACK. 1.4.2.-L.D.D.Contiene los comandos utilizados para definir, borrar, reemplazar o alterar estructuras de la base de datos. Comando CREATE ALTER Accin . Definir nuevos objetos, por ejemplo una tabla, Modificar las caractersticas de un objeto ya existente, Por ejemplo aadir una columna a una tabla, REPLACE Reemplazar el objeto por uno nuevo si existiese previamente.* DROP Borrar un objeto. Por ejemplo una tabla completa, no solo las filas. RENAME Cambiar de nombre de un objeto, Por ejemplo una tabla, vista, procedimiento o sinnimo, TRUNCATE Borra las filas de una tabla o ndice sin borrar su estructura. La tabla permanece pero vaca.

1.4.3.- LCD.Comandos utilizados por el administrador o por el dueo de un objeto para conceder o suprimir privilegios de acceso a la Base de Datos o a un objeto, Comando GRANT REVOKE Accin Concede autorizaciones a los usuarios para acceder a objetos. Suprime (revoca) autorizaciones. .

Solo vlido para ciertos objetos 3

Dep. de Informtica

I.E.S. TRASSIERRA - Crdoba

SQL

1.5.- EL EDITOR DE SQL *PLUS.SQL *Plus es la herramienta de Oracle para ejecutar comandos SQL. Comando CONNECT.-

Una vez iniciados los servicios, ejecutamos el programa Ejecutar lnea de comandos y tras el prompt SQL> escribimos el comando de conexin seguido del usuario y contrasea que hayamos indicado en la instalacin: SQL> conn[ect] [usuario/password] Si no especificamos el usuario/password, nos ser solicitado por la propia herramienta. Para trabajar en entorno grfico deberemos ejecutar el programa Ir a la Pgina Inicial de Bases de Datos que nos solicitar el usuario y clave. A continuacin deberemos picar sobre el icono SQL y despus sobre Comandos SQL. El editor de lneas proporcionado por SQL*Plus es bastante rudimentario y similar al edlin del MS-DOS, no obstante el usuario puede elegir el editor de texto que desee. Desde el prompt de SQL*Plus pueden ejecutarse comandos, algunos de los cuales pueden realizarse mediante las opciones de la ventana de SQL*Plus. Comando EXIT.SQL> exit Comando HELP.SQL> help index Para obtener ayuda de un comendo: SQL> help <comando> Comando EDIT.SQL> define_editor = <nombre_editor> Para activar el editor bastar con teclear SQL> ED[IT] Si tras el comando no se indica un nombre de fichero, se crear el temporal "afiedt.buf". Si se especifica un nombre, se genera un fichero con ese nombre y una extensin sql. Comando SPOOL.-

Sale de SQL *Plus. Sintaxis:

Proporciona ayuda sobre los comandos de SQl *Plus. Para obtener ayuda genrica:

Llama al editor activo del sistema operativo. Se puede elegir el editor utilizando:

El comando SPOOL se utiliza para almacenar el RESULTADO de la ejecucin de una SELECT en un fichero. Para activarlo se escribe:

Dep. de Informtica

I.E.S. TRASSIERRA - Crdoba

SQL

SQL> SPOOL <nombre_fichero> Y para desactivarlo: SQL> SPOOL OFF Genera un fichero, con extensin por defecto .lst, con el resultado de la SELECT ejecutada. Si en vez de a un fichero queremos mandar el resultado a la impresora, para activarlo: SQL> SPOOL ON Y para desactivarlo: SQL> SPOOL OUT Comando SAVE.

El comando SAVE guarda en un fichero el contenido de la sentencia SQL que est actualmente en el buffer. Su sintaxis es: SQL> SAVE <nombre_fichero> [REPLACE] Esto crea un fichero de sistema operativo con extensin sql con la SELECT escrita anteriormente. Comando START.

El comando START permite ejecutar un fichero de comandos creado previamente y que contenga ms de una sentencia SQL. Su sintaxis es: SQL> START <nombre_fichero> Comando GET.

Lleva al buffer SQL el fichero indicado. Si la extensin del nombre del fichero a editar no es SQL hay que indicar el nombre completo. Su sintaxis es: SQL> GET <nombre_fichero> Comando DESCRIBE. SQL> DESC <nombre_tabla> Comando HOST.

El comando DESCRIBE o DESC muestra la estructura de una tabla. Su sintaxis es:

Permite ejecutar un comando de sistema operativo sin salir de la sesin de SQL*Plus. Su sintaxis es: SQL> HOST [comando] Si se omite el comando se sale temporalmente al S.O.. Para regresar a SQL*Plus deberemos usar el comando EXIT que nos devolver a la sesin de la base de datos.

Dep. de Informtica

I.E.S. TRASSIERRA - Crdoba

SQL

TEMA 2.- SENTENCIAS SQL.2.1.- Elementos de SQL.2.1.1.- Objetos de un esquema. 2.1.2.- Reglas para nombrar objetos. 2.1.3.- Reglas para referenciar objetos. 2.2.- Elementos de una sentencia SQL. 2.3.- Tipos de datos. 2.4.- Valores nulos. 2.5.- Constantes. 2.6.- Variables de entorno.

2.1.- ELEMENTOS SQL.Antes de estudiar las sentencias SQL *Plus debemos familiarizarnos con ciertos conceptos: 2.1.1.- Objetos de un Esquema. Un esquema es un conjunto de objetos y estructuras de datos propiedad de un usuario. Cada usuario tiene su propio esquema que coincide con el nombre del usuario que crea el objeto. Los objetos se crean y modifican su estructura con el lenguaje LDD e incluyen los siguientes tipos de objetos: Tablas. Unidad bsica de almacenamiento en un sistema de gestin de bases de datos relacionales. Una tabla consta de una o ms unidades de informacin (filas), cada una de las cuales contiene el mismo tipo de valores (columnas). Objeto de base de datos creado para aumentar el rendimiento de recuperacin de datos. Proporciona una ruta de acceso rpida a los datos de una base de datos. Los ndices apuntan directamente a la ubicacin de las filas que contienen los datos especificados. Una secuencia genera una lista en serie de nmeros nicos para las columnas numricas de una tabla de base de datos. Por ejemplo, si dos usuarios desean insertar nuevos nmeros de empleado en una tabla, la secuencia genera automticamente el valor correcto para cada usuario. Presentacin personalizada de los datos de una o ms tablas. Alias de una tabla, vista, secuencia o unidad de programa. Sinnimo privado: Sinnimo de un objeto de base de datos definido por un usuario de Oracle para que otros usuarios seleccionados de la base de datos puedan acceder a dicho objeto. Sinnimo pblico: Sinnimo de un objeto de base de datos definido por un administrador de base de datos para que todos los usuarios de la base tengan acceso a dicho objeto.
6

ndices

Secuencias.

Vistas. Sinnimos.

Dep. de Informtica

I.E.S. TRASSIERRA - Crdoba

SQL

Agrupaciones.

Procedimientos y Funciones almacenados (*).

Estructura de base de datos que contiene una o ms tablas con una o ms columnas en comn. Las filas de una o ms tablas que comparten el mismo valor en estas columnas comunes se almacenan fsicamente juntas en la base de datos. Procedimiento: Juego de sentencias SQL y PL/SQL agrupadas para solucionar un problema especfico o realizar un conjunto de tareas relacionadas.

Funcin almacenada: Juego de sentencias PL/SQL que puede llamarse por un nombre. Las funciones son similares a los procedimientos, con la diferencia de que una funcin devuelve un valor al entorno desde el que se llama. Paquetes (*). Conjunto encapsulado de procedimientos, funciones y otros objetos de programa relacionados almacenados juntos en la base de datos. Disparadores Procedimiento almacenado que se dispara (ejecutado almacenados en Base implcitamente) al emitir una sentencia INSERT, UPDATE o de Datos (*). DELETE para la tabla asociada. Rplicas y Rplicas Copia local de una tabla maestra remota. Las rplicas pueden Lgicas (*) (+). utilizarse para replicar (copiar) toda la tabla o parte de ella, o para replicar el resultado de una consulta en varias tablas. Las rplicas pueden ser tanto actualizables como de slo lectura. Ambas son copias de la tabla maestra. Una rplica de slo lectura se puede refrescar peridicamente para reflejar los cambios realizados en la tabla maestra. Los cambios realizados en una rplica actualizable pueden propagarse a la tabla maestra y a cualquier otra copia. Enlaces de Base de Un enlace de base de datos es un objeto de la base de datos que Datos permite acceder a objetos de una base de datos remota.
(*) Objetos disponibles si PL/SQL est instalado. (+) Objetos disponibles con opcin distribuida.

Existen otros objetos que se crean y manipulan a travs de SQL y que se almacenan en la Base de Datos pero no son creados dentro del esquema de un usuario ni son propiedad de nadie. Estos objetos son: Perfiles. Roles. Segmentos de Rollback. Tablespaces. Usuarios. Directorios. Algunos objetos tienen partes, as por ejemplo una columna es una parte de una tabla o vista. Una particin es parte de una tabla o un ndice. Una restriccin de integridad es parte de una tabla. Procedimientos y funciones son parte de un paquete. Las tablas y los ndices pueden particionarse. Cuando ocurre esto, los objetos estn formados por un cierto nmero de piezas llamadas particiones que tienen los mismos atributos lgicos. Por ejemplo, todas las particiones de una tabla tienen las mismas definiciones de columnas y restricciones, y todas las particiones del un ndice tienen las columnas indexadas.
Dep. de Informtica 7

I.E.S. TRASSIERRA - Crdoba

SQL

2.1.2. Reglas para Nombrar Objetos Los nombres de objeto tienen que seguir las siguientes reglas: Deben tener una longitud entre 1 y 30 caracteres, excepto el nombre de una base de datos que est limitado a 8 caracteres y el de un enlace de base de datos a 128. No puede estar entre parntesis, ni entrecomillado. Pueden escribirse en maysculas o minsculas. Oracle no es sensible a esto. Debe comenzar con un carcter reconocible por el conjunto de caracteres de la base de datos, a menos que vaya acotado por dobles comillas. Solo debe contener caracteres alfanumricos y el guin bajo _ .Tambin se admiten los caracteres $ y # aunque no es aconsejable utilizarlos. No puede coincidir con una palabra reservada.

Se puede nombrar un objeto con un nombre alternativo o sinnimo, y a una columna con un nombre alternativo temporal denominado alias que se detallarn ms adelante.

2.1.3.- Reglas para Referenciar Objetos Para referenciar un objeto se utiliza la siguiente sintaxis general: [ esquema.]nombre-objeto [.parte-objeto ] En el caso de que el objeto sea una tabla, deber anteponerse el nombre del usuario y un punto al nombre de la tabla. Solo si la tabla pertenece (la cre) al usuario que realiza la consulta se admite la omisin de la referencia (nombre de usuario propietario). As por ejemplo el usuario PACO se referir a la tabla de su propiedad de nombre emple, simplemente por su nombre: SELECT * FROM emple ; Si la usuaria MARIA quiere acceder a la misma tabla (suponiendo que el propietario la haya autorizado a ello) tendr que referirse a ella como PACO.emple. SELECT * FROM PACO.emple ; En las consultas sobre una sola tabla no es necesario referenciar las columnas, basta con indicar el nombre de la misma, pero si la consulta se refiere a varias tablas con columnas sinnimas, el referenciado de columnas se torna en necesidad. La forma de referenciar una columna es anteponindole el nombre de la tabla a la que pertenece y un punto. hospital.codenf indica que se trata de la columna codenf de la tabla hospital. En la sentencia SELECT es frecuente asignar alias a las tablas (para acortar las sentencias) y a las columnas (para que se visualicen ttulos de columna distintos a los nombres de campo). Estos alias no son permanentes y solo se activan en esa sentencia

Dep. de Informtica

I.E.S. TRASSIERRA - Crdoba

SQL

Alias de nombre de tabla.La forma de asignar un alias al nombre de una tabla es escribiendo el nombre del alias a continuacin del de la tabla (separados con un espacio). Por ejemplo: SELECT FROM WHERE E.numem, E.nomem, D.nomde emple E, depar D E.numdep=D.numdep;

No debe confundirse un alias de tabla, que solo tiene vigencia en la sentencia en que se define, con un sinnimo que es un objeto consistente en un nombre alternativo para una tabla o vista y que permanece mientras no se borre ese objeto. Alias de nombre de columna.La forma de asignar un alias a una columna, principalmente para mejorar la presentacin del resultado, es escribiendo el alias tras el nombre de columna y un espacio. Por ejemplo: SELECT E.numemp N DE EMPLEADO, E.nomemp EMPLEADO, D.nomdep DEPARTAMENTO FROM emple E, depar D WHERE E.numdep = D.numdep; Solo es necesario entrecomillar el alias cuando su nombre incluye espacios en blanco.

2.2.- ELEMENTOS DE UNA SENTENCIA SQL.Los elementos que componen una sentencia SQL son: Palabras predefinidas.- Son palabras con un significado concreto en SQL: SELECT, WHERE, INTO, etc.... Toda sentencia SQL comienza por una palabra predefinida. Nombres de tablas y columnas.- Son definidas por el administrador cuando crea la B.D. Constantes o literales.- Son series de caracteres que representan un determinado valor. Si no representan valores numricos deben ir entre comillas simples. Signos delimitadores.- Son caracteres especiales que sirven para delimitar los anteriores elementos dentro de una sentencia cuando no van entre comillas. El ms usado es el espacio, pero tambin lo son la coma y los operadores aritmticos, alfanumricos y de comparacin.

2.3.- TIPOS DE DATOS.Cada

valor de columna que se manipula es un tipo de dato. Cada tipo de dato tiene una serie de caractersticas asociadas. Al crear una tabla se especifica el tipo de datos acoger cada columna. Luego, en funcin del tipo de dato, podremos insertar ciertos valores o establecer ciertas comparaciones.
Dep. de Informtica 9

I.E.S. TRASSIERRA - Crdoba

SQL

Los tipos de datos son: Cdigo Dato


1 VARCHAR2(tam) NVARCHAR2(tam)

Descripcin
Cadena de caracteres de longitud variable. Tamao mximo es 4000 bytes y el mnimo uno. Es obligatorio especificar precisin. Cadena de caracteres de longitud variable teniendo un mximo de longitud expresado en caracteres o bytes, depende del juego de caracteres nacional indicado. El tamao mximo viene determinado por el nmero de bytes requerido para almacenar cada carcter. El lmite superior es 4000 bytes. Hay que especificar precisin. Numero de tamao 'n' (hasta 38) y , opcionalmente, 'd' decimales (de -84 a 127). Cadena de caracteres de longitud variable de hasta 2 Gb. Fecha en formato DD:MM:AA:HH:MM:SS. Depende de las variables "NLS". Siete bytes numricos. Rangos vlidos son desde 1 de Enero de 4712 adC al 31 de Diciembre de 4712 ddC. Dato binario de longitud variable. Tamao mximo 2000 bytes. Se debe indicar precisin. Cadena binaria de longitud variable de hasta 2 Gb. Cadena hexadecimal que representa la direccin nica de una fila en una tabla. Este tipo se usa para almacenar los valores devueltos por la pseudocolumna ROWID. Cadena alfanumrica de longitud fija. Tamao mximo 2000 bytes. Si no se indica precisin el valor mnimo y valor por defecto es 1 byte.

2 8 12

NUMBER(n[,d]) LONG DATE

23 24 69

RAW(tam) LONGRAW ROWID

96

CHAR(tam)

Los cdigos de los tipos de datos son para utilizacin interna. El cdigo interno de un dato se muestra cuando se utiliza la funcin DUMP

2.4.- VALORES NULOS.Independientemente del tipo de datos definido en una columna (atributo) de una tabla, el valor nulo puede ser admitido o no entre sus valores, en funcin de que se omitiera o incluyera la clusula NOT NULL en la creacin de la tabla. Un campo nulo es aquel que no contiene caracteres o valores. Un campo nulo no es lo mismo que una cadena de caracteres de longitud cero () o un campo con el valor 0. Un campo se establece con valor nulo cuando el contenido del campo es desconocido. Por ejemplo, un campo en el que deba aparecer la fecha de entrega de un prstamo de biblioteca, podra dejarse con valor nulo hasta que el libro fuese devuelto. El comportamiento de los valores nulos en las distintas operaciones en que puedan intervenir se ir describiendo conforme se describan stas.

2.5.- CONSTANTES.Las constantes o literales son secuencias de caracteres que representan un valor determinado de tipo numrico, alfanumrico o fecha:
Dep. de Informtica 10

I.E.S. TRASSIERRA - Crdoba

SQL

Numricas:

Nmeros. Ejemplo:

4 -586.21

Alfanumricas:

Serie entrecomillada de hasta 254 caracteres. Ejemplo: 'Francisco' Francisco 'BAR PACO''S' BAR PACOS Nmeros y caracteres especiales de fecha representados entre comillas. Ejemplo: '04-10-2011'

Fechas:

La comparacin de valores es frecuente en las consultas SQL, tanto en las condiciones de filtro (clusula Where) como en el orden de presentacin de resultados (clusula Order by). La comparacin de dos valores requiere que ambos sean del mismo tipo. Dos valores nulos son considerados como iguales. Dos valores alfanumricos vacos se consideran iguales. Las normas que se siguen son las tpicas. En los valores alfanumricos no nulos se toman en orden creciente del cdigo ASCII. La comparacin se hace carcter a carcter, comenzando por la izquierda y completando con blancos por la derecha caso de que los operandos sean de distinta longitud.

2.6.- VARIABLES DE ENTORNO.Los SGBD suelen disponer de unos registros especiales tambin llamados variables de entorno que representan un valor determinado, pero ese valor puede variar de una ejecucin a otra de la misma sentencia, lo que las diferencia de las constantes que permanecen invariables. Las variables de entorno se referencian por una palabra predefinida y algunas son: Variable UID Descripcin Devuelve un entero que es el identificador nico del usuario conectado. USER USER Devuelve un VARCHAR2 que contiene el nombre del usuario conectado en la base de datos local. USERENV USERENV Devuelve informacin acerca de la sesin actual en un tipo de (opcin) dato VARCHAR2. El argumento opcin puede tener los valores: 'ENTRYID': Devuelve un identificador de la sentencia ejecutada para auditorias. 'LANGUAGE': Devuelve el lenguaje y el territorio utilizado durante la sesin en formato: lenguaje_territorio_juegocaracteres. 'SESSIONID': Devuelve un identificativo de la sesin del usuario para auditorias. 'TERMINAL': Devuelve el identificativo del sistema operativo para el terminal usado.
Dep. de Informtica 11

Sintaxis UID

I.E.S. TRASSIERRA - Crdoba

SQL

TEMA 3.- LENGUAJE DE MANIPULACIN DE DATOS.3.1.- SELECT bsico. 3.1.1.- Seleccin de columnas. 3.1.2.- Seleccin de tablas. Clusula FROM. 3.1.3.- Seleccin de filas. Clusula WHERE. 3.1.4.- Ordenacin de los resultados. Clusula ORDER BY. 3.2.- Expresiones. 3.2.1.- Operadores. 3.2.1.1.- Aritmticos. 3.2.1.2.- Alfanumricos. 3.2.1.3.- De fecha. 3.2.1.4.- De comparacin general. 3.2.1.5.- De comparacin de cadenas. 3.2.1.6.- De comparacin lgica. 3.2.1.7.- Lgicos. 3.3.- Ejercicios propuestos.

3.1.- SELECT BSICO.Las sentencias SQL estn formadas por distintas clusulas, cada una de las cuales empieza con una palabra predefinida determinada. La sentencia SELECT permite recuperar datos de una o varias tablas, vistas o rplicas. Para seleccionar filas de una tabla se deber ser el propietario del esquema con el que se cre la tabla, o, en caso contrario, tener permiso de acceso o tener un privilegio del sistema llamado SELECT ANY TABLE, que permite acceder a cualquier tabla o vista. A continuacin veremos como usar la sentencia SELECT para realizar consultas sencillas sobre una nica tabla, usando una sintaxis simplificada de la sentencia: SELECT [DISTINCT] { col1 [, col2].. / * } FROM tabla [ WHERE predicado ] [ ORDER BY col1 [, col2].. ]

3.1.1.- Seleccin de columnas.Dnde col-1 y col-2 son nombres de columnas de la tabla cuyo nombre figura en la clusula FROM. Si se especifica el carcter comodn (*) se mostrarn todas las columnas de la tabla, pero en el orden que ocupan. Si a pesar de querer mostrar todas las columnas, las deseamos en un orden determinado habr que especificar todos los nombres de columnas en el orden deseado. SELECT ename, hiredate, sal FROM empl ;

Dep. de Informtica

12

I.E.S. TRASSIERRA - Crdoba

SQL

SELECT FROM

* empl ;

La clusula DISTINCT elimina, del resultado a mostrar, las filas repetidas. Ejemplo: Mostrar los nmeros de empleado de los empleados que son jefes. SELECT FROM DISTINCT mgr emp ;

Obsrvese como la informacin devuelta es mucho ms significativa (justa y necesaria) si usamos DISTINCT que si no lo hacemos.

3.1.2.- Seleccin de tablas. Clusula FROM.La clusula FROM indica el nombre de la tabla o tablas sobre las que se realizar la consulta. En la clusula FROM deben aparecer los nombres de las tablas a las que se refieren las columnas especificadas tras la palabra SELECT. Si se especifican varias tablas, sus nombres deben separarse por comas. Recordemos que cuando la tabla no es de nuestra propiedad el nombre del propietario y un punto deben especificarse delante del nombre de la tabla. SELECT FROM empno scott.empl

3.1.3.- Seleccin de filas. Clusula WHERE.WHERE permite filtrar las filas de forma que sean devueltas solo las que cumplan cierta condicin. El predicado de la clusula WHERE es una condicin que puede ser verdadera o no. De momento vamos a suponer que se trata de una comparacin entre dos valores. Ms adelante veremos otras posibilidades. Ejemplos: 1).- En el esquema scott/tiger, listar los nombres de los empleados que trabajan en el departamento 10. SELECT FROM WHERE ename emp deptno = 10;

Resultado: (puede obtenerse en otro orden):


ENAME CLARK KING MILLER

2).- Extraer todos los datos del departamento 10.

Dep. de Informtica

13

I.E.S. TRASSIERRA - Crdoba

SQL

SELECT FROM WHERE Resultado:


DEPTNO 10

* dept deptno = 10 ;

DNAME ACCOUNTING

LOC . NEW YORK

3.1.4.- Ordenacin de los resultados. Clusula ORDER BY. La clusula ORDER BY permite mostrar los resultados en un orden determinado, admitiendo la ordenacin por ms de una columna y en orden ascendente y descendente. La(s) columna(s) especificada(s) en la clusula ORDER BY no tienen por que ser una(s) de las especificadas en la clusula SELECT. Ejemplos: 1).- En el esquema scott, obtener los nombres de todos los departamentos ordenados alfabticmente. SELECT dname FROM dept ORDER BY 1 ; Resultado:
DNAME ACCOUNTING OPERATIONS RESEARCH SALES .

2).- Obtener, en orden de nmero de empleado, el nombre y salario de los empleados cuyo jefe es el empleado nmero 7902. SELECT FROM WHERE ORDER BY Resultado:
ENAME SMITH SAL 800

ename, sal emp mgr= 7902 empno ;

3).- Listar el nmero de departamento, nombre y fecha de ingreso en la empresa y el salario, de los empleados cuyo salario es inferior a 1300 euros, clasificndolos por departamento en orden creciente y, dentro de cada departamento, por antigedad en la empresa. SELECT FROM WHERE ORDER BY Resultado:
DEPTNO Dep. de Informtica

deptno, ename, hiredate, sal emp sal < 1300 1, 2 DESC;


ENAME HIREDATE SAL . 14

I.E.S. TRASSIERRA - Crdoba 20 20 30 30 30 SMITH ADAMS WARD MARTIN JAMES 17/12/80 23/05/87 22/02/81 28/09/81 03/12/81 800 1100 1250 1250 950

SQL

Si no se especifica ORDER BY, las filas de la tabla resultado sern devueltas en cualquier orden. Incluso en distinto orden de una ejecucin a otra. Cuando el SGBD ordena las filas ascendentemente (opcin por defecto), los valores nulos se muestran detrs de todos los dems. Para obtener un orden descendente se especifica la palabra DESC detrs del nombre o nmero de la columna; en este caso los nulos se muestran al principio. Adems, en vez de especificar el nombre de la columna por la que se quieren ordenar los resultados, puede indicarse el nmero relativo de la columna en la clusula SELECT. As por ejemplo, ORDER BY 3 equivale a especificara el nombre de la tercera columna de la clusula SELECT. Tambin puede ordenarse el resultado por ms de una columna. Para ello, basta dar sus nombres o nmeros, separados por comas. La sentencia SELECT siempre devuelve como resultado otra tabla. ste resultado, puede construirse siguiendo los siguientes pasos, aunque el SGBD puede seguir otros: 1. De entre las tablas accesibles para el esquema por defecto se selecciona la nombrada en la clusula FROM. Es como si se creara una copia temporal de ella, que pasar a ser por ahora la tabla resultante. 2. Se filtran las filas de la tabla resultante, segn el predicado (condicin) de la clusula WHERE, suprimiendo a todas las que no satisfagan la condicin. 3. Despus se eliminan las columnas que no se mencionen en la clusula SELECT. Las restantes se retienen y se ponen en la misma posicin relativa en que se hayan escrito en la clusula SELECT. Incluso puede repetirse alguna si su nombre aparece repetido en esta clusula. 4. La tabla as formada es el resultado final de la sentencia SELECT. 5. La tabla anterior se presenta al usuario con sus filas clasificadas por los valores de la columna mencionada en la clusula ORDER BY.

3.2.- EXPRESIONES.Una expresin es una combinacin de operadores, operandos y parntesis. Cuando el SGBD ejecuta las operaciones indicadas en ella, produce como resultado un nico valor, de forma que en la sentencia, la funcin es sustituida por su valor de retorno. En el formato de SELECT simplificado, las expresiones pueden emplearse en la clusula SELECT en vez de los nombres de columnas, y en la clusula WHERE en la formulacin del predicado o condicin, dnde uno o ambos de los valores a comparar pueden ser el resultado de evaluar una expresin.

Dep. de Informtica

15

I.E.S. TRASSIERRA - Crdoba

SQL

Los operandos pueden ser nombres de columnas, constantes, funciones, registros especiales (USER, por ejemplo) u otras expresiones.

3.2.1.- Operadores.Los operadores actan sobre datos homogneos. Los hay unarios, que actan sobre un nico operando (por ejemplo 2), pero la mayora son binarios actuando sobre dos operandos. Segn el tipo de datos con los que operan, los operadores se clasifican en:

3.2.1.1.- Aritmticos. Se usan para sumar, restar, multiplicar y dividir valores numricos o para hacerlos negativos. El resultado de la operacin es siempre un nmero. Operador Funcin +,Suma y resta Ejemplo SELECT FROM WHERE SELECT FROM WHERE SELECT FROM

+,-

Positivo y negativo

*, /

Multiplicacin y divisin

salar+comis temple sysdate fecin > 365; * temple comis > -1; salar*12 "Salario anual" temple;

3.2.1.2.- Alfanumricos. Operan sobre cadenas de caracteres. Solo existe el operador de concatenacin alfanumrica que se escribe con dos rayas verticales (||) que permite unir dos cadenas. Por ejemplo: SELECT 'Departamento de ' || nomde FROM tdepto;

3.2.1.3.- De fecha.Con operandos de tipo fecha pueden operar los operadores + y -, segn las siguientes tres operaciones: Operacin fecha + <num> fecha - <num> fecha1 fecha2 Valor devuelto La fecha incrementada en <num> das. La fecha disminuida en <num> das. El nmero de das transcurridos entre dos fechas. Si fecha1 es mayor que fecha2, el nmero devuelto ser positivo, y en caso contrario negativo. sysdate + 7 "Dentro de 7 das" dual ;
16

Ejemplos:
Dep. de Informtica

SELECT FROM

I.E.S. TRASSIERRA - Crdoba

SQL

SELECT FROM

fecin fecna "Edad de ingreso en das" temple ;

Si necesitamos usar una constante de tipo fecha, la nica forma es escribiendo la fecha como una cadena y convirtindola a fecha con la funcin TO_DATE: SELECT FROM sysdate TO_DATE('17/10/01') dual ;

En estos ejemplos se usa la tabla DUAL. sta se crea automticamente en Oracle y est accesible para todos los usuarios. Contiene una sola columna llamada DUMMY definida como VARCHAR2(1) y contiene una fila con el carcter "X". Se usa para acceder a una variable de entorno sin necesidad de acceder a datos reales de las tablas. A nosotros nos ser de mucha utilidad para experimentar con operandos y funciones de tipo fecha a partir de la fecha actual (SYSDATE). Mas adelante estudiaremos las funciones para manipular valores de tipo fecha (DATE).

3.2.1.4.- De comparacin general.Se utilizan en los predicados condicionales para comparar una expresin con otra. El resultado puede ser verdadero TRUE, falso FALSE o desconocido UNKNOW Operador Descripcin = Igualdad Ejemplo SELECT * FROM tdepto WHERE numde = 110; SELECT * FROM tdepto WHERE numde <> 110; SELECT * FROM tdepto WHERE numde > 110; SELECT * FROM tdepto WHERE numde < 110; SELECT * FROM tdepto WHERE numde >= 110; SELECT * FROM tdepto WHERE numde <= 110;

<>, !=

No igual

>

Mayor

<

Menor

>=

Mayor o igual

<=

Menor o igual

Si alguno de los comparandos, o ambos, son nulos, el predicado toma el valor desconocido. El segundo comparando puede ser otra select, pero se especificar entre parntesis y producir como resultado un nico valor (1 fila y 1 columna). Si devuelve una tabla vaca, el predicado en que participa toma el valor desconocido.

Dep. de Informtica

17

I.E.S. TRASSIERRA - Crdoba

SQL

Ejemplo: Obtener el nombre de los empleados cuyo sueldo cuadruplica al menos al del empleado 550. SELECT FROM WHERE nomem temple salar > (

SELECT FROM WHERE

salar *4 temple numem = 550) ;

Que tambin podra haberse formulado as: SELECT FROM WHERE nomem temple salar/4 < (

SELECT FROM WHERE

salar temple numem = 550) ;

Pero sera menos eficiente al tener que dividir por 4 todas las tuplas de la tabla TEMPLE. Ojo.- Si en vez del empleado 550 se tratase del 560, al no existir ese empleado, la SELECT devolvera una tabla vaca y el resultado final tambin sera una tabla vaca. Resulvanse los ejercicios propuestos nmeros 1 al 9.

3.2.1.5.- De comparacin de cadenas. EI operador LlKE se utiliza en comparaciones de cadenas de caracteres con un patrn de bsqueda. Su sintaxis es: <expresin> [NOT] LIKE <cadena> Mientras el operador = buscara cadenas de caracteres idnticas, el operador LIKE busca cadenas de caracteres que contengan la porcin de la cadena indicada. Para realizar las bsquedas con LIKE se utilizan los caracteres comodines '%' y '_': % (porcentaje) sustituye a cualquier cadena de 0 o ms caracteres. _ (subrayado) sustituye a cualquier carcter, pero solo a uno. Ejemplos: LIKE 'Director' LIKE 'M%' LIKE '%Z%' LIKE '_T%'

la cadena Director cualquier cadena que empiece por M. cualquier cadena que contenga una Z cualquier cadena cuyo segundo carcter sea una T

Ejemplo: Listar el nombre y salario de los empleados cuyo nombre acabe en 'a'. SELECT nomem, salar FROM temple WHERE nomem LIKE '%A';

3.2.1.6.- De comparacin lgica.-

Dep. de Informtica

18

I.E.S. TRASSIERRA - Crdoba

SQL

El operador BETWEEN permite hallar si un valor est o no comprendido entre otros dos, ambos inclusive. Su formato es: <Exp_1> [NOT] BETWEEN <Exp_2> AND <Exp_3> Si se omite NOT, el predicado es verdadero si el valor de la <Exp_1> est comprendido entre el de la <Exp_2> y el de la <Exp_3>, ambos inclusive. Si se especifica NOT, el predicado es verdadero cuando no est comprendido en ese intervalo. Vamos a verlo un poco ms en detalle: Si escribimos: V1 BETWEEN V2 AND V3 Si ninguno de los valores, V1 , V2 o V3, es nulo, el predicado es verdadero si Vl es mayor o igual que V2 y menor o igual que V3, En otro caso es falso. Normalmente, V2 ser menor o igual que V3, Si as no fuera, el predicado ser falso para todos los valores de Vl. Si alguno de los valores, V1, V2 o V3, es nulo, el predicado toma el valor desconocido. Supongamos ahora: V1 NOT BETWEEN V2 AND V3 Si ninguno de los valores, V1 , V2 o V3, es nulo, el predicado es verdadero si V1 es, o bien menor que V2, o bien mayor que V3, En otro caso es falso. Por tanto si V2 es igual o mayor que V3, el predicado se satisface para cualquier valor de V1 (siempre es verdadero). Si V1 es nulo, el predicado es desconocido. Si Vl no es nulo: - Si V2 y V3 son nulos, el predicado es desconocido, - Si V2 es nulo y V3 no, el predicado es verdadero si V1 es mayor que V3, En otro caso es desconocido. - Si V3 es nulo y V2 no, el predicado es verdadero si V1 es menor que V2, Si no, es desconocido. Estos predicados son equivalentes a otros compuestos con los operadores lgicos AND y OR que se vern ms adelante, as el predicado: V1 BETWEEN V2 AND V3 y es equivalente a: (V1 > = V2) AND (V1 < = V3) (V1 < V2) OR (V1 > V3)

V1 NOT BETWEEN V2 AND V3 equivale a:

Ejemplos: 1).- Obtener por orden alfabtico los nombres de los empleados cuyo salario est entre 250000 y 300000 pts.
Dep. de Informtica 19

I.E.S. TRASSIERRA - Crdoba

SQL

SELECT FROM WHERE ORDER BY Resultado:

nomem temple salar BETWEEN 250000/166.386 AND 300000/166.386 nomem ;

NOMEM DIEZ, AMELIA : : VEIGA, JULIANA

(7 registros)

2).- Obtener por orden alfabtico los nombres y salarios de los empleados cuyo salario dividido por su nmero de hijos cumpla una, o ambas, de las dos condiciones siguientes: - Que sea inferior a 720 euros. - Que sea superior al doble de su comisin. SELECT FROM WHERE ORDER BY nomem, salar temple salar / numhi NOT BETWEEN 720 AND 2 * comis nomem ;

En la ejecucin de esta sentencia se presentarn errores al dividir por numhi, pues ste vale cero en algunas filas. Por ello, ser necesario reformular la consulta: SELECT nomem, salar FROM temple WHERE salar NOT BETWEEN numhi * 720 AND numhi * 2 * comis ORDER BY nomem ; Obsrvese que si en alguna fila el valor de la expresin ( 720 * numhi) no es menor que el de (2 * numhi * comis), la fila cumple las condiciones expresadas y debe aparecer en el resultado. Este es el caso de MARCOS PREZ, y es conveniente asegurarnos que es eso lo que se busca. Los operadores ANY y ALL permiten cuantificar un predicado de comparacin. Su formato es: <exp> <operador_relacional> ANY / <lista_expres.> / ALL (subselect) A pesar de que se ha dicho que una SELECT subordinada debe devolver un nico valor, puede devolver varios si va precedida por ANY o ALL. En este caso, el resultado de la subselect debe ser una tabla con una sola columna con una o ms filas. Con ALL, el predicado cuantificado es verdadero si la comparacin es verdadera para todos y cada uno de los valores de la lista, o resultantes de la sentencia subordinada. Con ANY, el predicado cuantificado es verdadero si la comparacin es verdadera para uno cualquiera de los valores. Veamos con ms detalle el comportamiento de estos operadores al usar subselect:

Dep. de Informtica

20

I.E.S. TRASSIERRA - Crdoba

SQL

Si se especifica ALL: Si la sentencia subordinada devuelve una tabla vaca, se conviene en que el predicado cuantificado toma el valor verdadero. Si devuelve uno o ms valores, y alguno de ellos es nulo, e1 predicado cuantificado puede ser: - Falso, si para alguno de los valores no nulos la comparacin es falsa. - Desconocido, si la comparacin es verdadera para todos los valores no nulos. Si devuelve uno o ms valores y ninguno de ellos es nulo, el predicado cuantificado es verdadero si la comparacin lo es para todos los valores. En caso contrario es falso.

Si se especifica ANY. Si la sentencia subordinada devuelve una tabla con cero filas (vaca), se conviene en que el predicado cuantificado toma el valor falso. Si devuelve una o ms filas, y alguno de los valores es nulo, el predicado cuantificado puede ser: - Verdadero, si para alguno de los valores no nulos la comparacin es Verdadera - Desconocido, si para todos los valores no nulos, la comparacin es falsa. Si devuelve una o ms filas, y ninguna de ellas contiene nulo, el predicado es Verdadero si la comparacin es Verdadera para alguno de los valores. En caso contrario es falso.

Ejemplos: 1).- Obtener por orden alfabtico los nombres de los empleados cuyo salario supera al mximo salario de los empleados del departamento 122. SELECT FROM WHERE nomem temple salar > ALL ( SELECT FROM WHERE ORDER BY nomem ; Resultado:
NOMEM LOPEZ, ANTONIO PEREZ, MARCOS .

salar temple numde = 122 )

Esta consulta podra formularse con la funcin MAX que se ver en el tema siguiente. Supongamos que formulamos la misma consulta para el departamento 150: SELECT FROM WHERE
Dep. de Informtica

nomem temple salar > ALL ( SELECT

salar
21

I.E.S. TRASSIERRA - Crdoba

SQL

FROM ORDER BY nomem ;

temple WHERE numde = 150)

Como el departamento 150 no existe, la SELECT subordinada devuelve como resultado una tabla vaca. Por tanto, todas las filas satisfacen el predicado cuantificado y el resultado final es una relacin de todos los empleados por orden alfabtico. 2).- Obtener por orden alfabtico los nombres de los empleados cuyo salario supera en tres veces y media o ms al mnimo salario de los empleados del departamento 122. SELECT FROM WHERE nomem temple salar > = ANY (

SELECT FROM WHERE

salar * 3.5 temple numde = 122)

ORDER BY nomem ; Se podra formular de otra forma con la funcin MIN que se ver ms adelante. Resultado:
NOMEM LOPEZ, ANTONIO .

Repitamos esta consulta para un departamento inexistente: SELECT FROM WHERE nomem temple salar > = ANY (

SELECT FROM WHERE

salar * 3.5 temple numde = 150 ) ;

Como el resultado de la subselect es una tabla vaca, el predicado cuantificado es falso. El resultado final, por tanto, es tambin una tabla vaca. 3).- Obtener por orden alfabtico los nombres y salarios de los empleados cuyo salario es inferior a la comisin ms alta existente. SELECT FROM WHERE nomem, salar temple salar < ANY (SELECT FROM ORDER BY nomem ; Resultado:
NOMEM SANTOS, SANCHO SALAR 601

comis temple)

El operador IN sirve para saber si un valor se encuentra entre una lista de valores dada. Su sintaxis es: <Exp> [NOT] IN <lista de constantes>

Dep. de Informtica

22

I.E.S. TRASSIERRA - Crdoba

SQL

Si el valor de la <Exp> no es nulo y es igual a alguno de los valores de la lista, el predicado es verdadero, y si no, es falso. Si la <Exp> es nula, el predicado toma el valor desconocido. En vez de la <lista de constantes> puede especificarse, entre parntesis, una sentencia SELECT simplificada, la cual deber devolver una tabla con una sola columna y no incluir la clusula ORDER BY. El alumno debera comprobar las siguientes equivalencias: IN NOT IN Ejemplos: 1).- Obtener por orden alfabtico los nombres de los empleados cuya extensin telefnica es 250 750. SELECT FROM WHERE ORDER BY Resultado:
NOMEM ALBA, ADRIANA LARA, DORINDA VAZOUEZ, HONORIA .

es equivalente a es equivalente a

= ANY != ALL

nomem temple extel IN (250, 750) 1;

2).- Obtener por orden alfabtico los nombres de los empleados que trabajan en el mismo departamento que Pilar Glvez o Dorotea Flor. SELECT FROM WHERE nomem temple numde IN (

SELECT FROM WHERE

numde temple nomem IN ('GALVEZ, PILAR', 'FLOR, DOROTEA') )

ORDER BY nomem ; Resultado:


NOMEM ALBA, ADRIANA : LOPEZ, ANTONIO .

(6 registros)

El operador NULL permite saber si un atributo de una tupla determinada es o no nulo. En caso afirmativo el operador NULL devuelve verdadero y falso en caso contrario. No devuelve desconocido, pues o es Nulo o no lo es. Caso de aadir la palabra NOT, el valor devuelto ser el contrario. Su sintaxis es: <col> IS [NOT] NULL
Dep. de Informtica 23

I.E.S. TRASSIERRA - Crdoba

SQL

Ejemplo: Listar los nombres y sueldos totales (salario ms comisin) de los empleados que cobran comisin: SELECT FROM WHERE nomem, salar+comis "Salario mensual" temple comis IS NOT NULL;

El operador EXISTS permite detectar si el resultado de una subselect es o no una tabla vaca. Devuelve verdadero si la sentencia subordinada no es una tabla vaca. Su sintaxis es: EXISTS (subselect) Ejemplo: Listar los nombres y salarios de los empleados del departamento 112, pero solo si hay alguno de ellos con un salario superior a 2000 euros. SELECT nomem, salar FROM temple WHERE numde=112 AND EXISTS( SELECT * FROM WHERE

temple numde=112 AND salar>2000 ) ;

3.2.1.7.- Operadores lgicos.Los predicados vistos hasta ahora son simples. Los compuestos son combinaciones de otros predicados, simples o compuestos, con los operadores lgicos AND, OR y NOT. AND es el operador lgico de conjuncin, OR el de disyuncin y NOT el de negacin. Los dos primeros se aplican a dos operandos (son binarios) y el ltimo a uno solo (unario), y en todos los casos los operandos son otros predicados. Un predicado compuesto, lo mismo que uno simple, puede tomar los valores Verdadero, Falso o Desconocido. Cuando se especifica AND, el resultado es verdadero si sus dos operandos lo son. Cuando se especifica OR, es verdadero si lo es uno cualquiera de sus dos operandos al menos. El resultado de NOT es verdadero si el operando al que se aplica es "Falso". Obsrvese que las palabras AND y NOT pueden usarse en otros predicados sin desempear el papel de operadores lgicos. En los predicados BETWEEN se usa la palabra AND, y la palabra NOT puede aparecer en los predicados BETWEEN, NULL, IN y LlKE, todos ellos simples. As, por ejemplo, (NOT <col> IS NULL) es un predicado compuesto y (<col> IS NOT NULL) es simple y ambos son adems equivalentes. El valor devuelto por estos operandos lgicos, teniendo en cuenta la posibilidad de valores nulos ya se vio cuando se estudiaron los valores nulos en el modelo relacional y no se repiten para no ser reiterativos, pero el alumno debera repasarlos para entender los resultados de las consultas sobre valores nulos.

Dep. de Informtica

24

I.E.S. TRASSIERRA - Crdoba

SQL

Ejemplos: 1).- Obtener por orden alfabtico los nombres y comisiones de los empleados del departamento 110 si hay en l algn empleado que tenga comisin. SELECT FROM WHERE nomem, comis temple numde = 110 AND EXISTS ( SELECT FROM WHERE

* temple numde = 110 AND comis IS NOT NULL)

ORDER BY nomem ; Resultado:


NOMEM CAMPOS, ROMULO MORAN, CARMEN PEREZ, MARCOS COMIS

301

2).- Obtener los nombres, salarios y fechas de ingreso de los empleados que o bien ingresaron antes del 1980 o bien tienen un salario inferior a 1100 euros. Clasificarlos por fecha y nombre. SELECT FROM WHERE ORDER BY Resultado:
NOMEM PONS, CESAR PEREZ, JULIO : : SANTOS, SANCHO MUOZ, AZUCENA SALAR 1863 2644 FECIN 17/02/65 16/01/69

nomem, salar, fecin temple fecin < '01-01-1980' OR salar <1100 fecin, nomem ;

601 1052

22/01/01 15/10/01

(11 registros)

3).- Obtener por orden alfabtico los nombres de los departamentos que no sean de Direccin ni de Sectores. SELECT FROM WHERE ORDER BY nomde tdepto NOT (nomde LIKE '%DIREC%' OR nomde LIKE '%SECTO%') nomde ;

Esta sentencia podr formularse tambin as: SELECT FROM WHERE ORDER BY Resultado:
Dep. de Informtica 25

nomde tdepto nomde NOT LIKE '%DIREC%' AND nomde NOT LIKE '%SECTO%' nomde ;

I.E.S. TRASSIERRA - Crdoba NOMDE . FINANZAS ORGANIZACION PERSONAL PROCESO DE DA TOS

SQL

4) Obtener por orden alfabtico los nombres y salarios de los empleados que o bien no tienen hijos y ganan ms de 1200 euros, o bien tienen hijos y ganan menos de 1800 euros. SELECT FROM WHERE ORDER BY Resultado: nomem, salar temple (numhi = 0 AND salar > 1200 ) OR (numhi < > 0 AND salar < 1800 ) nomem ;

19 filas seleccionadas.

3.3.- EJERCICIOS PROPUESTOS.Notas.- 1.- Antes de resolver los ejercicios propuestos es conveniente que el/la alumno/a se familiarice con
las tablas ejemplo a las que se refieren los mismos, realizando el esquema Entidad/Relacin. 2.- En los enunciados, por salario nos referimos a la columna salar y por sueldo a la suma de salario y comisin).

1.- Hallar, por orden alfabtico, los nombres de los departamentos cuyo director lo es en funciones y no en propiedad. 2.- Obtener un listn telefnico de los empleados del departamento 121 incluyendo nombre de empleado, nmero de empleado y extensin telefnica. Por orden alfabtico. 3.- Hallar la comisin, nombre y salario de los empleados con ms de tres hijos, clasificados por comisin, y dentro de comisin por orden alfabtico. 4.- Obtener salario y nombre de los empleados sin hijos por orden decreciente de salario y por orden alfabtico dentro de salario 5.- Obtener la relacin alfabtica de los departamentos con presupuesto inferior a 30000 euros. El nombre de los departamentos se preceder de la cadena "Departamento de "; 6.- Suponiendo que en los prximos tres aos el coste de vida va a aumentar un 6 % anual y que se suben los salarios en la misma proporcin, hallar para los empleados con ms de 4 hijos su nombre y su salario anual actual sin comisin, y para cada uno de los prximos tres aos, clasificados por orden alfabtico. 7.- Hallar por orden alfabtico los nombres de los empleados tales que si se les da una gratificacin de 60 euros por hijo, el total de esta gratificacin no supera a la dcima parte del salario. 8.- Para los empleados del departamento 112 con comisin, hallar el nombre y el sueldo total de cada uno (salario ms comisin), por orden de sueldo total decreciente, y por orden alfabtico como criterio secundario de ordenacin.
Dep. de Informtica 26

I.E.S. TRASSIERRA - Crdoba

SQL

9.- Obtener los nmeros de los departamentos en los que haya algn empleado cuya comisin supere al 20 % de su salario. 10.- Hallar por orden de nmero de empleado el nombre y sueldo (salario ms comisin) de los empleados cuyo sueldo supere al salario mnimo en 600 euros mensuales. 11.- Para los empleados que no tienen comisin obtener por orden alfabtico el nombre y el cociente entre su salario y el nmero de hijos. 12.- Se desea hacer un regalo de un 1 % del salario a los empleados en el da de su onomstica. Hallar por orden alfabtico los nombres y cuanta de los regalos para los que celebren su santo el da de San Honorio. 13.- Obtener por orden alfabtico los nombres y salarios de los empleados del departamento 111 que tienen comisin, pero solo si la comisin de alguno de ellos supera al 15 % de su salarlo.

Dep. de Informtica

27

I.E.S. TRASSIERRA - Crdoba

SQL

TEMA 4.- FUNCIONES.4.1.- Introduccin. 4.2.- Funciones de fila. 4.2.1.- Funciones numricas. 4.2.2.- Funciones de caracteres. 4.2.3.- Funciones de fechas. 4.2.4.- Funciones de conversin. 4.2.5.- Otras funciones 4.3.- Funciones de columna. 4.4.- Agrupamiento de filas. Clusulas GROUP BY y HAVING. 4.5.- Ejercicios propuestos.

4.1.- INTRODUCCIN.Una funcin realiza ciertas operaciones sobre uno o varios valores y devuelve un valor nico. Los valores sobre los que opera se llaman argumentos. Las funciones se especifican mediante una palabra reservada seguida de los argumentos entre parntesis y separados por comas. La funcin SYSDATE, como excepcin, no lleva argumentos (ni parntesis), el resto utilizan uno, dos, o mas argumentos algunos de los cuales pueden ser opcionales, los que, si se omiten, toman valores por defecto. Las funciones permiten realizar con los datos funciones adicionales a las vistas hasta ahora, pudiendo aparecer como operandos en las expresiones en: Clusula SELECT Clusula WHERE Clusula ORDER BY

Si se invoca a una funcin con un tipo de dato distinto al que espera como argumento, se convierte automticamente y de forma implcita en el que la funcin espera. Las funciones pueden anidarse a cualquier nivel, lo que permite la construccin de expresiones muy complejas. Las funciones suelen dividirse en: Funciones de fila, simples o escalares. Funciones de columna, grupo o agregado. Mientras las primeras operan con valores nicos (la columna x de la tupla y), las segundas lo hacen sobre varios valores (la columna x en varias o todas las tuplas).

Dep. de Informtica

28

I.E.S. TRASSIERRA - Crdoba

SQL

4.2.- FUNCIONES DE FILA.A continuacin veremos las funciones de fila simple que operan sobre un nico valor y las agruparemos en funcin del tipo de dato de sus argumentos:

4.2.1.- Funciones numricas.Son aquellas que aceptan como entrada argumentos numricos y devuelven valores numricos.
Funcin Sintaxis Devuelve/Descripcin

ABS ACOS ASIN ATAN CEIL COS COSH EXP FLOOR LN LOG MOD POWER

ABS(n) ACOS(n) ASIN(n) ATAN(n,[m]) CEIL(n) COS(n) COSH(n) EXP(n) FLOOR(n) LN(n) LOG(m, n) MOD(m, n) POWER(m, n)

ROUND SIGN

ROUND(n[,m]) SIGN(n)

SIN SINH SQRT TAN TANH TRUNC

SIN(n) SINH(n) SQRT(n) TAN (n) TANH(n) TRUNC(n[,m])

Valor absoluto de n Arco coseno de n. Arco seno de n. Tangente del arco de n, o del arco entre n y m. Entero inmediatamente superior o igual a n Coseno de n en radianes Coseno hiperblico de n Nmero e elevado a la potencia de n Entero inmediatamente inferior o igual a n Logaritmo natural de n. Siendo n > 0. Logaritmo en base m de n. La base m debe ser un numero positivo distinto de 0 1.n tambin debe ser positivo. Resto de m dividido por n. Potencia: m elevado a la potencia de n. La base m y el exponente n puede ser cualquier tipo de nmero, pero si m es negativo, n debe ser un entero Redondeo: n redondeado a m decimales. Si se omite, m = 0. Signo: Si n<0 devuelve -1. Si n=0 devuelve 0. Si n>0 devuelve 1. Seno de n expresado en radianes Seno hiperblico de n Raz cuadrada de n. El valor de n no puede ser negativo Tangente de n. Tangente hiperblica de n. Truncado: n truncado a m decimales. Por defecto m = 0.

Ejemplos: 1).- Listar los nombres y nmeros de departamento de los empleados que pertenecen a departamentos pares. SELECT nomem, numde FROM temple WHERE MOD(numde, 2) = 0 ; 2).- Para los empleados que cobran comisin, listar su nombre y su comisin diaria redondeada con 2 decimales. SELECT momem, ROUND(comis*12/365, 2) FROM temple WHERE comis IS NOT NULL ;
Dep. de Informtica 29

I.E.S. TRASSIERRA - Crdoba

SQL

4.2.2.- Funciones de caracteres.Estas funciones suelen manejar parmetros de tipo carcter y pueden devolver tanto un valor de tipo carcter como un nmero. Funcin
ASCII CHR CONCAT INITCAP

Sintaxis
ASCII(char) CHR(n) CONCAT(char1, char2) INITCAP(char)

Devuelve/ Descripcin
Nmero: representacin numrica de la cadena char. en el juego de caracteres usado en la B.D., Carcter cuyo numero correspondiente en binario es n. Cadena char1 concatenada con char2. Es equivalente al operador || . Cadena char con la primera letra de cada palabra en mayscula el resto en minsculas. Las palabras van delimitadas por espacios en blanco v no son alfanumricas. Nmero que indica la posicin en char1 de la m_sima ocurrencia de char2 en char1, empezando la bsqueda en la posicin n. Si se omiten n o m se les asigna por defecto el valor 1. Nmero idntico a INSTR excepto que n y el valor devuelto se expresa en bytes en vez de en caracteres. Para una B.D. con juego de caracteres de byte simple INSTR e INSTRB son equivalentes. Nmero que expresa la longitud de char en caracteres, incluyendo los blancos. Nmero que expresa la longitud de char en bytes. Si char es nulo, esta funcin devuelve un nulo. Para una B.D. con juego de caracteres de byte simple LENGTH y LENGTHB son equivalentes. Cadena char con todas las letras en minsculas. Cadena char1 rellenado a la izquierda hasta la longitud indicada por n, con la cadena indicada en char2. Si char2 se omite, se rellena con blancos. Cadena char en la que se han eliminado los caracteres a la izquierda hasta encontrar el primer carcter que no est en muestra. Cadena char, despus de reemplazar car_bus por car_repl. Cadena char1 rellenado a la derecha hasta la longitud indicada en n, con el carcter indicado en char2. Si char2 se omite rellena con blancos. Cadena char previa eliminacin de los caracteres a la derecha de char hasta encontrar el primer carcter que no este en muestra. Cadena de caracteres conteniendo la representacin fontica de char. Las comparaciones se basan en sonidos en Ingls. Subcadena de char, empezando en la posicin indicada en m, y tomando el nmero de caracteres indicado en n. O hasta el final si se omite n. Cadena char con todas las ocurrencias "de" reemplazadas por lo indicado en "a". Cadena char con todas las letras en maysculas.

INSTR

INSTR(char1, char2, [,n[,m]])

INSTRB

INSTRB(charl, char2, [,n[,m]])

LENGTH LENGTHB

LENGTH (char) LENGTHB (char)

LOWER LPAD

LOWER(char) LPAD(char1,n [,char2])

LTRIM

LTRIM(char[,muestra])

REPLACE RPAD

REPLACE (char, car_bus[,car repl]) RPAD(char1,n [,char2])

RTRIM

RTRIM(char [,muestra]) SOUNDEX (char)

SOUNDEX

SUBSTR

SUBSTR(char,m[,n])

TRANSLATE TRANSLATE(char, de, a) UPPER(char) UPPER

Ejemplos:
Dep. de Informtica 30

I.E.S. TRASSIERRA - Crdoba

SQL

1).- SELECT REPLACE ('El modelo Entidad/Relacin', 'modelo', 'metodo') FROM DUAL; Rdo. El metodo Entidad/Relacin

2).- SELECT TRANSLATE ('El modelo Entidad/Relacin', 'aeiou', 'eioua') FROM DUAL; Rdo. El mudilu Entoded/Rilecon

3).- Mostrar los nombres de los departamentos con la primera letra en maysculas y el resto en minsculas. SELECT INITCAP(nomde) FROM tdepto ; 4).- Listar los nombres propios de todos los empleados, en orden alfabtico. SELECT SUBSTR( nomem, INSTR(nomem, ',') + 1 ) FROM temple ORDER BY 1 ; 5).- Listar los nombres de los departamentos ordenados de mayor a menor longitud del nombre. SELECT nomde FROM tdepto ORDER BY LENGTH(nomde) DESC ;

4.2.3.- Funciones de fechas.Estas funciones operan con argumentos de tipo fecha y devuelven valores de tipo fecha, salvo la funcin MONTHS_BETWEEN que devuelve un nmero.
Funcin Sintaxis Devuelve/Descripcin

ADD_MONTHS LAST_DAY

ADD_ MONTHS(f, n) LAST_DAY(f)

MONTHS_BETWEEN MONTHS_BETWEEN (f1,f2) NEXT_DAY(f, n) NEXT_DAY

ROUND SYSDATE

ROUND (f [, fmt)) SYSDATE

TRUNC

TRUNC (f [, fmt])

Fecha f ms n meses, n puede ser >, = o < que cero. Fecha del ultimo da del mes de la fecha f. Nmero de meses transcurridos entre f1 y f2. Fecha del primer da de la semana indicado en n (1 lunes, 2 martes,..), a partir de la fecha f. Fecha f en formato fmt. Si se omite fmt el valor por defecto es el da 'DD'. Fecha actual y la hora. Sin parmetros. No se puede utilizar esta pseudocolumna /funcin en una restriccin CHECK. Fecha f con la parte de tiempo del da truncado a la unidad especificada en fmt. Si se omite fmt el valor por defecto es el da 'DD'

Mscaras para ROUND y TRUNC con datos de tipo fecha.-

Dep. de Informtica

31

I.E.S. TRASSIERRA - Crdoba

SQL

Las funciones ROUND y TRUNC son especialmente importantes en el manejo de fechas. El redondeo o truncado se realiza a una unidad u otra (ao, da, ..) en funcin del modelo de mscara especificado en fmt (ver sintaxis). A continuacin exponemos los principales formatos, que deben expresarse entre comillas, y la unidades de redondeo o truncado que les corresponden. El modelo por defecto es 'DD', y muestra la fecha redondeada o truncada en formato da. La hora se establece a medianoche.
Modelo de formato CC SCC YYYY SYYY Y IYYY IY I Q MONTH MM WW IW DD DAY O HH MI Unidad de redondeo o truncado Siglo. Ao. (redondeado sobre el 1 de Julio).

Ao ISO

Trimestre (redondeado al da 16 del segundo mes del trimestre). Mes. El da de la semana del primer da del ao. El da de la semana del primer da del ao en formato ISO. Da. Da de comienzo de la semana. Hora. Minuto.

Ejemplos: 1).- Calcular la edad, en aos cumplidos, de los empleados del departamento 130. SELECT FROM WHERE O mejor: TRUNC(( sysdate-fecna)/365) "Edad en aos" temple numde = 130 ;

TRUNC (MONTHS_BETWEEN( sysdate, fecna)/12) "Edad en aos"

2).- Calcular la fecha del prximo domingo. SELECT FROM NEXT_DAY(sysdate, 7) DUAL ;

3).- Calcular los das que quedan hasta fin de mes. SELECT FROM LAST_DAY(sysdate) - sysdate DUAL ;

4).- Devolver el primer da del mes actual. SELECT TRUNC(sysdate, 'MM') FROM DUAL; 4.2.4.- Funciones de conversin.Permiten convertir un tipo de dato en otro.
Dep. de Informtica 32

I.E.S. TRASSIERRA - Crdoba

SQL

Funcin CHARTOROWID

Conversin Convertir un tipo de dato VARCHAR2 a tipo ROWID CONVERT CONVERT(char, car_dest Convierte una cadena un juego de caracteres a [,car_fuen]) otro. Si se omite el juego de caracteres fuente, toma por defecto el de la B.D. HEXTORAW HEXTORAW (char) Convierte un cadena conteniendo dgitos en hexadecimal a un valor RAW RAWTOHEX RAWTOHEX (raw) Convierte un RAW a un valor tipo carcter que contiene el equivalente en hexadecimal ROWIDTOCHAR ROWIDTOCHAR (rowid) Convertir un tipo de dato ROWID a VARCHAR2. De la conversin resulta siempre una cadena de 18 caracteres de longitud. TO_CHAR(f [,formato[, TO_CHAR Convierte una fecha f tipo DATE en un 'parametros nls'] ]) VARCHAR2 con la mscara indicada en formato. Si se omite formato, la fecha se convierte a en un valor VARCHAR2 en el formato de fecha por defecto. Ms adelante veremos los "modelos de formato de fecha". Parametros_nls especfica el lenguaje en el cual se visualizan los nombres y abreviaturas de los meses y das. El parmetro se indica con: 'NLS_DATE_LANGUAGE = idioma'. Si se omite toma el idioma por defecto. (1) TO_CHAR(n [,formato[, TO_CHAR Convierte un nmero de tipo NUMBER en un tipo 'parametros_nls']]) de datos VARCHAR2 con la mscara indicada en formato. Ms adelante veremos los "modelos de formato numricos". 'Parmetros_nls' especifica los caracteres y elementos de formatos de nmeros que se visualiza (separador de decima-les, de grupo, smbolo de la moneda local e ISO). TO_DATE(char [,formato Convierte una cadena tipo VARACHAR2 en un TO_DATE [,'parametros_nls'] ]) valor tipo DATE. El formato es la mscara de la fecha. Si se omite toma el formato por defecto. Si el formato es J para juliano char debe ser un entero. 'Parmetros_nls' tiene la misma funcin que para TO_CHAR en conversin a fechas. No utilizar con TO_DATE un valor tipo DATE como argumento. La fecha que devuelve puede tener un valor diferente que el char original, dependiendo del formato indicado o el activo por defecto. TO_MULTI_BYTE TO_MULTI_BYTE (char) Devuelve char con todos sus caracteres de byte simple convertidos en sus correspondientes caracteres multibyte. Solo se utiliza en 8.D. que utilicen ambos tipos de juegos de caracteres. TO_SINGLE_BYTE TO_SINGLE_BYTE (char) Devuelve char con todos sus caracteres multibyte convertidos en sus correspondientes caracteres de byte simple. Solo se utiliza en B.D. que utilicen ambos tipos de juegos de caracteres. TO_NUMBER( char [,fmt Convierte char de un valor CHAR o VARCHAR2 TO_NUMBER [,'parametros_nls'] ] ) a un tipo de dato NUMBER con el formato especificado
(1) Ejemplo: SELECT TO_CHAR(sysdate, 'dd " de " month " de " yyyy', 'NLS_DATE_LANGUAGE= ENGLISH'); Otros lenguajes para las funciones fecha son: ITALIAN, SPANISH, FRENCH, GERMAN, ..

Sintaxis CHARTOROWID(char)

Mscaras de conversin.Deben proporcionarse las mscaras de conversin en formato numrico adecuadas cuando:
33

Dep. de Informtica

I.E.S. TRASSIERRA - Crdoba

SQL

En una funcin TO_CHAR se cambie un tipo de dato NUMBER a un tipo de dato VARCHAR2. Ejemplo: SELECT TO_CHAR(1.25, '$999D999') FROM dual ;

En una funcin TO_NUMBER se cambie un tipo de dato VARCHAR2 a NUMBER. Como ejemplo vase la diferencia entre las siguientes mscaras: SELECT SELECT TO_NUMBER('1.25', '9999') FROM dual ; TO_NUMBER('1,25', '99D99') FROM dual ;

Los formatos numricos estn compuestos de uno o varios elementos de formatos: Mscara
9 0 $ B MI S PR D (*) G (*) C (*) L (*) , . EEEE RN

Ejemplo
9999

Descripcin

El numero de "9" especifica la cantidad de dgitos que se visualizan. Se visualizan blancos para los ceros a la izquierda. 0999 Visualiza los ceros a la izquierda en esa posicin como ceros en vez de 9990 como blancos, o les da valor de 0 en lugar de blanco. $9999 Antepone como prefijo el signo de dlar. B9999 Devuelve los ceros como blancos, a menos que se indique "O" en la mscara de formato. 9999MI Muestra un "-" despus de los valores negativos. Para los valores positivos muestra un espacio en blanco. S9999 Muestra un "+" para los valores positivos y"." para los negativos en la posicin indicada. 9999PR Muestra los valores negativos entre los signos de menor mayor <>. 99D99 Muestra el carcter decimal en la posicin indicada. Separa la parte entera fraccionara de un numero. 9G999 Muestra el separador de grupo en la posicin indicada. C9999 Muestra el smbolo ISO de la moneda, en la posicin indicada. L999 Muestra el smbolo de la moneda local en la posicin indicada. 9,999 Muestra una coma la posicin indicada. 9.999 Muestra un punto en la posicin indicada y separa la parte entera y la decimal de un numero. 9.999EEEE Muestra el valor en notacin cientfica. RN Devuelve en maysculas o minsculas (m) el valor del nmero en romano. El nmero tiene que ser un entero entre 1 y 3999.

MI y PR solo pueden estar en la ltima posicin de un formato numrico. El formato S slo puede estar en la primera o la ltima posicin. (*) Los caracteres que devuelven los formatos indicados con un asterisco son especificados por los siguientes parmetros de inicializacin de la Base de Datos:
D G C L Carcter Decimal NLS_NUMERIC_CHARACTERS Separador Grupo NLS_NUMERIC_CHARACTERS Smbolo moneda NLS_ISO_CURRENCY Smbolo moneda NLS_ISO_CURRENCY

Los formatos tipo fecha se utilizan en las siguientes situaciones: En la funcin TO_CHAR para convertir un valor tipo DATE a un formato diferente al formato por defecto.
Dep. de Informtica 34

I.E.S. TRASSIERRA - Crdoba

SQL

En la funcin TO_DA TE para convertir un valor tipo carcter en un formato diferente del formato por defecto. La fecha por defecto se especifica explcitamente con el parmetro NLS_DATE_FORMAT o implcitamente con el parmetro de inicializacin NLS_TERRITORY. Se puede sobreescribir el valor de estos parmetros para la sesin actual con el comando ALTER SESSION. Mscara
SCC CC YYYY SYYYY IYYY YYY YY Y IYY IY I Y,YYY SYEAR YEAR RR BC AD B.C. A.D. Q MM RM MONTH MON WW IW DDD DD D DAY DY J AM PM A.M. P.M HH HH12 HH24 MI SS SSSSS

Descripcin
Indica el siglo. Si se especifica S, aparece el prefijo en las fechas de antes de Cristo. 4 Dgitos del ao. S antepone un si es antes de Cristo. 4 Dgitos del ao en formato ISO estndar. Los ltimos 3, 2 o 1 dgitos del ao Los ltimos 3, 2 o 1 dgitos del ao en formato ISO estndar El ao, con una coma en la posicin indicada. El nmero de ao nombrado. El prefijo S se antepone si es antes de Cristo. Los ltimos dos dgitos del ao. Se usa para aos de otros siglos. Indicador antes/despus de Cristo. Indicador antes/despus de Cristo separado por puntos. Trimestre del ao. Nmero de Mes. Nmero de Mes en romano. Nombre del mes alineado con blancos de hasta 9 caracteres de longitud. Nombre del da abreviado a tres letras. Nmero de la semana del ao. Nmero de la semana del ao en ISO estndar. Nmero de da del ao. (1-366). Nmero del da del mes (1-31). Nmero de da de la semana. (1-7). Nombre del da de la semana hasta 9 caracteres. Nombre del da de la semana abreviado. Fecha en Juliano. Los nmeros especificados deben ser enteros. Indicador de Meridiano. Indicador de Meridiano separado por puntos. Hora del da (1-12). Hora del da (0-23). Minutos (0-59). Segundos (0-59). Segundos transcurridos desde medianoche. (0-86399).

Las especificaciones de algunos formatos, (MONTH, MON, DAY, DY, BC/AD, B.C./A.D., AM/PM) dependen de los siguientes parmetros de inicializacin:
NLS_DATE_LENGUAGE NLS_TERRITORY NLS_LANGUAGE

Ejemplos: 1).- Mostrar los das transcurridos desde el 1 de enero del 2000 hasta el da de hoy. SELECT sysdate - TO_DATE('01012000', 'ddmmyyyy') FROM dual;

2).- Listar en una sola columna un cdigo formado por el da de nacimiento y el nmero de empleado de todos los empleados.

Dep. de Informtica

35

I.E.S. TRASSIERRA - Crdoba

SQL

SELECT FROM

nomem || TO_CHAR(fecna)|| TO_CHAR(numem) temple ;

3).- Listar los nombres de los empleados del departamento 130 junto a su fecha de ingreso con el siguiente formato: 12 de Octubre de 1987. SELECT FROM WHERE nomem, TO_CHAR(fecin, 'DD "de " Month "de " YYYY') temple numde = 130 ;

4.2.5.- Otras funciones.Funcin DUMP Sintaxis Descripcin DUMP(expr [,fornato Devuelve un VARCHAR2 conteniendo el [,posc_comienzo [,long]]] ) cdigo del tipo de dato, la longitud en bytes y la representacin interna del dato. El argumento formato indica la notacin en la que se visualiza el resultado. Formato puede tener los siguientes valores: 8 Devuelve el resultado en notacin octal. 10 Devuelve el resultado en notacin decimal. 16 Devuelve el resultado en notacin hexadecimal. 17 Devuelve el resultado en formato carcter simple. GREATEST(exp [,exp2]...) Devuelve el mayor valor de una lista de expresiones. Compara carcter a carcter. El tipo de dato es siempre VARCHAR2.. LEAST(expr [,expr2]...) Devuelve el menor valor de una lista de expresiones. Compara carcter a carcter. El tipo de dato es siempre VARCHAR2.. NVL(expr1,expr2) Indica el valor que ha de tener expr1 cuando en su contenido aparezcan nulos. El tipo de dato que retorna expr2 es siempre el mismo de expr1. VSIZE (expr) Devuelve el numero de bytes que ocupa la representacin interna del dato. DECODE (expr, val1, Dentro de una expresin evala los valores de la cod1,.. valn, codn, codf) lista y los cambia por el cdigo correspondiente.

GREATEST

LEAST

NVL

VSIZE DECODE

Ejemplos: 1).- Mostrar el tipo de dato, la longitud en bytes y la representacin interna (en hexadecimal) de la columna numem de la tabla temple de los empleados con nmero de empleado superior a 450; SELECT DUMP (numem, 16) FROM temple WHERE numem > 450 ; 2).- Para cada empleado, listar el mayor valor (en orden alfabtico) de entre el apellido y el nombre propio. SELECT GREATEST( SUBSTR( nomem, 1, INSTR( nomem, ',' ) - 1 ), SUBSTR( nomem, INSTR( nomem, ',' ) + 2 ) ) FROM temple ;

Dep. de Informtica

36

I.E.S. TRASSIERRA - Crdoba

SQL

3).- Mostrar el nombre y nmero de hijos de todos los empleados. Pero si no tiene hijos, en lugar de cero se mostrar "Sin hijos", y si tiene 3 se mostrar "Familia numerosa". SELECT FROM nomem, DECODE(numhi, 0, 'Sin hijos', 3, 'Familia numerosa', numhi) temple ;

4).- Visualizar el sueldo total anual (salario ms comisin) de los empleados del departamento 110. SELECT ( salar + NVL(comis, 0) ) * 12 FROM temple WHERE numde = 110 ;

4.3.- FUNCIONES DE COLUMNA.Estas funciones tratan como argumento a una coleccin de valores y, a partir de ellos, producen un nico resultado. Son las siguientes:
Funcin AVG COUNT MAX MIN STDEV SUM VARIANCE Sintaxis AVG(n) COUNT(*/<Exp>) MAX(<Exp>) MIN(<Exp>) STDEV(<Exp>) SUM(<Exp>) VARIANCE(<Exp>) Valor devuelto Media de n (ignorando los nulos) Nmero de filas de la consulta. Mximo valor de la expresin. Mnimo valor de la expresin. Desviacin tpica de la expresin sin tener en cuenta los valores nulos. Suma de los valores de la expresin. Varianza de la expresin sin tener en cuenta los valores nulos.

Si la coleccin de valores es vaca, la funcin COUNT devuelve un cero y las dems funciones un valor Nulo. Esto puede ocurrir, por ejemplo, si el predicado de WHERE no es satisfecho por ninguna fila. Las funciones MAX y MIN admiten cualquier tipo de argumento, en COUNT no tiene importancia el tipo de argumento, y en el resto de funciones los argumentos son numricos. Las funciones de columna aceptan opcionalmente las clusulas DISTINCT y ALL: DISTINCT: Hace que la funcin solo considere los distintos valores de la expresin. ALL: Hace que la funcin considere todos los valores recuperados, incluyendo duplicados. Es la opcin por defecto Comprubese el distinto resultado de las siguientes sentencias: SELECT FROM SELECT FROM COUNT(*) "Nmero de extensiones telefnicas" temple ; COUNT(DISTINCT extel) "N de extensiones telefnicas distintas" temple ;

Dep. de Informtica

37

I.E.S. TRASSIERRA - Crdoba

SQL

En ORACLE, los valores nulos no intervienen en el clculo de las funciones de columna, por lo que las siguientes sentencias no siempre devuelven el mismo resultado: SELECT SELECT AVG(comis) SUM(comis) / COUNT(*)

Ejemplos: 1).- Hallar en nmero de empleados del departamento 112, as como cuantas comisiones distintas hay, y la suma y media de sus comisiones. SELECT FROM WHERE Resultado:
COUNT(*) 7 COUNT(DISTINCT COMIS) 4 SUM(COMIS) 3546 AVG(COMIS) 591

COUNT(*), COUNT(DISTINCT comis), SUM(comis), AVG(comis) temple numde = 112 ;

El valor calculado por AVG es la media de las comisiones sin incluir a los empleados cuya comisin es nula, es decir (3546 / 6 = 591), pues hay un empleado con comisin nula. Para hallar la media teniendo en cuenta a todos los empleados, incluyendo los que tienen comisin nula, podra escribirse: SELECT FROM WHERE Resultado:
SUM(COMIS)/COUNT(*) 506,57143

SUM(comis) / COUNT(*) temple numde = 112 ;

2).- Hallar cuntas comisiones diferentes hay, y su valor medio. SELECT FROM Resultado:
COUNT(DISTINCTCOMIS) 6 AVG(COMIS) 588,14286

COUNT(DISTINCT comis), AVG(comis) temple;

3).- Hallar la media del nmero de hijos de los empleados del departamento 123. SELECT FROM WHERE AVG (numhi) temple numde = 123 ;

Como este departamento no existe, el resultado es un valor nulo 4).- Hallar la edad media, en aos de los empleados del departamento 110. SELECT AVG( TRUNC ( MONTHS_BETWEEN(SYSDATE, fecna)/12 ) )

Dep. de Informtica

38

I.E.S. TRASSIERRA - Crdoba

SQL

FROM WHERE Resultado:

temple numde = 110 ;

AVG(TRUNC( MONTHS_BETWEEN(SYSDATE, fecna)/12 ) ) 32,666667

La sentencia SELECT realiza los siguientes pasos: 1. Formar un grupo con todas las filas de temple que satisfagan la condicin numde=100. 2. Formar una coleccin de valores con todos los que haya en la columna fecna de esas filas, sin incluir los nulos si los hubiera. Supongamos que hay N no nulos. 3. Resolver la funcin MONTHS_BETWEEN. 4. Calcular para todos la funcin TRUNC de la SELECT. 5. Aplicar la funcin AVG a la coleccin de valores anteriores, es decir, sumarlos y dividir la suma por N.

4.4.- AGRUPAMIENTO DE FILAS.Las funciones de columna tal y como las hemos visto anteriormente operan sobre todos (o los distintos) valores de una columna. A continuacin veremos cmo formar grupos de filas, para que las funciones colectivas operen no sobre la totalidad sino sobre los distintos grupos, devolviendo no un valor nico, sino una lista de valores (tantos como grupos se hayan formado). GROUP BY.- Esta clusula permite formar grupos de filas segn un criterio determinado. Su formato es: GROUP BY col1 [, col2 [, ..] ] Siendo col1, col2, .. las columnas de agrupamiento. De forma que las filas de la tabla se agrupan en funcin de los valores idnticos de las columnas de agrupamiento. A estos efectos, los valores nulos se consideran todos iguales, por lo que se incluyen en el mismo grupo. Una vez formados los grupos, para cada uno de ellos se evalan las expresiones de la clusula SELECT, por lo que cada uno produce una fila en la tabla resultante de la consulta. Si se utiliza GROUP BY, en la clusula SELECT solo pueden aparecer: Constantes. Funciones de columna Columnas o expresiones incluidas en la clusula GROUP BY. En la clusula GROUP BY puede contener cualquier columna de la tabla especificada en FROM, sin importar que estn o no en la lista de la SELECT. Ejemplos: 1).- Para cada departamento hallar el salario medio (con 2 decimales), el mnimo, el mximo y la media aritmtica de estos dos ltimos.
Dep. de Informtica 39

I.E.S. TRASSIERRA - Crdoba

SQL

SELECT

numde, TRUNC(AVG(salar), 2), MIN(salar), MAX(salar), ( MIN(salar) + MAX(salar) ) / 2 FROM temple GROUP BY numde ORDER BY numde ; Resultado:
NUMDE TRUNC(AVG(SALAR),2) MIN(SALAR) MAX(SALAR) (MIN(SALAR)+MAX(SALAR))/2 100 3105,33 2284 4327 3305,5 110 1793 1202 2885 2043,5 111 1311 601 1863 1232 112 1605,71 1082 2284 1683 120 1623 1623 1623 1623 121 1863 1142 2644 1893 122 1947,4 1052 2705 1878,5 130 2223,66 1743 2524 2133,5

2).- Hallar la edad en aos cumplidos del empleado mas viejo de cada departamento, ordenado por nmero de departamento. SELECT FROM GROUP BY ORDER BY Resultado:
NUMDE 100 110 111 112 120 121 122 130

numde, MAX( TRUNC(MONTHS_BETWEEN(sysdate, fecna)/12 )) temple numde 1;


MAX( TRUNC(MONTHS_BETWEEN(sysdate, fecna)/12 )) 41 47 42 46 33 51 32 34

No tendra sentido incluir la columna salar en la lista de la SELECT, de hecho dara el error: ORA-00979: no es una expresin GROUP BY

HAVING.- Esta clusula es opcional y sirve para descartar grupos de filas. Su formato es: HAVING <condicin> Una vez formados los grupos con GROUP BY, se descartan aquellos grupos que no satisfacen la condicin especificada. La condicin es un predicado en el que las columnas que participen y no sean de agrupamiento, debern figurar como argumentos de funciones colectivas. Ejemplo: Para los departamentos en los que el mayor salario de sus empleados supere los 2500 Euros, listar su nmero y el mayor salario.

Dep. de Informtica

40

I.E.S. TRASSIERRA - Crdoba

SQL

SELECT FROM GROUP BY HAVING Resultado:

numde, MAX(salar) temple numde MAX(salar) > 2500 ;

NUMDE MAX(SALAR) 100 4327 110 2885 121 2644 122 2705 130 2524

En resumen, si tenemos una sentencia SELECT formada por clusulas SELECT, FROM, WHERE, GROUP BY, HAVING y ORDER BY, los pasos que sigue el motor SQL podran ser: 1) Ejecutar la clusula FROM . Es decir, seleccionar la tabla nombrada en esta clusula, que de momento pasa a ser la tabla resultante de la sentencia. 2) Ejecutar la clusula WHERE. Esto quiere decir eliminar de la tabla resultante las filas que no satisfagan la condicin expresada en el WHERE. 3) Ejecutar la clusula GROUP BY. Es decir, formar grupos con las filas de la tabla resultante en el paso anterior que tengan iguales valores en las columnas de agrupamiento. 4) Ejecutar la clusula HA VING. Descartar los grupos que no satisfagan la condicin especificada detrs de la palabra HAVING. 5) Ejecutar la clusula SELECT. Esto implica evaluar sus expresiones para cada grupo, produciendo por cada uno de ellos una fila de la tabla resultante final, con tantos valores como expresiones. Si la clusula empieza con las palabras SELECT DISTINCT se eliminan de este resultado las filas repetidas. 6) Ejecutar la clusula ORDER BY. Es decir, presentar la tabla resultante final clasificada por las columnas indicadas.

4.5.- EJERCICIOS PROPUESTOS.1.- Listar los nombres de los empleados y el resultado de dividir el cuadrado de sus salarios entre la comisin. 2.- Listar los nombres de los departamentos rellenados con puntos hasta un total de 25 caracteres, y el presupuesto anual, en euros y en pesetas de cada uno de los departamentos. 3.- Para los departamentos con nombres de ms de 12 caracteres, listar los nmeros de departamento y los caracteres nmeros 11 al 17 del nombre de departamento, ordenados por nmero de departamento.

Dep. de Informtica

41

I.E.S. TRASSIERRA - Crdoba

SQL

4.- Listar los nombres de los empleados que no tienen comisin, clasificados de manera que aparezcan primero aquellos cuyos nombres son ms cortos. 5.- Obtener en una nica columna los nombres propios y el apellido de todos los empleados visualizando la primera letra del nombre y apellido en maysculas y el resto en minsculas. ----------Fechas -------------------------6.- Obtener las fechas de ingreso, nombres y salarios de los empleados que hayan empezado a trabajar en la empresa el ao 98 despus, por orden alfabtico. 7.- Obtener por orden alfabtico los nombres de los empleados que empezaron a trabajar en la empresa en el ao 1999. 8.- Obtener por orden alfabtico los nombres de los empleados que han ingresado el 2-03-99 en el da de hoy. 9.- De los empleados mayores de 50 aos y con hijos, seleccionar los nombres y fechas de nacimiento con el siguiente formato: Domingo, 12 de Enero de 1947. 10.- Segn el convenio colectivo, para los empleados con ms de un ao de servicio el nmero de das de vacaciones anuales expresado en das laborables es de 20 incrementados en uno ms por cada tres aos de servicio cumplidos en el ao anterior. Para los empleados que este ao cumplen 45 o ms aos de edad y tienen ms de un ao de servicio. Hallar por orden alfabtico el nombre y el nmero de das de vacaciones anuales que corresponde a cada uno. 11.- Se desea analizar un plan de jubilacin anticipada para los empleados con 55 aos cumplidos, en el que se ofrece una paga adicional extra de jubilacin equivalente al salario actual de un mes por cada ao de servicio cumplido. Listar el nombre y cuanta de esa paga extra de los empleados que este ao cumplen 55 ms aos. 12.- Para los empleados de los departamentos 111 y 112 hallar por orden alfabtico: nombre, edad en aos cumplidos en el da de hoy, y edad que tenan al ingresar en la empresa. 13.- Para los empleados de los departamentos 110 y 111 hallar por orden alfabtico: nombre y tiempo que llevan en la empresa en el da de hoy expresado en aos, meses y das. 14.- Para los empleados de los departamentos 110 y 112, listar su nombre, el nombre del mes y da de su cumpleaos, por orden cronolgico. 15.- Livia Durn recibi un prstamo para vivienda el da en que ingres en la empresa con vencimientos anuales a 180 das del da y mes de su ingreso. Hallar la fecha en que vence la anualidad del prstamo correspondiente al ao actual. 16.- Todos los empleados tienen un perodo de 6 meses despus de su ingreso antes de firmar su contrato de empleo definitivo. Hallar para los empleados que este ao cumplen menos de 40 aos de edad, por orden alfabtico: nombre y fecha de firma de su contrato definitivo. 17.- Amelia Dez y Octavio Garca, han decidido casarse. La boda se celebrar dentro de 2 das, y tomarn 20 das de vacaciones. La empresa har a cada uno un regalo de boda del 1% de su salario mensual actual por cada ao de servicio. Ha1lar: la fecha de la boda, la fecha en que se incorporarn al trabajo y el regalo correspondiente a cada uno de ellos. ---------- Funciones colectivas ---------------Dep. de Informtica 42

I.E.S. TRASSIERRA - Crdoba

SQL

18.- Hallar cuntos departamentos hay sin director en propiedad y el presupuesto anual medio de todos ellos. 19.- Para los departamentos 111 y 112 hallar la media de los aos de servicio de sus empleados en el da de hoy. 20.- Para los empleados que han ingresado en la empresa en los ltimos 5 aos, hallar la edad media en aos cumplidos de la edad a la que han ingresado. 21.- Hallar la masa salarial anual (salario ms comisin) de la empresa, suponiendo 14 pagas. 22.- Hallar cuntos empleados han ingresado en el ao actual. 23.- Hallar la diferencia entre el salario ms alto y el ms bajo. 24.- Hallar la edad media en aos cumplidos de los empleados que tienen ms de 2 hijos. 25.- Hallar el presupuesto medio de los departamentos cuyo presupuesto supera al presupuesto medio de los departamentos. 26.- Hallar el nmero medio de hijos por empleado, con 2 decimales, para todos los empleados que no tienen ms de dos hijos. ------------ Agrupamiento de filas --------------------27.- Agrupando por departamento y n de hijos, hallar cuantos empleados hay en cada grupo. 28.- Hallar el salario medio por departamentos, para aquellos departamentos cuyo salario mximo es inferior al salario medio de todos los empleados. 29.- Hallar el salario medio (con 2 decimales) y la edad media de los aos cumplidos (sin decimales) para cada grupo de empleados con igual comisin y para los que no la tengan. 30.- Para los departamentos en los que hay algn empleado con salario superior a 2400 euros, hallar el nmero de empleados y la suma de sus salarios, comisiones y nmero de hijos. 31.- Para los departamentos en los que la antigedad media de Sus empleados supera a la de la empresa, hallar el salario mnimo, el medio y el mximo. 32.- Para cada departamento, hallar la media de la comisin con respecto a los empleados que la reciben y con respecto al total de empleados. 33.- Para cada extensin telefnica, hallar cuntos empleados la usan y el salario medio de stos. 34.- Para cada departamento, hallar el nmero de extensiones telefnicas que utiliza.

Dep. de Informtica

43

I.E.S. TRASSIERRA - Crdoba

SQL

TEMA 5.- CONSULTAS SOBRE VARIAS TABLAS.5.1.- Consultas sobre varias tablas. 5.2.- Combinacin. 5.2.1.- Equireunin. 5.2.2.- Combinacin externa. 5.3.- Subconsultas. 5.4.- Correlacin. 5.5.- Operadores de conjunto. 5.5.1.- Unin. 5.5.2.- Interseccin. 5.5.3.- Resta. 5.6.- Ejercicios propuestos.

5.1.- CONSULTAS SOBRE VARIAS TABLAS.Las sentencias SELECT vistas hasta ahora devolvan datos de una nica tabla. An en el caso de sentencias subordinadas, stas trataban la misma tabla que la sentencia principal. En este tema veremos la posibilidad de tratar varias tablas en una sola consulta, para lo cual basta con poner sus nombres detrs de FROM en la sentencia principal o en la subordinada. En el primer caso el resultado se obtiene combinando datos de las tablas especificadas entre s, mediante lo que se conoce como yuncin o producto cartesiano. En el segundo caso, si en una sentencia subordinada se hace referencia a datos que devuelve la anterior, se dice que la consulta es correlacionada. Al trabajar con una nica tabla, no ha sido necesario calificar las columnas, pues sus nombres las identificaban sin ambigedad. Al trabajar con varias tablas podemos encontrarnos con columnas con el mismo nombre, en cuyo caso ser necesaria la calificacin de las columnas. Por otro lado, los nombres de las tablas no suelen ser cmodos para calificar las columnas, por lo que es aconsejable la calificacin de las tablas para acortar las calificaciones de columnas. Ser necesario calificar las tablas cuando una misma tabla interviene dos veces en una yuncin.

5.2.- COMBINACIN.En teora relacional se define la reunin, combinacin o yuncin (join) como una operacin en la que se combinan datos de distintas tablas. En SQL esta operacin se realiza con la sentencia SELECT y sus clusulas FROM, y WHERE, donde los nombres de las tablas que intervienen en la yuncin se especifican detrs de FROM. Cuando se especifican dos o ms tablas, se forma una tabla fruto del producto cartesiano de todas las especificadas. Es decir, que el nmero de columnas en esta tabla es igual a la suma del nmero de columnas de las tablas de la lista, y el nmero de filas es el producto del
Dep. de Informtica 44

I.E.S. TRASSIERRA - Crdoba

SQL

nmero de filas que stas tienen. Como este ltimo nmero puede ser muy grande, normalmente el SGBD. no construir fsicamente esta tabla, pero a efectos de comprender cmo se forma el resultado de la sentencia SELECT es como si as fuera. La tabla resultante ser de poca utilidad si no se filtran las filas correctamente con la clusula WHERE que establecer la condicin de la yuncin.

5.2.1.- Equireunin.El tipo de combinacin ms frecuente es la llamada equireunin (equi join), que devuelve filas de dos o mas tablas basndose en una condicin de igualdad que permite 'conectar' las tuplas de las tablas con un mismo valor en uno de sus campos, de esta forma la cardinalidad de la tabla devuelta coincidir con la mayor cardinalidad de las tablas que intervienen en la yuncin. Ejemplos: 1).- Listar los nombres de los departamentos con presupuesto superior a 60.000 euros, as como el nombre de su centro de trabajo, clasificados por nombre de departamento. SELECT FROM WHERE ORDER BY D.nomde, C.nomce tcentr C, tdepto D C.nunce = D.nunce AND D.presu > 60000 1;

2).- Para cada departamento con presupuesto inferior a 36.000 euros, listar su nombre, el del centro de trabajo y el mximo salario de sus empleados, si ste excede de 1.200 euros. SELECT FROM WHERE D.nomde, C.nomce, MAX(salar) tcentr C, tdepto D, temple E C.numce = D.numce AND D.numde = E.numde D.presu < 36000 GROUP BY D.nomde, C.nomce HAVING MAX(E.salar) > 1200 ;

AND

3).- Hallar por orden alfabtico los nombres de los departamentos que dependen de los que tienen un presupuesto inferior a 30000 euros. SELECT FROM WHERE ORDER BY D1.nomde, D2.nomde tdepto D1, tdepto D2 D1.depde = D2.numde AND D2.presu < 30000 1;

5.2.2.- Combinacin externa.Un caso especial de la yuncin es la combinacin externa (outer join) que amplifica el resultado de una combinacin simple. Una combinacin externa recupera TODAS las filas de la de la combinacin simple y tambin aquellas que no encuentren su correspondiente fila pareja de una tabla a otra. Ejemplo:
Dep. de Informtica 45

I.E.S. TRASSIERRA - Crdoba

SQL

1).- Seleccionar el nmero de departamento, el nombre de departamento y suma de los salarios de sus empleados: SELECT FROM WHERE GROUP BY ORDER BY D.numde, D.nomde, SUM(salar) "Salario Mensual" temple E, tdepto D E.numde = D.numde D.numde, D.nomde D.numde ;

Ntese que el segundo criterio de agrupamiento (D.nomde) se especifica por razones de operatividad, para poder mostrar esa columna. Recordemos que si se usa GROUP BY, en la clusula SELECT solo pueden aparecer los criterios de agrupamiento y funciones colectivas. Para seleccionar la suma de salarios para todos los departamentos independientemente de que tengan empleados o no, tendremos que utilizar un OUTER JOIN: SELECT FROM WHERE GROUP BY ORDER BY D.numde, D.nomde, SUM(salar) "Salario Mensual" temple E, tdepto D E.numde (+) = D.numde D.numde, D.nomde D.numde ;

El smbolo (+) debe situarse en el predicado de combinacin aliado de la columna o columnas pertenecientes a la tabla en la que hay ausencia de valor. Con su uso en un operador u otro de la expresin podremos lograr la combinacin externa izquierda o derecha (left outer join o right outer join), respectivamente, de forma que el siguiente predicado hara que se trataran los empleados que no tienen asignado departamento: E.numde = D.numde(+)

5.3.- SUBCONSULTAS.Una subconsulta o consulta subordinada es una SELECT que aparece dentro de otra sentencia SQL. Recordemos que las subconsultas se pueden especificar en las clusulas WHERE y HAVING, y como parte de los predicados de comparacin, ANY, ALL, IN y EXISTS. Una sentencia subordinada de otra puede a su vez tener otras subordinadas a ella. Se llama sentencia externa a la primera sentencia SELECT de todas, es decir la que no es subordinada de ninguna. Tambin se suele decir que estas sentencias estn anidadas en niveles: la externa es la de primer nivel, sus inmediatas subordinadas las de segundo nivel, etc. El nmero de niveles de anidamiento depende del SGBD, pero suelen ser superiores a 10. La sentencia externa puede ser, en vez de una SELECT, una de las sentencias DELETE, INSERT o UPDATE, que se describirn ms adelante. Cuando hay sentencias anidadas, diremos que una sentencia es antecedente de otra cuando sta es su subordinada directa, o subordinada de sus subordinadas a cualquier nivel.

Dep. de Informtica

46

I.E.S. TRASSIERRA - Crdoba

SQL

Todos los ejercicios vistos hasta ahora con sentencias subordinadas, se referan a la misma tabla que la sentencia externa. Esto no tiene que ser as y en general cada clusula FROM, en cualquier nivel de anidamiento, puede referirse a las tablas que se desee. Una subconsulta se ejecuta una sola vez, independientemente de las filas que devuelve su antecedente directa. Ejemplos: 1).- Si el departamento 122 est ubicado en la calle de Alcal, obtener por orden alfabtico los nombres de sus empleados cuyo salario supere al salario medio de su departamento. SELECT FROM WHERE nomem temple numde = 122 AND salar > (SELECT AVG(salar) FROM temple WHERE numde = 122) AND EXISTS (SELECT * FROM tdepto WHERE numde = 122 AND numce IN ( SELECT numce FROM TCENTR WHERE seas LIKE '%ALCALA%') ) ORDER BY 1 ; Resultado:
NOMEM CAMPS, AURELIO POLO, OTlLIA SANZ, CORNELIO

En esta sentencia hay tres niveles de anidamiento y se manejan tres tablas, a las que hay cuatro referencias. A la tabla temple hay dos referencias, pero no es necesario calificar sus columnas porque stas se refieren a la tabla de su propia FROM en cada caso. Para evitar dudas puede escribirse la sentencia con nombres locales y calificaciones.

La consulta puede tambin formularse con dos niveles de anidamiento: SELECT FROM WHERE nomem temple numde = 122 salar > ( SELECT FROM WHERE EXISTS ( SELECT FROM WHERE

AND AVG(salar) temple numde = 122 ) AND * tdepto D, tcentr C D.numce = C.numce AND seas LIKE '%ALCALA%' AND numde = 122)

ORDER BY 1 ;

Dep. de Informtica

47

I.E.S. TRASSIERRA - Crdoba

SQL

2).- Obtener por orden alfabtico los nombres y salarios medios de los departamentos cuyo salario medio supera al salario medio de la empresa. SELECT FROM WHERE GROUP BY HAVING nomde, AVG(salar) temple E, tdepto D E.numde = D.numde nomde AVG (salar) > (SELECT FROM ORDER BY nomde ;

AVG(salar) temple

En esta sentencia se usa una subordinada en la clusula HAVING. Resultado:


NOMDE DIRECCION GENERAL FINANZAS PERSONAL PROCESO DE DATOS AVG(salar) 3105,3333 2223,6667 1863 1947,4

5.4.- CORRELACIN.En los ejemplos vistos hasta ahora, las sentencias subordinadas no hacan referencia a columnas de tablas que no estn en su propia clusula FROM. Esto significa que el resultado de la sentencia subordinada puede evaluarse independientemente de sus sentencias antecedentes en todos los niveles, inclusive la de nivel 1 sentencia externa. Por tanto el SGBD la evala una sola vez y reemplaza los valores resultantes en el predicado donde se encuentre. No ocurre lo mismo con las sentencias subordinadas correlacionadas. Se llama as a las sentencias subordinadas en las que se especifica alguna columna de una tabla mencionada en la clusula FROM de alguna de sus sentencias antecedentes. Una sentencia subordinada correlacionada no puede evaluarse independientemente de las antecedentes, pues su resultado puede cambiar segn qu filas se consideren en la evaluacin de stas en cada momento, por lo que el SGBD la evaluar mltiples veces. Cuando en una sentencia subordinada se especifica un nombre de columna sin calificar, se interpreta que se refiere a la primera tabla que, conteniendo una columna con este nombre, se encuentre al buscar en el orden siguiente: primero, en las tablas de su propia sentencia FROM; luego, en las de su sentencia antecedente inmediata; luego, en la antecedente de siguiente nivel, etc., hasta llegar a la sentencia de nivel 1, inclusive. Ejemplos: 1).- Obtener por orden alfabtico los nombres de los departamentos ubicados en la calle de Atocha. No correlacionada: SELECT nomde
Dep. de Informtica 48

I.E.S. TRASSIERRA - Crdoba

SQL

FROM WHERE

tdepto numce IN (

SELECT numce FROM tcentr WHERE seas LIKE '%ATOCHA%' )

ORDER BY nomde; Resultado:


NOMDE DIRECC. COMERCIAL SECTOR INDUSTRIAL SECTOR SERVICIOS

En este ejemplo, la sentencia subordinada no es correlacionada pues slo se refiere a las columnas NUMCE y SEAS de la tabla TCENTR, que es la de su clusula FROM. Por tanto, el SGBD la evala slo una vez y su resultado pasa a ser parte del predicado IN. Como ejercicio, el alumn@ deber realizar la misma consulta pero con yuncin y correlacin. 2).- Obtener por orden alfabtico los nombres de los departamentos cuyo presupuesto es inferior a la mitad de la suma de los salarios anuales de sus empleados. Consulta correlacionada: SELECT nomde FROM tdepto WHERE presu < (

SELECT FROM WHERE

0.5 * SUM (salar * 14) temple numde = tdepto.numde

ORDER BY nomde ; En este ejemplo, la sentencia subordinada hace referencia a la columna numde de la tabla tdepto, que est en la FROM de su sentencia antecedente. Por tanto es una sentencia subordinada correlacionada. Hay que evaluarla para cada fila de tdepto, pues su resultado puede ser diferente para distintas filas. Resultado:
NOMDE FINANZAS PERSONAL PROCESO DE DATOS SECTOR INDUSTRIAL SECTOR SERVICIOS

Tambin se puede formular esta consulta como una yuncin con agrupamiento: SELECT nomde FROM temple, tdepto WHERE temple.numde = tdepto.numde GROUP BY nomde, presu HAVING presu < 0.5 * SUM (salar * 14 ) ORDER BY nomde ; 3).- Obtener por orden alfabtico los nombres de los empleados cuyo salario supera al salario medio de su departamento.

Dep. de Informtica

49

I.E.S. TRASSIERRA - Crdoba

SQL

Consulta correlacionada sobre la misma tabla: SELECT FROM WHERE nomem temple E salar > (SELECT AVG(salar) FROM temple WHERE numde = E.numde) ORDER BY nomem ; Que tambin se puede formular mediante yuncin y agrupamiento: SELECT FROM WHERE GROUP BY HAVING ORDER BY E1.nomem temple E1, temple E2 E1.numde = E2.numde E1.numem, E1.nomem, E1.salar E1.salar > AVG(E2.salar) 1;

5.5.- OPERADORES DE CONJUNTO.Estos operadores operan sobre consultas, de forma que combinan dos o ms tablas, vistas o consultas en una nica tabla resultado. Su sintaxis general es: SELECT <operador de conjunto> SELECT

Las sentencias SELECT deben tener el mismo nmero de columnas, y adems las columnas que estn en la misma posicin relativa deben ser del mismo tipo aunque sus longitudes pueden variar. Al unirlas se obtiene como resultado otra tabla con las mismas columnas y tipos de datos que las que se unen, y con un nmero de filas que depender del operador utilizado. En estos operadores de conjunto va implcita la clusula DISTINCT. Los desarrollados por Oracle son unin interseccin y resta: Son de especial utilidad cuando se trata de manipular tablas completas, componer vistas de usuario, etc. Aunque tambin pueden usarse para realizar consultas.

5.5.1.- Operador UNION.El operador UNION devuelve todas las filas que han sido seleccionadas por las dos sentencias SELECT que hacen de operandos. Si ambos operandos se refieren a la misma tabla, el resultado es equivalente a realizar una sola consulta con el operador OR. El resultado de la unin puede a su vez unirse con el de otra sentencia SELECT o con el de otra unin. Pueden usarse parntesis para indicar el orden de evaluacin de las uniones. Si no
Dep. de Informtica 50

I.E.S. TRASSIERRA - Crdoba

SQL

se usan parntesis, el orden de evaluacin es el de escritura. Para que el resultado se presente en un orden determinado hay que usar la clusula ORDER BY en la ultima SELECT. Si se aade la opcin ALL, la unin devolver todas las filas aunque estn duplicadas. Ejercicio: ejecutar la siguiente sentencia, primero con UNION y despus con UNION ALL. SELECT * FROM tdepto UNION [ALL] SELECT * FROM tdepto ; Ejemplos: 1).- Listar alfabticamente los nombres de los empleados del departamento 112, sus sueldos mensuales (salario + comisin) y el literal "Con comisin" o "Sin comisin", segn el caso. SELECT FROM WHERE UNION SELECT FROM WHERE ORDER BY Resultado:
NOMEM DIEZ, AMELIA GARCIA, OCTAVIO LASA, MARIO MARTIN, MICAELA PEREZ, SABINA TEROL, LUCIANO TORRES, HORACIO SALAR 'SINCOMISIN 2224 Con comisin 2765 Con comisin 2765 Con comisin 1082 Sin comisin 863 Con comisin 2404 Con comisin 1683 Con comisin

nomem, salar, 'Sin comisin' temple comis IS NULL AND numde = 112

nomem, salar+comis, 'Con comisin' temple comis IS NOT NULL AND numde = 112 1;

2).- Listar los nombres de los empleados del departamento 112 y los nombres de los departamentos. SELECT nomem FROM temple WHERE numde = 112 UNION SELECT nomde FROM tdepto ;

5.5.2.- Operador INTERSECT.Este operador devuelve las filas comunes que han sido seleccionadas por los comandos SELECT sobre los que opera, esto es las filas que se encuentran en ambas tablas resultado de las SELECT. Si ambas sentencias SELECT se refieren a la misma tabla, el resultado es equivalente a realizar una sola consulta con el operador AND.

Dep. de Informtica

51

I.E.S. TRASSIERRA - Crdoba

SQL

Ejemplo: Listar el nombre y salario de todos los empleados del departamento 112 que tengan un salario mensual superior a 2000 euros. SELECT FROM WHERE INTERSECT SELECT FROM WHERE Resultado:
NOMEM GARCIA, OCTAVIO LASA, MARIO SALAR 2284 2104

nomem, salar temple numde = 112

nomem, salar temple salar > 2000 ;

5.5.3.- Operador MINUS.El operador MINUS devuelve las filas que habiendo sido devueltas por el primer SELECT, no se encuentran en las devueltas por el segundo. Ejemplo: Listar el nombre y salario de todos los empleados del departamento 112 salvo los que no tengan hijos. SELECT FROM WHERE MINUS SELECT FROM WHERE Resultado:
NOMEM GARCIA, OCTAVIO LASA, MARIO TEROL, LUCIANO SALAR 2284 2104 1743

nomem, salar temple numde = 112 nomem, salar temple numhi =0 ;

5.6.- EJERCICIOS PROPUESTOS .1.- Para los departamentos cuyo director lo sea en funciones, hallar el nmero de empleados y la suma de sus salarios, comisiones y nmero de hijos. 2.- Listar, por orden alfabtico, los nombres de los empleados que son directores en funciones.

Dep. de Informtica

52

I.E.S. TRASSIERRA - Crdoba

SQL

3.- Para todos los departamentos que no sean de direccin ni de sectores, listar el nmero de departamento y el de sus distintas extensiones telefnicas, por orden creciente de departamento y, dentro de ste, por nmero de extensin creciente. 4.- A los empleados que son directores en funciones se les asignar una gratificacin del 5% de su salario. Hallar por orden alfabtico los nombres de estos empleados y la gratificacin correspondiente a cada uno de ellos. 5.- Listar todos los datos de los departamentos cuyo centro de trabajo no exista en la tabla TCENTR. 6.- Hallar si hay algn departamento que an no tenga empleados asignados ni director en propiedad. 7.- Listar alfabticamente, los nombres de los empleados que son directores de primer nivel, es decir, que dirigen departamentos de los que no dependen otros departamentos. 8.- Listado alfabtico de los empleados que pertenecen a departamentos cuyo Director en propiedad lo sea tambin en funciones de algn otro, excluyendo del resultado a los directores. 9.- Comprobar (listando todos sus datos) si hay empleados con un departamento inexistente. 10.- Hallar (listando todos sus datos) si hay algn departamento que solo tenga como empleado a su director en propiedad. 11.- Comprobar que todos los empleados que son directores de departamento existen en la tabla de empleados. 12.- Comprobar que los directores en propiedad son empleados de su departamento. 13.- Obtener, por orden alfabtico, todos los datos de los centros de trabajo en los que hay algn departamento cuyo director lo sea en funciones. 14.- Para cada director, hallar por orden alfabtico su nombre y la suma de los salarios de los empleados que estn directamente a su cargo (es decir, en los departamentos que l dirige), en dos grupos separados segn sea en funciones o en propiedad. 15.- Hallar, por orden alfabtico, los nombres de los departamentos cuyo presupuesto medio por empleado supera a la media de sus salarios. 16.- Para los empleados que trabajan en la calle de Atocha y comparten su extensin telefnica con otro empleado con menor salario que ellos, hallar la suma de sus salarios por departamento y el nombre de ste, por orden alfabtico. 17.- Hallar cuntos empleados hay que compartan su extensin telefnica con otro de otro departamento. 18.- Hallar, por orden alfabtico, los nombres de los departamentos en los que hay algn empleado que cumpla este ao ms de 50 aos de edad.

Dep. de Informtica

53

I.E.S. TRASSIERRA - Crdoba

SQL

19.- Hallar el nmero de departamento y el salario mximo para los departamentos cuyo salario mximo es menor que el salario medio de los empleados de todos los dems departamentos. 20.- Listar los nombres y salarios totales de aquellos empleados que ganan igual o ms que sus jefes de departamento. 21.- Listar el nombre y nmero de departamento de los empleados no directores, pero solo de aquellos departamentos de los que no dependen otros departamentos, ordenados por nmero de departamento. 22.- Para los departamentos ubicados en la calle de Alcal en los que haya algn empleado con ms de 10 aos de antigedad y tales que la media de hijos por cada uno de estos departamentos sea superior a 1, hallar el salario medio de estos empleados. ----------- Operadores de conjunto--------23.- Hallar el salario medio y la edad media en aos de los empleados que tienen comisin y los que no. 24.- Para los empleados que no tienen comisin, obtener por orden alfabtico el nombre y el cociente entre su salario y el nmero de hijos, pero si un empleado no tiene hijos, se obtendr el salario sin ms, indicando este caso con un literal. 25.- Para los empleados que trabajan en la calle de Atocha cuyo salario supera al salario medio de su departamento, obtener por orden alfabtico su nombre y su salario total. 26.- Hallar, por departamento, la masa salarial total (suma de todos los salarios y comisiones del departamento) y el nombre, por orden alfabtico. 27.- Supongamos que algunos departamentos se van a trasladar a otro local. Disponemos de una tabla llamada TTRASL con una sola columna llamada NUMDEP donde hay una fila por cada departamento que se traslada al local nuevo. Se desea producir una lista por orden alfabtico de todos los departamentos, indicando cules se trasladan y cules no. 28.- Efectuar una explosin de la organizacin de departamentos. Es decir, para cada departamento, obtener su nombre, el de los que dependen de l y el nivel al que dependen. Si un departamento depende directamente de otro, este nivel ser 1, si depende de uno que depende directamente de ste ser 2, y as sucesivamente. Se considerar que un departamento depende de s mismo a nivel 0. La primera columna del resultado ser el nombre de un departamento, la segunda el de un departamento que depende de l, y la tercera el nivel al que depende. Considerar un mximo de 3 niveles de dependencia. Presentar el resultado por orden alfabtico. Si de un departamento no depende ningn otro, aparecer al menos dependiendo de s mismo a nivel 0.

Dep. de Informtica

54

I.E.S. TRASSIERRA - Crdoba

SQL

TEMA 6.- ARCHIVOS DE COMANDOS E INFORMES CON SQL *Plus.6.1.- Archivos de comandos con SQL*Plus. 6.1.1.- Variables de sustitucin. 6.1.2.- Captura de datos desde el terminal. 6.2.-Informes con SQL*Plus. 6.2.1.- Comandos de parmetros. - de entorno. - de feedback. - de salida. 6.2.2.- Comandos de formato. - de ttulo: TITLE y BTITLE. - de columna: COLUMN. - de ruptura: BREAK. - de clculo: COMPUTE. - de limpieza: CLEAR. 6.3.- Ejercicios propuestos.

6.1.- ARCHIVOS DE COMANDOS CON SQL*Plus.Hasta ahora hemos usado archivos de texto para almacenar un comando. Ahora veremos como almacenar varios comandos. SQL tiene sus comandos o sentencias, y SQL*Plus, que es un producto de Oracle, tiene otros comandos y parmetros adicionales que se vern mas adelante en este mismo tema. Un archivo de comandos no es ms que un archivo de texto con la extensin .SQL en el que se almacenan un conjunto de comandos SQL, que se ejecutan secuencialmente, uno tras otro, al lanzar la ejecucin del archivo. Adems de lneas de comandos de SQL, un archivo de comandos puede contener: Lneas de comentario, que comienzan con REM Lneas de ejecucin, que constan solo de la barra inclinada ( / ) y que se insertan a continuacin de cada sentencia SQL indicando su ejecucin. REM Ejemplo de archivo de comandos SELECT REPLACE(nomem, 'A', '~') FROM temple / SELECT RPAD('HOLA', 20, '*') FROM dual /

Un archivo de comandos se arranca con el comando START ya visto:


Dep. de Informtica 55

I.E.S. TRASSIERRA - Crdoba

SQL

START <nombre_archivo> Desde un archivo de comandos puede arrancarse otro, en cuyo caso se habla de "archivos de comandos anidados".

6.1.1.- Variables de sustitucin.Aparte de las variables globales que pertenecen al entorno de trabajo de SQL*Plus, en un archivo de comandos pueden aparecer variables locales a dicho archivo, tambin llamadas variables de sustitucin que permiten agilizar la codificacin evitando repetir valores en distintas sentencias. Estas se inicializan con DEFINE y se usan precedidas del smbolo &. Inicializacin: Uso: DEF[INE] <variable> = valor &<variable>

Ejemplo: DEF dep=110 SELECT REPLACE(nomem, 'A', '~') FROM temple WHERE numde = &dep / SELECT nomem, salar FROM temple WHERE numde = &dep / DEF <variable> muestra el contenido de la variable ya inicializada. DEF sin argumentos muestra los valores de todas las variables de usuario.

Hay que tener en cuenta que todas las variables definidas con DEFINE toman siempre valores de tipo char. Si una variable de sustitucin tiene valor, ste permanece en el mbito del archivo hasta que: Se vuelva a inicializar. Se desactive la variable (con UNDEF[INE] <variable>).

6.1.2.- Captura de datos desde el terminal.Si utilizamos archivos de comandos, nos ser necesario en ocasiones capturar datos desde el terminal, que sern usados por los comandos del archivo. Eso ocurrir, por ejemplo si queremos disear una consulta interactiva del salario medio de un departamento, de forma que el usuario teclee el nmero del departamento y la consulta se refiera a l. Para capturar datos desde el terminal pueden usarse dos mtodos: Captura mediante variables de sustitucin.Dep. de Informtica 56

I.E.S. TRASSIERRA - Crdoba

SQL

Si una variable de sustitucin es referenciada en el archivo de comandos sin que se haya inicializado, se muestra en pantalla un mensaje solicitando un valor para esa variable. Ejemplo: SELECT FROM WHERE

AVG(salar) temple numde = &dep ;

Introduzca un valor para dep: 120 Despus de introducido, muestra la lnea de sustitucin: antiguo 3: WHERE numde= &dep nuevo 3: WHERE numde= 120 Y por ltimo muestra el resultado:
AVG(SALAR) ----------------1623

Si la misma variable de sustitucin aparece varias veces en una sentencia o en varias del archivo de comandos, y no queremos que el sistema nos pregunte por su valor nada ms que una vez, deberemos usar &&<variable> la primera vez que se referencia a la variable de sustitucin. Ejemplo: SELECT FROM WHERE / SELECT FROM WHERE /

nomem "Empleado", salar "Salario" temple numde = &&dep nomde tdepto numde = &dep

El comando ACCEPT permite asignar a una variable de usuario un valor introducido por teclado. Su sintaxis es: NUM[BER] / PROMPT <texto> / ACC[EPT] <variable> CHAR NOPR[OMPT] [HIDE] Si <variable> no existe, SQL*Plus la crea. Puede especificarse un tipo NUMBER o CHAR (por defecto). Los valores tecleados que no coinciden con el tipo de variable son rechazados. PROMPT <texto> hace que se muestre el texto en pantalla al solicitar el valor. HIDE hace que se oculten los caracteres tecleados.

Dep. de Informtica

57

I.E.S. TRASSIERRA - Crdoba

SQL

El comando PROMPT permite visualizar un texto, incluso que contenga variables de sustitucin. As por ejemplo: SQL> ACCEPT mes PROMPT ' Introduce el mes: ' Introduce el mes: Junio SQL> PROMPT El mes tecleado es &mes El mes tecleado es Junio

El comando PAUSE muestra un mensaje en pantalla y se suspende la ejecucin hasta que se pulse Return: SQL> PAUSE coloca papel en la impresora y pulsa Return para continuar.

Captura mediante parmetros en la lnea de comandos.-

Al arrancar un archivo de comandos pueden indicarse hasta nueve parmetros: START nombre_archivo par1 par2 ..... par9 En el archivo de comandos nos referiremos a los parmetros por las variables: &1, &2, ...., &9 que se corresponden posicionalmente con ellos. No se admiten ms de nueve parmetros. Si se indican menos parmetros que variables, las variables sobrantes quedan sin valor asignado. Desde el archivo de comandos se pueden referir las variables cuantas veces se desee y el cualquier orden. Ejemplo. Supongamos el fichero prueba.sql: SELECT FROM WHERE / La invocacin: numde, nomem, salar temple numde = &1 AND salar > &2

START prueba 110 1000

Ejecuta la consulta para los empleados del departamento 110 que cobran mas de 1000 euros. NOTA: En cualquiera de los casos de captura de variables desde el terminal, la sustitucin se realiza segn el contenido tecleado, por lo que si se espera un valor alfanumrico habr que incluir comillas en la referencia a la variable: '& variable'.

6.2.- INFORMES CON SQL*Plus.Dep. de Informtica 58

I.E.S. TRASSIERRA - Crdoba

SQL

A continuacin veremos algunos comandos sobre parmetros que personalizan el entorno de trabajo y facilitan la obtencin de informes mejorando la presentacin de los mismos. Estos comandos: No se guardan en el buffer de SQL. Su ejecucin no cambia el comando SQL actual. Tienen efecto hasta que se desactiven o hasta que se cancele, se cambie o se abandone la sesin de trabajo con SQL*Plus. Estos comandos pueden ajustarse ejecutando el correspondiente comando desde la lnea de comandos de SQL o desde un archivo de comandos. Si deseamos configurar el entorno, podemos incluir sus definiciones en un fichero de texto y guardarlo como LOGIN.SQL en el directorio por defecto de Oracle (consltese la variable path de MSDOS). De esta forma ser ejecutado al arrancar SQL*Plus. Si el fichero no existe los parmetros se inicializarn por defecto. Tambin podemos personalizar un entorno a travs del acceso directo de SQL Plus en el escritorio. En el cuadro Iniciar en de sus propiedades, especificaremos el directorio por defecto. El fichero LOGIN.SQL colocado ah, ser el que se ejecute desde ese acceso directo. 6.2.1.- Comandos de parmetros.Los parmetros representan valores de ciertas propiedades que controlan la ejecucin de SQL. Esos valores se recogen en variables y pueden ser modificados por el usuario. Cada parmetro de entorno tiene un valor por defecto y se almacena como una variable global. El comando SET define los valores de variables de sistema. Su sintaxis genrica es: SET <variable> ON/OFF/<valor> El comando SHOW muestra el valor de una o todas las variables de sistema. Su sintaxis es: SHOW <variable>/ALL

Parmetros de feedback.SET ECHO [ON/OFF] SET FEEDBACK [nn/ON/OFF] SET VERIFY [ON/OFF] Permite visualizar o no los comandos conforme se ejecutan desde un archivo de comandos. Por defecto OFF. Define el nmero mnimo de filas recuperadas por una consulta para que genere el mensaje N Of rows returned (Nmero de filas devueltas). Por defecto ON y 6. Muestra o no los valores antiguo y nuevo de las variables parametrizadas (de sustitucin). Por defecto ON.

Dep. de Informtica

59

I.E.S. TRASSIERRA - Crdoba

SQL

Parmetros de salida.SET LINESIZE nn SET PAGESIZE nn SET HEAD[ING] ON/OFF SET HEADSEP car SET NULL texto SET NEWPAGE nn SET NUMWIDTH nn SET TIME ON/OFF SET WRAP ON/OFF Nmero mximo de caracteres por lnea (mx. 999, 80 por defecto). Una columna nunca se extender sobre dos lneas. Nmero de lneas de la pgina, incluyendo ttulo y lneas de pausa. Por defecto 25. Activa y desactiva las cabeceras de columnas. Por defecto ON. Especifica el carcter para separar los ttulos en varias lneas. (por defecto |). Indica la cadena de caracteres para valores nulos (NULL). Por defecto "". Nmero de lneas de separacin entre pginas. Anchura de los campos numricos. Permite visualizar o no la hora junto al prompth de SQL Permite visualizar en otra lnea(por defecto ON), o truncar las columnas que excedan del tamao especificado en COLUMN.

SET NUMF[ORMAT] <fmt> Indica el formato que tendrn por defecto las columnas numricas que no tengan un formato especificado. Los formatos son los mismos que para el comando COLUMN. SET SPA[CE] nn SET PAU[SE] ON/OFF/ [texto] Indica el n de espacios entre columnas (1 por defecto, mx. 10) Permite hacer una pausa entre pginas y mostrar el texto especificado. Por defecto OFF.

SET TERM[OUT] ON/OFF Permite mostrar u ocultar los resultados de las sentencias cuando se ejecutan en un archivo de comandos(x filas borradas). Por defecto en ON.

6.2.2.- Comandos de formato.Las especificaciones de formato se almacenan como variables locales, pueden activarse o desactivarse en cualquier momento y se pueden almacenar en el archivo LOGIN.SQL. Hay cinco comandos bsicos: de ttulo, de columna, de ruptura, de clculo y de limpieza.

Comandos de ttulo: TTITLE y BTITLE.-

Los ttulos no necesitan comillas si no contienen espacios blancos y se centran en la anchura de la lnea especificada con SET LINESIZE. Si dentro de la cadena de ttulo incluimos los caracteres ||, provocaremos un salto de lnea en el ttulo. TTITLE/BTITLE [LEFT/CENT/RIGHT] <texto> [ <&variable>] / {ON/OFF} [SKIP n] TTITLE establece el ttulo superior o encabezado de pgina y BTITLE el pie de pgina. Los valores por defecto son CENT y ON. Si especificamos CENT, se ocultan la fecha y n de pgina del encabezado, SKIP n indica el nmero de lneas entre pginas.

Dep. de Informtica

60

I.E.S. TRASSIERRA - Crdoba

SQL

Comandos de columna: COLUMN.-

Permiten especificar formatos de salida para cada columna individualmente. COLUMN <nombre_columna> <lista_de_formatos> <nombre_columna> es el nombre especificado en cualquiera de las expresiones de columna de la SELECT.

<lista_de_formatos> es uno o varios formatos de entre los siguientes:


HEADING <texto> Permite visualizar un encabezado de columna distinto al nombre de la columna. Indica qu hacer con la salida si el valor de la columna es mayor que la anchura especificada para ella en el formato FORMAT que se ver a continuacin. WRAPPED (por defecto) hace que se muestre en la siguiente lnea y TRUNCATED que se trunque. Fuerza que el valor de la columna se visualice en una nueva lnea. No afecta a la primera columna. Indica el texto que reemplazar a un valor nulo en la columna. Copia todos los comandos de formato de <columna1> a la columna especificada. Establece la visualizacin o no de la columna. Activa o desactiva los formatos especificados para la columna.

WRAPPED / WORD WRAPPED / TRUNCATED.

NEWLINE/OFF

NULL <texto> LIKE <columna1>

PRINT / NOPRINT ON / OFF

FORMAT <mscara> Una mscara de formato se construye con las siguientes unidades: Alfanumrica An Numrica 9 0 $ . , V B MI PR n caracteres de anchura.

Especifica una posicin de un dgito suprimiendo los ceros no significativos. Especifica una posicin de un dgito rellenando con ceros las posiciones no significativas. Posicin del signo $ Posicin del punto (.) Posicin de la coma (,) Alinea los decimales de los nmeros reales sin mostrar el punto decimal. Convierte a blancos los ceros al principio de la columna. Coloca un signo menos(-) a la derecha de las cifras negativas. Encierra entre signos de menor y mayor (<>) las cifras negativas.

Dep. de Informtica

61

I.E.S. TRASSIERRA - Crdoba

SQL

Comando de ruptura: BREAK.

Una ruptura de control (break) es un evento que permite interrumpir la salida normal y hacer algo. Se suele usar en conjuncin con una SELECT con la clusula ORDER BY. Puede definirse en los siguientes casos: <expr> ROW PAGE REPORT Cuando cambia el valor de <expr> En cada cambio de fila En cada cambio de pgina Al final de un informe o consulta.

Y siempre se debe de realizar alguna de las siguientes acciones: SKIP n PAGE Y opcionalmente: DUP / NODUP Permite visualizar o no los valores duplicados en las columnas especificadas como de ruptura de control. NODUP por defecto. En un momento determinado solo puede haber un comando BREAK activo (al escribir un BREAK, ste sustituye al anterior), por lo que se deben especificar varias columnas en un mismo BREAK si se quieren activar a la vez Sintaxis: <exp_colum> / ROW / PAGE / REPORT SKIP <numero> / PAGE DUP / NODUP Saltar n lneas. Saltar a la cabecera de la siguiente pgina.

BREAK ON

donde <exp colum> debe ser un nombre de columna sin calificar o un alias de columna. Ejemplos: 1.- Mostrar el nmero de departamento, el nombre de empleado y el salario de todos los empleados ordenado por nmero de departamento, de forma que en una misma pgina no se muestren datos de mas de un departamento y evitando valores consecutivos duplicados. SQL> BREAK ON numde PAGE SQL> SELECT numde, nomem, salar FROM temple ORDER BY numde ; 2.- Mostrar el nombre y el presupuesto de todos los departamentos, el informe se har a 2 espacios. SQL> BREAK ON ROW SKIP 1

Dep. de Informtica

62

I.E.S. TRASSIERRA - Crdoba

SQL

SQL> SELECT nomde, presu FROM tdepto ORDER BY numde ; 3.- Mostrar el nmero de hijos y el nombre de todos los empleados. El informe se har de forma que en cada pgina aparezcan ordenados alfabticamente los nombres de los empleados con igual nmero de hijos. SQL> BREAK ON numhi PAGE SQL> SELECT numhi, nomem FROM temple ORDER BY 1, 2 ;

Comando de clculo: COMPUTE.-

Permite realizar operaciones estadsticas con grupos de tuplas seleccionados. Las operaciones que permite calcular son: AVG COUNT MAXIMUN MINIMUN NUMBER STD SUM VARIANCE Media Recuento de valores no nulos Valor mximo. Valor mnimo. Recuento de filas. Desviacin estndar Suma (total) Varianza.

COMPUTE puede ejecutarse en un punto de ruptura determinado, o sincronizarse con definiciones existentes de BREAK. Su sintaxis es: [SUM] [COUNT] [AVG] [MIN] [MAX] [VAR] OF <exp_colum> ON [STD] [NUMBER] <exp_colum> / ROW / PAGE / REPORT

COMPUTE

Solo puede haber un comando COMPUTE activo por columna, por lo que si queremos aadir un clculo a una columna que ya tiene uno, debemos reescribir el comando con los dos clculos. Ejemplo: BREAK ON COMPUTE SELECT FROM ORDER BY numde SKIP 1 SUM AVG OF salar ON numde numde, nomem, salar temple numde ;

Dep. de Informtica

63

I.E.S. TRASSIERRA - Crdoba

SQL

Comando de limpieza: CLEAR.-

El comando CLEAR permite realizar la limpieza de ciertos elementos: Su sintaxis es: CLEAR <opcin> <opcin> puede ser alguna de las siguientes: BREAKS BUFFER COLUMNS COMPUTES SCREEN SQL Limpia los BREAKS marcados mediante el comando BREAK. Limpia el texto del buffer activo. Limpia las opciones del comando COLUMN. Limpia las opciones del comando COMPUTE. Limpia la pantalla. Limpia el buffer de SQL.

6.3.- EJERCICIOS PROPUESTOS.1.- Codificar un archivo de comandos de nombre TEM6_1.SQL que contenga una consulta que muestre el nombre del departamento y su salario medio, de un departamento cuyo nmero se teclear una sola vez. (con variables de sustitucin). 2.- Modificar el anterior archivo de comandos para que se ejecucin sea posible pasndole los parmetros desde la lnea de comandos. Guardarlo como TEM6_2.SQL. 3.- Realizar el siguiente informe, en el que se muestran los empleados por departamento y sus salarios, y las sumas de los salarios por departamento. Guardando todos los comandos necesarios en el archivo TEM6_3.SQL.
Mar Dic 11 LISTADO DE SALARIOS POR DEPARTAMENTO Nombre Departamento -------------------------------------------------DIRECC. COMERCIAL Empleado -------------------------------------------------PEREZ, MARCOS MORAN, CARMEN CAMPOS, ROMULO Salario Mensual ---------------2,885 1,292 1,202 -------5,379 pgina 1

******************** sum DIRECCION GENERAL GALVEZ, PILAR ALBA, ADRIANA LOPEZ, ANTONIO 2,284

******************** sum FINANZAS FLOR, DOROTEA GARCIA, AUGUSTO FIERRO, CLAUDIA

2,705 4,327 -------9,316 1,743 2,524 2,404 -------6,671 1,623 -------1,623

******************** sum ORGANIZACIN ******************** sum Informe confidencial GIL, GLORIA

Dep. de Informtica

64

I.E.S. TRASSIERRA - Crdoba

SQL

4.- Se quiere realizar un informe en el que se analicen los salarios en funcin del numero de hijos que tiene el personal de la empresa. El informe deber estar agrupado por numero de hijos en cada pgina y ordenado alfabticamente por el nombre de los empleados. Tras cada pgina deber esperar la confirmacin del usuario. Se guardar en el fichero TEM6_4.SQL Y Presentar el siguiente formato:
Jue Nov 07 LISTADO ALFABETICO DE EMPLEADOS POR NUMERO DE HIJOS Sueldo Mensual Salario Comisin TOTAL --------- ----------- ----------2,870 0 2,870 1,751 541 2,292 1,313 601 1,914 pgina 1

N de hijos --------------0

Empleado ---------------------------------ALBA, ADRIANA DIEZ, AMELIA DURAN, LIVIA .................................... .................................... VAZQUEZ, HONORIA

*********** avg count minimum maximum number sum

1,251 601 1,852 ------- ------------- ----------1,699 1,961 6 1,116 2,870 14 23,788 27,454

Pulse una tecla para continuar .....................>

5.- Realizar el siguiente informe:

Dep. de Informtica

65

I.E.S. TRASSIERRA - Crdoba

SQL

TEMA 7.- SENTENCIAS DE ACTUALIZACIN DE DATOS Y TRANSACCIONALES.7.1.- Actualizacin de datos. 7.1.1.- Insercin de tuplas. Sentencia INSERT. 7.1.2.- Borrado de tuplas. Sentencia DELETE. 7.1.3.- Modificacin de tuplas. Sentencia UPDATE. 7.2.- Sentencias transaccionales. 7.2.1.- Sentencia COMMIT. 7.2.2.- Sentencia ROLLBACK. 7.2.3.- Sentencia SAVEPOINT. 7.3.- Ejercicios propuestos

7.1.- ACTUALIZACIN DE DATOS.Adems de la sentencia SELECT vista, que permite consultar datos, el L.M.D. de SQL dispone de consultas para actualizar los datos de las tablas, permitiendo aadir nuevas tuplas, borrar tuplas existentes y modificar sus datos. Dado que a partir de ahora vamos a actualizar las tablas usadas como ejemplo, y como las sentencias que veremos pueden actualizar (aadir, borrar o modificar) muchas filas de una vez, conviene que para practicar, el alumno o alumna: Trabaje con copias de las tablas originales. Antes de ejecutar la sentencia de actualizacin, se cercione, con ayuda de SELECT, de las tuplas que se vern afectadas

7.1.1.- Insercin de tuplas. Sentencia INSERT.La sentencia INSERT permite aadir uno o mas filas completas a una tabla o vista, para lo cual la tabla debe ser propiedad del usuario que intenta la insercin o tener privilegio de INSERT sobre ella, en cuyo caso deber calificar el nombre de la tabla, anteponindole el nombre del propietario y un punto. Esta sentencia tiene la siguiente sintaxis: INSERT INTO <tabla> [(col1, col2, ..)] donde: <tabla> es el nombre de la tabla en la que se desea insertar (realmente aadir al final, pues el orden es irrelevante). VALUES (valor1, valor2, ..) / Subselect

(col1, col2,..) es una lista de las columnas de esa tabla, no tienen por que especificarse todas ni en el mismo orden de definicin. Si se omite, se interpreta como si se hubieran especificado todas y en dicho orden.

Dep. de Informtica

66

I.E.S. TRASSIERRA - Crdoba

SQL

Si se especifica la palabra reservada VALUES solo se insertar una fila completa por cada sentencia. En este caso: (valor1, valor2, ..) representan los valores que adoptarn las columnas. Cada uno de los valores debe ser una constante, o la palabra NULL (o un registro especial), y debe haber tantos como en la lista de columnas. El primer valor se asigna a la primera columna de la lista, el segundo a la segunda, etc. Si alguna columna de la tabla no ha sido especificada se le asigna el valor nulo por defecto, si dicha columna lo admite, sino dar error.

Si se especifica una subconsulta, se insertarn en la tabla todas las tuplas resultantes de la consulta subordinada, por lo que con este formato, con una nica sentencia se pueden insertar mltiples filas, una o ninguna, segn que la subselect devuelva varias, una o ninguna tupla (tabla vaca). Pero hay que tener en cuanta que ni la sentencia subordinada, ni sus subordinadas si las tuviera, pueden referirse a la tabla en la que se est insertando. El nmero de columnas devueltas por la subordinada debe ser el igual que las especificadas en la lista de columnas y sus datos homogneos para que permita asignar los datos devueltos en la primera columna a la primera columna de las especificadas en la lista de columnas, los de la segunda a la segunda, etc. Evidentemente, los datos de las columnas devueltas deben ser homogneos con las receptoras.

Ejemplos: 1).- Dar de alta el departamento de Planificacin con el nmero 123 que depender del 120. Estar ubicado en el centro 10, siendo su presupuesto de 24.000 y su director el empleado 350. INSERT INTO tdepto VALUES (123, 10, 350, 'F', 24000, 120, 'PLANIFICACION') ; 2).- Supongamos que el usuario USU4 es propietario de la tabla mayores, vaca y con la misma estructura que temple y queremos (y podemos) insertar en ella los empleados mayores de 50 aos: INSERT INTO USU4.mayores SELECT nomem, fecna FROM temple WHERE TRUNC(MONTHS_BETWEEN(sysdate, fecna)/12) >=50 ;

7.1.2.- Borrado de tuplas. Sentencia DELETE. La sentencia DELETE permite borrar filas de una tabla o vista. Lgicamente la tabla debe ser propiedad del usuario que intenta realizar el borrado o bien tener privilegio de DELETE sobre ella, en cuyo caso deber calificar el nombre de la tabla, anteponindole el nombre del propietario y un punto. Su sintaxis es: DELETE [FROM] <tabla> [<alias>] [WHERE <predicado>] donde:

Dep. de Informtica

67

I.E.S. TRASSIERRA - Crdoba

SQL

<tabla>

es el nombre de la tabla de la que se van a eliminar las filas. Se le puede asignar un nombre local o alias, indicndolo despus. puede contener sentencias subordinadas, incluso con sentencias correlacionadas a la tabla del DELETE.

<predicado>

Esta sentencia borra todas las filas que cumplan el predicado de WHERE, como no pueden borrarse parcialmente desaparecen completas. Si se omite WHERE, se borran todas las filas de la tabla, por lo que hay que tener mucho cuidado con su uso. Ejemplo: Borrar el departamento de Planificacin dado de alta en ltimo lugar: DELETE FROM WHERE

tdepto numde=123 ;

7.1.2.- Modificacin de tuplas. Sentencia UPDATE. La sentencia UPDATE sirve para modificar una o varias tuplas de una tabla, permitiendo que se actualice una, varias o todas las columnas de la fila o filas seleccionadas, al contrario que el borrado y la insercin que trataban filas completas. Para actualizar filas de una tabla, sta debe ser propiedad del usuario que intenta realizar la actualizacin o bien tener privilegio de UPDATE sobre ella, en cuyo caso deber calificar el nombre de la tabla anteponindole el del usuario y un punto. Su sintaxis es: UPDATE <tabla> [<alias>] SET <col1> = <subconsulta> / <exp> / NULL , <col2> = <subconsulta> / <exp> / NULL ....

[WHERE <predicado>] donde: <tabla> es el nombre de la tabla a actualizar, a la que se le puede asignar un nombre local o alias, especificndolo detrs.

<subconsulta> especifica que la sentencia SELECT devolver el valor que se asignar a la columna correspondiente. <exp> NULL <predicado> es la expresin que deber devolver un valor acorde con la columna correspondiente. indica que la columna especificada tomar el valor nulo. puede contener sentencias subordinadas, incluso con sentencias correlacionadas a la tabla del UPDATE.

La sentencia UPDATE actualiza todas las filas que cumplan el predicado de WHERE, o todas si se omite esta clusula, modificando las columnas especificadas en la clusula SET. Ejemplos:
Dep. de Informtica 68

I.E.S. TRASSIERRA - Crdoba

SQL

1).- Actualizar todos los salarios redondendolos a euros (sin decimales) con un incremento del 3%. (antes debe comprobarse el resultado con una SELECT). UPDATE SET temple salar = ROUND(salar *1.03) ;

Resultado: 35 filas actualizadas. 2).- Honoria Vzquez (empleada n 500) ha ascendido en el mismo departamento y le han aumentado el sueldo hasta igualrselo al menor salario de la tabla mayores, dejando de percibir comisiones. Actualizar la tabla de empleados para que recoja estos cambios. UPDATE SET temple salar = (SELECT FROM comis = NULL numem= 500 ;

MIN(salar) mayores),

WHERE

Resultado: 1 fila actualizada Ejercicio: Aumentar un 10% los salarios de los empleados con salario inferior al salario medio de su departamento.

7.2.- SENTENCIAS TRANSACCIONALES.


Como sabemos una transaccin o Unidad Lgica de Trabajo (ULT) es una secuencia de operaciones de actualizacin que forman un todo, de forma que o se ejecutan todas o no se ejecuta ninguna, debiendo dejar la base de datos en estado coherente. Una transaccin comienza en la primera sentencia SQL tras: una sentencia COMMIT, una sentencia ROLLBACK o una conexin a la base de datos. Una transaccin termina con: una sentencia COMMIT, una sentencia ROLLBACK o una desconexin, intencionada o no, a la base de datos. El SGBD realiza un COMMIT implcito antes de ejecutar cualquier sentencia de LDD (create, alter, ..) o al realizar una desconexin que no haya sido precedida de un error. Las sentencias SQL que permiten gestionar explcitamente las transacciones son: COMMIT ROLLBACK SAVEPOINT

7.2.1.- COMMIT .-

Dep. de Informtica

69

I.E.S. TRASSIERRA - Crdoba

SQL

Seala el final de una transaccin y el principio de otra indicndole al sistema que se deben validar los cambios que se produjeron desde el principio de la transaccin que se da por concluida, hacindolos visibles para los dems usuarios. Su sintaxis es: COMMIT [WORK]; WORK es opcional, y no tiene ninguna trascendencia. Al hacer un COMMIT, se liberan todos los puntos de salvaguarda (SAVEPOINT) indicados hasta el momento.

7.2.2.- ROLLBACK.Seala el final de una transaccin y el principio de otra indicndole al sistema que se deben restaurar el estado de la base de datos tal y como estaba al comenzar la transaccin, es decir, deshace todos los cambios pendientes de validacin de la transaccin actual. Su sintaxis es: ROLLBACK [WORK] [TO [SAVEPOINT] <punto_salvaguarda>]; donde: WORK es opcional y no tiene ninguna trascendencia. TO [SAVEPOINT] <punto_salvaguarda> deshace slo los cambios efectuados desde el punto de salvaguarda indicado. La palabra reservada SAVEPOINT es opcional.

7.2.3.- SAVEPOINT.los puntos de salvaguarda son marcas que va poniendo el usuario durante la transaccin. Estas marcas permiten deshacer los cambios por partes en vez de deshacer toda la transaccin. Su sintaxis es: SAVEPOINT <punto de salvaguarda>; Los nombres de los puntos de salvaguarda pueden reutilizarse durante la transaccin. Al reutilizarlo el anterior punto se pierde. Al ejecutar ROLLBACK sin parmetros o COMMIT, se eliminan todos los puntos de salvaguarda. Al ejecutar ROLLBACK TO solo se borran los puntos posteriores al indicado. As, si escribimos: INSERT INTO ... SAVEPOINT A; DELETE ... ROLLBACK TO SAVEPOINT A; Se deshace solo el borrado, permaneciendo pendiente la insercin realizada con INSERT . SQL*Plus dispone de un comando para controlar las validaciones de forma automtica. Su sintaxis es:

Dep. de Informtica

70

I.E.S. TRASSIERRA - Crdoba

SQL

SET AUTOCOMMIT ON/OFF Si se especifica ON los cambios se validarn automticamente despus de cada operacin de actualizacin de datos. La opcin por defecto es OFF y permite que sea el usuario el que controle la validacin de los cambios con los comandos anteriores. Las sentencias del LMD y la desconexin de Oracle llevan implcita una validacin (commit). Si se produce la cada del sistema o la terminacin anormal de una aplicacin, se llevar a cabo una restauracin automtica, mediante la consulta al fichero diario o log. Oracle almacena temporalmente, en los llamados segmentos de rollback, la informacin necesaria para deshacer los cambios si se ejecuta un ROLLBACK y dejar la informacin en estado consistente. Puede comprobarse que el propietario de la tabla modificada, tiene constancia al instante de las modificaciones que se produzcan. Bastar hacer una consulta y observar el nuevo valor. El navegador es una herramienta del Administrador de la Base de Datos, por lo que al abrir una tabla nos da la visin que de la misma tiene aqul. Si abrimos una tabla con el Navegador, no apreciaremos los cambios hasta que se cierre la sesin del usuario (nos conectemos como otro usuario o salgamos de SQL, por ejemplo), o se ejecute el comando COMMIT.

7.3.- EJERCICIOS PROPUESTOS.1.- En aplicacin del convenio colectivo, aumentar todos los salarios en un 3,24 % y las comisiones en un 4,16 %. 2.- Debido a un nuevo sistema telefnico, modificar todas las extensiones telefnicas que comiencen por 8 de forma que se reemplace el 8 por un 9. 3.- Modificar las seas de los centros de trabajo, eliminando los tres primeros caracteres. Para los siguientes ejercicios vamos a crear la tabla TEMPLE2 vaca, con la siguiente sentencia que estudiaremos en el prximo tema. Baste decir que como el departamento 444 no existe, la subselect devuelve una tabla vaca, provocando que temple2 se cree con la misma estructura que temple, pero sin ninguna fila. CREATE TABLE temple2 AS ( SELECT * FROM temple WHERE numde=444 ) ; 4.- Insertar en temple2 una fila por cada empleado de temple cuyo salario total (salario ms comisin) supere al salario total medio de su departamento. 5.- En temple2, modificar el salario de los empleados con comisin aumentndolo en sta, poniendo nula su comisin.
Dep. de Informtica 71

I.E.S. TRASSIERRA - Crdoba

SQL

6.- En temple2, disminuir el salario en un 3% de los empleados cuyos salarios (en temple) superen en un 50% al salario mximo de su departamento. 7.- Borrar en temple2 a los empleados cuyo salario (sin incluir comisin) supere al salario medio de los empleados de su departamento. 8.- Borrar en temple2 a los empleados cuyo salario (sin incluir comisin) supere al salario medio de los empleados de su departamento, excluyndole a l mismo. 9.- Disminuir la fecha de ingreso de los directores de departamento en tantos meses como aos de antigedad cumplidos lleven en la empresa. 10.- Borrar todas las filas de temple2.
La tabla temple2 debe encontrarse vaca. Con el navegador crear la tabla TBORRA con una nica columna: numem, y sin ningn registro.

11.- Insertar en TBORRA los datos de los empleados que se jubilarn este ao, que son los que cumplan durante el presente ao 55 o ms aos de edad. 12.- Borrar de TEMPLE las filas de los empleados incluidos en TBORRA y almacenarlos en TEMPLE2. 13.- Modificar los salarios de los directores en propiedad de forma que ganen el doble del empleado mejor pagado de su departamento, excluido l mismo. 14.- Crear un archivo de comandos que al ejecutarlo permita insertar un nuevo centro de trabajo. La introduccin de datos se har con variables de sustitucin, validando en la medida de lo posible los datos de entrada (maysculas en campos carcter).

Dep. de Informtica

72

I.E.S. TRASSIERRA - Crdoba

SQL

TEMA 8.- EL LENGUAJE DE DEFINICIN DE DATOS.8.1.- Introduccin. 8.2.- Creacin de tablas: CREATE TABLE. 8.2.1.- Restricciones. 8.3.- Creacin de otros objetos. 8.3.1.- CREATE INDEX 8.3.2.- CREATE SYNONYM. 8.3.3.- CREATE WIEW. 8.3.4.- CREATE SEQUENCE. 8.4.- Modificacin de tablas: ALTER TABLE. 8.4.1.- Aadir y borrar restricciones. 8.4.2.- Activar y desactivar restricciones. 8.5.- Modificacin de secuencias: ALTER SEQUENCE. 8.6.- Eliminacin de objetos. 8.6.1.- DROP TABLE. 8.6.2.- DROP INDEX. 8.6.3.- DROP SYNONYM. 8.6.4.- DROP WIEW. 8.6.5.- DROP SEQUENCE. 8.7.- Renombrado de objetos: RENAME. 8.8.- Vaciado de una tabla. TRUNCATE. 8.9.- Ejercicios propuestos.

8.1.- INTRODUCCIN.Como ya sabemos el LDD es el conjunto de sentencias SQL que permiten la descripcin de la parte esttica del modelo relacional de datos, esto es: crear, modificar, renombrar y borrar objetos de la base de datos. Hasta ahora solo hemos manipulado objetos ya creados, ya es hora de que el alumno aprenda a crearlos, pues aunque suele ser responsabilidad del administrador, en ocasiones se autoriza a los usuarios a definir tablas privadas con datos solo interesantes para l, esto lleva a que el usuario debe ser capaz de crearlas, destruirlas cuando ya no las necesite y, si lo estima conveniente, autorizar a otros usuarios a usarlas, y todo ello solo si previamente el ABD lo ha autorizado para ello. Las sentencias que veremos son: CREATE ALTER DROP RENAME TRUNCATE Para crear objetos. Para modificar objetos ya creados. Eliminar objetos. Renombrar objetos. Eliminar los datos de una tabla. Solo queda la estructura.

Estas sentencias afectan a la esttica por lo que no se ven afectadas por el comando Rollback.
Dep. de Informtica 73

I.E.S. TRASSIERRA - Crdoba

SQL

8.2.- CREACIN DE TABLAS: CREATE TABLE.La sentencia CREATE TABLE permite la creacin de una tabla. Antes de crearla conviene tener claro el nombre de la tabla, y por cada una de las columnas sus nombres, tipos de datos que almacenarn, tamao, y cierta informacin adicional (columnas obligatorias, si admiten o no valores nulos, clave primaria, etc..). Sintaxis: CREATE TABLE

<tabla> ( col1 tipo[(tamao)] [NOT NULL] [restriccin] , col2 tipo[(tamao)] [NOT NULL] [restriccin] , .... [restriccines sobre varias columnas] )

[AS subconsulta] ; Los nombres de tabla deben ser nicos, con un mximo de 30 caracteres y comenzar con un carcter alfabtico. Por cada columna de la tabla hay que especificar un nombre y un tipo (el tamao solo es necesario para los tipos varchar2, char, number y raw). Los tipos de datos se vieron en un tema anterior y conviene que el alumno los repase. Si se especifica NOT NULL, el sistema impedir valores nulos en esa columna. La opcin por defecto es NULL. Al definir una columna puede especificarse una restriccin sobre ella. Despus de definir todas las columnas se especificarn las restricciones que afecten a varias de ellas (una clave primaria compuesta, por ejemplo) aunque tambin aqu pueden indicarse restricciones de una sola columna. La opcin AS subconsulta permite crear la tabla a partir de la consulta sobre una o varias tablas. En este caso no es necesario especificar las columnas, pues se toman de la subselect. Ejemplos: 1).CREATE TABLE enfermo ( numero NUMBER(5) NOT NULL, apellidos VARCHAR2(25), nombre VARCHAR2(15), direccion VARCHAR2(35), dpostal CHAR(5), telefono CHAR(9), fecha_nac DATE, sexo CHAR(1), numhijos NUMBER(2) );

Esta sentencia crea la tabla llamada ENFERMO, con 9 columnas, la primera de las cuales no admite valores nulos, esto es, debe tener siempre algn valor al insertar una nueva fila.

Dep. de Informtica

74

I.E.S. TRASSIERRA - Crdoba

SQL

2).- Crear la tabla COMERCIALES con las columnas numem, nomem y comis que contendr a los empleados de temple que cobran comisin. CREATE TABLE comerciales AS( SELECT numem, nomem, comis FROM temple WHERE comis IS NOT NULL ) ; 3).- Crear la tabla SALAR_DEP con las siguientes columnas: numde, salar_min, salar_med y salar_max, con los nmeros de departamentos, y los salarios mnimo, medio y mximo. CREATE TABLE salardep ( numde, salar_min, salar_med, salar_max) AS ( SELECT numde, min(salar), avg(salar), max(salar) FROM temple GROUP BY numde ) ;

La informacin acerca de las tablas y columnas en el diccionario de datos, se encuentra en las siguientes vistas del diccionario accesibles para cualquier usuario: USER_TABLES ALL_TABLES USER_TAB_COLUMNS ALL_ TAB_COLUMNS

8.2.1.- Restricciones.Una restriccin es una limitacin asociada a una o varias columnas. Oracle soporta sintcticamente restricciones sobre las tablas y sobre las columnas. Estas restricciones son almacenadas en el diccionario de datos y son: Obligatoriedad de columnas: NOT NULL. Unicidad sobre una o un conjunto de columnas: UNIQUE. Clave primaria: PRIMARY KEY. Clave ajena: FOREIGN KEY.... REFERENCES. Verificacin de condiciones: CHECK.

Para poderlas identificar, las restricciones pueden tener un nombre, y despus de definidas pueden ser activadas, desactivadas y eliminadas. Antes de proceder a la creacin de la tabla es necesario tenerla perfectamente diseada y descrito su comportamiento, para aplicarle correctamente las restricciones. El nombre de una restriccin debe ser nico, definido bien por el propietario del objeto o por el sistema. Si lo define el propietario del objeto en el momento de definir la restriccin debe ir precedido de la palabra CONSTRAINT nombre_restriccin tipo_restriccin.

Dep. de Informtica

75

I.E.S. TRASSIERRA - Crdoba

SQL

Si no se le asigna nombre en el momento de la creacin, el sistema generar uno por defecto: SYS_COOn.

Es una buena costumbre nombrar las restricciones segn el siguiente mnemotcnico: Cdigorestriccin_nombretabla_nombrecolumna Donde el Cdigo de restriccin es: CP = CLAVE PRIMARIA UQ = UNICIDAD CA = CLAVE AJENA CK = CHECK NN = OBLIGATORIO El nombre de la restriccin aparecer en los mensajes de error, en la documentacin, al activarla y desactivarla temporalmente o al borrarla. La informacin acerca de las restricciones definidas por el usuario, y sobre qu columnas han definido se encuentra en las siguientes tablas del diccionario de datos USER_CONSTRAINTS USER_CONS_COLUMNS

Hay dos formas de definir restricciones: en lnea o fuera de lnea. Se dice que una restriccin es en lnea cuando se define en el momento de describir una columna, a continuacin de su nombre, el tipo de dato y la precisin, de forma que solo afecta a esa columna. En este caso, no es obligatorio darles un nombre con la palabra clave CONSTRAINT, pero se generar uno por defecto. Su sintaxis es:

[CONSTRAINT <nombre>]

PRIMARY KEY / UNIQUE / NOT NULL / CHECK <condicin> / REFERENCES <tabla_externa>[(campo1[, campo2]...)] [ON DELETE CASCADE]

<tabla_externa> es el nombre de la tabla referenciada por la clave ajena. <campo1, campo2, ..> son las claves de la tabla externa por las que se establece la relacin. Puede omitirse si la relacin se establece por la clave primaria (suele ser lo habitual). ON DELETE CASCADE, hace que se borren todas las tuplas cuya clave ajena referencie (apunte) a una tupla borrada en la tabla referenciada. Ejemplo:
Dep. de Informtica 76

I.E.S. TRASSIERRA - Crdoba

SQL

CREATE TABLE editoriales ( codigo CHAR(4) PRIMARY KEY, nombre VARCHAR2(50) NOT NULL ); CREATE TABLE libros ( signa NUMBER(6) CONSTRAINT cp_libros_signa PRIMARY KEY, materia NUMBER(3) CONSTRAINT nn_libros_materia NOT NULL, titulo VARCHAR2(50) NOT NULL , autor VARCHAR2(30) , codedit CHAR (4) REFERENCES editoriales ); El usuario decide si quiere definirlas en lnea, o fuera de lnea (normalmente despus de la definicin de columnas). En este caso es obligatorio preceder la restriccin con la palabra clave CONSTRAINT para que el gestor distinga entre lo que es la definicin de la columna o la declaracin de la restriccin. En este caso la sintaxis varia, y se define de este modo: PRIMARY KEY (col_cp1[,col_cp2[,..] ] ) / UNIQUE (col_un1[,col_un2[,..] ] ) / NOT NULL (col_nn1[,col_nn2[,..] ] ) / CHECK (col_ck1[,col_ck2[,..] ] <condicin>) / FOREIGN KEY (col_ca1[,col_ca2[,..] ] ) REFERENCES <tabla_externa>[(campo1[,campo2]...)] [ON DELETE CASCADE]

[CONSTRAINT <nombre>]

dnde: col_cp1, col_un1, col_nn1, col_ck1, col_ca1 representan los nombres de las columnas que en cada caso se estn definiendo como clave primaria (cp), nico (uq), no nulo (nn), chequeo (ck) o clave ajena (ca). Genricamente puede expresarse as: CONSTRAINT nombre restriccin tipo_restriccin (campo1 [,campo2]...) Al definir una restriccin fuera de lnea hay que indicar a qu columnas de la tabla se aplica la restriccin, puesto que no est a continuacin de la definicin. En ciertos casos, como cuando una clave primaria esta compuesta de varias columnas, o cuando una restriccin se aade a posteriori, es obligatorio definirlas como "no en lnea". A continuacin se muestra un ejemplo: CREATE TABLE libros ( sign NUMBER(6) , materia NUMBER(3) , titulo VARCHAR2(50) CONSTRAINT nn_libros_titulo NOT NULL , autor VARCHAR2(30) , codedit CHAR (4) , CONSTRAINT cp_libros_sign_materia PRIMARY KEY (sign, materia), CONSTRAINT ck_libros_materia CHECK (materia BETWEEN 1 AND 300) , CONSTRAINT ca_libros_codedit FOREIGN KEY(codedit) REFERENCES editoriales ON DELETE CASCADE );

Dep. de Informtica

77

I.E.S. TRASSIERRA - Crdoba

SQL

Esta sentencia crea la tabla libros a la vez que define una clave primaria compuesta por los campos sign y materia, la materia no es necesario declararla no nula al ser parte de la clave primaria. Declara el campo titulo como obligatorio (no nulo), establece el dominio de la materia como un entero entre 1 y 300 ambos inclusive, y declara a codedit como clave ajena que referencia a la tabla editoriales, mediante la clave primaria de sta. Si la relacin se establece con otro atributo de editoriales (clave alternativa) debe indicarse entre parntesis despus del nombre de la tabla referenciada. Por ltimo se ha definido el borrado en cascada para las tuplas de esta tabla cuya tupla relacionada de la tabla editoriales sea borrada. Oracle dispone de la especificacin DEFAULT, que aunque no es una restriccin propiamente dicha, ofrece la posibilidad de indicar un valor por defecto a campos (columnas) que no se especifiquen en una sentencia INSERT. Otro ejemplo: En una gestin bancaria crear la tabla prestamos con todas sus restricciones y reglas. CREATE TABLE prestamos ( nocuenta NUMBER(6) CONSTRAINT nn_prest_nocuenta NOT NULL, noprestamo NUMBER (6) CONSTRAINT nn_prest_noprestamo NOT NULL CONSTRAINT uq_prest_noprestamo UNIOUE, tipopres VARCHAR2 (8) CONSTRAINT ck_prest_tipopres CHECK (ti po pres IN ('PERS', 'CASA', 'COCHE')), cantidad NUMBER(8,O) CONSTRAINT nn_prest_cantidad NOT NULL, fechapres DATE DEFAULT sysdate, aprobadopor VARCHAR2(15) CONSTRAINT ca_prest_aprobadopor REFERENCES jefes(nombre_dir) , CONSTRAINT cp_prest PRIMARY KEY (nocuenta, noprestamo), CONSTRAINT ca_prest_cuenta FOREIGN KEY (nocuenta) REFERENCES clientes(no_cuenta) ) ;

8.3. CREACIN DE OTROS OBJETOS.Un objeto de base de datos es algo definido y almacenado en una base de datos. Los objetos de base de datos son: tablas, vistas, ndices, sinnimos, enlaces de base de datos, roles, secuencias, rplicas, usuarios, disparadores, paquetes, procedimientos y funciones.

8.3.1.- CREATE INDEX.Un ndice se utiliza para recuperar con rapidez informacin de un proyecto de base de datos. Al igual que los ndices de los libros ayudan a recuperar informacin especfica con ms rapidez, un ndice de base de datos proporciona acceso rpido a los datos de las tablas. El indexado crea una lista de registros en un orden lgico, as como su correspondiente posicin fsica en la tabla. Los ndices se crean para encontrar y visualizar registros con rapidez, sobre todo en tablas de gran tamao o en bases de datos que constan de muchas tablas. Los ndices se crean en una o ms columnas de una tabla. Una vez creados, la base de datos de Oracle8 los mantiene y los utiliza de forma automtica. Los cambios que se realicen a los
Dep. de Informtica 78

I.E.S. TRASSIERRA - Crdoba

SQL

datos de la tabla (como aadir o eliminar filas) se incorporan de forma automtica en todos los ndices relevantes. El usuario puede crear los ndices que estime conveniente, pero antes de indexar por una columna es conveniente que cumpla ciertos requisitos: Ser consultada con frecuencia. No sufrir alteraciones de operadores o funciones cuando se consulta (1). Contener un volumen importante de informacin (muchas tuplas con valores). Tener muchos valores diferentes.

En general, cuanto mas corto es el ndice mas eficaz resulta. Los ndices pueden ser simples o compuestos de varias columnas. En este caso las columnas no tienen que ser consecutivas ni del mismo tipo de datos. Un ndice compuesto lo puede estar hasta por 16 columnas o de 240 caracteres. Los ndices pueden ser nicos o no. Si un ndice se define como nico, significa que no puede tener valores repetidos. Las restricciones UNIQUE y PRIMARY KEY llevan implcita la creacin del ndice si no se crean desactivadas y en ambos casos es nico. La sentencia CREATE INDEX tiene la siguiente sintaxis: CREATE [UNIQUE] INDEX ON nombre_indice tabla campo1, campo2, .. nombre_indice tabla (campo1 [,campo2[,..]]) ;

Es el nombre que le asignamos al ndice. Conviene seguir la notacin usada en las restricciones. Es el nombre de la tabla sobre la que vamos a crear el ndice. Son los nombre de los campos sobre los que se va a indexar.

Ejemplo: Indexar la tabla temple por salario. CREATE INDEX ON temple_salar temple(salar) ;

(1) El ndice creado ser usado por la siguiente sentencia, aumentando la velocidad de ejecucin. SELECT nomem, salar FROM temple WHERE salar BETWEEN 1200 AND 2200 ; Sin embargo no ser usado en la siguiente: SELECT nomem, salar FROM temple WHERE salar/2 BETWEEN 600 AND 1100 ; Puede comprobarse que el resultado es el mismo, aunque en el primer caso, la ordenacin por salario denota el uso del ndice. Los tiempos de ejecucin seran visibles si dispusiramos de decenas de miles de tuplas, que es lo habitual en bases de datos gestionados con Oracle.
Dep. de Informtica 79

I.E.S. TRASSIERRA - Crdoba

SQL

Si se trata de un ndice compuesto de varios campos, para que el ndice sea utilizado, la primera columna del ndice debe aparecer en el predicado de la condicin donde se use. Las tablas del diccionario de datos con informacin acerca de ndices accesibles para el usuario son: USER_INDEXES ALL_INDEX USER_IND_COLUMNS ALL_IND_COLUMNS Consultndolas podremos saber los ndices activos para poder referirnos a ellos (para su borrado, por ejemplo). Ejemplos: SELECT * FROM user_indexes ; SELECT index_name, index_type, table_name FROM user_indexes ; SELECT * FROM USER_IND_COLUMNS ;

8.3.2.- CREATE SYNONYM.Un sinnimo es un alias de una tabla, una vista, una secuencia o una unidad de programa. Un sinnimo no es un objeto en s mismo, pero es una referencia directa a un objeto. Los sinnimos se utilizan para: Enmascarar el nombre real y el propietario de un objeto. Proporcionar acceso pblico a un objeto Proporcionar un nombre sencillo para un objeto de base de datos. Enmascarar la ubicacin real de un objeto de base de datos (por ejemplo, una tabla se encuentra en una base de datos de Madrid y otra tabla se encuentra en una base de datos de Barcelona. Si utiliza sinnimos, al usuario le parecer que ambas tablas se encuentran en el mismo sitio).

Los sinnimos pueden ser privados o pblicos. Un sinnimo privado slo es utilizable por la persona que crea el sinnimo (es su propietaria) y se necesita el privilegio CREATE SYNONYM. Un sinnimo pblico es aqul que puede utilizar cualquier usuario para tener acceso a una base de datos, y para crearlos se necesita el privilegio CREATE PUBLIC SYNONYM. Independientemente de la creacin del sinnimo es necesario tener acceso al objeto sobre el que se desea crear dicho sinnimo, o bien ser su propietario. A diferencia del alias, el sinnimo no es temporal y permanece hasta que es borrado. Cuando los usuarios que no son propietarios de un objeto de base de datos, como una tabla, desean hacer referencia a esa tabla, pueden utilizar un sinnimo para hacer referencia a dicha tabla. Generalmente, los Administradores de Base de Datos crean sinnimos pblicos para que los objetos de base de datos estn disponibles en todo el sistema y puedan utilizarlos los usuarios de la base de datos.
Dep. de Informtica 80

I.E.S. TRASSIERRA - Crdoba

SQL

La sentencia CREATE SYNONYM tiene la siguiente sintaxis: CREATE [PUBLIC] SYNONYM sinnimo FOR objeto ; Sinnimo objeto Es el nombre asignado al sinnimo. Es el nombre del objeto sobre el que creamos el sinnimo. Si pertenece a otro propietario deberemos preceder su nombre con el de aqul y un punto.

Ejemplos: 1).- Crear un sinnimo privado sobre la tabla temple, son el nombre de emp. CREATE SYNONYM FOR emp temple ;

2).- Crear el sinnimo salario para el ndice creado en el ejemplo de la pregunta anterior. CREATE SYNONYM for salario temple_salar ;

3).- Crear el sinnimo pblico dep para la tabla tdepto. CREATE PUBLIC SYNONYM FOR dep tdepto

Producir el error de privilegios insuficientes. Las tablas del diccionario de datos con informacin acerca de los sinnimos accesibles para el usuario son: USER_SYNONYMS ALL_SYNONYMS

8.3.3.- CREATE VIEW.Una vista es un presentacin personalizada de los datos de una o ms tablas. Las vistas extraen los datos de las tablas en las que se basan, denominadas tablas base. Todas las operaciones que se realizan en una vista afectan de hecho a las tablas base de la vista. Utilice las vistas para: Proporcionar un nivel adicional de seguridad de tabla limitando el acceso a un conjunto predeterminado de columnas y filas de tabla. Por ejemplo, cree una vista que no incluya datos sensibles, como la informacin sobre sueldos. Ocultar la complejidad de los datos. Normalmente, las bases de datos de Oracle8 incluyen muchas tablas y, si crea una vista que combine informacin de dos o ms tablas, facilita a otros usuarios el acceso a la informacin de su base de datos. Por ejemplo, podra tener una vista que sea una combinacin de su tabla Empleado y su tabla Departamento. Un usuario que consulte esta vista, que ha denominado emp_dept, slo tiene que ir a un sitio
81

Dep. de Informtica

I.E.S. TRASSIERRA - Crdoba

SQL

para obtener la informacin, en lugar de tener que acceder a las dos tablas que componen esta vista. Presentar los datos con una perspectiva distinta de la que tiene la tabla base. Las vistas permiten cambiar el nombre a las columnas sin que afecte a la tabla base. Almacenar consultas complejas. Por ejemplo, puede que una consulta realice clculos extensos con la informacin de las tablas. Si se guarda esta consulta como una vista, los clculos slo se realizarn cuando se consulte la vista.

Una vista es una tabla lgica. La tabla no se crea fsicamente sino que lo que se almacena es la SELECT de creacin de la vista. Cuando se recuperan filas de una vista, ocurre que se accede a la sentencia SELECT que la compone y que se encuentra almacenada, y se ejecuta. La sintaxis de la sentencia CREATE WIEW es: FORCE / CREATE [OR REPLACE] NOFORCE VIEW nombre_vista [(coI1, col2, ...)] AS subconsulta WITH CHECK OPTION ;

OR REPLACE FORCE

Recrea la vista si ya existe Esto permite cambiar la definicin de la vista sin tener que borrarla y volver a crearla. Crea la vista incluso si hay problemas de acceso por insuficientes privilegios a los objetos de la subconsulta en que se basa la creacin de la vista. Es la opcin por defecto y no crea la vista si se producen errores en la definicin Si la vista permite inserciones, comprobar la condicin WHERE impuesta, no solo en el momento de componer la vista, sino tambin a la hora de realizar inserciones sobre ella.

NOFORCE WI'TH CHECK OPTION

Ejemplos: 1).- Crear la vista de nombre COMISIONISTAS sobre la tabla temple que contendr las columnas numem , nomem y comis de los empleados con comisin. CREATE VIEW AS SELECT FROM WHERE comisionistas numem, nomem, comis temple comis IS NOT NULL ;

2).- Crear la vista DIRDEPART que contendr las siguientes columnas: numero y nombre de empleado y el nmero y nombre de departamento de todos lo directores. CREATE OR REPLACE VIEW AS SELECT FROM
Dep. de Informtica

dirdepart numem, nomem, E.numde, nomde temple E, tdepto D


82

I.E.S. TRASSIERRA - Crdoba

SQL

WHERE

E.numem=D.direc ;

Sobre una vista no existen restricciones en consulta, pero si en actualizacin insercin y borrado. Si se cumplen las condiciones impuestas, la actualizacin, insercin o borrado se lleva a cabo sobre la tabla base sobre la que se defini la vista. Para que una vista sea actualizable (permitir UPDATE), ninguna de las columnas que forman la vista puede estar modificada por una expresin. Para que la vista permita inserciones (INSERT INTO vista), la vista en su definicin debe contener todas las columnas obligatorias de la tabla que la forma. Para que la vista permita borrado de filas (DELETE FROM vista), la vista debe estar creada sobre una sola tabla (no admite join). No puede incorporar clusulas DISTINCT ni GROUP BY. No puede ser definida con funciones de grupo ni pseudocolumnas (SUM(sal) o rowid).

Las tablas del diccionario de datos con informacin acerca de vistas accesibles para el usuario son: USER_VIEWS ALL_VIEWS

8.3.4.- CREATE SEQUENCE.Una secuencia es un objeto que permite generar nmeros secuenciales enteros y nicos. Esto puede ser muy til, por ejemplo, para conseguir claves primarias de forma automtica. Supongamos, por ejemplo, que dos usuarios insertan al mismo tiempo filas nuevas en la tabla de empleados. Al utilizar una secuencia para generar nmeros de empleados nicos para la columna NUMEMP, ningn usuario tiene que esperar a que el otro introduzca el siguiente nmero de empleado disponible. La secuencia genera automticamente los valores correctos para cada usuario. Adems y dado que es un objeto como otro cualquiera de la Base de Datos, puede ser utilizado por mltiples usuarios. Para crear una secuencia, se debe poseer un privilegio denominado CREATE SEQUENCE. Su sintaxis es: CREATE SEQUENCE esquema.nombre_de_secuencia [INCREMENT BY entero ] [START WITH entero ] [MAXVALUE entero ] [NOMAXVALUE ] [MINVALUE entero ] [NOMINVALUE ] [CYCLE ] [NOCYCLE ] [CACHE/NOCACHE ]; INCREMENT BY Determina el salto entre los nmeros secuenciales. Puede ser un entero negativo o positivo. De ese modo, hacemos secuencias ascendentes o descendentes. No puede ser cero y el valor por defecto es 1.

Dep. de Informtica

83

I.E.S. TRASSIERRA - Crdoba

SQL

START WITH

Determina el primer nmero secuencial que ser generado. Los valores por defecto son: MINVALUE si la secuencia es creciente, MAXVALUE si es decreciente o 1 si es creciente y no se especifica MINVALUE. Determina el valor mnimo de la secuencia. Valor 1 para las secuencias ascendentes y -1026 para las descendentes. Valor mximo que genera la secuencia. Valor de 1027 para las ascendentes y -1 para las descendentes.

MINVALUE NOMINVALUE MAXVALUE NOMAXVALUE

CYCLE/ NOCYCLE La secuencia entra en un ciclo cuando alcanza su valor mximo o mnimo, o por el contrario, si se alcanza el valor mximo o mnimo, no se pueden generar ms nmeros. NOCYCLE por defecto. CACHE/NOCACHE Almacena o no un nmero determinado de valores en memoria cache. Una vez que se ha creado la secuencia puede ser accedida utilizando dos pseudocolumnas: CURRVAL devuelve el valor actual de la secuencia. NEXTVAL incrementa el valor de la secuencia y lo devuelve (la primera vez solo lo devuelve). Ejemplos: 1).- Crear la secuencia sequ1 que comience por 100 y vaya generando nmeros de tres en tres CREATE SEQUENCE START WITH INCREMENT BY sequ1 100 3;

2).- Conseguir un nmero de la secuencia anterior: SELECT FROM sequ1.nextval dual ;

3).- Insertar una tupla extrayendo su valor de la secuencia anterior: INSERT INTO ALUMNOS VALUES (sequ1.nextval, 'Francisco Valiente'); Las tablas del diccionario de datos con informacin acerca de las secuencias, y accesibles para el usuario son: USER_SEQUENCES ALL_SEQUENCES

8.4.- MODIFICACIN DE TABLAS: ALTER TABLE.El comando ALTER TABLE permite modificar la estructura de una tabla para:

Dep. de Informtica

84

I.E.S. TRASSIERRA - Crdoba

SQL

Aadir columnas a una tabla ya creada. Modificar el tipo de dato o la precisin de una columna. Aadir, activar o desactivar temporalmente y borrar restricciones de integridad referencial sobre la tabla.

Este comando no permite eliminar una columna de una tabla. Su sintaxis es: ADD ( col1 tipo[(tamao)] [NOT NULL] [restriccin], col2 tipo[(tamao)] [NOT NULL] [restriccin], ... [ restricciones fuera de lnea ] )/ MODIFY ( col1 tipo[(tamao)] [NOT NULL] , col2 tipo[(tamao)] [NOT NULL] ) / DROP CONSTRAINT restriccin DISABLE CONSTRAINT restriccin ENABLE CONSTRAINT restriccin Ejemplos: 1).- Aadir una columna a la tabla de departamentos que contenga el numero de empleados que trabaja en cada departamento ALTER TABLE tdepto ADD (no_empl number(4)) ; 2).- Modificar la longitud de la columna seas en la tabla de centros, aumentndola a 55 posiciones. Aadir la caracterstica de obligatoriedad a esa columna. ALTER TABLE MODIFY tcentr ( seas varchar2(55) NOT NULL ) ; / / /

ALTER TABLE tabla ;

8.4.1.- Aadir y borrar restricciones .Se pueden aadir restricciones de integridad referencial a posteriori. En el momento que se aade, se bloquea toda la tabla y se produce la comprobacin de la restriccin que se desea incorporar. Si alguna fila no la cumple, la restriccin no se aade. Ejemplos: 1).- Aadir una restriccin a la tabla tcentro. La situacin de los centros de trabajo (seas) debe ser nica. ALTER TABLE tcentr ADD CONSTRAINT uq_cent_seas UNIQUE (seas) ;

La sintaxis para aadir restricciones una vez creada la tabla es similar a la de las restricciones "no en lnea". Esto significa que se debe de indicar tras el comando ALTER TABLE la palabra clave CONSTRAINT seguida de un nombre (obligatorio) luego el tipo de restriccin a aplicar, y por ltimo sobre qu columna de la tabla se desea aplicar dicha restriccin.
Dep. de Informtica 85

I.E.S. TRASSIERRA - Crdoba

SQL

2).- Aadir una restriccin en la tabla lnea de facturas. Cada vez que se borre una cabecera de factura se borran las lneas asociadas en cascada. Ntese que la restriccin no se aplica en la tabla maestra (la de cabeceras de facturas) sino en la DETALLE (en este caso la de lneas). ALTER TABLE linea_factura ADD CONSTRAINT ca_linea_facturas_idfactura FOREIGN KEY (idfactura) REFERENCES facturas ON DELETE CASCADE ; Cuando se borre una factura, (DELETE FROM facturas WHERE idfactura=2344) se visualiza el mensaje "N filas borradas" que se refiere a las cabeceras, aunque se hayan borrado una cabecera y sus siete lneas. Cuando se define una clave ajena se puede hacer referencia explcita a la tabla referenciada REFERENCES tabla(col), o implcita REFERENCES tabla. En el caso del borrado en cascada la sintaxis slo permite referencia implcita, es decir, solo admite la relacin de la clave ajena con la clave primaria de la tabla referenciada. Para borrar restricciones se utiliza la sintaxis: ALTER TABLE tabla DROP [UNIQUE (col1 [,col2])] [PRIMARY KEY] [CONSTRAINT restriccin ] [CASCADE ]; CASCADE Hace que al borrar una restriccin UNIQUE o PRIMARY KEY, se borre dicha restriccin y adems se eliminen todas las claves ajenas que apunten a la clave.

Ejemplo: Eliminar una restriccin de unicidad llamada uq_nomde sobre la columna nomde de la tabla tdepto mediante dos variaciones del comando ALTER TABLE. ALTER TABLE tdepto DROP CONSTRAINT uq_nomde ; o bien ALTER TABLE tdepto DROP CONSTRAINT UNIQUE(nomde) ;

8.4.2.- Activar y desactivar restricciones. Desactivar una restriccin permite que dicha restriccin no se compruebe temporalmente. NO ES IGUAL que borrar la restriccin. Se usa para incrementar la

Dep. de Informtica

86

I.E.S. TRASSIERRA - Crdoba

SQL

velocidad en cargas de datos masivas, aunque Loader la herramienta de Oracle deshabilita automticamente todas las restricciones. Cuando se intenta desactivar una clave primaria o nica que est referenciada, primero habr que desactivar las claves ajenas que la referencian o utilizar DISABLE CASCADE. Al desactivar una clave primaria o nica tambin se destruyen los ndices asociados. Sintaxis: ALTER TABLE tabla DISABLE [UNIQUE (col1 [,col2])] [PRIMARY KEY] [CONSTRAINT restriccin ] [CASCADE] ; CASCADE Desactiva todas las dependencias asociadas

Oracle tambin permite activar la comprobacin de restricciones no activadas. En el momento que se crea una restriccin se activa a no ser que se indique la clusula DISABLE. Cuando se activa posteriormente: Bloquea la tabla completa hasta que se termine la comprobacin. Comprueba una a una las filas. Si alguna de las filas no cumple la restriccin, no podr llegar a activarse.

Al habilitar una clave primaria o nica se vuelven a construir los ndices asociados. Sintaxis: ALTER TABLE tabla ENABLE [UNIQUE (col1 [,col2))] [PRIMARY KEY] [CONSTRAINT restriccin ] [EXCEPTIONS INTO tabla_excepciones ]; Excepciones activando restricciones.- Cuando se intenta activar una restriccin con la opcin EXCEPTIONS INTO, y no se puede, por cada fila que no cumpla la restriccin se puede guardar en una tabla creada previamente la siguiente informacin: Rowid. Usuario propietario de la tabla. Nombre de la tabla en la que se encuentra la restriccin. Nombre de restriccin que no se cumple.

La tabla de excepciones deber haberse creado previamente en SQL *Plus con la estructura: CREATE TABLE tabla_excepciones ( identificador_fila propietario nombre_tabla restriccin rowid , varchar2(30), varchar2(30) , varchar2(30) ) ;
87

Dep. de Informtica

I.E.S. TRASSIERRA - Crdoba

SQL

Oracle ofrece el script de ejemplo: C:\oraclexe\app\oracle\product\10.2.0\server\RDBMS\ADMIN\utlexcpt.sql

La tabla sobre la cual se han definido las restricciones que no han podido activarse, podr ser actualizada a partir de los resultados almacenados en tabla_excepciones.

8.5.- MODIFICACIN DE SECUENCIAS: ALTER SEQUENCE .El comando ALTER SEQUENCE permite modificar las caractersticas y el comportamiento de una secuencia. Algunas caractersticas pueden modificarse, como cycle/nocycle e increment by. Otras, como start with, no pueden alterarse. Por ltimo, la modificacin de otras caractersticas depender del estado actual de la secuencia, por ejemplo no puede fijarse un valor para MAXVALUE inferior a CURVAL. La secuencia debe pertenecer al usuario o poseer el privilegio ALTER sobre ella. Su sintaxis es muy parecida a la de creacin: ALTER SEQUENCE esquema.nombre_de_secuencia [INCREMENT BY entero ] [START WITH entero ] [MAXVALUE entero ] [NOMAXVALUE ] [MINVALUE entero ] [NOMINVALUE ] [CYCLE ] [NOCYCLE ]; El significado de los diferentes valores coincide con los del comando CREATE SEQUENCE.

8.6.- ELIMINACIN DE OBJETOS.8.6.1.- DROP TABLE.Permite eliminar una tabla. Sintaxis: DROP TABLE nombre_de_tabla [CASCADE CONSTRAINTS] ; Ejemplo: Eliminar la tabla PRODUCTOS con todas sus filas y las claves ajenas que apunten a cualquier columna de PRODUCTOS. DROP TABLE productos CASCADE CONSTRAINTS;

Dep. de Informtica

88

I.E.S. TRASSIERRA - Crdoba

SQL

8.6.2.- DROP INDEX.Permite eliminar un ndice de una tabla. Sintaxis: DROP INDEX nombre_ndice ;

A partir de este momento la columna en cuestin ya no esta indexada. En el comando DROP INDEX es indiferente que el ndice sea nico o no. La informacin acerca de los ndices est almacenada en el diccionario en las tablas: USER_INDEXES USER_IND_COLUMNS Para borrar un ndice se debe ser el propietario de la tabla en la que estn los ndices o tener un privilegio llamado DROP ANY INDEX.

8.6.3.- DROP SYNONYM.Se puede borrar un sinnimo sobre una tabla, procedimiento, vista, etc utilizando el siguiente comando. Sintaxis: DROP [PUBLIC] SYNONYM nombre_sinnimo ; Con el uso de este comando no se borra el objeto, sino el alias permanente del objeto. La informacin referente a sinnimos se encuentra en las siguientes tablas: USER_SYNONYMS ALL_SYNONYMS Para borrar un sinnimo basta con ser el propietario (haberlo creado). En el caso de que el sinnimo que se desea borrar sea pblico, es necesario tener el privilegio DROP PUBLIC SYNONYM.

8.6.4.-DROP VIEW.Se puede eliminar una vista de una tabla utilizando este comando que tiene la siguiente sintaxis: DROP VIEW nombre_vista ; 8.6.5.- DROP SEQUENCE.Sirve para eliminar una secuencia de la BD. Sintaxis DROP SECUENCE nombre_secuencia ;

Dep. de Informtica

89

I.E.S. TRASSIERRA - Crdoba

SQL

Suele ser el mtodo utilizado para resetear una secuencia. Se borra y luego se vuelve a crear con los valores deseados. Ejemplo: DROP SECUENCE sequ1 ;

8.7.- RENOMBRADO DE OBJETOS: RENAME.Cambia el nombre de un objeto (tabla, procedimiento, vista, etc...) por otro de forma permanente. Los ndices no pueden renombrarse, por lo que deberan ser borrados y vueltos a crear con otro nombre. Sintaxis: RENAME nombre_antiguo TO nombre_nuevo; La informacin sobre los objetos de un usuario se encuentran en el diccionario en la vista: USER_OBJECTS Para renombrar un objeto se debe ser propietario del mismo.

8.8.- VACIADO DE UNA TABLA: TRUNCATE .Borra filas de una tabla o ndice sin eliminar la estructura del objeto. Es similar a DELETE, pero no hay posibilidad de deshacer la transaccin (ROLLBACK), ni de hacer un borrado restrictivo (clusula WHERE). Sintaxis: TRUNCATE TABLE nombre_tabla [DROP STORAGE]/[REUSE STORAGE] Para truncar un objeto, se debe ser propietario del mismo o tener el privilegio DELETE ANY TABLE. La opcin DROP STORAGE libera el espacio que el objeto ha tomado a la base de datos. La opcin REUSE STORAGE (por defecto) mantiene reservado el espacio previamente adquirido para dicho objeto. Al truncar una tabla se truncan de forma implcita los ndices de dicha tabla.

8.9.- EJERCICIOS PROPUESTOS.1.- Crear las tablas: EMPLEADOS, DEPARTAMENTOS y CENTROS, con estructuras similares a las tablas TEMPLE, TDEPTO y TCENTR y con sus mismas tuplas, restricciones y relaciones.

Dep. de Informtica

90

I.E.S. TRASSIERRA - Crdoba

SQL

A.- Con subconsulta. Guardando las sentencias en CREATAB_A.SQL. Despus de creadas se borrarn. B.- Sin subconsulta (suponiendo que no disponemos de tablas similares). El alumno deber crear todas las restricciones que crea oportuno, y guardar las sentencias necesarias en el archivo de comandos CREATAB_B.SQL. C.- Insertar en las tablas todas las tuplas de sus tablas homogneas tcentr, tdepto y temple. 2.- Sobre la tabla EMPLEADOS: 2.1.- Aadir el campo Sexo. 2.2.- Con dos instrucciones, poner a M el campo sexo de tod@s l@s emplead@s cuyo nombre propio termine por la letra A. Y en H para el resto. 2.3.- Disminuir el salario de tod@s l@s emplead@s en un 8 %. 2.4.- Eliminar el campo Sexo. 2.5.- Eliminar la clave ajena. 2.6.- Crear de nuevo la clave ajena antes eliminada. 3.- Sobre la tabla CENTROS: 3.1.- Borrar todos sus registros manteniendo su estructura. 3.2.- Borrar la tabla. 4.- Crear (o recrear) la vista DIRDEPART que contendr los datos de los directores de departamentos y con las siguientes columnas: numero de empleado, 20 primeros caracteres del nombre de empleado, el nmero de departamento y los 20 primeros caracteres del nombre de departamento. Siendo los nombres de sus columnas: num_empl, nom_empl, num_dept y nom_dept, respectivamente. 5.- Crear los sinnimos emp, dep y cen sobre las tablas empleados, departamentos y centros, respectivamente. 6.- Borrar los anteriores sinnimos. 7.- Disminuir a 30 caracteres la longitud de la columna nomce de la tabla centros. Las sentencias necesarias se guardarn en el archivo EJER8_7.SQL. 8.- Crear la secuencia S1 que comenzar por el nmero 3000 y disminuir de 3 en 3 hasta llegar a 2000. Despus de creada, se consultar la secuencia creada. Posteriormente se obtendrn tres valores de la secuencia y se volver a consultar para ver lo cambios. 9.- Modificar la anterior secuencia para que sea cclica. 10.- Modificar la anterior secuencia para que vare entre el 3000 y el -2000, pero que comience por el 1996. Posteriormente se extraern cuatro valores. 11.- Borrar la anterior secuencia. Comprobando su inexistencia mediante una consulta a la tabla de secuencias del usuario.
Dep. de Informtica 91

I.E.S. TRASSIERRA - Crdoba

SQL

12.- Debido a un supuesto gran nmero de empleados y al aumento de consultas por salario, se os encarga crear el ndice ind_salar. 13.- Crear el ndice ind_numde_numem sobre las columnas numde y numem de la tabla empleados. Posteriormente se disearn dos consultas de forma que la primera le permita a SQL usar el ndice creado, y la segunda no. 14.- Renombrar el anterior ndice con el nombre de ind_dep_emp. 15.- Borrar los anteriores ndices. 16.- Crear, la vista dep111, con los datos de los empleados del departamento 111 que no son directores. Despus de creada, consultar todos sus datos. Por ltimo eliminar todas sus tuplas manteniendo la estructura. 17.- Desactivar la restriccin de clave primaria de la tabla centros. Despus, y para comprobar que se encuentra desactivada, insertar el centro de SEGURIDAD con el nmero 10 y sito en la calle Julio Romero, 10 de Crdoba. Por ltimo intentar activar la restriccin. 18.- Disear las tablas para la gestin bsica de un videoclub: SOCIOS, VIDEOS, PRESTAMOS e HISPRES (histrico de prstamos donde adems de los datos de prstamos figurar la fecha de devolucin). Se sabe que: Cada ejemplar de vdeo lleva un cdigo identificador. El tipo de socio puede ser uno de los siguientes (E, 1, 2, A). Los vdeos son todos de la misma categora. En la tabla de prestamos solo se almacenarn los pendientes de devolucin.

Crear el ndice ind_fecha sobre la tabla histrica. Las sentencias LDD necesarias se guardarn en el fichero CREAVIDEO.SQL

Dep. de Informtica

92

I.E.S. TRASSIERRA - Crdoba

SQL

BIBLIOGRAFA:
- SQL para usuarios y programadores. J. Benavides. Paraninfo. 1991 - ORACLE 10G: SQL, PL-SQL, SQL PLUS (RECURSOS INFORMATICOS). Jerome Gabillaud. Eni. 2005. - SQL. Philip J. Pratt, Mary Z. Last. Anaya Multimedia. 2009. - Oracle Database 10g Manual del administrador. Kevin Money, Bob Bryla. McGraw-Hill / Interamericana de Espaa, S.A.

Dep. de Informtica

93

S-ar putea să vă placă și