Manual SQL

81
Programador/a de Sistemas de Bases de Datos Relacionales Lenguaje SQL Lenguaje SQL Página 1/81

Transcript of Manual SQL

Page 1: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

Lenguaje SQL

Lenguaje SQL Página 1/43

Page 2: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

Índice

1 Introducción1.1 Características y Beneficios de SQL

2 El Lenguaje SQL2.1 DML (Data Manipulation Language)2.2 DDL (Data Definition Language)2.3 DCL (Data Control Language)2.4 Elementos de SQL2.5 Objetos de un Esquema2.6 Reglas para Nombrar Objetos2.7 Reglas para Referenciar Objetos2.8 Alias de Nombre de Tabla2.9 Alias de Columnas2.10 Tipos de Datos

3 El Lenguaje de Manipulación de Datos3.1 La Sentencia SELECT3.2 Operadores. Funciones y Condiciones3.3 Combinaciones de Tabla “JOINS”3.4 Subconsultas o Subselects3.5 La Sentencia INSERT3.6 La Sentencia UPDATE3.7 La Sentencia DELETE

4 El Lenguaje de Definición de Datos4.1 Sentencias DDL4.2 CREATE TABLE 4.3 CREATE INDEX4.4 CREATE SYNONYM4.5 CREATE VIEW4.6 ALTER TABLE4.7 DROP TABLE4.8 DROP INDEX4.9 DROP SYNONYM4.10 RENAME4.11 TRUNCATE

5 El Lenguaje de Control de Datos5.1 Privilegios y Roles5.2 CREATE ROLE5.3 GRANT5.4 REVOKE

Lenguaje SQL Página 2/43

Page 3: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

Introducción

El lenguaje SQL consiste en un grupo de comandos que todos los programas y usuarios pueden utilizar para acceder a los datos dentro de una base de datos.

Normalmente, se accede a los datos a través de aplicaciones o herramientas sin tener que utilizar directamente SQL, pero las aplicaciones están realizadas con dicho lenguaje.

El modelo de base de datos relacional fue originalmente desarrollado por E. F. Codd hacia los años 70. El lenguaje SQL fue desarrollado por IBM en un prototipo de base de datos relacional llamada SYSTEM R a mediados de los 70.

El lenguaje SQL original (SEQUEL2) se definió en Noviembre de 1976 por la revista de IBM llamada IBM Journal of R&D. En 1979 Oracle Corporación introduce la primera implementación comercial disponible de este lenguaje.

SQL también ha sido implementado como lenguaje para los sistemas de base de datos de IBM DB2 y SQL/DS.

SQL está implementado y aceptado estándar de la industria como lenguaje de acceso a bases de datos. Cumple los estándares ANSI/ISO/FIPS (American National Standard Institute, International Standars Organization, Federal Information Processing Standard respectivamente).

Características y Beneficios de SQL

No es un lenguaje procedural porque: Procesa varias filas a la vez, mejor que una sola. La navegación para buscar los datos es automática, utilizando unas rutinas de

acceso denominadas “Optimizador” que describiremos más adelante.

Existe una extensión procedural al SQL denominada PL/SQL, que consisten en mezclar SQL estándar con comandos puramente procedimentales (goto, while, for, declares, etc.). Esto nos permite realizar una operación sobre los datos basándonos en los resultados obtenidos anteriormente.

El lenguaje es sencillo, muy similar al idioma inglés y los comandos básicos pueden aprenderse en pocas horas. Es el mismo lenguaje para todos los tipos de usuarios desde cualquier herramienta y para cualquier tipo de actividad incluyendo:

Administradores del sistema y de Base de Datos. Programadores de Aplicaciones. Usuarios finales.

Lenguaje SQL Página 3/43

Page 4: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

SQL es un lenguaje unificado para todo tipo de tareas y categorías incluyendo: Consulta, actualización, inserción y borrado de filas en una tabla. Creación modificación reemplazamiento y borrado de objetos. Control de acceso a la base de datos y a sus objetos. Garantizar integridad y consistencia de los datos.

El Lenguaje SQL

Normalmente una base de datos relacional almacena información en estructuras básicas denominadas tablas.

Una tabla es una estructura sobre la que se almacena información que interesa a nuestro sistema. Una tabla está compuesta por columnas y filas.

Una columna es la representación de un atributo, propiedad o característica de una tabla.

Una fila es una ocurrencia en la tabla.

Se pueden establecer reglas a las que queremos que se ajusten nuestros datos, o qué tipos de datos se almacenen.

Se pueden establecer también relaciones entre las tablas de nuestras aplicaciones.La implementación de estas reglas se detallará en los próximos capítulos.

El lenguaje sql se subdivide a su vez en tres tipos de lenguaje dependiendo del tipo de operación que deseemos realizar sobre la base de datos. Estos tipos son:

DML (Data Manipulation Language) DDL (Data Definition Language) DCL (Data Control Language)

DML (Data Manipulation Language)

Este sublenguaje agrupa los comandos sql que permiten realizar consultas y modificaciones, inserciones y borrados sobre los datos de las tablas, es decir:

select Consultar datos, sin modificarlosupdate Actualizar datos de tablasinsert Introducir nuevos datos a las tablasdelete Borrar datos de las tablas

Las sentencias update, insert y delete deben validarse contra la base de datos, o deshacerse, empleando las sentencias commit o rollback.

Lenguaje SQL Página 4/43

Page 5: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

DDL (Data Definition Language)

Este sublenguaje agrupa las sentencias sql utilizadas para definir, borrar, reemplazar o alterar estructuras de la base de datos, es decir:

create Permite al usuario definir un objeto, por ejemplo una tabla.alter Permite al usuario modificar las características de un objeto

ya existente. Por ejemplo añadir una columna a una tabla.drop Permite al usuario borrar un objeto. Por ejemplo una tabla

completa, incluida su definición, no solo las filas.rename Permite renombrar un objeto, por ejemplo una vista.truncate Borra las filas de una tabla o índice sin borrar su estructura o

definición. La tabla permanece, pero vacía.

DCL (Data Control Language)

Este sublenguaje agrupa sentencias utilizadas por el administrador o por el dueño de un objeto para conceder o suprimir privilegios de acceso a la base de datos o a un objeto. Por ejemplo:

grant Concede privilegios.revoke Quita o suprime privilegios.

Elementos de SQL

Antes de comenzar a trabajar con sql se debe estar familiarizado con los siguientes conceptos:

Objetos de un Esquema Reglas para Nombrar Objetos Reglas para Referenciar Objetos Tipos de Datos

Objetos de un Esquema

Un esquema es un conjunto de objetos o estructuras de datos propiedad de un usuario. Cada usuario tiene su propio esquema, que coincide con el nombre del usuario que crea el objeto. Los objetos se crean, y se puede modificar su estructura, con el lenguaje DDL. Los objetos son de los siguientes tipos:

Tablas (Estructura Básica) Índices Secuencias Vistas Sinónimos Agrupaciones Procedimientos y Funciones almacenados Paquetes

Lenguaje SQL Página 5/43

Page 6: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

Disparadores (triggers) almacenados en base de datos Replicas y Replicas lógicas Enlaces de bases de datos

Existen otros objetos que se crean y manipulan a través de sql, y que se almacenan en la base de datos, pero no son creados dentro del esquema de un usuario, ni son propiedad de nadie. Estos objetos son:

Perfiles Roles Segmentos de Rollback Tablespaces

Algunos objetos están divididos a su vez en partes mas pequeñas, como por ejemplo:

Una columna es una parte de una tabla o vista. Una restricción de integridad es parte de una tabla. Procedimientos y funciones son parte de un paquete.

Reglas para Nombrar Objetos

Las reglas de nomenclatura de objetos son: El nombre de un objeto debe tener una longitud entre 1 (mínimo) y 30

caracteres (máximo). Excepto:1. El nombre de una base de datos está limitado a 8 caracteres.2. El nombre de un enlace de base de datos esta limitado a 128

caracteres. El nombre de un objeto no puede estar entre paréntesis, ni entrecomillado,

etc. Los nombres de objetos pueden escribirse en mayúsculas o minúsculas. El nombre del objeto debe comenzar con un carácter reconocible por el

conjunto de caracteres de la base de datos, y que no sea un numérico. El nombre de un objeto solo contiene caracteres alfanuméricos, y se permite

además el carácter underscore (‘_’). También admite, pero se desaconseja por uso interno, los caracteres dólar (‘$’) y almohadilla (‘#’).

Existe una lista de palabras reservadas que no pueden utilizarse para nombrar objetos.

Se puede nombrar un objeto con un nombre alternativo o sinónimo, y a una columna con un nombre alternativo temporal, denominado alias.

Lenguaje SQL Página 6/43

Page 7: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

Reglas para Referenciar Objetos

La sintaxis general para referenciar un objeto es la siguiente:[esquema.]nombre_objeto[.parte_objeto]

donde:esquema Indica el esquema propietario del objeto. Por ejemplo

debemos indicar el usuario que creo dicho objeto cuando queremos consultarlo y no tenemos sinónimos asociados.

nombre_objeto Indica el nombre del objeto que queremos referenciar.parte_objeto Indica una parte determinada del objeto. Por ejemplo para

indicar una columna de una tabla en una sentencia select. Es obligatorio indicar el nombre de tabla al que pertenece una columna cuando estamos realizando una consulta a dos tablas que tienen columnas que se denominan igual.

Alias de Nombre de Tabla

Se utiliza para renombrar temporalmente una tabla dentro de una sentencia select, por razones de clarificación y desarrollo. No es lo mismo un alias de tabla que un sinónimo en el sentido de Oracle, ya que este último es un nombre alternativo que se crea para una tablas, vista, etc. y que permanece hasta que se elimina. Un alias de tabla solo existe durante la ejecución de la sentencia select en la que se utiliza. La sintaxis es:

from nombre_objeto alias

donde:nombre_objeto Indica el objeto (tabla, vista, sinónimo) al que estamos

referenciandoalias Indica el nombre por el que se va a reconocer en la sentencia

select a dicho objeto.

Alias de Columnas

En el resultado de una consulta aparecen en las cabeceras de las columnas el nombre que dicha columna tenga en la tabla. Si deseamos cambiarlo para modificar la visualización del resultado, podemos utilizar alias de columna. También se pueden utilizar para referenciar dichas columnas desde comandos sqlplus. Cuando el alias de una columna está compuesto por mas de una palabra, y existen espacios en blanco, o algún carácter especial en medio, debe acotarse el literal con dobles comillas.

Tipos de Datos

Cada literal o valor de columna que se manipula esta englobado en un tipo de dato. Cada tipo de dato contiene una serie de características asociadas, por ejemplo un limite en la longitud del valor que pueden tener.

Lenguaje SQL Página 7/43

Page 8: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

Cuando se crea una tabla se especifica a que tipo de datos asociamos cada columna. Luego, dependiendo del tipo de dato podremos insertar ciertos valores o establecer ciertas comparaciones. Los tipos de datos son:

Código Tipo Dato Descripción1 VARCHAR2(tamaño) Cadena de caracteres de longitud variable. La

máxima longitud se indica en tamaño. El tamaño máximo es 2000 caracteres en la versión 7 y 255 en la versión 6.

2 NUMBER(n[, d]) Número de tamaño n dígitos (hasta 38) de los cuales d dígitos son dedicados a la parte decimal.

8 LONG Cadena de caracteres de longitud variable. Tamaño hasta 2 Giga bytes.

13 DATE Fecha.23 RAW(tamaño) Dato binario de longitud variable. Tamaño máximo

de 255 bytes.24 LONG RAW Cadena binaria de longitud variable de hasta 2 Giga

bytes.69 ROWID Pseudocolumna en notación hexadecimal que indica

la posición física de una fila en la base de datos.96 CHAR(tamaño) Cadena alfanumérica de longitud fija. Tamaño

máximo 255 bytes. Si no se indica precisión ocupa un carácter.

Los códigos de los tipos de datos son los utilizados internamente por Oracle en el diccionario.

El Lenguaje de Manipulación de Datos

Dentro del lenguaje de manipulación existen las siguientes sentencias: select

insert

update

delete

La Sentencia SELECT

Todas las consultas se realizan con una sola sentencia: select

Las consultas se realizan por asociación de valores, y no por la situación física donde se encuentren los datos.

Se puede recuperar toda la información o también subconjuntos de filas o de columnas.

La representación de los datos se puede ordenar.

Lenguaje SQL Página 8/43

Page 9: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

La sintaxis es:

Para trabajar con SQL utilizaremos la herramienta Oracle denominada sql*plus, desde donde ejecutaremos las sentencias deseadas. Sql*plus contiene sus propios comandos de edición, formateo de columnas y cálculos, y rupturas de control basándose en los resultados. Hay que distinguir entre comandos sql*plus y sentencias sql. La herramienta sql*plus esta comentada en su correspondiente manual.

Después de la cláusula select indicamos la lista de columnas que deseamos seleccionar. Se pueden seleccionar todas las columnas de una tabla, indicando cada una de ellas, separadas por comas, o indicando el símbolo asterisco (‘*’) que quiere decir todas las columnas.

Lenguaje SQL Página 9/43

Page 10: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

Con la cláusula from indicamos el nombre de la tabla, o tablas, de las que deseamos extraer o contrastar información. En la cláusula from deben aparecer los nombres de las tablas a las que pertenecen las columnas mencionadas en cualquiera de las otras cláusulas. Si hay mas de una tabla se separan mediante comas (‘,’). La cláusula from debe aparecer después de la enumeración de columnas de la cláusula select. Recordar que cuando la tabla no es de nuestra propiedad se debe anteponer al nombre de la tabla el nombre del esquema propietario. Cuando se mezclan dos tablas o mas en una consulta es conveniente anteponer el nombre de la tabla al de la columna cada vez que la columna es referenciada. También se puede asignar un alias temporal al nombre de tabla y utilizar este como prefijo de la columna.

La cláusula where se utiliza para filtrar información sobre las filas que deseamos recuperar. Solo se mostrarán aquellas que cumplan la condición impuesta. La cláusula where puede utilizarse también en otras sentencias de manipulación, como por ejemplo update y delete. El criterio de búsqueda puede ser tan complejo como se desee. Las comparaciones establecidas en la cláusula where dependen de los tipos de datos sobre los que establezco dichas comparaciones. Para cada tipo de datos se utilizan operadores de comparación, y en algunos casos funciones de conversión para igualar tipos de datos distintos.

La cláusula order by determina el orden en el que se mostrará el resultado de la consulta. Admite la ordenación por mas de una columna. También se admite que la columna especificada en la cláusula order by sea una expresión o haya sido modificada por una función. Se admite la ordenación por posición. El conjunto de caracteres de ordenación se basa en el parámetro de arranque de la base de datos denominado NLS_SORT, que está implícito a su vez en otro denominado NLS_LANG (de National Language Support que es la utilidad que le indica al servidor el lenguaje en el que debe trabajar). No se ordenará igual si tenemos el soporte al lenguaje americano que al español (utilización de eñes, por ejemplo). La ordenación por defecto es ascendente, pero se puede indicar si se desea, para cada uno de los campos el tipo de ordenación (asc para ordenación ascendente y desc para ordenación descendente). Para utilizar el método de posición se indica en la cláusula order by el número de posición que ocupa la columna o expresión por la que queremos ordenar en la cláusula select. Por ejemplo:

select nombre, apellido1, apellido2, edadfrom cursoorder by 2,3,4,1;

haría que el resultado saliese ordenado por apellido1, apellido2, edad y nombre. La utilización del método de posición en la cláusula order by se lleva a cabo cuando la cantidad de columnas por las que se desea ordenar es muy grande, aunque se puede usar en cualquier situación, pero es menos clarificadora en sentencias select pequeñas.

Lenguaje SQL Página 10/43

Page 11: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

Operadores. Funciones y Condiciones.

Operadores

Un operador se utiliza para manipular datos de forma individual y devolver un valor. También se les denomina operandos o argumentos. Suelen estar representados por caracteres especiales o palabras clave. Por ejemplo el operador de adición es el símbolo ‘+’, y la clave que identifica que no hay valores nulos es ‘is not null’. La división es:

Operadores aritméticos Operadores de caracteres Operadores condicionales Operadores lógicos

Operadores aritméticos

A continuación veamos una lista de los operadores aritméticos:Operador Propósito Ejemplo+, - Suma y resta. select salario+comision

from empleados;

*, / Multiplicar y dividir select salario * 12 “salario anual”from empleados;

Operadores de caracteres

El operador de caracteres es:

Operador Propósito Ejemplo¦¦ Concatenar cadenas de

caracteres

select ‘Estimado señor ‘¦¦nombrefrom empleados;

Operadores condicionales o de comparación

Los operadores de comparación se utilizan en los predicados condicionales, para comparar una expresión con otra. El resultado puede ser verdadero (TRUE), falso (FALSE).

Los operadores de comparación son:Operador Propósito Ejemplo= Comprobador de

igualdad.

select * from departamentowhere ndepartamento = 10;

!=, <> No igualdad. select * from departamentowhere ndepartamento != 10;

> Mayor que. select * from empleadoswhere salario > 1500;

< Menor que. select * from empleados

Lenguaje SQL Página 11/43

Page 12: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

where salario < 1500;>= Mayor o igual que. select *

from empleadoswhere salario >= 3000;

<= Menor o igual que. select * from empleadoswhere salario <= 2000;

IN Igual a uno de los valores de la lista.

select * from departamentowhere ndepartamento in (10,30,50);

NOT IN El valor no se encuentra en la lista.

select * from departamentowhere ndepartamento not in (10,20,50);

BETWEEN n AND m

El valor es mayor o igual que n y menor o igual que m.

select * from empleadoswhere salario between 2000 and 3000;

NOT BETWEEN n AND m

El valor no esta dentro del rango delimitado por n y m.

select * from empleadoswhere salario not between 2000 and 3000;

IS NULL Comprueba si hay ausencia de contenido (valor) en una columna. Es el único operador que puede comprobarlo.

select * from empleadoswhere comision is null;

IS NOT NULL

Comprueba si hay contenido (valor) en una columna.

select * from empleadoswhere comision is not null;

LIKE Comprueba cadenas de caracteres con un patrón de búsqueda.

select *from empleadoswhere apellido1 like ‘MARTI%’

NOT LIKE Comprueba cadenas de caracteres que no coincidan con un patrón de búsqueda.

select *from empleadoswhere apellido1 not like ‘MARTI%’

Operador like

Veamos a continuación con mas detalle el operador like.

El operador like busca cadenas de caracteres que contengan la porción de cadena indicada, mientras que el operador igual (‘=’) buscaría cadenas de caracteres idénticas a la proporcionada. Para realizar búsquedas con like se utilizan los caracteres comodines ‘%’ y ‘_’. El símbolo ‘%’ indica cualquier cadena de caracteres de longitud variable. En el ejemplo anterior buscaría todos los empleados cuyo primer apellido comenzase con la cadena ‘MARTI’, sin importar la continuación (‘MARTIN’, ‘MARTINEZ’, etc.). El símbolo ‘_’ (underscore) indica cualquier carácter en la posición donde se encuentre, pero uno solo.

Lenguaje SQL Página 12/43

Page 13: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

Operadores lógicos

Los operadores lógicos se utilizan para combinar los resultados de dos condiciones de comparación y producir un único resultado.

Los operadores lógicos son:

Operador Propósito EjemploNOT Devuelve TRUE si la

condición evaluada es falsa, de otra manera devuelve FALSE.

select * from empleadoswhere not (apellido1=’MARTIN’)

AND Devuelve TRUE si las dos condiciones se cumplen.

select *from empleadoswhere puesto=’ANALISTA’and ndepartamento=10

OR Devuelve TRUE si alguna de las condiciones se cumple

select *from empleados where puesto=’ANALISTA’or ndepartamento=10

Dentro de los operadores lógicos existen los operadores de conjuntos. Los operadores de conjuntos son aquellos que visualizan los resultados de dos consultas en un único resultado.

Los operadores de conjuntos son:

Operador ¿Que devuelve?UNION Suma de todas las filas distintas seleccionadas por ambas consultas.UNION ALL Suma todas las filas seleccionadas por ambas consultas incluyendo

duplicados.INTERSECT Devuelve todas las filas comunes de ambas consultas eliminando

duplicados.MINUS Devuelve todas las filas seleccionadas por la primera consulta que

no sean recuperadas por la segunda consulta.

Funciones

Una función es similar a un operador puesto que manipula datos y devuelve un resultado. Difiere de los operadores, puesto que admite argumentos.

Si se llama a una función con un argumento en el que el tipo de dato es distinto al que espera la función, se convierte automáticamente y de forma implícita al tipo que la función espera.

Lenguaje SQL Página 13/43

Page 14: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

Existen dos tipos genéricos de funciones: Funciones de fila simple . Funciones de grupo.

Estos dos tipos difieren en el número de filas sobre las que actúan. Una función de fila simple devuelve un resultado único para cada fila sobre la que actúa, mientras que una función de grupo devuelve un resultado único para un conjunto de filas.

Las funciones de fila simple pueden aparecer en las listas de la cláusula select. Las funciones de grupo pueden aparecer además de en la cláusula select en una cláusula llamada group by … having, que sirve para crear rupturas sobre resultados y visualizar sólo la parte que nos interesa.

La distribución entre tipos de función será la siguiente: Funciones de fila simple.

1. Funciones numéricas.2. Funciones de caracteres.3. Funciones de fechas.4. Funciones de conversión.5. Otras funciones.

Funciones de grupo.

Funciones de fila simple

Las funciones siguientes son funciones agrupadas según el tipo de dato que esperan como argumento y el tipo de dato que devuelve.

Funciones numéricas

Son aquellas que aceptan como entrada argumentos numéricos y devuelven valores numéricos:

Función Sintaxis Propósitoabs abs(n) Devolver el valor absoluto de n.ceil ceil(n) Devuelve el entero inmediatamente superior o

igual a n.cos cos(n) Devuelve el coseno de n (n está en radianes).cosh cosh(n) Devuelve el coseno hiperbólico de n.exp exp(n) Devuelve el número e elevado a n.floor floor(n) Devuelve el entero inmediatamente inferior o

igual a n.ln ln(n) Devuelve el logaritmo neperiano de n (n>0).log log(m, n) Devuelve el logaritmo en base m de n. La base m

debe ser un número positivo distinto de 0 o 1. n también debe ser un valor positivo.

mod mod(m, n) Devuelve el resto resultante de dividir m entre n.

Lenguaje SQL Página 14/43

Page 15: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

Función Sintaxis Propósitopower power(m, n) Devuelve m elevado a la potencia n. La base m y

el exponente n pueden ser cualquier tipo de número, pero si m es negativo, n debe ser un entero.

round round(n[,m]) Devuelve n redondeado a m dígitos. Si se omite m el valor por defecto es cero. m puede ser negativo.

sign sign(n) Si n<0 retorna -1, si n=0 devuelve 0 y si n>0 retorna 1.

sin sin(n) Devuelve el seno de n.sinh sinh(n) Devuelve el seno hiperbólico de n.sqrt sqrt(n) Devuelve la raíz cuadrada de n. El valor de n

no puede ser negativo.tan tan(n) Devuelve la tangente de n.tanh tanh(n) Devuelve la tangente hiperbólica de n.trunc trunc(n[,m]) Devuelve n truncado a m decimales. Si se omite

m el valor por defecto es cero.

Funciones de caracteres

Funciones de manejo de caracteres que devuelven caracteres. Funciones de fila simple que aceptan como argumento de entrada un carácter y devuelven valores tipo carácter.

Función Sintaxis Propósitochr chr(n) Devuelve el carácter cuyo número ascii

correspondiente es n.concat concat(char1, char2) Devuelve char1 concatenado con char2. Es

equivalente al operador ‘¦¦’.initcap initcap(char) Devuelve la cadena con la primera letra de

cada palabra en mayúsculas, y el resto en minúsculas.

lower lower(char) Devuelve la cadena con todas las letras en minúsculas.

lpad lpad(char1,n[,char2]) Devuelve char1 rellenado a la izquierda, hasta completar la longitud indicada en n, con el carácter indicado en char2. Si char2 se omite rellena con blancos.

ltrim ltrim(char[,muestra]) Borra los caracteres a la izquierda de char, hasta encontrar el primer carácter que no este en muestra. Por defecto el valor de muestra es el carácter blanco.

replace replace(char, car_bus[, car_rep])

Para la cadena elegida, char, reemplaza car_bus por car_rep.

Lenguaje SQL Página 15/43

Page 16: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

Función Sintaxis Propósitorpad rpad(char1,n[,char2]) Devuelve char1 rellenado a la derecha hasta

la longitud indicada en n con la cadena indicada en char2. Si char2 se omite rellena con blancos.

rtrim rtrim(char[,muestra]) Borra los caracteres a la derecha de char hasta encontrar el primer carácter que no este en muestra. Por defecto muestra es un blanco.

substr substr(char, m[, n]) Devuelve una parte de char empezando en la posición indicada en m, y tomando el número de caracteres indicado en n.

translate translate(char, muestra1, muestra2)

Devuelve char con todas las caracteres que aparecen en muestra1 sustituidos por el correspondiente en muestra2.

upper upper(char) Devuelve la cadena char con todos los caracteres en mayúsculas.

Funciones de manejo de caracteres que devuelven números.

Funciones de fila simple que aceptan como argumento de entrada un carácter y devuelven valores numéricos.

Función Sintaxis Propósitoascii ascii(char) Devuelve la representación numérica en el

juego de caracteres que se utiliza en la base de datos de la cadena char. Si se utiliza ascii, en ascii, y si se utiliza ebcdic devolverá el valor ebcdic.

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

Busca en char1 la cadena indicada en char2, empezando a partir del carácter cuya posición es n, y nos devolverá la posición de la m-sima aparición. Por defecto m y n valen 1.

length length(char) Devuelve la longitud de char en caracteres, incluyendo los blancos.

Lenguaje SQL Página 16/43

Page 17: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

Funciones de fechas

Todas las funciones que operan con valores de tipo date devuelven valores de tipo fecha, a excepción de MONTHS_BETWEEN , que devuelve un número.

Función Sintaxis Propósitoadd_months add_months(f, n) Devuelve la fecha f mas n meses.last_day last_day(f) Devuelve la fecha del último día del mes

que contenga la fecha f. Se puede utilizar para determinar cuantos días quedan del mes.

months_between months_between(f1,f2)

Devuelve el número de meses transcurridos entre f1 y f2.

next_day next_day(f, char) Devuelve la fecha del primer día de la semana indicado en char, a partir de la fecha indicada en f.

Funciones de conversión

Sirven para convertir un tipo de dato en otro.

Función Sintaxis Propósitochartorowid chartorowid(char) Convierte una variable char de tipo de

dato char o varchar2 a tipo rowid. Para ello char debe respetar la representación rowid.

convert convert(char,des[,fuen])

Convierte char de un juego de caracteres fuen a un juego de caracteres des. Si se omite el juego de caracteres fuente, toma por defecto el de la base de datos.

hextoraw hextoraw(char) Convierte una cadena char que contiene un valor en hexadecimal a formato raw.

rawtohex rawtohex(raw) Convierte el valor raw a su equivalente hexadecimal.

rowidtochar rowidtochar(rowid) Convierte un tipo de datos rowid contenido en la variable rowid a tipo de datos varchar2. De la conversión resulta siempre una cadena de 18 caracteres de longitud.

to_char to_char(f[,formato]) Convierte una fecha f de tipo date, o un número f de tipo number, en un varchar2, utilizando la máscara indicada en formato.

to_date to_date(char[, formato])

Convierte una cadena char de tipo char o varchar2 en un valor tipo date. El formato es la máscara de la fecha. Si se omite toma el formato por defecto.

Lenguaje SQL Página 17/43

Page 18: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

Función Sintaxis Propósitoto_number to_number(char

[, formato])Convierte char, de tipo de dato char o varchar2, a un tipo number. to_number utiliza la mascara especificada en formato para conocer como será la entrada de datos.

Máscaras de formatos.

Formatos numéricos.

Deben proporcionarse las mascaras de conversión, en formato numérico, adecuadas cuando:

En una función to_char se cambia un tipo de dato number a un tipo de dato varchar2.

En una función to_number se cambia un tipo de dato varchar2 o char a number.

Los formatos numéricos están compuestos de uno o mas elementos de formatos. Dichos elementos son:

Elemento Ejemplo Descripción9 9999999 El número de nueves especifica la cantidad de

dígitos que se visualizan. Se visualizan blancos para los ceros a la izquierda.

0 099999 ó 999990 Visualiza los ceros a la izquierda en esa posición como ceros en vez de como blancos, o visualiza el valor 0, en lugar de blancos.

$ $99999 Antepone como prefijo el símbolo $.B B99999 Devuelve los ceros como blancos a menos que se

indique cero en la máscara de formato.MI 99999MI Visualiza el signo menos después de los valores

negativos. Para los valores positivos muestra un espacio en blanco.

S S99999 Muestra un mas (‘+’) para los valores positivos y un menos (‘-’) para los negativos en la posición indicada.

PR 99999PR Muestra los valores negativos entre los signos ‘<’ y ‘>’.

D 99999D999 Muestra el carácter decimal en la posición indicada. Separa la parte entera y fraccionaria de un número.

G 9G999 Muestra el separador de grupo en la posición indicada.

C C9999 Muestra el símbolo ISO de la moneda en la posición indicada.

Lenguaje SQL Página 18/43

Page 19: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

Elemento Ejemplo DescripciónL L9999 Muestra el símbolo de la moneda local en la

posición indicada., (coma) 9,999 Muestra una coma en la posición indicada.. (punto) 999.9 Muestra un punto en la posición indicada,

separando la parte entera de la decimal.EEEE 9.999EEEE Muestra el valor en notación científica.RN RN Devuelve en mayúsculas o minúsculas (rn) el valor

del número en notación romana. El número debe ser un entero entre 1 y 3999.

MI y PR solo pueden estar en la última posición de un formato numérico. El formato S solo puede estar en la primera o última posición.

Los caracteres que devuelven los formatos D, G, C, L son especificados por los siguientes parámetros de inicialización de la base de datos.

D Carácter Decimal NLS_NUMERIC_CHARACTERSG Separador Grupo NLS_NUMERIC_CHARACTERSC Símbolo Moneda ISO NLS_ISO_CURRENCYL Símbolo Moneda NLS_CURRENCY

Formatos tipo fecha.

Elemento SignificadoSCC ó CC Indica el siglo. Si se indica S, en las fechas de antes de Cristo

aparece el prefijo ‘-’.YYYY ó SYYYY Visualiza los cuatro dígitos del año. S antepone el prefijo ‘-’ para

las fechas anteriores a Cristo.IYYY Los cuatro dígitos del año en formato ISO estándar.YYY ó YY ó Y Los últimos 3, 2, o 1 dígito/s del año.IYY ó IY ó I Los últimos 3, 2, o 1 dígito/s del año en formato ISO estándar.Y,YYY El año con una coma (‘,’) en la posición indicada.SYEAR ó YEAR El número del año en letras. S antepone el prefijo ‘-’ para las

fechas anteriores a Cristo.RR Los últimos dos dígitos del año. Se utiliza para años de otros

siglos.BC o AD Indicador antes/después de Cristo.B.C. o A.D. Indicador antes/después de Cristo separado por puntos.Q Trimestre del año (Enero-Marzo = 1).MM Número de mes (Enero = 1).RM Número de mes en notación romana (Julio=VII).month Nombre del mes alineado con blancos hasta nueve caracteres de

longitud.mon Nombre del mes abreviado a tres letras.

Lenguaje SQL Página 19/43

Page 20: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

Elemento Significadoww Número de la semana del año.IW Número de la semana del año en ISO estándar.w Número de semana dentro del mes.ddd Número de día del año (1 a 366).dd Número de día del mes (1 a 31).d Número de día de la semana (1 a 7).day Nombre del día de la semana hasta nueve caracteres.dy Nombre del día de la semana abreviado.j Fecha en juliano. Los números especificados deben ser enteros.am ó pm Indicador del meridiano.a.m. ó p.m. Indicador del meridiano separado por puntos.hh ó hh12 Hora del día (1 a 12).hh24 Hora del día (0 a 23).mi Minutos (0 a 59).ss Segundos (0 a 59).sssss Segundos transcurridos desde medianoche (0 a 86399)

Las mascaras de formato year y syear devuelven el nombre del año siempre en inglés. Las especificaciones de algunos formatos (month, mon, day, dy, bc/ad, b.c./a.d., am/pm, a.m./p.m.) dependen del lenguaje utilizado en la base de datos indicados en los parámetros de inicialización:

NLS_DATE_LANGUAGE NLS_TERRITORY NLS_LANGUAGE

Otras funciones

Aquí listaremos las funciones de fila simple que no se engloban en ninguna categoría anterior.

Función Sintaxis Propósitodump dump(expr

[, formato])Devuelve un varchar2 conteniendo el código del tipo de dato al que corresponde expr, la longitud en bytes y la representación interna del dato. El argumento formato indica la notación en la que se visualiza el resultado. Formato puede tener los siguientes valores:

8 Devuelve el resultado en notación octal.

10 Devuelve el resultado en notación decimal.

16 Devuelve el resultado en notación hexadecimal.

17 Devuelve el resultado en formato carácter.

Lenguaje SQL Página 20/43

Page 21: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

Función Sintaxis Propósitogreatest greatest(expr

[, expr2]...)Devuelve el mayor valor de una lista de expresiones. Compara carácter a carácter. El tipo de datos siempre es varchar2.

least least(expr[, expr2]...)

Devuelve el menor valor de una lista de expresiones. Compara carácter a carácter. El tipo de dato es siempre varchar2.

nvl nvl(expr1, expr2) Indica el valor que ha de tener expr1 cuando en su contenido aparezcan nulos. El tipo de dato que retorna expr2 es siempre el mismo que tenga expr1.

vsize vsize(expr) Devuelve el número de bytes que ocupa la representación interna de expr.

decode decode(expr, val1, cod1, ..., valn, codn[, default])

Dentro de una expr evalúa los valores de la lista, val1 ... valn, y los cambia por el código correspondiente, cod1 ... codn. Si no se cumple ninguno podemos asignarle uno por defecto indicado en la expresión default.

Variables de entorno

Existe un grupo de variables, que aunque no forman parte de la sintaxis propia de sql en Oracle, forman parte del entorno de trabajo, y son frecuentemente utilizadas. Contienen normalmente datos acerca de la sesión actual.

Variable Sintaxis Propósitouid uid Devuelve un entero que es el identificador único

de el usuario conectado.user user Devuelve un varchar2 que contiene el nombre

del usuario conectado en la base de datos local.userenv userenv(opción) Devuelve información en un tipo de datos

varchar2 acerca de la sesión actual. El argumento opción puede tener los valores: LANGUAGE, devuelve el lenguaje y el territorio utilizado durante la sesión; SESSION, devuelve un identificativo de la sesión; TERMINAL, que devuelve el identificador del terminal utilizado.

sysdate sysdate Contiene la fecha del sistema.

Lenguaje SQL Página 21/43

Page 22: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

Funciones de grupo

Las funciones de grupo devuelven un resultado basado en un grupo de filas, mejor que sobre una fila solamente. Algunas funciones de grupo aceptan las siguientes opciones.

distinct Esta opción provoca que la función de grupo considere solamente los distintos valores de la expresión. También puede utilizarse sin funciones de grupo.

all Esta opción provoca que la función de grupo considere todos los valores recuperados, incluyendo duplicados. Es la opción por defecto.

Todas las funciones de grupo, excepto count(*) ignoran los valores nulos.

Veamos a continuación las principales funciones de grupo.

Función Sintaxis Propósitoavg avg([distinct¦all] n) Devuelve la media de n.count count({*¦[distinct¦all]

expr})Devuelve el número de filas en la consulta.

max max([distinct¦all] expr) Devuelve el valor máximo de expr.min min([distinct¦all] expr) Devuelve el valor mínimo de expr.stddev stddev([distinct¦all] n) Devuelve la desviación estándar de n.sum sum([distinct¦all] n) Devuelve la suma de los valores de n.variance variance([distinct¦all] n) Devuelve la varianza de n.

La cláusula group by

Se puede utilizar la cláusula group by para agrupar las filas seleccionadas y devolver una sola fila resumiendo la información solicitada. La selección de los conjuntos de filas se realizan para calcular propiedades de los conjuntos, basándose en los valores de las expresiones especificados en la cláusula group by.

Si la sentencia select contiene la cláusula group by, la lista de la select solo puede contener los siguientes tipos de expresiones:

constantes funciones de grupo expresiones idénticas a las que estarán en la cláusula group by. expresiones implícitas en las expresiones mencionadas en la select que

evalúen el mismo valor para todas las filas de un grupo.

Lenguaje SQL Página 22/43

Page 23: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

Las expresiones de la cláusula group by pueden contener cualquier columna de una tabla o vista mencionada en la clausula from, sin importar que estas columnas estén o no en la lista de la select.

Se puede utilizar la cláusula having para restringir el número de grupos de filas definidas en la cláusula group by que se visualizarán. El procesamiento de la sentencia es el siguiente:

1. Si la sentencia contiene la cláusula where, primero se filtran todas las filas que no satisfagan la condición where.

2. Se realizan los cálculos especificados y se forman los conjuntos de filas especificados en group by.

3. Solo se muestran los subconjuntos recuperados que satisfacen la cláusula having.

Combinaciones de Tabla. JOINS

Un join es una sentencia select que combina filas de dos o mas tablas. La cláusula where es la que determina como se realiza la combinación.

Si la cláusula where es inexistente o inadecuada puede realizarse un producto cartesiano, que combinará todas las filas de todas las tablas implicadas en la combinación.

El producto cartesiano genera un número de filas muy elevado. Por ejemplo si combino dos tablas de 100 filas cada una, y no establezco cláusula where, se generarán 10000 filas. Por lo tanto es conveniente seguir siempre un criterio de combinación.

Joins simples

El tipo de combinación mas utilizado es el denominado join simple, que devuelve filas de dos o mas tablas basándose en una condición de igualdad. El criterio de combinación es pues el establecido por el operador ‘=’.

Suponiendo que unimos dos tablas, la sintaxis básica sería la siguiente:select columnas de las tablas citadas en la cláusula from. Si existen

columnas con el mismo nombre en ambas tablas es conveniente anteponer el nombre de la tabla, o un alias de tabla temporal, al nombre de la columna.

from Tablas de las que se extrae información. Es recomendable asignar un alias temporal a cada tabla.

where Criterio de combinación de las tablas. Igualo las columnas que conceptualmente están relacionadas en las dos tablas. Por ejemplo:

tabla1.columna = tabla2.columna

Lenguaje SQL Página 23/43

Page 24: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

Se pueden seleccionar todas las columnas de ambas tablas. No es necesario que las columnas mencionadas en el criterio de combinación sean seleccionadas.

Outer Joins

El outer join o combinación externa amplifica el resultado de una combinación simple (join normal). Un outer join recupera TODAS las filas de la combinación externa y también aquellas que no encuentren su correspondiente fila pareja de una tabla a otra.

La sintaxis es:select col1, col2, ..., colnfrom tabla1, tabla2, ...where tabla1.col1 = tabla2.col1 (+)

El símbolo (+) debe situarse en el predicado de combinación al lado de la columna o columnas pertenecientes a la tabla en la que puede que haya ausencia de valor.

La Sentencia SELECT: Subconsultas

Una subconsulta es una modalidad de select que aparece dentro de otra sentencia SQL. A las subconsultas a veces se las denomina consultas anidadas o subselects. La sentencia que contiene una subconsulta es denominada consulta padre. Las filas que devuelve la subconsulta son utilizadas por la consulta padre.

La sintaxis es:select col1, col2, ..., colnfrom tabla1, tabla2where valor operador (select ...

from ... where ...)

Las subconsultas pueden utilizarse para varios propósitos: Para definir el conjunto de filas que se desea insertar en la tabla destino en

una sentencia insert o create table. Para definir el conjunto de filas que se desea seleccionar en una sentencia

create view. Para definir uno o mas valores a asignar en las filas existentes en una

sentencia update ... set. Proporcionar valores para condiciones en las cláusulas where y having de

las sentencias select, update y delete.

No hay limite en el nivel de anidaciones de consultas.

Lenguaje SQL Página 24/43

Page 25: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

La Sentencia INSERT

El propósito de la sentencia insert es añadir filas a una tabla o vista.

Como requisitos para añadir filas en una tabla, la tabla debe ser propiedad del usuario que intenta realizar la inserción o bien tener privilegio de insert sobre ella.

La sintaxis es:

esquema Nombre del propietario de la tabla o vista donde se desea realizar la inserción. Si se omite se presupone que la tabla es propiedad del usuario que realiza la inserción.

tabla o vista Nombre de tabla o vista donde se realiza la inserción.columna Columna/s sobre la/s que se desea realizar la inserción. Si se

omiten los nombres y el orden de las columnas, se espera que se inserten valores para todas las columnas de la tabla o vista y el orden en que fue creada.

VALUES Especifica un valor para la fila que se desea insertar.subconsulta Especifica que la inserción está basada en una sentencia

SELECT. En la sentencia SELECT deben recuperarse el mismo número de columnas y en el mismo orden que se especificó en la sentencia INSERT.

La Sentencia UPDATE

El propósito de la sentencia update es cambiar los valores existentes en una tabla o vista.

Como requisitos para actualizar filas de una tabla, la tabla debe ser propiedad del usuario que intenta realizar la actualización, o bien tener privilegio de UPDATE sobre ella.

Lenguaje SQL Página 25/43

Page 26: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

La sintaxis es:

esquema Nombre del propietario de la tabla o vista donde se desea realizar la inserción. Si se omite se presupone que la tabla es propiedad del usuario que realiza la actualización.

tabla o vista Nombre de tabla o vista donde se realiza la actualización.columna Columna/s sobre la/s que se desea realizar la actualización. Si

se omiten el nombre y el orden de alguna columna de la tabla/vista, esta permanecerá inalterable.

subconsulta Especifica que la sentencia SELECT devolverá los valores nuevos que se asignarán a la columna correspondiente.

WHERE Precede e indica la condición que deben cumplir las filas que se desea actualizar. Si se omite se actualizan todas.

La Sentencia DELETE

El propósito de esta sentencia es borrar filas de una tabla o vista. Más adelante hablaremos de las sentencias DROP y TRUNCATE.

Como requisitos para borrar filas de una tabla, la tabla debe ser propiedad del usuario que intenta realizar el borrado o bien tener privilegio de DELETE sobre ella.

La sintaxis es:

esquema Nombre del propietario de la tabla o vista donde se desea realizar la inserción. Si se omite se presupone que la tabla es propiedad del usuario que realiza el borrado de las filas.

Lenguaje SQL Página 26/43

Page 27: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

tabla o vista Nombre de tabla o vista donde se realiza el borrado de las filas.

WHERE Sirve para indicar la condición que deben cumplir las filas que se desean borrar. Si se omite se borran todas. Esta cláusula admite subconsultas.

El Lenguaje de Definición de Datos

El lenguaje DDL pertenece al lenguaje SQL y nos permite crear, modificar, renombrar y borrar objetos dentro de la Base de Datos. Hasta ahora sólo habíamos manipulado objetos ya creados previamente.

Para poder ejecutar los comandos que veremos a continuación es necesario tener una serie de privilegios, que el administrador de la Base de Datos ha debido concedernos previamente.

Sentencias DDL

Las sentencias de lenguaje de definición de datos mas importantes son:CREATE La sentencia CREATE permite al usuario que la ejecuta crear

un objeto (tabla, vista, sinónimo procedimiento, paquete, disparador, usuario, rol, perfil, etc.). (*)

ALTER La sentencia ALTER permite al usuario que la ejecuta modificar la estructura de un objeto previamente creado.

DROP La sentencia DROP permite al usuario que la ejecuta eliminar un objeto (no sólo las filas) de la base de datos.

RENAME Permite al usuario que la ejecuta modificar el nombre de un objeto.

TRUNCATE Permite al usuario que la ejecuta borrar todas las filas de una tabla o índice. Tiene ciertas diferencias con DELETE o DROP que veremos próximamente.

Veamos a continuación con mas detalle algunas de ellas aplicadas a los objetos básicos.

(*) Nota Importante: Previamente se ha indicado que estos comandos pueden afectar a numerosos objetos. En este manual nos centraremos en la definición de tablas, índices, vistas y sinónimos.

Lenguaje SQL Página 27/43

Page 28: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

La sentencia CREATE TABLE

Permite crear una tabla, que es la estructura básica de una base de datos.

En el momento de la creación de la tabla se puede especificar la siguiente información:

Definiciones de columnas ( nombres, tipos de datos y longitud). Restricciones de integridad. Características de almacenamiento de objeto. Donde se almacena y cuanto

ocupa. Si la tabla se forma partiendo de una sentencia select.

La sintaxis es:

Integridad de datos

Antes de definir una tabla debemos tener en cuenta ciertos aspectos acerca de la información a almacenar, que nos evita tener que programar de forma redundante ciertas comprobaciones.

Lenguaje SQL Página 28/43

Page 29: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

La declaración de restricciones de integridad nos ayuda a definir ciertas características de la tabla. Por ejemplo, si una columna puede estar vacía o no, si puede contener valores duplicados, si esta relacionada con alguna columna de otra tabla, etc.

La integridad de datos es, por lo tanto, asegurarse que los datos en las tablas se ajustan a una serie de regla predefinidas.

Las condiciones se cumplen en todas las transacciones, y desde todas las herramientas y programas.

Se definen una sola vez y no necesitan mantenimiento especial.

Conceptos de integridad que se pueden definir: reglas negocio integridad de entidades integridad referencial

Reglas de negocio

Específicas de cada área de negocio. Por ejemplo, solo cuando se venden diez productos o mas hay derecho a descuentos.

Integridad de entidades

Reglas a las que deben ajustarse las columnas de mis tablas. Pueden definirse las siguientes:

Primary Key. Identificador único de una fila en una tabla. Solo puede haber una por tabla, pero puede estar compuesto por mas de una columna. Se utiliza de forma habitual para ser referenciada desde otra tablas. Al definir una columna como clave primaria, de forma implícita se crea un índice asociado y la columna quedará definida como única y obligatoria. Por ejemplo el código de un producto es su identificativo en la tabla de los productos, y además le ayuda a relacionarse con la tabla que contiene los precios de los productos, o con la de almacén que contiene la cantidad de un producto que nos queda en stock.

Lenguaje SQL Página 29/43

Page 30: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

Not null. La columna a la que se aplique esta restricción debe contener valores. Por ejemplo la columna número de identificación fiscal de la tabla facturas.

Unique. No puede haber mas de dos filas con el mismo valor en aquella/s columna/s que tengan dicha restricción. Puede ser simple o estar compuesta por varias columnas. A diferencia de la clave primaria, no es obligatoria, y además puede haber mas de una por tabla. Si se quiere trabajar bajo normativa ANSI/ISO la columna que lleve esta restricción deberá tener adicionalmente la restricción not null. Por ejemplo una restricción de unicidad sobre el código de una película y el número de copia en la tabla prestamos de videos.

Check. Restricción que realiza un filtro sobre las filas que no cumplan la condición impuesta. Es similar a la cláusula where, pero se implementa en la definición del objeto. No puede incluir subconsultas ni variables o pseudocolumnas (user, sysdate, etc.). Por ejemplo comprobar que el precio de un producto es mayor que cero.

Integridad referencial

Es la que determina las relaciones existentes entre los objetos. Por ejemplo existe una relación entre las tablas cabecera de facturas y líneas de factura.

Primary Key Identificador único de una fila en una tabla. Hemos visto anteriormente que este concepto pertenece a la integridad de entidades.

Foreign Key Columna normalmente asociada a una clave primaria o única de otra tabla, o de la misma tabla (denominado autoreferencia). Puede haber tantas como se desee por tabla. Su valor puede ser nulo o el valor de la clave referenciada. Garantiza consistencia de relaciones entre los datos. Por ejemplo toda línea de factura debe pertenecer a una cabecera de factura.

Estableciendo estas relaciones entre claves ajenas (foreign key) y primarias (primary key) logramos:

Evitar borrados, inserciones o actualizaciones no deseados. Por ejemplo no se puede borrar una factura (cabecera de factura) que tenga líneas de factura. No se puede dar de alta una línea de factura sin su correspondiente cabecera. No se puede actualizar el identificativo de una línea de factura.

Propagar modificaciones. Lo contrario a lo anterior. Se pueden definir acciones de borrado en cascada. Por ejemplo si se borra una cabecera de factura que se borren las correspondientes líneas.

Lenguaje SQL Página 30/43

Page 31: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

Existe una facilidad adicional, la especificación DEFAULT, que no es una restricción en si, pero que proporciona la posibilidad de indicar un valor por defecto a columnas que no se mencionan en un insert. Admite pseudocolumnas como user, uid o sysdate. Por ejemplo, la fecha de emisión de una factura es una columna tipo date, y si no se le indica un valor explícitamente, tendrá el de la fecha del sistema (sysdate).

La sentencia create table se utiliza para establecer todas las relaciones y reglas anteriormente citadas. Es la llamada sintaxis declarativa.

Nombres de las restricciones

Es un nombre único, definido bien por el propietario del objeto o por el sistema. Si lo define el propietario del objeto, en el momento de definir la restricción debe ir precedido de la palabra constraint.

Si no se asigna en el momento de la creación el sistema generará uno por defecto, SYS_C000n. Por ejemplo, en el caso de la restricción not null, es muy comun, por herencia de anteriores versiones de Oracle, realizar la declaración de la restricción sin indicar la palabra constraint ni darle un nombre, por lo en el diccionario de la base de datos se almacenara como, por poner un caso, sys_c0015 si es la decimoquinta declaración que realizamos sin asignar ningún nombre de restricción. Sera sys_c0016 para la siguiente, y asi con todas.

Es importante utilizar una metodología adecuada en la asignación de nombres a las restricciones, puesto que no admite duplicados, es decir, un nombre de restricción no puede aparecer dos veces dentro del mismo usuario o esquema. Por ejemplo una sintaxis adecuada para dichos nombres es:

CodigoRestriccion_NombreTabla_NombreColumna

Donde el código de restricción es:PK Primary KeyFK Foreign KeyNN Not NullUK Unique KeyCK Check

El nombre de la restricción aparecerá en los mensajes de error, en la documentación, al activarla y desactivarla temporalmente o para borrarla.

La información acerca de las restricciones definidas por el usuario, y sobre que columnas están definidas, se encuentran en las siguientes tablas del diccionario de datos:

user_constraints

user_cons_columns

Lenguaje SQL Página 31/43

Page 32: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

Como definir una restricción

Hay dos formas de definir restricciones: Asociadas a columna o asociadas a tabla.

La sintaxis para la definición de una restricción a nivel de columna es:

Definir una restricción asociada a columna significa que la restricción va a continuación del nombre de la columna, del tipo de dato y la precisión. En este caso, no es obligatorio darles un nombre con la palabra clave constraint, pero se generará uno por defecto, como hemos indicado anteriormente.

La sintaxis para la definición de restricciones a nivel de tabla es:

Lenguaje SQL Página 32/43

Page 33: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

Definir una restricción asociada a tabla significa que la restricción va antes o después de empezar a definir las columnas. En este caso es obligatorio preceder la restricción con la palabra clave constraint, para que el gestor distinga entre lo que es la definición de la columna o la declaración de la restricción. Al definir una restricción asociada a tabla hay que indicar a que columna de la tabla se aplica la restricción, puesto que no está a continuación de la definición. En ciertos casos, como cuando una clave primaria está compuesta de varias columnas, o cuando una restricción se añade a posteriori, es obligatorio definirlas asociadas a tabla.

La clausula references nos permite especificar en una constraint de tipo foreign key el nombre de la tabla a la que queremos referenciar, asi como la columna de la que depende nuestra foreign key. Dicha columna debe estar declarada como primary key en la tabla a la que referenciamos.

Para las clausulas primary key y unique es posible especificar las clausulas de almacenamiento del indice que se crea asociado a la clave, indicar el tablespace donde se almacenara, y otras clausulas adicionales de como distribuir el espacio de almacenamiento.

La sentencia CREATE INDEX

Los índices se utilizan para acceder mas rápidamente en lectura a un dato. Para que una columna se indexe debe cumplir ciertos requisitos:

Ser consultada con frecuencia. No sufrir alteraciones de operadores o funciones cuando se consulta. Contener un volumen importante de información. Tener muchos valores diferentes.

Los índices pueden ser simples o compuestos de varias columnas.

Los índices pueden ser únicos o no. Si un índice se define como único, significa que no puede contener valores repetido.

Recordar que las restricciones unique y primary key llevan implícita la creación del índice, y en ambos casos es único.

Lenguaje SQL Página 33/43

Page 34: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

La sintaxis de la sentencia es:

La sentencia CREATE SYNONYM

Un sinónimo es un nombre alternativo a una tabla, vista o procedimiento almacenado. A diferencia del alias, el sinónimo no es temporal, y permanece hasta que es borrado.

Independientemente de la creación del sinónimo es necesario tener acceso al objeto sobre el que se desea crear dicho sinónimo, o bien ser su propietario.

Existen dos tipos de sinónimos: públicos o privados. Los públicos están accesibles por cualquier usuario de la base de datos, y para crearlos se necesita el privilegio CREATE PUBLIC SYNONYM. Los privados son accesibles solo para aquel usuario que lo crea, y se necesita el privilegio CREATE SYNONYM.

La sintaxis de la sentencia es:

Lenguaje SQL Página 34/43

Page 35: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

La sentencia CREATE VIEW

Una vista es una tabla lógica basada en una o varias tablas. La tabla no se crea físicamente, sino que lo que se almacena es la sentencia select de creación de la vista.

Cuando se recuperan filas de una vista, ocurre que se accede a la sentencia select que la compone, y que se encuentra almacenada y se ejecuta dicha sentencia.

La sintaxis es:

or replace Recrea la vista si ya existe. Esto permite cambiar la definición de la vista sin tener que borrarla y volver a crearla.

force Crea la vista incluso si hay problemas de acceso por insuficientes privilegios a los objetos de la subconsulta en que se basa la creación de la vista.

noforce Es la opción por defecto y no crea la vista si se producen errores en la definición.

with check option Si la vista permite inserciones, comprobará la condición where impuesta, no solo en el momento de componer la vista, sino también a la hora de realizar inserciones sobre ella.

Sobre una vista no existen restricciones en consulta, pero si en actualización inserción y borrado. Si se cumplen las condiciones impuestas la actualización, inserción o borrado se lleva a cabo sobre la tabla base sobre la que se definió la vista.

Para que una vista sea actualizable (permita update) ninguna de las columnas que forman la vista puede estar modificada por una expresión. Por ejemplo substr(campo,1,n).

Lenguaje SQL Página 35/43

Page 36: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

Para que la vista permita inserciones (permita insert into) la vista en su definición debe contener todas las columnas obligatorias de la tabla que la forma.

Para que la vista permita borrado de filas (permita delete) la vista debe estar creada sobre una sola tabla (no admite joins). No puede incorporar cláusulas distinct ni group by. No puede ser definida con funciones de grupo ni pseudocolumnas (user, sysdate, rowid, sum(campo)).

La sentencia ALTER TABLE

La sentencia alter table permite modificar la estructura de una tabla para: Añadir columnas a una tabla ya creada. Modificar el tipo de dato o la precisión de una columna. Añadir, activar o desactivar temporalmente y borrar restricciones de

integridad referencial sobre la tabla.

La sintaxis es:

Lenguaje SQL Página 36/43

Page 37: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

Añadir restricciones

Se pueden añadir restricciones de integridad referencial a posteriori. En el momento que se añade, se bloquea toda la tabla y se produce la comprobación de la restricción que se desea incorporar. Si alguna fila no la cumple, la restricción no se añade.

La sintaxis para añadir restricciones una vez creada la tabla es similar a la de las restricciones asociada a tabla. Esto significa que se debe indicar tras el comando alter table la palabra clave constraint, seguida del nombre del constraint, y luego el tipo de restricción a aplicar y por último sobre que columna de la tabla se desea aplicar dicha restricción.

Desactivar restricciones

El desactivar una restricción permite que dicha restricción no se compruebe temporalmente. No es igual que borrar la restricción.

Es la forma de incrementar la velocidad en cargas de datos masivas.

La herramienta de carga masiva de Oracle (loader) deshabilita automáticamente, con su método directo DIRECT PATH, las restricciones.

Cuando se intenta desactivar una clave primaria (primary key) o clave única (unique key), que pueden ser referenciadas, hay que desactivar en primer lugar las claves ajenas (foreign key) que le referencian o utilizar la cláusula disable cascade.Al desactivar una clave primaria o única también se destruyen los índices asociados.

Activar restricciones

Activa la comprobación de la restricción. En el momento de la creación de una restricción se activa, a no ser que se indique la cláusula disable.

Cuando se activa posteriormente: Bloquea la tabla completa, hasta que se termine la comprobación. Comprueba una a una las filas. Si alguna de las filas no cumple la restricción, no podrá llegar a activarse.

Al habilitar una clave primaria o única se vuelven a construir los índices asociados.

Lenguaje SQL Página 37/43

Page 38: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

Excepciones a la activación de restricciones

Cuando se intenta activar una restricción y no se puede, por cada fila que no cumpla la restricción se puede guardar en una tabla, creada previamente, la siguiente información:

rowid nombre de restricción que no se cumple nombre de la tabla en la que se encuentra la restricción usuario propietario de la tabla

La tabla, denominada exceptions, se ha creado previamente en sqlplus utilizando un fichero que se encuentra en la instalación y se denomina utlexcpt.sql, y cuyo contenido es el siguiente, de forma que lo podemos crear nosotros mismos:

create table exceptions (row_id rowid,constraints varchar2(30),owner varchar2(30),table_name varchar2(30))

/

La tabla sobre la cual se han definido las restricciones y no pueden activarse, puede actualizarse a partir de los resultados almacenados en la tabla exceptions.

Borrar restricciones

Así como podemos desactivar y activar las restricciones, podemos eliminarlas (con la clausula drop) definitivamente de la tabla.

La sentencia DROP TABLE

La sentencia drop table nos permite borrar el contenido y la definición de una tabla. Para poder eliminar una definición de tabla es necesario que las tablas dependientes de la tabla que queremos eliminar hayan sido ya eliminadas previamente.

La sintaxis es:

Lenguaje SQL Página 38/43

Page 39: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

La sentencia DROP INDEX

Se puede eliminar un índice de una tabla utilizando la sentencia drop index. Con ella eliminamos solo el índice, y no los datos de la tabla que están indexados.

La sintaxis es:

A partir del momento de eliminación del índice, las columnas afectadas ya no están indexadas. Con la sentencia drop index es indiferente que el índice sea único o no.

La información acerca de los índices esta almacenada en el diccionario de la base de datos. Las tablas que contienen dicha información son:

user_indexes

user_ind_columns

Para borrar un índice se debe ser propietario de la tabla en la que están asociados los índices, o tener el privilegio DROP ANY INDEX.

La sentencia DROP SYNONYM

Se puede borrar un sinónimo sobre una tabla, procedimiento, vista, databaselink, etc., utilizando en la sentencia drop synonym.

La sintaxis:

Con la utilización de esta sentencia no se borra el objeto, sino solamente el alias permanente del objeto.

La información referente a sinónimos se encuentra en las siguientes tablas: user_synonyms

all_synonyms

Para borrar un sinónimo basta con ser el propietario, es decir, haber creado dicho sinónimo. En el caso de que el sinónimo que se desea borrar sea publico, es necesario tener el privilegio DROP PUBLIC SYNONYM.

Lenguaje SQL Página 39/43

Page 40: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

La sentencia RENAME

La sentencia rename cambia el nombre de un objeto (tabla, procedimiento, vista, etc.) por otro de forma permanente.

La sintaxis es:

La información sobre los objetos de un usuario se encuentra en el diccionario en la vista:

user_objects

Para renombrar un objeto se debe ser propietario del mismo.

La sentencia TRUNCATE

La sentencia truncate borra filas de una tabla o índice, sin eliminar la estructura del objeto. Es similar a delete, pero no hay posibilidad de deshacer la transacción (rollback), ni de hacer un borrado restrictivo (cláusula where).

La sintaxis es:

Para truncar un objeto se debe ser propietario del mismo, o tener el privilegio DELETE ANY TABLE.

La opción drop storage libera el espacio que el objeto ha tomado a la base de datos.

La opción reuse storage mantiene reservado el espacio previamente adquirido para dicho objeto.

Al truncar una tabla se truncan de forma implícita los índices de dicha tabla.

Lenguaje SQL Página 40/43

Page 41: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

El Lenguaje de Control de Datos

Este sublenguaje permite controlar los permisos y privilegios que tiene cada usuario que accede a la base de datos.

Cada usuario Oracle tiene un nombre y una clave de acceso, y posee sus propias tablas, vistas y otros objetos o recursos que cree. Un role Oracle es un conjunto de privilegios (o tipo de acceso que cada usuario requiere según sus responsabilidades o estatus). Se pueden asignar privilegios específicos a los roles, y a continuación asignar dichos roles a los usuarios adecuados. Un usuario puede conceder privilegios a otros usuarios.

Los privilegios de sistema de base de datos permiten ejecutar un conjunto concreto de ordenes. El privilegio CREATE TABLE permite crear tablas, el privilegio GRANT ANY PRIVILEGE permite conceder cualquier privilegio de sistema.

Los privilegios de objetos de la base de datos permiten realizar ciertas operaciones sobre varios objetos. El privilegio DELETE permite borrar filas de las tablas y vistas. El privilegio SELECT permite consultar tablas.

Un usuario con permiso de sistema CREATE ROLE puede conjuntar privilegios en varios roles, para así distribuir mejor el acceso a los datos desde otros usuarios.

La sentencia CREATE ROLE

Esta sentencia nos permite crear un identificador de conjunto de privilegios. La sintaxis es:

role Es el nombre que le queremos dar al conjunto de privilegios.not identified Cuando un usuario activa la utilización de un role no es

necesario validar dicha activación.identified indica que se debe validar la activación, bien mediante una

clave (by password), bien por la clave de conexión externa (externally).

Lenguaje SQL Página 41/43

Page 42: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

La sentencia GRANT

Esta sentencia nos permite asignar privilegios a roles o a usuarios, y también roles a usuarios. Veamos a continuación la sintaxis para cada uno de estos dos casos.

Asignación de privilegios a roles y usuarios. La sintaxis es:

donde:system_priv Cualquier privilegio de sistema.role Conjunto de privilegios.with admin option Permite que el receptor de los privilegios pueda asignarlos

a otros usuarios.

Para asignar privilegios sobre objetos a usuarios o roles utilizaremos la sintaxis:

donde:object_priv Indica cualquier privilegio de objetos.column Indica las columnas sobre las que queremos dar

privilegios.with grant option Indica que el usuario que recibe el permiso puede darlo a

otros usuarios.

Lenguaje SQL Página 42/43

Page 43: Manual SQL

Programador/a de Sistemas de Bases de Datos Relacionales

La sentencia REVOKE

Esta sentencia permite quitar privilegios o roles a usuarios y roles, de forma que ya no dispongan o puedan hacer uso de dichos privilegios.

La sintaxis para privilegios de sistema y roles es:

Y para privilegios de objetos es:

donde:object Indica el objeto sobre el que queremos quitar

privilegios.from Es la cláusula que nos indica a quien queremos quitar

dichos privilegios.cascade constraints Especifica que los privilegios que haya utilizado el

usuario o role para referenciar nuestro objeto también sean revocados (por ejemplo cuando se activa una foreign key sobre una tabla de otro usuario).

Lenguaje SQL Página 43/43