Escolar Documentos
Profissional Documentos
Cultura Documentos
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.
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:
Otras veces se describen cdigos de ejemplo de un comando. Los ejemplos se escriben tambin con fondo
naranja claro, pero sin el reborde. Ejemplo:
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:
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.
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
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.
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.
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 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.
[2]Si es correcta se valora si los metadatos de la misma son correctos. Se comprueba esto en el diccionario
de datos.
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.
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.
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:
Ejemplo:
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
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.
Deben cumplir las siguientes reglas (se comentan las reglas de Oracle, en otros SGBD podran cambiar):
Nota: Estas son tambin las propiedades que debe cumplir cualquier nombre de objeto en una base de datos
(nombres de vistas, columnas, restricciones,)
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:
Ejemplo:
CREATE TABLE proveedores (nombre VARCHAR(25));
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:
Se puede indicar un valor por defecto para el atributo mediante la clusula DEFAULT.
Ejemplo:
De este modo si aadimos un proveedor y no indicamos localidad, se tomar Palencia como localidad de
dicho Proveedor.
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
VARBIT(n)
Datos de gran tamao
LONG (en desuso)
CHARACTER LARGE OBJECT
Texto largo
CLOB
CLOB
RAW (en desuso)
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
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.
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.
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.
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:
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.
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).
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:
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.
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
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.
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.
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).
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:
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:
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.
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:
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
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:
Ejemplo:
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:
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.
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:
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
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:
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:
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).
En Oracle, adems de con la orden anterior, se realiza mediante la orden RENAME (que permite el cambio
de nombre de cualquier objeto). Sintaxis:
Pero por coherencia es mejor hacerlo de la primera forma (la del estndar).
Oracle dispone de una orden no estndar para eliminar definitivamente los datos de una tabla
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:
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:
Muchas bases de datos (pero no Oracle) requieren escribir la palabra COLUMN tras la palabra ADD.
[2.7.4]borrar columnas
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.
[2.7.5]modificar columnas
Ejemplo:
En el caso de SQL estndar en lugar de MODIFY se emplea ALTER (que adems opcionalmente puede ir
seguida de COLUMN).
Por ejemplo:
[2.7.6]renombrar columna
Ejemplo:
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:
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:
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:
Podemos consultar nuestras columnas marcadas como sin uso, de esta forma:
Finalmente podemos eliminar las columnas marcadas como sin uso, de esta forma:
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.
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).
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:
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.
[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:
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:
Esta forma permite poner un nombre a la restriccin. Si la repeticin de valores se refiere a varios campos,
la forma sera:
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).
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.
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:
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.
[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:
En este caso las restricciones CHECK prohbe aadir datos cuyo importe no est entre 0 y 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.
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);
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:
La opcin PRIMARY KEY elimina una clave principal. UNIQUE elimina la restriccin de unicidad
realizada sobre la lista de columnas indicadas.
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.
Esa instruccin elimina la restriccin de clave secundaria cursos_fk1 antes de eliminar la principal.
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:
Esta instruccin elimina la restriccin de tipo CHECK en la que apareca la fecha_inicio y as se puede
eliminar la columna.
desactivar restricciones
A veces conviene temporalmente desactivar una restriccin para saltarse las reglas que impone. La sintaxis
es (en Oracle):
La opcin CASCADE hace que se desactiven tambin las restricciones dependientes de la que se desactiv.
activar restricciones
Anula la desactivacin:
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..
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:
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.
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
Para saber de qu tipo son esas restricciones, habra que acudir a la vista USER_COL_CONSTRAINTS.