MANUAL DE SQL PARA ORACLE 9i

download MANUAL DE SQL PARA ORACLE 9i

of 83

Transcript of MANUAL DE SQL PARA ORACLE 9i

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    1/83

    Manual de SQLpara Oracle 9i

    Manual de referencia

    Autor: Jorge Snchez (www.jorgesanchez.net) ao 2004e-mail: [email protected]

    Este trabajo est protegido bajo una licencia de Creative Comm ons deltipoAttribution-NonCommercial-ShareAlike.

    Para ver una copia de esta licencia visite:

    http://creativecommo ns.org/licenses/by-nc-sa/2.0/

    o enve una carta a:

    Creative Comm ons, 559 Nathan Abbott Way, Stanford , California94305, USA.

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    2/83

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    3/83

    Los contenidos de este documento estn protegidos bajo una licencia de Creative Commons deltipo Attribution-Noncomercial-Share Alike. Con esta licencia:

    Eres libre de:

    Copiar, distribuir y mostrar este trabajo

    Realizar modificaciones de este trabajo

    Bajo las siguientes condiciones:

    Attribution (Reconocimiento). Debe figurar siempre el autororiginal de este trabajo

    Noncommercial (No comercial) . No puedes utilizar este trabajocon propsitos comerciales.

    Share Alike (Compartir igual) . Si modificas, alteras o construyesnuevos trabajos a partir de este, debes distribuir tu trabajo con unalicencia idntica a sta

    Si estas limitaciones son incompatible con tu objetivo, puedes contactar con el

    autor para solicitar el permiso correspondiente

    No obstante tu derecho a un uso justo y legtimo de la obra, as como derechos

    no se ven de manera alguna afectados por lo anteriormente expuesto.

    Esta nota no es la licencia completa de la obra, sino una traduccin del resumen en formato

    comprensible del texto legal. La licencia original completa (jurdicamente vlida y pendiente de

    su traduccin oficial al espaol) est disponible en http://creativecommons.org/licenses/by-nc-sa/2.0/legalcode

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    4/83

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    5/83

    5

    nnddiiccee

    ndice.............................................................................................. 5notas previas.................................................................................. 7introduccin.................................................................................... 9

    Historia del lenguaje SQL..................................................................... 9estructura del lenguaje SQL................................................................ 12normas de escritura ........................................................................... 12

    tablas ........................................................................................... 13esquemas de usuario y objetos ........................................................... 13creacin de tablas ............................................................................. 13orden DESCRIBE ............................................................................... 14orden INSERT.................................................................................... 14consultar las tablas del usuario........................................................... 14borrar tablas ..................................................................................... 14tipos de datos ................................................................................... 15modificar tablas................................................................................. 18valor por defecto ............................................................................... 19restricciones ...................................................................................... 19

    consultas SELECT .......................................................................... 27capacidades ..................................................................................... 27sintaxis sencilla.................................................................................. 27clculos ............................................................................................ 27condiciones....................................................................................... 28ordenacin ....................................................................................... 31funciones.......................................................................................... 31obtener datos de mltiples tablas........................................................ 39agrupaciones .................................................................................... 43subconsultas ..................................................................................... 46combinaciones especiales .................................................................. 48

    comandos internos en SQL e iSQL*Plus....................................... 50variables de sustitucin ...................................................................... 50comando SET.................................................................................... 51encabezado y pie de informe.............................................................. 52

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    6/83

    Manual de SQL para Oracle 9i

    notas previas

    6

    COLUMN .........................................................................................53BREAK...............................................................................................54COMPUTE ........................................................................................55

    DML .............................................................................................. 59introduccin ......................................................................................59insercin de datos..............................................................................59actualizacin de registros....................................................................60borrado de registros...........................................................................61comando MERGE ..............................................................................61transacciones.....................................................................................63

    objetos de la base de datos......................................................... 65vistas.................................................................................................65secuencias.........................................................................................67ndices ..............................................................................................69sinnimos..........................................................................................70

    consultas avanzadas.................................................................... 73consultas con ROWNUM....................................................................73consultas sobre estructuras jerrquicas.................................................73subconsultas avanzadas......................................................................76consultas de agrupacin avanzada......................................................77

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    7/83

    7

    nnoottaass pprreevviiaass

    En este manual en muchos apartados se indica sintaxis de comandos. Esta sintaxis sirvepara aprender a utilizar el comando, e indica la forma de escribir dicho comando en elprograma utilizado para escribir SQL.

    En el presente manual la sintaxis de los comandos se escribe en prrafos sombreadosde gris con el reborde en gris oscuro. Ejemplo:

    SELECT * |{[DISTINCT]columna | expresin [alias], ...}

    FROMtabla;

    Otras veces se describen cdigos de ejemplo de un comando. Los ejemplos se escribentambin con fondo gris, pero sin el reborde. Ejemplo:

    SELECT nombre FROM cliente;

    Los ejemplos sirven para escenificar una instruccin concreta, la sintaxis se utiliza paraindicar las posibilidades de un comando. Para indicar la sintaxis de un comando se usansmbolos especiales. Los smbolos que utiliza este libro (de acuerdo con la sintaxis que seutiliza normalmente en cualquier documentacin de este tipo) son:

    PALABRACuando en la sintaxis se utiliza una palabra en negrita, significa que esun comando que hay que escribir literalmente.

    texto El texto que aparece en cursiva sirve para indicar que no hay que escribirleliteralmente, sino que se refiere a un tipo de elemento que se puede utilizar en el

    comando. Ejemplo:SELECT columnaFROMtabla;

    El texto columna hay que cambiarlo por un nombre concreto de columna (nombre,apellidos,...) , al igual que tabla se refiere a un nombre de tabla concreto.

    [] (corchetes). Los corchetes sirven para encerrar texto que no es obligatorio en elcomando, es decir para indicar una parte opcional.

    |(barra ver tical). Este smbolo (|) , la barra vertical, indica opcin, es decir que sepuede elegir entre varias opciones

    ... (puntos suspensivos) Indica que se puede repetir el texto anterior en elcomando continuamente (significara,y as sucesivamente)

    {} (llaves) Las llaves sirven para indicar opciones mutuamente exclusivas peroobligatorias. Es decir, opciones de las que slo se puede elegir una opcin, pero delas que es obligado elegir una. Ejemplo:

    SELECT { * |columna | expresin }

    FROMtabla;

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    8/83

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    9/83

    9

    iinnttrroodduucccciinn

    Historia del lenguaje SQLEl nacimiento del lenguaje SQL data de 1970 cuando E. F. Codd publica su libro: "Unmodelo de datos relacional para grandes bancos de datos compartidos". Ese librodictara las direcrices de las bases de datos relacionales. Apenas dos aos despus IBM(para quien trabajaba Codd) utiliza las directrices de Codd para crear el S t a n d a r d E n g l i sh Q u e r y L a n g u a g e (Lenguaje Estndar Ingls para Consultas) al que sele llam SEQUEL. Ms adelante se le asignaron las siglas SQL (aunque en ingls sesiguen pronunciando SEQUEL, en espaol se le llama esecuele).

    Poco despus se converta en un estndar en el mundo de las bases de datos avalandopor los organismos ISO y ANSI. An hoy sigue siendo uno de los estndares msimportantes de la industria informtica.

    Actualmente el ltimo estndar es el SQL del ao 1999 que ampli el anterior estndarconocido como SQL 92. El SQL de Oracle es compatible con el SQL del ao 1999 e incluyecasi todo lo dictado por dicho estndar.

    SQL*PlusPara poder escribir sentencias SQL al servidor Oracle, ste incorpora la herramientaSQL*Plus. Toda instruccin SQL que el usuario escribe, es verificada por este programa. Sila instruccin es vlida es enviada a Oracle, el cual enviar de regreso la respuesta a lainstruccin; respuesta que puede ser transformada por el programa SQL*Plus paramodificar su salida.

    Para que el programa SQL*Plus funcione en el cliente, el ordenador cliente debe haber

    sido configurado para poder acceder al servidor Oracle. En cualquier caso al acceder aOracle con este programa siempre preguntar por el nombre de usuario y contrasea.Estos son datos que tienen que nos tiene que proporcionar el administrador (DBA) de labase de datos Oracle.

    Para conectar mediante SQL*Plus podemos ir a la lnea de comandos y escribir eltexto sqlplus. A continuacin aparecer la pantalla:

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    10/83

    Manual de SQL para Oracle 9i

    tablas

    10

    En esa pantalla se nos pregunta el nombre de usuario y contrasea para acceder a la basede datos (informacin que deber indicarnos el administrador o DBA). Tras indicar esainformacin conectaremos con Oracle mediante SQL*Plus, y veremos aparecer el smbolo:

    SQL>

    Tras el cual podremos comenzar a escribir nuestros comandos SQL. Ese smbolo puedecambiar por un smbolo con nmeros 1, 2, 3, etc.; en ese caso se nos indica que lainstruccin no ha terminado y la lnea en la que estamos.

    Otra posibilidad de conexin consiste en llamar al programa SQL*Plus indicandocontrasea y base de datos a conectar. El formato es:

    slplus usuario/contrasea@nombreServicioBaseDeDatos

    Ejemplo:

    slplus usr1/[email protected]

    En este caso conectamos con SQL*Plus indicando que somos el usuario usr1 concontrasea miContra y que conectamos a la base de datos inicial de la red forempa.net. Elnombre de la base de datos no tiene porque tener ese formato, habr que conocer como esel nombre que representa a la base de datos como servicio de red en la red en la queestamos.

    versin grfica de SQL*PlusOracle incorpora un programa grfico para Windows para utilizar SQL*Plus. Se puedellamar a dicho programa desde las herramientas instaladas en el men de programas deWindows, o desde la lnea de programas escribiendo sqlplusw. Al llamarle aparece estapantalla:

    Como en el caso anterior, se nos solicita el nombre de usuario y contrasea. La cadena deHost es el nombre completo de red que recibe la instancia de la base de datos a la quequeremos acceder en la red en la que nos encontramos.

    Tambin podremos llamar a este entorno desde la lnea de comandos utilizando lasintaxis comentada anteriormente. En este caso:

    slplusw usuario/contrasea@nombreServicioBaseDeDatos

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    11/83

    Copyright - Copyleft ' Jorge Snchez 2004

    11

    Esta forma de llamar al programa permite entrar directamente sin que se nos preguntepor el nombre de usuario y contrasea.

    iSQL*PlusEs un producto ideado desde la versin 9i de Oracle. Permite acceder a las bases de datosOracle desde un navegador. Para ello necesitamos tener configurado un servidor webOracle que permita la conexin con la base de datos. Utilizar iSQL*Plus es indicar unadireccin web en un navegador, esa direccin es la de la pgina iSQL*Plus de acceso a labase de datos.

    Desde la pgina de acceso se nos pedir nombre de usuario, contrasea y nombre de labase de datos con la que conectamos (el nombre de la base de datos es el nombre con elque se la conoce en la red). Si la conexin es vlida aparece esta pantalla:

    Ilustracin 1, Pantalla de iSQL*Plus una vez con ectados a una base de datos

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    12/83

    Manual de SQL para Oracle 9i

    tablas

    12

    En esa pantalla en el apartado Introducir Sentencias , se escribe la sentencia quedeseamos enviar. El botn Ejecutar hace que se valide y se enve a Oracle.

    Se pueden almacenar sentencias SQL usando el botn Examinar y cargar sentenciaspreviamente guardadas mediante Cargar archivos de comandos.

    estructura del lenguaje SQL

    SELECT. Se trata del comando que permite realizar consultas sobre los datos de labase de datos. Obtiene datos de la base de datos.

    DML, D a t a M a n i p u l a t i o n L a n g u a g e (Lenguaje de manipulacin dedatos). Modifica filas (registros) de la base de datos. Lo forman las instruccionesINSERT , UPDATE, MERGEyDELETE.

    DDL, D a t a D e f i n i t i o n L a n g u a g e (Lenguaje de definicin de datos ).Permiten modificar la estructura de las tablas de la base de datos. Lo forman lasinstrucciones CREATE,ALTER, DROP , RENAME yTRUNCATE.

    Instrucciones de transfer encia. Administran las modificaciones creadas por lasinstrucciones DML. Lo forman las instrucciones ROLLBACK, COMMIT ySAVEPOINT

    DCL, D a t a C o n t r o l L a n g u a g e (Lenguaje de control de datos). Administranlos derechos y restricciones de los usuarios. Lo forman las instrucciones GRANT yREVOKE.

    normas de escritura

    En SQL no se distingue entre maysculas y minsculas. Da lo mismo como seescriba.

    El final de una instruccin lo calibra el signo del punto y coma

    Los comandos SQL (SELECT, INSERT,...) no pueden ser partidos por espacios osaltos de lnea antes de finalizar la instruccin. El intrprete SQL plus indicas

    Se pueden tabular lneas para facilitar la lectura si fuera necesario

    Los comentarios en el cdigo SQL comienzan por /* y terminan por */

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    13/83

    Copyright - Copyleft ' Jorge Snchez 2004

    13

    ttaabbllaass

    esquemas de usuario y objetosCada usuario de una base de datos posee un esquema . El esquema tiene el mismonombre que el usuario y sirve para almacenar los objetos de esquema, es decir los objetosque posee el usuario.

    Esos objetos pueden ser: tablas, vistas, secuencias, ndices, sinnimos e instantneas.Esos objetos son manipulados y creados por los usuarios. En principio slo losadministradores y los usuarios propietarios pueden acceder a cada objeto, salvo que semodifiquen los privilegios del objeto para permitir su acceso por parte de otros usuarios.

    creacin de tablas

    nombre de las tablasDeben cumplir las siguientes reglas:

    Deben comenzar con una letra

    No deben tener ms de 30 caracteres

    Slo se permiten utilizar letras del alfabeto (ingls), nmeros o el signo desubrayado (tambin el signo $ y #, pero esos se utilizan de manera especial por loque no son recomendados)

    No puede haber dos tablas con el mismo nombre para el mismo usuario (puedencoincidir los nombres si estn en distintos esquemas)

    No puede coincidir con el nombre de una palabra reservada de Word

    orden CREATE TABLEEs la orden SQL que permite crear una tabla. Por defecto ser almacenad en el tablespacepor defecto del usuario que crea la tabla. Sintaxis:

    CREATE TABLE [esquema.] nombreDeTabla

    (nombreDeLaColumna1 tipoDeDatos [, ...]);

    Ejemplo:

    CREATE TABLE proveedores (nombre varchar2(25));

    Crea una tabla con un solo campo de tipovarchar2.Slo se podr crear la tabla si el usuario posee los permisos necesarios para ello. Si la

    tabla pertenece a otro esquema (suponiendo que el usuario tenga permiso para grabartablas en ese otro esquema), se antepone al nombre de la tabla , el nombre del esquema:

    CREATE TABLE otroUsuario.proveedores (nombre varchar2(25));

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    14/83

    Manual de SQL para Oracle 9i

    tablas

    14

    orden DESCRIBE

    El comando DESCRIBE, permite obtener la estructura de una tabla. Ejemplo:

    DESCRIBE proveedores;

    Y aparecern los campos de la tabla proveedores.

    orden INSERT

    Permite aadir datos a las tablas. Ms adelante se comenta de forma ms detallada. Susintaxis bsica es:

    INSERT INTO tabla [(columna1 [, columna2...])]

    VALUES (valor1 [,valor2]);

    Indicando la tabla se aaden los datos que se especifiquen tras el apartado values en unnuevo registro. Los valores deben corresponderse con el orden de las columnas. Si no esas se puede indicar tras el nombre de la tabla y entre parntesis. Ejemplo:

    INSERT INTO proveedores(nombre, CIF)

    VALUES (Araja SA,14244223Y);

    consultar las tablas del usuario

    En el diccionario de datos hay una entrada que permite consultar las tablas de cada

    usuario. Esa entrada es USER_TABLES. De forma que SELECT * FROMUSER_TABLES obtiene una vista de las tablas del usuario actual. Hay diversas columnasque muestran datos sobre cada tabla, entre ellas la columna TABLES_NAME muestra elnombre de la tabla.

    borrar tablas

    La orden DROP TABLE seguida del nombre de una tabla, permite eliminar la tabla encuestin.

    Al borrar una tabla:

    Desaparecen todos los datos

    Cualquier vista y sinnimo referente a la tabla seguirn existiendo, pero ya nofuncionarn (conviene eliminarlos)

    Las transacciones pendientes son aceptadas (COMMIT)

    Slo es posible realizar esta operacin si se es el propietario de la tabla o se posee elprivilegio DROP ANY TABLE

    El borrado de un a tabla es irrever sible, y no hay ninguna peticin de confirmacin,por lo que conviene ser muy cuidadoso con esta operacin.

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    15/83

    Copyright - Copyleft ' Jorge Snchez 2004

    15

    tipos de datos

    equivalentes ANSI SQL con el SQL de OracleHay diferencias entre los tipos de datos del estndar ANSI con respecto al SQL de Oracle.Aunque Oracle es capaz de utilizar bases de datos con formato ANSI y tipos compatiblescon el mismo, la equivalencia ANSI / Oracle la dicta esta tabla:

    Tipos ANSI SQL Equivalente Oracle SQL

    CHARACTER(n)

    CHAR(n)

    CHAR(n)

    CHARACTER VARYING(n)

    CHAR VARYING(n)

    VARCHAR(n)

    NATIONAL CHAR ACTER(n)

    NATIONAL CHAR (n)NCHAR(n)

    NCHAR(n)

    NATIONAL CHARACTER VAR YING(n)

    NATIONAL CHAR VARY ING(n)

    NCHAR VARYING(n)

    NVARCHAR2(n)

    NUMERIC(p,s)

    DECIMAL(p,s)

    NUMBER(p,s)

    INTEGER

    IN T

    SMALLINT

    NUMBER(38)

    FLOAT(b)

    DOUBLE

    DOUBLE PRECISSION

    REAL

    NUMBER

    LONG VARCHAR(n) LONG

    textosPara los textos disponemos de los siguientes tipos:

    VARCHAR2. Para textos de longitud variable de hasta 4000 caracteres

    CHAR. Para textos de longitud fija de hasta 2000 caracteres.

    NCHAR. Para el almacenamiento de caracteres nacionales de texto fijo

    NVARCHAR2. Para el almacenamiento de caracteres nacionales de longitudvariable.

    En todos estos tipos se indican los tamaos entre parntesis tras el nombre del tipo. Esetamao en el caso de los tipos VARCHAR2 es obligatorio, en el caso de los tipos CHAR sonopcionales (de no ponerlos se toma el uno).

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    16/83

    Manual de SQL para Oracle 9i

    tablas

    16

    Conviene poner suficiente espacio para almacenar los valores. En el caso de losVARCHAR, Oracle no malgasta espacio por poner ms espacio del deseado ya que si eltexto es ms pequeo que el tamao indicado, el resto del espacio se ocupa.

    nmerosEl tipo NUMBER es un formato verstil que permite representar todo tipo de nmeros. Surango recoge nmeros de entre 10-130 y 9,99999999999 * 10128. Fuera de estos rangosOracle devuelve un error.

    Los nmeros decimales (nmeros de coma fija) se indican con NUMBER(p,s), dondep es la precisin mxima ys es la escala (nmero de decimales a la derecha de la coma).Por ejemplo, NUMBER (8,3) indica que se representan nmeros de ocho cifras deprecisin y tres decimales. Los decimales en Oracle se presenta con el punto y no con lacoma.

    Para nmeros enteros se indica NUMBER(p) donde p es el nmero de dgitos. Eso esequivalente a NUMBER(p,0).

    Para nmeros de coma flotante (equivalentes a los flota o double de muchoslenguajes de programacin) simplemente se indica el texto NUMBER sin precisin niescala.

    precisin y escalaLa cuestin de la precisin y la escala es compleja. Para entenderla mejor, se muestranestos ejemplos:

    Formato Nmero escrito por el usuario Se almacena como

    NUMB ER 345255.345 345255.345

    NUMB ER(9) 345255.345 345255

    NUMB ER(9,2) 345255.345 345255.36

    NUMBER(7) 345255.345 Da err or de precisin

    NUMB ER(7,-2) 345255.345 345300

    NUMBER(7,2) 345255.345 Da err or de precisin

    En definitiva, la precisin debe incluir todos los dgitos del nmero (puede llegar hasta 38dgitos). La escala slo indica los decimales que se respetarn del nmero, pero si esnegativa indica ceros a la izquierda del decimal.

    tipo LONGSe trata de un tipo de datos que actualmente se mantiene por compatibilidad. Serecomienda encarecidamente utilizar en su lugar el tipo CLOB (que se comentar msadelante). En cualquier caso este tipo permite almacenar textos de hasta 2 GB de tamao.Pero no puede formar clave, ni ndice, ni ser parte de la clusula WHERE, ni GROUP BY,ni SELECT con DISTINCT, ni pueden ser UNIQUE y slo puede haber un campo de estetipo en una misma tabla entre otras limitaciones.

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    17/83

    Copyright - Copyleft ' Jorge Snchez 2004

    17

    fechas y horasDATE

    El tipo DATE permite almacenar fechas. Las fechas se pueden escribir en formato da,mes y ao entre comillas. El separador puede ser una barra de dividir, un guin y casicualquier smbolo.

    Para almacenar la fecha actual basta con utilizar la funcin SYSDATE que devuelveesa fecha.

    TIMESTAMPEs una extensin del anterior, almacena valores de da, mes y ao, junto con hora, minuto y segundos (incluso con decimales). Con lo que representa un instante concreto en eltiempo. Un ejemplo de TIMESTAMP sera 2/2/2004 18:34:23,34521. En este caso si elformato de fecha y hora del sistema est pensado para el idioma espaol, el separadordecimal ser la coma (y no el punto).

    intervalosHay unos cuantos tipos de datos en Oracle que sirven para almacenar intervalos de tiempo(no fechas, sino una suma de elementos de tiempo).

    INTERVAL YEAR TO MONTHEste tipo de datos almacena aos y meses. Tras la palabra Y E A R se puede indicar laprecisin de los aos (cifras del ao), por defecto es de dos. Ejemplo:

    CREATE TABLE tiempos (meses INTERVAL YEAR(3) TO MONTH);

    INSERT INTO tiempos VALUES(3-2);

    En el ejemplo se inserta un registro que representa 3 aos y dos meses.

    INTERVAL DAY TO SECONDRepresenta intervalos de tiempo que expresan das, horas, minutos y segundos. Se puedeindicar la precisin tras el texto DAY y el nmero de decimales de los segundos tras eltexto SECOND. Ejemplo:

    CREATE TABLE tiempos (dias INTERVAL DAY(3) TO SECOND(0));

    INSERT INTO tiempos VALUES(2 7:12:23);

    RAWSirve para almacenar valores binarios de hasta 2000 bytes (se puede especificar el tamaomximo entre parntesis). El valor LONG RAW almacena hasta 2GB.

    LOBSon varios tipos de datos que permiten almacenar valores muy grandes. Ms adelante secomentan en su totalidad. Incluye a BLOB, CLOB, NCLOB y BFILE.

    ROWIDValor hexadecimal que representa la direccin nica de una fila en su tabla.

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    18/83

    Manual de SQL para Oracle 9i

    tablas

    18

    modificar tablas

    cambiar de nombreLa orden RENAME permite el cambio de nombre de cualquier objeto. Sintaxis:

    RENAME nombreViejo TO nombreNuevo

    borrar contenido de tablasLa orden TRUNCATE TABLE seguida del nombre de una tabla, hace que se elimine elcontenido de la tabla, pero no la tabla en s. Incluso borra del archivo de datos el espacioocupado por la tabla.

    Esta orden no puede anularse con un ROLLBACK.

    modificar tablasLa verstilALTER TABL E permite hacer cambios en la estructura de una tabla.

    aadir columnasALTER TABLE nombreTablaADD(nombreColumna TipoDatos[Propiedades]

    [,columnaSiguiente tipoDatos [propiedades]...)

    Permite aadir nuevas columnas a la tabla. Se deben indicar su tipo de datos y sus

    propiedades si es necesario (al estilo de CREATE TABLE).Las nuevas columnas se aaden al final, no se puede indicar otra posicin.

    borrar columnasALTER TABLE nombreTabla DROP(columna);

    Elimina la columna indicada de manera irreversible e incluyendo los datos que contena.No se puede eliminar la ltima columna (habr que usar DROP TABLE).

    modificar columnaPermite cambiar el tipo de datos y propiedades de una determinada columna. Sintaxis:

    ALTER TABLE nombreTablaMODIFY(columna tipo[propiedades]

    [columnaSiguiente tipo [propiedades] ...]

    Los cambios que se permiten son:

    Incrementar precisin o anchura de los tipos de datos

    Slo se puede reducir la anchura si la anchura mxima de un campo si esa columna

    posee nulos en todos los registros, o todos los valores so o no hay registros

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    19/83

    Copyright - Copyleft ' Jorge Snchez 2004

    19

    Se puede pasar de CHAR a VARCHAR2 y viceversa (si no se modifica la anchura)

    Se puede pasar de DATE a TIMESTAMP y viceversa

    aadir comentarios a las tablasSe le pueden poner comentarios a las tablas y las columnas. Un comentario es un textodescriptivo utilizado para documentar la tabla. Sintaxis:

    COMMENT ON { TABLE NombreTabla | COLUMN tabla.nombreColumna }

    IS Comentario

    Para mostrar los comentarios puestos se usan las siguientes vistas del diccionario de datosmediante la instruccin SELECT:

    USER_TAB_COMMENTS. Comentarios de las tablas del usuario actual. USER_COL_COMMENTS. Comentarios de las columnas del usuario actual.

    ALL_TAB_COMMENTS. Comentarios de las tablas de todos los usuarios (sloadministradores)

    ALL_COL_COMMENTS. Comentarios de las columnas de todos los usuarios(slo administradores).

    valor por defecto

    A cada columna se le puede asignar un valor por defecto durante su creacin mediante lapropiedad DEFAULT. Se puede poner esta propiedad durante la creacin o modificacinde la tabla, aadiendo la palabra DEFAULT tras el tipo de datos del campo y colocandodetrs el valor que se desea por defecto.

    Ejemplo:

    CREATE TABLE articulo (cod NUMBER(7), nombre VARCHAR2(25),

    precio NUMBER(11,2) DEFAULT 3.5);

    restricciones

    Una restriccin es una condicin de obligado cumplimiento para una o ms columnas de

    la tabla. A cada restriccin se le pone un nombre, en el caso de no poner un nombre (en lasque eso sea posible) entonces el propio Oracle le coloca el nombre que es unmnemotcnico con el nombre de tabla, columna y tipo de restriccin.

    Su sintaxis general es:

    {CREATE TABLE nombreTabla |

    ALTER TABLE nombreTabla {ADD | MODIFY}}

    (campo tipo [propiedades] [,...]

    CONSTRAINT nombreRestriccin tipoRestriccin (columnas)

    [,CONSTRAINT nombrerestriccin tipoRestriccin (columnas) ...)

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    20/83

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    21/83

    Copyright - Copyleft ' Jorge Snchez 2004

    21

    CREATE TABLE cliente(

    dni VARCHAR2(9) PRIMARY KEY,

    nombre VARCHAR(50)) ;

    O, poniendo un nombre a la restriccin:CREATE TABLE cliente(

    dni VARCHAR2(9) CONSTRAINT cliente_pk PRIMARY KEY,

    nombre VARCHAR(50)) ;

    Si la clave la forman ms de un campo:

    CREATE TABLE alquiler(dni VARCHAR2(9),

    cod_pelicula NUMBER(5),

    CONSTRAINT alquiler_pk PRIMARY KEY(dni,cod_pelicula) ;

    clave secundaria o forneaUna clave secundaria o fornea, es uno o ms campos de una tabla que estn relacionadoscon la clave principal de los campos de otra tabla. La forma de indicar una clave forneaes:

    CREATE TABLE alquiler(dni VARCHAR2(9),

    cod_pelicula NUMBER(5),

    CONSTRAINT alquiler_pk PRIMARY KEY(dni,cod_pelicula),

    CONSTRAINT dni_fk FOREIGN KEY (dni)

    REFERENCES clientes(dni),CONSTRAINT pelicula_fk FOREIGN KEY (cod_pelicula)

    REFERENCES peliculas(cod)

    );

    Esta completa forma de crear la tabla alquiler incluye sus claves forneas, el campo dnihace referencia al campo dni de la tabla clientes y el campo cod_pelicula que hacereferencia al campo cod de la tabla peliculas. Tambin hubiera bastado con indicar slo latabla a la que hacemos referencia, si no se indican los campos relacionados de esa tabla, setoma su clave principal (que es lo normal).

    Esto forma una relacin entre dichas tablas, que adems obliga al cumplimiento de la

    integridad referencial. Esta integridad obliga a que cualquier dni incluido en la tablaalquiler tenga que estar obligatoriamente en la tabla de clientes. De no ser as el registrono ser insertado en la tabla (ocurrir un error).

    Otra forma de crear claves forneas (slo vlida para claves de un solo campo) es:

    CREATE TABLE alquiler(

    dni VARCHAR2(9) CONSTRAINT dni_fk

    REFERENCES clientes(dni),

    cod_pelicula NUMBER(5) CONSTRAINT pelicula_fkREFERENCES peliculas(cod)

    CONSTRAINT alquiler_pk PRIMARY KEY(dni,cod_pelicu ));

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    22/83

    Manual de SQL para Oracle 9i

    tablas

    22

    Esta definicin de clave secundario es idntica a la anterior, slo que no hace falta colocarel texto FOREIGN KEY.

    La integridad referencial es una herramienta imprescindible de las bases de datosrelacionales. Pero provoca varios problemas. Por ejemplo, si borramos un registro en la

    tabla principal que est relacionado con uno o varios de la secundaria ocurrir un error, yaque de permitrsenos borrar el registro ocurrir fallo de integridad (habr clavessecundarios refirindose a una clave principal que ya no existe).

    Por ello Oracle nos ofrece dos soluciones a aadir tras la clusula REFERENCES:

    ON DELETE SET NULL. Coloca nulos todas las claves secundarias relacionadascon la borrada.

    ON DELETE CASCADE. Borra todos los registros cuya clave secundaria es igualque la clave del registro borrado.

    Si no se indica esta clusula, no se permite el borrado de registros relacionados.

    El otro problema ocurre si se desea cambiar el valor de la clave principal en un registrorelacionado con claves secundarias. En muchas bases de datos se implementan solucionesconsistentes en aadir ON UPDATE CASCADE o ON UPDATE SET NULL. Oracle noimplementa directamente estas soluciones. Por lo que hay que hacerlo de otra forma. Lassoluciones son:

    Implementar un TRIGGER para que cuando se actualice el registro se actualicen lasclaves secundarias (el mecanismo de funcionamiento es parecido al que se muestraen el siguiente prrafo).

    Aadir un registro igual que el que se quiere cambiar en la tabla principal, pero conel nuevo valor de la clave. Mediante una instruccin UPDATE actualizar a ese valor

    de clave todos los registros de la tabla secundaria cuyo valor coincida con la antiguaclave. Finalmente borrar el registro en la tabla principal con el valor antiguo de laclave.

    La sintaxis completa para aadir claves forneas es:

    CREATE TABLE tabla(lista_de_campos

    CONSTRAINT nombreRestriccionFOREIGN KEY (listaCampos)

    REFERENCES tabla(clavePrincipalRelacionada)

    [ON UPDATE {SET NULL | CASCADE}]

    );

    Si es de un solo campo existe esta alternativa:

    CREATE TABLE tabla(lista_de_campos tipos propiedades,

    nombreCampoClaveSecundaria

    CONSTRAINT nombreRestriccion

    REFERENCES tabla(clavePrincipalRelacionada)

    [ON UPDATE {SET NULL | CASCADE}]

    );

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    23/83

    Copyright - Copyleft ' Jorge Snchez 2004

    23

    restricciones de validacinSon restricciones que dictan una condicin que deben cumplir los contenidos de unacolumna. La expresin de la condicin es cualquier expresin que devuelva verdadero ofalso, pero si cumple estas premisas:

    No puede hacer referencia a nmeros de fila

    No puede hacer referencia a objetos de SYSTEM o SYS

    No se permiten usar las funciones SYSDATE, UID, USER y USERENV

    No se permiten referencias a columnas de otras tablas (si a las de la misma tabla)

    Una misma columna puede tener mltiples CHECKS en su definicin (se pondran variosCONSTRAINT seguidos, sin comas). Ejemplo:

    CREATE TABLE ingresos(cod NUMBER(5) PRIMARY KEY,concepto VARCHAR2(40) NOT NULL,

    importe NUMBER(11,2) CONSTRAINT importe_min

    CHECK (importe>0)

    CONSTRAINT importe_max

    CHECK (importe

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    24/83

    Manual de SQL para Oracle 9i

    tablas

    24

    borrar restriccionesSintaxis:

    ALTER TABLE tablaDROP PRIMARY KEY | UNIQUE(campos) |

    CONSTRAINT nombreRestriccin [CASCADE]

    La opcin PRIMARY KEY elimina una clave principal (tambin quitar el ndice UNIQUEsobre las campos que formaban la clave. UNIQUE elimina ndices nicos. La opcinCONSTRAINT elimina la restriccin indicada.

    La opcin CASCADE hace que se eliminen en cascada las restricciones de integridadque dependen de la restriccin eliminada. Por ejemplo en:

    CREATE TABLE curso(cod_curso CHAR(7) PRIMARY KEY,

    fecha_inicio DATE,

    fecha_fin DATE,

    tItulo VARCHAR2(60),

    cod_siguientecurso CHAR(7),

    CONSTRAINT fecha_ck CHECK(fecha_fin>fecha_inicio),

    CONSTRAINT cod_ste_fk FOREIGN KEY(cod_siguientecurso)

    REFERENCES curso ON DELETE SET NULL);

    Tras esa definicin de tabla, esta instruccin:ALTER TABLE curso DROP PRIMARY KEY;

    Produce este error:

    ORA-02273: a esta clave nica/primaria hacen referenciaalgunas claves ajenas

    Para ello habra que utilizar esta instruccin:

    ALTER TABLE curso DROP PRIMARY KEY CASCADE;

    Esa instruccin elimina la clave secundaria antes de eliminar la principal.Tambin produce error esta instruccin:

    ALTER TABLE curso DROP(fecha_inicio);

    ERROR en lnea 1:ORA-12991: se hace referencia a la columna en una restriccin

    de multicolumna

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    25/83

    Copyright - Copyleft ' Jorge Snchez 2004

    25

    El error se debe a que no es posible borrar una columna que forma parte de la definicinde una instruccin. La solucin es utilizar CASCADE CONSTRAINT elimina lasrestricciones en las que la columna a borrar estaba implicada:

    ALTER TABLE curso DROP(fecha_inicio) CASCADE CONSTRAINTS;

    Esta instruccin elimina la restriccin de tipo CHECK en la que apareca la fecha_inicio yas se puede eliminar la columna.

    desactivar restricciones A veces conviene temporalmente desactivar una restriccin para saltarse las reglas queimpone. La sintaxis es:

    ALTER TABLE tabla DISABLE CONSTRAINT nombre [CASCADE]

    La opcin CASCADE hace que se desactiven tambin las restricciones dependientes de laque se desactiv.

    activar restriccionesAnula la desactivacin. Formato:

    ALTER TABLE tabla ENABLE CONSTRAINT nombre [CASCADE]

    Slo se permite volver a activar si los valores de la tabla cumplen la restriccin que seactiva. Si hubo desactivado en cascada, habr que activar cada restriccin

    individualmente.cambiar de nombre a las restriccionesPara hacerlo se utiliza este comando:

    ALTER TABLE table RENAME CONSTRAINT

    nombreViejo TO nombreNuevo;

    mostrar restriccionesLa vista del diccionario de datos USER_CONSTRAINTS permite identificar lasrestricciones colocadas por el usuario (ALL_CONSTRAINTS permite mostrar lasrestricciones de todos los usuarios, pero slo est permitida a los administradores). En esavista aparece toda la informacin que el diccionario de datos posee sobre las restricciones.En ella tenemos las siguientes columnas interesantes:

    Columna Tipo de datos Descripcin

    OWNER VARCHAR2(20) Indica el nombre del usuario propietario dela tabla

    CONSTRAINT_NAME VARCHAR2(30) Nombre de la restriccin

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    26/83

    Manual de SQL para Oracle 9i

    tablas

    26

    Columna Tipo de datos Descripcin

    CONSTRAINT_TYPE VARCHAR2(1) Tipo de restriccin:

    C. De tipo CHECK o NOT NULL

    P. PRIMARY KEY R. FOREIGN KEY U. UNIQUE

    TABLE_NAME VARCHAR2(30) Nombre de la tabla en la que se encuentra larestriccin

    En el diccionario de datos hay otra vista que proporciona informacin sobre restricciones,se trata de USER_CONS_COLUMNS, en dicha tabla se muestra informacin sobre lascolumnas que participan en una restriccin. As si hemos definido una clave primariaformada por los campos uno ydos, en la tabla USER_CONS_COLUMNS aparecern dosentradas, una para el primer campo del ndice y otra para el segundo. Se indicar ademsel orden de aparicin en la restriccin. Ejemplo:

    OWNER CONSTRAINT_NAME TABLE_NAME COLUMN_NAME POSITION

    JORGE EXIS_PK EXISTENCIAS TIPO 1

    JORGE EXIS_PK EXISTENCIAS MODELO 2

    JORGE EXIS_PK EXISTENCIAS N_ALMACEN 3

    JORGE PIEZA_FK EXISTENCIAS TIPO 1

    JORGE PIEZA_FK EXISTENCIAS MODELO 2

    JORGE PIEZA_PK PIEZA TIPO 1JORGE PIEZA_PK PIEZA MODELO 2

    En esta tabla USER_CONS_COLUMNS aparece una restriccin de clave primaria sobre latabla existencias, esta clave est formada por las columnas (tipo, modelo yn_almacen) yen ese orden. Una segunda restriccin llamada pieza_fkest compuesta por tipoymodelode la tabla existencias. Finalmente la restriccin pieza_pkest formada por tipo ymodelo,columnas de la tabla pieza.

    Para saber de qu tipo son esas restricciones, habra que acudir a la vistaUSER_CONSTRAINTS.

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    27/83

    27

    ccoonnssuullttaass SSEELLEECCTT

    capacidadesSin duda el comando ms verstil del lenguaje SQL es el comando SELECT. Este comandopermite:

    Obtener datos de ciertas columnas de una tabla (proyeccin)

    Obtener registros (filas) de una tabla de acuerdo con ciertos criterios (seleccin)

    Mezclar datos de tablas diferentes (asociacin ,join)

    sintaxis sencilla

    SELECT * |{[DISTINCT]columna | expresin [[AS] alias], ...}

    FROMtabla;

    Donde:

    *. El asterisco significa que se seleccionan todas las columnas

    DISTINCT. Hace que no se muestren los valores duplicados.

    columna. Es el nombre de una columna de la tabla que se desea mostrar

    expresin.Una expresin vlida SQL alias. Es un nombre que se le da a la cabecera de la columna en el resultado de esta

    instruccin.

    Ejemplos:

    /* Seleccin de todos los registros de la tabla clientes */

    SELECT * FROM Clientes;

    /* Seleccin de algunos campos*/

    SELECT nombre, apellido1, apellido2 FROM Clientes;

    clculos

    aritmticosLos operadores + (suma), - (resta), * (multiplicacin) y / (divisin), se pueden utilizar parahacer clculos en las consultas. Cuando se utilizan como expresin en una consultaSELECT, no modifican los datos originales sino que como resultado de la vista generadapor SELECT, aparece un nueva columna. Ejemplo:

    SELECT nombre, precio,precio*1.16 FROM articulos

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    28/83

    Manual de SQL para Oracle 9i

    comandos internos SQL e iSQL*Plus

    28

    Esa consulta obtiene tres columnas. La tercera tendr como nombre la expresin utilizada,para poner un alias basta utilizar dicho alias tras la expresin:

    SELECT nombre, precio, precio*1.16 AS precio_con_ivaFROM articulos;

    Los nombres pueden llevar espacios si se ponen con comillas dobles:

    SELECT nombre, precio, precio*1.16 AS "precio con iva"

    FROM articulos;

    Esas comillas dobles cumplen otra funcin y es la de hacer que se respeten las maysculas y minsculas del nombre (de otro modo el nombre de la columna aparece siempre enmaysculas

    La prioridad de esos operadores es: tienen ms prioridad la multiplicacin y divisin,despus la suma y la resta. En caso de igualdad de prioridad, se realiza primero laoperacin que est ms a la izquierda. Como es lgico se puede evitar cumplir esaprioridad usando parntesis; el interior de los parntesis es lo que se ejecuta primero.

    Cuando una expresin aritmtica se calcula sobre valores NULL, el resultado de laexpresin es siempre NULL.

    concatenacinEl operador || es el de la concatenacin. Sirve para unir textos. Ejemplo:

    SELECT tipo, modelo, tipo || '-' || modelo "Clave Pieza"

    FROM piezas;

    El resultado puede ser:

    TIPO MODELO Clave Pieza

    AR 6 AR-6

    AR 7 AR-7

    AR 8 AR-8

    AR 9 AR-9

    AR 12 AR-12

    AR 15 AR-15

    AR 20 AR-20AR 21 AR-21

    BI 10 BI-10

    BI 20 BI-20

    BI 38 BI-38

    BI 57 BI-57

    condiciones

    Se pueden realizar consultas que restrinjan los datos de salida de las tablas. Para ello seutiliza la clusula WHERE. Esta clusula permite colocar una condicin que han decumplir todos los registros, los que no la cumplan no aparecen en el resultado.

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    29/83

    Copyright - Copyleft ' Jorge Snchez 2004

    29

    Ejemplo:

    SELECT Tipo, Modelo FROM Pieza WHERE Precio>3;

    operadores de comparacinSe pueden utilizar en la clusula WHERE, son:

    Operador Significado

    > Mayor que

    < Menor que

    >= Mayor o igual que

    =25 AND edad60 OR edad

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    30/83

    Manual de SQL para Oracle 9i

    comandos internos SQL e iSQL*Plus

    30

    BETWEENEl operador BETWEEN nos permite obtener datos que se encuentren en un rango. Uso:

    SELECT tipo,modelo,precio FROM piezas

    WHERE precio BETWEEN 3 AND 8;

    Saca piezas cuyos precios estn entre 3 y 8 (ambos incluidos).

    INPermite obtener registros cuyos valores estn en una lista:

    SELECT tipo,modelo,precio FROM piezas

    WHERE precio IN (3,5, 8);

    Obtiene piezas cuyos precios sea 3, 5 u 8, slo uno de esos tres.

    LIKESe usa sobre todo con textos, permite obtener registros cuyo valor en un campo cumplauna condicin textual. LIKE utiliza una cadena que puede contener estos smbolos:

    Smbolo Significado

    % Una serie cualquiera de caracteres

    _ Un carcter cualquiera

    Ejemplos:

    /* Selecciona nombres que empiecen por S */

    SELECT nombre FROM personas WHERE nombre LIKE 'A%';

    /*Selecciona las personas cuyo apellido sea Sanchez, Senchez,

    Stnchez,...*/

    SELECT apellido1 FROM Personas WHERE apellido1 LIKE 'S_nchez';

    IS NULLDevuelve verdadero si una expresin contiene un nulo:

    SELECT nombre,apellidos FROM personas

    WHERE telefono IS NULL

    Esa instruccin selecciona a la gente que no tiene telfono

    Precedencia de operadoresA veces las expresiones que se producen en los SELECT son muy extensas y es difcil saberque parte de la expresin se evala primero, por ello se indica la siguiente tabla deprecedencia:

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    31/83

    Copyright - Copyleft ' Jorge Snchez 2004

    31

    Orden de precedencia Operador

    1 *(Multiplicar) / (dividir)

    2 + (Suma ) - (Resta)3 || (Conca tenaci n)

    4 Compa raciones (>,

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    32/83

    Manual de SQL para Oracle 9i

    comandos internos SQL e iSQL*Plus

    32

    Slo veremos las primeras (ms adelante se comentan las de varias filas).

    funciones de caracteresconversin del texto a maysculas y minsculas

    Son:

    Funcin Descripcin

    LOWER(texto) Convierte el texto a minsculas (funciona con loscaracteres espaoles)

    UPPER(texto) Convierte el texto a maysculas

    INITCAP(texto) Coloca la primera letra de cada palabra enmaysculas

    funciones de transformacinFuncin Descripcin

    RTRIM(texti) Elimina los espaciosa la derecha del texto

    LTRIM(texto) Elimina los espacios a la izquierda que posea eltexto

    TRIM(texto) Elimina los espacios en blanco a la izquierda y laderecha del texto y los espacios dobles delinterior.

    TRIM(caracteres

    FROM texto)

    Elimina del texto los caracteres indicados. Porejemplo TRIM('h' FROM nombre) elimina lashaches de la columna nombre que estn a laizquierda y a la derecha

    SUBSTR(texto,n[,m]) Obtiene los m siguientes caracteres del texto apartir de la posicin n (si m no se indica se cogendesde n hasta el final).

    LENGTH(texto) Obtiene el tamao del texto

    INSTR(texto, textoBuscado

    [,posInicial [, nAparicin]])

    Obtiene la posicin en la que se encuentra el texto buscado en el texto inicial. Se puede empezar abuscar a partir de una posicin inicial concreta eincluso indicar el nmero de aparicin del textobuscado.Ejemplo, si buscamos la letra a y ponemos 2 ennAparicin, devuelve la posicin de la segundaletra a del texto).Si no lo encuentra devuelve 0

    REPLACE(texto,textoABuscar,

    textoReemplazo)

    Buscar el texto a buscar en un determinado texto y lo cambia por el indicado como texto dereemplazo

    LPAD(texto, anchuraMxima,

    caracterDeRelleno)

    RPAD(texto, anchuraMxima,

    Rellena el texto a la izquierda (LPAD) o a laderecha (RPAD) con el carcter indicado paraocupar la anchura indicada.

    Si el texto es ms grande que la anchura indicada,

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    33/83

    Copyright - Copyleft ' Jorge Snchez 2004

    33

    Funcin Descripcin

    caracterDeRelleno) el texto se recorta.

    funciones numricasredondeos

    Funcin Descripcin

    ROUND(n,decimales) Redondea el nmero al siguiente nmero con elnmero de decimales indicado ms cercano.ROUND(8.239,2) devuelve 8.3

    TRUNC(n,decimales) Los decimales del nmero para que slo aparezcael nmero de decimales indicado

    FLOOR(n) Obtiene el entero ms grande o igual que n

    CEIL(n) Entero ms pequeo o igual que n

    matemticasFuncin Descripcin

    MOD(n1,n2) Devuelve el resto resultado de dividir n1 entre n2

    POWER(valor,exponente) Eleva el valor al exponente indicado

    SQRT(n) Calcula la raz cuadrada de n

    SIGN(n) Devuelve 1 si n es positivo, cero si vale cero y -1 sies negativo

    ABS(n) Calcula el valor absoluto de n

    EXP(n) Calcula en, es decir el exponente en base e delnmero n

    LN(n) Logaritmo neperiano de n

    LOG(n) Logaritmo en base 10 de n

    SIN(n) Calcula el seno de n (n tiene que estar enradianes)

    COS(n) Calcula el coseno de n (n tiene que estar enradianes)

    TAN(n) Calcula la tangente de n (n tiene que estar enradianes)

    ACOS(n) Devuelve en radianes el arcocoseno de n

    ASIN(n) Devuelve en radianes el arcoseno de n

    ATAN(n) Devuelve en radianes el arcotangente de n

    SINH(n) Devuelve el seno hiperblico de n

    COSH(n) Devuelve el coseno hiperblico de n

    TANH(n) Devuelve la tangente hiperblica de n

    otrasFuncin Descripcin

    BITAND(n1,n2) Realiza una operacin AND de bits sobre los

    valores n1 y n2 que tienen que ser enteros sin

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    34/83

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    35/83

    Copyright - Copyleft ' Jorge Snchez 2004

    35

    En intervalos de das a segundos los intervalos se pueden indicar como:

    /* 4 das 10 horas 12 minutos y 7 con 352 segundos */

    INTERVAL '4 10:12:7,352' DAY TO SECOND(3)

    /* 4 das 10 horas 12 minutos */INTERVAL '4 10:12' DAY TO MINUTE

    /* 4 das 10 horas */

    INTERVAL '4 10' DAY TO HOUR

    /* 4 das*/

    INTERVAL '4' DAY

    /*10 horas*/

    INTERVAL '10' HOUR

    /*25 horas*/

    INTERVAL '253' HOUR

    /*12 minutos*/

    INTERVAL '12' MINUTE

    /*30 segundos */

    INTERVAL '30' SECOND

    /*8 horas y 50 minutos */

    INTERVAL ('8:50') HOUR TO MINUTE;

    /*7 minutos 6 segundos*/

    INTERVAL ('7:06') MINUTE TO SECOND;

    /*8 horas 7 minutos 6 segundos*/

    INTERVAL ('8:07:06') HOUR TO SECOND;

    Esos intervalos se pueden sumar a valores de tipo DATE o TIMESTAMP

    obtener la fecha y hora actualFuncin Descripcin

    SYSDATE Obtiene la fecha y hora actuales

    SYSTIMESTAMP Obtiene la fecha y hora actuales en formatoTIMESTAMP

    DBTIMEZONE Devuelve la zona horaria actual

    CURRENT_DATE Obtiene la fecha y hora actuales e incluye la zonahoraria

    CURRENT_TIMESTAMP Obtiene la fecha y hora actuales en formatoTIMESTAMP e incluye la zona horaria

    calcular fechasFuncin Descripcin

    ADDMONTHS( fecha,n) Aade a la fecha el nmero de meses indicado porn

    MONTHS_BETWEEN(fecha1,

    fecha2)

    Obtiene la diferencia en meses entre las dosfechas (puede ser decimal)

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    36/83

    Manual de SQL para Oracle 9i

    comandos internos SQL e iSQL*Plus

    36

    Funcin Descripcin

    NEXT_DAY(fecha,da) Indica cual es el da que corresponde a aadir a lafecha el da indicado. El da puede ser el texto

    'Lunes', 'Martes', 'Mircoles',... (si la configura-cin est en espaol) o el nmero de da de lasemana (1=lunes, 2=martes,...)

    LAST_DAY(fecha) Obtiene el ltimo da del mes al que pertenece lafecha. Devuelve un valor DATE

    EXTRACT(valor FROM fecha) Extrae un valor de una fecha concreta. El valorpuede ser day(da), month (mes),year (ao), etc.

    GREATEST(fecha1, fecha2,..) Devuelve la fecha ms moderna la lista

    LEAST(fecha1, fecha2,..) Devuelve la fecha ms antigua la lista

    ROUND(fecha [,'formato'] Redondea la fecha al valor de aplicar el formato a

    la fecha. El formato puede ser: 'YEAR' Hace que la fecha refleje el ao

    completo

    'MONTH' Hace que la fecha refleje el mescompleto ms cercanoa la fecha

    'HH24' Redondea la hora a las 00:00 mscercanas

    'DAYTRUNC(fecha [formato]) Igual que el anterior pero trunca la fecha en lugar

    de redondearla.

    funciones de conversinOracle es capaz de convertir datos automticamente a fin de que la expresin final tengasentido. En ese sentido son fciles las conversiones de texto a nmero y viceversa.Ejemplo:

    SELECT 5+'3' FROM DUAL /*El resultado es 8 */

    SELECT 5 || '3' FROM DUAL /* El resultado es 53 */

    Tambin ocurre eso con la conversin de textos a fechas. De hecho es forma habitual deasignar fechas.

    Pero en diversas ocasiones querremos realizar conversiones explcitas.

    TO_CHARObtiene un texto a partir de un nmero o una fecha. En especial se utiliza con fechas (yaque de nmero a texto se suele utilizar de forma implcita.

    fechasEn el caso de las fechas se indica el formato de conversin, que es una cadena que puedeincluir estos smbolos (en una cadena de texto):

    Smbolo Significado

    YY Ao en formato de dos cifras

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    37/83

    Copyright - Copyleft ' Jorge Snchez 2004

    37

    Smbolo Significado

    YYY ltimas tres cifras del ao

    YYYY Ao en formato de cuatro cifras

    SYYYY igual que el anterior, pero si la fecha es anterior alnacimiento de Cristo el ao aparece en negativo

    MM Mes en formato de dos cifras

    MON Las tres primeras letras del mes

    MONTH Nombre completo del mes

    DY Da de la semana en tres letras

    DAY Da completo de la semana

    DD Da en formato de dos cifras

    Q Semestre

    W W Semana del ao

    D Da de la semana (del 1 al 7)DDD Da del ao

    AD

    A.D.Indicador de periodo Anno Domini (despus deCristo)

    BC

    B.C.Indicador de periodo, antes de Cristo. Aparece enfechas anteriores al ao cero (en espaol se poneAC)

    J Ao juliano

    RN Mtodo Romano de numeracin

    AM Indicador AMPM Indicador PM

    HH12 Hora de 1 a 12

    HH24 Hora de 0 a 23

    MI Minutos (0 a 59)

    SS Segundos (0 a 59)

    SSSS Segundos desde medianoche

    / . , Posicin de los separadores

    Ejemplos:

    SELECT TO_CHAR(SYSDATE, 'DD/MONTH/YYYY, DAY HH:MI:SS')

    FROM DUAL

    /* Sale : 16/AGOSTO /2004, LUNES 08:35:15, por ejemplo

    nmerosPara convertir nmeros a textos se usa est funcin cuando se desean caractersticasespeciales. En ese caso en el formato se pueden utilizar estos smbolos:

    Smbolo Significado

    9 Posicin del nmero

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    38/83

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    39/83

    Copyright - Copyleft ' Jorge Snchez 2004

    39

    2> Se comprueba si esa expresin es igual al valor del primer W H E N , de ser as sedevuelve el primer resultado (cualquier valor excepto nulo)

    3> Si la expresin no es igual al valor 1, entonces se comprueba si es igual que el

    segundo. De ser as se escribe el resultado 3. De no ser as se continua con elsiguiente WHEN

    4> El resultado indicado en la zona ELSE slo se escribe si la expresin no valeningn valor de los indicados.

    Ejemplo:

    SELECT

    CASE cotizacion WHEN 1 THEN salario*0.85

    WHEN 2 THEN salario * 0.93

    WHEN 3 THEN salario * 0.96ELSE salario

    END

    FROM empleados;

    funcin DECODESimilar a la anterior pero en forma de funcin. Se evala una expresin y se colocan acontinuacin pares valor, resultado de forma que si se la expresin equivale al valor, seobtiene el resultado indicado. Se puede indicar un ltimo parmetro con el resultado aefectuar en caso de no encontrar ninguno de los valores indicados.

    Sintaxis:

    DECODE(expresin, valor1, resultado1

    [,valor2, resultado2,...]

    [,valorPordefecto])

    Ejemplo:

    SELECT

    DECODE(cotizacion,1, salario*0.85,

    2,salario * 0.93,

    3,salario * 0.96,

    salario)

    FROM empleados;

    Este ejemplo es idntico al utilizado para la instruccin CASE

    obtener datos de mltiples tablas

    Es ms que habitual necesitar en una consulta datos que se encuentran distribuidos envarias tablas. Las bases de datos relacionales se basan en que los datos se distribuyen en

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    40/83

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    41/83

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    42/83

    Manual de SQL para Oracle 9i

    comandos internos SQL e iSQL*Plus

    42

    Sintaxis:

    SELECT tabla1.columna1, tabla1.columna2,....

    tabla2.columna1, tabla2.columna2,...

    FROMtabla1, tabla2

    WHERE tabla1.columnaRelacionada(+)=tabla2.columnaRelacionada

    Eso obtiene los registros relacionados entre las tablas y adems los registros norelacionados de la tabla2. Se podra usar esta otra forma:

    SELECT tabla1.columna1, tabla1.columna2,....

    tabla2.columna1, tabla2.columna2,...

    FROMtabla1, tabla2WHERE tabla1.columnaRelacionada=tabla2.columnaRelacionada(+)

    En ese caso salen los relacionados y los de la primera tabla que no estn relacionados conninguno de la primera.

    sintaxis SQL 1999En la versin SQL de 1999 se ide una nueva sintaxis para consultar varias tablas. Larazn fue separar las condiciones de asociacin respecto de las condiciones de seleccin deregistros. La sintaxis completa es:

    SELECT tabla1.columna1, tabl1.columna2,...

    tabla2.columna1, tabla2.columna2,... FROMtabla1

    [CROSS JOIN tabla2]|

    [NATURAL JOIN tabla2]|

    [JOIN tabla2 USING(columna)]|

    [JOIN tabla2 ON (tabla1.columa=tabla2.columna)]|

    [LEFT|RIGHT|FULL OUTER JOIN tabla2 ON

    (tabla1.columa=tabla2.columna)]

    Se describen sus posibilidadesCROSS JOINUtilizando la opcin CROSS JOIN se realiza un producto cruzado entre las tablasindicadas

    NATURAL JOINEstablece una relacin de igualdad entre las tablas a travs de los campos que tengan elmismo nombre en ambas tablas:

    SELECT * FROM piezas

    NATURAL JOIN existencias;

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    43/83

    Copyright - Copyleft ' Jorge Snchez 2004

    43

    En el ejemplo anterior se obtienen los registros de piezas relacionados en existencias atravs de los campos que tengan el mismo nombre en ambas tablas

    JOIN USINGPermite establecer relaciones indicando qu campo (o campos) comn a las dos tablas hayque utilizar:

    SELECT * FROM piezas

    JOIN existencias USING(tipo,modelo);

    JOIN ONPermite establecer relaciones cuya condicin se establece manualmente, lo que permiterealizar asociaciones ms complejas o bien asociaciones cuyos campos en las tablas notienen el mismo nombre:

    SELECT * FROM piezas

    JOIN existencias ON(piezas.tipo=existencias.tipo AND

    piezas.modelo=existencias.modelo);

    relaciones externasLa ltima posibilidad es obtener relaciones laterales o externas (outer join). Para ello seutiliza la sintaxis:

    SELECT * FROM piezas

    LEFT OUTER JOIN existencias

    ON(piezas.tipo=existencias.tipo AND

    piezas.modelo=existencias.modelo);

    En este consulta adems de las relacionadas, aparecen las piezas no relacionadas enexistencias. Si el LEFT lo cambiamos por un RIGHT, aparecern las existencias nopresentes en piezas.

    La condicin FULL OUTER JOIN producira un resultado en el que aparecen losregistros no relacionados de ambas tablas.

    agrupaciones

    Es muy comn utilizar consultas en las que se desee agrupar los datos a fin de realizar

    clculos en vertical, es decir calculados a partir de datos de distintos registros. Para ello seutiliza la clusula GROUP BY que permite indicar en base a qu registros se realiza laagrupacin. Con GROUP BY la instruccin SELECT queda de esta forma:

    SELECT listaDeExpresiones

    FROMlistaDeTablas

    [JOIN tablasRelacionadasYCondicionesDeRelacin]

    [WHERE condiciones]

    [GROUP BY grupos]

    [HAVING condiciones de grupo]

    [ORDER BY columnas];

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    44/83

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    45/83

    Copyright - Copyleft ' Jorge Snchez 2004

    45

    funciones de clculo con gruposLo interesante de la creacin de grupos es las posibilidades de clculo que ofrece.

    Para ello se utilizan funciones que permiten trabajar con los registros de un grupo son:

    Funcin Significado

    COUNT(*) Cuenta los elementos de un grupo. Se utiliza elasterisco para no tener que indicar un nombre decolumna concreto, el resultado es el mismo paracualquier columna

    SUM(expresin) Suma los valores de la expresin

    AVG(expresin) Calcula la media aritmtica sobre la expresinindicada

    MIN(expresin) Mnimo valor que toma la expresin indicada

    MAX(expresin) Mximo valor que toma la expresin indicadaSTDDEV(expresin) Calcula la desviacin estndar

    VARIANCE(expresin) Calcula la varianza

    Todos esos valores se calculan para cada elemento del grupo, as la expresin:

    SELECT tipo,modelo, cantidad, SUM(Cantidad)

    FROM existencias

    GROUP BY tipo,modelo;

    Obtiene este resultado:TI MODELO SUM(CANTIDAD)

    AR 6 10530

    AR 9 4928

    AR 15 5667AR 20 43

    BI 10 363

    BI 38 1740

    Se suman las cantidades para cada grupo

    condiciones HAVINGA veces se desea restringir el resultado de una expresin agrupada, por ejemplo con:

    SELECT tipo,modelo, cantidad, SUM(Cantidad)

    FROM existencias

    WHERE SUM(Cantidad)>500

    GROUP BY tipo,modelo;

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    46/83

    Manual de SQL para Oracle 9i

    comandos internos SQL e iSQL*Plus

    46

    Pero Oracle devolvera este error:

    WHERE SUM(Cantidad)>500

    *ERROR en lnea 3:ORA-00934: funcin de grupo no permitida aqu

    La razn es que Oracle calcula primero el WHERE y luego los grupos; por lo que esacondicin no la puede realizar al no estar establecidos los grupos.

    Por ello se utiliza la clusula HAVING, que se efecta una vez realizados los grupos. Seusara de esta forma:

    SELECT tipo,modelo, cantidad, SUM(Cantidad)

    FROM existencias

    GROUP BY tipo,modeloHAVING SUM(Cantidad)>500;

    Eso no implica que no se pueda usar WHERE. Esta expresin s es vlida:

    SELECT tipo,modelo, cantidad, SUM(Cantidad)

    FROM existencias

    WHERE tipo!='AR'

    GROUP BY tipo,modelo

    HAVING SUM(Cantidad)>500;

    En definitiva, el orden de ejecucin de la consulta marca lo que se puede utilizar conWHERE y lo que se puede utilizar con HAVING:

    Pasos en la ejecucin de una instruccin de agrupacin por parte del gestor de bases dedatos:

    1> Seleccionar las filas deseadas utilizando WHERE. Esta clusula eliminarcolumnas en base a la condicin indicada

    2> Se establecen los grupos indicados en la clusula GROUP BY

    3> Se calculan los valores de las funciones de totales (COUNT, SUM, AVG,...)

    4> Se filtran los registros que cumplen la clusula HAVING

    5> El resultado se ordena en base al apartado ORDER BY.

    subconsultas

    Se trata de una tcnica que permite utilizar el resultado de una tabla SELECT en otraconsulta SELECT. Permite solucionar problemas en los que el mismo dato aparece dosveces.

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    47/83

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    48/83

    Manual de SQL para Oracle 9i

    comandos internos SQL e iSQL*Plus

    48

    Instruccin Significado

    comparacin con los registros de la subconsulta

    INNo usa comparador, ya que sirve para comprobarsi un valor se encuentra en el resultado de lasubconsulta

    NOT IN Comprueba si un valor no se encuentra en unasubconsulta

    Ejemplo:

    SELECT nombre, sueldo

    FROM empleados

    WHERE sueldo >= ALL (SELECT sueldo FROM empleados)

    Esa consulta obtiene el empleado que ms cobra. Otro ejemplo:

    SELECT nombre FROM empleados

    WHERE dni IN (SELECT dni FROM directivos)

    En ese caso se obtienen los nombres de los empleados cuyos dni estn en la tabla dedirectivos.

    combinaciones especiales

    unionesLa palabra UNION permite aadir el resultado de un SELECT a otro SELECT. Para elloambas instrucciones tienen que utilizar el mismo nmero y tipo de columnas. Ejemplo:

    SELECT nombre FROM provincias

    UNION

    SELECT nombre FROM comunidades

    El resultado es una tabla que contendr nombres de provincia y de comunidades. Es decir,UNION crea una sola tabla con registros que estn presentes en cualquiera de las

    consultas. Si estn repetidas slo aparecen una vez, para mostrar los duplicados se utilizaUNION ALL en lugar de la palabra UNION.

    interseccionesDe la misma forma, la palabra INTERSECT permite unir dos consultas SELECT de modoque el resultado sern las filas que estn presentes en ambas consultas.

    diferenciaCon MINUS tambin se combinan dos consultas SELECT de forma que aparecern losregistros del primer SELECT que no estn presentes en el segundo.

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    49/83

    Copyright - Copyleft ' Jorge Snchez 2004

    49

    Se podran hacer varias combinaciones anidadas (una unin cuyo resultado se intersectaracon otro SELECT por ejemplo), en ese caso es conveniente utilizar parntesis para indicarqu combinacin se hace primero:

    (SELECT....

    ....

    UNION

    SELECT....

    ...

    )

    MINUS

    SELECT.... /* Primero se hace la unin y luego la diferencia*/

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    50/83

    Manual de SQL para Oracle 9i

    comandos internos SQL e iSQL*Plus

    50

    ccoommaannddooss iinntteerrnnooss eenn SSQQLL ee iiSSQQLL**PPlluuss

    Lo que se comenta en este apartado son comandos y operaciones que no pertenecen allenguaje SQL, sino que son comandos que sirven para dar instrucciones al programaSQL*Plus o iSQL*Plus.

    Las operaciones que se comentan aqu son interpretadas por el cliente SQL*Plus y nopor Oracle. Estas operaciones sirven sobre todo para variar la forma en la que se muestranlos resultados de las consultas SQL.

    Hay que tener en cuenta que hay cierta diferencia entre los comandos SQL*Plus eiSQL*Plus.

    variables de sustitucin

    Se utilizan para poder dar parmetros a una consulta. Por ejemplo si a menudo se realizaun listado de clientes en el que queremos mostrar los datos de un cliente identificado porsu DNI, entonces se puede utilizar una variable de sustitucin para el DNI, de modo quecada vez que se ejecute esa consulta se pedir el nuevo valor de la variable.

    operador &La primera forma de utilizar variables de sustitucin es mediante el comando &. Estesmbolo utilizado en cualquier parte de la consulta, permite rellenar el contenido de unavariable de sustitucin. Por ejemplo:

    SELECT * FROM Piezas WHERE modelo=&mod;

    Al ejecutar esa sentencia, desde el cliente SQL*Plus se nos pedir rellenar el valor de lavariable m od . Esa variable no se puede volver a usar, si se usa se nos invitar a indicar el valor que la damos. La ventaja de esta tcnica est en que cada vez que ejecutemospodremos dar un valor a la variable, lo que nos permite reutilizar consultas una y otra vezpara distintos valores, sin tener que rescribirla.

    En el caso de que la variable sea de texto, hay que colocar el smbolo & dentro de lascomillas que delimitan el texto. Ejemplo:

    SELECT * FROM Piezas WHERE tipo='&tip';

    Es decir se trata de una macro-sustitucin en la que el contenido de la variable se sustituye

    por su contenido antes de pasar la instruccin a Oracle, de ah que sea necesario colocarlas comillas, de otro modo Oracle indicara que la instruccin es errnea.

    defineSe pueden utilizar variables de sustitucin que se definan como variables de usuariomediante la operacin DEFINE. La sintaxis de este comando es:

    DEFINE variable=valor;

    La variable se sobreentiende que es de tipo texto. El valor es el contenido inicial de la

    variable. La variable as creada tiene vigencia durante toda la sesin de usuario. Se elimina

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    51/83

    Copyright - Copyleft ' Jorge Snchez 2004

    51

    en el cierre de la sesin o si se usa el comando UNDEFINE indicando el nombre de lavariable a eliminar.

    Para cambiar el valor de la variable se debe utilizar otra vez el comando DEFINE. Laventaja respecto al mtodo anterior est en que la misma variable de sustitucin se puede

    utilizar para varios SELECT. La desventaja est en que requiere tocar el cdigo paracambiar el valor de la variable. Ejemplo:

    DEFINE tip='TU';

    SELECT * FROM piezas where tipo='&tip';

    SELECT * FROM existencias where tipo='&tip';

    En el ejemplo, los dos SELECT muestran piezas cuyo tipo sea TU. SQL*Plus no preguntarpor el valor de la variable t ip .

    listar variablesEl comand0 DEFINE sin nada ms permite mostrar una lista de todas las variablesdefinidas en ese momento.

    operador &&Se trata de una mezcla entre las anteriores. Cuando en una consulta se utiliza una variablede sustitucin mediante dos smbolos ampersand, entonces al ejecutar la consulta se nospreguntar el valor. Pero luego ya no, la variable queda definida como si se hubieradeclarado con DEFINE.

    El resto de veces que se utilice la variable, se usa con un solo &. El cambio de valor dela variable habr que realizarle con DEFINE.

    comando SET

    Este comando permite cambiar el valor de las variables de entorno del programa. Su usoes:

    SET nombreVariable valor

    las variables ms interesantes a utilizar son:

    variable posibles valores explicacinECHO ON (activado)yOFF(desactivado)

    Repite el comando SQL antes de mostrar suresultado

    TIMING ON (activado)yOFF(desactivado)

    Permite mostrar estadsticas sobre el tiempode ejecucin en cada consulta SQL que seejecute (interesante para estadsticas)

    HEADING ON (activado)yOFF(desactivado)

    Hace que el encabezado con los alias de lascolumnas se active o no

    WRAP ON(activado)yOFF(desactivado)

    Activado, trunca un texto si sobrepasa laanchura mxima.

    COMPATIBILITY V7, V8, NATIVE Permite indicar la versin con la que se

    comprueba la compatibilidad de los

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    52/83

    Manual de SQL para Oracle 9i

    comandos internos SQL e iSQL*Plus

    52

    variable posibles valores explicacin

    comandos. NATIVE indica que el propioservidor Oracle decide la compatibilidad

    DEFINE &, c a r c t e r , ON (activado)yOFF (desactivado)

    Permite activar y desactivar la posibilidad deusar variables de sustitucin. Permite indicarel carcter utilizado para la sustitucin devariables

    PAGESIZE n Indica el nmero de filas que se muestranantes de repetir el encabezado de la consulta

    LINESIZE n Indica la anchura mxima de la lnea de laconsulta. Si una lnea de la consultasobrepasa este valor, los datos pasan a lasiguiente.Tambin influye sobre los tamaos yposiciones de los encabezados y pies de losinformes

    NULL valor Indica qu valor se muestra cuando haynulos

    NUMFORMAT formato Permite especificar un formato que seaplicar a todos los nmeros. (Vase formatode columnas, ms adelante)

    NUMWIDTH valor Indica la anchura mxima utilizada paramostrar nmeros. Si un nmero sobrepasaesta anchura, es redondeado

    FEEDBACK n, ON (activado)yOFF(desactivado) Hace que se muestren el nmero total deregistros de la consulta cuando el resultadosupera los n registros.

    LONG ancho Anchura mxima para los campos de tipoLONG

    SHOWEl comando SHOW seguido de el nombre de uno de los parmetros de la tabla anterior,permite mostrar el estado actual del parmetro indicado. Si se usa SHOW ALL, entoncesse muestran todos

    encabezado y pie de informeLos parmetros BTITLE yTTITLE permiten, respectivamente, indicar un texto de pie yde encabezado para la consulta. El formato es

    {B|T}TITLE {texto|ON|OFF}

    El texto es lo que se desea en el encabezado o pie. Ese texto puede incluir las palabrasLEFT, RIGHT o CENTER para hacer que el texto vaya a izquierda, centro o derecharespectivamente.

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    53/83

    Copyright - Copyleft ' Jorge Snchez 2004

    53

    Se pueden indicar incluso las tres cosas a la vez:

    TTITLE LEFT 'informe1' RIGHT 'estudio de clientes';

    Se puede tambin usar la palabra COL seguida del nmero de columna en el que se deseael texto:

    TTITLE COL 50 'informe1';

    Tambin se puede indicar la palabra TAB seguida de un nmero que representartabulaciones, haciendo que SQL*Plus deje ese espacio en encabezado o pie.

    COLUMN

    Permite especificar un formato de columna. Si se usa sin modificador (slo COLUMNS osu abreviatura COL) se muestran las configuraciones de formato de columnas

    actualmente en uso. Si se aade el nombre de una columna, se indica el formato actual (silo hay) para esa columna.

    aadir formato de columnaHEADING

    Si se usa COLUMN (o COL) con el parmetro HEADING seguido de un texto, el texto seconvierte en la cabecera de la columna (sustituyendo al alias de la columna). Ese texto slosirve para ser mostrado, no puede formar parte de una sentencia SQL.

    COLUMN precio_venta HEADING 'Precio de|venta';

    SELECT tipo, modelo, precio_venta FROM piezas;

    En el ejemplo, la barra vertical provoca un salto de lnea en el texto.

    FORMATPermite indicar una mscara de formato para el texto. Se usan cdigos especiales paraello.

    textosA los textos se les puede colocar una anchura mxima de columna. Eso se hace con una Aseguida del nmero que indica esa anchura.

    COLUMN tipo FORMAT 'A10';

    SELECT tipo, modelo, precio_venta FROM piezas;

    nmerosSe usan cdigos de posicin:

    cdigo significado

    9 Posicin para un nmero. Si el valor es 0 o vaco, entonces no semuestra nada

    0 Posicin para un nmero. Si el valor es 0 o vaco, entonces semuestra 0

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    54/83

    Manual de SQL para Oracle 9i

    comandos internos SQL e iSQL*Plus

    54

    cdigo significado

    $ Posicin para el signo de dlar

    MIMuestra un signo menos tras el nmero, si el nmero es negativo(ejemplo: '999MI')

    S Muestra el signo del nmero (+ -) en la posicin en la que secoloca el signo

    PR Muestra los nmeros negativos entre < y >

    D Muestra el signo decimal en esa posicin

    G Muestra el signo de grupo en esa posicin

    . Muestra el punto (separador decimal)

    , Muestra la coma (separador de miles)

    L Muestra el smbolo de moneda nacional en esa posicin

    RN Muestra el nmero en romano (maysculas)rn Muestra el nmero en romano (minsculas)

    fechasLas fechas deben ser formateadas desde la propia instruccin SQL mediante la funcinTO_CHAR (vista en el tema anterior)

    LIKEPermite copia atributos de una columna a otra:

    COLUMN precio_venta FORMAT '9G990D00L';

    COLUMN precio_compra LIKE precio_venta;

    Las dos columnas tendrn el mismo formato (separador de miles, decimales y monedatras los dos decimales)

    NULLIndica un texto que sustituir a los valores nulos.

    CLEARElimina el formato de la columna

    Lgicamente se pueden combinar varias acciones a la vez

    BREAK

    Es uno de los comandos ms poderosos. Permite realizar agrupaciones en las consultas,consiguiendo verdaderos informes (en especial si se combina con COMPUTE).

    Permite dividir la vista en secciones en base al valor de un campo al que se le puedenincluso quitar los duplicados. El comando:

    BREAK ON tipo;

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    55/83

    Copyright - Copyleft ' Jorge Snchez 2004

    55

    Hace que las columnas con alias tipo no muestren los duplicados, mostrando una vez cada valor duplicado. Para el buen funcionamiento de la orden, el resultado debe de estarordenado por esa columna.

    Se pueden hacer varios grupos a la vez:

    BREAK ON tipo ON modelo;

    La orden CLEAR BREAKelimina todos los BREAK anteriormente colocados.

    SKIPA la instruccin anterior se le puede aadir la palabra SKIP seguida de un nmero. Esenmero indica las lneas que se dejan tras el valor del grupo al imprimir. Si se indica SKIPPAGE, significa que se salta una pgina completa cada vez que cambie el valor del grupo.

    ON REPORTPermite (en unin con COMPUTE) realizar clculos de totales sobre el informe completo.DUPLICATES y NODUPLICATESPermiten mostrar o no los duplicados de cada seccin. La opcin inicial esNODUPLICATES.

    COMPUTE

    Permite en unin con BREAK realizar clculos para las secciones de una consulta. TodoCOMPUTE est asociado a un apartado ON de una instruccin BREAL previa. Sintaxis:

    COM[PUTE] [funcin[LAB[EL] texto] OF columnaOAlias

    ON {columnaOAlias|REPORT}

    funcin. Es el nombre de la funcin de clculo que se usa (SUM, AVG, MIN, MAX,NUM (esta es como COUNT) , STD o VAR)

    LABEL. Permite indicar un texto previo al resultado del clculo, si no se utiliza sepone el nombre de la funcin utilizada.

    OF. Indica el nombre de columna o alias utilizado en la instruccin SELECT a partirde la que se realiza el clculo

    ON. Indica el nombre de columna o alias que define la seccin sobre la que serealizar el clculo. Este nombre debe haber sido indicado en un BREAK anterior.

    REPORT. Indica que el clculo se calcular para toda la consulta.

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    56/83

    Manual de SQL para Oracle 9i

    comandos internos SQL e iSQL*Plus

    56

    CLEAR BREAK;

    COLUMN TIPO FORMAT A20;

    BREAK ON tipo SKIP PAGE ON modelo ON REPORT;

    COMPUTE SUM LABEL 'Total' MAX LABEL 'Mximo' -

    OF cantidad ON tipo;

    COMPUTE SUM LABEL 'Total' OF cantidad ON modelo;

    COMPUTE SUM LABEL 'Total absoluto' OF cantidad ON REPORT;

    SELECT tipo, modelo, n_almacen, cantidad FROM existencias

    WHERE tipo='AR' OR tipo='TU'

    ORDER BY tipo, modelo;

    Resultado:

    TIPO MODELO N_ALMACEN CANTIDAD

    AR 6 1 2500

    2 5600

    3 2430

    ********** ----------

    Total 10530

    9 1 250

    2 4000

    3 678********** ----------

    Total 4928

    15 1 5667

    ********** ----------

    Total 566720 3 43

    ********** ----------

    Total 43

    ******************** ----------

    Mximo 5667Total 21168

    TIPO MODELO N_ALMACEN CANTIDAD

    TU 6 2 2343 43

    ********** ----------

    Total 277

    9 2 876

    ********** ----------

    Total 876

    10 2 1023

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    57/83

    Copyright - Copyleft ' Jorge Snchez 2004

    57

    ********** ----------

    Total 102312 2 234

    ********** ----------

    Total 23416 2 654

    ********** ----------

    Total 654******************** ----------

    Mximo 1023

    Total 3064

    TIPO MODELO N_ALMACEN CANTIDAD

    ----------

    Total absoluto 24232

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    58/83

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    59/83

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    60/83

    Manual de SQL para Oracle 9i

    objetos de la base de datos

    60

    relleno de registros a partir de filas de una consultaHay un tipo de consulta, llamada de adicin de datos, que permite rellenar datos de una

    tabla copiando el resultado de una consulta.Ese relleno se basa en una consulta SELECT que poseer los datos a aadir.Lgicamente el orden de esos campos debe de coincidir con la lista de campos indicada enla instruccin INDEX. Sintaxis:

    INSERT INTO tabla (campo1, campo2,...)

    SELECT campoCompatibleCampo1, campoCompatibleCampo2,...

    FROMtabla(s)

    [...otras clusulas del SELECT...]

    Ejemplo:

    INSERT INTO clientes2004 (dni, nombre, localidad, direccion)

    SELECT dni, nombre, localidad, direccion

    FROM clientes

    WHERE problemas=0;

    actualizacin de registros

    La modificacin de los datos de los registros lo implementa la instruccin UPDATE.Sintaxis:

    UPDATE tabla

    SET columna1=valor1 [,columna2=valor2...]

    [WHERE condicin]

    Se modifican las columnas indicadas en el apartado SET con los valores indicados. Laclusula WHERE permite especificar qu registros sern modificados.

    Ejemplos:

    UPDATE clientes SET provincia='Ourense'

    WHERE provincia='Orense';

    UPDATE productos SET precio=precio*1.16;

    El primer dato actualiza la provincia de los clientes de Orense para que aparezca comoOurense. El segundo UPDATE incrementa los precios en un 16%. La expresin para elvalor puede ser todo lo compleja que se desee:

    UPDATE partidos SET fecha=NEXT_DAY(SYSDATE,'Martes')

    WHERE fecha=SYSDATE;

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    61/83

    Copyright - Copyleft ' Jorge Snchez 2004

    61

    Incluso se pueden utilizar subconsultas:

    UPDATE empleados

    SET puesto_trabajo=(SELECT puesto_trabajo

    FROM empleadosWHERE id_empleado=12)

    WHERE seccion=23;

    Esta consulta coloca a todos los empleados de la seccin 23 el mismo puesto de trabajoque el empleado nmero 12. Este tipo de actualizaciones slo son vlidas si el subselectdevuelve un nico valor, que adems debe de ser compatible con la columna que seactualiza.

    Hay que tener en cuenta que las actualizaciones no pueden saltarse las reglas deintegridad que posean las tablas.

    borrado de registros

    Se realiza mediante la instruccin DELETE:

    DELETE [FROM] tabla

    [WHERE condicin]

    Es ms sencilla que el resto, elimina los registros de la tabla que cumplan la condicinindicada. Ejemplos:

    DELETE FROM empleadosWHERE seccion=23;

    DELETE FROM empleados

    WHERE id_empleado IN (SELECT id_empleado FROM errores_graves);

    Hay que tener en cuenta que el borrado de un registro no puede provocar fallos deintegridad y que la opcin de integridad ON DELETE CASCADE (vase pgina 21, clavesecundaria o fornea) hace que no slo se borren los registros indicados en el SELECT,sino todos los relacionados.

    comando MERGE

    Sin duda alguna el comando ms poderoso del lenguaje de manipulacin de Oracle esMERGE. Este comando sirve para actualizar los valores de los registros de una tabla apartir de valores de registros de otra tabla o consulta. Permite pues combinar los datos dedos tablas a fin de actualizar la primera

    Supongamos que poseemos una tabla en la que queremos realizar una lista delocalidades con su respectiva provincia. Las localidades estn ya rellenadas, nos faltan lasprovincias. Resulta que tenemos otra tabla llamada clientes en la que tenemos datos delocalidades y provincias, gracias a esta tabla podremos rellenar los datos que faltan en laotra. La situacin se muestra en la ilustracin siguiente.

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    62/83

    Manual de SQL para Oracle 9i

    objetos de la base de datos

    62

    Registros MATCHED

    Registros NOT MATCHED(se aadirn a la segundatabla)

    Valores UPDATE(se copiarn a lasegunda tabla)

    Clientes

    Localidades

    Ilustracin 2, Ejemplo de uso de MERGE

    La sintaxis del comando MERGE es:

    MERGE INTO tabla alias

    USING (instruccin SELECT) alias

    ON (condicin de unin)

    WHEN MATCHED THEN

    UPDATE SET col1=valor1 [col2=valor2]

    WHEN NOT MATCHED THEN

    INSERT (listaDeColumnas)

    VALUES (listaDeValores)

    MERGE compara los registros de ambas tablas segn la condicin indicada en el apartadoON. Compara cada registro de la tabla con cada registro del SELECT. Los apartados de lasintaxis significan lo siguiente:

    tabla es el nombre de la tabla que queremos modificar

    USING . En esa clusula se indica una instruccin SELECT tan compleja comoqueramos que muestre una tabla que contenga los datos a partir de los cuales semodifica la tabla

    ON. permite indicar la condicin que permite relacionar los registros de la tabla con

    los registros de la consulta SELECT

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    63/83

    Copyright - Copyleft ' Jorge Snchez 2004

    63

    W HEN MATCHED THEN . El UPDATE que sigue a esta parte se ejecuta cuandola condicin indicada en el apartado ON sea cierta para los dos registros actuales.

    WHEN NOT MATCHED THEN. El INSERT que sigue a esta parte se ejecutapara cada registro de la consulta SELECT que no pudo ser relacionado con ningnregistro de la tabla.

    Para el ejemplo descrito antes la instruccin MERGE sera:

    MERGE INTO localidades l

    USING (SELECT * FROM clientes) c

    ON (l.localidad=clientes.localidad)

    WHEN MATCHED THEN

    UPDATE SET l.provincia=c.provincia

    WHEN NOT MATCHED THENINSERT (localidad, provincia)

    VALUES (c.localidad, c.provincia)

    El resultado es la siguiente tabla de localidades:

    Localidad Provincia

    Villamuriel Palencia

    Cigales Valladolid

    Palencia Palencia

    Aranda de Duero Burgos

    transacciones

    Como se ha comentado anteriormente, una transaccin est formada por una serie deinstrucciones DML. Una transaccin comienza con la primera instruccin DML que seejecute y finaliza con alguna de estas circunstancias:

    Una operacin COMMIT o ROLLBACK

    Una instruccin DDL (como ALTER TABLE por ejemplo)

    Una instruccin DCL (como GRANT)

    El usuario abandona la sesin

    Cada del sistema

    Hay que tener en cuenta que cualquier instruccin DDL o DCL da lugar a un COMMITimplcito, es decir todas las instrucciones DML ejecutadas hasta ese instante pasan a serdefinitivas.

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    64/83

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    65/83

    65

    oobbjjeettooss ddee llaa bbaassee ddee ddaattooss

    vistasintroduccinUna vista no es ms que una consulta almacenada a fin de utilizarla tantas veces como sedesee. Una vista no contiene datos sino la instruccin SELECT necesaria para crear lavista, eso asegura que los datos sean coherentes al utilizar los datos almacenados en lastablas.

    Las vistas se emplean para:

    Realizar consultas complejas ms fcilmente

    Proporcionar tablas con datos completos Utilizar visiones especiales de los datos

    Hay dos tipos de vistas:

    Simples. Las forman una sola tabla y no contienen funciones de agrupacin. Suventaja es que permiten siempre realizar operaciones DML sobre ellas.

    Complejas. Obtienen datos de varias tablas, pueden utilizar funciones deagrupacin. No siempre permiten operaciones DML.

    creacin de vistasSintaxis:

    CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW vista

    [(alias[, alias2...]]

    AS consultaSELECT

    [WITH CHECK OPTION [CONSTRAINT restriccin]]

    [WITH READ ONLY [CONSTRAINT restriccin]]

    OR REPLACE. Si la vista ya exista, la cambia por la actual

    FORCE. Crea la vista aunque los datos de la consulta SELECT no existan

    vista. Nombre que se le da a la vista

    alias. Lista de alias que se establecen para las columnas devueltas por la consultaSELECT en la que se basa esta vista. El nmero de alias debe coincidir con elnmero de columnas devueltas por SELECT.

    WITH CHECK OPTION. Hace que slo las filas que se muestran en la vistapuedan ser aadidas (INSERT) o modificadas (IPDATE). La restriccin que sigue aesta seccin es el nombre que se le da a esta restriccin de tipo CHECK OPTION.

  • 8/14/2019 MANUAL DE SQL PARA ORACLE 9i

    66/83

    Manual de SQL para Oracle 9i

    objetos de la base de datos

    66

    WITH READ ONLY. Hace que la vista sea de slo lectura. Permite grabar unnombre para esta restriccin.

    Lo bueno de las vistas es que tras su creacin se utilizan como si fueran una tabla.Ejemplo:

    CREATE VIEW resumen

    /* alias */

    (id_localidad, localidad, poblacion, n_provincia, provincia,

    superficie, capital_provincia,

    id_comunidad, comunidad, capital_comunidad)

    AS

    ( SELECT l.id_localidad, l.nombre, l.poblacion,n_provincia, p.nombre, p.superficie, l2.nombre,

    id_comunidad, c.nombre, l3.nombre

    FROM localidades l

    JOIN provincias p USING (n_provincia)

    JOIN comunidades c USING (id_comunidad)

    JOIN localidades l2 ON (p.id_capital=l2.id_localidad)

    JOIN localidades l3 ON (c.id_capital=l3.id_localidad)

    )

    SELECT DISTINCT (comunidad, capital_comunidad) FROM resumen;

    La creacin de la vista del ejemplo es compleja ya que hay relaciones complicadas, perouna vez creada la vista, se le pueden hacer consultas como si se tratara de una tablanormal. Incluso se puede utilizar el comando DESCRIBE sobre la vista para mostrar laestructura de los campos que forman la vista.

    eje