You are on page 1of 131

.

Introduccin a SQL y SQL Avanzado


TABLA DE CONTENIDO

Introduccin a SQL y SQL Avanzado................................................................................ 0


Captulo 1 .................................................................................................................................. 4
INTRODUCCION A SQL ......................................................................................................... 4
INTRODUCCIN AL SQL*Plus ...................................................................................................... 5
CONCEPTOS BASICOS .................................................................................................................. 6
TIPOS DE DATOS BSICOS .......................................................................................................... 7
TABLAS UTILIZADAS EN LOS EJEMPLOS ............................................................................... 8
ENTORNO DE SQL DEVELOPER ............................................................................................... 10
Especificaciones de SQL DEVELOPER .................................................................................................... 10
Interfaz de conexin a SQL DEVELOPER ................................................................................................ 10
ENTORNO DE SQL*Plus ............................................................................................................... 14
Cmo entrar a SQL*Plus? ......................................................................................................................... 14
Cmo salir de SQL*Plus? .......................................................................................................................... 15
Cmo obtener ayuda de los comandos de SQL*Plus en lnea? .......................................................... 15
Cmo redireccionar la salida a impresora o archivo? ........................................................................... 15
COMANDOS DE SQL ..................................................................................................................... 18
Consultando Datos ........................................................................................................................................ 19
Seleccin condicionada de filas .................................................................................................................. 26
Captulo 2 ................................................................................................................................ 35
FUNCIONES DE SQL .......................................................................................................... 35
ORDENAMIENTO DE DATOS ...................................................................................................... 36
AGRUPAMIENTO DE DATOS ...................................................................................................... 38
Funciones de grupo ...................................................................................................................................... 38
Filtrando grupos de datos - La clusula HAVING..................................................................................... 39
OTRAS FUNCIONES DE SQL ...................................................................................................... 41
Funciones Numricas ................................................................................................................................... 41
Funciones de Fecha y Hora ......................................................................................................................... 42
Funciones de Caracteres ............................................................................................................................. 42
Funciones de Conversin de Datos ........................................................................................................... 43
Funciones Varias ........................................................................................................................................... 44
Juego de caracteres multilenguaje ms comunes ................................................................................... 45
FORMATOS DE SALIDA DE DATOS .......................................................................................... 45
Formatos numricos ms utilizados ........................................................................................................... 45
Formatos de fecha ms utilizados .............................................................................................................. 46
Manejo de valores nulos El valor predefinido NULL .............................................................................. 51
PRACTICA 1 ..................................................................................................................................... 53
PRACTICA 2 ..................................................................................................................................... 53
PRACTICA 3 ..................................................................................................................................... 54
PRACTICA 4 ..................................................................................................................................... 54
PRACTICA 5 .................................................................................................................................... 54
Captulo 3 ................................................................................................................................ 55
PRECEDENCIAS, SUBSTITUCIN DE VARIABLES Y SUBQUERIES. .................... 55
PRECEDENCIAS ............................................................................................................................. 56
SUBSTITUCION DE VARIABLES ................................................................................................ 57
SUBQUERIES .................................................................................................................................. 59
PRACTICAS CAPITULO 3 ............................................................................................................. 61
Captulo 4 ................................................................................................................................ 65
MANIPULANDO DATOS ...................................................................................................... 65
Manejando los datos ..................................................................................................................... 66
Sentencia Insert ............................................................................................................................................. 66
Sentencia Merge ........................................................................................................................................... 69
Sentencia UPDATE....................................................................................................................................... 71
Sentencia DELETE ....................................................................................................................................... 72
Sentencia TRUNCATE ................................................................................................................................. 72
Transacciones en la base de datos ............................................................................................................ 72
Read consistency .......................................................................................................................................... 75
Esto garantiza una vista consistente de los datos en todo momento. .................................................. 75
Los cambios realizados por un usuario no entran en conflicto con los cambios realizados por
otro usuario .................................................................................................................................................... 75
Asegura que en los mismos datos: ...................................................................................................... 75
Los lectores no esperen por los escritores ......................................................................................... 75
Los escritores no esperen por los lectores ......................................................................................... 75
Escritores esperen por los escritores................................................................................................... 75
Clausula FOR UPDATE en la sentencia SELECT ................................................................................... 76
PRACTICAS CAPITULO 4 ............................................................................................................. 77
Captulo 5 ................................................................................................................................ 79
TABLAS ................................................................................................................................... 79
CREANDO TABLAS ....................................................................................................................... 80
Constraints ..................................................................................................................................................... 80
Creando Tablas usando Subqueries .......................................................................................................... 84
ALTER TABLE ................................................................................................................................. 85
DROP TABLE ................................................................................................................................... 85
PRACTICAS CAPITULO 5 ............................................................................................................. 86
Captulo 6 ................................................................................................................................ 88
CREANDO OTROS OBJETOS ........................................................................................... 88
VISTAS .............................................................................................................................................. 89
Reglas para ejecutar operaciones DML en las vistas .............................................................................. 91
WITH CHECK OPTION ................................................................................................................................ 91
WITH READ ONLY ....................................................................................................................................... 92
DROP VIEW ................................................................................................................................................... 93
SECUENCIAS ................................................................................................................................... 93
Modificando Secuencias .............................................................................................................................. 96
INDICES............................................................................................................................................. 97
SINONIMOS ...................................................................................................................................... 99
TABLAS TEMPORALES .............................................................................................................. 100
TABLAS EXTERNAS .................................................................................................................... 102
PRACTICAS CAPITULO 6 ........................................................................................................... 105
Captulo 7 .............................................................................................................................. 106
MANEJANDO OBJETOS ................................................................................................... 106
ALTER TABLE ............................................................................................................................... 107
MANEJANDO COLUMNAS ....................................................................................................................... 107
MANEJANDO CONSTRAINTS ................................................................................................................. 110
RENOMBRANDO COLUMNAS Y CONSTRAINTS ............................................................................... 114
PRACTICAS CAPITULO 7 ........................................................................................................... 115
Captulo 8 .............................................................................................................................. 117
VISTAS DEL DICCIONARIO DE DATOS ........................................................................ 117
EL DICCIONARIO DE DATOS .................................................................................................... 118
PRACTICAS CAPITULO 8 ........................................................................................................... 120
Captulo 9 .............................................................................................................................. 123
CONTROLANDO EL ACCESO DE USUARIOS ............................................................ 123
PRIVILEGIOS DEL SISTEMA ..................................................................................................... 124
Creacin de Usuarios ................................................................................................................................. 125
PRIVILEGIOS DE OBJETOS....................................................................................................... 127
PRACTICAS CAPITULO 9 ........................................................................................................... 128
Captulo 1
INTRODUCCION A SQL

Introduccin a SQL y SQL Avanzado/ 4


INTRODUCCIN AL SQL*Plus

Para tener acceso a cualquier manejador de base de datos relacional, y para efectuar
cualquier operacin sobre los datos almacenados en la base de datos, es necesario el
uso de SQL (Structured Query Language - Lenguaje de Consultas Estructuradas) como
lenguaje intermediario.

SQL es un lenguaje no procedimental, el cual se caracteriza, por no requerir (de parte del
desarrollador), informacin sobre la ubicacin fsica de los archivos, ni de la distribucin
de los datos, es decir, al momento de efectuar una operacin cualquiera sobre la base de
datos, no es necesario indicar la ruta de acceso o PATH, ya que de esto se encargar el
manejador de la base de datos al momento de la creacin de las tablas. Otra de las
caractersticas de este lenguaje, es la de acceder a mltiples registros a la vez, con el
uso de una sola instruccin, sin importar si estos registros pertenecen a una o varias
tablas.

Para que los usuarios y programadores puedan tener acceso a SQL, ORACLE
ofrece un conjunto de herramientas desde las cuales se pueden ejecutar comandos
de SQL. Entre estas instrumentos tenemos Oracle SQL Developer es una
herramienta grfica gratuita diseada para simplificar las interaccinoes con la base
de datos. Con slo unos pocos clics, se pueden crear y depurar fcilmente
procedimientos almacenados, probar sentencias SQL y ver planes de optimizacin.

Otra de estas herramientas es SQL*Plus la cual permite usar interactivamente comandos


de SQL o bloques de PL/SQL, con el objeto de realizar operaciones en lnea que nos
permitirn consultar la informacin almacenada en la base de datos, crear nueva
informacin o modificar informacin existente, as como tambin producir reportes, sin
tener la necesidad de construir sofisticados programas.

Introduccin a SQL y SQL Avanzado/ 5


CONCEPTOS BASICOS

Tabla: Es la estructura bsica de almacenamiento de datos en un sistema manejador de


base de datos relacional. Una tabla consiste de una o ms unidades de informacin
(filas), similares a registros de un archivo convencional, donde cada una de ellas contiene
datos (columnas) de un mismo tipo, similares a los campos de un registro en un archivo
convencional.

Fila: Son las ocurrencias o registros de las tablas.

Columna: Es un campo que representa un tipo o atributo de datos en una tabla.

Valor: Es el dato existente, entre el cruce de una columna y una fila.

Vista: Es un objeto de la base de datos que muestra una representacin lgica de una o
varias tablas. Esta se deriva de una tabla pero no tiene su propio almacenamiento. Su
manejo es similar al de una tabla.

Join: Es una condicin de enlace en una consulta, la consulta est compuesta por datos
extrados de dos o ms tablas o vistas, gobernadas por la condicin.

Sistema de Manejo de Base de Datos Relacional: Es un programa de computadora de


propsito general, para el almacenamiento y recuperacin de datos, donde los datos
estn organizados en tablas y pueden ser relacionados unos con otros.

Administrador de Base de Datos: Es un usuario autorizado para otorgar y revocar el


acceso de otros usuarios al sistema, cumple funciones de control y organizacin de las
estructuras de los datos almacenados en la base de datos.

Buffer SQL: Es el rea donde SQL*PLUS almacena sus ms recientes comandos de


entrada.

Introduccin a SQL y SQL Avanzado/ 6


TIPOS DE DATOS BSICOS

CHAR(t): Lo conforman el conjunto de caracteres ingresables desde el teclado, esto es,


letras maysculas y minsculas, nmeros, y signos especiales tales como "@", "#", "%",
etc. El ancho mximo de este tipo, en caracteres, no debe ser mayor de 255. Su longitud
es fija de t caracteres.
Ejemplo: CHAR(10).

VARCHAR2(t): Lo conforman el mismo conjunto de caracteres que el anterior CHAR,


con la diferencia que este tipo de dato es de longitud variable con un mximo de t
caracteres.

DATE: Puede almacenar valores de tipo fecha y de tipo hora; las fechas van desde el
1ero de enero de 4.712 antes de Cristo, al 31 de diciembre de 4.712 despus de Cristo.

LONG : Similar a CHAR, pero puede almacenar 65.535 bytes de longitud. Este campo
tiene algunas restricciones:

- No se puede usar ms de una columna tipo long por tabla.


- No puede usarse para hacer un JOIN de tablas con una columna de tipo LONG.
- No se puede emplear una columna de tipo LONG, para realizar bsquedas.

NUMBER: Es un valor numrico, representado por uno o mas dgitos que van del cero
(0) al nueve (9), con los signos opcionales positivo (+), negativo (-) y punto decimal (.). El
mximo valor de NUMBER puede tener 38 dgitos.

Introduccin a SQL y SQL Avanzado/ 7


TABLAS UTILIZADAS EN LOS EJEMPLOS

En las secciones siguientes, se exponen varios ejemplos con la finalidad de ilustrar los
conceptos tericos expuestos en cada seccin. Los nombres de campos, tipos de datos y
los resultados presentados en algunos de ellos son extrados de tablas de ejemplo
predefinidas. La estructura y el contenido de estas tablas se muestra a continuacin:

Estructura de la tabla EMPLEADO:

Nombre Descripcin Tipo de Dato Tamao


Columna
EMPNO Numero o cdigo del empleado NUMBER 4
NOMBRE Nombre del empleado VARCHAR2 20
CARGO Cargo que ocupa el empleado VARCHAR2 10
JEFE Cdigo del jefe inmediato NUMBER 4
FINGRESO Fecha de ingreso del empleado DATE
SALARIO Salario que devenga el empleado NUMBER 7,2
COMISION Comisin que gana el empleado NUMBER 7,2
NUMDEPT Cdigo del departamento inicial de NUMBER 2
ingreso

Contenido de la tabla EMPLEADO:

EMPNO NOMBRE CARGO JEFE FINGRESO SALARIO COMISION NUMDEPT

300 MARIA SECRETARI 100 01-JAN-98 20000 2


PEREZ A
100 FRANCISC GERENTE 01-JAN-90 35000 600 1
O
200 MONTERO
LAURA GERENTE 01-JAN-90 38000 300 1
MONTILLA
400 LUIS CHOFER 100 01-JAN-00 10000 1
CARRILLO
500 CARLOS CHOFER 200 01-JAN-99 10000 2
FERNANDE
Z

Introduccin a SQL y SQL Avanzado/ 8


Estructura de la tabla EMP_INVESTIGACION:
Nombre Descripcin Tipo de Dato Tamao
Columna
EMPNO Numero o cdigo del empleado NUMBER 4
NOMBRE Nombre del empleado VARCHAR2 20
CARGO Cargo que ocupa el empleado VARCHAR2 10
NUMDEPT Cdigo del departamento inicial de NUMBER 2
ingreso

Contenido de la tabla EMP_INVESTIGACION:


EMPNO NOMBRE CARGO NUMDEP
T
100 FRANCISCO MONTERO GERENTE 1

200 LAURA MONTILLA GERENTE 1

400 LUIS CARRILLO CHOFER 1

Estructura de la tabla EMP_OPERACION:


Nombre Descripcin Tipo de Dato Tama
Columna o
EMPNO Numero o cdigo del empleado NUMBER 4
NOMBRE Nombre del empleado VARCHAR2 20
CARGO Cargo que ocupa el empleado VARCHAR2 10
NUMDEPT Cdigo del departamento inicial de NUMBER 2
ingreso

Contenido de la tabla EMP_OPERACIN:


EMPNO NOMBRE CARGO NUMDEP
T
300 MARIA PEREZ SECRETARIA 2

400 LUIS CARRILLO CHOFER 1

500 CARLOS FERNANDEZ CHOFER 2

Introduccin a SQL y SQL Avanzado/ 9


Estructura de la tabla DEPARTAMENTO:
Nombre Descripcin Tipo de Dato Tama
Columna o
NUMDEPT Nmero o cdigo del NUMBER 2
departamento
NOMBRE Nombre del departamento VARCHAR2 14
UBICACION En que ciudad esta ubicado el VARCHAR2 13
departamento

Contenido de la tabla DEPARTAMENTO:


NUMD NOMBRE UBICACIO
EPT
1 INVESTIGACION N
CARACAS
2 OPERACIONES VALENCIA
3 VENTAS CARACAS
4 ADMINISTRACION CARACAS

ENTORNO DE SQL DEVELOPER


SQL Developer es una herramienta grafica que simplifica las tareas de desarrollo y
administracin de base de datos, mejorando la productividad del usuario.

Especificaciones de SQL DEVELOPER

Incluido a partir de Oracle Database 11g Release 2


Desarrollado en Java
Soportado por Windows, Linux y Max OS X
Habilita la conectividad predeterminada mediante JDBC Driver
Permite conexiones a versiones de Oracle desde la 9.2.0.1

Interfaz de conexin a SQL DEVELOPER


Puede crear y probar conexiones para varias bases de datos y para mltiples
esquemas. Encontraremos varias pestaas, entre las cuales detallamos las que se
expresan a continuacin:

Introduccin a SQL y SQL Avanzado/ 10


Conexiones: es un objeto de SQL Developer que especifica la informacin necesaria
para conectarse a una base de datos especfica como un usuario especfico de esa
base de datos.
Archivos: identificada por el icono de la carpeta Archivos, esta pestaa le permite
acceder a archivos desde su mquina local sin tener que usar el men Archivo>
Abrir.
Reportes: identificada por el icono reportes, esta pestaa le permite ejecutar informes
predefinidos o crear y agregar sus propios informes.

Cuando inicia SQL Developer y se despliega el cuadro de dilogo Conexiones de


base de datos, SQL Developer importa automticamente todas las conexiones
definidas en el archivo tnsnames.ora en su sistema.
Puede crear conexiones adicionales como diferentes usuarios a la misma base de
datos o conectarse a las diferentes bases de datos.
Navegacin General y Uso
SQL Developer utiliza el lado izquierdo para navegar para buscar y seleccionar
objetos y el lado derecho para mostrar informacin sobre los objetos seleccionados.
Puede personalizar muchos aspectos de la apariencia y el comportamiento de SQL
Developer estableciendo preferencias.
Nota: Debe definir al menos una conexin para poder conectarse a un esquema de
base de datos y emitir consultas SQL o ejecutar procedimientos / funciones.

Creando conexiones
1. En la pestaa de conexiones, presionamos botn de la derecha del mouse
sobre Connections y seleccionamos New Connection.
2. Aparece una ventana titulada New/Select Database Connection, all se
ingresan diferentes datos, tales como, el nombre de la conexin, el usuario y
password del esquema que usaremos para conectarnos. De igual forma
debemos llenar otros datos, tales como:
a. Role: hacemos uso de SYSDBA o default.

Introduccin a SQL y SQL Avanzado/ 11


b. Tipo de Conexin: tenemos las siguientes opciones:
Basic: ingresamos el host name y el SID para la base de datos a la
cual nos queremos conectar. Puerto 1521. Tambien se puede
escoger ingresar el Service Name si se esta usando una conexin
a una base de datos remota.
TNS: En esta opcin se pueden selectionar cualquiera de los alias
del arhcivo tnsnames.ora.
LDAP: Se pueden buscar servicios de base de datos en Oracle
Internet Directory, el cual es un componente de Oracle Identity
Management.
Advanced: Tambien se puede definer una customizada Java
Database Connectivity (JDBC) URL para conectarse a la base de
datos.
c. Presionamos Test para asegurarnos que la conexin se establece
satisfactoriamente.
d. Una vez teniendo el estatus Success, procedemos a presionar
Connect para empezar a trabajar.
.

Introduccin a SQL y SQL Avanzado/ 12


Usando SQL Developer
En el rea de trabajo de SQL Developer podemos introducir y ejecutar sentencias
SQL, PL / SQL y SQL * Plus. Especificar acciones que pueden ser procesadas por la
conexin de base de datos asociada con esa conexin.
Para esto contamos con unos iconos en el toolbar del rea de trabajo. Entre esos
iconos podemos sealar:

1. Execute: ejecuta la sentencia donde el cursor este localizado, dentro del


rea de sentencias. Se pueden usar variables Bind pero no substitucin de
variables.
2. Run Script: ejecuta todas las sentencias que se encuentran en el rea de
sentencias. Se pueden usar variables Bind pero no substitucin de
variables.
3. Commit: Escribe los cambios en la base de datos y finaliza la transaccin.
4. Rollback: Desecha los cambios, sin escribir nada en la base de datos y
finaliza la transaccin.
5. Cancel: para la ejecucin de cualquier sentencia que se est ejecutando.
6. SQL History: muestra una caja de dialogo con informacin sobre las
sentencias sql que se han ejecutado.
7. Execute Explain Plan: genera el plan de ejecucin, el cual puede ser
visualizado usando la pestaa de explain.
8. Autotrace: genera informacin de la traza de la sentencia.
9. Clear: borra la o las sentencias que se encuentren en el rea de sentencias.

Introduccin a SQL y SQL Avanzado/ 13


ENTORNO DE SQL*Plus

Cmo entrar a SQL*Plus?


Para tener acceso a la base de datos, usando el lenguaje SQL, lo primero que debemos
hacer es activar a SQL*Plus. La forma de activarlo, depende del entorno en el cual se
est trabajando, en ambiente UNIX es la siguiente :

- Escribir <sqlplus> y aceptar la ejecucin pulsando la tecla <Enter>


- Despus, SQL*Plus le pedir su nombre de usuario:
Username: NOMBRE DE USUARIO <Enter>
- Inmediatamente despus, SQL*Plus le pedir su clave de acceso.
Password: CLAVE DE ACCESO <Enter>

Nota : SQL*Plus no dejar que su clave de acceso sea visualizada.


Una vez conectado a SQL*Plus, aparecer el prompt el cual indicar que SQL*Plus est
activo:
SQL >

Introduccin a SQL y SQL Avanzado/ 14


Cmo salir de SQL*Plus?
Para poder salir de SQL*Plus (en forma permanente), deber escribir el comando EXIT o
QUIT y aceptar la ejecucin. (Terminar cualquier transaccin pendiente)

Cmo obtener ayuda de los comandos de SQL*Plus en lnea?


SQL*Plus ofrece la ayuda en lnea, la cual podr ser activada mediante el comando
HELP.

Nota: no siempre ste comando se encuentra disponible, ya que esto depender del
criterio del Administrador de la base de datos.

Utilizando el comando HELP, se pueden listar todos los comandos de SQL y SQL*Plus o
un comando en particular, para listar todos los comandos utilizamos la instruccin:

SQL > HELP


Para visualizar la informacin sobre un comando en particular, utilizamos la instruccin:
SQL > HELP COMANDO

Cmo redireccionar la salida a impresora o archivo?

Esto se logra con el comando SPOOL.


Sintaxis : SPOOL [nombre de archivo | OFF | OUT ]
Cuando utilizamos un nombre de archivo, estamos dirigiendo el reporte hacia un archivo.
Con la utilizacin de OFF, cerramos el archivo abierto y se hace la escritura a disco
Con la utilizacin de OUT, estamos dirigiendo el reporte hacia la impresora

Comandos de edicin de SQL*Plus


Las ltimas lneas de comando utilizadas, o un archivo de instrucciones guardado
pueden editarse utilizando el editor de SQL*Plus, para esto, desde el prompt SQL>
podemos utilizar los comandos siguientes:

Introduccin a SQL y SQL Avanzado/ 15


APPEND: Adiciona texto en el buffer al final de la lnea en curso.
Forma abreviada: A
Sintaxis: APPEND Texto

CHANGE: Realiza cambios en el texto de la lnea en curso.


Forma abreviada: C.
Sintaxis: CHANGE separador TEXTO VIEJO [separador [TEXTO NUEVO [separador]]]

Nota: como separador puede ser usado "/", "!" o .

CLEAR: Limpia o borra el valor o seleccin en curso para una opcin especfica.
Forma abreviada: CL
Sintaxis: CLEAR Opcin

Donde Opcin puede ser alguna de las siguientes:


BREAKS: Remueve las especificaciones realizadas con el comando BREAK
BUFFER: Remueve el texto del buffer. Tiene el mismo efecto que CLEAR SQL,a menos
que se utilicen mltiples buffers
COLUMNS : Remueve los valores impuestos por el comando COLUMN
COMPUTES : Remueve las especificaciones realizadas con el comando COMPUTE
SCREEN : Borra la pantalla
SQL: Remueve el texto del buffer de SQL

DEL: Borra la lnea actual del buffer.


Sintaxis: DEL

INPUT: Adiciona en el buffer una o ms lneas de texto inmediatamente despus de la


lnea en curso.
Forma abreviada: I.

Introduccin a SQL y SQL Avanzado/ 16


Sintaxis para adicionar una lnea en el buffer:

INPUT Texto (aceptar comando)


Sintaxis para adicionar una o ms lneas en el buffer:

INPUT (aceptar comando)


Texto_1 (aceptar comando)

Texto_2 (aceptar comando)

. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
Texto_n (aceptar comando)
(aceptar nuevamente para concluir la adicin de lneas al buffer)

LIST: Muestra una o ms lneas almacenadas en el buffer de SQL.


Forma abreviada: L
Sintaxis : LIST [ n | n m | n * | n LAS | * | * n | * LAST | LAST ]

Donde los trminos usados significan :


n Lista la lnea "n".
n m Lista desde la lnea "n" hasta la "m".
n *Lista desde la lnea "n" hasta la lnea en curso.
n LAST Lista desde la lnea "n" hasta la ultima lnea.
* Lista la lnea en curso.
* n Lista desde la lnea en curso hasta la lnea "n".
* LAST Lista desde la lnea en curso hasta la ultima lnea.
LAST Lista la ultima lnea.

Introduccin a SQL y SQL Avanzado/ 17


COMANDOS DE SQL

Los comandos de SQL permiten crear, almacenar, cambiar, recuperar, y en general,


mantener la informacin almacenada en la base de datos ORACLE.
Podemos clasificar los comandos de SQL en tres grupos:
Comandos de manipulacin de datos
Comandos de definicin de datos
Comandos de Control de Transacciones
Comandos de control de acceso

La siguiente tabla muestra los comandos segn su clasificacin:

SELECT Comando para la recuperacin de datos (Consulta)


INSERT
UPDATE Comandos de Manipulacin de Datos (DML)
DELETE
CREATE
ALTER
DROP Comandos de Definicin de Datos (DDL)
TRUNCATE
RENAME
COMMIT
ROLLBACK Comandos de Control de Transacciones
SAVEPOINT
GRANT Comandos de Control de Acceso (DCL)
REVOKE
DESCRIBE
HOST Comandos de SQL*
CONNECT

Introduccin a SQL y SQL Avanzado/ 18


Consultando Datos

Para consultar datos almacenados en la base de datos se debe hacer uso de la


instruccin SELECT.

SELECT : Esta sentencia muestra una o ms filas de datos, con sus respectivas
columnas, las cuales pueden ser extradas de una o ms tablas, vistas o sinnimos. El
nmero de columnas a visualizar puede ser total o parcial.

Para que esta sentencia sea exitosa, es necesario:


- Que exista el objeto (tabla, vista o sinnimo) que contiene los datos a visualizar
- Que el usuario que realiza la consulta posea el privilegio de acceso al objeto o los
privilegios del administrador de la base de datos (DBA)

Los parmetros mnimos requeridos para el uso de esta sentencia son:


SELECT Columnas
FROM Origen_datos;

Columnas: son los nombres de todas aquellas columnas que se desean visualizar,
debern estar separadas por una coma (,). Si se desean visualizar todas las columnas de
la tabla, se podr abreviar la operacin, colocando en lugar de los nombres de las
columnas, un asterisco (*). Adicionalmente se puede usar como columnas de
visualizacin constantes, operaciones aritmticas, funciones, nidos de funciones y
funciones de grupo.

Origen _ datos: son los nombres de todas aquellas tablas, vistas o sinnimos de los
cuales se desea extraer la informacin, los cuales debern estar separados por una
coma (,) y tener un alias.

Introduccin a SQL y SQL Avanzado/ 19


S E L E C C I N P AR C I AL D E C O L U M N AS

Como se dijo anteriormente se pueden visualizar de forma total o parcial las columnas de
una tabla. Para realizar la seleccin parcial se deben listar los nombres de columnas que
se desea mostrar separadas por una coma.
Sintaxis: SELECT columna1, columna2, ... , columna-n
FROM Origen_datos;

A continuacin se muestra un ejemplo de aplicacin:


Ejemplo 1: Realizar una consulta que permita obtener, desde la tabla EMPLEADO,
los campos NOMBRE, CARGO, SALARIO, NUMDEPT, usando para
ello, los nombres de cada una de las columnas.
Nota: lo indicado en cursiva pertenece al prompt de SQL, por lo tanto no deber
transcribirse.

SQL> SELECT NOMBRE, CARGO, SALARIO, NUMDEPT


2 FROM EMPLEADO;

La ejecucin de la instruccin producir un resultado similar al siguiente:


NOMBRE CARGO SALARIO NUMDEPT
-------------------- -------------------------------------------------- ---------- ----------
FRANCISCO MONTERO GERENTE 50000 1
LAURA MONTILLA GERENTE FINANCIERO 42000 4
MARIA PEREZ SECRETARIA 20000 4
LUIS CARRILLO CHOFER 10000 1
CARLOS FERNANDEZ CHOFER 10000 4
JOSE PERALES ANALISTA CONTABLE 25000 4
LUIS PERNIA ANALISTA ADMINISTRATIVO 30000 4
LEONOR PEREZ GERENTE OPERACIONES 35000 2
JOSE LOPEZ CHOFER 10000 2
MARIA BLANCO SECRETARIA 20000 2

SELECCIN TOTAL DE C OLUMNAS

Para realizar la seleccin total se coloca un asterisco (*) en lugar de la lista de


columnas separadas por coma.

Sintaxis: SELECT *
FROM tabla;

20
A continuacin se muestra un ejemplo de aplicacin:

Ejemplo 2: Realizar la consulta de todas las columnas de la tabla empleado, usando


para ello, el asterisco (*).

SQL> SELECT *
2 FROM EMPLEADO;

La ejecucin producir un resultado similar al siguiente:


EMPNO NOMBRE CARGO JEFE FINGRESO SALARIO COMISION NUMDEPT

---------- -------------------- -------------------------------------------------- ---------- ------

100 FRANCISCO MONTERO GERENTE 01-JAN-90 50000 600 1

200 LAURA MONTILLA GERENTE FINANCIERO 01-JAN-90 42000 300 4

300 MARIA PEREZ SECRETARIA 100 01-JAN-98 20000 4

400 LUIS CARRILLO CHOFER 100 01-JAN-00 10000 1

500 CARLOS FERNANDEZ CHOFER 200 01-JAN-99 10000 4

600 JOSE PERALES ANALISTA CONTABLE 200 15-SEP-00 25000 4

700 LUIS PERNIA ANALISTA ADMINISTRATIVO 200 01-MAR-00 30000 4

800 LEONOR PEREZ GERENTE OPERACIONES 100 01-JAN-90 35000 2

900 JOSE LOPEZ CHOFER 800 01-MAR-90 10000 2

1000 MARIA BLANCO SECRETARIA 800 01-JAN-90 20000 2

O P E R AC I O N E S A R I T M T I C AS E N U N A C O N S U L T A

Para utilizar operaciones aritmticas en una consulta, se especifica la operacin


utilizando la columna involucrada como si fuera una variable. La tabla siguiente muestra
las operaciones aritmticas soportadas por SQL*Plus, respetando el orden de
precedencia.

Smbolo del Significado


Operador
* Multiplicacin
/ Divisin
+ Suma
- Resta

El orden de precedencia establecido puede cambiarse utilizando parntesis "( )", para
indicar la precedencia deseada.

21
En el siguiente ejemplo se ilustra la forma de efectuar una operacin aritmtica en
una consulta:

Ejemplo 3: Realizar una consulta de las columnas NOMBRE y SALARIO, de la tabla


EMPLEADO, calculando adems un bono del 10 % sobre el salario

SQL> SELECT NOMBRE, SALARIO, SALARIO*0.10 BONO


2 FROM EMPLEADO;

La ejecucin producir una salida similar a la siguiente:


NOMBRE SALARIO BONO
-------------------- ---------- ----------
FRANCISCO MONTERO 50000 5000
LAURA MONTILLA 42000 4200
MARIA PEREZ 20000 2000
LUIS CARRILLO 10000 1000
CARLOS FERNANDEZ 10000 1000
JOSE PERALES 25000 2500
LUIS PERNIA 30000 3000
LEONOR PEREZ 35000 3500
JOSE LOPEZ 10000 1000
MARIA BLANCO 20000 2000

E L I M I N AN D O V A L O R E S D U P L I C A D O S - L A C L U S U L A D I S T I N C T

Esta clusula forma parte de la instruccin SQL y sirve para eliminar valores
repetidos en una consulta, la sintaxis es la siguiente:

SELECT DISTINCT Columnas


FROM Origen_datos;

Ejemplo 4: Realizar una consulta de todos los cargos que posee la empresa, sin
repetir ningn cargo.

SQL > SELECT DISTINCT CARGO


2 FROM EMPLEADO;
La ejecucin producir un resultado similar al siguiente:

CARGO
---------------------------
GERENTE
SECRETARIA
....
ANALISTA ADMINISTRATIVO
CHOFER

22
C O N S U L T AN D O L A E S T R U C T U R A DE UN OBJETO - EL
CO M ANDO DE SCRI BE

Este comando permite visualizar la estructura de una tabla o vista y las restricciones
asociadas a los datos que almacenar. Indica los nombres, tipo y tamao de las
columnas que conforman el objeto, y muestra adems las columnas que pueden estar
vacas al momento de almacenar una fila de datos y cuales no deben estarlo.

Si al momento de manipular una tabla o vista, no recuerda los nombres de las columnas
o las caractersticas de estas, se puede hacer uso del comando DESCRIBE para obtener
la informacin.

Sintaxis: DESCRIBE Origen_datos


Forma Abreviada: DESC

Origen_datos: es el nombre de la tabla, vista o sinnimo de la cual se desea conocer : el


nombre de las columnas; con datos nulos; y tipo de las columnas (NUMBER, CHAR,
ETC).

Ejemplo 5:

SQL > DESCRIBE empleado;

La ejecucin producir un resultado similar al siguiente:

Name Null Type


-------- ---- ------------
EMPNO NUMBER(4)
NOMBRE VARCHAR2(20)
CARGO VARCHAR2(50)
JEFE NUMBER(4)
FINGRESO DATE
SALARIO NUMBER(7,2)
COMISION NUMBER(7,2)
NUMDEPT NUMBER(2)

23
ALI AS O NOMBRE SUSTI TUTO

Un alias es un nombre temporal que sustituye a un nombre de tabla o de columna, pero


que slo tiene efecto durante la operacin en curso.
Los alias incorporan flexibilidad y potencia a la consulta, son utilizados cuando:
Se necesita abreviar el nombre original.
Cuando se manejan dos o ms tablas en una operacin, y en estas existen
columnas de igual nombre
En este caso se crea una ambigedad en la consulta, ya que el manejador de la base de
datos, al recuperar las filas con informacin no sabr de qu tabla debe seleccionar la
columna con nombre duplicado. En este caso se debe usar un alias de tabla, el cual debe
anteponerse a la etiqueta de las columnas con el mismo nombre:
Cuando queremos cambiar el nombre de la etiqueta que identifica la
columna, al momento de visualizar la informacin extrada de la base de
datos
A continuacin se muestran algunos ejemplos del uso de alias en consultas:

Ejemplo 6: Realizar una consulta del campo NOMBRE de la tabla EMPLEADO, que
permita etiquetar la columna NOMBRE con el rtulo NOMBRE DEL
TRABAJADOR

SQL > SELECT NOMBRE "NOMBRE DE TRABAJADOR"


2 FROM EMPLEADO;

El resultado debe ser similar al siguiente, ntese el nombre de la cabecera de la


columna:

NOMBRE DE TRABAJADOR
--------------------
FRANCISCO MONTERO
LAURA MONTILLA
MARIA PEREZ
LUIS CARRILLO
CARLOS FERNANDEZ
JOSE PERALES
LUIS PERNIA
LEONOR PEREZ
JOSE LOPEZ
MARIA BLANCO

24
Ejemplo 7: Realizar la misma consulta de (8) rotulando la columna NOMBRE con la
etiqueta NOM

SQL > SELECT NOMBRE NOM


2 FROM EMPLEADO;

NOM
--------------------
FRANCISCO MONTERO
LAURA MONTILLA
MARIA PEREZ
LUIS CARRILLO
CARLOS FERNANDEZ
JOSE PERALES
LUIS PERNIA
LEONOR PEREZ
JOSE LOPEZ
MARIA BLANCO

Ejemplo 8: Realizar una consulta del campo NOMBRE y NUMERO DE


DEPARTAMENTO de las tablas EMPLEADO y DEPARTAMENTO
(Ntese que en ambas tablas existe el campo NUMDEPT)

SQL > SELECT NOMBRE, DEP.NUMDEPT


2 FROM EMPLEADO, DEPARTAMENTO DEP;

ORA-00918: column ambiguously defined


00918. 00000 - "column ambiguously defined"

Ejemplo 9: Realizar una consulta del campo NOMBRE y SALARIO de la tabla


EMPLEADO y calcular un bono del 10% del SALARIO.

SQL > SELECT NOMBRE, SALARIO * .10 BONO


2 FROM EMPLEADO;

NOMBRE BONO
-------------------- ----------
FRANCISCO MONTERO 5000
LAURA MONTILLA 4200
MARIA PEREZ 2000
LUIS CARRILLO 1000
CARLOS FERNANDEZ 1000
JOSE PERALES 2500
LUIS PERNIA 3000
LEONOR PEREZ 3500
JOSE LOPEZ 1000
MARIA BLANCO 2000

25
Seleccin condicionada de filas

La instruccin SELECT puede recuperar, en una sola consulta, mltiples registros o filas,
las cuales pueden provenir de una o ms tablas, pero su verdadera utilidad radica en
poder seleccionar datos que cumplan con una determinada condicin. Para obtener
subconjuntos de datos que cumplan con una o ms condiciones se utiliza la clusula
WHERE, en combinacin con la ya conocida instruccin SELECT ... FROM

La sintaxis de la instruccin SELECT condicionada es la siguiente:


SELECT Columnas
FROM Origen_datos
WHERE Condiciones;

En este caso Condiciones contiene las restricciones. Est formada por nombres de
columnas, constantes, expresiones y un operador de comparacin. Las cadenas de
caracteres y las fechas que aparecern en la condicin deben estar encerradas entre
comillas simples () y todos los casos de comparacin de caracteres diferencian los casos
de maysculas y minsculas.

O P E R AD O R E S D E C O M P AR AC I N

Los operadores de comparacin son utilizados a continuacin de la clusula WHERE, en


condiciones que comparan una expresin con otra. La siguiente tabla muestra los
operadores de comparacin, respetando el orden de precedencia entre estos.

Smbolo del operador Significado


= Igual a
!= <> ^= Diferente de
> Mayor que
>= Mayor o igual que
< Menor que
<= Menor o igual que

26
BETWEEN ... AND ... Entre dos valores (inclusive)
IN ( lista_de_valores ) Igual a uno de los elementos de la lista de valores
LIKE Busca todo lo que cumpla con el patrn de bsqueda
IS NULL Si el valor es nulo

Ejemplo 10 : Realizar una consulta que permita mostrar todos los empleados cuyo
salario este entre 20.000 y 40.000.

SQL> SELECT *
2 FROM EMPLEADO
3 WHERE SALARIO BETWEEN 20000 AND 40000;

Esta consulta producir un resultado similar al siguiente:

EMPNO NOMBRE CARGO JEFE FINGRESO SALARIO COMISION NUMDEPT

---------- -------------------- -------------------------------------------------- ---------- ------

300 MARIA PEREZ SECRETARIA 100 01-JAN-98 20000 4

600 JOSE PERALES ANALISTA CONTABLE 200 15-SEP-00 25000 4

700 LUIS PERNIA ANALISTA ADMINISTRATIVO 200 01-MAR-00 30000 4

800 LEONOR PEREZ GERENTE OPERACIONES 100 01-JAN-90 35000 2

1000 MARIA BLANCO SECRETARIA 800 01-JAN-90 20000 2

Ejemplo 11: Realizar una consulta que permita mostrar todos los empleados que
devengan salarios de 10.000, 11.000 y 20.000

SQL> SELECT *
2 FROM EMPLEADO
3 WHERE SALARIO IN (10000, 11000, 20000);

El resultado de esta consulta debe ser similar al siguiente:

EMPNO NOMBRE CARGO JEFE FINGRESO SALARIO COMISION NUMDEPT

---------- -------------------- -------------------------------------------------- ---------- ------

300 MARIA PEREZ SECRETARIA 100 01-JAN-98 20000 4

400 LUIS CARRILLO CHOFER 100 01-JAN-00 10000 1

500 CARLOS FERNANDEZ CHOFER 200 01-JAN-99 10000 4

900 JOSE LOPEZ CHOFER 800 01-MAR-90 10000 2

1000 MARIA BLANCO SECRETARIA 800 01-JAN-90 20000 2

27
Ejemplo 12 : Realizar una consulta que permita mostrar todos los empleados que
tengan en la segunda posicin de su nombre la letra "A".

SQL> SELECT *
2 FROM EMPLEADO
3 WHERE NOMBRE LIKE '_A%';

EMPNO NOMBRE CARGO JEFE FINGRESO SALARIO COMISION NUMDEPT

---------- -------------------- -------------------------------------------------- ---------- ------

200 LAURA MONTILLA GERENTE FINANCIERO 01-JAN-90 42000 300 4

300 MARIA PEREZ SECRETARIA 100 01-JAN-98 20000 4

500 CARLOS FERNANDEZ CHOFER 200 01-JAN-99 10000 4

1000 MARIA BLANCO SECRETARIA 800 01-JAN-90 20000 2

O P E R AD O R E S L G I C O S

Los operadores lgicos combinan los resultados de dos expresiones de comparacin


para producir un resultado simple (verdadero o falso). En ORACLE existen tres
operadores lgicos los cuales se describen a continuacin:

Smbolo del Significado


operador
AND Retorna VERDADERO si todos los componentes de la expresin
son verdaderos
OR Retorna VERDADERO si al menos uno de los componentes es
verdadero
NOT Invierte el valor de verdad de la expresin

Nota: Para cambiar el orden de precedencia de alguno de los operadores, tanto de


comparacin como lgicos, se deber hacer uso de los parntesis "(", ")"

Ejemplo 13: Realizar una consulta que permita mostrar todos los empleados, que
pertenezcan al departamento 1 y que devenguen un salario mayor de
20000 y el cargo sea GERENTE

SQL> SELECT *
2 FROM EMPLEADO
3 WHERE NUMDEPT = 01
4 AND SALARIO > 20.000
5 AND CARGO = 'GERENTE';

28
El resultado debe ser similar al siguiente:

EMPNO NOMBRE CARGO JEFE FINGRESO SALARIO COMISION NUMDEPT

---------- -------------------- -------------------------------------------------- ---------- ------

100 FRANCISCO MONTERO GERENTE 01-JAN-90 50000 600 1

O P E R AD O R E S D E C O N J U N T O

Los operadores de seleccin combinan dos o ms consultas en un resultado. Se pueden


interpretar como operaciones efectuadas sobre conjuntos donde los elementos son las
filas que retorna cada consulta en particular.
Se conocen bsicamente los siguientes operadores de seleccin:
- UNION
- INTERSECT
- MINUS
Operador UNION: Combina filas comunes y no comunes de dos o ms tablas en un solo
resultado, eliminando las filas duplicadas. La siguiente imagen muestra una
representacin grfica del operador UNION.

Ejemplo 16: Realizar una consulta que permita mostrar todos los empleados por
departamento, mostrarlos a partir de las tablas de departamentos
EMP_OPERACIN, EMP_INVESTIGACION.

Caso 1: Realizando las consultas por separado obtendremos:

SQL> SELECT EMPNO, NOMBRE, CARGO, NUMDEPT


2 FROM EMP_OPERACION;

El resultado ser el siguiente, todos los empleados del departamento de operaciones:

29
EMPNO NOMBRE CARGO NUMDEPT
--------- -------------------- ---------- ----------
300 MARIA PEREZ SECRETARIA 2
400 LUIS CARRILLO CHOFER 1
500 CARLOS FERNANDEZ CHOFER 2

SQL> SELECT EMPNO, NOMBRE, CARGO, NUMDEPT


2 FROM EMP_INVESTIGACION;

El resultado ser el siguiente, todos los empleados del departamento de


investigacin:

EMPNO NOMBRE CARGO NUMDEPT


---------- -------------------- ---------- ----------
100 FRANCISCO MONTERO GERENTE 1
200 LAURA MONTILLA GERENTE 1
400 LUIS CARRILLO CHOFER 1

Caso 2: Utilizando el operador UNION. Ntese que se eliminan los duplicados.

SQL> SELECT EMPNO, NOMBRE, CARGO, NUMDEPT


2 FROM EMP_OPERACION
3 UNION
4 SELECT EMPNO, NOMBRE, CARGO, NUMDEPT
5 FROM EMP_INVESTIGACION;

El resultado ser el siguiente, observe que el empleado LUIS CARRILLO aparece una
sola vez, en lugar de una vez por cada departamento:
EMPNO NOMBRE CARGO NUMDEPT
---------- -------------------- ---------- ----------
100 FRANCISCO MONTERO GERENTE 1
200 LAURA MONTILLA GERENTE 1
300 MARIA PEREZ SECRETARIA 2
400 LUIS CARRILLO CHOFER 1
500 CARLOS FERNANDEZ CHOFER 2

Si se requiere visualizar todos, repitiendo los comunes, utilizamos el operador UNION


ALL.

30
Operador INTERSECT: Obtiene como resultado las filas comunes a dos o ms tablas,
eliminando las filas que no pertenecen a todas las tablas a la vez. La siguiente imagen
muestra una representacin grfica del operador INTERSECT (INTERSECCIN).

Ejemplo 17: Realizar una consulta que permita mostrar todos los empleados que
prestan sus servicios en los dos departamentos.

Las consultas individuales sern iguales al ejemplo 5 anterior. Haciendo uso del
operador INTERSECT, la consulta ser:

SQL> SELECT EMPNO, NOMBRE, CARGO, NUMDEPT


2 FROM EMP_OPERACION
3 INTERSECT
4 SELECT EMPNO, NOMBRE, CARGO, NUMDEPT
5 FROM EMP_INVESTIGACION;

El resultado ser el siguiente, ntese que solo retorna el empleado LUIS CARRILLO que
presta sus servicios en los dos departamentos:

EMPNO NOMBRE CARGO NUMDEPT


---------- -------------------- ---------- ----------
400 LUIS CARRILLO CHOFER 1

Operador MINUS: Muestra las filas que pertenecen a la primera consulta y que no
aparecen en la segunda consulta. Es decir recupera las filas de la primera consulta,
recupera las filas de la segunda consulta y elimina tanto las filas comunes como las de la
segunda consulta. La siguiente imagen muestra una representacin grfica del operador
MINUS (MENOS).

31
Ejemplo 18: Realizar una consulta que permita mostrar todos los empleados que
solo prestan sus servicios en el departamento de OPERACIONES.

SQL> SELECT EMPNO, NOMBRE, CARGO, NUMDEPT


2 FROM EMP_OPERACION
3 MINUS
4 SELECT EMPNO, NOMBRE, CARGO, NUMDEPT
5 FROM EMP_INVESTIGACION;

El resultado ser el siguiente, ntese que se elimina el empleado LUIS CARRILLO ya


que este presta sus servicios tambin en el departamento de INVESTIGACION:

EMPNO NOMBRE CARGO NUMDEPT


---------- -------------------- ---------- ----------
300 MARIA PEREZ SECRETARIA 2
500 CARLOS FERNANDEZ CHOFER 2

O P E R AD O R E S D E C O N C AT E N AC I O N

Un operador de concatenacin es el que enlaza columnas o cadenas de caracteres a


otras columnas. Est representado por dos barras verticales (||) y crea una columna
resultante que es una expresin de tipo carcter.

Ejemplo 19: Realizar una consulta que permita mostrar todos los empleados,
mostrando el nombre y el cargo como una sola columna.

SQL> SELECT NOMBRE||CARGO "NOMBRE Y CARGO"


2 FROM EMPLEADO;

NOMBRE Y CARGO
------------------------------------------
FRANCISCO MONTEROGERENTE
LAURA MONTILLAGERENTE FINANCIERO
MARIA PEREZSECRETARIA
LUIS CARRILLOCHOFER
CARLOS FERNANDEZCHOFER
JOSE PERALESANALISTA CONTABLE
LUIS PERNIAANALISTA ADMINISTRATIVO
LEONOR PEREZGERENTE OPERACIONES
JOSE LOPEZCHOFER
MARIA BLANCOSECRETARIA

32
C AD E N AS D E C A R AC T E R E S L I T E R AL E S

Un literal es un carcter, un nmero o una fecha que se incluye en la instruccin


SELECT. Los valores literales de fecha y carcter deben incluirse entre comillas
simples. Cada cadena de caracteres se emite una vez para cada fila devuelta.

Ejemplo 20: Realizar una consulta que permita mostrar todos los empleados,
mostrando el nombre y el cargo como una sola columna, colocando el literal se
desempea como.

SQL> SELECT NOMBRE||' SE DESEMPEA COMO '||CARGO "NOMBRE Y CARGO"


2 FROM EMPLEADO;

NOMBRE Y CARGO
------------------------------------------------------------------
FRANCISCO MONTERO SE DESEMPEA COMO GERENTE
LAURA MONTILLA SE DESEMPEA COMO GERENTE FINANCIERO
MARIA PEREZ SE DESEMPEA COMO SECRETARIA
LUIS CARRILLO SE DESEMPEA COMO CHOFER
CARLOS FERNANDEZ SE DESEMPEA COMO CHOFER
JOSE PERALES SE DESEMPEA COMO ANALISTA CONTABLE
LUIS PERNIA SE DESEMPEA COMO ANALISTA ADMINISTRATIVO
LEONOR PEREZ SE DESEMPEA COMO GERENTE OPERACIONES
JOSE LOPEZ SE DESEMPEA COMO CHOFER
MARIA BLANCO SE DESEMPEA COMO SECRETARIA

O P E R AD O R Q

Muchas instrucciones SQL utilizan literales de caracteres en expresiones o


condiciones. Si el literal contiene una comilla simple, puede utilizar el operador quote
(q) y seleccionar su propio delimitador de comillas.

Puede elegir cualquier delimitador conveniente, un solo byte o multibyte, o cualquiera


de los siguientes pares de caracteres: [], {}, () o <>. En el ejemplo mostrado, la
cadena contiene una comilla simple, que normalmente se interpreta como un
delimitador de una cadena de caracteres. Sin embargo, utilizando el operador q, se
utilizan corchetes [ ] como delimitadores de comillas. La cadena entre los
delimitadores entre parntesis se interpreta como una cadena de caracteres literal.

Ejemplo 21: Realizar una consulta que permita mostrar el nombre del departamento
y su ubicacin, con el literal q esta ubicado en.

33
SQL> SELECT NOMBRE || q'[ Q' ESTA UBICADO EN: ]'||UBICACION
2 FROM DEPARTAMENTO;

NOMBRE||Q'[Q'ESTAUBICADOEN:]'||UBICACION
------------------------------------------------
INVESTIGACION Q' ESTA UBICADO EN: CARACAS
VENTAS Q' ESTA UBICADO EN: CARACAS
ADMINISTRACION Q' ESTA UBICADO EN: CARACAS

C O N S I D E R AC I O N E S AL E S C R I B I R S E N T E N C I AS S Q L

Las sentencias SQL no distinguen entre maysculas y minsculas.


Las sentencias SQL se pueden introducir en una o ms lneas.
Las palabras clave no pueden ser abreviadas o divididas entre lneas.
Las clusulas se colocan generalmente en lneas separadas.
Las sangras se utilizan para mejorar la legibilidad.
En SQL Developer, las sentencias de SQL pueden ser terminadas opcionalmente por
un punto y coma (;). Las comas son necesarias cuando se ejecutan varias sentencias
SQL.
En SQL * Plus, se requiere que finalice cada sentencia SQL con un punto y coma (;).

34
Captulo 2
FUNCIONES DE SQL

35
ORDENAMIENTO DE DATOS
Cuando se ejecuta una consulta, el orden en que se muestran las filas de datos es
indefinido. Pero en muchas ocasiones, es necesario mostrar la informacin ordenada por
una o ms columnas, ya sea de forma ascendente o descendente. Cuando se desea
obtener informacin ordenada en una consulta se utiliza la clusula ORDER BY.

El uso de la clusula ORDER BY, slo tendr efecto sobre la visualizacin de la


informacin, no tendr efecto sobre el almacenamiento en la base de datos.

Sintaxis: SELECT Columnas


FROM Origen_datos
[WHERE Condiciones]
[ORDER BY {columna | alias} [ASC | DESC]];

Las opciones SELECT FROM WHERE ya han sido discutidas. En la clusula


ORDER BY pueden usarse lista de columnas separadas por comas, tambin pueden
usarse alias de columna, o el nmero de posicin que tiene en la consulta la columna
que se desea ordenar. Cuando se desea que una columna se ordene en forma
ascendente se coloca el sufijo ASC a continuacin del nombre de la columna, cuando se
desea que una columna visualicen en forma descendente se coloca el sufijo DESC. Por
defecto el ordenamiento es ascendente.

Ejemplo 22: Realizar una consulta que permita mostrar los datos de todos los
empleados del departamento 1. Donde el campo CARGO est
ordenado en forma descendente y el campo NOMBRE est ordenados
de manera ascendente.

SQL> SELECT *
2 FROM EMPLEADO
3 WHERE NUMDEPT = 01
4 ORDER BY CARGO DESC, NOMBRE ASC;

36
El resultado debe ser el siguiente, ntese el ordenamiento:

EMPNO NOMBRE CARGO JEFE FINGRESO SALARIO COMISION NUMDEPT

---------- -------------------- -------------------------------------------------- ---------- ------

100 FRANCISCO MONTERO GERENTE 01-JAN-90 50000 600 1

400 LUIS CARRILLO CHOFER 100 01-JAN-00 10000 1

Ejemplo 23: Realizar una consulta que permita mostrar la tabla empleados ordenada
por la segunda columna, y con las columnas en el siguiente orden
NOMBRE, SALARIO, CARGO

SQL> SELECT NOMBRE, SALARIO, CARGO


2 FROM EMPLEADO
3 ORDER BY 2;

En este caso el resultado debe ser el siguiente:

NOMBRE SALARIO CARGO


-------------------- ---------- -----------------------
CARLOS FERNANDEZ 10000 CHOFER
JOSE LOPEZ 10000 CHOFER
LUIS CARRILLO 10000 CHOFER
MARIA BLANCO 20000 SECRETARIA
MARIA PEREZ 20000 SECRETARIA
JOSE PERALES 25000 ANALISTA CONTABLE
LUIS PERNIA 30000 ANALISTA ADMINISTRATIVO
LEONOR PEREZ 35000 GERENTE OPERACIONES
LAURA MONTILLA 42000 GERENTE FINANCIERO
FRANCISCO MONTERO 50000 GERENTE

37
AGRUPAMIENTO DE DATOS
Aparte de ordenar la informacin obtenida, en muchas ocasiones es necesario obtener
algunas medidas para una porcin particular de datos, como son por ejemplo totales,
promedios, conteo de registros, etc. Es aqu donde se origina el concepto de grupo. Para
agrupar un conjunto de datos similares, se utiliza la clusula GROUP BY inmersa en la
consulta que se est ejecutando.

Funciones de grupo

Para usar la clusula GROUP BY es necesario, que el o los nombres de las columnas
que aparecen en la sentencia SELECT hayan sido especificadas en la sentencia GROUP
BY, o en su defecto poseer alguna de las funciones de agrupamiento indicadas a
continuacin:

Funcin de Utilidad
Grupo
SUM(n) Retorna la sumatoria de los valores de la columna "n"
COUNT(n) Retorna el nmero de filas que tiene la columna "n", ignorando
valores nulos
MAX(n) Retorna el mximo valor de la columna "n"
MIN(n) Retorna el mnimo valor de la columna "n"
AVG(n) Retorna el promedio (average) de la columna "n", ignorando valores
nulos

Sintaxis: SELECT Columnas, funcion_de_grupo(columna) [alias]


FROM Origen_datos
[WHERE Condiciones]
[GROUP BY Columnas]
[ORDER BY {columna | alias} [ASC | DESC];

En la clusula GROUP BY deben aparecer, separadas por comas, todas las columnas
que no estn como argumento de una funcin de grupo. Ntese que se puede utilizar un
alias para etiquetar el resultado de la funcin de grupo.

38
Ejemplo 24: Realizar una consulta que permita mostrar una lista de todos los cargos
que existen. Debe listarse el CARGO y la CANTIDAD de empleados
con el cargo existentes.

SQL> SELECT CARGO, COUNT(CARGO) CANTIDAD


2 FROM EMPLEADO
3 GROUP BY CARGO;

El resultado debe ser el siguiente:

CARGO CANTIDAD
-------------------------------------------------- ----------
GERENTE 1
SECRETARIA 2
ANALISTA CONTABLE 1
GERENTE OPERACIONES 1
GERENTE FINANCIERO 1
ANALISTA ADMINISTRATIVO 1
CHOFER 3

Filtrando grupos de datos - La clusula HAVING

De la misma manera que se usa la clusula WHERE para excluir o filtrar datos, podemos
utilizar la clusula HAVING para restringir grupos en una consulta. Esta instruccin solo
puede usarse en combinacin con la sentencia GROUP BY, excepto cuando solo se usa
la funcin de grupo, en cuyo caso no existe la clusula GROUP BY.

Sintaxis: SELECT Columnas, funcion_de_grupo(columna) [alias]


FROM Origen_datos
[WHERE Condiciones]
[GROUP BY Columnas]
[HAVING Condicion_de_grupo]
[ORDER BY {columna | alias} [ASC | DESC]];

39
En este caso Condicion_de_grupo, es una expresin que, usando una funcin de grupo
permitir seleccionar los datos que cumplan con la condicin especificada. Esta es la
forma mas completa de la sentencia de seleccin de datos en SQL*Plus.

Ejemplo 25: Repetir el ejemplo anterior, pero mostrando solo aquellos


departamentos cuya cantidad de empleados por cargo sea menor de 2

SQL> SELECT CARGO, COUNT(CARGO) CANTIDAD


2 FROM EMPLEADO
3 GROUP BY CARGO
4 HAVING COUNT(*) < 2;

El resultado debe ser el siguiente:

CARGO CANTIDAD
-------------------------------------------------- ----------
GERENTE 1
ANALISTA CONTABLE 1
GERENTE OPERACIONES 1
GERENTE FINANCIERO 1
ANALISTA ADMINISTRATIVO 1

40
OTRAS FUNCIONES DE SQL

En las secciones anteriores, se pudo apreciar que el poder de las sentencias de SQL se
ve incrementado grandemente, al permitir la inclusin en las consultas de operaciones
aritmticas y funciones de grupo las cuales permiten obtener resultados, clasificarlos y
organizarlos de acuerdo a criterios lgicos. Adicionalmente, SQL incluye una amplia
variedad de funciones numricas y de tratamiento de caracteres que lo hacen an ms
poderoso, ms sencillo de entender y ms fcil de utilizar, aun cuando el usuario no sea
un programador, ni posea amplios conocimientos de informtica.

La siguiente tabla muestra una breve resea de las funciones mas utilizadas de SQL:

Funciones Numricas

Funciones Utilidad
Numricas

NVL(n, m) Convierte el valor "n", a un valor "m", cuando "n" es nulo

MOD(n, m) Devuelve el residuo de la divisin de "n" entre "m"

SQRT(n) Devuelve la raz cuadrada de "n"

ROUND(n, m) "n" es redondeado a la cantidad de "m" dgitos decimales

TRUNC(n, m) "n" es truncado a la cantidad de "m" dgitos decimales

Si n es menor que cero, la funcin retorna -1.


SIGN(n) Si n es igual que cero, la funcin retorna 0.

Si n es mayor que cero, la funcin retorna 1.

POWER(n, m) Obtiene el resultado de "n" elevado a la "m"

ABS(n) Retorna el valor absoluto de un valor "n"

CEIL(n) Retorna el menor entero, mayor o igual que "n"

FLOOR(n) Retorna el mayor entero, menor o igual que "n"

41
GREATEST(n, m) Retorna el mayor entre "n" y "m"

LEAST(n, m) Retorna el menor entre "n" y "m"

Funciones de Fecha y Hora

Funciones de fecha y Utilidad


hora
ADD_MONTHS(n, m) Adiciona a "n" la cantidad de meses que indique "m", "m"
puede ser positivo o negativo
LAST_DAY(n) Retorna el ltimo da del mes "n"
NEXT_DAY(n, c) Retorna la siguiente fecha superior a "n", cuyo da de la
semana sea igual a "c"
Retorna la cantidad de meses entre las fechas "n" y "m".
MONTHS_BETWEEN(n, Si "n" es mayor que "m" el resultado ser positivo, en caso
m) contrario, ser negativo
SYSDATE Retorna la fecha y hora actual del sistema

En este caso "n" y "m" son valores de tipo fecha y hora (segn el caso), "c" es un valor de
tipo caracter.

Funciones de Caracteres

Funciones de Utilidad
carcter
INITCAP(c1) Retorna la primera letra de cada palabra del contenido de "c1"
en maysculas, y todas las dems letras en minsculas
UPPER(c1) Retorna el contenido de "c1" en maysculas
LOWER(c1) Retorna el contenido de "c1" en minsculas
SUBSTR(c1, n1, n2) Extrae del contenido de "c1", "n2" caracteres, partiendo desde
la posicin "n1"
LENGTH(c1) Retorna el nmero de caracteres del contenido de "c1"
LPAD(c1, n1,[c2]) Muestra el contenido de c1, colocando por el lado izquierdo los

42
caracteres "c2" tantos como sean necesarios para completar la
longitud "n1". Si "c2" no existe, se tomar por defecto espacios
en blanco
RPAD(c1, n1,[c2]) Muestra el contenido de c1, colocando por el lado derecho los
caracteres "c2" tantos como sean necesarios para completar la
longitud "n1". Si "c2" no existe, se tomar por defecto espacios
en blanco
REPLACE(c1, c2, Se busca "c2" en el contenido de "c1", si es encontrada, se
[c3]) sustituye por "c3", de lo contrario la funcin devolver NULL. Si
no se especifica "c3", y "c2" es encontrada en "c1", por defecto
se borrar
TRANSLATE(c1,c2, Se busca "c1", carcter a carcter en el contenido de "c2", si el
c3) carcter es encontrado, se sustituye por el correspondiente
carcter de "c3" en la cadena "c1", de lo contrario no tendr
ningn efecto sobre "c1". Ejemplo: TRANSLATE('HOLA',
'AHOL', 'OCHA') Resultado de la ejecucin: CHAO.

En la tabla anterior "c1", "c2" y "c3" son valores de tipo carcter, los cuales pueden
ser un nombre entre comillas, o un nombre de columna. "n1" y "n2" son valores
numricos.

Funciones de Conversin de Datos

Funciones de Utilidad
conversin
Convierte un valor de tipo fecha, hora o numrico "d", a un
valor de tipo char, pudiendo especificar opcionalmente un
formato "f". Si no se especifica el formato "f", se tomar el
TO_CHAR(d, [f]) formato por defecto de la instalacin.
La funcin de TO_CHAR, es cambiar la forma de visualizacin
del dato "d" al formato "f"
TO_DATE(c, [f]) Convierte el contenido de "c", a un valor de tipo fecha u hora,
pudiendo especificar opcionalmente un formato "f". Si no se
especifica el formato "f", por defecto se tomar "DD-MON-YY"
TO_NUMBER(c) Convierte el contenido de "c", a un valor de tipo numrico.
Se asume que "c" contiene caracteres numricos
Conversin entre dos diferentes implementaciones de una
misma seleccin de caracteres, ejemplo: de caracteres
CONVERT(c, set1, multilenguaje DEC8 bit a caracteres multilenguaje HP 8 bit. "c"

43
set2) es el carcter a convertir. "set1", es la seleccin de caracteres
destino. "set2" es la seleccin de caracteres fuente. Ejemplo:
Select CONVERT('A B C D E ', 'US7ASCII',
'WE8ISO8859P1') from dual; devuelve 'A B C D E A E I ? ?'
CAST ( [ Expression | La funcin CAST convierte un valor de un tipo de datos a otro
NULL | ? ] AS y proporciona un tipo de datos a un parmetro dinmico (?) O
Datatype) un valor NULL. Ejemplo: SELECT CAST('22-OCT-1997' AS
TIMESTAMP WITH LOCAL TIME ZONE) FROM dual; esto
devuelve 22-OCT-97 12.00.00.000000 AM

En la tabla anterior "d" es un valor de tipo fecha u hora, "n" es un valor de tipo
numrico, "c" es un valor de tipo carcter y "f" es un modelo de formato.

Funciones Varias

Otras funciones Utilidad


DECODE(c, n1, r1, n2, Retorna el valor "r1", si "c" es igual a "n1", Retorna el valor
r2,d) "r2", si "c" es igual a "n2", En caso de no coincidir con
ningn valor de la lista retorna "d". El valor "d" puede
omitirse, en cuyo caso retornara nulo. Pueden haber tantos
n y r como se deseen
USER Retorna el nombre del usuario que se encuentra conectado
actualmente a la base de datos

USERENV({'ENTRYID' | Retorna la informacin sobre el usuario y/o seccin que


est siendo utilizada por una aplicacin, funcionando para
'SESSIONID' una tabla de auditoria. Si la opcin es ENTRYID, la funcin
|
retorna un identificador de entrada disponible para
'TERMINAL' auditoria; si la opcin es SESSIONID retorna un
| identificador de la seccin de auditoria del usuario; si la
opcin es TERMINAL, retorna el identificador del sistema
'LANGUAGE' operativo del terminal del usuario; si la opcin es
LANGUAGE retorna el lenguaje en uso (como el ingles),
}) determinado por los parmetros LANGUAGE en el
INIT.ORA

VSIZE(n) Retorna el nmero de bytes usados para almacenar el valor


"n"

CONCAT(c1, c2) Concatena en una sola cadena de caracteres las


subcadenas c1 y c2 preservando el orden en que aparecen.
La funcin CONCAT ya est en desuso, en su lugar se usa
el operador "| |"

44
Juego de caracteres multilenguaje ms comunes

Nombre juego Significado


caracteres
US7ASCII US 7-bit ASCII (usado por defecto)
WE8DEC DEC's Western European 8 bit ASCII
WE8HP HP's Western European 8 bit ASCII
F7DEC DEC's French 7-bit ASCII
WEIBMPC Western European 8-bit ASCII (usado por las IBM PC)
WE8ISO8859P1 Western European 8-bit para Windows

FORMATOS DE SALIDA DE DATOS

Formatos numricos ms utilizados

Elemento Ejemplo Descripcin


9 9999 La cantidad de nueves (9) determina el ancho del
numero
a mostrar
0 0999 Muestra ceros a la izquierda de un nmero
$ $9999 Prefija a un valor con el smbolo de moneda
B B9999 Muestra espacios en blanco (B) a la izquierda de un
nmero
G 9G999 Separador de grupos de miles bajo NLS

D 09D99 Separador de grupos decimales bajo NLS


Coma 9,999 Muestra una coma en esta posicin
Punto 99.99 Muestra un punto decimal en esta posicin

45
Formatos de fecha ms utilizados

Formato Significado
YYYY Los cuatro dgitos del ao
YYY Los ltimos tres dgitos del ao
YY Los ltimos dos dgitos del ao
Y El ltimo dgito del ao
MM Nmero del mes (del 1 al 12)
MON Nombre del mes (abreviado a 3 letras)
MONTH Nombre del mes, acompaado de un mximo de 9 caracteres en
blanco
D Das de la semana (del 1 al 7)
DD Das del mes (del 1 al 31)
DDD Das del ao (del 1 al 366)
MI Minutos
SS Segundos

Ejemplos de la aplicacin de las funciones y formatos anteriores:

Ejemplo 26: Elaborar una consulta que permita mostrar el nmero de departamento,
el salario ms alto, el salario promedio y el total de salarios por
departamento, visualizar la informacin de la siguiente manera:
DEPARTAMENTO, MAXIMO SALARIO, SALARIO PROMEDIO, TOTAL
SALARIO

SQL> SELECT NUMDEPT Departamento,


2 MAX(SALARIO) "Mximo Salario",
3 AVG(SALARIO) "Salario Promedio",
4 SUM(NVL(SALARIO, 0)) "Total Salario"
5 FROM EMPLEADO
6 WHERE NUMDEPT IS NOT NULL
7 GROUP BY NUMDEPT;

46
El resultado debe ser el siguiente:

DEPARTAMENTO Mximo Salario Salario Promedio Total Salario


------------ -------------- ---------------- -------------
1 50000 30000 60000
2 35000 21666.6667 65000
4 42000 25400 127000

Ejemplo 27: Elaborar una consulta que permita mostrar la cantidad de empleados,
que devengan salarios: Menores o iguales a 15.000, entre 15.001 y
20.000, superiores a 20.000. Esto se realizar para todos aquellos
departamentos que tengan ms de 1 empleado.

SQL> SELECT 'Entre 0 y 15000 hay '||count(*) cuantos


2 FROM EMPLEADO
3 WHERE SALARIO <= 15000
4 HAVING COUNT(*) >= 1
5 UNION
6 SELECT 'Entre 15000 y 20000 hay '||count(*)
7 FROM EMPLEADO
8 WHERE SALARIO > 15000 AND sal <= 20000
9 HAVING COUNT(*) >= 1
10 UNION
11 SELECT 'Sueldos mayores a 20000 hay '||count(*)
12 FROM EMPLEADO
13 WHERE SALARIO > 20000
14 HAVING COUNT(*) >= 1;

Esta consulta debe arrojar el resultado siguiente:


CUANTOS
-------------------------------
Entre 0 y 15000 hay 3
Entre 15000 y 20000 hay 2
Sueldos mayores a 20000 hay 5

Ejemplo 28: Elaborar una consulta que permita mostrar por cada departamento lo
que se cancela en total por concepto de salarios y el salario promedio
por departamento.

SQL> SELECT NUMDEPT, SUM(SALARIO) TOTAL_SALARIOS,


AVG(SALARIO) PROMEDIO_SALARIO
2 FROM EMPLEADO
3 GROUP BY NUMDEPT;

47
El resultado debe ser el siguiente :

NUMDEPT TOTAL_SALARIOS PROMEDIO_SALARIO


---------- -------------- ----------------
1 60000 30000
2 65000 21666.6667
4 127000 25400

Ejemplo 29: Realizar la misma consulta anterior, pero dando el formato de


separacin en miles y decimales a los resultados. (Comparar esta
salida con la anterior).

SQL>SELECT NUMDEPT, TO_CHAR(SUM(SALARIO),'999,999.99') TOTAL_SALARIOS,


TO_CHAR(AVG(SALARIO), '999,999.99') PROMEDIO_SALARIO
2 FROM EMPLEADO
3 GROUP BY NUMDEPT;

El resultado debe ser como sigue, ntese el formato de los nmeros:

NUMDEPT TOTAL_SALAR PROMEDIO_SA


---------- ----------- -----------
1 60,000.00 30,000.00
2 65,000.00 21,666.67
4 127,000.00 25,400.00

Ejemplo 30: Realizar una consulta que permita obtener DEPARTAMENTO,


NOMBRE y FECHA DE INGRESO a partir de la tabla EMPLEADO.
Formatear la fecha como DD/MM/YYYY y ordenar por
DEPARTAMENTO y NOMBRE.

SQL> SELECT NUMDEPT, NOMBRE,


2 TO_CHAR(FINGRESO, DD/MM/YYYY) FECHA_INGRESO
3 FROM EMPLEADO
4 ORDER BY 1, 2;

El resultado debe ser el siguiente, ntese el ordenamiento y la presentacin de la


fecha:

NUMDEPT NOMBRE FECHA_INGR


---------- -------------------- ----------

48
1 FRANCISCO MONTERO 01/01/1990
1 LUIS CARRILLO 01/01/2000
2 JOSE LOPEZ 01/03/1990
2 LEONOR PEREZ 01/01/1990
2 MARIA BLANCO 01/01/1990
4 CARLOS FERNANDEZ 01/01/1999
4 JOSE PERALES 15/09/2000
4 LAURA MONTILLA 01/01/1990
4 LUIS PERNIA 01/03/2000
4 MARIA PEREZ 01/01/1998

Ejemplo 29: Realizar una consulta que permita concatenar el string EMPLEADO
antes del NOMBRE de cada empleado y concatenar el string Fecha de
Ingreso antes de la FECHA DE INGRESO, obtener adems el
departamento y ordenar los datos por DEPARTAMENTO.

SQL> SELECT NUMDEPT departamento, 'El Empleado ' | |


2 NOMBRE | |' Ingreso el '| | TO_CHAR(FINGRESO)
3 FROM EMPLEADO
4 ORDER BY 1,2;

El resultado debe ser el siguiente, ntese la presentacin de la fecha cuando no tiene


formato, observe tambin el nombre de la columna de concatenacin cuando no
posee alias:

DEPARTAMENTO 'ELEMPLEADO'||NOMBRE||'INGRESOEL'||TO_CHAR(FINGRESO)
------------ -----------------------------------------------------
1 El Empleado FRANCISCO MONTERO Ingreso el 01-JAN-90
1 El Empleado LUIS CARRILLO Ingreso el 01-JAN-00
2 El Empleado JOSE LOPEZ Ingreso el 01-MAR-90
2 El Empleado LEONOR PEREZ Ingreso el 01-JAN-90
2 El Empleado MARIA BLANCO Ingreso el 01-JAN-90
4 El Empleado CARLOS FERNANDEZ Ingreso el 01-JAN-99
4 El Empleado JOSE PERALES Ingreso el 15-SEP-00
4 El Empleado LAURA MONTILLA Ingreso el 01-JAN-90
4 El Empleado LUIS PERNIA Ingreso el 01-MAR-00
4 El Empleado MARIA PEREZ Ingreso el 01-JAN-98

Ejemplo 30 : Realizar una consulta que permita escribir en letras el NUMERO DEL
DEPARTAMENTO para los departamentos 10 y 20, para el resto de los
departamentos colocar el literal OTRO DEPARTAMENTO, visualizar

49
en la consulta los campos NUMERO DE DEPARTAMENTO, NOMBRE
DE EMPLEADO y EL LITERAL.

SQL> SELECT NUMDEPT,


DECODE(NUMDEPT, 1, 'DEPARTAMENTO UNO', 2, 'DEPARTAMENTO
DOS', 'OTRO DEPARTAMENTO'),
NOMBRE
FROM EMPLEADO;

El resultado debe ser el siguiente, de nuevo observe la cabecera de la columna


donde se aplica la funcin DECODE :

NUMDEPT DECODE(NUMDEPT,1, NOMBRE


---------- ----------------- --------------------
1 DEPARTAMENTO UNO FRANCISCO MONTERO
4 OTRO DEPARTAMENTO LAURA MONTILLA
4 OTRO DEPARTAMENTO MARIA PEREZ
1 DEPARTAMENTO UNO LUIS CARRILLO
4 OTRO DEPARTAMENTO CARLOS FERNANDEZ
4 OTRO DEPARTAMENTO JOSE PERALES
4 OTRO DEPARTAMENTO LUIS PERNIA
2 DEPARTAMENTO DOS LEONOR PEREZ
2 DEPARTAMENTO DOS JOSE LOPEZ
2 DEPARTAMENTO DOS MARIA BLANCO

Ejemplo 31: Realizar una consulta que permita obtener en el primer campo, el
nombre del departamento, en el segundo campo la subcadena formada
por los caracteres desde el 3 hasta el 7 (ambos inclusive) del campo
nombre del departamento, en la tercera posicin fijar la longitud del
mismo campo a 15 caracteres rellenando con asteriscos los espacios
en blanco a la izquierda, en el cuarto campo se obtendr el mismo caso
anterior pero rellenando con asteriscos los espacios a la derecha.

SQL> SELECT NOMBRE, SUBSTR(NOMBRE, 3, 5) SUBCADENA,


2 LPAD(NOMBRE, 15, '*') IZQUIERDA,
3 RPAD(NOMBRE, 15, '*') DERECHA
4 FROM DEPARTAMENTO;

50
El resultado debe ser el siguiente, ntese los nombres de columna IZQUIERDA y
DERECHA que usan alias y el intervalo de las subcadenas:

NOMBRE SUBCA IZQUIERDA DERECHA


-------------- ----- --------------- ---------------
INVESTIGACION VESTI **INVESTIGACION INVESTIGACION**
VENTAS NTAS *********VENTAS VENTAS*********
ADMINISTRACION MINIS *ADMINISTRACION ADMINISTRACION*

Manejo de valores nulos El valor predefinido NULL

En muchas consultas existen columnas que no poseen valor (su contenido es el valor
nulo), cuando esto sucede es probable que el resultado obtenido sea incierto debido a
que los operadores hasta ahora conocidos no tienen efecto sobre valores nulos.

La nica operacin que puede aplicarse en un caso semejante es el operador de


igualdad con una pequea variante, la cual indicar al manejador que debe verificar si el
valor es igual a nulo.

Sintaxis : WHERE expresin IS NULL

Tambin es posible que se deba identificar en una consulta un valor nulo y convertirlo en
otro para evitar una operacin inadecuada, por ejemplo sustituir por uno un valor cero
durante una divisin, en este caso se utiliza la funcin NVL.

Ejemplo 32 : Elaborar una consulta que permita obtener el nombre de todos aquellos
empleados que no posean jefe

SQL> SELECT NOMBRE, JEFE


2 FROM EMPLEADO
3 WHERE JEFE IS NULL;

La salida del query debe arrojar algo similar a esto:

51
NOMBRE JEFE
-------------------- ----------
FRANCISCO MONTERO
LAURA MONTILLA

Ejemplo 33 : Elaborar una consulta que permita combinar las tablas EMPLEADO y
DEPARTAMENTO, visualizar los campos NOMBRE DE
DEPARTAMENTO, NOMBRE DE EMPLEADO, SALARIO y COMISION,
indicando cuando no haya comisin el literal SIN COMISION.

Caso 1 : Sin el uso de alias de tablas en las columnas DEPTNO que tienen el mismo
nombre en las dos tablas. Ntese el error que se genera cuando el
manejador encuentra el nombre de la columna NUMDEPT duplicado.

SQL> SELECT NUMDEPT, EMPNO, NOMBRE, SALARIO, NVL(COMISION, 0)


2 FROM EMPLEADO, DEPARTAMENTO
3 WHERE NUMDEPT = NUMDEPT;

where numdept = numdept


*
ERROR at line 3:
ORA-00918: column ambiguously defined

Caso 2 : Usando los alias de tablas (tabla1, tabla2) en las columnas DEPTNO que
tienen el mismo nombre en las dos tablas. Ntese que el error desaparece,
si en la columna nombre en lugar del alias TABLA1 se coloca TABLA2,
Qu sucedera?

SQL> SELECT TABLA1.NUMDEPT, EMPNO, TABLA1.NOMBRE,


2 SALARIO, NVL(COMISION, 0)
3 FROM EMPLEADO TABLA1, DEPARTAMENTO TABLA2
4 WHERE TABLA1.NUMDEPT = TABLA2.NUMDEPT;

El resultado obtenido debe ser el siguiente:


NUMDEPT EMPNO NOMBRE SALARIO NVL(COMISION,0)
---------- ---------- -------------------- ---------- ---------------
1 100 FRANCISCO MONTERO 50000 600
4 200 LAURA MONTILLA 42000 300
.
4 600 JOSE PERALES 25000 0
4 700 LUIS PERNIA 30000 0

52
PRACTICA 1
De la tabla VENDEDOR

Realizar una consulta que muestre los Nombres y Apellidos de los vendedores que
tienen ventas mayores a 70000.
1.2 Realizar una consulta que muestre los Nombres, Apellidos, Cedula de los
vendedores que tienen ventas menores o igual a 50000.
1.3 Realizar una consulta que muestre la cantidad de vendedores que existen en la
empresa.
1.3.1 Realizar una consulta que muestre la cantidad de ventas por montos realizadas
mayores o iguales 70000 y la cantidad de ventas con montos menores o iguales a
50000.
1.4 A los vendedores que realizaron ventas mayores a 70000 recibirn una comisin
del 20% .
1.5 Realizar una consulta que permita mostrar todos los empleados cuyo salario este
entre 18000 y 38000.
1.6 Realizar una consulta que permita mostrar el nombre de los empleados que tengan
en la segunda posicin n la letra A.

PRACTICA 2

2. - De la tabla DEPORTES

2.1. Realizar una consulta que muestre la Edad, Estatura, Peso y el Deporte de los
estudiantes.
2.2. Realizar una consulta que muestre el Nombre, Deporte, Peso de los alumnos que
tengan una estatura comprendida entre 1.60 y 1.85.
2.3. Realizar una consulta de los deportes que se imparten en la institucin, sin repetir
ningn deporte.

53
2.4. Realizar una consulta que permita mostrar los datos de todos los alumnos que
practiquen bsquetbol, adems ordenar el campo nombre de forma ascendente y el
campo carrera de forma descendente.
2.5. Realizar una consulta que permita mostrar el Nombre, Carrera, Edad, de aquel
deporte en el que la cantidad de alumnos sea menor a 8.

PRACTICA 3

3. De la tabla RECTANGULO
3.1 Realizar una consulta que muestre la longitud, ancho y el rea de aquellos
rectngulos cuyo permetro sea mayor a 24.

PRACTICA 4

4. De la tabla VENDEDOR.
4.1 Realizar una consulta que muestre nombres y apellidos del vendedor, esta
informacin debe aparecer en una columna llamada NOMBRE DEL VENDEDOR,
tambin mostrar las ventas y el salario, si el salario es igual a 110000 colocar en una
columna denominada ESTUDIO DE AUMENTO, la frase NO APLICA, de lo contrario
colocar AUMENTO EN ESTUDIO.

PRACTICA 5

5. De la tabla DEPORTES
5.1 Realizar una consulta que muestre las carrera y los nombres de los estudiantes,
adems se desea sustituir la palabra Informtica por Computacin de la columna
carrera, mostrar solo los 10 primeros caracteres de la carrera y llamar a esta columna
Carreras.

54
Captulo 3
PRECEDENCIAS, SUBSTITUCIN DE
VARIABLES Y SUBQUERIES.

55
PRECEDENCIAS

A continuacin tenemos un cuadro, que nos muestra determinan el orden en el cual


las expresiones son evaluadas y calculadas (reglas de precedencia). El orden es
predeterminado, sin embargo, se puede anular este orden, utilizando parntesis
alrededor de las expresiones que desea calcular primero.

Orden Operador
1 Aritmeticos
2 Concatenacin
3 Comparacin
4 IS [NOT] NULL, LIKE, [NOT] IN
5 [NOT] BETWEEN
6 Not equal to
7 NOT Condicin lgica
8 AND Condicin lgica
9 Or Condicin logica
Ejemplos sobre las reglas de precedencia:

SQL> SELECT NOMBRE, CARGO, SALARIO


2 FROM EMPLEADO
3 WHERE CARGO = 'ANALISTA CONTABLE'
4 OR CARGO = 'ANALISTA ADMINISTRATIVO'
5 AND SALARIO > 25000;

NOMBRE CARGO SALARIO


-------------------- -------------------------------------------------- ----------
JOSE PERALES ANALISTA CONTABLE 25000
LUIS PERNIA ANALISTA ADMINISTRATIVO 30000

SQL> SELECT NOMBRE, CARGO, SALARIO


2 FROM EMPLEADO
3 WHERE (CARGO = 'ANALISTA CONTABLE'
4 OR CARGO = 'ANALISTA ADMINISTRATIVO')
5 AND SALARIO > 25000;

NOMBRE CARGO SALARIO


-------------------- -------------------------------------------------- ----------
LUIS PERNIA ANALISTA ADMINISTRATIVO 30000

56
SUBSTITUCION DE VARIABLES

Hasta el momento, todas las sentencias SQL han sido ejecutadas con columnas
predeterminadas, condiciones y sus valores. Pero supongamos, que desea una
consulta que enumere los empleados con varios trabajos y no slo aquellos cuyo
cargo es ANALISTA ADMINISTRATIVO. Una opcin es editar la clusula WHERE
para proporcionar un valor diferente cada vez que ejecute el comando, pero tambin
hay una forma ms sencilla.

Mediante el uso de substitucin de variables, en lugar de colocar los valores exactos


en la clusula WHERE, se puede ejecutar la misma consulta para valores diferentes,
sin tener que modificar el script.

De esta forma un mismo query funciona a diferentes usuarios, los cuales suministran
sus propios valores para restringir el intervalo de datos devueltos. Puede incrustar
variables de sustitucin en un archivo de comandos o en una nica sentencia de
SQL. Una variable puede ser pensada como un contenedor en el que los valores se
almacenan temporalmente. Cuando se ejecuta la sentencia, se sustituye el valor
almacenado.

Para identificar que trabajaremos con substitucin de variables, usaremos el smbolo


&. Tambin puede predefinir variables utilizando el comando DEFINE. Este crea y
asigna un valor a una variable. Las variables creadas con el comando DEFINE son
del tipo CHAR nicamente.

Podemos utilizar substitucin de variables en:


Las condiciones del WHERE
La clausula ORDER BY
Columnas
Nombre de tablas

57
En todos los valores a proporcionar para la sentencia SELECT
Ejecute varias veces la siguiente sentencia
SELECT *
FROM EMPLEADO
WHERE EMPNO = &NROEMP

Escriba el comando define y asigne el valor, luego ejecute varias veces la sentencia
DEFINE nombre_variable = valor
SELECT *
FROM EMPLEADO
WHERE EMPNO = & nombre_variable

Ejecute est sentencia, que observa?


DEFINE nombre_variable = valor
SELECT *
FROM EMPLEADO
WHERE CARGO = & nombre_variable

Ejecute esta sentencia


SELECT EMPNO, NOMBRE, CARGO,&column_name
FROM EMPLEADO
WHERE &condition
ORDER BY &order_column ;

Ejecute los siguientes comandos e indique que diferencia observa:


SET VERIFY OFF
DEFINE VCARGO = SECRETARIA
SELECT *
FROM EMPLEADO
WHERE CARGO = '&VCARGO';

58
SET VERIFY ON
SELECT *
FROM EMPLEADO
WHERE CARGO = '&VCARGO';

SUBQUERIES

El subquery se convierte en una consulta interna (inner query) que alimenta a una
consulta externa (outer query). La consulta interna devuelve un valor que es utilizado
por la consulta externa. El uso de un subquery es equivalente a realizar dos
consultas secuenciales y utilizar el resultado de la primera consulta como el valor de
bsqueda en la segunda consulta.

Pueden ser muy tiles cuando necesita seleccionar filas de una tabla con una
condicin que depende de los datos de la tabla en s. Se puede colocar el subquery
en varias clusulas SQL, entre las que se incluyen las siguientes:

WHERE
HAVING
FROM

Un subquery debe estar entre parntesis.


Aun cuando por lo general el subquery se coloca en el lado derecho de la condicin
de comparacin para facilitar la lectura, este puede aparecer en cualquier lado del
operador de comparacin.
En los subqueries se usan dos clases de condiciones de comparacin: operadores
para recibir un solo registro (>, =,> =, <, <>, <=) y operadores para recibir varios
registros (IN, ANY, ALL, EXISTS).

Ejecute este query


SELECT NOMBRE, CARGO, SALARIO
FROM EMPLEADO
WHERE SALARIO =(SELECT MIN(SALARIO)
FROM EMPLEADO);
Qu observa?

Para trabajar subqueries que arrojan ms de un registro, tenemos los operadores IN,
ALL y ANY.

59
El operador IN realiza la evaluacin tal y como lo hemos visto, basndose en el
conjunto de datos que se proporciona.

El operador ALL, se utiliza para comparar un valor con una lista o los registros
devueltos por un subquery. Debe estar precedido por alguno de estos smbolos =, !=,
>, <, <=, >=.

Suponiendo que los subqueries no devuelvan cero registros, se pueden hacer las
siguientes sentencias para las versiones de lista y subqueries:

"X = ALL (...)": El valor debe coincidir con todos los valores de la lista para
evaluar a TRUE.
"X! = ALL (...)": El valor no debe coincidir con ningn valor de la lista para
evaluar a TRUE.
"X> ALL (...)": El valor debe ser mayor que el valor ms grande de la lista
para evaluar a TRUE.
"X <ALL (...)": El valor debe ser menor que el valor ms pequeo de la lista
para evaluar a TRUE.
"X> = ALL (...)": El valor debe ser mayor o igual que el valor ms grande de
la lista para evaluar a TRUE.
"X <= ALL (...)": El valor debe ser menor o igual que el valor ms pequeo
de la lista para evaluar a TRUE.

Emplear "<> all" es lo mismo que emplear "not in".

Si un subquery devuelve cero registros, la condicin se evala como TRUE, por lo


que se mostraran todos los registros.

Un equivalente al uso de este operador es colocar AND para cada uno de los valores
a evaluar.

El operador ANY, Se utiliza para comparar un valor con una lista o una subconsulta.
Debe ser precedido por =,! =,>, <, <=,> =. Emplear "= any" es lo mismo que emplear
"in".

Suponiendo que el subquery no devuelve cero registros, se pueden hacer las


siguientes declaraciones para las versiones de lista y subqueries:

"X = ANY (...)": El valor debe coincidir con uno o ms valores de la lista para
evaluar a TRUE.
"X! = ANY (...)": El valor no debe coincidir con uno o ms valores de la lista
para evaluar a TRUE.
"X> ANY (...)": El valor debe ser mayor que el valor ms pequeo de la lista
para evaluar a TRUE.

60
"X <ANY (...)": El valor debe ser menor que el valor ms grande de la lista
para evaluar a TRUE.
"X> = ANY (...)": El valor debe ser mayor o igual que el valor ms pequeo de
la lista para evaluar a TRUE.
"X <= ANY (...)": El valor debe ser menor o igual al valor ms grande de la
lista para evaluar a TRUE.
Si una subconsulta devuelve cero filas, la condicin se evala como FALSE, por lo
que no se mostraran registros.
Un equivalente al uso de este operador es colocar OR para cada uno de los valores
a evaluar.

El operador [NOT] EXISTS se utiliza en las consultas en las que el resultado de la


consulta depende de si existen o no ciertas filas en una tabla. Se evala como TRUE
si la subconsulta devuelve al menos una fila.

Cuando uno de los valores devueltos por el subquery es un valor nulo, la consulta
completa no devuelve registros.

PRACTICAS CAPITULO 3

1. Realice una consulta que muestre la cedula, nombre, apellido y salario de los
vendedores que en su nombre contenga el valor MARIA o que la cedula no sea
4567890 y tomando en cuenta que el SALARIO sea mayor a 80000;
2. Elabore una consulta que muestre el primer nombre y el primer apellido
concatenado y la longitud de dicha concatenacin, para la tabla vendedores, en
base a un valor que deber ingresar el usuario y que puede ubicarse en cualquier
parte del nombre.
3. Muestre el monto de las ventas truncado, en tres posiciones a la izquierda del
punto que indica decimales, para todos los vendedores.
4. Muestre la fecha de ingreso, y redondee la fecha de ingreso al mes de ingreso y la
cantidad de meses transcurridos entre la fecha de ingreso y la fecha actual, sin
decimales y sin aproximacin.
5. Seleccione la fecha actual del sistema, el ltimo da del mes actual y el prximo
viernes despus del fin de mes actual

61
6. Muestre el redondeo del resto entero de la divisin entre el monto de ventas y la
cantidad de ventas para todos los vendedores que ganen ms de un valor que
suministrara al ejecutar el query, ordenado de forma ascendente.
7. Muestre el nombre unido a literal QUIEN SE DESEMPEA COMO concatenado
al CARGO concatenado con la fecha de ingreso mostrada en fomato digitos para
el dia y ao y el nombre completo del mes. Todo en mayuscula. Si el dia es menor
a 10, no mostrar el 0 delante del digito.
8. Muestre el monto de las ventas en un formato que tenga capacidad para 6 digitos,
de los cuales 2 son decimales, que observa? Corrigalo y coloque el simbolo del
dolar a dicho formato.
9. Muestre el nombre, salario, comisin (donde si es nula deber aparecer 0) y una
columna donde si tiene comisin muestre S y si no tiene Muestre N/A.
10. Muestre el nombre, cargo, salario actual y el salario revisado, basndose en que
para el caso de los choferes deber aumentarles en un 60% y para las secretarias
un 45%, el resto mantendr el salario actual como salario revisado. Haga esto con
una expresin CASE.
11. Haga el mismo query del punto 10 pero utilizando el DECODE.
12. Ejecute un query que use la funcion de grupo COUNT para todos los registros y
otro que utilice el campo comisin para el conteo. Que nota? Explique el por qu.
13. Muestre la cantidad de departamentos en la tabla empleado, sin repetir valores.
14. Genere un producto cartesiano usando las tablas empleado y departamento
15. Utilice el join que elimina el producto cartesiano.
16. Muestre la informacin de los departamentos que no tengan empleados
asociados.
17. Conectado como el usuario HR, realice una consulta que muestre el employee_id
y el job_id actual y anterior, para todos los empleados. Muestre cada empleado
solo una vez por cada tabla. Las tablas a utilizar son EMPLOYEES y
JOB_HISTORY.
18. Haga lo mismo del punto anterior, pero mostrando los empleados tantas veces se
repitan en cada tabla.

62
19. Muestre el employee id y el job id de todos los empleados que actualmente tienen
un cargo igual al anterior (es decir, cambiaron de trabajo pero ahora han vuelto al
mismo cargo que tenian anteriormente).
20. Muestre el employee id de aquellos empleados que no han tenido ningn cambio
de cargo.
21. Usando el operador UNION, muestre el employee id, el job id y el salario de todos
los empleados. Recuerde trabajar con las tablas EMPLOYEES y JOB_HISTORY.

63
64
Captulo 4
MANIPULANDO DATOS

65
Manejando los datos

Comencemos recordando unos conceptos:


Qu significa DML?
Cules son las sentencias DML?
En que consiste una transaccin?

Sentencia Insert

Para aadir nuevos registros a una tabla, utilizamos la sentencia INSERT.


La sintaxis para aadir un registro a la vez, es la siguiente:
INSERT INTO tabla [(columna1 [, columna...])]
VALUES (value [valores...]);

La lista de columnas luego del nombre de la tabla es opcional, en el caso, que se


vayan a ingresar valores para cada una de las columnas existentes en las tablas. Se
debe respetar el tipo de datos. Los caracteres y fechas deben ser encerrados en
comillas simples.
Para insertar registros con valores nulos, existen dos maneras:
Implcitamente, que es cuando no colocamos esos valores en la lista de la clusula
INSERT INTO. Dichas columnas no deben tener restriccin de NOT NULL.
Explcitamente, cuando coloco en los valores la palabra NULL, dichas columnas
pueden o no estar listadas en la clusula INSERT INTO.
Se pueden utilizar funciones para introducir valores especiales en su tabla, como por
ejemplo, la funcin SYSDATE que devuelve la fecha y hora actuales del servidor de
base de datos, la funcin CURRENT_DATE para obtener la fecha actual en la zona
horaria de la sesin y/o la funcin USER cuando inserta filas en una tabla. La funcin
USER registra el nombre de usuario actual. Tambien se pueden utilizar los valores
por DEFAULT.

Tambien se puede hacer un insert, copiando registros de otra(s) tablas. La sintaxis


es:
INSERT INTO tabla [(columna1 [, columna...])]
SUBQUERY

66
Otra variacin del INSERT, es la sentencia para mltiples tablas, esto inserta
registros derivados de las filas devueltas de la evaluacin de un subquery, en una o
ms tablas.

Las sentencias INSERT Multitable son tiles en un escenario de


DATAWAREHOUSE. Debe cargar su datawarehouse de datos regularmente para
que pueda servir a su propsito de facilitar el anlisis de negocios. Para ello, los
datos de uno o ms sistemas deben extraerse y copiarse en el datawarehouse.

Proporcionan mejoras significativas en el rendimiento sobre:


Un nico DML frente a mltiples instrucciones INSERT ... SELECT
Un DML simple versus un procedimiento para realizar inserciones mltiples
utilizando la sintaxis IF ... THEN

Los diferentes tipos de sentencias multitable INSERT son:

Unconditional INSERT: Para cada registro retornado por el subquery, este


es insertado en cada una de las tablas destino.
Ejemplo
INSERT ALL
INTO sal_history VALUES(EMPID,HIREDATE,SAL)
INTO mgr_history VALUES(EMPID,MGR,SAL)
SELECT employee_id EMPID, hire_date HIREDATE,
salary SAL, manager_id MGR
FROM employees
WHERE employee_id > 200;

Conditional INSERT ALL: Para cada registro retornado por el subquery, un


registro es insertado en cada una de las tablas destino que cumplan con la
condicin especificada.

67
Ejemplo:
INSERT ALL
WHEN HIREDATE < '01-JAN-95' THEN
INTO emp_history VALUES(EMPID,HIREDATE,SAL)
WHEN COMM IS NOT NULL THEN
INTO emp_sales VALUES(EMPID,COMM,SAL)
SELECT employee_id EMPID, hire_date HIREDATE,
salary SAL, commission_pct COMM
FROM employees

Conditional INSERT FIRST: Por cada registro retornado por el subquery, se


inserta un registro en la primera tabla de destino en la que se cumple la
condicin, obviando las dems tablas.
Ejemplo:
INSERT FIRST
WHEN salary < 5000 THEN
INTO sal_low VALUES (employee_id, last_name, salary)
WHEN salary between 5000 and 10000 THEN
INTO sal_mid VALUES (employee_id, last_name, salary)
ELSE
INTO sal_high VALUES (employee_id, last_name, salary)
SELECT employee_id, last_name, salary
FROM employees
Pivoting INSERT: Es un caso especial de un unconditional INSERT ALL.
Ejemplo:
INSERT ALL
INTO sales_info VALUES (employee_id,week_id,sales_MON)
INTO sales_info VALUES (employee_id,week_id,sales_TUE)
INTO sales_info VALUES (employee_id,week_id,sales_WED)

68
INTO sales_info VALUES (employee_id,week_id,sales_THUR)
INTO sales_info VALUES (employee_id,week_id, sales_FRI)
SELECT EMPLOYEE_ID, week_id, sales_MON, sales_TUE,
sales_WED, sales_THUR,sales_FRI
FROM sales_source_data;

Esto fue generado por la conversin de una tabla no relacional a tabla


relacional

Emp_ID Week_ID MON TUES WED THUR FRI

176 6 2000 3000 4000 5000 6000

Employee_ID WEEK SALES

176 6 2000

176 6 3000

176 6 4000

176 6 5000

176 6 6000

Sentencia Merge

Proporciona la capacidad de actualizar, insertar o eliminar datos de forma condicional


en una tabla de base de datos. Realiza una UPDATE si existe el registro, y un
INSERT si es uno nuevo. Incluso se pueden borrar registros obsoletos al mismo
tiempo que se actualizan los registros en la tabla. Para hacer esto, se incluye la
clausula DELETE con la clausula WHERE que corresponda, dentro de la sintaxis de
la sentencia MERGE.

69
Con esta sentencia logramos:
Evitar actualizaciones independientes
Aumentar el rendimiento y facilidad de uso
Es til en aplicaciones de data warehousing

La sintaxis es:
MERGE INTO nombre de la table alias
USING (tabla|vista|subquery) alias
ON (condicion del join)
WHEN MATCHED THEN
UPDATE SET
col1 = col1_val,
col2 = col2_val
DELETE WHERE condicion
WHEN NOT MATCHED THEN
INSERT (column_list)
VALUES (column_values)

Ejemplo:

MERGE INTO copy_emp3 c


USING (SELECT * FROM EMPLOYEES ) e
ON (c.employee_id = e.employee_id)
WHEN MATCHED THEN
UPDATE SET
c.first_name = e.first_name,
c.last_name = e.last_name,
...
DELETE WHERE (E.COMMISSION_PCT IS NOT NULL)
WHEN NOT MATCHED THEN
INSERT VALUES(e.employee_id, e.first_name, e.last_name,
e.email, e.phone_number, e.hire_date, e.job_id,
e.salary, e.commission_pct, e.manager_id,
e.department_id);

70
Sentencia UPDATE

Para modificar los valores existentes en una table, trabajamos con la sentencia
UPDATE. Podemos modificar mas de un registro si es necesario. La sintaxis de esta
sentencia es:
UPDATE table
SET column = value [, column = value, ...]
[WHERE condition];

Tambien podems actualizar multiples columnas, escribiendo diversos subqueries. La


sintaxis es la siguiente:
UPDATE table
SET column = (SELECT column
FROM table
WHERE condition)
[ ,
column = (SELECT column
FROM table
WHERE condition)]
[WHERE condition ] ;

Ejemplo
UPDATE employees
SET job_id = (SELECT job_id
FROM employees
WHERE employee_id = 205),
salary = (SELECT salary
FROM employees
WHERE employee_id = 205)
WHERE employee_id = 113;

71
El uso de subqueries en la sentencia UPDATE, permite que actualicemos valores
basados en otras tablas.

Sentencia DELETE

Para remover registros existentes en una tabla usamos la sentencia DELETE, para
restringir el borrado debemos condicionar la sentencia. La sintaxis es:
DELETE [FROM] table
[WHERE condition];

El uso de subqueries en la sentencia DELETE, nos permite remover registros


restringiendo dicha sentencia, de acuerdo a los valores recibidos de otra tabla.

Sentencia TRUNCATE

Para eliminar todas las filas de una tabla, dejando la tabla vaca y la estructura de la
tabla intacta, usamos la sentencia TRUNCATE. Esta es una instruccin de lenguaje
de definicin de datos (DDL) en lugar de una instruccin DML; por lo que no se
puede deshacer pues tiene un commit implcito. La sintaxis es:

TRUNCATE TABLE table_name;

Transacciones en la base de datos

Una transaccin de base de datos, consiste en:


Una sentencia DML que constituye un cambio consistente en la data.
Una sentencia DDL
Una sentencia DCL

72
Las transacciones comienzas cuando la primera sentencia DML es ejecutada y
finalizan cuando ocurre uno de los siguientes eventos:
Se ejecuta una sentencia Commit o Rollback
Se ejecuta una sentencia DDL o DCL, pues estas tienen un commit implcito.
El usuario sale de SQL Developer o SQL *Plus
Ocurre una cada del sistema.

Con las sentencias COMMIT y ROLLBACK, podemos:


Asegurar la consistencia de la data
Previsualizar los cambios antes de hacerlos permanente.
Agrupar las operaciones lgicamente relacionadas

A continuacin un esquema que muestra como podemos manejar explicitamente las


transacciones:

73
El SAVEPOINT nos permite deshacer los cambios hasta un punto dado. Para lograr
esto debemos crear un marcador en la transaccin que se esta realizando, usando la
instruccin SAVEPOINT. Luego continuamos realizando nuestras operaciones DML,
si requerimos deshacer cambios realizados, hacemos uso de la sentencia
ROLLBACK al SAVEPOINT que corresponda. La sintaxis es:

SAVEPOINT nombre
ROLLBACK TO SAVEPOINT nombre

Sin embargo, el manejador tiene la capacidad de manejar implcitamente las


transacciones.
Un commit es procesado cuando se genera una de estos escenarios:
Una sentencia DDL
Una sentencia DCL
Exit normal de SQL Developer o SQL *PLUS, sin explcitamente ejecutar
un COMMIT o un ROLLBACK.
Un rollback ocurre cuando hay una terminacin anormal de SQL DEVELOPR
o SQL *Plus o cuando ocurre una cada del sistema.

Antes de hacer un commit o un rollback podemos:


Podemos recuperar el estado previo de la data.
El usuario actual puede revisir los resultados de las operaciones DM usando la
sentencia SELECT.
Otros usuarios no pueden visualizar los valores resultantes de las sentencias
DML.
Los registros afectados son bloqueados y otros usuarios no pueden hacer
cambios en la data afectada.

74
Despus de hacer un COMMIT:
Los cambios realizados son grabados en la base de datos.
El estado previo de la data es sobreescrito.
Todos los usuarios puedes visualizar los resultados.
Los registros afectados son liberados, permitiendo que estn disponibles para
que otros usuarios los puedan manipular.
Todos los savepoint son borrados.

Despus de hacer un ROLLBACK:


Los cambios en los datos se deshacen.
El estado previo de la data es restaurado.
Los registros bloqueados son liberados.

Si una sentencia DML falla durante la ejecucin, solo esta sentencia es revertida. El
servidor de Oracle implementa un savepoint implcito. Los dems cambios
realizados, se mantienen y quedan a la espera de que el usuario termine la
transaccin explcitamente.

Read consistency

Esto garantiza una vista consistente de los datos en todo momento.


Los cambios realizados por un usuario no entran en conflicto con los cambios
realizados por otro usuario
Asegura que en los mismos datos:
Los lectores no esperen por los escritores
Los escritores no esperen por los lectores
Escritores esperen por los escritores.

Esta read consistency es una implementacin automtica. La imagen coherente de


lectura se construye a partir de los datos confirmados en la tabla y de los datos

75
antiguos que se estn cambiando y que sobre los cuales an no se ha realizado un
commit, por lo que los mantiene en el segmento undo.
Cuando se realiza una operacin de insercin, actualizacin o eliminacin en la base
de datos, el servidor de Oracle toma una copia de los datos antes de que se cambie
y lo escribe en un segmento undo.
Todos los lectores, excepto el que emiti el cambio, ven la base de datos tal como
exista antes de que comenzaran los cambios; Ellos ven la "instantnea" de los datos
del segmento undo. Esto garantiza que los lectores de los datos leen datos
consistentes que no estn sufriendo cambios.
Al hacer el commit sobre la instruccin DML, el cambio realizado en la base de datos
se vuelve visible para cualquier persona que emita una instruccin SELECT despus
de la confirmacin. El espacio ocupado por los datos antiguos en el archivo de
segmento undo se libera para su reutilizacin.
Si la transaccin se deshace, los cambios se deshacen:
La versin de los datos del segmento undo se escribe de nuevo en la tabla.
Todos los usuarios ven la base de datos tal como exista antes de comenzar la
transaccin.

Clausula FOR UPDATE en la sentencia SELECT

Oracle ofrece la clusula FOR UPDATE de la instruccin SELECT para realizar


bloqueos de registros, incluso antes de cambiarlos. Se liberan al ejecutar un
COMMIT o un ROLLBACK.

Puede agregar la palabra clave opcional NOWAIT a la clusula FOR UPDATE para
indicarle al servidor Oracle que no espere si la tabla ha sido bloqueada por otro
usuario. En este caso, el control se devolver inmediatamente a su programa o a su
entorno de SQL Developer para que pueda realizar otro trabajo o simplemente
espere un perodo de tiempo antes de intentarlo de nuevo.

76
Sin la clusula NOWAIT, su proceso se bloquear hasta que la tabla est disponible,
cuando los bloqueos sean liberados por el otro usuario a travs de un COMMIT o
ROLLBACK. La sintaxis es:

SELECT columna1[, columna2,....]


FROM nombre-tabla
[WHERE condicin]
[GROUP BY columna1, columna2.... ]
[HAVING condicin-seleccin-grupos ]
[FOR UPDATE [OF column_list] [NOWAIT]]
[ORDER BY columna1 [DESC], columna2 [DESC]... ]

PRACTICAS CAPITULO 4

1. Inserte un registro en la tabla empleado, utilizando substitucin de variables


para todos los campos.
2. Inserte los registros de la tabla vendedor en la tabla empleado, realizando los
ajustes de campos que se requieran.
3. Ejecute el siguiente script
CREATE TABLE EMP1
AS SELECT EMPNO, SALARIO, JEFE
FROM EMPLEADO
WHERE 1 = 0;
CREATE TABLE EMP2
AS SELECT EMPNO, FINGRESO, SALARIO
FROM EMPLEADO
WHERE 1 = 0;

77
Ejecute un insert all condicionado para aquellos casos donde el salario sea
mayor a 50000; inserte en la tabla emp1 sino en la tabla emp2. Los valores
deber buscarlos en la tabla empleado, donde el nmero de empleado sea
menor a 700.
4. Utilice la sentencia Merge para insertar y actualizar los registros de la tabla
emp1, en base a la tabla empleado.
5. Cree una copia de la estructura de la tabla empleado, solo con aquellos
registros que pertenezcan al departamento 1 y luego use una sentencia merge
para actualizar o insertar los registros que corresponda. Usar como base un
query sobre la tabla empleado.
6. Inserte un registro en la tabla empleado donde todos los valores de los
campos sean suministrados por el usuario.
7. Coloque un savepoint, nombrelo s1
8. Actualice el salario a 25000 para aquellos empleados donde el salario sea
menor 22000.
9. Coloque un savepoint, nmbrelo s2
10. Elimine la informacin de la tabla vendedor. Haga una consulta de la tabla.
11. Haga rollback al savepoint s2
12. Haga una consulta de la tabla vendedor
13. Utilizando el esquema HR, Utilizando el esquema HR, muestre el employee id,
salary y comission, donde el job_id sea ST_CLERK y la localizacin del
departamento sea 1500. Bloquee los registros, Ordene por employee id.

78
Captulo 5
TABLAS

79
CREANDO TABLAS

Una tabla es una unidad bsica de almacenamiento, compuesta de registros. A


Continuacin algunas consideraciones a la hora de elegir los nombres de las tablas y
las columnas:
Deben comenzar con una letra
Deben tener una longitud no mayor a 30 caracteres
Pueden contener solo AZ, az, 09, _, $ y #
No podemos usar el mismo nombre para dos objetos del mismo usuario.
No se pueden usar palabras reservadas por Oracle.

Para crear tablas debemos tener el privilegio CREATE TABLE, un rea de


almacenamiento y se debe especificar el nombre de la tabla, el nombre de las
columnas, con su tipo de datos y tamao. La sintaxis es:

CREATE TABLE [schema.]table


(column datatype [DEFAULT expr][, ...]);

Opcionalmente podemos colocar un valor por default para la columna durante el


insert.
Los valores literales, expresiones o funciones de SQL son legales
Otros nombres de columna o pseudocolumnas no son legales
El tipo de datos del valor default debe coincidir con el tipo de datos de la
columna a la cual se le esta asignando.

Constraints

Los constraints refuerzan las reglas a nivel de la table. Previenen eliminacin de


registros de una tabla si este tiene dependientes.

80
A continuacin los tipos de constraint:
NOT NULL: especifica que la columna no puede tener valores nulos
UNIQUE: especifica que el valor debe ser nico para todos los registros en la
tabla.
PRIMARY KEY: es el identificador nico para cada registro de la tabla.
FOREIGN KEY: establece una referencia de integridad entre la columna de la
tabla a la que pertenece y la columna de la tabla a la que hace referencia, la
cual debe contener valores que coincidan con los de la otra tabla.
CHECK: especifica una condicin la cual debe cumplirse.

Debemos tener presente a la hora de crear constraints que:


Usted puede nombrarla o dejar que el servidor de Oracle genere el nombre
usando el formato SYS_Cn
Se puede crear una restriccin
En el momento de crear la tabla.
Despus que la tabla ha sido creada.
Se puede definir una restriccin a nivel de columna o a nivel de tabla.
Los constraints pueden visualizarse en el diccionario de datos.

La sintaxis para los constraints es:


CREATE TABLE [schema.]table
(column datatype [DEFAULT expr]
[column_constraint],

[table_constraint]);

Constraint a nivel de columna:


column [CONSTRAINT constraint_name] constraint_type,
column,...

81
Ejemplo:
CREATE TABLE employees(
employee_id NUMBER(6)
CONSTRAINT emp_emp_id_pk PRIMARY KEY,
first_name VARCHAR2(20),
...);

Constraint a nivel de tabla:


column,...
[CONSTRAINT constraint_name] constraint_type
(column, ...),

Ejemplo:
CREATE TABLE employees(
employee_id NUMBER(6),
first_name VARCHAR2(20),
...
job_id VARCHAR2(10) NOT NULL,
CONSTRAINT emp_emp_id_pk
PRIMARY KEY (EMPLOYEE_ID));

El constraint NOT NULL es creado a nivel de columna. Ejemplo:

SQL> CREATE TABLE emp(


2 empno NUMBER(4),
3 ename VARCHAR2(10) NOT NULL,
4 job VARCHAR2(9),
5 mgr NUMBER(4),

82
6 hiredate DATE,
7 sal NUMBER(7,2),
8 comm NUMBER(7,2),
9 deptno NUMBER(7,2) NOT NULL);

Los constraints UNIQUE, PRIMARY KEY, CHECK y FOREIGN KEY pueden ser
definidos a nivel de columna o de tabla. Ejemplos:
CREATE TABLE dept(
2 deptno NUMBER(2),
3 dname VARCHAR2(14),
4 loc VARCHAR2(13),
5 CONSTRAINT dept_dname_uk UNIQUE,
6 CONSTRAINT dept_deptno_pk PRIMARY KEY,
10 CONSTRAINT emp_deptno_ck CHECK (DEPTNO BETWEEN 10 AND 99));

CREATE TABLE emp(


2 empno NUMBER(4),
3 ename VARCHAR2(10) NOT NULL,
4 job VARCHAR2(9),
5 mgr NUMBER(4),
6 hiredate DATE,
7 sal NUMBER(7,2),
8 comm NUMBER(7,2),
9 deptno NUMBER(7,2) NOT NULL,
10 CONSTRAINT emp_deptno_fk FOREIGN KEY (deptno)
11 REFERENCES dept (deptno) [ON DELETE CASCADE][ON DELETE SET NULL]);

La opcin ON DELETE CASCADE, permite eliminar los registros dependientes de la


tabla secundaria cuando se elimina un registro de la tabla principal.

83
La opcin ON DELETE SET NULL convierte los registros dependientes en nulos.

Para los constraints de tipo CHECK debemos tener presente que:


La condicin debe ser satisfactoria para cada uno de los registros
No est permitido:
Referenciar a CURRVAL, NEXTVAL, LEVEL y ROWNUM
Llamadas a SYSDATE, UID, USER, USERENV
Queries que referencien a otros valores en otros registros.

Creando Tablas usando Subqueries

Podemos crear tablas haciendo una insercin directa de registros, combinando la


sentencia CREATE TABLE con la opcin AS subquery. Debemos tener presente que
debe coincidir el numero de columnas especificadas con el numero de columnas del
subquery. Podemos definir la columna y sus valores con lo arrojado por el subquery.
La sintaxis es:
CREATE TABLE table
[(column, column...)]
AS subquery;
Ejemplo:
CREATE TABLE dept80
AS
SELECT employee_id, last_name,
salary*12 ANNSAL,
hire_date
FROM employees
WHERE department_id = 80;

84
ALTER TABLE

La sentencia ALTER TABLE se puede utilizer para:


Aadir una nueva columna.
Modificar la definicin de una columna existente.
Definir un valor por default para una nueva columna
Eliminar una columna
Renombrar una columna
Cambiar el estatus de la tabla a read-only o read/write:
Read-only previene DDL o DML durante el mantenimiento de una tabla.
Read/write estado normal.

Ejemplo de cambio de status en una table:


ALTER TABLE employees READ ONLY;
-- se ejecuta el mantenimiento y luego
-- se retorna al modo read/write
ALTER TABLE employees READ WRITE;

DROP TABLE

La instruccin DROP TABLE mueve una tabla a la recycle bin o elimina


completamente la tabla y todos sus datos de la base de datos. A menos que
especifique la clusula PURGE, la instruccin DROP TABLE no da lugar a que el
espacio sea liberado en el tablespace para su uso por otros objetos, y el espacio
contina contando sobre la cuota de espacio del usuario. Eliminar una tabla invalida
los objetos dependientes y elimina los privilegios de objeto en la tabla.
Al eliminar una tabla, la base de datos pierde todos los datos de la tabla y todos los
ndices asociados a ella.

85
La sintaxis es:
DROP TABLE table [PURGE]

Pautas
Todos los datos se eliminan de la tabla.
Todas las vistas y sinnimos permanecen, pero no son vlidas.
Se ejecuta un commit, finalizando cualquier transaccin pendiente.
Slo el creador de la tabla o un usuario con el privilegio DROP ANY TABLE puede
eliminar una tabla.
Nota: Utilice la instruccin FLASHBACK TABLE para restaurar una tabla eliminada,
desde la papelera de reciclaje.

PRACTICAS CAPITULO 5

1. Cree la tabla DEPT que contenga los siguientes campos:


a. id de tipo numero con un tamao de 7 que sera el PRIMARY KEY,
nombrelo como department_id_pk. Creelo a nivel de columna.
b. name de tipo VARCHAR2 con un tamao de 25.
2. Cree la tabla EMP con los siguientes campos:
a. id numerico de 7
b. last_name varchar2 de 25
c. first_name varchar2 de 25
d. dept_id numerico de 7 que sera un FOREIGN KEY que hace referencia
al campo dept de la tabla creada en el punto anterior. Hgalo a nivel de
columna.
3. Cree la tabla EMPLOYEES2 con un subquery que traiga el employee id, first
name, last name, salary y department id de la tabla employees. Coloque los
sigueintes alias:
a. id para la columna employee id
b. dept_id para la columna department_id

86
4. Coloque la tabla employees 2 para solo lectura.
5. Inserte un registro en la tabla employees2 de acuerdo a los siguientes valores
(34, 'Grant','Marcie',5678,10). Que ocurre?
6. Coloque la tabla employees2 habilitada para lectura y escritura.
7. Realice el insert del paso 5.
8. Borre la tabla employees2.

87
Captulo 6
CREANDO OTROS OBJETOS

88
VISTAS

Una vista representa lgicamente, subconjuntos de datos de una o ms tablas. Las


ventajas de usar vistas se detallan a continuacin:
Las vistas restringen el acceso a los datos porque muestra las columnas
seleccionadas de la tabla.
Las vistas se pueden utilizar para realizar consultas sencillas para recuperar
los resultados de consultas complicadas. Por ejemplo, las vistas pueden
utilizarse para consultar informacin de varias tablas sin que el usuario sepa
cmo escribir una sentencia de combinacin.
Las vistas proporcionan independencia de datos para usuarios ad hoc y
programas de aplicacin. Una vista se puede utilizar para recuperar datos de
varias tablas.
Las vistas proporcionan a los grupos de usuarios acceso a los datos segn
sus criterios particulares.

Hay dos clasificaciones para las vistas: simples y complejas. La diferencia bsica
est relacionada con las operaciones DML (INSERT, UPDATE y DELETE).
Una vista simple es aquella que:
Deriva datos de una sola tabla
No contiene funciones ni grupos de datos
Puede realizar operaciones DML a travs de la vista
Una visin compleja es aquella que:
Obtiene datos de muchas tablas
Contiene funciones o grupos de datos
No siempre permite operaciones DML a travs de la vista

Para crear una vista, hacemos uso de un subquery. La sintaxis para la creacin de
vistas es:

89
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view
[(alias[, alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY [CONSTRAINT constraint]];

FORCE Crea la vista independientemente de si existen o no las tablas base


NOFORCE Crea la vista slo si existen las tablas base (este es el valor
predeterminado).
WITH CHECK OPTION Especifica que slo se pueden insertar o actualizar las filas
accesibles para la vista.
CONSTRAINT Es el nombre asignado a la restriccin CHECK OPTION
WITH READ ONLY Asegura que no se pueden realizar operaciones DML en esta
vista.

Ejemplo de la creacin de una vista simple:


CREATE VIEW empvu80
AS SELECT employee_id, last_name, salary
FROM employees
WHERE department_id = 80;

Ejemplo de la creacin de una vista compleja:


CREATE OR REPLACE VIEW dept_sum_vu
(name, minsal, maxsal, avgsal)
AS SELECT d.department_name, MIN(e.salary),
MAX(e.salary),AVG(e.salary)
FROM employees e JOIN departments d
ON (e.department_id = d.department_id)
GROUP BY d.department_name;

90
Reglas para ejecutar operaciones DML en las vistas

Se pueden ejecutar operaciones DML sobre las vistas simples.


No se pueden remover registros si la vista contiene:
Funciones de Grupo
La clusula Group By
La instruccin DISTINCT
La pseudocolumna ROWNUM
No se pueden modificar datos en una vista, si esta contiene:
Funciones de Grupo
La clusula Group By
La instruccin DISTINCT
La pseudocolumna ROWNUM
Columnas definidas por expresiones.
No se puede aadir datos en una vista si esta incluye:
Funciones de Grupo
La clusula Group By
La instruccin DISTINCT
La pseudocolumna ROWNUM
Columnas definidas por expresiones.
Columnas definidas en las tablas base como NOT NULL y que no fueron
especificadas en la vista.

WITH CHECK OPTION

Usamos esta opcin para asegurarnos que las operaciones DML realizadas en la
vista permanezcan en el dominio de la vista.

91
Es posible realizar comprobaciones de integridad referencial a travs de las vistas,
pero el uso es muy limitado.
La clusula WITH CHECK OPTION especifica que el INSERT y UPDATE realizados
a travs de la vista no pueden crear registros que la vista no puede seleccionar. Por
lo tanto, permite que las restricciones de integridad y las comprobaciones de
validacin de datos, se apliquen en los datos que se insertan o actualizan. Si se
intenta realizar operaciones DML en filas que la vista no ha seleccionado, se
mostrar un error junto con el nombre de restriccin si se ha especificado.

Ejemplo:
CREATE OR REPLACE VIEW empvu20
AS SELECT *
FROM employees
WHERE department_id = 20
WITH CHECK OPTION CONSTRAINT empvu20_ck ;

Cualquier intento de INSERTAR un registro con un department_id distinto de 20 o de


ACTUALIZAR el nmero de departamento de cualquier registro de la vista falla
porque viola la restriccin WITH CHECK OPTION.

WITH READ ONLY

Con la opcin WITH READ ONLY podemos asegurar que no se produzcan


operaciones DML. Cualquier intento de realizar una operacin DML en cualquier fila
de la vista genera un error.

92
Ejemplo:
CREATE OR REPLACE VIEW empvu10
(employee_number, employee_name, job_title)
AS SELECT employee_id, last_name, job_id
FROM employees
WHERE department_id = 10
WITH READ ONLY ;

Si se intenta eliminar un registro de esta vista, se presenta el siguiente error:

DROP VIEW

Podemos eliminar una vista sin perder la data, porque una vista se basa en tablas
subyacentes de la base de datos. La sintaxis es:
DROP VIEW view;

SECUENCIAS

Una secuencia genera valores numricos. Una secuencia:


Puede generar automticamente nmeros nicos
Es un objeto compartido
Se puede utilizar para crear un valor de clave principal
Reemplaza el cdigo de la aplicacin
Acelera la eficiencia de acceso a valores de secuencia cuando se almacenan
en memoria cach.

93
La sintaxis de creacin es:
CREATE SEQUENCE sequence
[INCREMENT BY n]
[START WITH n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}];

INCREMENT BY n: Especifica el intervalo entre nmeros de secuencia, donde n es


un entero (si se omite esta clusula, la secuencia se incrementa en 1.)
START WITH n: Especifica el primer nmero de secuencia que se generar (si se
omite esta clusula, la secuencia comienza con 1.)
MAXVALUE n: Especifica el valor mximo que puede generar la secuencia.
NOMAXVALUE: Especifica un valor mximo de 10 ^ 27 para una secuencia
ascendente y -1 para una secuencia descendente (Esta es la opcin
predeterminada.)
MINVALUE n: Especifica el valor de secuencia mnimo
NOMINVALUE: Especifica un valor mnimo de 1 para una secuencia ascendente y -
(10 ^ 26) para una secuencia descendente (Este es el valor predeterminado).
CYCLE | NOCYCLE: Especifica si la secuencia contina generando valores despus
de alcanzar su valor mximo o mnimo (NOCYCLE es la opcin predeterminada).
CACHE n | NOCACHE: Especifica el nmero de valores que el servidor Oracle
asigna previamente y mantiene en la memoria (de forma predeterminada, el servidor
Oracle almacena en cach 20 valores).
Ejemplo:
CREATE SEQUENCE dept_deptid_seq
INCREMENT BY 10
START WITH 120
MAXVALUE 9999

94
NOCACHE
NOCYCLE;

Despus de crear la secuencia, hacemos referencia a los valores de secuencia


utilizando las pseudocolumnas NEXTVAL y CURRVAL.
La pseudocolumna NEXTVAL se utiliza para extraer los nmeros sucesivos de la
secuencia de una secuencia especificada. Debe calificar NEXTVAL con el nombre de
la secuencia. Cuando se hace referencia a la secuencia.NEXTVAL, se genera un
nuevo nmero de secuencia y se coloca el nmero de secuencia actual en
CURRVAL.
La pseudocolumna CURRVAL se utiliza para referirse a un nmero de secuencia que
el usuario actual acaba de generar. Sin embargo, NEXTVAL debe utilizarse para
generar un nmero de secuencia en la sesin del usuario actual antes de que se
pueda hacer referencia a CURRVAL. Debe calificar CURRVAL con el nombre de la
secuencia. Cuando hace referencia a la secuencia.CURRVAL, se muestra el ltimo
valor devuelto al proceso de ese usuario.

Puede utilizar NEXTVAL y CURRVAL en los siguientes contextos:


La lista del SELECT de una instruccin SELECT que no forma parte de un
subquery, materialized view, o view
La lista SELECT de una subconsulta en una instruccin INSERT
La clusula VALUES de una instruccin INSERT
La clusula SET de una instruccin UPDATE
No puede utilizar NEXTVAL y CURRVAL en los siguientes contextos:
La lista SELECT de una vista
Una instruccin SELECT con DISTINCT
Una sentencia SELECT con clusulas GROUP BY, HAVING u ORDER BY
Un subquery en una instruccin SELECT, DELETE o UPDATE

95
El valor DEFAULT de una columna en una sentencia CREATE TABLE o
ALTER TABLE.
Query de una vista o de una vista materializada
Una instruccin SELECT que se combina con otra instruccin SELECT con el
operador conjunto UNION, INTERSECT o MINUS.
La clusula WHERE de una instruccin SELECT
El constraint CHECK

Ejemplos del uso de secuencias:


INSERT INTO departments(department_id,
department_name, location_id)
VALUES (dept_deptid_seq.NEXTVAL,
'Support', 2500);

SELECT dept_deptid_seq.CURRVAL
FROM dual;

Los valores de secuencia de cach en memoria proporcionan un acceso ms rpido


a esos valores.
Pueden producirse saltos en los valores de secuencia cuando:
Se produce un rollback.
El sistema se bloquea/cae
Una secuencia se utiliza en otra tabla

Modificando Secuencias

Se puede Cambie el valor de incrementacin, valor mximo, valor mnimo, cycle o


cach.

96
Ejemplo:
ALTER SEQUENCE dept_deptid_seq
INCREMENT BY 20
MAXVALUE 999999
NOCACHE
NOCYCLE;

Algunas consideraciones que debemos toma en cuenta a la hora de modificar


secuencias, son:
Debe ser dueo de la secuencia o tener el privilegio de ALTER.
Solo los futuros nmeros de la secuencias sern afectados.
La secuencia debe ser eliminada y recreada para reiniciar la secuencia en un nmero
diferente.

Para eliminar una secuencia, utilice la instruccin DROP. Sintaxis:


DROP SEQUENCE nombre de la secuencia;

INDICES

Es un objeto que permite mejorar el rendimiento de algunas consultas. Es un objeto


del esquema, que puede acelerar la recuperacin de los registros utilizando un
puntero. Los ndices pueden crearse de forma explcita o automtica. Si no tiene un
ndice sobre la columna, se produce un full table scan.

Un ndice proporciona acceso directo y rpido a las filas de una tabla. Su propsito
es reducir la E / S del disco utilizando una ruta indexada para localizar rpidamente
los datos. El servidor Oracle utiliza y mantiene automticamente un ndice. Despus
de crear un ndice, el usuario no requiere ninguna actividad directa.

97
Los ndices son lgicamente y fsicamente independientes de la tabla que indexan.
Esto significa que pueden crearse o eliminarse en cualquier momento y no tienen
ningn efecto en las tablas base u otros ndices.

Se pueden crear dos tipos de ndices.


UNIQUE INDEX: el servidor Oracle crea automticamente este ndice cuando define
una columna en una tabla con un constraint PRIMARY KEY o UNIQUE. El nombre
del ndice es el nombre que se da al constraint.
NONUNIQUE INDEX: Este es un ndice que un usuario puede crear. Por ejemplo,
puede crear el ndice de columna FOREIGN KEY para una combinacin en una
consulta para mejorar la velocidad de recuperacin.
Nota: Puede crear manualmente un UNIQUE INDEX, pero se recomienda crear un
constraint UNIQUE, que implcitamente crea este indice.

Se puede crear un ndice para una o ms columnas. La sintaxis de creacin es:


CREATE [UNIQUE][BITMAP]INDEX index
ON table (column[, column]...);

Ejemplo:
CREATE INDEX emp_last_name_idx
ON employees(last_name);

Especifique UNIQUE para indicar que el valor de la columna (o columnas) en la que


se basa el ndice debe ser nico. Especifique BITMAP para indicar que el ndice se
va a crear con un mapa de bits para cada clave distinta, en lugar de indexar cada fila
por separado. Los ndices de mapa de bits almacenan los rowids asociados con el
valor de clave del mapa de bits. Siempre se recomienda usar ndices de mapas de
bits para sistemas en los que los datos no son actualizados por muchos sistemas
simultneos frecuentemente.

98
Consideraciones sobre la creacin de ndices.

Tener ms ndices en una tabla no genera consultas ms rpidas. Cada operacin


DML que se ejecuta contra una tabla con ndices significa que los ndices deben
actualizarse. Cuantos ms ndices tenga asociados a una tabla, ms esfuerzo tendr
que realizar el servidor Oracle para actualizar todos los ndices despus de una
operacin DML.

Debe crear ndices slo si:


La columna contiene una amplia gama de valores
La columna contiene un gran nmero de valores nulos
Una o ms columnas se utilizan con frecuencia en una clusula WHERE o una
condicin join.
La tabla es grande y se espera que la mayora de las consultas recuperen
menos del 2% al 4% de las filas

Recuerde que si desea reforzar la unicidad, debe definir un constraint UNIQUE en la


definicin de tabla. Un ndice nico se crea automticamente

La sintaxis para eliminar un ndice es:


DROP INDEX index;

Para poder borrar un ndice, se debe ser el dueo o tener el privilegio DROP ANY
INDEX.

SINONIMOS

Proporcionan nombres alternativos para los objetos. Por lo cual, podemos usarlos
para referirnos a una tabla que es propiedad de otro usuario, eliminando la necesidad

99
de calificar el nombre del objeto con el esquema. Este mtodo puede ser
especialmente til con nombres de objetos largos, como las vistas.

Sintaxis:
CREATE [PUBLIC] SYNONYM synonym
FOR object;

PUBLIC: Crea un sinnimo que es accesible a todos los usuarios

Reglas
El objeto no puede estar contenido en un paquete.
Un nombre de sinnimo privado debe ser distinto de todos los dems objetos
que pertenecen al mismo usuario.

La sentencia para eliminar un sinnimo es:


DROP [PUBLIC] SYNONYM nombre;

Solo el administrador de base de datos puede eliminar un sinnimo pblico.

TABLAS TEMPORALES

Una tabla temporal es una tabla que contiene datos que slo existen durante la
duracin de una transaccin o sesin. Los datos de una tabla temporal son privados
para la sesin, lo que significa que cada sesin slo puede ver y modificar sus
propios datos.
Las tablas temporales son tiles en aplicaciones donde un conjunto de resultados
debe ser almacenado en bfer. Por ejemplo, un carrito de la compra en una
aplicacin en lnea puede ser una tabla temporal. Cada elemento est representado
por un registro en la tabla temporal. Mientras que usted est haciendo compras en

100
una tienda en lnea, usted puede seguir agregando o quitando artculos de su carro.
Durante la sesin, los datos de este carrito son privados. Despus de finalizar sus
compras y realizar los pagos, la aplicacin mueve la fila del carro elegido a una tabla
permanente. Al final de la sesin, los datos temporales se eliminan automticamente.
Dado que las tablas temporales estn definidas estticamente, puede crear ndices
para ellas. Los ndices creados en tablas temporales tambin son temporales. Los
datos del ndice tienen el mismo mbito de sesin o transaccin que los datos de la
tabla temporal. Tambin puede crear una vista o disparador en una tabla temporal.

Para crear una tabla temporal puede utilizar el siguiente comando:


CREATE GLOBAL TEMPORARY TABLE nombre de tabla
ON COMMIT [PRESERVE | DELETE] ROWS

DELETE ROWS: crea una tabla temporal que es especfica de la transaccin. Una
sesin se vincula a la tabla temporal con la primera insercin de una transaccin en
la tabla. El enlace desaparece al final de la transaccin. La base de datos trunca la
tabla (eliminar todos los registros) despus de cada commit.

PRESERVE ROWS: crea una tabla temporal que es especfica de la sesin. Cada
sesin de representante de ventas puede almacenar sus propios datos de ventas
para el da en la tabla. Esta vinculacin desaparece al final de la sesin o emitiendo
un TRUNCATE de la tabla en la sesin. La base de datos trunca la tabla cuando
termina la sesin.

Cuando crea una tabla temporal en una base de datos Oracle, crea una definicin de
tabla esttica. Al igual que las tablas permanentes, las tablas temporales se definen
en el diccionario de datos. Sin embargo, las tablas temporales y sus ndices no
asignan automticamente un segmento cuando se crean. En su lugar, los segmentos
temporales se asignan cuando los datos se insertan por primera vez. Hasta que los
datos se carguen en una sesin, la tabla aparece vaca.

101
TABLAS EXTERNAS

Una tabla externa es una tabla read-only, cuyos metadatos se almacenan en la base
de datos pero los datos se almacenan fuera de la base de datos. Esta definicin de
tabla externa se puede considerar como una vista que se utiliza para ejecutar
cualquier consulta SQL contra datos externos sin requerir que los datos externos
primero se carguen en la base de datos. Los datos de la tabla externa se pueden
consultar y unir directamente y en paralelo sin requerir que los datos externos se
carguen por primera vez en la base de datos. Puede utilizar SQL, PL/SQL y Java
para consultar los datos en una tabla externa.

La diferencia principal entre tablas externas y tablas regulares es que las tablas
externas son de slo lectura. No es posible realizar operaciones DML, y no se
pueden crear ndices sobre ellas. Sin embargo, puede crear una tabla externa y, por
tanto, descargar datos mediante el comando CREATE TABLE AS SELECT.

Oracle Server proporciona dos controladores de acceso principales para las tablas
externas. Uno es el ORACLE_LOADER, que se utiliza para leer datos de archivos
externos cuyo formato puede ser interpretado por la utilidad SQL*Loader. Tenga en
cuenta que no todas las funcionalidades de SQL*Loader estn soportadas con tablas
externas. El otro controlador es el ORACLE_DATAPUMP, que puede utilizarse para
importar y exportar datos utilizando un formato independiente de la plataforma. El
ORACLE_DATAPUMP escribe los registros con una instruccin SELECT para
cargarse en una tabla externa como parte de una instruccin CREATE TABLE ...
ORGANIZATION EXTERNAL ... AS SELECT. A continuacin, puede utilizar SELECT
para leer datos de ese archivo de datos. Tambin puede crear una definicin de tabla
externa en otro sistema y utilizar ese archivo de datos. Esto permite que los datos se
muevan entre las bases de datos de Oracle.

102
Para crear tablas externas, utilice la instruccin CREATE DIRECTORY para crear un
objeto de directorio. Un objeto de directorio especifica un alias para un directorio a
nivel del sistema operativo, donde reside un origen de datos externo.

Debe tener privilegios de sistema CREATE ANY DIRECTORY para crear directorios.
Cuando crea un directorio, se le conceden automticamente los privilegios READ y
WRITE y puede conceder estos a otros usuarios y roles. El DBA tambin puede
otorgar estos privilegios a otros usuarios y roles.

Un usuario necesita privilegios de lectura para todos los directorios utilizados en las
tablas externas a las que se accede y los privilegios de ESCRITURA para las
ubicaciones de los archivos log, bad y discard que se utilizan.

Oracle tambin proporciona el tipo ORACLE_DATAPUMP con el que puede


descargar datos (es decir, leer datos de una tabla de la base de datos e insertarlos
en una tabla externa) y volver a cargarlos en una base de datos Oracle. Se trata de
una operacin nica que se puede realizar cuando se crea la tabla. Una vez
finalizada la creacin y la poblacin inicial, no puede actualizar, insertar ni eliminar
ninguna fila.

Sintaxis:
CREATE TABLE <table_name>
( <col_name> <datatype>, )
ORGANIZATION EXTERNAL
(TYPE <access_driver_type>
DEFAULT DIRECTORY <directory_name>
ACCESS PARAMETERS
( ) )
LOCATION ('<location_specifier>')
REJECT LIMIT [0 | <number> | UNLIMITED];

103
Utilice la clusula ORGANIZATION para especificar el orden en el que se almacenan
las filas de datos de la tabla. Al especificar EXTERNAL en la clusula
ORGANIZATION, indica que la tabla es una tabla de slo lectura situada fuera de la
base de datos. Tenga en cuenta que los archivos externos ya deben existir fuera de
la base de datos.

Ejemplo:
CREATE OR REPLACE DIRECTORY emp_dir
AS '//emp_dir';

GRANT READ ON DIRECTORY emp_dir TO ora_21;

CREATE TABLE oldemp (


fname char(25), lname CHAR(25))
ORGANIZATION EXTERNAL
(TYPE ORACLE_LOADER
DEFAULT DIRECTORY emp_dir
ACCESS PARAMETERS
(RECORDS DELIMITED BY NEWLINE
NOBADFILE
NOLOGFILE
FIELDS TERMINATED BY ','
(fname POSITION ( 1:20) CHAR,
lname POSITION (22:41) CHAR))
LOCATION ('emp.dat'))
PARALLEL 5
REJECT LIMIT 200;

104
PRACTICAS CAPITULO 6

1. Cree la vista employees_vu en base al employee_id, last_name,


department_id de la tabla employees. La columna last_name se debera llamar
employee.
2. Cree la vista dept50 basado en el employee_id (empno), last_name
(employee), department_id (deptno) de la tabla employees donde el
departamento sea igual a 50. Asegure la integridad.
3. Realice un update usando la vista dept50 para colocar el departamento en 80
cuando el empleado sea MATOS.
4. Cree la secuencia dept_id_seq, la cual debera comenzar en 200,
incrementarse en 10 y tener un valor maximo de 1000.
5. Utilizando la secuencia creada en el punto anterior,inserte dos registros en la
tabla dept, Education y Administration.
6. Cree el indice dept_name sobre la tabla dept columna name.
7. Cree el sinonimo emp1 para employees.
8. Haga el scritp de creacin de directori emp_dir, indicando la ruta c:\taller_sql.
Otorgue el privilegio de lectura sobre ese directorio al usuario OE.
9. Haga el script para crear una tabla externa que llamara library_items_ext, de
acuerdo a las siguientes especificaciones:
a. Campos:
i. category_id number(12)
ii. book_id number(6)
iii. book_price number(8,2)
iv. quantity number(8)
b. El tipo ORACLE LOADER
c. El directorio emp_dir
d. Registros delimitados por una nueva linea y campos terminados en ,
e. El archivo se llama library_items.dat
f. Es ilimitado el rechazo de registros

105
Captulo 7
MANEJANDO OBJETOS

106
ALTER TABLE

Despus de crear una tabla, se puede requerir cambiar la estructura, por omisin de
columnas la definicin de las columnas esta erada, e incluso se puede requerir la
eliminacin de columnas. Para todo lo anterior, trabajamos con la sentencia ALTER
TABLE.

MANEJANDO COLUMNAS

ADD
Sintaxis:
ALTER TABLE nombre de la tabla
ADD (columna tipo de datos [DEFAULT expr]
[,columna tipo de datos]...);

Si una tabla ya contiene filas cuando se agrega una columna, la nueva columna es
inicialmente nula o toma el valor por default para todas las filas. Puede agregar una
columna NOT NULL a una tabla que contenga datos en las otras columnas slo si
especifica un valor por Default. Puede agregar una columna NOT NULL a una tabla
vaca sin el valor por Default. No se puede especificar un orden para la columna,
aparecer al final.

MODIFY
Sintaxis:
ALTER TABLE nombre de la tabla
MODIFY (columna tipo de datos [DEFAULT expr]
[,columna tipo de datos]...);

La modificacin de columna puede incluir cambios en el tipo de datos, el tamao y el


valor por Default de una columna.

107
Pautas sobre las modificaciones
Puede aumentar el ancho o la precisin de una columna numrica.
Puede aumentar el ancho de las columnas de caracteres.
Puede reducir el ancho de una columna si:
La columna slo contiene valores nulos
La tabla no tiene registros
La disminucin en el ancho de columna no es menor que los valores
existentes en esa columna.
Puede cambiar el tipo de datos si la columna contiene slo valores nulos. La
excepcin a esto es las conversiones CHAR en el tipo de datos VARCHAR2 o
convertir una columna VARCHAR2 en el tipo de datos CHAR slo si la
columna no cambia de tamao.
Un cambio en el valor por default de una columna slo afecta a las inserciones
posteriores de la tabla.

DROP
Sintaxis:
ALTER TABLE nombre de la tabla
DROP (columna [, columna] );

Pautas sobre la eliminacin


La columna puede o no tener data.
La tabla debe quedar con al menos una columna en ella despus de que se
altere.
Despus de eliminada una columna, no se puede recuperar.
Eliminar una columna puede tardar un tiempo si la columna tiene un gran
nmero de valores. En este caso, puede ser mejor colocarla en unused y
borrarla cuando haya menos usuarios en el sistema para evitar bloqueos
extendidos.

108
SET UNUSED

Esta opcin marca una o ms columnas como no utilizadas para que puedan ser
eliminadas cuando la demanda en los recursos del sistema sea menor. La
especificacin de esta clusula no elimina realmente las columnas de destino de
cada fila de la tabla (es decir, no restaura el espacio en disco utilizado por estas
columnas). Por lo tanto, el tiempo de respuesta es ms rpido que si ejecuta la
clusula DROP. Las columnas no utilizadas se tratan como si se hubieran eliminado,
aunque sus datos de columna permanezcan en las filas de la tabla.

Sintaxis:
ALTER TABLE <table_name>
SET UNUSED(<column_name> [ , <column_name>]);

ALTER TABLE <table_name>


SET UNUSED COLUMN <column_name> [ , <column_name>];

Despus de marcar una columna como no utilizada, no tiene acceso a esa columna.
Una consulta SELECT * no recuperar datos de columnas no utilizadas. Adems, los
nombres y tipos de columnas marcadas UNUSED no se mostrarn durante una
sentencia DESCRIBE y se puede agregar a la tabla, una nueva columna con el
mismo nombre que una columna UNUSED. La informacin de estas columnas se
almacena en la vista de diccionario USER_UNUSED_COL_TABS.

Nota: Las pautas para establecer una columna a UNUSED son similares a las que se
usan para eliminar una columna.

Para borrar las columnas marcadas como UNUSED ejecutamos la siguiente


sentencia:
ALTER TABLE <table_name>

109
DROP UNUSED COLUMNS;

Con esta sentencia se elimina de la tabla todas las columnas marcadas como
UNUSED. Puede utilizar esta instruccin cuando desee recuperar el espacio de disco
de estas columnas en la tabla. Si la tabla no contiene columnas UNUSED, la
sentencia regresa sin errores.

MANEJANDO CONSTRAINTS

Los constraints pueden ser manejados a travs de la clausula ALTER TABLE, de


acuerdo a lo siguiente:
Aadir o eliminar un constraint
No se puede modificar la estructura del constraint, pero podemos cambiar
su estado.
ADD
Podemos agregar constraints a una tabla existente, a travs de la sentencia ALTER
TABLE con la clasula ADD CONSTRAINT
Sintaxis:
ALTER TABLE tabla
ADD CONSTRAINT nombre del constraint
TYPE [ON DELETE CASCADE][ON DELETE SET NULL]

MODIFY
La modificacin de las restricciones est sujeta a las siguientes restricciones:
No puede cambiar el estado de una restriccin NOT DEFERRABLE a
INITIALLY DEFERRED.
Si especifica esta clusula para un index-organized table, no puede
especificar ninguna otra clusula en la misma sentencia.

110
No puede cambiar la restriccin NOT NULL en una columna FOREIGN KEY
de una tabla con particin de referencia y no puede cambiar el estado de una
constraint de particin referencial de una tabla con particiones de referencia.

ENABLE
Especifique ENABLE si desea que el constraint se aplique a los datos de la tabla.

DISABLE
Especifique DISABLE para desactivar el constraint.

DEFERRABLE Y NOT DEFERRABLE


Los parmetros DEFERRABLE y NOT DEFERRABLE indican si, en las
transacciones subsiguientes, la comprobacin de los constraints puede ser diferida
hasta el final de la transaccin. Si omite esta clusula, el valor predeterminado es
NOT DEFERRABLE.

Las clusulas INITIALLY INMMEDIATE o INITIALLY DIFERRED establecen el


comportamiento de comprobacin predeterminado para los constraints
DEFERRABLE. Puede ser anulado por una sentencia SET CONSTRAINT (S) en una
transaccin posterior. DIFERRED espera para verificar la restriccin hasta que
finalice la transaccin. INMMEDIATE Verifica la restriccin al final de la ejecucin de
la sentencia.

Si se especifica DEFERRABLE se puede indicar que en transacciones posteriores


puede utilizar la clusula SET CONSTRAINT [S] para aplazar la comprobacin de
esta restriccin hasta despus de que se ha ejecutado el commit. Esta configuracin
en efecto le permite deshabilitar la restriccin temporalmente mientras realiza
cambios en la base de datos que podran violar el constraint hasta que todos los
cambios estn completos.

111
Especifique NOT DEFERRABLE para indicar que en transacciones posteriores no
pueden utilizar la clusula SET CONSTRAINT [S] para aplazar la comprobacin de
estos constraints hasta que se ejecute el commit. Por lo tanto, la comprobacin de un
constraint NOT DEFERRABLE nunca puede ser diferida al final de la transaccin.

No se puede alterar la postergacin de un constraint. Es decir, si especifica


cualquiera de estos parmetros, o crea el constraint NOT DEFERRABLE
implcitamente, no puede especificar esta clusula en una sentencia ALTER TABLE.
Debe eliminar la restriccin y volver a crearla.

Ejemplos
ALTER TABLE dept2
ADD CONSTRAINT dept2_id_pk
PRIMARY KEY (department_id)
DEFERRABLE INITIALLY DEFERRED

SET CONSTRAINTS dept2_id_pk IMMEDIATE

ALTER SESSION
SET CONSTRAINTS= IMMEDIATE
CREATE TABLE emp_new_sal (salary NUMBER
CONSTRAINT sal_ck
CHECK (salary > 100)
DEFERRABLE INITIALLY IMMEDIATE,
bonus NUMBER
CONSTRAINT bonus_ck
CHECK (bonus > 0 )
DEFERRABLE INITIALLY DEFERRED );

112
Ejemplo 1: Insertamos un registro que viola el sal_ck. En la sentencia de CREATE
TABLE, sal_ck esta especificado como un constraint initially immediate. Esto significa
que el constraint es chequeado inmediatamente despues del INSERT, por lo que se
va a generar un error.
INSERT INTO emp_new_sal VALUES(90,5);

Ejemplo 2: Inserte una fila que viole bonus_ck. En la instruccin CREATE TABLE,
bonus_ck se especifica como diferido y tambin diferido inicialmente. Por lo tanto, el
constraint no se verifica hasta que se ejecute un COMMIT o se establezca el estado
a inmediato.
INSERT INTO emp_new_sal VALUES(110, -1);

El registro es insertado satisfactoriamente. Pero al ejecutar el commit, arroja un error.


COMMIT;

El commit fall debido a la violacin del constraint. Por lo tanto, en este punto, la se
hace el rollback de la transaccin.

DROP
Para eliminar una restriccin, puede identificar el nombre de restriccin de las vistas
de diccionario de datos USER_CONSTRAINTS y USER_CONS_COLUMNS. A
continuacin, utilice la instruccin ALTER TABLE con la clusula DROP. La opcin
CASCADE de la clusula DROP hace que tambin se eliminen las restricciones
dependientes.

Sintaxis:
ALTER TABLE table
DROP PRIMARY KEY | UNIQUE (column) |
CONSTRAINT constraint [CASCADE];

113
Ejemplos:
ALTER TABLE emp2
DROP CONSTRAINT emp_mgr_fk;

ALTER TABLE dept2


DROP PRIMARY KEY CASCADE;

En este ltimo ejemplo, se elimina el constraint PRIMARY KEY de la tabla DEPT2 y


se suprime el constreint FOREIGN KEY asociado a la columna
EMP2.DEPARTMENT_ID

La clusula CASCADE CONSTRAINTS se utiliza junto con la clusula DROP


COLUMN. Esta elimina todas los constraints referenciales que se refieren a las
PRIMARY y UNIQUE KEY definidas en las columnas eliminadas.

RENOMBRANDO COLUMNAS Y CONSTRAINTS

Usamos la clausula RENAME COLUMN de la sentencia ALTER TABLE para


renombrar columnas en una tabla. Cuando se cambia el nombre de una columna en
una tabla, el nuevo nombre no debe entrar en conflicto con el nombre de ninguna
columna existente en la tabla. No puede utilizar ninguna otra clusula junto con la
clusula RENAME COLUMN.

Ejemplo:
ALTER TABLE marketing
RENAME COLUMN team_id TO id;

Utilice la clusula RENAME CONSTRAINT de la sentencia ALTER TABLE para


cambiar el nombre de cualquier constraint existente para una tabla.

114
Ejemplo:
ALTER TABLE marketing RENAME CONSTRAINT mktg_pk
TO new_mktg_pk;

PRACTICAS CAPITULO 7
1. Elimine la columna first_name de la tabla employees2. Luego vea la
estructura.
2. Establezca la columna dept_id de la tabla employees2 como UNUSED. Luego
vea la estructura.
3. Elimine la columna UNUSED de la tabla employees2. Revise la estructura al
finalizar.
4. Cree un constraint de primary key sobre el campo id para la tabla emp2.
5. Cree un constraint foreign key sobre el campo dept_id para la tabla emp2
haciendo referencia al campo usado en el constraint del punto anterior.
6. Agregue la columna commission a la tabla emp2, numrico de 4 con 2
decimales. En la misma sentencia agregue un constraint de check que llamar
my_emp_comm_ck para validar que el valor sea mayor a 0.

115
116
Captulo 8
VISTAS DEL DICCIONARIO DE DATOS

117
EL DICCIONARIO DE DATOS

Es una coleccin de tablas y vistas en la base de datos, creada y mantenida por el


servidor de Oracle y contiene informacin sobre la base de datos. El diccionario de
datos se estructura en tablas y vistas, al igual que otros datos de la base de datos.
No slo es un eje para las bases de datos de Oracle, sino que tambin es una
herramienta importante para todos los usuarios, desde los usuarios finales hasta los
diseadores de aplicaciones y los administradores de bases de datos.

Dado que el diccionario de datos es de slo lectura, slo puede emitir consultas en
sus tablas y vistas, a travs de instrucciones SQL. Puede consultar las vistas de
diccionario que se basan en las tablas de diccionario para encontrar informacin
como:
Definiciones de todos los objetos de esquema en la base de datos (tablas,
vistas, ndices, sinnimos, secuencias, procedimientos, funciones, paquetes,
disparadores, etc.)
Valores por defecto para las columnas
Informacin de constraints
Nombres de los usuarios de Oracle
Privilegios y roles que cada usuario ha recibido
Otra informacin general de la base de datos

Hay varias vistas que resumen y muestran la informacin almacenada en las tablas
base del diccionario de datos. Estas vistas descodifican los datos de la tabla base,
mediante combinaciones y clusulas WHERE para simplificar la informacin. La
mayora de los usuarios tienen acceso a las vistas en lugar de las tablas base.

El usuario SYS es el owner de todas las tablas base y vistas accesibles por el
usuario sobre el diccionario de datos.

118
El diccionario de datos consiste en conjuntos de vistas. En muchos casos, un
conjunto consiste en tres vistas que contienen informacin similar y se distinguen
entre s por sus prefijos. Por ejemplo, hay una vista denominada USER_OBJECTS,
otra denominada ALL_OBJECTS y una tercera denominada DBA_OBJECTS.

Estas tres vistas contienen informacin similar sobre objetos en la base de datos,
excepto que el mbito es diferente. USER_OBJECTS contiene informacin acerca de
los objetos que posee o crea. ALL_OBJECTS contiene informacin sobre todos los
objetos a los que tiene acceso. DBA_OBJECTS contiene informacin acerca de
todos los objetos propiedad de todos los usuarios. Para las vistas que estn
prefijadas con ALL o DBA, generalmente hay una columna adicional en la vista
denominada OWNER para identificar quin es el propietario del objeto. Tambin hay
un conjunto de vistas que tiene el prefijo v$. Estas son de naturaleza dinmica y
contienen informacin sobre el rendimiento.

Para familiarizarse con las vistas del diccionario, puede utilizar la vista denominada
DICCIONARIO. Esta contiene el nombre y una breve descripcin de cada vista de
diccionario a la que tiene acceso.

Puede utilizar la vista USER_TABLES para obtener los nombres de todas sus tablas.
La vista USER_TABLES contiene informacin acerca de las tablas. Adems de
proporcionar el nombre de la tabla, contiene informacin detallada sobre el
almacenamiento.

Puede consultar la vista USER_TAB_COLUMNS para encontrar informacin


detallada sobre las columnas de sus tablas. Aunque la vista USER_TABLES
proporciona informacin sobre los nombres de las tablas y el almacenamiento, la
informacin detallada de la columna se encuentra en la vista USER_TAB_COLUMNS

USER_CONSTRAINTS describe las definiciones de los constraints en las tablas.

119
USER_CONS_COLUMNS describe las columnas que son de su propiedad y que se
especifican en los constraints.

La informacin de las vistas se puede consultar en USER_VIEWS, donde encontrara


el nombre de la vista y la definicin de la vista.

La vista USER_SEQUENCES describe todas las secuencias que posee.

USER_INDEXES proporciona informacin sobre sus ndices. USER_IND_COLUMNS


proporciona informacin sobre las columnas indicadas en el ndice.

La vista de diccionario USER_SYNONYMS describe sinnimos privados.

Los comentarios pueden ser visualizados a travs de las vistas


ALL_COL_COMMENTS, USER_COL_COMMENTS, ALL_TAB_COMMENTS,
USER_TAB_COMMENTS.

PRACTICAS CAPITULO 8

Todo deber hacerlo con el usuario HR


1. Las vistas de diccionario que se basan en las tablas de diccionario contienen
informacin como:
a. Definiciones de todos los objetos de esquema en la base de datos
b. Valores por defecto para las columnas
c. Informacin de restriccin de integridad
d. Privilegios y roles que cada usuario ha recibido
e. Todo lo de arriba
2. Consulte el nombre de las tablas que le pertenecen.

120
3. Muestre el nombre de la tabla y el dueo de aquellas tablas sobre las que
tenga permisologa pero no es dueo.
4. Muestre el nombre de la columna, el tipo de datos, la longitud, la precisin, la
escala y si acepta nulos, para una tabla que sea suministrada por el usuario.
5. Muestre el nombre de la columna, el nombre el constraint, el tipo de
constraint, la condicin y el estatus, para una tabla suministrada por el
usuario.
6. Escriba el siguiente comentario para la tabla departamentos 'Company
department information including name, code, and location.' y luego bsquelo
en el diccionario de datos.
7. Seleccione el nombre y el texto de las vistas que le pertenecen.
8. Seleccione el nombre, el valor maximo, el valor de incrementacin y el ltimo
nmero de las secuencias que le pertenecen.
9. Seleccione el nombre y el tipo de todos los objetos que le pertenezcan que
comiencen con 'EMP' y 'DEP'

121
122
Captulo 9
CONTROLANDO EL ACCESO DE
USUARIOS

123
Con la seguridad de la base de datos de Oracle Server, puede hacer lo siguiente:
Controlar el acceso a la base de datos.
Dar acceso a objetos especficos en la base de datos.
Confirmar los privilegios otorgados y recibidos.

La seguridad de la base de datos se puede clasificar en dos categoras: seguridad


del sistema y seguridad de los datos.

La seguridad del sistema abarca el acceso y el uso de la base de datos a nivel del
sistema, como el nombre de usuario y la contrasea, el espacio en disco asignado a
los usuarios y las operaciones del sistema que pueden realizar los usuarios.

La seguridad de la base de datos cubre el acceso y uso de los objetos de la base de


datos y las acciones que esos usuarios pueden realizar sobre los objetos.

Privilegios del sistema: Controlan la ejecucin de una accin particular dentro de la


base de datos.

Privilegios de objetos: Controlan la manipulacin del contenido de los objetos de la


base de datos.

Esquemas: Coleccin de objetos como tablas, vistas y secuencias

PRIVILEGIOS DEL SISTEMA

Ms de 100 privilegios estn disponibles. El administrador de la base de datos tiene


privilegios de sistema de alto nivel para tareas tales como:
Creacin de nuevos usuarios
Eliminacin de usuarios
Eliminar tablas

124
Copias de seguridad de tablas

Creacin de Usuarios

El DBA crea el usuario ejecutando la instruccin CREATE USER. El usuario no tiene


privilegios en este momento. El DBA puede otorgar privilegios a ese usuario. Estos
privilegios determinan lo que el usuario puede hacer en el nivel de la base de datos.

CREATE USER user


IDENTIFIED BY password;

Despus de que el DBA crea un usuario, el DBA puede asignar privilegios a ese
usuario.

GRANT privilege [, privilege...]


TO user [, user| role, PUBLIC...];

Por ejemplo, un desarrollador de aplicaciones, puede tener los siguientes system


privileges:
CREATE SESSION
CREATE TABLE
CREATE SEQUENCE
CREATE VIEW
CREATE PROCEDURE

GRANT create session, create table,


create sequence, create view
TO user;

125
Para facilitar la renovacin y el mantenimiento de los privilegios, el administrador de
base de datos puede crear un rol. Un rol es un grupo nombrado de privilegios
relacionados que se pueden conceder al usuario. Un usuario puede tener acceso a
varios roles y se puede asignar a varios usuarios el mismo rol.

Sintaxis
CREATE ROLE role;

Una vez creado, el DBA puede utilizar la sentencia GRANT para asignar el rol a los
usuarios, as como asignar privilegios al rol. Un rol no es un objeto de esquema, por
lo que cualquier usuario puede agregar privilegios a un rol.

Ejemplo:
CREATE ROLE manager;
GRANT create table, create view
TO manager;
GRANT manager TO alice;

El DBA crea el usuario y le asigna un password inicial, usted puede cambiar el


password, haciendo uso de la siguiente sentencia:
ALTER USER usuario
IDENTIFIED BY nuevo password;

126
PRIVILEGIOS DE OBJETOS

Un privilegio de objeto es un privilegio o un derecho para realizar una accin


particular en una tabla, vista, secuencia o procedimiento especfico. Cada objeto
tiene un conjunto particular de privilegios otorgables.

Los privilegios de objetos varan de un objeto a otro. Un owner tiene todos los
privilegios sobre el objeto. Un owner puede dar privilegios especficos sobre sus
objetos.

Sintaxis:
GRANT object_priv [(columns)]
ON object
TO {user|role|PUBLIC}
[WITH GRANT OPTION];

Ejemplos:
GRANT select
ON employees
TO demo;

GRANT update (department_name, location_id)


ON departments
TO demo, manager;

GRANT select, insert


ON departments
TO demo
WITH GRANT OPTION;

127
GRANT select
ON alice.departments
TO PUBLIC;

Los privilegios sobre los objetos concedidos a otros usuarios, pueden ser revocados.
Los privilegios que especificaN se revocan de los usuarios que usted indique y de
cualquier otro usuario al que el usuario revocado otorg esos privilegios..

Sintaxis:
REVOKE {privilege [, privilege...]|ALL}
ON object
FROM {user[, user...]|role|PUBLIC}

Ejemplo:
REVOKE select, insert
ON departments
FROM demo;

PRACTICAS CAPITULO 9

1. Cul de las siguientes afirmaciones es verdadera?


a. Despus de que un usuario crea un objeto, el usuario puede pasar a
cualquiera de los privilegios de objeto disponibles a otros usuarios
mediante la instruccin GRANT.
b. Un usuario puede crear roles utilizando la sentencia CREATE ROLE
para pasar a una coleccin de privilegios de sistema u objeto a otros
usuarios.
c. Los usuarios pueden cambiar sus propias contraseas.

128
d. Los usuarios pueden ver los privilegios que se les conceden y los que
se conceden en sus objetos.
2. Otorgue el privilegio de select sobre la tabla REGIONS al usuario training.
3. otorgue el privilegio de select, update e insert sobre la tabla COUNTRIES a
training.

129

You might also like