Tipos de datos en Oracle
Los tipos de datos soportados por Oracle se agrupan en los siguientes conjuntos.
Tipos de Datos Oracle
|
Alfanuméricos |
Numéricos |
Fecha |
Binarios |
Otros |
|
CHAR |
NUMBER |
DATE |
RAW |
ROWID |
|
VARCHAR2 |
FLOAT |
LONG RAW |
||
|
VARCHAR |
BLOB |
|||
|
NCHAR |
CLOB |
|||
|
NVARCHAR2 |
NLOB |
|||
|
LONG (Obs.) |
BFILE |
Los valores alfanuméricos van encerrados entre comilla simple: 'Alfanumérico' Los valores numéricos son número simples: 123 Las fechas van encerradas entre comillas simples: '1/12/2000' Los valores binarios no pueden ser representados (son fotos, videos…)
Tipo de dato CHAR(b)
Almacena cadenas de caracteres de longitud fija, desde 1 a 2.000 bytes de ocupación. El número de caracteres que se pueden almacenar se rige según la siguiente fórmula.
nº caracteres = bytes / character set
Para ASCII, el conjunto de caracteres ocupa un byte, por lo que coincide el número de caracteres máximos con la ocupación del tipo de dato. Si se introduce un valor de 10 caracteres en un campo de CHAR(100), se tendra que rellenar con 90 posiciones restantes.
Así la siguiente expresión es cierta: 'Hola pepe' = 'Hola pepe '
Si se intenta introducir un valor demasiado grande para el campo, se intentará eliminar los espacios finales, y si cabe sin espacios, se introduce. Si aún así no cabe, se retorna un error.
Tipo de dato VARCHAR2(b)
Almacena cadenas de caracteres de longitud variable. Si se define una columna de longitud 100 bytes, y se introduce en ella un valor de 10 bytes, la columna ocupará 10 y no 100 como hacía con el tipo de dato CHAR.
Tipo de dato VARCHAR(b)
En Oracle es equivalente a VARCHAR2, en futuras versiones permitirá distintos criterios de comparación.
Tipo de dato NCHAR(b)
Almacena un valor alfanumérico de longitud fija con posibilidad de cambio de juego de caracteres. Puede almacenar tanto caracteres ASCII, EBCDIC, UNICODE…
Tipo de dato NVARCHAR2(b)
Almacena un valor alfanumérico de longitud variable con posibilidad de cambio de juego de caracteres. Puede almacenar tanto caracteres ASCII, EBCDIC, UNICODE…
Tipo de dato NUMBER(p,s)
Almacena valores numéricos en punto flotante que pueden ir desde 1.0 x 10-130 hasta 9.9…(38 nueves)… 9 x 10125 . El almacenamiento interno de los valores numéricos en notación científica:
Mantisa x 10exponente
La mantisa puede contener cualquier número, entero o decimal, positivo o negativo. El exponente podrá contener cualquier número entero, positivo o negativo. El parámetro p indica la precisión (número de dígitos contando los decimales) que contendrá el número como máximo. Oracle garantiza los datos con precisiones de 1 a 38. El parámetro s indica la escala, esto es, el máximo de dígitos decimales. Hay que tener en cuenta que una columna definida NUMBER(10,5), podrá contener como máximo cualquier número siempre y cuando el número de dígitos enteros más el número de dígitos decimales no supere 10 (y no 15). La escala puede ir de -84 a 127. Para definir número enteros, se puede omitir el parámetro s o bien poner un 0 en su lugar. Se puede especificar una escala negativa, esto lo que hace es redondear el número indicado a las posiciones indicadas en la escala. Por ejemplo un número definido como NUMBER(5,-2), redondeará siempre a centenas. Así si intentamos introducir el valor 1355, en realidad se almacenará 1400.
Tipo de dato FLOAT(b)
Almacena un número en punto decimal sin restricción de dígitos decimales.
El parámetro b indica la precisión binaria máxima que puede moverse en el rango 1 a 126. Si se omite el defecto será 126. Una columna FLOAT(126) es equivalente a una columna NUMBER(38), aunque la diferencia está en que la columna NUMBER no podrá contener decimales y la columna FLOAT si y con cualquier escala.
Tipo de dato DATE
Almacena un valor de fecha y hora.
Para un tipo de dato DATE, Oracle almacena internamente los siguientes datos:
El formato por defecto de las fechas es: 'DD-MON-YYYY' Esto es:
Dos dígitos para el día Las tres primeras siglas del mes (depende del idioma instalado). Cuatro dígitos para el año.
Por ejemplo:
'1-JAN-2001' '2-DEC-1943'
Este formato puede ser alterado en cualquier momento.
Internamente un fecha se almacena como el número de días desde cierto punto de inicio (por ejemplo el año 0). Esto permite que las fechas puedan ser tratadas en operaciones aritméticas normales:
'1-JAN-2001' + 10 = '11-JAN-2001' '1-JAN-2000' - 1 = '31-DEC-1999' '10-MAY-2000' - '1-MAY-2000' = 9
Tipos de datos binarios
Permiten almacenar información en formato "crudo", valores binarios tal y como se almacenan en el disco duro o como residen en memoria. Estas columnas se pueden utilizar tanto para almacenar grandes cantidades de datos (hasta 4Gb.), como para almacenar directamente cualquier tipo de fichero (ejecutables, sonidos, videos, fotos, documentos Word, DLLs…) o para transportar datos de una base de datos a otra, ya que el formato binario es el único formato común entre cualquier sistema informático.
Tipo de dato LONG (Obsoleto)
Almacena caracteres de longitud variable hasta 2 Gb. Este tipo de dato se soporta para compatibilidad con versiones anteriores. En Oracle y siguientes versiones de debe usar los tipos de datos CLOB y NLOB para almacenar grandes cantidades de datos alfanuméricos.
Tipo de dato ROWID
Representa una dirección de la base de datos, ocupada por una única fila. El ROWID de una fila es un identificador único para una fila dentro de una base de datos. No hay dos filas con el mismo ROWID. Este tipo de dato sirve para guardar punteros a filas concretas.
Lenguaje estructurado de consultas SQL (DML)
SQL es un conjunto de sentencias u órdenes que todos los programas y usuarios deben utilizar para acceder a bases de datos Oracle. No hay otra manera de comunicarse con Oracle si no es a través de SQL. Dado que SQL es un estándar, todas las bases de datos comerciales de la actualidad utilizan SQL como puente de comunicación entre la base de datos y el usuario.
Historia
SQL nació como a partir de una publicación de 1970 escrita por E.F. Cood, y titulada "A relational model of data for large shared data banks" (El modelo de datos relacionales para grandes bancos de datos compartidos). IBM utilizó el modelo planteado por Codd para desarrollar un lenguaje capaz de soportar el recién nacido modelo relacional y así apareció SEQUEL (Structured English QUEry Language). SEQUEL más tarde se convirtió en SQL (Structured Query Language) que continuó pronunciándose en inglés como su predecesor: SEQUEL. En 1979, una desconocida empresa llamada Relational Software, sacó por sorpresa al mercado la primera implementación comercial de SQL. Relational Software más tarde pasó a llamarse Oracle. Después de 20 años, SQL todavía es (y será) siendo el estándar en lenguajes de acceso a base de datos relacionales.
En 1992, ANSI e ISO (organizaciones que se encargan de establecer estándares de todo tipo), completaron la estandarización de SQL y se definió un conjunto de sentencias básicas que debía tener toda implementación para ser llamada estándar. Este SQL se le denominó ANSI-SQL o SQL92.
Hoy en día todas las bases de datos comerciales cumplen el estándar ANSI, aunque cada fabricante añade sus mejoras al lenguaje SQL.
SQL como lenguaje estructurado
En realidad SQL no es un lenguaje en si, como podría ser un lenguaje de programación de 3ª generación (C, Pascal…), sino que en un sublenguaje orientado a acceso y manipulación de base de datos relacionales. Con SQL como única herramienta sólo podemos acceder a las bases de datos, pero no tenemos las estructuras típicas de un lenguaje de programación. Una buena analogía podría ser un sistema operativo. El interfaz de comandos de un SO nos da todo lo que necesitamos para acceder al sistema de ficheros, pero sólo podemos hacer eso, acceder a ficheros. SQL actúa de la misma manera, nos da todo lo que necesitamos para acceder a bases de datos, pero no podemos hacer más.
Se dice que SQL es estructurado porque trabaja con conjuntos de resultados (result set)
abstractos como unidades completas.
Un conjunto de resultados es el esquema básico de una tabla: N filas x N columnas. Este esquema se trata como un todo y es la idea principal de SQL. A la hora de recuperar un conjunto de resultados, éste se trata de la misma forma tenga el número de filas que tenga (0-N) y tenga el número de columnas que tenga (1-N). Además SQL es consistente, esto significa que los "estilos" de las distintas sentencias son uniformes, por lo que el aprendizaje es rápido.
Operadores SQL
Ya hemos visto anteriormente qué tipos de datos se pueden utilizar en Oracle. Y siempre que haya datos, habrá operaciones entre ellos, así que ahora se describirán qué operaciones y con qué operadores se realizan:
Los operadores se pueden dividir en dos conjuntos:
Aritméticos: utilizan valores numéricos
Lógicos (o booleanos o de comparación): utilizan valores booleanos o lógicos.
Concatenación: para unir cadenas de caracteres.
Operadores aritméticos:
Retornan un valor numérico
|
Símbolo |
Significado |
Ejemplo |
|
+ |
Operación suma |
1 + 2 |
|
- |
Operación resta |
1 - 2 |
|
* |
Operación multiplicación |
1 * 2 |
|
/ |
Operador división |
1 / 2 |
Operadores lógicos:
Retornan un valor lógico (verdadero o falso)

Existen los siguientes comodines:
) _: Un solo carácter¥%: Conjunto de N caracteres (de 0 a
Ejemplo:
Las siguientes condiciones retornan TRUE
'significado LIKE 's_gn%fi%d_'
'pepe' LIKE 'pep%' (todos los que empiecen por 'pep')
'pepote' LIKE 'pep%'
'pepote' LIKE 'pe%te' (todos los que empiecen por 'pe' y terminen por 'te')
'pedrote' LIKE 'pe%te'
Operador de concatenación:
Retornan una cadena de caracteres
|
Símbolo |
Significado |
Ejemplo |
|
| |
Concatena una cadena a otra |
'juan' || 'cito' ['Juancito'] |
Oracle puede hacer una conversión automática cuando se utilice este operador con valores numéricos:
10 || 20 = '1020'
Este proceso de denomina CASTING y se puede aplicar en todos aquellos casos en que se utiliza valores numéricos en puesto de valores alfanuméricos o incluso viceversa.
La ausencia de valor: NULL
Todo valor (sea del tipo que sea) puede contener el valor NULL que no es más que la ausencia de valor. Así que cualquier columna (NUMBER, VARCHAR2, DATE…) puede estar a NULL. Una operación retorna NULL si cualquiera de los operandos es NULL. Para comprobar si una valor es NULL se utiliza el operador IS NULL o IS NOT NULL.
Lenguaje de manipulación de datos: DML
El DML (Data Manipulation Language) es el conjunto de sentencias que está orientadas
a la consulta, y manejo de datos de los objetos creados.
El DML es un subconjunto muy pequeño dentro de SQL, pero es el más importante, ya
que su conocimiento y manejo con soltura es imprescindible.
Básicamente consta de cuatro sentencias: SELECT, INSERT, DELETE, UPDATE.
SELECT
La sentencia SELECT es la encargada de la recuperación (selección) de datos, con cualquier tipo de condición, agrupación u ordenación. Una sentencia SELECT retorna un result set (conjunto de resultados), por lo que podrá ser aplicada en cualquier lugar donde se espere un result set.
La sintaxis básica es:
SELECT columnas
FROM tablas
WHERE condición
GROUP BY agrupación
HAVING condición agrupada
ORDER BY ordenación;
Todas las cláusulas son opcionales excepto SELECT y FROM.
A continuación vamos a hacer una descripción breve de cada cláusula:
SELECT: se deben indicar las columnas que se desean mostrar en el resultado. Las distintas columnas deben aparecer separadas por coma (","). Opcionalmente puede ser cualificadas con el nombre de su tabla utilizando la sintaxis:
TABLA.COLUMNA
Si se quieren introducir todas las columnas se podrá incluir el carácter *, o bien TABLA.* Existe la posibilidad de sustituir los nombres de columnas por constantes (1, 'pepe' o '1-may-2000'), expresiones, pseudocolumnas o funciones SQL.
A toda columna, constante, pseudocolumna o función SQL, se le puede cualificar con un nombre adicional:
COLUMNA NOMBRE
CONSTANTE NOMBRE
PSEUDOCOLUMNA
NOMBRE FUNCION SQL
NOMBRE
Si se incluye la cláusula DISTINCT después de SELECT, se suprimirán aquellas filas del resultado que tenga igual valor que otras.
Así
SELECT C_CLIENTE FROM FACTURA;
Puede retornar
1
3
5
5
1
7
3
2
9
Sin embargo:
SELECT DISTINCT C_CLIENTE FROM ACTURA; Retornará (suprimiendo las repeticiones)
1
3
5
7
2
9
Ejemplos:
SELECT REFERENCIA REF, DESCRIPCION SELECT FACTURA.REFERENCIA, DESCRIPCION SELECT *
SELECT FACTURA.*
SELECT 1 UN_NUMERO_CTE_CUALIFICADO, REFERENCIA SELECT 1+1-3*5/5.4 UNA_EXPRESION_SIN_CUALIFICADA
SELECT DESCRIPCION, ROWNUM UNA_PSEUDOCOLUMNA_CUALIFICADA
SELECT TRUNC( '1-JAN-2001'+1, 'MON' ) UNA_FUNCION_CUALIFICADA SELECT DISTINCT *
SELECT DISTINCT DESCRIPCION, IMPORTE SELECT REFERENCIA||DESCRIPCION
FROM: se indican el(los) result set(s) que interviene(n) en la consulta. Normalmente se utilizan tablas, pero se admite cualquier tipo result set (tabla, select, vista…). Si apareciese más de una tabla, deben ir separadas por coma. Las tablas deben existir y si no existiera alguna aparecería el siguiente error: ORA-00942: table or view does not exist Al igual que a las columnas, también se puede cualificar a las tablas TABLA NOMBRE Oracle tiene definida una tabla especial, llamada DUAL, que se utiliza para consultar valores que no dependen de ningún result set.
SELECT (1+1.1*3/5)-1-2 FROM DUAL;
Ejemplos:
FROM FACTURA FAC
FROM FACTURA FAC, CLIENTE CLI FROM DUAL
FROM ( SELECT C_CLIENTE FROM FACTURA ) CLIENTE_FAC
WHERE: indica qué condiciones debe cumplirse para que una fila entre dentro del result set retornado. Para construir las condiciones se podrán utilizar todos los operadores lógicos vistos anteriormente. Es posible construir condiciones complejas uniendo dos o más condiciones simples a través de los operadores lógicos AND y OR.
Ejemplos:
WHERE FACTURA.REFERENCIA = 'AA3455'
WHERE FACTURA.C_CLIENTE IS NULL
WHERE C_CLIENTE BETWEEN '12' AND '20'
WHERE C_CLIENTE IS NULL AND REFERENCIA IN ('AA23344', 'BB23345')
WHERE C_CLIENTE != 55 OR REFERENCIA LIKE 'AA%5_'
GROUP BY: La expresión GROUP BY se utiliza para agrupar valores que es necesario procesar como un grupo. Por ejemplo, puede darse el caso de necesitar procesar todas las facturas de cada cliente para ver su total, o para contarlas, o para incrementarles un 10%… Para estos casos se haría un SELECT agrupando por C_CLIENTE. Un SELECT con GROUP BY es equivalente a un SELECT DISTINCT, siempre y cuando en el SELECT no aparezcan consultas sumarias (ver apartado Funciones SQL). Trataremos con más profundidad este tipo de consultas en el apartado "Consultas agrupadas".
HAVING: Se utiliza para aplicar condiciones sobre agrupaciones. Sólo puede aparecer si se ha incluido la cláusula GROUP BY. Trataremos con más profundidad este tipo de consultas en el apartado "Consultas agrupadas".
ORDER BY: Se utiliza para ordenar las filas del result set final.
Dentro de esta cláusula podrá aparecer cualquier expresión que pueda aparecer en el SELECT, es decir, pueden aparecer columnas, pseudocolumnas, constantes (no tiene sentido, aunque está permitido), expresiones y funciones SQL. Como característica adicional, se pueden incluir números en la ordenación, que serán sustituidos por la columna correspondiente del SELECT en el orden que indique el número.
La ordenación es el último paso en la ejecución de una consulta SQL, y para ello Oracle suele necesitar crear objetos temporales que son creados en el tablespace Temporal. Por eso es recomendable hacer las ordenaciones del lado de cliente (siempre que sea posible), ya que el servidor puede cargarse bastante si tiene que hacer, por ejemplo, 300 ordenaciones de tablas de 2 millones de registros.
Después de cada columna de ordenación se puede incluir una de las palabras reservadas ASC o DESC, para hacer ordenaciones ASCendentes o DESCendentes. Por defecto, si no se pone nada se hará ASC.
Ejemplos:
ORDER BY REFERENCIA ASC
ORDER BY REFERENCIA DESC, C_CLIENTE DES, IMPORTE ASC
ORDER BY C_CLIENTE
ORDER BY 1, C_CLIENTE, 2
ORDER BY TRUNC( '1-JAN-2001'+1, 'MON' )
ORDER BY 1.1+3-5/44.3 -- no tiene sentido ordenar por una cte.
Consultas agrupadas
Una consulta agrupada se utiliza para considerar los registros cuyos ciertos campos tienen el mismo valor, y procesarlos de la misma manera, para contarlos, sumarlos, hacer la media…
Las consultas típicas son para contar los registros de cierto tipos, sumar los importes de cierto cliente, etc. Por ejemplo, vamos a sacar el total del importe de las factura, por cliente:
SELECT C_CLIENTE, SUM(IMPORTE)
FROM FACTURA
GROUP BY C_CLIENTE;
Esto nos sumará (la función SUM suma su parámetro) los registro agrupando por cliente. Internamente Oracle tiene que hacer una ordenación interna de los registros, según las columnas incluidas en el GROUP BY, así que todo lo dicho para el ORDER BY se puede aplicar para el GROUP BY (sobrecarga del servidor).
Cuando en la cláusula SELECT no se incluyen funciones SQL (para más información ver el apartado Funciones SQL), una consulta GROUP BY es equivalente a una consulta SELECT DISTINCT.
Un error muy común cuando se construyen consultas agrupadas, es el siguiente:
ORA-00979: not a GROUP BY expression
Esto es debido al modo que tiene Oracle de analizar las consultas agrupadas: Lo que hace es comprobar que todos las columnas incluidos en la cláusula SELECT fuera de funciones sumarias, estén dentro de la cláusula GROUP BY, aunque pueden estar en cualquier orden y en el GROUP BY pueden aparecer columnas que no estén en el SELECT. Si encuentra alguna columna en el SELECT (que no esté dentro de una función sumaria) que no aparezca en el GROUP BY, entonces nos retorna el error anterior. Si pensamos la situación, es lógico que nos retorne un error, porque no podemos agrupar por la columna C_CLIENTE, si luego queremos mostrar otras columnas que estén sin agrupar. O agrupamos por todo, o mostramos sin agrupar, pero ambas a la vez no es posible.
Ejemplos de consultas agrupadas:
SELECT C_CLIENTE, SUM( IMPORTE )
FROM FACTURA
GROUP BY C_CLIENTE;
SELECT C_PAIS, SUM( IMPORTE ) FROM FACTURA
GROUP BY C_PAIS;
SELECT C_CLIENTE, COUNT(*) FROM FACTURA
GROUP BY C_CLIENTE;
SELECT C_CLIENTE, SUM(1) FROM FACTURA
GROUP BY C_CLIENTE;
SELECT C_PAIS, AVG( IMPORTE ) FROM FACTURA
GROUP BY C_PAIS;
SELECT C_PAIS, COUNT(*) FROM CLIENTE
GROUP BY C_PAIS,
SELECT C_CLIENTE + AVG( IMPORTE ) FROM FACTURA;
Consultas multitabla
Es posible que para consultas sencillas, todos los datos que necesitemos estén en
una sola tabla. Pero… ¿y si están repartidos por una, dos o muchas tablas?
Es posible hacer consultas que incluyan más de una tabla (o result set) dentro de la cláusula FROM, como ya vimos anteriormente. Pero en estas consultas hay que tener en cuenta ciertos factores.
Vemos lo que hace Oracle para esta consulta:
SELECT F.REFERENCIA, F.C_CLIENTE, C.C_CLIENTE, C.D_CLIENTE
FROM FACTURA F, CLIENTE C;
Suponiendo que tenemos los siguientes datos:
|
FACTURA |
|
|
Referencia |
C_Cliente |
|
A111 |
1 |
|
A112 |
2 |
|
A113 |
1 |
|
A114 |
5 |
|
A115 |
2 |
|
CLIENTE |
|
|
C_Cliente |
D_Cliente |
|
1 |
Pepote |
|
2 |
Juancito |
|
5 |
Toñete |
El select anterior nos retornará el siguiente result set
|
F.REFERENCIA |
F.C_CLIENTE |
C.C_CLIENTE |
C.D_CLIENTE |
|
A111 |
1 |
1 |
Pepote |
|
A111 |
1 |
2 |
Juancito |
|
A111 |
1 |
5 |
Toñete |
|
A112 |
2 |
1 |
Pepote |
|
A112 |
2 |
2 |
Juancito |
|
A112 |
2 |
5 |
Toñete |
|
A113 |
1 |
1 |
Pepote |
|
A113 |
1 |
2 |
Juancito |
|
A113 |
1 |
5 |
Toñete |
|
A114 |
5 |
1 |
Pepote |
|
A114 |
5 |
2 |
Juancito |
|
A114 |
5 |
5 |
Toñete |
|
A115 |
2 |
1 |
Pepote |
|
A115 |
2 |
2 |
Juancito |
|
A115 |
2 |
5 |
Toñete |
Podemos ver que el resultado es el producto cartesiano de una tabla por otra tabla, es decir, todas las combinaciones posibles de la tabla FACTURA con la tabla CLIENTE. Pero en realidad lo que a nosotros nos interesa es mostrar todas las facturas, pero con la descripción del cliente de cada factura, es decir, que cada factura seleccione sólo su registro correspondiente de la tabla CLIENTE. Los registros que a nosotros nos interesan están marcados en negrita en el esquema anterior, y en todos ellos se cumple que F.C_CLIENTE = C.C_CLIENTE. O dicho de otro modo, los campos que componen la relación igualados. Entonces del result set anterior, sólo nos interesan los registros marcados en negrita, y el select que nos retorna ese resultados es:
SELECT F.REFERENCIA, F.C_CLIENTE, C.C_CLIENTE, C.D_CLIENTE
FROM FACTURA F, CLIENTE C
WHERE F.C_CLIENTE = C.C_CLIENTE;
El resultado final es:
|
F.REFERENCIA |
F.C_CLIENTE |
C.C_CLIENTE |
C.D_CLIENTE |
|
A111 |
1 |
1 |
Pepote |
|
A112 |
2 |
2 |
Juancito |
|
A113 |
1 |
1 |
Pepote |
|
A114 |
5 |
5 |
Toñete |
|
A115 |
2 |
2 |
Juancito |
Esto es con la descripción del cliente.
Como norma general se puede decir que para combinar dos o más tablas hay que poner como condición la igualdad entre las claves de una tabla y el enlace de la otra. Las condiciones dentro del WHERE que sirven para hacer el enlace entre tablas se denominan JOIN (unión, enlace).
Nota: en el ejemplo utilizado hemos omitido por simplicidad la columna C_PAIS que también forma parte de la clave, así que el join debería hacerse con las columnas C_PAIS y C_CLIENTE.
Existe un caso especial cuando se establece un "join" entre tablas: el outer-join. Este caso se da cuando los valores de los campos enlazados en alguna de las tablas, contiene el valor NULL.
Al realizar un join, si algún campo enlazado contiene el valor NULL, es registro quedará automáticamente excluído, ya que una condición en la que un operando sea NULL siempre se evalúa como falso.
Supongamos que las tablas utilizadas en el ejemplo anterior ahora tienen los siguientes datos:
|
FACTURA |
|
|
Referencia |
C_Cliente |
|
A111 |
1 |
|
A112 |
NULL |
|
A113 |
1 |
|
A114 |
NULL |
|
A115 |
7 |
|
CLIENTE |
|
|
C_Cliente |
D_Cliente |
|
1 |
Pepote |
|
2 |
Juancito |
|
5 |
Toñete |
Si realizamos la misma consulta (las facturas con la descripción de cliente), no aparecerán las facturas "A112" y "A114", ya que su campo C_CLIENTE contiene un NULL, y al evaluar la condición de join (WHERE FACTURA.C_CLIENTE = CLIENTE.C_CLIENTE), no se evaluará como verdadero. Además, tampoco aparecerá la factura "A115", porque el cliente "7" no existe en la tabla de clientes.
Sin embargo, puede ser que necesitemos mostrar todas las facturas de la base de datos, independientemente de si el cliente existe o si el campo está a NULL.
Para ello debemos utilizar un outer-join, que no es más que un JOIN con un modificador (+), indicando que queremos considerar aquellos registros que se descarten por existencia de nulos.
El select final sería así
SELECT F.REFERENCIA, F.C_CLIENTE, C.C_CLIENTE, C.D_CLIENTE
FROM FACTURA F, CLIENTE C
WHERE F.C_CLIENTE = C.C_CLIENTE(+);
El resultado de ejecutar este select es:
|
F.REFERENCIA |
F.C_CLIENTE |
C.C_CLIENTE |
C.D_CLIENTE |
|
A111 |
1 |
1 |
Pepote |
|
A113 |
1 |
1 |
Pepote |
|
A115 |
2 |
7 |
NULL |
|
A112 |
NULL |
NULL |
NULL |
|
A114 |
NULL |
NULL |
NULL |
Esta consulta podría leerse con el siguiente enunciado:
"Selecionar las facturas que tengan cliente (el join) y aquellas que no encuentren su referencia en la tabla cliente (en outer-join)".
Es importante fijarse en la posición en que se ha colocado el modificador (+). Si se sitúa detrás del campo de la tabla cliente, significa que se recuperen las todas las facturas, aunque no encuentren referencia al cliente, sin embargo, si lo ponemos detrás del campo de la tabla factura:
SELECT F.REFERENCIA, F.C_CLIENTE, C.C_CLIENTE, C.D_CLIENTE
FROM FACTURA F, CLIENTE C
WHERE F.C_CLIENTE(+) = C.C_CLIENTE;
Significaría que recupere todos los clientes, aunque no encuentre la referencia de la factura.
Sólo queda por comentar que si en join entre las tablas es de varios campos, debe indicarse el símbolo del outer (+) en todos los campos, y en la misma posición en todos ellos.
Pseudocolumnas
Una pseudocolumna es una columna válida para poner en cualquier cláusula SELECT, independientemente de las tablas incluidas en la clausula FROM.
Las pseudocolumnas válidas para Oracle son:
CURRVAL y NEXTVAL: sólo válidas si el objeto del FROM es una secuencia. Permiten recuperar el valor actual y siguiente (respectivamente) de una secuencia. Para más información sobre las secuencias ir a al apartado CREATE SEQUENCE.
LEVEL: Retorna el nivel para consultas jerárquicas. Las consultas jerárquicas se realizan utilizando las cláusulas START WITH y CONNECT BY de la sentencia SELECT. Para más información sobre consultas jerárquicas, dirigirse a la ayuda se la sentencia SELECT en el Oracle SQL Reference.
ROWID: Retorna una dirección de disco donde se encuentra la fila seleccionada. Es un valor único para cada fila de la base de datos.
ROWNUM: Es un valor consecutivo para cada fila retornada por una consulta. La primera fila tendrá un 1, la segunda un 2, etc. Se suele utilizar para restringir el tamaño del result set, por ejemplo, si queremos que sólo retorne las 5 primeras facturas:
SELECT *
FROM FACTURA
WHERE ROWNUM <= 5;
Hay que tener en cuenta que una consulta de este estilo:
SELECT *
FROM FACTURA
WHERE ROWNUM > 1;
Nunca retornará resultado, porque siempre habrá una fila que sea la primera. Después de que el WHERE elimine la primera fila, el ROWNUM de todas las filas restantes de recalculará y volverá a haber otra nueva primera fila. Así se seguirá aplicando la condición de filtro hasta que no queden filas. Por eso no retorna ninguna fila. El valor de ROWNUM se aplica antes de que se ordene el result set
SYSDATE: Nos retorna un tipo de dato DATE con la fecha y hora del sistema (según el reloj del servidor de base de datos).
USER, UID: Nos retorna el nombre e identificador de usuarios de la sesión activa.
INSERT
La sentencia INSERT nos permite introducir nuevas filas en una tabla de base de datos. La sintaxis básica es:
INSERT INTO tabla{( campos )} VALUES( lista de valores );
Los nombres de los campos detrás del nombre de tabla son opcionales y si no se ponen se supondrá todos los campos de la tabla en su orden original. Si se ponen, se podrán indicar cualquier número de columnas en cualquier orden.
La lista de valores es el registro que se insertará en la tabla. Los tipos de datos deben coincidir con la definición dada en la cláusula INTO o con la definición de la tabla si omitimos dicha cláusula. Las columnas que no se incluyan en el INTO, de inicializarán con NULL, (si no se ha definido valor en el DEFAULT).
Existe otra sintaxis que se denomina INSERT masivo:
INSERT INTO tabla{( campos )} SELECT . . .
Este tipo de INSERT permite introducir un gran número de registros en una sola sentencia. Al igual que con el INSERT normal, los tipos de datos del SELECT deben coincidir con la definición de la cláusula INTO.
Ejemplos:
INSERT INTO FACTURA VALUES( 'A111', 'Factura nueva', 1, 5, 50000 );
INSERT INTO FACTURA( C_PAIS, REFERENCIA, IMPORTE, C_CLIENTE, DESCRIPCIPCION ) VALUES( 1, 'A111', 50000, 5, 'Factura nueva' );
INSERT INTO FACTURA( REFERENCIA, IMPORTE ) VALUES( 'A111', 50000 );
INSERT INTO FACTURA( C_PAIS, C_CLIENTE ) SELECT C_PAIS, C_CLIENTE FROM CLIENTE;
DELETE
La sentencia DELETE nos permite eliminar filas en una tabla de base de datos conforme a una condición. Es equivalente al SELECT, pero en vez de mostrar las filas que cumplan la condición, las elimina.
Su sintaxis es:
DELETE {FROM} tabla {WHERE condición};
Si se omite la cláusula WHERE se borrarán todas las filas de la tabla. Las condiciones pueden ser las mismas que las aplicadas en una sentencia SELECT.
En la cláusula FROM no puede haber más de una tabla, por lo que no es posible hacer joins en un DELETE. Para hacer un "pseudojoin" hay que utilizar el operador IN comparando los campos clave de la tabla a borrar con el subselect de la tabla con la que se quiere hacer el join.
Ejemplos:
DELETE FROM FACTURA WHERE REFERENCIA = 'A111'; DELETE FACTURA;
DELETE FACTURA WHERE C_PAIS = 1 AND C_CLIENTE = 5;
DELETE FROM FACTURA WHERE REFERENCIA NOT IN ( SELECT REFERENCIA
FROM FACTURA
WHERE C_CLIENTE = 4 );
DELETE FROM FACTURA WHERE C_CLIENTE != 4;
DELETE FROM FACTURA WHERE (C_PAIS,C_CLIENTE) IN ( SELECT C_PAIS, C_CLIENTE
FROM CLIENTE
WHERE D_CLIENTE LIKE '%Fernández%' );
DELETE FROM FACTURA
WHERE (C_PAIS,C_CLIENTE) IN ( SELECT C_PAIS, C_CLIENTE FROM CLIENTE
WHERE CLIENTE.C_PAIS = FACTURA.C_PAIS
AND CLIENTE.C_CLIENTE = FACTURA.C_CLIENTE
AND D_CLIENTE LIKE '%Fernández%' );
UPDATE
La sentencia UPDATE se encarga de modificar registros ya existentes en una tabla. Es equivalente a la sentencia DELETE, pero en vez de borrar, actualiza las columnas indicadas que cumplan la condición impuesta.
Sintaxis:
UPDATE tabla
SET campo = valor, campo = valor,
. . .
{WHERE condición};
El valor puede ser tanto un valor discreto (1, 'pepe', '1-jan-2000', etc), un valor dependiente de otra una columna (IMPORTE*10) o un subselect que retorne un result set de 1×1 (1 fila y 1 una columna). Si se utiliza un subselect se puede hacer join entre este subselect y la tabla del UPDATE.
Si se omite la cláusula WHERE, se actualizarán todas las filas de la tabla.
Ejemplos:
UPDATE FACTURA
SET IMPORTE = 1000
WHERE C_PAIS = 1
AND C_CLIENTE = 5;
UPDATE FACTURA
SET IMPORTE = IMPORTE * 0.5
WHERE C_PAIS = 1
AND C_CLIENTE = 5;
UPDATE FACTURA F1
SET IMPORTE = ( SELECT AVG(IMPORTE) * 1.10
FROM FACTURA F2
WHERE F1.C_PAIS = F2.C_PAIS
AND F1.C_CLIENTE = F2.C_CLIENTE );
UPDATE FACTURA F1
SET IMPORTE = ( SELECT AVG(F2.IMPORTE) + F1.IMPORTE FROM FACTURA F2
WHERE F1.C_PAIS = F2.C_PAIS
AND F1.C_CLIENTE = F2.C_CLIENTE );
Lenguaje de definición de datos: DDL
El DDL (Data Definition Language) es el conjunto de sentencias que está orientadas a la creación, modificación y configuración de objetos en base de datos. El DDL es el subconjunto más extenso dentro de SQL así que sólo vamos a hacer una referencia rápida a algunas sentencias. Se puede encontrar una descripción detallada del todo el DDL dentro del Oracle SQL Reference.
Página anterior | ![]() Volver al principio del trabajo | Página siguiente ![]() |
Ingrese el e-mail y contraseña con el que está registrado en Monografias.com
Trabajos relacionados
Ver mas trabajos de Programacion |
|
Nota al lector: es posible que esta página no contenga todos los componentes del trabajo original (pies de página, avanzadas formulas matemáticas, esquemas o tablas complejas, etc.). Recuerde que para ver el trabajo en su versión original completa, puede descargarlo desde el menú superior.
Todos los documentos disponibles en este sitio expresan los puntos de vista de sus respectivos autores y no de Monografias.com. El objetivo de Monografias.com es poner el conocimiento a disposición de toda su comunidad. Queda bajo la responsabilidad de cada lector el eventual uso que se le de a esta información. Asimismo, es obligatoria la cita del autor del contenido y de Monografias.com como fuentes de información.