You are on page 1of 27

Introducción al lenguaje SQL

[1.1] notas previas
[1.1.1]versión de SQL

La pretensión de estos apuntes es la de ser guía para el aprendizaje del lenguaje SQL. Aunque SQL posee un
estándar aprobado por la agencia ISO, la realidad es que cada producto comercial de base de datos utiliza su
propia variante.

En este sentido todo el SQL del libro se ha probado en la versión 11g R2 del sistema Oracle Database.
Aunque en algunos apartados se hacen ciertos comentarios sobre las diferencias sobre el SQL estándar
aprobado por la agencia ISO, el manual se basa en el aprendizaje del SQL de la empresa Oracle.

La realidad es que Oracle ha sido puntero en incorporar nuevas funcionalidades al lenguaje SQL y por ello,
aprendiendo el SQL de Oracle es fácil aprender cualquier otro dialecto de SQL y también el estándar y esa
es para mí la razón fundamental para elegir Oracle como sistema de aprendizaje de SQL.

A fin de probar el SQL hay que tener en cuenta que existe una versión de Oracle que es gratuita para un uso
sin ánimo de lucro llamada Oracle 11g Express Edition1.

La razón de utilizar Oracle como base de trabajo se debe a su respeto por SQL estándar, aunque, desde
luego, lejos del estricto respeto del estándar de otros sistemas (por ejemplo el que hace el sistema
PostgreSQL) y porque Oracle sigue siendo el Sistema Gestor de Bases de Datos (SGBD) más importante e
influyente.

[1.1.2]formato de las instrucciones en los apuntes

En este manual en muchos apartados se indican sintaxis para saber la forma y posibilidades de las
instrucciones SQL. En el presente manual, dicha sintaxis, se escribe en párrafos sombreados con el reborde
de color marrón.

Ejemplo:

SELECT * | {[DISTINCT columna | expresión [alias], ...}
FROM tabla;

Otras veces se describen códigos de ejemplo de un comando. Los ejemplos se escriben también con fondo
naranja claro, pero sin el reborde. Ejemplo:

SELECT nombre FROM cliente;

Los ejemplos sirven para escenificar una instrucción concreta, la sintaxis se utiliza para indicar las forma de
utilizar un comando.

Para indicar la sintaxis de un comando se usan símbolos especiales. Los símbolos que utiliza este libro (de
acuerdo con la sintaxis que se utiliza normalmente en cualquier documentación de este tipo) son:

 PALABRA. Cuando en la sintaxis se utiliza una palabra coloreada en azul y en negrita, significa que
es una palabra que hay que escribir literalmente (aunque sin importar si en mayúsculas o
minúsculas).
 texto. El texto que aparece en color normal sirve para indicar que no hay que escribirle literalmente,
sino que se refiere a un tipo de elemento que se puede utilizar en el comando. Ejemplo:

SELECT columna FROM tabla;

 El texto columna hay que cambiarlo por un nombre concreto de columna (como edad, apellidos,...),
al igual que tabla se refiere a un nombre de tabla concreto.
 símbolos. Los símbolos coloreados en azul y negrita, hay que escribirles de forma literal, aunque no
sean palabras reservadas del lenguaje.
 [ ] (corchetes). Los corchetes (en color rojo) sirven para encerrar texto que no es obligatorio en la
instrucción. Es decir, para indicar una parte opcional de la instrucción.
 | (barra vertical). Este símbolo (|), la barra vertical, indica opción. Cuando hay diferentes palabras o
secciones en la instrucción separadas por la barra, se está indicando que solo podremos elegir una de
las opciones (son opciones, por lo tanto, excluyentes).
 ... (puntos suspensivos) Indica que la sección anterior a los puntos suspensivos, se puede repetir una
y otra vez.
 {} (llaves) Las llaves sirven para indicar secciones obligatorias. Normalmente se usa con la barra
vertical para indicar que solo se puede elegir una opción, pero es obligatorio elegir una. Ejemplo:

SELECT { * | columna | expresión }
FROM tabla;

 El ejemplo anterior indicaría que se debe elegir obligatoriamente el asterisco o un nombre de
columna o una expresión. Si las llaves del ejemplo fueran corchetes, entonces indicarían que incluso
podría no aparecer ninguna opción.
 [1.2] introducción a SQL
 [1.2.1]objetivos

SQL es el lenguaje fundamental de los SGBD relacionales. Se trata de uno de los lenguajes más utilizados
de la historia de la informática y sigue siendo de aprendizaje casi obligatorio para cualquier profesional
relacionado con la computación.

SQL es un lenguaje declarativo, lo que implica que se centra en definir qué se desea hacer, por encima de
cómo hacerlo (que es la forma de trabajar de los lenguajes de programación de aplicaciones como C o
Java). La razón de este matiz, es que los lenguajes declarativos se parecen más al lenguaje natural humano y
parecen más apropiados para trabajar con bases de datos (especialmente con las relacionales).

Se trata de un lenguaje que intenta agrupar todas las funciones que se le pueden pedir a una base de datos,
por lo que es el lenguaje utilizado tanto por administradores como por programadores o incluso usuarios
avanzados.

Pretende cumplir la quinta regla de Codd, que dicta que el lenguaje de la base de datos debe de ser capaz de
realizar cualquier instrucción sobre la misma. En sistemas gestores como Oracle esta regla se cumple
completamente: toda la gestión y administración del sistema de bases de datos se puede realizar utilizando
solo lenguaje SQL.

[1.2.2]historia del lenguaje SQL

El nacimiento del lenguaje SQL data de 1970 cuando E. F. Codd publica su libro: “Un modelo de datos
relacional para grandes bancos de datos compartidos”. Ese libro dictaría las direcrices de las bases de datos
relacionales. Apenas dos años después IBM (para quien trabajaba Codd) utiliza las directrices de Codd para
crear el Standard English Query Language (Lenguaje Estándar Inglés para Consultas) al que se le llamó
SEQUEL. Más adelante se le asignaron las siglas SQL (Standard Query Language, lenguaje estándar de
consulta) aunque en inglés se siguen pronunciando secuel. En español se pronuncia esecuele.

En 1979 Oracle presenta la primera implementación comercial del lenguaje. Poco después se convertía en un
estándar en el mundo de las bases de datos avalado por los organismos ISO y ANSI. En el año 1986 se toma

Pascal. En 1992 aparece la nueva versión estándar de SQL (a día de hoy sigue siendo la más conocida) llamada SQL92. existen los siguientes elementos a tener en cuenta en todo el entorno involucrado en la ejecución de instrucciones SQL:  Un agente SQL. El código anfitrión se debe de compilar o interpretar mediante software adecuado. ejecución a través de clientes gráficos .. Es la forma habitual en la que trabajan los administradores y muchos desarrolladores y operadores.. o Un servidor SQL (puede haber varios). Pero la mayoría de las mejoras añadidas en los últimos estándares se refieren al uso de otros lenguajes (especialmente los referentes a XML) con el propio SQL o a la incorporación de elementos orientados a objetos. Es el software conectado al agente (se le suele llamar controlador o driver) que proporciona una interfaz entre el agente SQL y el servidor SQL. En el caso de Oracle al cliente SQL se le suele llamar proceso de usuario y al servidor SQL. En 1999 se aprueba un nuevo SQL estándar que incorpora mejoras que incluyen triggers. Las instrucciones se traducen sin intermediarios. Software encargado de procesar las instrucciones SQL y de enviar los resultados al cliente. enviar y recibir instrucciones SQL. tipos de agentes SQL ejecución directa.como lenguaje estándar por ANSI de los SGBD relacionales. proceso servidor. la comunicación entre el agente y el servidor SQL debe de pasar por este elemento. Normalmente es un modo de trabajo incómodo. se publicaron nuevos estándares en los años 2003.3]funcionamiento componentes de un entorno de ejecución SQL Según la normativa ANSI/ISO cuando se ejecuta SQL. Por lo tanto. En 1989 aparece el estándar ISO (y ANSI) llamado SQL89 o SQL1. modos de ejecución SQL.2. Java.… y otras características de las bases de datos objeto-relacionales. sobre el que se realiza una acción que requiere enviar código SQL al servidor de bases de datos. como JDBC u ODBC por ejemplo. Es decir. Visual Basic. ejecución incrustada o embebida Las instrucciones SQL se colocan como parte del código de otro lenguaje que se considera anfitrión (C. Una implementación está compuesta por: o Un cliente SQL. Se trata de el software encargado de procesar. SQL interactivo Las instrucciones SQL se introducen directamente en el software del cliente. el cual detectará el código SQL y podrá lanzarle hacia el servidor SQL a través de una interfaz especial. Un año después lo adopta ISO. pasan tal cual al servidor SQL. lo que convierte a SQL en estándar mundial como lenguaje de bases de datos relacionales. Puede ser el software que utiliza el cliente.. [1. dicho estándar se conoce como SQL99 o SQL2000. Entendido como cualquier elemento que cause la ejecución de instrucciones SQL que serán recibidas por un cliente SQL.  Una implementación SQL. procedimientos. pero permite tener acceso a todas las capacidades del lenguaje SQL de la base de datos a la que estamos conectados. 2006. que se encarga de enviar las instrucciones SQL correspondientes a la acción del usuario y de recibir los resultados del servidor. el último estándar es el del año 2011 (SQL2011). Tras ese estándar.). 2008 y 2011. funciones.

es tan importante que. o Instrucciones de control de transacciones (DTL). o DCL.) . Lo forman las instrucciones INSERT. [1.. o DML.. Otros comandos permiten modificar (ALTER) y borrar (DROP) estos elementos. Pueden ser aritméticos (+. Data Definition Language (Lenguaje de definición de datos). Para comprobar la sintaxis de la misma [2]Si es correcta se valora si los metadatos de la misma son correctos. Lo forman los comandos que modifican filas (y por lo tanto datos) de las tablas. o Con estos comandos se crean. <. MERGE y DELETE. etc. AND. Aunque. el código que contienen se ejecuta en el servidor. Lo forman los comandos que permiten modificar la estructura de la base de datos.Se trata de software que permite conectar a la base de datos a través de un software que permite abstraerse del lenguaje SQL.3] elementos del lenguaje SQL [1. Lo forman las instrucciones GRANT y REVOKE.2.-. ALTER. Por ello. Lo forman las instrucciones CREATE. vistas (CREATE VIEW). [1. son tan importantes que se las considera que forman un lenguaje aparte. tablas (CREATE TABLE). ORDER BY.  Operadores. se entiende que forma parte del lenguaje DQL (Data Query Language. por ejemplo. UPDATE. se optimiza. Cuando se invoca a estos procedimientos y funciones. El software permite manejar de forma gráfica la base de datos y las acciones realizadas son traducidas a SQL y enviadas al servidor. Los resultados recibidos vuelven a ser traducidos de forma gráfica para un manejo más cómodo ejecución dinámica Se trata de SQL almacenado en procedimientos y funciones que se almacenan junto con la base de datos. Se comprueba esto en el diccionario de datos. OR. [4]Se ejecuta la sentencia y se muestra el resultado al emisor de la misma.1]código SQL El código SQL consta de los siguientes elementos:  Comandos. Data Manipulation Language (Lenguaje de manipulación de datos).. Data Control Language (Lenguaje de control de datos). Administran los derechos y restricciones de los usuarios.. Lenguaje de consulta de datos).3. Las transacciones se controlan con las instrucciones ROLLBACK y COMMIT (Oracle añade también el comando SAVEPOINT). etc. Más claramente.. Se trata del comando que permite realizar consultas sobre los datos de la base de datos. son los comandos que modifican los metadatos.. Ejemplos: WHERE. se le asocia toda una función: la función de consulta. son parte del lenguaje DML.) o lógicos (>. RENAME y TRUNCATE.4]proceso de las instrucciones SQL Normalmente.*. el proceso de una instrucción SQL consta de estos pasos: [1]Se analiza la instrucción.  Cláusulas. Son las distintas instrucciones que se pueden realizar desde SQL o DDL. también. Permiten crear expresiones complejas. Aunque esta operación forma parte de la función de manipulación (y por lo tanto del lenguaje DML) .<>. Son palabras especiales que permiten modificar el funcionamiento de un comando. o SELECT. usuarios (CREATE USER). !=./. en la actualidad. [3]Si es correcta. a fin de consumir los mínimos recursos posibles. DROP.

. Es información de la estructura de la base de datos. Ejemplos: 2.  Las instrucciones finalizan con el signo de punto y coma  Cualquier comando SQL (SELECT..2]normas de escritura  En SQL no se distingue entre mayúsculas y minúsculas (salvo en los textos literales. como en otros sistemas. Lo que no podemos es partir en varias líneas una palabra. INSERT. ‘Avda Cardenal Cisneros’  Metadatos.  Literales. nombres de columnas.) puede ser partidos por espacios o saltos de línea antes de finalizar la instrucción. También se pueden tabular líneas para facilitar la lectura si fuera necesario.. caracteres.. etc. textos. Se usa para mejorar la legibilidad de las instrucciones.3. etc..  Los comentarios en el código SQL comienzan por /* y terminan por */ (excepto en algunos SGBD). Por ejemplo: nombres de tablas. Funciones. en los datos). SYSDATE. Son elementos que reciben parámetros y devuelven resultados que facilitan crear instrucciones complejas. Ejemplos: SUM().. En Oracle.34. 12. es decir. --Instrucción . Valores concretos para las consultas: números. existe también el comentario de una línea mediante los símbolos --: /* Comentario que ocupa varias líneas */ --Comentario de una línea SELECT * FROM personas. [1.

Ejemplo: CREATE DATABASE prueba LOGFILE prueba. de la base de datos: tablas. se encarga de la creación.1] introducción al lenguaje DDL El DDL es la parte del lenguaje SQL que realiza la función de definición de datos del SGBD. En el caso de Oracle necesitamos indicar muchos más parámetros. El proceso de creación de bases de datos en Oracle es muy complejo y no se verá en estos apuntes1. Salvo que dispongamos de alguna copia de seguridad o de otros elementos de recuperación. vistas. Creación de tablas [2.dbf AUTOEXTEND ON MAXSIZE 500MB. Ejemplo: CREATE DATABASE prueba. Por supuesto es el encargado de la creación de las tablas.2] creación de bases de datos Esta es una tarea administrativa que se comentará más profundamente en otros temas. Por ahora solo se comenta de forma simple. Crear la base de datos implica indicar los archivos y ubicaciones que se utilizarán para la misma. muchos Sistemas Gestores de Bases de Datos aportan elementos para organizar estos objetos (como catálogos y esquemas). En muchos sistemas eso basta para crear la bases de datos. En principio solo los administradores y los usuarios propietarios pueden acceder a cada objeto. llamados objetos. modificación y eliminación de los objetos de la base de datos (es decir de los metadatos).log MAXLOGFILES 25 MAXINSTANCES 10 ARCHIVELOG CHARACTER SET WIN1214 NATIONAL CHARACTER SET AL32UTF8 DATAFILE prueba1.… se almacenan en el diccionario de datos. Los elementos. El comando SQL de creación de una base de datos es CREATE DATABASE. [2. . además de otras indicaciones técnicas y administrativas que no se comentarán en este tema. columnas. Es decir. las instrucciones DDL generan acciones que no se pueden deshacer. Este comando crea una base de datos con el nombre que se indique. Los objetos son manipulados y creados por los usuarios. índices. Hay que tener en cuenta que ninguna instrucción DDL puede ser anulada por una instrucción ROLLBACK (la instrucción ROLLBACK está relacionada con el uso de transacciones. Por otro lado. salvo que se modifiquen los privilegios del objeto para permitir el acceso a otros usuarios. Lógicamente solo es posible crear una base de datos si se tienen privilegios de DBA (DataBase Administrator). Fundamentalmente.DDL. que se comentarán más adelante) por lo que hay que tener mucha precaución a la hora de utilizarlas.

restricciones. vistas. los esquemas suelen estar asociados al perfil de un usuario en particular. por lo que no son recomendados)  No puede haber dos tablas con el mismo nombre dentro del mismo esquema (pueden coincidir los nombres si están en distintos esquemas)  No puede coincidir con el nombre de una palabra reservada SQL (por ejemplo no se puede llamar SELECT a una tabla)  En el caso de que el nombre tenga espacios en blanco o caracteres nacionales (permitido solo en algunas bases de datos).[2. entonces se suele entrecomillar con comillas dobles.2]comando CREATE TABLE Es la orden SQL que permite crear una tabla. pero esos se utilizan de manera especial. los objetos pertenecen a esquemas y estos a catálogos.3. . de modo que si no se indica catálogo alguno al crear objetos. que sirve para almacenar esquemas. Sintaxis: CREATE TABLE [esquema. Por defecto será almacenada en el espacio y esquema del usuario que crea la tabla. estos se almacenan allí. [2..esquema. hay esquemas por defecto.2.objeto Es decir. números o el signo de subrayado (también los signos $ y #.3] creación de tablas [2.) estarán normalmente en nuestro esquema. Oracle no posee catálogos. una base de datos es un conjunto de objetos pensados para gestionar datos. En casi todos los sistemas de bases de datos hay un catálogo por defecto. Del mismo modo.1]nombre de las tablas Deben cumplir las siguientes reglas (se comentan las reglas de Oracle. existe el concepto de catálogo. En SQL estándar.] nombreDeTabla ( nombreDeLaColumna1 tipoDeDatos [DEFAULT valor] [restricciones] [.3. etc.1]objetos de la base de datos Según los estándares actuales. Así el nombre completo de un objeto vendría dado por: catálogo. Los esquemas de Oracle están relacionados con los usuarios: cada usuario posee un esquema (con el mismo nombre que el usuario) pensado para almacenar sus objetos. nuestros objetos (tablas.. Estos objetos están contenidos en esquemas. Sin embargo sí existen esquemas. y estos sirven para almacenar objetos. Aunque podemos almacenar (si tenemos permisos para ello) objetos en otros esquemas. columnas. en otros SGBD podrían cambiar):  Deben comenzar con una letra  No deben tener más de 30 caracteres  Solo se permiten utilizar letras del alfabeto (inglés). Ejemplo: . En el estándar SQL 99 (respetado por Oracle) se pueden utilizar comillas dobles al poner el nombre de la tabla a fin de hacerla sensible a las mayúsculas (se diferenciará entre “FACTURAS” y “Facturas”) Nota: Estas son también las propiedades que debe cumplir cualquier nombre de objeto en una base de datos (nombres de vistas.] ).…) [2.

hay que indicar el tipo de datos de cada campo. Necesitamos pues conocer los distintos tipos de datos. Solo se podrá crear la tabla si el usuario posee los permisos necesarios para ello. localidad VARCHAR(30) DEFAULT ‘Palencia’ ). se antepone al nombre de la tabla . [2. Si la tabla pertenece a otro esquema (suponiendo que el usuario tenga permiso para grabar tablas en ese otro esquema). Crea una tabla con un solo campo de tipo VARCHAR.proveedores ( nombre VARCHAR(25) ). Estos son: Descripción Tipos Estándar SQL Oracle SQL Texto CHARACTER(n) Texto de anchura fija CHAR(n) CHAR(n) CHARACTER VARYING(n) Texto de anchura variable VARCHAR2(n) VARCHAR (n) NATIONAL CHARACTER(n) Texto de anchura fija para NATIONAL CHAR(n) NCHAR(n) caracteres nacionales NCHAR(n) NATIONAL CHARACTER VARYING(n) Texto de anchura variable para NATIONAL CHAR VARYING(n) NVARCHAR2(n) caracteres nacionales NCHAR VARYING(n) . Por ejemplo: CREATE TABLE Prestamos( id_prestamo NUMBER(8).CREATE TABLE proveedores (nombre VARCHAR(25)). se tomará Palencia como localidad de dicho Proveedor. el nombre del esquema: CREATE TABLE otroUsuario. Se puede indicar un valor por defecto para el atributo mediante la cláusula DEFAULT. fecha_prestamo DATE DEFAULT SYSDATE ). Ejemplo: CREATE TABLE Proveedores ( nombre VARCHAR(25). De este modo si añadimos un proveedor y no indicamos localidad.4] tipos de datos A la hora de crear tablas. Podemos utilizar DEFAULT y usar funciones del sistema.

pero es muy (8 bytes) utilizado en muchas bases de datos) Enteros NUMBER(n) precisión decimal FLOAT DOUBLE Decimal de coma variable NUMBER DOUBLE PRECISSION REAL NUMERIC(m.d) Decimal de coma fija NUMBER(m.d) Fechas Fechas DATE DATE Fecha y hora TIMESTAMP TIMESTAMP INTERVAL YEAR TO INTERVAL YEAR TO MONTH MONTH Intervalos INTERVALE DAY TO SECOND INTERVAL DAY TO SECOND Booleanos y binarios BOOLEAN Booleanos (Lógicos) BOOL BIT Binarios BIT VARYING VARBIT(n) Datos de gran tamaño LONG (en desuso) CHARACTER LARGE OBJECT Texto largo CLOB CLOB RAW (en desuso) BINARY LARGE OBJECT LONG RAW (en desuso) Binarios BLOB BLOB BFILE .Descripción Tipos Estándar SQL Oracle SQL Números Enteros pequeños SMALLINT (2 bytes) INTEGER Enteros normales (4 bytes) INT BIGINT Enteros largos (en realidad no es estándar.d) DECIMAL(m.

conviene indicar suficiente espacio para almacenar los valores. El resto de detalles de este tipo son los mismos que los del tipo CHAR. todos los textos ocuparán 20 caracteres. Ejemplo: INSERT INTO Personas(cod_persona.nombre) VALUES (1. En el caso de los VARCHAR2. Por ejemplo. Oracle dispone de los siguientes tipos  VARCHAR2 . Es decir. no se malgasta espacio por poner más espacio del deseado ya que si el texto es más pequeño que el tamaño indicado. Para Oracle las palabras VARCHAR y VARCHAR2 son equivalentes.  NCHAR.  CHAR. Utilizado para textos de longitud variable. sean del tamaño que sean. Pero se aconseja utilizar VARCHAR2. A la hora de introducir valores de tipo texto.‘Juan Luis’). pero ahora pensando en el almacenamiento de caracteres de longitud variable. hay que tener en cuenta que los textos literales se entrecomillan en todas las instrucciones SQL.4. En todos estos tipo.1]textos Para almacenar texto. Cuando se indica VARCHAR2 como tipo. Oracle almacena primero el tamaño del texto y luego almacena el texto. el resto del espacio se ocupa: aunque también es conveniente ajustar ya que evita que se pueden introducir más caracteres de los necesarios en la base de datos. todos los ejemplos y explicaciones utilizarán los tipos de datos de Oracle [2. se debe de indicar también un número entre paréntesis que indicará el tamaño máximo del texto. Uno de los problemas en todas las bases de datos tiene que ver con la codificación del texto. como mucho puede indicar un tamaño de 2000 bytes. NCHAR usa la tabla Unicode. En este tipo. El tipo NCHAR permite utilizar un segundo juego de caracteres para poder almacenar textos usando la configuración regional de cada país. De hecho. para cada valor. De esa forma un texto corto ocupa en disco menos que un texto largo.Descripción Tipos Estándar SQL Oracle SQL Especiales Referencia a fila ROWID A partir de este punto. Actualmente es un tipo en desuso en cuanto Unicode (en su formato UTF-8 que Oracle llama AL32UTF8) se ha convertido en un estándar mundial. si hemos indicado como tipo CHAR(20). El tipo CHAR. A veces ocurre que la forma de codificar general de la base de datos usa una tabla de códigos concreta (por ejemplo la ISO-88591-1 o la propia de los sistemas de Windows conocida como WIN- 1252). Para textos de longitud fija. los valores siempre ocuparán el mismo tamaño. La idea es la misma que en el caso anterior. el tipo principal habitual hoy en día en los servidores Oracle Database es AL32UTF8.  NVARCHAR2. En las columnas que usen este tipo de datos. Se admiten textos que ocupen hasta 4000 bytes como máximo. .

99999999999 * 10128. además. [2.2]números En Oracle. En Oracle eso se soluciona mediante el operador q que permite indicar otro carácter delimitador del texto distinto de la comilla simple. se nos permite almacenar números decimales de forma exacta. Por ejemplo: q’[O’Hara]’ O’Hara es un texto que tiene dentro un apostrofe (es decir. se entrecomilla con comillas simples. Indicando este tipo. se muestran estos ejemplos: Formato Número escrito por el usuario Se almacena como… NUMBER 345255.345 345255. números de coma fija Son los números más utilizados en las bases de datos. una comilla simple).s) Donde p es la precisión máxima del número y s es la escala (número de decimales a la derecha de la coma). el tipo NUMBER es un tipo muy versátil que permite representar todo tipo de números.345 Da error de precisión . Si intentamos añadir un número fuera de este rango. Su desventaja es que ocupan más que los números de coma flotante y que. no puede contener ninguno de los nuevos delimitadores (es decir.345 NUMBER(9) 345255. Podría ocurrir que el propio texto literal requiera indicar comillas simples.345 345255. NUMBER (8. Puesto que es un texto. y entre comillas simples. evidentemente.4.0).345 345255 NUMBER(9. Su rango permite almacenar números de entre 10-130 y 9. precisión y escala La cuestión de la precisión y la escala es compleja.35 NUMBER(7) 345255. es el nombre de la persona que estamos añadiendo a la tabla Personas. por lo que los cálculos con ellos son más lentos (aunque más precisos). Tras el operador q.En el ejemplo anterior Juan Luis. no puede contener corchetes). Eso es equivalente a NUMBER(p. Para números enteros se indica NUMBER(p) donde p es el número de dígitos. Los decimales en Oracle se presenta con el punto y no con la coma. Para entenderla mejor. se indican los nuevos delimitadores del texto (en el ejemplo son los corchetes) y dentro de ellos el texto que.2) 345255. Los números decimales (números de coma fija) se indican mediante el formato: NUMBER(p. Por ejemplo. Oracle produciría un error.3) indica que se representan números de ocho cifras de precisión y tres decimales. Para números de coma flotante (equivalentes a los float o double de muchos lenguajes de programación) simplemente se indica el texto NUMBER sin precisión ni escala. las computadoras no saben operar con estos números de forma nativa.

enteros Oracle también permite almacenar números enteros. minuto y segundos. meses.NUMBER(9.2) 345255. Con lo que representa un instante concreto en el tiempo. números en coma flotante Se indican simplemente con la palabra NUMBER. pero que no almacenan los números con exactitud absoluta. mes y año. En este caso se indica la palabra NUMBER seguida del número máximo de cifras que podrán almacenarse. Por lo tanto hay que tener en cuenta que el formato en el que se muestran las fechas por pantalla cuando consultamos datos.-2) 345255. la precisión debe incluir todos los dígitos del número (puede llegar hasta 38 dígitos). los números en coma flotante permiten almacenar números decimales que se operan muy rápido por parte de las computadoras. sin indicar número alguno después. incluso con decimales para los segundos. es una conversión para que las personas entendamos las fechas.4. Sin embargo. pero si es negativa indica ceros a la izquierda del decimal.345 345300 NUMBER(7. La escala solo indica los decimales que se respetarán del número.’DD/MM/YYYY’) El resultado es la fecha que representa el 3 de mayo de 2007. Como se ha indicado anteriormente. minutos y segundos. hora. Internamente se almacenan de otra forma. que le siguen (separadas por el símbolo /) hasta dos cifras para el mes y finalmente 4 cifras para el año. día del mes. Es conveniente usar la función TO_DATE para representar datos TIMESTAMP: . junto con hora. minutos y segundos.345 Da error de precisión En definitiva. La expresión DD/MM/YYYY indica que estamos usando hasta dos cifras para el día. Las fechas no se pueden manipular directamente y se debe usar la función TO_DATE (que se detallará en temas posteriores) para pasar un texto que representa fechas a la fecha correspondiente. Por ejemplo NUMBER(8) permitiría almacenar números sin decimales de hasta ocho cifras. almacena valores de día. tipo TIMESTAMP Es una extensión del anterior. Ejemplo: TO_DATE(‘3/5/2007’. las personas representamos las fechas indicando años. [2. Tienen una precisión limitada. tipo DATE El tipo DATE permite almacenar fechas sin tener en cuenta las horas.3]fechas y horas almacenamiento de fechas y horas Las fechas y las horas en Oracle (como en otros sistemas) se almacenan internamente en un formato especial (realmente es un formato numérico). Oracle posee la función SYSDATE para obtener la fecha actual. Oracle posee cuatro tipos de datos relacionados con fechas.

serviría para indicar intervalos de días... minutos y segundos en el que se pueden usar hasta tres cifras para los días. intervalo INTERVAL DAY(3) TO SECOND(3). horas. ). ).. como mucho.. horas. Se crearía una tabla en la que una columna llamada intervalo. Para indicar intervalos (por ejemplo para añadir o modificar datos de intervalos) se debe utilizar la palabra INTERVAL. En este caso. Para indicar intervalos de este tipo al añadir o modificar datos.. A la hora de crear tablas. minutos y/o segundos.. intervalos Los intervalos no son fechas son duraciones de tiempo. años y meses.TO_DATE(‘2/2/2004 18:34:23’. Ejemplos de indicación de datos de intervalo son: /* 4 días 10 horas 12 minutos y 7 con 352 segundos */ INTERVAL ‘4 10:12:7.. se indica que en los intervalos se puede llegar hasta indicar hasta tres decimales en los segundos.. intervalo INTERVAL DAY(3) TO SECOND. podemos indicar la precisión de los días indicando un número tras la palabra DAY. minutos y segundos en una columna de tipo DATE. Ejemplos de uso para este tipo de intervalos son: /* 123 años y seis meses */ INTERVAL ‘123-6’ YEAR TO MONTH /* 123 años */ INTERVAL ‘123’ YEAR TO MONTH /* 6 meses */ INTERVAL ‘6’ MONTH TO MONTH INTERVAL DAY TO SECOND Representa intervalos de tiempo que expresa días.. solo se almacenará el año. se utiliza la misma palabra INTERVAL. Por ejemplo: CREATE TABLE (.. tipo INTERVAL YEAR TO MONTH Este tipo de datos almacena intervalos que abarcan. mes y día. También tras los segundos se pueden indicar números: CREATE TABLE (. Oracle posee dos tipos de intervalos: intervalos de tiempo grandes (años y meses) e intervalos pequeños de tiempo (desde segundos hasta días como mucho)...’DD/MM/YYYY HH24:MI:SS’) Si intentamos almacenar datos que contienen (además de la fecha) horas.352’ DAY TO SECOND(3) /* 4 días 10 horas 12 minutos */ INTERVAL ‘4 10:12’ DAY TO MINUTE /* 4 días 10 horas */ INTERVAL ‘4 10’ DAY TO HOUR /* 4 días*/ INTERVAL ‘4’ DAY /*10 horas*/ INTERVAL ‘10’ HOUR .

Son datos largos y desestructurados (no se desea sobre ellos ningún tipo de ordenación o ser usado como claves o restricciones del tipo que sea). Pero. La instrucción que realiza esta labor es CREATE DOMAIN. Sintaxis: CREATE DOMAIN name [AS] data_type [ DEFAULT expression ] [ restricciones [ ./*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.4]datos de gran tamaño Son tipos pensados para almacenar datos de tamaño muy grande.4. direccion Tdireccion ) . ] ] Ejemplo: CREATE DOMAIN Tdireccion AS VARCHAR(3).. [2. /*8 horas 7 minutos 6 segundos*/ INTERVAL ‘8:07:06’ HOUR TO SECOND. mediante funciones especiales (como BFILENAME. nombre VARCHAR(30). BFILE Sirve para almacenar datos binarios. en este caso.5]dominios En SQL estándar tenemos la posibilidad de crear dominios. Para ello se almacena la ruta a cada archivo. los datos binarios se almacenan en archivos externos a la base de datos. por ejemplo). CLOB Utilizado para almacenar textos.. En los BFILE hasta 8 GB. BLOB Utilizado para almacenar datos binarios. /*7 minutos 6 segundos*/ INTERVAL ‘7:06’ MINUTE TO SECOND. Gracias a esa instrucción podemos crear la siguiente tabla: CREATE TABLE personal( cod_pers SMALLINT. En los datos de tipo LOB (CLOB o BLOB) se admiten hasta 4GB de información en cada valor. normalmente dentro del servidor de base de datos. [2.4. Para almacenar datos binarios se requiere utilizar las librerías o interfaces especialmente dedicados a esta tarea de Oracle.

Es decir.5] consultar las tablas del usuario [2. contienen los metadatos de la base de datos. entre ellas la columna TABLE_CATALOG indica el catálogo en el que está la tabla.COLUMNS. diccionario de datos de Oracle Muchos SGBD respetan el estándar para consultar el diccionario de datos. la forma de consultar los metadatos debería ser la misma que utilizamos cuando consultamos los datos de una tabla. Este esquema contiene el conjunto de vistas que muestran los metadatos de la base de datos. en concreto la vista INFORMATION_SCHEMA. Es decir existen tablas (en realidad vistas) que en lugar de contener datos. el diccionario de datos es accesible mediante un esquema especial llamado INFORMATION_SCHEMA.5.En el caso de Oracle se puede utilizar la instrucción CREATE TYPE. En el caso de SQL estándar.TABLES obtiene una vista de las tablas creadas. Oracle utiliza diversas vistas para mostrar las tablas de la base de datos y estas vistas están accesibles desde cualquier esquema. Pero Oracle no. lanzaremos la instrucción: SELECT * FROM USER_TABLES. . TABLE_SCHEMA el esquema en el que está la tabla y TABLE_NAME el nombre de la tabla. que mostrará una lista de todas las tablas de la base de datos a las que tenemos permiso de acceso. Finalmente DBA_TABLES es una tabla que contiene absolutamente todas las tablas del sistema Evidentemente.1]consultar el diccionario de datos diccionario de datos en SQL estándar Todas las bases de datos disponen de posibilidades para consultar el diccionario de datos. Otra vista interesante es ALL_TABLES. Solo necesitamos disponer de los permisos suficientes para consultar dichas vistas. Así la vista USER_TABLES contiene una lista de las tablas del usuario actual. Esta vista obtiene numerosas columnas.TABLES Muestra una tabla con diversas columnas. aunque no es sinónimo de ésta. Por lo tanto si deseamos consultar qué tablas posee nuestro usuario. en concreto la columna TABLES_NAME muestra el nombre de cada tabla y OWNER el propietario (o esquema) de la misma. Así. sean del usuario que sean. esta vista solo está disponible para usuarios administradores (DBA). Siguiendo las reglas de Codd. la instrucción: SELECT * FROM INFORMATION_SCHEMA. De hecho CREATE TYPE es una instrucción objeto-relacional y permite crear tipos avanzados de datos (que no es lo mismo que un dominio). La información sobre las columnas de las tablas se consultan a través de INFORMATION_SCHEMA. [2.

No obstante existe en Oracle una posibilidad de recuperación mediante el comando FLASHBACK TABLE si se ha configurado la papelera de reciclaje en el sistema Oracle. Al borrar una tabla:  Desaparecen todos los datos  Cualquier vista y sinónimo referente a la tabla seguirá existiendo. Y aparecerán los campos de la tabla proveedores. [2.2]comando DESCRIBE El comando DESCRIBE.  Lógicamente.7] modificar tablas [2. en aquellas bases de datos que tengan la posibilidad de utilizar transacciones.6] borrar tablas La orden DROP TABLE seguida del nombre de una tabla. Esta instrucción no es parte del SQL estándar. La palabra PURGE hace que el borrado de la tabla sea irreversible porque la tabla no pasa a la papelera de reciclaje (por lo tanto hay que ser muy cuidadoso en el uso de esta opción). Ejemplo: DESCRIBE existencias. pero casi es considerada así ya que casi todos los SGBD la utilizan.7. Normalmente. [2. pero ya no funcionará (conviene eliminarlos)  Las transacciones pendientes son aceptadas (COMMIT). y no hay ninguna petición de confirmación. permite obtener la estructura de una tabla. Un ejemplo del resultado de la orden anterior (en Oracle) sería: Nombre ¿Nulo? Tipo N_ALMACEN NOT NULL NUMBER(2) TIPO NOT NULL VARCHAR2(2) MODELO NOT NULL NUMBER(2) CANTIDAD NUMBER(7) [2. la palabra PURGE. el borrado de una tabla es irreversible. Las vistas ALL_TAB_COLUMNS y DBA_TAB_COLUMNS muestran los datos de las columnas de las tablas de los otros usuarios (según lo explicado para ALL_TABLES y DBA_TABLES).1]cambiar de nombre a una tabla De forma estándar (SQL estándar) se hace: . por lo que conviene ser muy cuidadoso con esta operación. solo se pueden eliminar las tablas sobre las que tenemos permiso de borrado. Ejemplo: DROP TABLE personas PURGE.5. permite eliminar la tabla en cuestión.Para consultar las columnas de las tablas. Oracle posee una vista llamada USER_TAB_COLUMNS que permite consultar todas las columnas de las tablas del esquema actual. Por ello el comando DROP TABLE permite usar. al final .

TRUNCATE hace que se elimine el contenido de la tabla. Pero por coherencia es mejor hacerlo de la primera forma (la del estándar).. se realiza mediante la orden RENAME (que permite el cambio de nombre de cualquier objeto).7. Ejemplo de borrado de columna: ALTER TABLE facturas DROP (fecha). Elimina la columna indicada de manera irreversible. no admite borrar solo una parte de una tabla.. Ejemplo: ALTER TABLE facturas ADD (fecha DATE). Se deben indicar su tipo de datos y sus propiedades si es necesario (al estilo de CREATE TABLE). pero no la estructura en sí.]).7.. [2. Muchas bases de datos (pero no Oracle) requieren escribir la palabra COLUMN tras la palabra ADD. Aunque solo elimina datos.columnaSiguiente. [2... No se puede eliminar una columna si es la única columna que queda en la tabla. A esta orden le sigue el nombre de la tabla a borrar.4]borrar columnas ALTER TABLE nombreTabla DROP(columna [. En ese caso. Incluso borra del archivo de datos el espacio ocupado por la tabla. Las nuevas columnas se añaden al final. [2. .3]añadir columnas Sintaxis: ALTER TABLE nombreTabla ADD(nombreColumna TipoDatos [Propiedades] [. Sintaxis: RENAME nombreViejo TO nombreNuevo.2]borrar contenido de tablas Oracle dispone de una orden no estándar para eliminar definitivamente los datos de una tabla es la orden TRUNCATE. (habrá que usar el comando DROP TABLE. En Oracle. no se puede indicar otra posición (hay que recordar que el orden de las columnas no importa).ALTER TABLE nombreViejo RENAME TO nombreNuevo.columnaSiguiente tipoDatos [propiedades].7. además de con la orden anterior. se trata de una instrucción DDL (luego no es revocable) y es incondicional: es decir.) Permite añadir nuevas columnas a la tabla.

. Se puede poner esta propiedad durante la creación o modificación de la tabla. o todos los valores existentes tienen un tamaño menor o igual a la nueva anchura.] Los cambios que se permiten en las columnas son (en Oracle):  Incrementar precisión o anchura de los tipos de datos  Solo se puede reducir la anchura si la anchura máxima de un campo si esa columna posee nulos en todos los registros.7. [2. precio NUMBER(11.7]valor por defecto A cada columna se le puede asignar un valor por defecto durante su creación mediante la propiedad DEFAULT. modificamos el valor de la propiedad DEFAULT de una tabla. [2. Ejemplo: ALTER TABLE facturas MODIFY(fecha TIMESTAMP)..7. Sintaxis ALTER TABLE nombreTabla RENAME COLUMN nombreAntiguo TO nombreNuevo Ejemplo: ALTER TABLE facturas RENAME COLUMN fecha TO fechaYhora.6]renombrar columna Esto permite cambiar el nombre de una columna. Por ejemplo: ALTER TABLE facturas ALTER COLUMN fecha TIMESTAMP. [2. nombre VARCHAR2(25). Sintaxis: ALTER TABLE nombreTabla MODIFY(columna tipo [propiedades] [columnaSiguiente tipo [propiedades] . Ejemplo: CREATE TABLE articulo (cod NUMBER(7).  Se puede pasar de CHAR a VARCHAR2 y viceversa (si no se modifica la anchura)  Se puede pasar de DATE a TIMESTAMP y viceversa  Cualquier otro cambio solo es posible si la tabla está vacía  Si..2) DEFAULT 3.7. en SQL estándar se puede escribir el texto COLUMN tras la palabra DROP.5]modificar columnas Permite cambiar el tipo de datos y propiedades de una determinada columna. añadiendo la palabra DEFAULT tras el tipo de datos del campo y colocando detrás el valor que se desea por defecto.Al igual que en el caso anterior. a través de este comando.5). dicho cambio solo tendrá efecto en la inserción de nuevas filas. En el caso de SQL estándar en lugar de MODIFY se emplea ALTER (que además opcionalmente puede ir seguida de COLUMN).

En realidad hay dos maneras de poner restricciones:  Poner una restricción de columna. [2. columnas que estamos detectando que no se usan mucho.8. Finalmente podemos eliminar las columnas marcadas como sin uso.7. En ese caso la restricción se pone seguido a la definición de la columna. de esta forma: ALTER TABLE personas DROP UNUSED COLUMNS. impide la modificación y la eliminación de sus datos. . de esta forma: SELECT * FROM USER_UNUSED_COL_TABS. El valor indicado con DEFAULT se aplica cuando añadimos filas a una tabla dejando el valor de la columna vacío en lugar de NULL. se usa: ALTER TABLE nombreTabla READ WRITE. Sintaxis: . Las restricciones se pueden realizar cuando estamos creando (CREATE) o modificando (ALTER) una tabla. Dicho de otra forma.7. Para devolver la tabla a su estado normal. columna tipo [DEFAULT expresión] [CONSTRAINT nombre] tipo.. [2. Se pueden marcar así. Es decir. Ejemplo: ALTER TABLE personas SET UNUSED (n_seguridad_social). [2. no admite que se realice ninguna instrucción DML (tampoco la instrucción DROP TABLE) sobre ella.8] establecimiento de restricciones [2. a la columna se le asignará el valor por defecto indicado.9]modificación SET UNUSED Se trata de una modificación de tabla propia de Oracle mediante la cual marcamos una o más columnas de tabla con un marcador de falta de uso (UNUSED). Sintaxis: ALTER TABLE nombreTabla READ ONLY.1]definir restricciones Una restricción es una condición de obligado cumplimiento para una o más columnas de la tabla2..8]establecer tablas en modo solo lectura Se trata de una opción del comando ALTER TABLE que restringe una tabla para que solo admita operaciones de lectura (como por ejemplo la instrucción SELECT) sobre la tabla. Podemos consultar nuestras columnas marcadas como sin uso.La palabra DEFAULT se puede añadir durante la creación o la modificación de la tabla (comando ALTER TABLE).

[2. Una forma muy habitual es poner el nombre de la tabla seguida del tipo de la restricción y un número que indique el número de ese tipo de restricción en la tabla. NOT NULL.otras restricciones.. ya que el nombre asignado resultará críptico (Oracle usa el formato SYSCn donde n es un número diferente para cada restricción).  Poner una restricción de tabla. Una forma muy utilizada es incluir el nombre de la tabla. Desde la empresa Oracle se aconseja la siguiente regla a la hora de poner nombre a las restricciones:  Tres letras para el nombre de la tabla  Carácter de subrayado  Tres letras con la columna (o columnas) afectadas por la restricción  Carácter de subrayado  Dos letras con la abreviatura del tipo de restricción. UNIQUE o FK.] La diferencia está en que en el primer caso no se especifica la lista de columnas al definir la restricción: lógico porque se entiende perfectamente que las restricciones de columna se aplicarán a la columna en la que se definen. Por ejemplo si observamos este esquema . últimaColumna últimaDefinición. . La abreviatura puede ser: o NN. [CONSTRAINT nombre] tipo(listaColumnas) [. Esto último es mala idea. Lo malo es que. PRIMARY KEY o UK. o PK.. Por ello debemos de utilizar un protocolo que nos facilite obtener fácilmente el nombre de la restricción. en tablas complejas.. Por ejemplo pieza_id_pk podría indicar que el campo id de la tabla pieza tiene una clave principal (PRIMARY KEY). . La única restricción que no se puede definir de esta forma es la de tipo NOT NULL. El resto se harían siguiendo esta sintaxis: columna1 definición1.. el nombre se puede repetir y además. el nombre de la restricción podría ser alu_cod_pk.8.. incluso con este método.. Otra opción. no es tan fácil recordar el protocolo.. debemos de buscar nombres únicos. FOREIGN KEY o CK. Los nombres de restricción no se pueden repetir para el mismo esquema.2]nombre de las restricciones Es muy buena práctica asignar un nombre a cada restricción que implementemos.. En ese caso se ponen al final de la lista de columnas.. columna2 definición2.. es indicar las restricciones en el esquema lógico de la base de datos. menos compleja. De no hacerlo. CHECK (validación) Por ejemplo para hacer que la clave principal de la tabla Alumnos sea el código del alumno. Es mejor poner un nombre nosotros para que sea más fácil de recordar. los campos involucrados y el tipo de restricción en el nombre de la misma. será la propia base de datos la que asigne nombre a la restricción.

cod_pelicula NUMBER(5). La restricción NOT NULL es la única que solo se puede poner seguida al nombre de la columna a la que se aplica. Se puede colocar durante la creación (o modificación) del campo añadiendo la palabra NOT NULL tras el tipo: CREATE TABLE cliente( dni VARCHAR2(9) CONSTRAINT clientes_nn1 NOT NULL ).cod_pelicula) ). [2. Eso obliga a que la columna tenga que tener obligatoriamente un valor para que sea almacenado el registro.Podemos poner como nombre localidades_pk a la clave primaria de la tabla localidades y localidades_nn2 a la restricción NOT NULL sobre la columna n_provincia en esa misma tabla. [2. En este caso es imprescindible tener muy bien documento el esquema relacional. CONSTRAINT alquiler_uk UNIQUE(dni. La razón es que NOT NULL solo se puede aplicar a una columna a la vez. .4]valores únicos Las restricciones de tipo UNIQUE obligan a que el contenido de una o más columnas no puedan repetir valores en distintas filas. la forma sería: CREATE TABLE alquiler( dni VARCHAR2(9). Si la repetición de valores se refiere a varios campos. Ejemplo: CREATE TABLE cliente( dni VARCHAR2(9) CONSTRAINT clientes_nn1 UNIQUE ).8.8.3]prohibir nulos La restricción NOT NULL permite prohibir los nulos en una determinada tabla. Esta forma permite poner un nombre a la restricción.

La coma tras la definición del campo cod_pelicula hace que la restricción sea independiente de ese campo. tras UNIQUE se indique la lista de campos a los que se aplica la restricción. nombre VARCHAR(50) ). que se usa para acceder más rápidamente a estos datos. se puede obviar el nombre del campo: . Si la clave está formada por más de un campo: CREATE TABLE alquileres(dni VARCHAR(9). no podrán contener valores que no estén relacionados en la otra tabla. [2. Si la clave está formada por un solo campo basta con: CREATE TABLE clientes( dni VARCHAR(9) CONSTRAINT clientes_pk PRIMARY KEY.5]clave primaria La clave primaria de una tabla la forman las columnas que indican a cada registro de la misma.cod_pelicula) ). [2. Este es un ejemplo de indicación de clave foránea: CREATE TABLE alquileres( dni VARCHAR2(9) CONSTRAINT alquileres_fk1 REFERENCES clientes(dni). cod_pelicula NUMBER(5). CONSTRAINT alquileres_pk PRIMARY KEY(dni.cod_pelicula) ). Eso obliga a que.8. automáticamente Oracle crea un índice interno (lo que acelera las labores de búsqueda y ordenación sobre esas columnas). CONSTRAINT alquileres_pk PRIMARY KEY(dni. Además pasan a formar parte del índice principal de la tabla. Hay que recordar que las claves alternativas en las tablas relacionales deben llevar restricciones UNIQUE y NOT NULL. Sobre las columnas con restricciones UNIQUES. Significa esta instrucción (en cuanto a claves foráneas) que el campo dni se relaciona con la columna dni de la tabla clientes y el cod_película con la columna cod de la tabla películas. Incluso para un solo campo se puede colocar la restricción al final de la lista en lugar de definirlo a continuación del nombre y tipo de la columna. cod_pelicula NUMBER(5) CONSTRAINT alquileres_fk2 REFERENCES peliculas(cod).8. por lo tanto.6]clave secundaria o foránea Una clave secundaria o foránea se usa para indicar que uno o más campos de una tabla que están relacionados con la clave principal (o incluso con una clave candidata) de otra tabla y.sean NOT NULL (sin posibilidad de quedar vacíos) y que los valores de los campos sean de tipo UNIQUE (sin posibilidad de repetición). La clave primaria hace que los campos que la forman no puedan quedar vacíos ni repetir valores. Si el campo al que se hace referencia es la clave principal.

En el ejemplo anterior es absolutamente necesario (al no indicar explícitamente la lista de columnas en el apartado REFERENCES) que la clave principal de la tabla piezas a la que hace referencia la clave la formen las columnas tipo y modelo y en que estén en ese orden. ON UPDATE CASCADE. Tampoco podremos modificar su dni por la misma razón. hace falta colocar el texto FOREIGN KEY para indicar en qué campos se coloca la restricción de clave foránea. El dni es la clave de la tabla clientes.  ON DELETE CASCADE. Ejemplo: CREATE TABLE existencias( tipo CHAR2(9). Borra todas las filas relacionadas con aquella que hemos eliminado.cod_pelicula) ). Aunque cualquier restricción (sea de una sola columna o no). pues no podemos borrar una persona de la tabla de clientes que tenga alquileres. Así tendremos ON UPDATE DO NOTHING. CONSTRAINT existencias_pk PRIMARY KEY(tipo.modelo) REFERENCES piezas. n_almacen NUMBER(1) cantidad NUMBER(7). el orden de los campos debe de ser el mismo: aunque. Ante esto. Si la relación está formada por más de una columna. Estas políticas son palabras claves que se colocan tras la cláusula REFERENCES al añadir una restricción de tipo FOREIGN KEY. en la que no se pueden indicar datos en las claves secundarias que no existan en las claves principales relacionadas. disponemos de la posibilidad de aplicar políticas especiales. CONSTRAINT existencias_fk2 FOREIGN KEY(n_almacen) REFERENCES almacenes.n_almacen) ). Las restricciones de tipo FOREIGN KEY provocan una restricción de integridad referencial. Las mismas se pueden aplicar en el caso de modificar claves principales. debidos a sus efectos secundarios. Lo malo es que la integridad referencial provoca varios problemas. CONSTRAINT existencias_fk1 FOREIGN KEY(tipo.CREATE TABLE alquileres( dni VARCHAR2(9) CONSTRAINT alquileres_fk1 REFERENCES clientes. Coloca nulos en todas las claves secundarias relacionadas.  ON DELETE SET DEFAULT. cuando una relación la forman más de una columna. Si la definición de clave secundaria se pone al final. ON UPDATE SET NULL y ON UPDATE SET DEFAULT. De hecho.modelo. supongamos que relacionamos el alquiler de habitaciones en una tabla de alquileres con el dni de la persona que alquila. se puede indicar también al final. Por ejemplo. cod_pelicula NUMBER(5) CONSTRAINT alquileres_fk2 REFERENCES peliculas. en este caso. En este caso se entiende que los campos hacen referencia a las claves principales de las tablas. Así las políticas que dictan qué hacer cuando se borran datos principales relacionados con claves secundarias son:  ON DELETE SET NULL. Coloca en las filas relacionadas el valor por defecto de esa columna en la columna relacionada  ON DELETE NOTHING. es mejor indicar explícitamente el nombre. modelo NUMBER(3). No hace nada. Bien. se debe (como siempre ocurre en las restricciones de más de una columna) tras la lista de columnas de la tabla. CONSTRAINT alquileres_pk PRIMARY KEY(dni. .

Sin embargo. CONSTRAINT alquileres_fk1 FOREIGN KEY (dni) REFERENCES clientes(dni) ON DELETE SET NULL.7]restricciones de validación Son restricciones que dictan una condición que deben cumplir los contenidos de una columna. importe_max NUMBER(11. concepto VARCHAR2(40) NOT NULL. Ejemplo: CREATE TABLE ingresos( cod NUMBER(5) PRIMARY KEY. CONSTRAINT ingresos_ck1 CHECK (importe<importe_max) ). Oracle solo dispone de las políticas ON DELETE CASCADE y ON DELETE SET NULL. No posee. cod_pelicula NUMBER(5).cod_pelicula). sin comas). por tanto. Y por defecto aplica DO NOTHING tanto para borrar como para modificar claves primarias. concepto VARCHAR2(40) NOT NULL. [2. Ejemplo de establecimiento de borrado en cascada y de puesta a nullo: CREATE TABLE alquileres( dni VARCHAR(9). [2.8. CONSTRAINT alquileres_pk PRIMARY KEY(dni. CONSTRAINT alquileres_fk2 FOREIGN KEY (cod_pelicula) REFERENCES peliculas(cod) ON DELETE CASCADE ). ninguna acción para la modificación (ON UPDATE) de claves primarias.2) CONSTRAINT ingresos_ck1 CHECK (importe>0 AND importe<8000) ). importe NUMBER(11. importe NUMBER(11. hay que indicar (como siempre) la restricción tras la lista de columnas de la tabla. En ese caso se utiliza la siguiente sintaxis: . Una misma columna puede tener múltiples CHECKS en su definición (se pondrían varios CONSTRAINT seguidos.8. concepto VARCHAR2(40) NOT NULL.8]añadir restricciones a una tabla Es posible querer añadir restricciones tras haber creado la tabla. Para poder hacer referencia más de una columna dentro de una restricción CHECK. En este caso las restricciones CHECK prohíbe añadir datos cuyo importe no esté entre 0 y 8000.2).2). Aunque sería más cómodo de esta forma: CREATE TABLE ingresos( cod NUMBER(5) PRIMARY KEY.2) CONSTRAINT ingresos_ck1 CHECK (importe>0) CONSTRAINT ingresos_ck2 CHECK (importe<8000) ). importe NUMBER(11. CREATE TABLE ingresos( cod NUMBER(5) PRIMARY KEY.

También produce un error similar. esta instrucción: ALTER TABLE curso DROP PRIMARY KEY. titulo VARCHAR2(60). Tras esa definición de tabla. Más versátil. esta instrucción: . Si deseamos añadir una restricción NOT NULL se realiza mediante ALTER TABLE . Pero si indicamos CASCADE al eliminar la clave primaria. cod_siguientecurso CHAR(7).. Produce este error: ORA-02273: a esta clave única/primaria hacen referencia algunas claves ajenas Para evitar el error: ALTER TABLE curso DROP PRIMARY KEY CASCADE.9]borrar restricciones Sintaxis: ALTER TABLE tabla DROP {PRIMARY KEY | UNIQUE(listaColumnas) | CONSTRAINT nombreRestricción} [CASCADE] La opción PRIMARY KEY elimina una clave principal. no permitiría eliminar dicha restricción. todas las restricciones FOREIGN KEY relacionadas. la opción CONSTRAINT elimina la restricción cuyo nombre se indica.ALTER TABLE tabla ADD [CONSTRAINT nombre] tipoDeRestricción(columnas). fecha_fin DATE.8. MODIFY y luego indicando la restricción que queremos añadir. de otro modo. UNIQUE o FOREIGN KEY. Esa instrucción elimina la restricción de clave secundaria cursos_fk1 antes de eliminar la principal. también se eliminarán. CONSTRAINT cursos_fk1 FOREIGN KEY(cod_siguientecurso) REFERENCES curso ON DELETE SET NULL). [2. tipoRestricción es el texto CHECK. fecha_inicio DATE. Por ejemplo en: CREATE TABLE curso( cod_curso CHAR(7) PRIMARY KEY. no podemos eliminar una clave primaria que tiene claves secundarias relacionadas. La opción CASCADE hace que se eliminen en cascada las restricciones de integridad que dependen de la restricción eliminada y que. CONSTRAINT cursos_ck1 CHECK(fecha_fin>fecha_inicio). PRIMARY KEY. UNIQUE elimina la restricción de unicidad realizada sobre la lista de columnas indicadas. Es decir.

Esta vista permite identificar las restricciones colocadas por el usuario (ALL_CONSTRAINTS permite mostrar las restricciones de todos los usuarios. se eliminan las restricciones en las que la columna a borrar estaba implicada: ALTER TABLE curso DROP(fecha_inicio) CASCADE CONSTRAINTS.8. [2.10]activación y desactivación de restricciones desactivar restricciones A veces conviene temporalmente desactivar una restricción para saltarse las reglas que impone.ALTER TABLE curso DROP(fecha_inicio). activar restricciones Anula la desactivación: ALTER TABLE tabla ENABLE CONSTRAINT nombre. En esa vista aparece toda la información que el diccionario de datos posee sobre las restricciones.11]cambiar de nombre a las restricciones Para hacerlo se utiliza este comando: ALTER TABLE table RENAME CONSTRAINT nombreViejo TO nombreNuevo. se puede utilizar la vista del diccionario de datos USER_CONSTRAINTS. En ella tenemos las siguientes columnas interesantes: Columna Descripción OWNER Indica el nombre del usuario propietario de la tabla CONSTRAINT_NAME Nombre de la restricción . La sintaxis es (en Oracle): ALTER TABLE tabla DISABLE CONSTRAINT nombre [CASCADE].12]consultar restricciones en el diccionario de datos En el caso de Oracle. Solo se permite volver a activar si los valores de la tabla cumplen la restricción que se activa. [2. pero solo está permitida a los administradores).8..8. ERROR en línea 1: ORA-12991: se hace referencia a la columna en una restricción de multicolumna El error se debe a que no es posible borrar una columna que forma parte de la definición de una instrucción. Esta instrucción elimina la restricción de tipo CHECK en la que aparecía la fecha_inicio y así se puede eliminar la columna. [2. La solución es utilizar el sufijo CASCADE CONSTRAINT al eliminar la columna. Así. Si hubo desactivado en cascada. habrá que activar cada restricción individualmente. La opción CASCADE hace que se desactiven también las restricciones dependientes de la que se desactivó.

PRIMARY KEY  R.jorgesanchez. Una segunda restricción llamada pieza_fk está compuesta por tipo y modelo de la tabla existencias. 1 Se pueden obtener apuntes de administración de bases de datos Oracle en http://www. en la tabla USER_CONS_COLUMNS aparecerán dos entradas.Columna Descripción Tipo de restricción:  C.net/abd 2 Se pueden consultar las restricciones del modelo relacional en la dirección http://jorgesanchez. De tipo CHECK o NOT NULL CONSTRAINT_TYPE  P.html#h23 . Finalmente la restricción pieza_pk está formada por tipo y modelo. habría que acudir a la vista USER_COL_CONSTRAINTS. Así si hemos definido una clave primaria formada por los campos uno y dos. modelo y n_almacen) y en ese orden. Se indicará además el orden de aparición en la restricción. UNIQUE TABLE_NAME Nombre de la tabla en la que se encuentra la restricción En el diccionario de datos hay otra vista que proporciona información sobre restricciones. en dicha tabla se muestra información sobre las columnas que participan en una restricción. FOREIGN KEY  U. se trata de USER_CONS_COLUMNS. Ejemplo (resultado de la instrucción SELECT * FROM USER_CONS_COLUMNS): CONSTRAINT- OWNER TABLE-NAME COLUMN-NAME POSITION NAME 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 1 JORGE PIEZA_PK PIEZA MODELO 2 En los datos anteriores. Esta clave está formada por las columnas (tipo.net/manuales/gbd/modelo-relacional. una para el primer campo del índice y otra para el segundo. resultado de un SELECT sobre la vista USER_CONS_COLUMNS aparece una restricción de clave primaria sobre la tabla existencias. columnas de la tabla pieza. Para saber de qué tipo son esas restricciones.