Está en la página 1de 18

Bases de Datos

Apuntes

El lenguaje SQL de Oracle

Juan Manuel Vara


Apuntes
Bases de Datos
El lenguaje SQL de Oracle

Acerca de este documento y la bibliografía relacionada con ORACLE


Este documento pretende ser una referencia rápida del lenguaje SQL soportado por el Sistema
Gestor de Bases de Datos Oracle. Para su elaboración nos hemos basado en una versión previa
elaborada por el profesor José María Cavero y el tutorial Oracle/SQL Tutorial del profesor Michael
Gertz, que podéis encontrar en http://www.db.cs.ucdavis.edu/teaching/sqltutorial.
No obstante, la mejor fuente de información para todo lo relacionado con este producto
comercial es el sitio Web http://www.oracle.com/technetwork. Donde podréis encontrar, tanto
software ORACLE para descargar (gratuitamente) como todos los manuales relacionados con sus
productos. Además todos los manuales están disponibles para descargar en su versión PDF, o para
consultados vía Web en su versión on-line.

En particular los siguientes sitios son especialmente útiles en el contexto de esta signatura:
 http://www.oracle.com/pls/db102/homepage: la home de la biblioteca digital para ORACLE
10g, la versión de ORACLE con la que trabajaremos en la asignatura. Los dos manuales o
libros que os recomendamos en el contexto de esta signatura son:
o SQL Reference: referencia completa y detallada del SQL que se utiliza cuando
trabajamos con una BBDD ORACLE. En realidad es un superconjunto del estándar
SQL que vemos en clase.
o PL/SQL User's Guide and Reference: referencia del lenguaje PL/SQL, una extensión
procedural del SQL de ORACLE. En función de hasta donde lleguemos, este libro
podría seros útil de cara al futuro, pero no en el marco de esta asignatura.
 http://www.oracle.com/technetwork/database/express-edition/overview/index.html: sitio
Web de Oracle Database Express Edition (XE). Una versión libre y reducida del SGBD Oracle.
Es una BBDD Oracle con toda la funcionalidad, pero limitada en algunas características no-
funcionales (como el número de conexiones simultaneas no soportadas). Es una opción ideal
si queréis tener una BBDD en vuestro PC para trabajar “en local”.
 http://www.oracle.com/technetwork/developer-tools/sql-developer/: sitio Web de SQL
Developer, una herramienta gratuita de Oracle para crear, borrar y modificar datos y objetos
en una BBDD. Es decir, es un cliente que nos permite conectarnos a una BBDD y realizar
operaciones sobre ella. La BBD no tiene que ser necesariamente Oracle, también soporta
conexión a BBDDs MySQL, Microsoft SQL Server, Sybase Adaptive Server, Microsoft Access, e
IBM DB2.

Aunque el lenguaje SQL admitido por Oracle es muy similar al estándar, existen algunas diferencias.
En los manuales podrá consultarse la sintaxis completa del lenguaje SQL para Oracle, pero a
continuación tratamos de proporcionar una referencia rápida para facilitar el trabajo en clase.
Nótese que las diferencias más importantes son los tipos de datos, las opciones de borrado y
modificación de claves ajenas, y la creación de dominios (Oracle no admite dominios, los cuales
deberán simularse mediante CHECKs o tablas auxiliares).

Tipos de Datos
Cada tabla puede tener hasta 254 columnas que pueden ser del mismo o distinto tipo de datos.
En particular, los tipos básicos más importantes ofrecidos por Oracle son:
 CHAR(n): cadenas de caracteres de longitud fija, donde n es el tamaño de la cadena en bytes y
debe ser ≤ 2000. Si se inserta un valor menor que el tamaño definido, Oracle inserta espacios en
blanco hasta completar la cadena ( malo en términos de uso de memoria)

Grupo de Investigación Kybele Página |2


Apuntes
Bases de Datos
El lenguaje SQL de Oracle

 VARCHAR2(n): cadenas de caracteres de longitud variable, hasta un máximo de tamaño n.


 NUMBER (l,d): tipo numérico de un máximo de “l” dígitos, “d” de los cuales son decimales.
- NUMBER(5) ≡ NUMBER (5,0)  un entero de 5 dígitos
- NUMBER (5, 2)  un número decimal de 5 dígitos, donde 2 son decimales: 123,45
- NUMBER  número decimal
 DATE: tipo fecha. También guarda información sobre la hora. Suele exigir tratamiento especial
mediante funciones de formateo que veremos más adelante.
 Aunque en ORACLE no hay un tipo booleano, se puede simular utilizando un tipo CHAR(1) o
NUMBER(1)

Tipos NULL
Siempre que en el cruce de una fila y una columna no se haya insertado un valor, el valor de esa
columna es el valor NULL (nulo), salvo que sobre esa columna se haya definido una restricción del
tipo NOT NULL o PRIMARY KEY
Un valor NULL tiene un comportamiento especial y es importante distinguirlo del valor numérico
0 y de la cadena vacía ‘’. Por ejemplo, un valor NULL no es igual ni distinto de otro valor NULL. La
única forma de tratar con un valor (que podría ser) NULL es mediante las funciones IS NULL e IS NOT
NULL. A continuación se muestran algunos ejemplos del resultado de evaluar condiciones que
implican valores NULL.

CONDICIÓN VALOR DE A RESULTADO


a IS NULL 10 FALSE

a IS NOT NULL 10 TRUE

a IS NULL NULL TRUE

a IS NOT NULL NULL FALSE

a = NULL 10 UNKNOWN

a != NULL 10 UNKNOWN

a = NULL NULL UNKNOWN

a != NULL NULL UNKNOWN

a = 10 NULL UNKNOWN

a != 10 NULL UNKNOWN
Evaluación de condiciones con valores NULL

Creación de Tablas
La sintaxis básica de la instrucción para la creación de tablas es la siguiente1:

1
Toda clausula o palabra reservada que aparezca entre corchetes es opcional.

Grupo de Investigación Kybele Página |3


Apuntes
Bases de Datos
El lenguaje SQL de Oracle

CREATE TABLE nombre (


columna1 tipodatos [DEFAULT valorpordefecto] [restricciones de columna1],
...
columnaN tipodatos [DEFAULT valorpordefecto] [restricciones de columnaN],
[restricción de tabla],
...
[restricción de tabla]);

 Para cada columna se debe especificar el nombre y el tipo de datos de la misma.


 El nombre de cada columna debe ser único en el contexto de la tabla.
 No hay distinción entre mayúsculas y minúsculas, salvo obviamente cuando se comparan valores
de tipo cadena de caracteres.
 De hecho, todos los nombres de objetos en ORACLE, independientemente de cómo se
especifiquen cuando se crean, son almacenados en mayúsculas.
Ejemplo
-- la forma de insertar comentarios en un script SQL es comenzar la línea con --
create table EMP (
EMPNO number(4) not null,
ENAME varchar2(30) not null,
JOB varchar2(10),
MGR number(4),
HIREDATE date,
SAL number(7,2),
DEPTNO number(2)
);
-- todas las columnas salvo las dos primeras admiten valores NULL

Restricciones
Hay dos formas de definir restricciones, como restricciones de columna y como restricciones de
tabla. Las primeras son las que se especifican en línea con la especificación del nombre y tipo de
datos de la columna. Por el contrario, las restricciones de tabla se especifican después de la lista de
columnas de la tabla. No obstante, todas las restricciones pueden formularse como restricciones de
tabla.
 Las restricciones pueden definirse con nombre. Aunque no es obligatorio, es conveniente hacerlo
para facilitar la gestión de errores. Si no se especifica un nombre, Oracle generará
automáticamente un nombre de la forma SYS_<numero>. Cuando se viole dicha restricción,
Oracle utiliza el nombre de la restricción (el especificado o el generado) para informar al
respecto.
La sintaxis básica para la definición de restricciones de columna es la siguiente:
[CONSTRAINT nombrerestricción]
[NOT] NULL |
UNIQUE/PRIMARY KEY |
REFERENCES tabla [(columna)] [ON DELETE CASCADE/SET NULL] |
CHECK (condición)

Ejemplo
create table EMP (
EMPNO number(4) constraint pk_emp primary key,
SAL number(5,2) constraint check_sal check(SAL >= 500),
DEPTNO number(3) constraint check deptno check(DEPTNO between 10 and 100)
…);

La sintaxis básica para la definición de restricciones de tabla es la siguiente:

Grupo de Investigación Kybele Página |4


Apuntes
Bases de Datos
El lenguaje SQL de Oracle

[CONSTRAINT nombrerestricción]
UNIQUE/PRIMARY KEY/NOT NULL (columnas) |
FOREIGN KEY (columnas) REFERENCES tabla [(columnas)]
[ON DELETE CASCADE/SET NULL] |
CHECK (condición)

Ejemplo
create table EMP (
EMPNO number(4) not null,
ENAME varchar2(30) not null,
HIREDATE DATE,
FIREDATE DATE,
…,
CONSTRAINT pk_emp PRIMARY KEY(empno),
CONSTRAINT check_emp (HIREDATE < FIREDATE)
-- la fecha de baja del empleado debe ser superior a la fecha de contratación
);

 Oracle sólo admite opciones en el caso de borrado de claves ajenas (a diferencia del estándar).
 Las únicas opciones admitidas son borrado en cascada, con puesta a nulos y restringido (que es la
opción por defecto en el caso de no poner nada).
 Evidentemente, cuando una clave ajena tiene como opción de borrado la puesta a nulos, las
columnas asociadas deberán admitir este valor.
 Todas las restricciones pueden definirse sobre varias columnas. Por ejemplo, podemos definir
una clave primaria (PRIMARY KEY) o una restricción de unicidad (UNIQUE) sobre dos campos a la
vez.
Ejemplo
create table EMP (
EMPNO number(4) not null,
ENAME varchar2(30) not null,
ESURNAME varchar2(30) not null,
…,
CONSTRAINT pk_emp PRIMARY KEY(empno),
CONSTRAINT unique_name UNIQUE(ENAME, ESURNAME)
);
-- No permitimos que se inserten dos empleados con el mismo
-- nombre y apellidos

 En caso de que una tabla referenciada por una clave foránea (FOREIGN KEY) tenga una clave
primaria compuesta, la clave foránea debe apuntar a la clave primaria completa.
Ejemplo

Grupo de Investigación Kybele Página |5


Apuntes
Bases de Datos
El lenguaje SQL de Oracle

create table OFFICE (


REGCOD char(3),
OFFNO number(4)
CONSTRAINT pk_off PRIMARY KEY(REGCOD, OFFNO)
);

create table EMP (


EMPNO number(4) not null,
ENAME varchar2(30) not null,
EREG char(3),
EOFF number(4),
…,
CONSTRAINT pk_emp PRIMARY KEY(empno),
CONSTRAINT fk_emp_off FOREIGN KEY(EREG,EOFF) REFERENCES OFFICE
);
-- la clave foránea que identifica la oficina a la que pertenece un empleado
-- está compuesta por dos campos, igual que la clave primaria de cada oficina
-- nótese cómo podemos omitir la lista de campos apuntados en tabla OFFICE porque
-- son precisamente los dos que componen la clave primaria

 Una clave foránea puede referenciar a la propia tabla. Es decir, la tabla padre y la tabla
referenciada pueden ser la misma. De esta forma podemos reflejar relaciones entre varias tuplas
de una misma tabla.
Ejemplo
create table EMP (
EMPNO number(4) not null,
ENAME varchar2(30) not null,
EMGR number(4),
…,
CONSTRAINT pk_emp PRIMARY KEY(empno),
CONSTRAINT fk_emp_mngr FOREIGN KEY(EMGR) REFERENCES EMP
);
-- cada empleado tiene un manager o superior, que también es empleado de la empresa

Checklist para la creación de Tablas


A la hora de crear una tabla conviene tener en cuenta los siguientes puntos:
 ¿Qué atributos o columnas debe tener la tabla?
 ¿Cuáles son los tipos de datos adecuados para dichas columnas? p.e.: ¿Conviene usar VARCHAR2
o CHAR(n)?
 ¿Cuáles son las columnas que deben componer la clave primaria?
 ¿Qué columnas admitirán valores nulos?
 ¿Qué columnas no deberán contener valores duplicados en varias filas?
 ¿Hay columnas para las que se pueda fijar un valor por defecto y además sea preferible a que
contengan un valor NULL?

Borrado de Tablas
Las tablas y las filas que contienen pueden borrarse utilizando la sentencia DROP
DROP TABLE nombre_tabla [CASCADE CONSTRAINTS];

Si la tabla a eliminar está referenciada por FOREIGN KEYs desde otra tabla, Oracle no nos dejaría
borrarla informando del error. En tal caso, la opción CASCADE CONSTRAINTS hará que se borre la
tabla aunque exista alguna dependencia con otras tablas. Para ello, antes de borrar la tabla, borra
cualquier FOREIGN KEY que la apunte.

Grupo de Investigación Kybele Página |6


Apuntes
Bases de Datos
El lenguaje SQL de Oracle

Modificación de Tablas
Aunque cuando creamos una tabla proporcionamos una especificación completa de la misma,
siempre podremos modificar la misma a posteriori mediante la sentencia ALTER TABLE. Esta
sentencia permite añadir, eliminar y modificar columnas como restricciones.
 Añadir columnas: si queremos añadir varias columnas, debemos especificar varias clausulas ADD
… separadas por comas
ALTER TABLE tabla
ADD columna tipodatos [DEFAULT valorpordefecto] [restricciones de columna]

 Añadir restricciones de tabla


ALTER TABLE tabla ADD [restricción de tabla]

 Modificar la definición de una columna: tipo de datos, restricciones definidas sobre ella, etc. Por
ejemplo, puede interesar incrementar el tamaño máximo permitido en una columna de tipo
cadena de caracteres.
ALTER TABLE tabla MODIFY columna [tipodatos]
[DEFAULT valorpordefecto] [restricciones de columna]

 Eliminar una restricción o columna


ALTER TABLE tabla
DROP PRIMARY KEY|UNIQUE(columnas) |
DROP CONSTRAINT restricción |
DROP COLUMN columna |(columnas) |

 Toda restricción definida sobre cualquier tabla está habilitada por defecto. Para desactivarla y
activarla de nuevo podemos usar la sentencia ALTER TABLE.
 Para desactivar una PRIMARY KEY hay que desactivar antes todas las FOREIGN KEY que dependan
de ella. La clausula CASCADE se encarga de hacerlo por nosotros. ALTER TABLE tabla.
 De nuevo, el hecho de haber especificado un nombre para cada restricción en el momento de su
creación facilitará la gestión de las mismas.
[DISABLE UNIQUE (columnas)/PRIMARY KEY/CONSTRAINT restricción [CASCADE];]
[ENABLE UNIQUE (columnas)/PRIMARY KEY/CONSTRAINT restricción;]

Inserción de Datos
La sintaxis básica de la sentencia para insertar datos en una tabla es la siguiente:
INSERT INTO tabla/vista [(columnas)] VALUES (valores);

 Fijaos que podemos omitir los nombres de columna para los que queremos proporcionar valores.
En tal caso, debemos proporcionar valores para cada columna y Oracle seguirá el orden en el que
las columnas se especificaron en la sentencia de creación de la tabla (CREATE TABLE …) para
asignar un valor de los proporcionados a cada columna.
 Cuando realicemos una inserción proporcionando los nombres de columna para los que
queremos proporcionar un valor, Oracle rellenará el resto de columnas con un valor NULL (salvo
que hayamos especificado un valor por defecto para la columna).
Ejemplo

Grupo de Investigación Kybele Página |7


Apuntes
Bases de Datos
El lenguaje SQL de Oracle

-- suponiendo que hemos creado la siguiente tabla


create table EMP (
EMPNO number(4) not null,
ENAME varchar2(30) not null,
EJOB varchar2(10),
EDPT varchar2(10) DEFAULT ‘RR.HH.’
);
insert into EMP values (‘0001’, ‘John Doe’);
-- la ejecución de esta sentencia creará una fila en la tabla EMP con los valores
-- (‘0001’, ‘John Doe’, NULL, ‘RR.HH.’)

 Para cada fila que queramos crear en la tabla es necesario ejecutar una sentencia INSERT
diferente. La única forma de insertar varias filas a la vez es utilizar una subconsulta. LA
subconsulta recuperará datos de otra tabla y los insertará en la tabla sobre al que se invoque la
sentencia INSERT.
INSERT INTO tabla/vista [(columnas)] SELECT … ;

Ejemplo
-- creamos una tabla de empleados para guardar datos históricos
create table OLDEMP (
EMPNO number(4) not null,
ENAME varchar2(30) not null
);
-- recuperamos datos de la tabla EMP para insertarlos en la nueva tabla
insert into EMP SELECT (EMPNO, ENAME) from EMP;

Modificación de datos
La sintaxis básica de la sentencia para modificar datos de una tabla es la siguiente:
UPDATE tabla/vista SET
columna_i = expresión_i, columna_j = expresión_j, …
WHERE [condición];

 El tipo de dato de cada expresión debe corresponderse con el tipo de dato de la columna
correspondiente.
 En caso de que no se especifique una condición usando la clausula WHERE, la actualización
afectará a TODAS las filas de la tabla.
Ejemplo
-- el empleado llamado JONES es transferido al Departamento cuyo
-- identificador es 20 y ve incrementado su salario en 1000 unidades
update EMP set
JOB = ’MANAGER’, DEPTNO = 20, SAL = SAL +1000
where ENAME = ’JONES’;
-- se sube un 15% el salario de todos los trabajadores de los Depts. 10 y 30
update EMP set
SAL = SAL ∗ 1.15 where DEPTNO in (10,30);

 De la misma forma que con la sentencia INSERT, podemos recuperar valores de otras tablas a
través de una subconsulta y utilizarlos como nuevos valores para la modificación.
UPDATE tabla/vista SET (columnas)=subconsulta;

Ejemplo

Grupo de Investigación Kybele Página |8


Apuntes
Bases de Datos
El lenguaje SQL de Oracle

-- el salario de los empleados del departamento 20 cuyo puesto es comercial pasa a


-- ser el mismo que el salario del MANAGER que menos gana
update EMP set
SAL = (select min(SAL) from EMP where JOB = ’MANAGER’)
where JOB = ’SALESMAN’ and DEPTNO = 20;

Borrado de datos
La sintaxis básica de la sentencia para eliminar datos de una tabla es la siguiente:
DELETE [FROM] tabla/vista [WHERE condición];

 Igual que con la sentencia UPDATE, en caso de que no se especifique una condición usando la
clausula WHERE, la actualización afectará a TODAS las filas de la tabla.
Ejemplo
-- se eliminan todos los empleados del Departamento cuyo identificador es el 20
delete from EMP where DEPTNO = 20;

Consulta de Datos
La sintaxis básica de la sentencia para recuperar información de la BBDD es
SELECT [ALL | * | DISTINCT] <lista-de columnas o expresiones>
FROM <nombre de tabla> [alias de tabla] [,...]
[WHERE <condición>]
[GROUP BY <sublista-de columnas> [HAVING <condición>] ]
[ORDER BY <nombre de columna> [ASC | DESC] [,...] ]

Ejemplos
-- recuperar el identificador y el nombre de cada empleado
select EMPNO, ENAME from EMP;
-- recuperar todos los campos de la tabla empleado
select ∗ from EMP;

 De nuevo, si se omite la condición (clausula WHERE) la consulta recuperar el valor de todos los
campos seleccionados para TODAS las filas de la tabla.
 La clausula DISCTINCT elimina valores duplicados en el resultado de la consulta
 La clausula ORDER BY permite especificar una lista de campos por los que se quiere ordenar el
resultado de la consulta. El orden por el que se ordena es ASCendente por defecto, aunque se
pueden ordenar en orden DESCendente.
 En lugar un campo tal cual, podemos utilizar una expresión que se evalué sobre uno o varios
campos
-- además del nombre y el departamento, la siguiente consulta recupera el salario
-- de cada empleado incrementado en un 55%
select ENAME, DEPTNO, SAL ∗ 1.55 from EMP;

 El alias de la tabla permite definir un sinónimo para la tabla que sólo resulta válido en el contexto
de la consulta. Conviene adoptar el uso de alias como práctica habitual porque mejora la
legibilidad de las consultas, especialmente a medida que aumenta su complejidad.
Ejemplo

Grupo de Investigación Kybele Página |9


Apuntes
Bases de Datos
El lenguaje SQL de Oracle

-- se especifica un alias para la tabla EM que se utiliza para identificar los


-- campos que debe recuperar la consulta
select E.ENAME, E.DEPTNO, E.SAL ∗ 1.55 from EMP.E;

Definición de expresiones
Oracle proporciona un conjunto de funciones predefinidas que facilitan la definición de
expresiones.
 En general, solemos definir condiciones sencillas utilizando los operadores de comparación
habituales: = | != | <> | < | > | <= | =>
 … y los combinamos utilizando los operadores lógicos habituales: AND | OR | NOT
Ejemplo
-- recuperar el puesto y el salario de todos los empleados cuyos responsables son
-- los empleados 7698 y 7566 y cuyo salario está por encima de 1500 unidades
select JOB, SAL
from EMP
where (MGR = 7698 or MGR = 7566) and SAL > 1500

Otros operadores soportados son:


 Condiciones que implican conjuntos: un valor está o no está dentro de un conjunto de valores
<columna> [not] in (<lista_de_valores>)

Ejemplo
select ∗ from DEPT where DEPTNO in (20,30);

 Condiciones que implican valores NULL: un valor es o no un valor NULL


<columna> is [not] NULL

Ejemplo
-- recupera todas las columnas de todas las filas de la tabla EMP donde el valor
-- del campo MGR es NULL (no está definido)
select ∗ from EMP where MGR is not null;

 Condiciones que implican dominios


<columna> [not] between <límite_inferior> and <límite_superior >

Ejemplo
-- recupera el identificador, nombre y salario de todos los empleados cuyo salario
-- está entre 1500 y 2500 unidades
select EMPNO, ENAME, SAL from EMP where SAL between 1500 and 2500;
-- recupera el nombre de todos los empleados cuya fecha de contratación está en el
-- intervalo definido
select ENAME from EMP where HIREDATE between ’02-ABR-81’ and ’08-SEP-81’

Operaciones con cadenas de caracteres


La primera norma que no debemos olvidar a la hora de trabajar con cadenas de caracteres es
que todos los valores deben ir encerrados entre comillas simples.
Ejemplo
Ciudad = ‘MADRID’

Existen varias funciones u operadores para facilitar el trabajo con cadenas de caracteres:
 upper(<cadena>): convierte cadena a mayúsculas.
 lower(<cadena>): convierte cadena a minúsculas.

Grupo de Investigación Kybele P á g i n a | 10


Apuntes
Bases de Datos
El lenguaje SQL de Oracle

 initcap(<cadena>): convierte a mayúscula la primera letra de cualquier palabra incluida en


cadena.
 length(<cadena>): devuelve la longitud (número de caracteres) de cadena.
 substr(<cadena>, n [, m]): extrae una cadena de m caracteres de cadena, empezando en el
carácter situado en la posición n. En caso de no especificar un valor para m, se extrae hasta el
final de cadena.
substr(’Bases de Datos’, 10, 4) devuelve la cadena ’Dato’

Además, el operador LIKE es especialmente útil para trabajar con cadenas de caracteres, ya que
permite definir comparaciones usando patrones. Es decir, las dos cadenas a comparar no tienen que
ser necesariamente idénticas para que el resultado de la comparación sea positivo. Bastará con que
exista una correspondencia en los patrones definidos con el operador LIKE.
<cadena_1> [NOT] LIKE <cadena_2>

Para definir estos patrones se utilizan dos caracteres especiales:


 _ (guión bajo)  exactamente un carácter
 % (porcentaje)  uno o más caracteres
Ejemplos
-- recuperar el nombre de todos los empleados donde su nombre empiece por cualquier
-- subcadena, tenga una C seguida de cualquier carácter y otra C, y acabe con
-- cualquier otra subcadena
select ENAME from EMP…
where ENAME like ’%C_C%’
-- Ejemplos de cadenas que se corresponden con el patrón:  ‘CACERES’, ‘ACACIAS’

where ENAME like ‘Ma%’


-- empiezan por Ma  Mallin, Markle, Marlow, Marvins, Marvis, Matos
where ENAME like ‘SMITH_’
-- SIMTHE, SMITHS y SMITHY evaluarian positivamente
-- SMITH evaluaría negativamente porque el _ obliga a que haya algún distinto
-- del espacio en blanco tras la cadena SMITH

Operaciones con fechas


Oracle proporciona el tipo de datos DATE para trabajar con fechas. Un valor de tipo DATE no sólo
contiene información de día, mes y año, sino también de hora, minuto y segundo.
 Podemos comparar valores de tipo DATE utilizando los operadores de comparación clásicos.
 También podemos restar valores de tipo DATE. El resultado será un número real que informa del
número de días transcurrido entre ambas fechas.
 Finalmente, podemos sumar fechas de la forma (fecha + n). En este caso Oracle sumará n días a
la fecha.
Al igual que con las cadenas de caracteres, Oracle proporciona un conjunto de funciones para
facilitar el trabajo con valores de tipo fecha:
 sysdate  función que devuelve la fecha y hora actual
 last_day  devuelve el último día del mes actual
 add_months(d,n)  suma o resta n meses a partir de la fecha d
 months_between(f,s)  devuelve la diferencia en meses entre la fecha f y la fecha s
 next_day(d,day)  devuelve la fecha del día especificado (lunes, martes, ...en inglés) de la semana
siguiente a la fecha d
Cada vez que Oracle tiene que mostrar un valor de tipo fecha, debe convertirlo del formato
interno que utiliza para la gestión de fechas a una cadena de caracteres imprimible por pantalla. Para
ello utiliza implícitamente la función TO_CHAR, que por defecto mostrará el valor siguiendo el
formato ‘dd/mm/aa’.

Grupo de Investigación Kybele P á g i n a | 11


Apuntes
Bases de Datos
El lenguaje SQL de Oracle

 TO_CHAR(<fecha>, ‘<máscara>’)  muestra fecha siguiendo el formato definido por máscara.


Ejemplos
select sysdate from dual;

SYSDATE
---------
25/10/10
-- sydate es una variable interna de Oracle que informa de la fecha y hora actuales
-- DUAL es una tabla vacía que Oracle proporciona para utilizar en la clausula
-- FROM de una consulta cuando no es apropiado utilizar ninguna otra

select EMPNO, TO_CHAR(HIREDATE, 'DD/MONTH/YYYY') from EMP;

EMPNO HIREDATE
------------------------------
1 01/ENERO /2000

De la misma forma, cuando se quiere insertar un valor de tipo DATE, hay que convertirlo de la
cadena de caracteres utilizada para expresar la fecha al formato interno manejado por Oracle. Para
ello Oracle aplica implícitamente la función TO_DATE a cualquier valor que aparezca donde debiera
aparecer una fecha.
 TO_DATE(<cadena>, ‘<máscara>’)  convierte cadena a un valor de tipo fecha, de acuerdo al
formato definido por máscara.
Existen más de 40 opciones para la máscara, a continuación se muestran algunas de las más
frecuentes
 Y  devuelve el último dígito del año
 YY  devuelve los dos últimos dígitos del año
 YYY  devuelve los tres últimos dígitos del año
 YYYY  devuelve los cuatro últimos dígitos del año
 SYEAR, YEAR  año, utilizando signo para las fechas A.C.
 Q  trimestre del año
 MM  mes
 RM  mes en números romanos
 Month  Nombre del mes (9 caracteres)
 WW  semana del año
 W  semana del mes
 DDD  día del año
 DD  día del mes
 D  día de la semana
 DY  Abreviatura del nombre del día
 HH o HH12  Hora del día
 HH24  hora del día utilizando las 24
 MI  minutos
 SS  segundos

Funciones de agregación
Las funciones de agregación devuelven un único resultado numérico a partir del valor de una
columna para un conjunto de filas. De hecho, suelen utilizarse acompañadas de la clausula
GROUP_BY, como veremos más adelante.
• avg(<columna>)  valor medio de todos los valores de <columna>
• count(*)  cuenta el número de filas
• max(<columna>)  valor máximo almacenado en <columna>
• min(<columna>)  valor mínimo almacenado en <columna>

Grupo de Investigación Kybele P á g i n a | 12


Apuntes
Bases de Datos
El lenguaje SQL de Oracle

Ejemplos
-- cuantas filas hay en la tabla EMP
select count(∗) from EMP;
-- cuantas valores distintos tiene el campo JOB en la tabla EMP
select count(distinct JOB) from EMP;
-- suma de los salarios de los empleados que trabajan en el departamento 30
select sum(SAL) from EMP
where DEPTNO = 30;
AVG, MAX y MIN no tienen en cuenta las filas que tengan valor NULL para el campo seleccionado, mientras que COUNT si lo hace

Agrupación
La clausula GROUP BY, cuya sintaxis básica se muestra a continuación, permite agrupar las filas
que devuelve una consulta de acuerdo a las propiedades de dichas filas. Las filas que tienen el mismo
valor para las columnas por las que se agrupa forman un grupo. Para cada grupo se mostrará el valor
de las columnas indicado en la clausula SELECT.
select <lista_columnas>
from <lista_tablas>
where <condicion>
group by <lista_columnas_por_las_que_agrupar>
[having <condición_grupos>];

Ejemplo
-- recuperar el salario mínimo y máximo en cada departamento
select DEPTNO, min(SAL), max(SAL)
from EMP
group by DEPTNO;
-- las filas de la tabla EMP que tengan el mismo valor para la columna DEPTNO son
-- agrupadas. Las funciones de agrupación se aplican entonces para obtener el
-- mínimo y el máximo para el campo SAL en cada grupo resultante
DEPTNO MIN(SAL) MAX(SAL)
10 1300 5000
20 800 3000
30 950 2850

Utilizando la clausula WHERE podemos limitar el conjunto de filas con las que queremos que
Oracle trabaje para establecer los grupos.
Además, una vez establecidos los grupos, podemos utilizar la clausula HAVING para filtrarlos, es
decir, para mostrar los resultados sólo para los grupos que cumplan cierta condición
 Las columnas especificadas tanto en <lista_columnas> como en <condición_grupos> deben:
o Estar entre las columnas especificadas en <lista_columnas_por_las_que_agrupar> ó
o Verse afectadas por alguna de las funciones de agrupación que veíamos en la sección
anterior
o Nótese que la utilización de otras columnas no tendría sentido
Con todo, el orden de ejecución de una consulta que incluye clausulas de agrupación es el
siguiente:
1. FROM  de todas las tablas de la BBDD se escogen una o más
2. WHERE  de dichas tablas, se filtra el conjunto de filas con las que se trabajará
3. GROUP BY  se agrupan las filas restantes de acuerdo al valor de alguna de sus columnas
4. HAVING  se filtran esos grupos de acuerdo a alguna condición
5. Funciones de Agrupación  en caso de haberlas, se aplican las funciones de agrupación a cada
uno de los grupos resultantes del filtro anterior
6. SELECT  se escogen las columnas que se mostrarán para cada grupo
7. ORDER BY  se ordenan los resultados por algún/os campo/s
Ejemplo

Grupo de Investigación Kybele P á g i n a | 13


Apuntes
Bases de Datos
El lenguaje SQL de Oracle

-- recuperar el salario mínimo y el máximo de las secretarias en cada


-- departamento que tenga más de 3 secretarias
select DEPTNO, min(SAL), max(SAL)
from EMP
where JOB = ’CLERK’
group by DEPTNO
having count(∗) > 3;

Consulta de Datos (II)


En esta sección nos referimos a consultas que involucran a dos o más tablas. En este contexto se
muestra especialmente útil el uso de los ALIAS ya mencionados, que permitirán recuperar el valor de
columnas del mismo nombre de tablas distintas sin restar legibilidad a la consulta.
Ejemplo
-- las siguientes consultas son exactamente iguales, pero obviamente la primera es
-- menos redundante y verboso
select e.name, c.name from EMP e, COMPANY c;
select EMP.name, COMPANY.name from EMP, COMPANY;

Combinaciones
Toda consulta que implique varias tablas obliga a definir un criterio por el que combinar las filas
de dichas tablas. Para poder realizar la composición deben existir columnas comunes a las tablas, de
forma que al componer dos tablas A y B con las columnas comunes X e Y se satisface una condición
del tipo A.X=B.Y o similar (utilizando otros operadores, como >, <, etc).
Estas condiciones se incluyen en la condición de la claúsula WHERE de al consulta.
Ejemplo
-- mostrar junto a cada empleado el nombre de su departamento
select ENAME, E.DEPTNO, DNAME
from EMP E, DEPT D
where E.DEPTNO = D.DEPTNO
and JOB = ’SALESMAN’;

 En el ejemplo anterior, cada fila de la tabla EMP es combinada con cada fila de tabla DEPT
(producto cartesiano). Así, si las tablas tenían respectivamente m y n filas, el resultado de esta
combinación es una tabla temporal de m * n filas.
 De las filas de esta tabla temporal, nos quedamos con ellas para las que el valor de la columna
E.DEPTNO y D.DEPTNO es igual.
 Finalmente, de las filas resultantes nos quedamos con ellas para las que el valor de la columna
JOB es SALESMAN.
Conviene tener en cuenta que en una combinación podemos involucrar cualquier número de
tablas, siempre que seamos capaces de emparejarlas dos a dos. Incluso podemos especificar una
combinación de una tabla consigo misma, como en el siguiente ejemplo.
Ejemplo
-- mostrar el nombre de cada empleado junto al nombre de su jefe
select E1.ENAME, E2.ENAME
from EMP E1, EMP E2
where E1.MGR = E2.EMPNO;
-- utilizamos una copia de la tabla EMP (E2) como la tabla donde están almacenados
-- los datos de los jefes, y la combinamos con la tabla donde están los datos de
-- los empleados (E1)

Subconsultas

Grupo de Investigación Kybele P á g i n a | 14


Apuntes
Bases de Datos
El lenguaje SQL de Oracle

Podemos utilizar el resultado de una consulta para especificar la condición de una clausula
WHERE. En ese caso se dice que estamos hablando de una subconsulta que actúa como consulta. La
sintaxis de una condición WHERE que contenga una subconsulta suele ser de uno de los tipos
siguientes:
1. Pertenencia a subconjunto (operador in): la consulta devuelve sólo aquellos valores recuperados
por la consulta padre que están (o no) en el conjunto de valores devuelto por la subconsulta
-- recuperar todos los empleados que trabajen en un departamento radicado
-- en Bostón
select ∗ from EMP
where DEPTNO in
(select DEPTNO from DEPT
where LOC = ’BOSTON’);
-- si la consulta devolviese un único valor, podríamos sustituir ‘IN’ por ‘=’, pero
-- dado que no sabemos a priori el resultado de la subconsulta es preferible
-- utilizar el operador ‘IN’

2. Comparación: la consulta devuelve sólo aquellos los valores recuperados por la consulta padre
son (mayores|menores|iguales|…) que el valor recuperado por la subconsulta
-- recuperar el nombre de todos los empleados cuyo sueldo sea mayor que el sueldo
-- medio de las secretarias
select ENAME from EMP
where SAL >
(select AVG(SAL) from EMP
where EMP.JOB = ‘Clerk’);

Nótese en el ejemplo anterior que una subconsulta también puede referirse a la tabla de la
consulta que la contiene.
3. Comparación cuantificada: la consulta devuelve sólo aquellos valores recuperados por la
consulta padre que son (mayores|menores|iguales|…) que TODOS (ALL) o ALGUNO (ANY) de los
valores recuperados por la subconsulta. Evidentemente se utiliza cuando la subconsulta devuelve
varios valores.
-- recuperar todos los empleados del departamento 10 cuyo salario es mayor que el
-- salario de alguno de los empleados del departamento 30
select ∗ from EMP
where SAL >= any
(select SAL from EMP
where DEPTNO = 30)
and DEPTNO = 10;
-- sustituyendo el operador ‘any’ por el operador ‘all’ la explicación anterior
-- sigue vigente sin más que sustituir ‘alguno’ por ‘todos’

4. Existencia: la consulta devuelve sólo aquellas filas recuperadas por la consulta padre que hagan
que la subconsulta devuelva alguna (EXISTS) o ninguna (NOT EXISTS) fila
-- recuperar todos los departamentos que NO tengan empleados
select ∗ from DEPT
where not exists
(select ∗ from EMP
where DEPTNO = DEPT.DEPTNO);

Vistas
Podemos contemplar las vistas como tablas virtuales. No contienen datos, sino que proporcionan
una ventana a través de la cual pueden verse y cambiarse datos de las tablas sobre las que se define
la vista, que se llaman TABLAS BASE. Así, una vista no es más que una consulta sobre dichas tablas
base que queda almacenada en la BBDD.

Grupo de Investigación Kybele P á g i n a | 15


Apuntes
Bases de Datos
El lenguaje SQL de Oracle

create [or replace] [FORCE|NOFORCE] view <nombre_vista> [(<columnas)>)] as


<select-statement> [WITH READ ONLY]|[with check option [constraint <nombre>]];

 OR REPLACE: se utiliza por si la vista ya estuviera creada anteriormente.En tal caso se reescribe al
definicion de la vista sin necesidad de tener que borrarla previamente.
 FORCE: crea la vista independientemente de si las tablas base existen.
 NOFORCE: crea la vista sólo si las tablas base existen. Es la opción por defecto.
 <columnas>: permite definir nuevos nombres para referirse a las columnas de las tablas base
cuando estemos en el contexto de la vista.
 WITH READ ONLY: las tablas bases no podrán ser modificadas.
 WITH CHECK OPTION: sólo se permitirán aquellas modificciones sobre las tablas base que
produzcan filas que se correspondan con la consulta que define la vista. Se puede dar nombre a
esta restricción usanod la clausuala CONSTRAINT <nombre>.
Ejemplo
create view DEPT20 (ENAME, JOB, ANNUAL SALARY) as
select ENAME, JOB, SAL ∗ 12 from EMP
where DEPTNO = 20;

Una vez definida la vista, podemos usarla igual que cualquier otra tabla, es decir, podemos
recuperar filas de la vista. Nótese que esas filas no están físicamente almacenadas en ninguna tabla
de la BBDD, sino que se derivan, a partir de la consulta que especifica la vista, de las que SI hay
almacendas en las tablas base. Incluso podemos modificar dichas filas teniendo en cuenta ciertas
restricciones. En particula, no podemos modificar vistas que utilizaron algunas de las isguientes
construcciones en su definición:
 Combinaciones
 Funciones de agregación, como SUM, MIN, MAX, etc.
 Tests de comparación (IN, ANY, ALL) o tests de existencia (EXISTS)
 Clausulas GROUP BY o DISTINCT
Finalmente, al igual las tablas, las vistas se borran utilizando la sentencia DROP
DROP VIEW <nombre_vista>;

Diccionario de datos
ORACLE, como todo SGBD, mantiene un catálogo que almacena datos acerca de los usuarios,
tablas, privilegios, etc. Dado que son datos sobre los datos, se suele utilizar el nombre METADATOS
para referirse a esta información. En general, el diccionario de datos es el dominio de los
Administradores de la BBDD, pero algunos de los datos que contienen resultan muy útiles para
cualquier usuario. Por ejemplo, a cualquier usuario le interesa saber qué tablas ha creado o qué
restricciones ha definido sobre dichas tablas. Está información obviamente está guardada en el
diccionario de datos que está estructurado en 2 niveles: por un lado están las tablas base que
componen el diccionario, que son a las que suelen tener acceso sólo los administradores de la BBDD.
Sobre estas tablas se definen una serie de vistas que permiten a los usuarios de la BBDD tener acceso
a la información del diccionario que necesitaran para su trabajo diario.
Podemos acceder al catálogo por medio de vistas que pueden consultarse. Realizando una
consulta a la vista ALL_CATALOG vemos todos los objetos (tablas, vistas, sinónimos) visibles por el
usuario. Algunas vistas útiles son USER_TABLES, USER_VIEWS, etc.

Vistas del diccionario de datos


Las vistas del diccionario de datos son de 3 tipos:

Grupo de Investigación Kybele P á g i n a | 16


Apuntes
Bases de Datos
El lenguaje SQL de Oracle

 USER_: proporcionan información sobre los objetos del usuario que en ese momento esté
conectado a la BBDD
o Ejemplos: USER_TABLES, USER_VIEWS, USER_OBJECTS, USER_USERS, etc.
 ALL_: proporcionan información sobre los objetos del usuario que en ese momento esté
conectado a la BBDD y sobre todos aquellos objetos a los que tenga acceso por haber recibido el
permiso correspondiente
o Ejemplos: ALL_TABLES, ALL_VIEWS, ALL_OBJECTS, ALL_USERS, etc.
 DBA_: proporcionan información sobre todos los objetos de la BBDD. Sólo los usuarios con
privilegios DBA tienen acceso a los datos de estas vistas
o Ejemplos: DBA_TABLES, DBA_OBJECTS, DBA_USERS, etc.

Acceso a las tablas de otros usuarios


Si en algún momento damos permiso a un usuario para ver los objetos creados por otro usuario , el
primero puede referise a los objetos del segundo en cualquiera de sus consultas.
Por ejemplo, sea <john> un usuario de la BBDD y <tabla1> una tabla creada por dicho usuario. Si otor
usuario, al que previamente se le ha dado permiso para hacerlo, quiere referirse a la tabla creada por
<john> la sintaxis que debe emplear es la siguiente:
select * from <john>.<tabla1>;

Si esta situación se da a menudo, al segundo usuario puede convenirle crear un sinónimo para
referirse a la tabla de <john>:
Create synonim tabla1_john for <john>.<tabla1>;
-- a partir de este momento las 2 sentencias siguientes son equivalentes
select * from <john>.<tabla1>;
select * from tabla1_john;

Gestión de Transacciones
Cualquier secuencia de operaciones de modificación de datos (INSERT, UPDATE y DELETE) es una
transacción. Todos los cambios realizados por una transacción son almacenados en memoria
temporal (y por tanto permanecen invisibles para otros usuarios) hasta que se comprometen. Para
comprometer los cambios el usuario debe invocar la sentencia commit;
El siguiente ejemplo muestra esta situación.
CREATE TABLE Personas (
nombre VARCHAR2(25),
edad NUMBER);
Transacción T1 Transacción T2
SELECT * FROM Personas; SELECT * FROM Personas;
INSERT INTO PERSONAS VALUES
('PEPE', 35);
INSERT INTO PERSONAS VALUES
('PEPA', 33);
SELECT * FROM Personas; SELECT * FROM Personas;
-- La consulta devuelve los -- La consulta NO muestra los
-- datos de la nueva fila -- nuevos datos
COMMIT;
SELECT * FROM Personas;
-- Ahora si: la consulta
-- muestra los datos de la

Grupo de Investigación Kybele P á g i n a | 17


Apuntes
Bases de Datos
El lenguaje SQL de Oracle

-- nueva fila

Mientas el usuario no comprometa sus cambios, siempre puede deshacerlos. Para ello debe
utilizar la sentencia ROLLBACK.
No obstante, con el fin de evitar perdida de información indeseada la propia BBDD acostumbra a
realizar COMMIT implícitos, es decir, a comprometer los cambios realizados por el usuario aunque
este no lo soicite expresamente. En particular Oracle efectua un COMMIT implícito cada vez que:
 Se ejecuta una sentencia de definición de datos (CREATE, ALTER y DROP)
 El usuario cierra una sesión normalmente (i.e. no es un error producido por una caida de la red o
similar).

Grupo de Investigación Kybele P á g i n a | 18

También podría gustarte