Vous êtes sur la page 1sur 27

Introduccin al lenguaje SQL

[1.1] notas previas


[1.1.1]versin de SQL

La pretensin de estos apuntes es la de ser gua para el aprendizaje del lenguaje SQL. Aunque SQL posee un
estndar 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 versin 11g R2 del sistema Oracle Database.
Aunque en algunos apartados se hacen ciertos comentarios sobre las diferencias sobre el SQL estndar
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 fcil aprender cualquier otro dialecto de SQL y tambin el estndar y esa
es para m la razn fundamental para elegir Oracle como sistema de aprendizaje de SQL.

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

La razn de utilizar Oracle como base de trabajo se debe a su respeto por SQL estndar, aunque, desde
luego, lejos del estricto respeto del estndar de otros sistemas (por ejemplo el que hace el sistema
PostgreSQL) y porque Oracle sigue siendo el Sistema Gestor de Bases de Datos (SGBD) ms 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 prrafos sombreados con el reborde
de color marrn.

Ejemplo:

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


FROM tabla;

Otras veces se describen cdigos de ejemplo de un comando. Los ejemplos se escriben tambin con fondo
naranja claro, pero sin el reborde. Ejemplo:

SELECT nombre FROM cliente;

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

Para indicar la sintaxis de un comando se usan smbolos especiales. Los smbolos que utiliza este libro (de
acuerdo con la sintaxis que se utiliza normalmente en cualquier documentacin 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 maysculas o
minsculas).
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.
smbolos. Los smbolos 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
instruccin. Es decir, para indicar una parte opcional de la instruccin.
| (barra vertical). Este smbolo (|), la barra vertical, indica opcin. Cuando hay diferentes palabras o
secciones en la instruccin 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 seccin 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 opcin, pero es obligatorio elegir una. Ejemplo:

SELECT { * | columna | expresin }


FROM tabla;

El ejemplo anterior indicara que se debe elegir obligatoriamente el asterisco o un nombre de


columna o una expresin. Si las llaves del ejemplo fueran corchetes, entonces indicaran que incluso
podra no aparecer ninguna opcin.
[1.2] introduccin a SQL
[1.2.1]objetivos

SQL es el lenguaje fundamental de los SGBD relacionales. Se trata de uno de los lenguajes ms utilizados
de la historia de la informtica y sigue siendo de aprendizaje casi obligatorio para cualquier profesional
relacionado con la computacin.

SQL es un lenguaje declarativo, lo que implica que se centra en definir qu se desea hacer, por encima de
cmo hacerlo (que es la forma de trabajar de los lenguajes de programacin de aplicaciones como C o
Java). La razn de este matiz, es que los lenguajes declarativos se parecen ms al lenguaje natural humano y
parecen ms 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 instruccin sobre la misma. En sistemas gestores como Oracle esta regla se cumple
completamente: toda la gestin y administracin 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 dictara 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 Standard English Query Language (Lenguaje Estndar Ingls para Consultas) al que se le llam
SEQUEL. Ms adelante se le asignaron las siglas SQL (Standard Query Language, lenguaje estndar de
consulta) aunque en ingls se siguen pronunciando secuel. En espaol se pronuncia esecuele.

En 1979 Oracle presenta la primera implementacin comercial del lenguaje. Poco despus se converta en un
estndar en el mundo de las bases de datos avalado por los organismos ISO y ANSI. En el ao 1986 se toma
como lenguaje estndar por ANSI de los SGBD relacionales. Un ao despus lo adopta ISO, lo que
convierte a SQL en estndar mundial como lenguaje de bases de datos relacionales.

En 1989 aparece el estndar ISO (y ANSI) llamado SQL89 o SQL1. En 1992 aparece la nueva versin
estndar de SQL (a da de hoy sigue siendo la ms conocida) llamada SQL92. En 1999 se aprueba un nuevo
SQL estndar que incorpora mejoras que incluyen triggers, procedimientos, funciones, y otras
caractersticas de las bases de datos objeto-relacionales; dicho estndar se conoce como SQL99 o SQL2000.

Tras ese estndar, se publicaron nuevos estndares en los aos 2003, 2006, 2008 y 2011. Por lo tanto, el
ltimo estndar es el del ao 2011 (SQL2011). Pero la mayora de las mejoras aadidas en los ltimos
estndares se refieren al uso de otros lenguajes (especialmente los referentes a XML) con el propio SQL o a
la incorporacin de elementos orientados a objetos.

[1.2.3]funcionamiento

componentes de un entorno de ejecucin SQL

Segn la normativa ANSI/ISO cuando se ejecuta SQL, existen los siguientes elementos a tener en cuenta en
todo el entorno involucrado en la ejecucin de instrucciones SQL:

Un agente SQL. Entendido como cualquier elemento que cause la ejecucin de instrucciones SQL
que sern recibidas por un cliente SQL. Puede ser el software que utiliza el cliente, sobre el que se
realiza una accin que requiere enviar cdigo SQL al servidor de bases de datos.
Una implementacin SQL. Se trata de el software encargado de procesar, enviar y recibir
instrucciones SQL. Una implementacin est compuesta por:
o Un cliente SQL. 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. Es decir, la
comunicacin entre el agente y el servidor SQL debe de pasar por este elemento, que se
encarga de enviar las instrucciones SQL correspondientes a la accin del usuario y de recibir
los resultados del servidor.
o Un servidor SQL (puede haber varios). Software encargado de procesar las instrucciones
SQL y de enviar los resultados al cliente.

En el caso de Oracle al cliente SQL se le suele llamar proceso de usuario y al servidor SQL, proceso
servidor.

modos de ejecucin SQL. tipos de agentes SQL

ejecucin directa. SQL interactivo

Las instrucciones SQL se introducen directamente en el software del cliente. Las instrucciones se traducen
sin intermediarios, pasan tal cual al servidor SQL.

Normalmente es un modo de trabajo incmodo, pero permite tener acceso a todas las capacidades del
lenguaje SQL de la base de datos a la que estamos conectados. Es la forma habitual en la que trabajan los
administradores y muchos desarrolladores y operadores.

ejecucin incrustada o embebida

Las instrucciones SQL se colocan como parte del cdigo de otro lenguaje que se considera anfitrin (C,
Java, Pascal, Visual Basic,...). El cdigo anfitrin se debe de compilar o interpretar mediante software
adecuado, el cual detectar el cdigo SQL y podr lanzarle hacia el servidor SQL a travs de una interfaz
especial, como JDBC u ODBC por ejemplo.

ejecucin a travs de clientes grficos


Se trata de software que permite conectar a la base de datos a travs de un software que permite abstraerse
del lenguaje SQL. El software permite manejar de forma grfica 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
grfica para un manejo ms cmodo

ejecucin dinmica

Se trata de SQL almacenado en procedimientos y funciones que se almacenan junto con la base de datos.
Cuando se invoca a estos procedimientos y funciones, el cdigo que contienen se ejecuta en el servidor.

[1.2.4]proceso de las instrucciones SQL

Normalmente, el proceso de una instruccin SQL consta de estos pasos:

[1]Se analiza la instruccin. Para comprobar la sintaxis de la misma

[2]Si es correcta se valora si los metadatos de la misma son correctos. Se comprueba esto en el diccionario
de datos.

[3]Si es correcta, se optimiza, a fin de consumir los mnimos recursos posibles.

[4]Se ejecuta la sentencia y se muestra el resultado al emisor de la misma.

[1.3] elementos del lenguaje SQL


[1.3.1]cdigo SQL

El cdigo SQL consta de los siguientes elementos:

Comandos. Son las distintas instrucciones que se pueden realizar desde SQL
o DDL, Data Definition Language (Lenguaje de definicin de datos). Lo forman los
comandos que permiten modificar la estructura de la base de datos. Ms claramente, son los
comandos que modifican los metadatos. Lo forman las instrucciones CREATE, ALTER,
DROP, RENAME y TRUNCATE.
o Con estos comandos se crean, por ejemplo, tablas (CREATE TABLE), usuarios (CREATE
USER), vistas (CREATE VIEW), etc. Otros comandos permiten modificar (ALTER) y borrar
(DROP) estos elementos.
o DCL, Data Control Language (Lenguaje de control de datos). Administran los derechos y
restricciones de los usuarios. Lo forman las instrucciones GRANT y REVOKE.
o DML, Data Manipulation Language (Lenguaje de manipulacin de datos). Lo forman los
comandos que modifican filas (y por lo tanto datos) de las tablas. Lo forman las instrucciones
INSERT, UPDATE, MERGE y DELETE.
o SELECT. Se trata del comando que permite realizar consultas sobre los datos de la base de
datos. Aunque esta operacin forma parte de la funcin de manipulacin (y por lo tanto del
lenguaje DML) , es tan importante que, en la actualidad, se le asocia toda una funcin: la
funcin de consulta. Por ello, se entiende que forma parte del lenguaje DQL (Data Query
Language, Lenguaje de consulta de datos).
o Instrucciones de control de transacciones (DTL). Aunque, tambin, son parte del lenguaje
DML, son tan importantes que se las considera que forman un lenguaje aparte. Las
transacciones se controlan con las instrucciones ROLLBACK y COMMIT (Oracle aade
tambin el comando SAVEPOINT).
Clusulas. Son palabras especiales que permiten modificar el funcionamiento de un comando.
Ejemplos: WHERE, ORDER BY, etc.
Operadores. Permiten crear expresiones complejas. Pueden ser aritmticos (+,-,*,/,...) o lgicos (>,
<, !=,<>, AND, OR,...)
Funciones. Son elementos que reciben parmetros y devuelven resultados que facilitan crear
instrucciones complejas. Ejemplos: SUM(), SYSDATE, etc.
Literales. Valores concretos para las consultas: nmeros, textos, caracteres,... Ejemplos: 2, 12.34,
Avda Cardenal Cisneros
Metadatos. Es informacin de la estructura de la base de datos. Por ejemplo: nombres de tablas,
nombres de columnas, etc.

[1.3.2]normas de escritura

En SQL no se distingue entre maysculas y minsculas (salvo en los textos literales; es decir, en los
datos).
Las instrucciones finalizan con el signo de punto y coma
Cualquier comando SQL (SELECT, INSERT,...) puede ser partidos por espacios o saltos de lnea
antes de finalizar la instruccin. Se usa para mejorar la legibilidad de las instrucciones.

Tambin se pueden tabular lneas para facilitar la lectura si fuera necesario.

Lo que no podemos es partir en varias lneas una palabra.

Los comentarios en el cdigo SQL comienzan por /* y terminan por */ (excepto en algunos SGBD).
En Oracle, como en otros sistemas, existe tambin el comentario de una lnea mediante los smbolos
--:

/*
Comentario
que ocupa varias
lneas */
--Comentario de una lnea
SELECT * FROM personas; --Instruccin
DDL. Creacin de tablas
[2.1] introduccin al lenguaje DDL
El DDL es la parte del lenguaje SQL que realiza la funcin de definicin de datos del SGBD.
Fundamentalmente, se encarga de la creacin, modificacin y eliminacin de los objetos de la base de datos
(es decir de los metadatos). Por supuesto es el encargado de la creacin de las tablas.

Los elementos, llamados objetos, de la base de datos: tablas, vistas, columnas, ndices, se almacenan en el
diccionario de datos. Por otro lado, muchos Sistemas Gestores de Bases de Datos aportan elementos para
organizar estos objetos (como catlogos y esquemas).

Los objetos son manipulados y creados por los usuarios. En principio solo los administradores y los usuarios
propietarios pueden acceder a cada objeto, salvo que se modifiquen los privilegios del objeto para permitir el
acceso a otros usuarios.

Hay que tener en cuenta que ninguna instruccin DDL puede ser anulada por una instruccin
ROLLBACK (la instruccin ROLLBACK est relacionada con el uso de transacciones, que se comentarn
ms adelante) por lo que hay que tener mucha precaucin a la hora de utilizarlas. Es decir, las instrucciones
DDL generan acciones que no se pueden deshacer. Salvo que dispongamos de alguna copia de seguridad o
de otros elementos de recuperacin.

[2.2] creacin de bases de datos


Esta es una tarea administrativa que se comentar ms 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 utilizarn
para la misma, adems de otras indicaciones tcnicas y administrativas que no se comentarn en este tema.

Lgicamente solo es posible crear una base de datos si se tienen privilegios de DBA (DataBase
Administrator).

El comando SQL de creacin de una base de datos es CREATE DATABASE. Este comando crea una base
de datos con el nombre que se indique. Ejemplo:

CREATE DATABASE prueba;

En muchos sistemas eso basta para crear la bases de datos.

En el caso de Oracle necesitamos indicar muchos ms parmetros.

Ejemplo:

CREATE DATABASE prueba

LOGFILE prueba.log
MAXLOGFILES 25
MAXINSTANCES 10
ARCHIVELOG
CHARACTER SET WIN1214
NATIONAL CHARACTER SET AL32UTF8
DATAFILE prueba1.dbf AUTOEXTEND ON MAXSIZE 500MB;

El proceso de creacin de bases de datos en Oracle es muy complejo y no se ver en estos apuntes1.
[2.2.1]objetos de la base de datos

Segn los estndares actuales, una base de datos es un conjunto de objetos pensados para gestionar datos.
Estos objetos estn contenidos en esquemas, los esquemas suelen estar asociados al perfil de un usuario en
particular.

En SQL estndar, existe el concepto de catlogo, que sirve para almacenar esquemas, y estos sirven para
almacenar objetos. As el nombre completo de un objeto vendra dado por:

catlogo.esquema.objeto

Es decir, los objetos pertenecen a esquemas y estos a catlogos.

En casi todos los sistemas de bases de datos hay un catlogo por defecto, de modo que si no se indica
catlogo alguno al crear objetos, estos se almacenan all. Del mismo modo, hay esquemas por defecto.

Oracle no posee catlogos. Sin embargo s existen esquemas. Los esquemas de Oracle estn relacionados
con los usuarios: cada usuario posee un esquema (con el mismo nombre que el usuario) pensado para
almacenar sus objetos. Aunque podemos almacenar (si tenemos permisos para ello) objetos en otros
esquemas, nuestros objetos (tablas, vistas, etc.) estarn normalmente en nuestro esquema.

[2.3] creacin de tablas


[2.3.1]nombre de las tablas

Deben cumplir las siguientes reglas (se comentan las reglas de Oracle, en otros SGBD podran cambiar):

Deben comenzar con una letra


No deben tener ms de 30 caracteres
Solo se permiten utilizar letras del alfabeto (ingls), nmeros o el signo de subrayado (tambin los
signos $ y #, pero esos se utilizan de manera especial, por lo que no son recomendados)
No puede haber dos tablas con el mismo nombre dentro del mismo esquema (pueden coincidir los
nombres si estn 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), entonces se suele entrecomillar con comillas dobles. En el estndar SQL 99
(respetado por Oracle) se pueden utilizar comillas dobles al poner el nombre de la tabla a fin de
hacerla sensible a las maysculas (se diferenciar entre FACTURAS y Facturas)

Nota: Estas son tambin las propiedades que debe cumplir cualquier nombre de objeto en una base de datos
(nombres de vistas, columnas, restricciones,)

[2.3.2]comando CREATE TABLE

Es la orden SQL que permite crear una tabla. Por defecto ser almacenada en el espacio y esquema del
usuario que crea la tabla. Sintaxis:

CREATE TABLE [esquema.] nombreDeTabla (


nombreDeLaColumna1 tipoDeDatos [DEFAULT valor]
[restricciones] [, ...]
);

Ejemplo:
CREATE TABLE proveedores (nombre VARCHAR(25));

Crea una tabla con un solo campo de tipo VARCHAR.

Solo 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 grabar tablas en ese otro esquema), se antepone al
nombre de la tabla , el nombre del esquema:

CREATE TABLE otroUsuario.proveedores (


nombre VARCHAR(25)
);

Se puede indicar un valor por defecto para el atributo mediante la clusula DEFAULT.

Ejemplo:

CREATE TABLE Proveedores (


nombre VARCHAR(25),
localidad VARCHAR(30) DEFAULT Palencia
);

De este modo si aadimos un proveedor y no indicamos localidad, se tomar Palencia como localidad de
dicho Proveedor.

Podemos utilizar DEFAULT y usar funciones del sistema. Por ejemplo:

CREATE TABLE Prestamos(


id_prestamo NUMBER(8),
fecha_prestamo DATE DEFAULT SYSDATE
);

[2.4] tipos de datos


A la hora de crear tablas, hay que indicar el tipo de datos de cada campo. Necesitamos pues conocer los
distintos tipos de datos. Estos son:

Descripcin Tipos Estndar 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)
Descripcin Tipos Estndar SQL Oracle SQL
Nmeros
Enteros pequeos
SMALLINT
(2 bytes)
INTEGER
Enteros normales
(4 bytes)
INT
BIGINT
Enteros largos
(en realidad no es estndar, pero es muy
(8 bytes)
utilizado en muchas bases de datos)
Enteros
NUMBER(n)
precisin decimal
FLOAT

DOUBLE
Decimal de coma variable NUMBER
DOUBLE PRECISSION

REAL
NUMERIC(m,d)
Decimal de coma fija NUMBER(m,d)
DECIMAL(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 (Lgicos)
BOOL
BIT

Binarios BIT VARYING

VARBIT(n)
Datos de gran tamao
LONG (en desuso)
CHARACTER LARGE OBJECT
Texto largo
CLOB
CLOB
RAW (en desuso)

BINARY LARGE OBJECT LONG RAW (en desuso)


Binarios
BLOB BLOB

BFILE
Descripcin Tipos Estndar SQL Oracle SQL
Especiales
Referencia a fila ROWID
A partir de este punto, todos los ejemplos y explicaciones utilizarn los tipos de datos de Oracle

[2.4.1]textos

Para almacenar texto, Oracle dispone de los siguientes tipos

VARCHAR2 . Utilizado para textos de longitud variable. En este tipo, para cada valor, Oracle
almacena primero el tamao del texto y luego almacena el texto. De esa forma un texto corto ocupa
en disco menos que un texto largo.

Cuando se indica VARCHAR2 como tipo, se debe de indicar tambin un nmero entre parntesis
que indicar el tamao mximo del texto.

Para Oracle las palabras VARCHAR y VARCHAR2 son equivalentes. Pero se aconseja utilizar
VARCHAR2.

Se admiten textos que ocupen hasta 4000 bytes como mximo.

CHAR. Para textos de longitud fija. En las columnas que usen este tipo de datos, los valores siempre
ocuparn el mismo tamao. Por ejemplo, si hemos indicado como tipo CHAR(20), todos los textos
ocuparn 20 caracteres, sean del tamao que sean.

El tipo CHAR, como mucho puede indicar un tamao de 2000 bytes.

NCHAR. Uno de los problemas en todas las bases de datos tiene que ver con la codificacin del
texto. A veces ocurre que la forma de codificar general de la base de datos usa una tabla de cdigos
concreta (por ejemplo la ISO-88591-1 o la propia de los sistemas de Windows conocida como WIN-
1252).

El tipo NCHAR permite utilizar un segundo juego de caracteres para poder almacenar textos usando
la configuracin regional de cada pas. De hecho, NCHAR usa la tabla Unicode.

Actualmente es un tipo en desuso en cuanto Unicode (en su formato UTF-8 que Oracle llama
AL32UTF8) se ha convertido en un estndar mundial. Es decir, el tipo principal habitual hoy en da
en los servidores Oracle Database es AL32UTF8.

El resto de detalles de este tipo son los mismos que los del tipo CHAR.

NVARCHAR2. La idea es la misma que en el caso anterior, pero ahora pensando en el


almacenamiento de caracteres de longitud variable.

En todos estos tipo, conviene indicar suficiente espacio para almacenar los valores. En el caso de los
VARCHAR2, no se malgasta espacio por poner ms espacio del deseado ya que si el texto es ms pequeo
que el tamao indicado, el resto del espacio se ocupa: aunque tambin es conveniente ajustar ya que evita
que se pueden introducir ms caracteres de los necesarios en la base de datos.

A la hora de introducir valores de tipo texto, hay que tener en cuenta que los textos literales se entrecomillan
en todas las instrucciones SQL. Ejemplo:

INSERT INTO Personas(cod_persona,nombre)


VALUES (1,Juan Luis);
En el ejemplo anterior Juan Luis, es el nombre de la persona que estamos aadiendo a la tabla Personas.
Puesto que es un texto, se entrecomilla con comillas simples.

Podra ocurrir que el propio texto literal requiera indicar comillas simples. En Oracle eso se soluciona
mediante el operador q que permite indicar otro carcter delimitador del texto distinto de la comilla simple.
Por ejemplo:

q[OHara]

OHara es un texto que tiene dentro un apostrofe (es decir, una comilla simple). Tras el operador q, y entre
comillas simples, se indican los nuevos delimitadores del texto (en el ejemplo son los corchetes) y dentro de
ellos el texto que, evidentemente, no puede contener ninguno de los nuevos delimitadores (es decir, no
puede contener corchetes).

[2.4.2]nmeros

En Oracle, el tipo NUMBER es un tipo muy verstil que permite representar todo tipo de nmeros.

Su rango permite almacenar nmeros de entre 10-130 y 9,99999999999 * 10128. Si intentamos aadir un
nmero fuera de este rango, Oracle producira un error.

nmeros de coma fija

Son los nmeros ms utilizados en las bases de datos. Indicando este tipo, se nos permite almacenar
nmeros decimales de forma exacta,

Su desventaja es que ocupan ms que los nmeros de coma flotante y que, adems, las computadoras no
saben operar con estos nmeros de forma nativa, por lo que los clculos con ellos son ms lentos (aunque
ms precisos).

Los nmeros decimales (nmeros de coma fija) se indican mediante el formato:

NUMBER(p,s)

Donde p es la precisin mxima del nmero y s 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 de precisin y tres
decimales. Los decimales en Oracle se presenta con el punto y no con la coma.

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

Para nmeros de coma flotante (equivalentes a los float o double de muchos lenguajes de programacin)
simplemente se indica el texto NUMBER sin precisin ni escala.

precisin y escala

La cuestin de la precisin y la escala es compleja. Para entenderla mejor, se muestran estos ejemplos:

Formato Nmero escrito por el usuario Se almacena como


NUMBER 345255.345 345255.345
NUMBER(9) 345255.345 345255
NUMBER(9,2) 345255.345 345255.35
NUMBER(7) 345255.345 Da error de precisin
NUMBER(9,-2) 345255.345 345300
NUMBER(7,2) 345255.345 Da error de precisin

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

enteros

Oracle tambin permite almacenar nmeros enteros. En este caso se indica la palabra NUMBER seguida del
nmero mximo de cifras que podrn almacenarse. Por ejemplo NUMBER(8) permitira almacenar nmeros
sin decimales de hasta ocho cifras.

nmeros en coma flotante

Se indican simplemente con la palabra NUMBER, sin indicar nmero alguno despus. Como se ha indicado
anteriormente, los nmeros en coma flotante permiten almacenar nmeros decimales que se operan muy
rpido por parte de las computadoras, pero que no almacenan los nmeros con exactitud absoluta. Tienen
una precisin limitada.

[2.4.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 numrico). Sin embargo, las personas representamos las fechas indicando aos,
meses, da del mes, hora, minutos y segundos.

Por lo tanto hay que tener en cuenta que el formato en el que se muestran las fechas por pantalla cuando
consultamos datos, es una conversin para que las personas entendamos las fechas. Internamente se
almacenan de otra forma.

Oracle posee cuatro tipos de datos relacionados con fechas.

tipo DATE

El tipo DATE permite almacenar fechas sin tener en cuenta las horas, minutos y segundos. Oracle posee la
funcin SYSDATE para obtener la fecha actual.

Las fechas no se pueden manipular directamente y se debe usar la funcin TO_DATE (que se detallar en
temas posteriores) para pasar un texto que representa fechas a la fecha correspondiente. Ejemplo:

TO_DATE(3/5/2007,DD/MM/YYYY)

El resultado es la fecha que representa el 3 de mayo de 2007. La expresin DD/MM/YYYY indica que
estamos usando hasta dos cifras para el da, que le siguen (separadas por el smbolo /) hasta dos cifras para
el mes y finalmente 4 cifras para el ao.

tipo TIMESTAMP

Es una extensin del anterior, almacena valores de da, mes y ao, junto con hora, minuto y segundos,
incluso con decimales para los segundos. Con lo que representa un instante concreto en el tiempo.

Es conveniente usar la funcin TO_DATE para representar datos TIMESTAMP:


TO_DATE(2/2/2004 18:34:23,DD/MM/YYYY HH24:MI:SS)

Si intentamos almacenar datos que contienen (adems de la fecha) horas, minutos y segundos en una
columna de tipo DATE, solo se almacenar el ao, mes y da.

intervalos

Los intervalos no son fechas son duraciones de tiempo. Oracle posee dos tipos de intervalos: intervalos de
tiempo grandes (aos y meses) e intervalos pequeos de tiempo (desde segundos hasta das como mucho).

tipo INTERVAL YEAR TO MONTH

Este tipo de datos almacena intervalos que abarcan, como mucho, aos y meses.

Para indicar intervalos (por ejemplo para aadir o modificar datos de intervalos) se debe utilizar la palabra
INTERVAL. Ejemplos de uso para este tipo de intervalos son:

/* 123 aos y seis meses */


INTERVAL 123-6 YEAR TO MONTH
/* 123 aos */
INTERVAL 123 YEAR TO MONTH
/* 6 meses */
INTERVAL 6 MONTH TO MONTH

INTERVAL DAY TO SECOND

Representa intervalos de tiempo que expresa das, horas, minutos y/o segundos. A la hora de crear tablas,
podemos indicar la precisin de los das indicando un nmero tras la palabra DAY. Por ejemplo:

CREATE TABLE (....


intervalo INTERVAL DAY(3) TO SECOND,...
);

Se creara una tabla en la que una columna llamada intervalo, servira para indicar intervalos de das, horas,
minutos y segundos en el que se pueden usar hasta tres cifras para los das.

Tambin tras los segundos se pueden indicar nmeros:

CREATE TABLE (....


intervalo INTERVAL DAY(3) TO SECOND(3),...
);

En este caso, se indica que en los intervalos se puede llegar hasta indicar hasta tres decimales en los
segundos.

Para indicar intervalos de este tipo al aadir o modificar datos, se utiliza la misma palabra INTERVAL.
Ejemplos de indicacin de datos de intervalo son:

/* 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;

[2.4.4]datos de gran tamao

Son tipos pensados para almacenar datos de tamao muy grande. Son datos largos y desestructurados (no se
desea sobre ellos ningn tipo de ordenacin o ser usado como claves o restricciones del tipo que sea). En los
datos de tipo LOB (CLOB o BLOB) se admiten hasta 4GB de informacin en cada valor. En los BFILE
hasta 8 GB.

CLOB

Utilizado para almacenar textos.

BLOB

Utilizado para almacenar datos binarios. Para almacenar datos binarios se requiere utilizar las libreras o
interfaces especialmente dedicados a esta tarea de Oracle.

BFILE

Sirve para almacenar datos binarios. Pero, en este caso, los datos binarios se almacenan en archivos externos
a la base de datos, normalmente dentro del servidor de base de datos. Para ello se almacena la ruta a cada
archivo, mediante funciones especiales (como BFILENAME, por ejemplo).

[2.4.5]dominios

En SQL estndar tenemos la posibilidad de crear dominios. La instruccin que realiza esta labor es
CREATE DOMAIN. Sintaxis:

CREATE DOMAIN name [AS] data_type


[ DEFAULT expression ]
[ restricciones [ ... ] ]

Ejemplo:

CREATE DOMAIN Tdireccion AS VARCHAR(3);

Gracias a esa instruccin podemos crear la siguiente tabla:

CREATE TABLE personal(


cod_pers SMALLINT,
nombre VARCHAR(30),
direccion Tdireccion
)
En el caso de Oracle se puede utilizar la instruccin CREATE TYPE, aunque no es sinnimo de sta. De
hecho CREATE TYPE es una instruccin objeto-relacional y permite crear tipos avanzados de datos (que
no es lo mismo que un dominio).

[2.5] consultar las tablas del usuario


[2.5.1]consultar el diccionario de datos

diccionario de datos en SQL estndar

Todas las bases de datos disponen de posibilidades para consultar el diccionario de datos. Siguiendo las
reglas de Codd, la forma de consultar los metadatos debera ser la misma que utilizamos cuando
consultamos los datos de una tabla.

Es decir existen tablas (en realidad vistas) que en lugar de contener datos, contienen los metadatos de la
base de datos.

En el caso de SQL estndar, el diccionario de datos es accesible mediante un esquema especial llamado
INFORMATION_SCHEMA. Este esquema contiene el conjunto de vistas que muestran los metadatos de
la base de datos.

As, en concreto la vista INFORMATION_SCHEMA.TABLES obtiene una vista de las tablas creadas.

Es decir, la instruccin:

SELECT * FROM INFORMATION_SCHEMA.TABLES

Muestra una tabla con diversas columnas, entre ellas la columna TABLE_CATALOG indica el catlogo en
el que est la tabla, TABLE_SCHEMA el esquema en el que est la tabla y TABLE_NAME el nombre de
la tabla.

La informacin sobre las columnas de las tablas se consultan a travs de


INFORMATION_SCHEMA.COLUMNS.

diccionario de datos de Oracle

Muchos SGBD respetan el estndar para consultar el diccionario de datos. Pero Oracle no.

Oracle utiliza diversas vistas para mostrar las tablas de la base de datos y estas vistas estn accesibles desde
cualquier esquema. 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. Por lo tanto si deseamos
consultar qu tablas posee nuestro usuario, lanzaremos la instruccin:

SELECT * FROM USER_TABLES;

Esta vista obtiene numerosas columnas, en concreto la columna


TABLES_NAME muestra el nombre de cada tabla y OWNER el propietario (o esquema) de la misma.

Otra vista interesante es ALL_TABLES, que mostrar una lista de todas las tablas de la base de datos a las
que tenemos permiso de acceso, sean del usuario que sean.

Finalmente DBA_TABLES es una tabla que contiene absolutamente todas las tablas del sistema
Evidentemente, esta vista solo est disponible para usuarios administradores (DBA).
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. Las vistas ALL_TAB_COLUMNS y
DBA_TAB_COLUMNS muestran los datos de las columnas de las tablas de los otros usuarios (segn lo
explicado para ALL_TABLES y DBA_TABLES).

[2.5.2]comando DESCRIBE

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

DESCRIBE existencias;

Y aparecern los campos de la tabla proveedores. Esta instruccin no es parte del SQL estndar, pero casi es
considerada as ya que casi todos los SGBD la utilizan. Un ejemplo del resultado de la orden anterior (en
Oracle) sera:

Nombre Nulo? Tipo


N_ALMACEN NOT NULL NUMBER(2)
TIPO NOT NULL VARCHAR2(2)
MODELO NOT NULL NUMBER(2)
CANTIDAD NUMBER(7)

[2.6] borrar tablas


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

Al borrar una tabla:

Desaparecen todos los datos


Cualquier vista y sinnimo referente a la tabla seguir existiendo, pero ya no funcionar (conviene
eliminarlos)
Las transacciones pendientes son aceptadas (COMMIT), en aquellas bases de datos que tengan la
posibilidad de utilizar transacciones.
Lgicamente, solo se pueden eliminar las tablas sobre las que tenemos permiso de borrado.

Normalmente, el borrado de una tabla es irreversible, y no hay ninguna peticin de confirmacin, por lo
que conviene ser muy cuidadoso con esta operacin.

No obstante existe en Oracle una posibilidad de recuperacin mediante el comando FLASHBACK TABLE
si se ha configurado la papelera de reciclaje en el sistema Oracle. Por ello el comando DROP TABLE
permite usar, al final , la palabra PURGE. Ejemplo:

DROP TABLE personas PURGE;

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

[2.7] modificar tablas


[2.7.1]cambiar de nombre a una tabla

De forma estndar (SQL estndar) se hace:


ALTER TABLE nombreViejo RENAME TO nombreNuevo;

En Oracle, adems de con la orden anterior, se realiza mediante la orden RENAME (que permite el cambio
de nombre de cualquier objeto). Sintaxis:

RENAME nombreViejo TO nombreNuevo;

Pero por coherencia es mejor hacerlo de la primera forma (la del estndar).

[2.7.2]borrar contenido de tablas

Oracle dispone de una orden no estndar para eliminar definitivamente los datos de una tabla

es la orden TRUNCATE. A esta orden le sigue el nombre de la tabla a borrar.

TRUNCATE hace que se elimine el contenido de la tabla, pero no la estructura en s. Incluso borra del
archivo de datos el espacio ocupado por la tabla.

Aunque solo elimina datos, se trata de una instruccin DDL (luego no es revocable) y es incondicional: es
decir, no admite borrar solo una parte de una tabla.

[2.7.3]aadir columnas

Sintaxis:

ALTER TABLE nombreTabla ADD(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 (hay que recordar que el orden de
las columnas no importa).

Ejemplo:

ALTER TABLE facturas ADD (fecha DATE);

Muchas bases de datos (pero no Oracle) requieren escribir la palabra COLUMN tras la palabra ADD.

[2.7.4]borrar columnas

ALTER TABLE nombreTabla DROP(columna [,columnaSiguiente,...]);

Elimina la columna indicada de manera irreversible.

No se puede eliminar una columna si es la nica columna que queda en la tabla. En ese caso, (habr que usar
el comando DROP TABLE.

Ejemplo de borrado de columna:

ALTER TABLE facturas DROP (fecha);


Al igual que en el caso anterior, en SQL estndar se puede escribir el texto COLUMN tras la palabra
DROP.

[2.7.5]modificar columnas

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

ALTER TABLE nombreTabla MODIFY(columna tipo [propiedades]


[columnaSiguiente tipo [propiedades] ...]

Los cambios que se permiten en las columnas son (en Oracle):

Incrementar precisin o anchura de los tipos de datos


Solo 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 existentes tienen un tamao menor o igual a la nueva anchura.
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 vaca
Si, a travs de este comando, modificamos el valor de la propiedad DEFAULT de una tabla, dicho
cambio solo tendr efecto en la insercin de nuevas filas.

Ejemplo:

ALTER TABLE facturas MODIFY(fecha TIMESTAMP);

En el caso de SQL estndar en lugar de MODIFY se emplea ALTER (que adems opcionalmente puede ir
seguida de COLUMN).

Por ejemplo:

ALTER TABLE facturas ALTER COLUMN fecha TIMESTAMP;

[2.7.6]renombrar columna

Esto permite cambiar el nombre de una columna. Sintaxis

ALTER TABLE nombreTabla


RENAME COLUMN nombreAntiguo TO nombreNuevo

Ejemplo:

ALTER TABLE facturas RENAME COLUMN fecha TO fechaYhora;

[2.7.7]valor por defecto

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

Ejemplo:

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


DEFAULT 3.5);
La palabra DEFAULT se puede aadir durante la creacin o la modificacin de la tabla (comando ALTER
TABLE). El valor indicado con DEFAULT se aplica cuando aadimos filas a una tabla dejando el valor de
la columna vaco

en lugar de NULL, a la columna se le asignar el valor por defecto indicado.

[2.7.8]establecer tablas en modo solo lectura

Se trata de una opcin del comando ALTER TABLE que restringe una tabla para que solo admita
operaciones de lectura (como por ejemplo la instruccin SELECT) sobre la tabla. Es decir, impide la
modificacin y la eliminacin de sus datos.

Dicho de otra forma, no admite que se realice ninguna instruccin DML (tampoco la instruccin DROP
TABLE) sobre ella.

Sintaxis:

ALTER TABLE nombreTabla READ ONLY;

Para devolver la tabla a su estado normal, se usa:

ALTER TABLE nombreTabla READ WRITE;

[2.7.9]modificacin SET UNUSED

Se trata de una modificacin de tabla propia de Oracle mediante la cual marcamos una o ms columnas de
tabla con un marcador de falta de uso (UNUSED). Se pueden marcar as, columnas que estamos detectando
que no se usan mucho. Ejemplo:

ALTER TABLE personas SET UNUSED (n_seguridad_social);

Podemos consultar nuestras columnas marcadas como sin uso, de esta forma:

SELECT * FROM USER_UNUSED_COL_TABS;

Finalmente podemos eliminar las columnas marcadas como sin uso, de esta forma:

ALTER TABLE personas DROP UNUSED COLUMNS;

[2.8] establecimiento de restricciones


[2.8.1]definir restricciones

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

Las restricciones se pueden realizar cuando estamos creando (CREATE) o modificando (ALTER) una
tabla. En realidad hay dos maneras de poner restricciones:

Poner una restriccin de columna. En ese caso la restriccin se pone seguido a la definicin de la
columna. Sintaxis:

...
columna tipo [DEFAULT expresin]
[CONSTRAINT nombre] tipo,
...

Poner una restriccin de tabla. En ese caso se ponen al final de la lista de columnas. La nica
restriccin que no se puede definir de esta forma es la de tipo NOT NULL. El resto se haran
siguiendo esta sintaxis:

columna1 definicin1,
columna2 definicin2,
...,
ltimaColumna ltimaDefinicin,
[CONSTRAINT nombre] tipo(listaColumnas)
[,...otras restricciones...]

La diferencia est en que en el primer caso no se especifica la lista de columnas al definir la restriccin:
lgico porque se entiende perfectamente que las restricciones de columna se aplicarn a la columna en la
que se definen.

[2.8.2]nombre de las restricciones

Es muy buena prctica asignar un nombre a cada restriccin que implementemos. De no hacerlo, ser la
propia base de datos la que asigne nombre a la restriccin. Esto ltimo es mala idea, ya que el nombre
asignado resultar crptico (Oracle usa el formato SYSCn donde n es un nmero diferente para cada
restriccin).

Es mejor poner un nombre nosotros para que sea ms fcil de recordar.

Los nombres de restriccin no se pueden repetir para el mismo esquema, debemos de buscar nombres
nicos. Por ello debemos de utilizar un protocolo que nos facilite obtener fcilmente el nombre de la
restriccin.

Una forma muy utilizada es incluir el nombre de la tabla, los campos involucrados y el tipo de restriccin en
el nombre de la misma. Por ejemplo
pieza_id_pk podra indicar que el campo id de la tabla pieza tiene una clave principal (PRIMARY KEY).

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


Carcter de subrayado
Tres letras con la columna (o columnas) afectadas por la restriccin
Carcter de subrayado
Dos letras con la abreviatura del tipo de restriccin. La abreviatura puede ser:
o NN. NOT NULL.
o PK. PRIMARY KEY
o UK. UNIQUE
o FK. FOREIGN KEY
o CK. CHECK (validacin)

Por ejemplo para hacer que la clave principal de la tabla Alumnos sea el cdigo del alumno, el nombre de la
restriccin podra ser alu_cod_pk.

Lo malo es que, incluso con este mtodo, el nombre se puede repetir y adems, en tablas complejas, no es
tan fcil recordar el protocolo.

Otra opcin, menos compleja, es indicar las restricciones en el esquema lgico de la base de datos. Una
forma muy habitual es poner el nombre de la tabla seguida del tipo de la restriccin y un nmero que indique
el nmero de ese tipo de restriccin en la tabla. Por ejemplo si observamos este esquema
Podemos poner como nombre localidades_pk a la clave primaria de la tabla localidades y localidades_nn2 a
la restriccin NOT NULL sobre la columna n_provincia en esa misma tabla.

En este caso es imprescindible tener muy bien documento el esquema relacional.

[2.8.3]prohibir nulos

La restriccin NOT NULL permite prohibir los nulos en una determinada tabla. Eso obliga a que la
columna tenga que tener obligatoriamente un valor para que sea almacenado el registro.

Se puede colocar durante la creacin (o modificacin) del campo aadiendo la palabra NOT NULL tras el
tipo:

CREATE TABLE cliente(


dni VARCHAR2(9) CONSTRAINT clientes_nn1 NOT NULL
);

La restriccin NOT NULL es la nica que solo se puede poner seguida al nombre de la columna a la que se
aplica. La razn es que NOT NULL solo se puede aplicar a una columna a la vez.

[2.8.4]valores nicos

Las restricciones de tipo UNIQUE obligan a que el contenido de una o ms columnas no puedan repetir
valores en distintas filas. Ejemplo:

CREATE TABLE cliente(


dni VARCHAR2(9) CONSTRAINT clientes_nn1 UNIQUE
);

Esta forma permite poner un nombre a la restriccin. Si la repeticin de valores se refiere a varios campos,
la forma sera:

CREATE TABLE alquiler(


dni VARCHAR2(9),
cod_pelicula NUMBER(5),
CONSTRAINT alquiler_uk UNIQUE(dni,cod_pelicula)
);
La coma tras la definicin del campo cod_pelicula hace que la restriccin sea independiente de ese campo.
Eso obliga a que, tras UNIQUE se indique la lista de campos a los que se aplica la restriccin.

Incluso para un solo campo se puede colocar la restriccin al final de la lista en lugar de definirlo a
continuacin del nombre y tipo de la columna.

Sobre las columnas con restricciones UNIQUES, automticamente Oracle crea un ndice interno (lo que
acelera las labores de bsqueda y ordenacin sobre esas columnas).

Hay que recordar que las claves alternativas en las tablas relacionales deben llevar restricciones UNIQUE y
NOT NULL.

[2.8.5]clave primaria

La clave primaria de una tabla la forman las columnas que indican a cada registro de la misma. La clave
primaria hace que los campos que la forman no puedan quedar vacos ni repetir valores. Adems pasan a
formar parte del ndice principal de la tabla, que se usa para acceder ms rpidamente a estos datos.sean
NOT NULL (sin posibilidad de quedar vacos) y que los valores de los campos sean de tipo UNIQUE (sin
posibilidad de repeticin).

Si la clave est formada por un solo campo basta con:

CREATE TABLE clientes(

dni VARCHAR(9) CONSTRAINT clientes_pk PRIMARY KEY,


nombre VARCHAR(50)
);

Si la clave est formada por ms de un campo:

CREATE TABLE alquileres(dni VARCHAR(9),


cod_pelicula NUMBER(5),
CONSTRAINT alquileres_pk PRIMARY KEY(dni,cod_pelicula)
);

[2.8.6]clave secundaria o fornea

Una clave secundaria o fornea se usa para indicar que uno o ms campos de una tabla que estn
relacionados con la clave principal (o incluso con una clave candidata) de otra tabla y, por lo tanto, no
podrn contener valores que no estn relacionados en la otra tabla.

Este es un ejemplo de indicacin de clave fornea:

CREATE TABLE alquileres(


dni VARCHAR2(9)
CONSTRAINT alquileres_fk1 REFERENCES clientes(dni),
cod_pelicula NUMBER(5)
CONSTRAINT alquileres_fk2 REFERENCES peliculas(cod),
CONSTRAINT alquileres_pk PRIMARY KEY(dni,cod_pelicula)
);

Significa esta instruccin (en cuanto a claves forneas) que el campo dni se relaciona con la columna dni de
la tabla clientes y el cod_pelcula con la columna cod de la tabla pelculas.

Si el campo al que se hace referencia es la clave principal, se puede obviar el nombre del campo:
CREATE TABLE alquileres(
dni VARCHAR2(9)
CONSTRAINT alquileres_fk1 REFERENCES clientes,
cod_pelicula NUMBER(5)
CONSTRAINT alquileres_fk2 REFERENCES peliculas,
CONSTRAINT alquileres_pk PRIMARY KEY(dni,cod_pelicula)
);

En este caso se entiende que los campos hacen referencia a las claves principales de las tablas. Si la relacin
est formada por ms de una columna, el orden de los campos debe de ser el mismo: aunque, en este caso, es
mejor indicar explcitamente el nombre.

De hecho, cuando una relacin la forman ms de una columna, se debe (como siempre ocurre en las
restricciones de ms de una columna) tras la lista de columnas de la tabla. Aunque cualquier restriccin (sea
de una sola columna o no), se puede indicar tambin al final. Ejemplo:

CREATE TABLE existencias(


tipo CHAR2(9),
modelo NUMBER(3),
n_almacen NUMBER(1)
cantidad NUMBER(7),
CONSTRAINT existencias_fk1 FOREIGN KEY(tipo,modelo)
REFERENCES piezas,
CONSTRAINT existencias_fk2 FOREIGN KEY(n_almacen)
REFERENCES almacenes,
CONSTRAINT existencias_pk
PRIMARY KEY(tipo,modelo,n_almacen)
);

Si la definicin de clave secundaria se pone al final, hace falta colocar el texto FOREIGN KEY para
indicar en qu campos se coloca la restriccin de clave fornea. En el ejemplo anterior es absolutamente
necesario (al no indicar explcitamente 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
estn en ese orden.

Las restricciones de tipo FOREIGN KEY provocan una restriccin de integridad referencial, en la que no
se pueden indicar datos en las claves secundarias que no existan en las claves principales relacionadas.

Lo malo es que la integridad referencial provoca varios problemas, debidos a sus efectos secundarios.

Por ejemplo, supongamos que relacionamos el alquiler de habitaciones en una tabla de alquileres con el dni
de la persona que alquila. El dni es la clave de la tabla clientes. Bien, pues no podemos borrar una persona
de la tabla de clientes que tenga alquileres. Tampoco podremos modificar su dni por la misma razn.

Ante esto, disponemos de la posibilidad de aplicar polticas especiales. Estas polticas son palabras claves
que se colocan tras la clusula REFERENCES al aadir una restriccin de tipo FOREIGN KEY.

As las polticas que dictan qu hacer cuando se borran datos principales relacionados con claves
secundarias son:

ON DELETE SET NULL. Coloca nulos en todas las claves secundarias relacionadas.
ON DELETE CASCADE. Borra todas las filas relacionadas con aquella que hemos eliminado.
ON DELETE SET DEFAULT. Coloca en las filas relacionadas el valor por defecto de esa columna
en la columna relacionada
ON DELETE NOTHING. No hace nada.

Las mismas se pueden aplicar en el caso de modificar claves principales. As tendremos ON UPDATE DO
NOTHING, ON UPDATE CASCADE, ON UPDATE SET NULL y ON UPDATE SET DEFAULT.
Sin embargo, Oracle solo dispone de las polticas ON DELETE CASCADE y ON DELETE SET
NULL. Y por defecto aplica DO NOTHING tanto para borrar como para modificar claves primarias. No
posee, por tanto, ninguna accin para la modificacin (ON UPDATE) de claves primarias.

Ejemplo de establecimiento de borrado en cascada y de puesta a nullo:

CREATE TABLE alquileres(


dni VARCHAR(9),
cod_pelicula NUMBER(5),
CONSTRAINT alquileres_pk PRIMARY KEY(dni,cod_pelicula),
CONSTRAINT alquileres_fk1 FOREIGN KEY (dni)
REFERENCES clientes(dni) ON DELETE SET NULL,
CONSTRAINT alquileres_fk2 FOREIGN KEY (cod_pelicula)
REFERENCES peliculas(cod) ON DELETE CASCADE
);

[2.8.7]restricciones de validacin

Son restricciones que dictan una condicin que deben cumplir los contenidos de una columna. Una misma
columna puede tener mltiples CHECKS en su definicin (se pondran varios CONSTRAINT seguidos,
sin comas).

Ejemplo:

CREATE TABLE ingresos(


cod NUMBER(5) PRIMARY KEY,
concepto VARCHAR2(40) NOT NULL,
importe NUMBER(11,2) CONSTRAINT ingresos_ck1
CHECK (importe>0)
CONSTRAINT ingresos_ck2
CHECK (importe<8000)
);

En este caso las restricciones CHECK prohbe aadir datos cuyo importe no est entre 0 y 8000.

Aunque sera ms cmodo de esta forma:

CREATE TABLE ingresos(


cod NUMBER(5) PRIMARY KEY,
concepto VARCHAR2(40) NOT NULL,
importe NUMBER(11,2) CONSTRAINT ingresos_ck1
CHECK (importe>0 AND importe<8000)
);

Para poder hacer referencia ms de una columna dentro de una restriccin CHECK, hay que indicar (como
siempre) la restriccin tras la lista de columnas de la tabla.

CREATE TABLE ingresos(


cod NUMBER(5) PRIMARY KEY,
concepto VARCHAR2(40) NOT NULL,
importe_max NUMBER(11,2),
importe NUMBER(11,2),
CONSTRAINT ingresos_ck1 CHECK (importe<importe_max)
);

[2.8.8]aadir restricciones a una tabla

Es posible querer aadir restricciones tras haber creado la tabla. En ese caso se utiliza la siguiente sintaxis:
ALTER TABLE tabla
ADD [CONSTRAINT nombre] tipoDeRestriccin(columnas);

tipoRestriccin es el texto CHECK, PRIMARY KEY, UNIQUE o FOREIGN KEY.

Si deseamos aadir una restriccin NOT NULL se realiza mediante ALTER TABLE .. MODIFY y luego
indicando la restriccin que queremos aadir.

[2.8.9]borrar restricciones

Sintaxis:

ALTER TABLE tabla


DROP {PRIMARY KEY | UNIQUE(listaColumnas) |
CONSTRAINT nombreRestriccin} [CASCADE]

La opcin PRIMARY KEY elimina una clave principal. UNIQUE elimina la restriccin de unicidad
realizada sobre la lista de columnas indicadas.

Ms verstil, la opcin CONSTRAINT elimina la restriccin cuyo nombre se indica.

La opcin CASCADE hace que se eliminen en cascada las restricciones de integridad que dependen de la
restriccin eliminada y que, de otro modo, no permitira eliminar dicha restriccin.

Es decir, no podemos eliminar una clave primaria que tiene claves secundarias relacionadas. Pero si
indicamos CASCADE al eliminar la clave primaria, todas las restricciones FOREIGN KEY relacionadas,
tambin se eliminarn.

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 cursos_ck1 CHECK(fecha_fin>fecha_inicio),
CONSTRAINT cursos_fk1 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 referencia algunas claves ajenas

Para evitar el error:

ALTER TABLE curso DROP PRIMARY KEY CASCADE;

Esa instruccin elimina la restriccin de clave secundaria cursos_fk1 antes de eliminar la principal.

Tambin produce un error similar, 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

El error se debe a que no es posible borrar una columna que forma parte de la definicin de una instruccin.
La solucin es utilizar el sufijo CASCADE CONSTRAINT al eliminar la columna.

As, se eliminan las restricciones 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 y as se puede
eliminar la columna.

[2.8.10]activacin y desactivacin de restricciones

desactivar restricciones

A veces conviene temporalmente desactivar una restriccin para saltarse las reglas que impone. La sintaxis
es (en Oracle):

ALTER TABLE tabla DISABLE CONSTRAINT nombre [CASCADE];

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

activar restricciones

Anula la desactivacin:

ALTER TABLE tabla ENABLE CONSTRAINT nombre;

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

[2.8.11]cambiar de nombre a las restricciones

Para hacerlo se utiliza este comando:

ALTER TABLE table RENAME CONSTRAINT


nombreViejo TO nombreNuevo;

[2.8.12]consultar restricciones en el diccionario de datos

En el caso de Oracle, se puede utilizar la vista del diccionario de datos USER_CONSTRAINTS.

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

Columna Descripcin
OWNER Indica el nombre del usuario propietario de la tabla
CONSTRAINT_NAME Nombre de la restriccin
Columna Descripcin
Tipo de restriccin:

C. De tipo CHECK o NOT NULL


CONSTRAINT_TYPE P. PRIMARY KEY
R. FOREIGN KEY
U. UNIQUE

TABLE_NAME Nombre de la tabla en la que se encuentra la restriccin

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 las columnas que participan en
una restriccin. As si hemos definido una clave primaria formada por los campos uno y dos, en la tabla
USER_CONS_COLUMNS aparecern dos entradas, una para el primer campo del ndice y otra para el
segundo. Se indicar adems el orden de aparicin en la restriccin.

Ejemplo (resultado de la instruccin 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, resultado de un SELECT sobre la vista


USER_CONS_COLUMNS aparece una restriccin de clave primaria sobre la tabla existencias. Esta clave
est formada por las columnas (tipo, modelo y n_almacen) y en ese orden. Una segunda restriccin llamada
pieza_fk est compuesta por tipo y modelo de la tabla existencias. Finalmente la restriccin pieza_pk est
formada por tipo y modelo, columnas de la tabla pieza.

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

1 Se pueden obtener apuntes de administracin de bases de datos Oracle en


http://www.jorgesanchez.net/abd

2 Se pueden consultar las restricciones del modelo relacional en la direccin


http://jorgesanchez.net/manuales/gbd/modelo-relacional.html#h23