0% encontró este documento útil (0 votos)
38 vistas46 páginas

Manual Básico Oracle SQL

Este documento presenta un manual básico sobre SQL y SQL*Plus. Explica conceptos clave como DDL, DML y SQL*Plus e introduce los principales comandos y su sintaxis.

Cargado por

Luis Figueroa
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
38 vistas46 páginas

Manual Básico Oracle SQL

Este documento presenta un manual básico sobre SQL y SQL*Plus. Explica conceptos clave como DDL, DML y SQL*Plus e introduce los principales comandos y su sintaxis.

Cargado por

Luis Figueroa
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 46

MANUAL BÁSICO

ORACLE
SQL & SQL*PLUS

Introdución

Este curso pretende ser una introducción al SQL, y en particular al de


Oracle llamado SQL*Plus. No se pretende realizar un estudio
exhaustivo de todas las opciones, comandos y aspectos de
almacenamiento y administración que se pueden considerar en SQL.
Sólo se ha deseado introducir y explicar los comandos más utilizados
con sus opciones, suficientes para un programador.

Por R. Rivas
Ediciones:
SQL*Plus Mayo 1998. Santo Domingo, R.D.
SQL*Plus Julio 2004. Santo Domingo, R.D.
CONTENIDO Pagina

CAPITULO I – USO DEL SQL*PLUS 3


Terminología 3
Edición SQL*Plus 4
Utilización De Ficheros 5
Comando DESCRIBE 5

CAPITULO II - SENTENCIAS DDL (Data Definition Language) 6


Creación de Tablas 8
Modificación de Tablas, Columnas y Restricciones 11
Alteración de Restricciones 13
Ejercicio de Capitulo 14

CAPITULO III - SENTENCIAS DDL (Data Definition Language) 15


Creación de Sinónimos 15
Creación de índices 16
Eliminación de Objetos 17
Truncando Tablas 19
Ejercicio de Capitulo 20

CAPITULO IV - DML (Data Manipulation Language) 21


Inserción INSERT 21
Actualización UPDATE 21
Borrado DELETE 22
Selección SELECT 22
Selección de Columnas 23
Cláusula FROM 24
Cláusula WHERE 24
Cláusula ORDER BY 26
Cláusula DISTINCT 26
Funciones SQL 27
Cláusula GROUP BY 32
Funciones de Agrupamiento 33
Combinaciones 35
SubConsultas 38
Creación de Vistas 40
Renombrar Objetos 40
Ejercicio de Capitulo 41

MAS DE SQL*PLUS 42
CAPITULO I – USO DEL SQL*PLUS

Terminología:

SQL Structured Query Language o Lenguaje de Consultas Estructurado. Es el lenguaje que


permite la comunicación con el SGBD o Sistema Gestor de Bases de Datos (Oracle en
nuestro caso).

El SQL es un lenguaje unificado. Lo utilizan todo tipo de usuarios, desde el administrador


de la base de datos, DBA, hasta el usuario final.

El SQL es un lenguaje no procedimental. El usuario especifica Qué quiere, no Cómo ni


Dónde conseguirlo.

El SQL es relacionalmente completo. Permite la realización de cualquier consulta de datos.

SQL= DDL + DML Las sentencias del SQL se clasifican como parte del DDL o del DML.

DDL, Lenguaje de Definición de Datos: sentencias del SQL que permiten definir los
objetos de la Base de Datos (create, revoke, grant, alter, etc.). Cuando se definen dichos
objetos se almacenan en el diccionario de datos.

DML, Lenguaje de Manipulación de Datos: sentencias del SQL que se utilizan para
manejar los datos de la base de datos (select, insert, update, delete, etc).

commit/rollback: cada vez que se realiza alguna operación en la base de datos no se realiza
sobre la tabla en sí, sino en un segmento temporal en la base de datos conocida como
RollBack Segment . Así, si queremos que los resultados de la modificación se trasladen a la
base de datos y perduren en el tiempo hay que confirmar dicha operación con el comando
commit. También se puede impedir que los últimos cambios lleguen a efectuarse con
rollback, aunque existen algunas sentencias SQL que se 'autoconfirman' y no se pueden
volver atrás.

Diccionario de la Base de Datos: Guarda la definición de todos los objetos almacenados en


la base de datos; sus características, restricciones, privilegios, relaciones entre ellos, tablas,
índices, etc.
Edicion En

SQL*Plus almacena en un buffer la última sentencia SQL introducida. El buffer mantiene


sólo una sentencia cada vez, y si se introduce una nueva sentencia se sobrescribe sobre la
anterior.
La sentencia en el buffer puede ser recuperada para ejecutarla de nuevo con los comandos:
RUN que visualiza la sentencia en el buffer antes de ejecutarla;

/ que ejecuta la sentencia sin visualizarla.

SQL*Plus también nos permite editar la sentencia SQL almacenada en el buffer mediante
un sencillo (y limitado) editor en línea, cuyos comandos se enumeran a continuación:
Comando Abreviatura Descripción
APPEND texto A texto Añade texto al final de la línea.
Cambia el contenido 'fuente' por el
CHANGE/fuente/destino C/fuente/destino
'destino'
CHANGE/texto C/texto Quita 'texto' de una línea.
CLEAR BUFFER CL BUFF Borra el buffer
DEL DEL Borra una línea.
INPUT I Inserta una o más líneas.
INPUT texto I texto Inserta una línea con 'texto'.
LIST L Lista las líneas del buffer
LIST n Lnón Lista la línea n-ésima.
LIST * L* Lista la línea actual.
LIST LAST L LAST Lista la última línea.
Lista las líneas desde la m-ésima a la
LIST m n Lmn
n-ésima.
Al contenido del buffer también se puede acceder desde el editor del Sistema Operativo.
Así, el buffer podrá ser manipulado con las posibilidades del editor con el que estemos
acostumbrados a trabajar. Al salir del editor se devuelve el control al SQL*Plus. Para
conseguir trabajar con el editor del Sistema Operativo basta con colocar la variable
DEFINE_EDITOR y luego llamar al editor.

SQL> define_editor=notepad
SQL> edit
Utilización De

SQL*Plus considera dos tipos de ficheros: de spool y de comandos.

Un fichero de spool almacena los resultados de una consulta (o varias) en un fichero con la
extensión por defecto .lst (o lo manda a la impresora).
Los comandos asociados con los ficheros spool son
SPOOL fichero: Manda el resultado de las consultas al fichero.
SPOOL OUT: Envia el resultado de las consultas a la impresora.
SPOOL OFF: Cierra el fichero de spool.
EXIT: Al salir de SQL*Plus se cierran los ficheros de spool.

Los archivos de comandos almacenan comandos SQL y SQL*Plus para ser editado,
almacenado y/o ejecutado; y tienen por defecto la extensión .sql :
Para editarlo se puede utilizar el comando edit fichero.
Para ejecutarlo se utilizará el comando START fichero o @fichero

El SQL*Plus nos proporciona más posibilidades en relación con los ficheros de comandos,
la comunicación con el usuario final y la generación de informes. Pero antes de ver este
tipo de cosas, es mejor que sigamos profundizando en el conocimiento del lenguaje SQL.
Al final del curso se encuentra un capítulo con algunas de las cosillas que quedan por
contar del SQL*Plus.

Comando Describe:
SQL*Plus Oracle nos proporciona un comando que resulta muy útil cuando queremos
conocer la estructura de una tabla, las columnas que la forman y su tipo y restricciones.
Este comando toma una mayor importancia según nos alejemos del momento de creación
de una tabla.
La sintaxis es la siguiente: DESCRIBE table_name

Ejemplo:

SQL> desc dept


Name Null? Type
------------------------------- -------- ----
DEPTNO NOT NULL NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)

Se puede usar solo las cuatro primeras letras de este comando (DESC).
CAPITULO II – SENTENCIAS

Las sentencias SQL pertenecen a dos categorías principales: Lenguaje de Definición de


Datos, DDL y Lenguaje de Manipulación de Datos, DML. Estos dos lenguajes no son
lenguajes en sí mismos, sino que es una forma de clasificar las sentencias de lenguaje SQL
en función de su cometido. La diferencia principal reside en que el DDL define objetos en
la base de datos y sus efectos se pueden ver en el diccionario de datos; mientras que el
DML es el que permite consultar, insertar, modificar y eliminar la información almacenada
en los objetos de la base de datos.

Cuando se ejecutan las sentencias DDL de SQL, el SGBD o RDBMS confirma la


transacción actual antes y después de cada una de las sentencias DDL. En cambio, las
sentencias DML no llevan implícito el commit y se pueden deshacer. Existe pues un
problema al mezclar sentencias DML con DDL, ya que estas últimas pueden confirmar las
primeras de manera involuntaria e implícita, lo que en ocasiones puede ser un problema.

A continuación se presenta una tabla con las sentencias SQL más comunes, clasificadas
según el lenguaje al que pertenecen.

Sentencias DDL Objetivo


Create Crear objetos de Base de Datos.
Alter Cambiar objetos de Base de Datos.
Drop Eliminar objetos de Base de Datos.
Truncate Eliminar todas las filas de una tabla.
Grant Conceder privilegios o papeles, roles, a un usuario o a otro rol.
Revoke Retirar los privilegios de un usuario o rol de la base de datos.
Sentencias DML Objetivo
Insert Añadir filas de datos a una tabla.
Delete Eliminar filas de datos de una tabla.
Update Modificar los datos de una tabla.
Select Recuperar datos de una tabla.
Commit Confirmar como permanentes las modificaciones realizadas.
Deshacer todas las modificaciones realizadas desde la última
Rollback
confirmación.
Savepoint Puntos de savamento de transacciones.
Sentencias

La primera fase de cualquier base de datos comienza siempre con sentencias DDL, ya que
antes de poder almacenar información debemos definir los objetos básicos donde agrupar la
información. Los objetos básicos con que trabaja SQL son las tablas. Una tabla es un
conjunto de celdas agrupadas en filas y columnas donde se almacenan elementos de
información.
Antes de llevar a cabo la creación de una tabla conviene planificar:

nombre de la tabla,

nombre de cada columna,

tipo y tamaño de los datos almacenados en cada columna,


información adicional, restricciones, índices, llaves, etc.

Hay que tener en cuenta también ciertas restricciones en la formación de los nombres de las
tablas: longitud máxima de 30 caracteres, no puede haber nombres de tabla duplicados,
deben comenzar con un carácter alfabético, permitir caracteres alfanuméricos y el guión
bajo '_', y Oracle no distingue entre mayúsculas y minúsculas.
Creación de Tablas:

Create Table: sentencia utilizada para la creación de tablas:

Sintaxis:

CREATE TABLE table_name


( {culumn_name datatype [c_constraints]}, culumn_name datatype
[c_constraints]},…,
[T_constraints]);

Table_name Nombre de la tabla.


Column_name Nombre de la columna.
Data type Tipo de Dato.
C_constraints Restricciones de la Columna.
T_constraints Restricciones de la Tabla.

Existen varios tipos de datos en SQL. De esta manera, cada columna puede albergar una
información de naturaleza distinta. Los tipos de datos más comunes y sus características se
resumen en la siguiente tabla.

CHAR(n). Datos de tipo carácter, de n caracteres de longitud. La cantidad máxima


permitida es de 255.
DATE Rango válido de fecha desde el 1 de enero 4712 AC
Hasta el 31 de diciembre del 4712 DC.
LONG Dato de tipo carácter con tamaño variable hasta 65535 caracteres, solo
se puede definir una columna LONG por tabla. Estas no se pueden
utilizar en subconsultas, funciones, expresiones, cláusulas WHERE o
índices.
RAW(n) Datos binarios con una longitud de n bytes. El tamaño máximo es de
255 bytes.
LONG RAW Datos binarios puros. Por lo demás igual a LONG
NUMBER Numero de 40 dígitos.
NUMBER(n) Numero de n dígitos.
NUMBER(n,d) Numero de n dígitos con d cifras a la derecha del punto decimal.
VARCHAR2(n) Cadena de caracteres de longitud variable hasta n caracteres.
Ejemplos Creación de Tablas:

1) Tabla simple con restricciones a nivel de tabla.

CREATE TABLE materias


(MATERIA NUMBER(2),
NOM_MATERIA VARCHAR2(35),
CREDITOS NUMBER(2),
CONSTRAINT pk_materias PRIMARY KEY (materia)
);

Al definir una columna como PK (Primary Key o llave primaria) automáticamente


adquiere la restricción NOT NULL y crea un ÍNDICE por esa columna. El nombre del
PK (pk_ma teria) definido al crear la tabla es el que usara oracle para almacenarlo en la
base de datos. Las llaves primarias pueden estar compuestas por 1 o mas columnas de
la tabla y solo se permite uno por tabla.

Para ver su estructura:


DESC materias
Name Null? Type
------------------------------- -------- ----
MATERIA NOT NULL NUMBER(2)
NOM_MATERIA VARCHAR2(35)
CREDITOS NUMBER(2)

2) Tabla con restricciones tanto de columnas como de la tabla.


CREATE TABLE estudiantes
(matricula NUMBER(5),
nombre VARCHAR2(35) NOT NULL,
fecha_nacimiento DATE,
sexo VARCHAR2(1) DEFAULT 'M'
CONSTRAINT ck_sexo_estudiantes
check (sexo in ('M','F')),
CONSTRAINT pk_estudiante PRIMARY KEY (matricula) );

Si se desea que una columna tenga algún valor siempre, se define como NOT
NULL. También se puede restringir a valores específicos utilizando CHECK. Todas
estas restricciones son validadas por la Base de Datos.

Para ver su estructura:


DESC estudiantes
Name Null? Type
------------------------------- -------- ----
MATRICULA NOT NULL NUMBER(5)
NOMBRE NOT NULL VARCHAR2(35)
FECHA_NACIMIENTO DATE
SEXO VARCHAR2(1)
3) Relaciones entre Tablas.

CREATE TABLE notas


(MATRICULA NUMBER(5),
MATERIA NUMBER(2),
CALIFICACION NUMBER(3) NOT NULL,
CONSTRAINT pk_notas PRIMARY KEY (matricula, materia),
CONSTRAINT fk1_notas FOREIGN KEY (matricula)
REFERENCES estudiantes(matricula),
CONSTRAINT fk2_notas FOREIGN KEY (materia)
REFERENCES materias (materia) );

Esta es una forma un poco más compleja, ya que esta tabla depende (está
referenciada) a otras tablas. El PK está compuesto por dos columnas (matrícula y
materia). También tiene varias llaves secundarias o foráneas (FOREIGN KEY o
FK), que a su vez son llaves primarias en la tabla referenciada.

Para ver su estructura:


DESC notas
Name Null? Type
------------------------------- -------- ----
MATRICULA NOT NULL NUMBER(5)
MATERIA NOT NULL NUMBER(2)
CALIFICACION NOT NULL NUMBER(3)

Creación de Secuencias:
Las secuencias son objetos de Oracle que maneja una numeración automática.

CREATE SEQUENCE sequence_name


[INCREMENT BY n ]
[START WITH n ]

Los valores se obtienen mediante estas variables y solo en sentencias de SQL:


sequence_name .CURRVAL (valor actual)
sequence_name .NEXTVAL (siguiente valor)

Ejemplo:
SQL> CREATE SEQUENCE empleado_sec;
SQL> Select empleado_sec.nextval from dual;
Modificación De Tablas:

Después de crear una tabla, a veces nos encontramos con que se necesita añadir una
columna adicional o modificar la definición de una columna existente. Esta operación se
puede realizar con el comando ALTER TABLE.
Hay que tener en cuenta varios puntos:

No es posible disminuir el tamaño de una columna al menos que la tabla esta vacía.

En las modificaciones, los tipos anterior y nuevo deben ser compatibles, o la tabla
debe estar vacía.

La opción ADD ... NOT NULL sólo será posible si la tabla está vacía o si se
especifica un valor por defecto.

La opción MODIFY ... NOT NULL sólo podrá realizarse cuando la tabla no contenga
ninguna fila con valor nulo en la columna en cuestión.

ALTER TABLE: Este comando modifica la estructura de una tabla.

Sintaxis:

ALTER TAB LE table_name[ADD | MODIFY | DROP COLUMN] column_name


datatype c_constraint;

Table_name Nombre de la tabla a modificar


Column_name Columna a modificar
C_constraint Restricciones de la columna.

Ejemplos:

1) Adiciona la columna profesor a la tabla materias.

ALTER TABLE materias ADD profesor VARCHAR2(5);

SQL> DESC materias


Name Null? Type
------------------------------- -------- ---- MATERIA
NOT NULL NUMBER(2) NOM_MATERIA
VARCHAR2(35) CREDITOS
NUMBER(2) PROFESOR
VARCHAR2(5)
2) Este ejemplo modifica la columna profesor a la tabla materias.

ALTER TABLE materias MODIFY profesor VARCHAR2(25) NOT NULL;

SQL> DESC materias


Name Null? Type
------------------------------- -------- ---- MATERIA
NOT NULL NUMBER(2) NOM_MATERIA
VARCHAR2(35) CREDITOS
NUMBER(2) PROFESOR
VARCHAR2(25)

3) Adiciona la columna status a la tabla materias.

ALTER TABLE materias ADD status VARCHAR2(1)


CONSTRAINT ck_status_materias
CHECK(status IS NOT NULL AND status IN ('A','D'));

SQL> DESC materias


Name Null? Type
------------------------------- -------- ---- MATERIA
NOT NULL NUMBER(2) NOM_MATERIA
VARCHAR2(35) CREDITOS
NUMBER(2) PROFESOR NOT NULL
VARCHAR2(25) STATUS
VARCHAR2(1)

4) Adiciona y borra columna aula de la tabla materias.

ALTER TABLE materias ADD aula NUMBER;


ALTER TABLE materias DROP COLUMN aula;
Alterando Restricciones:
Otra forma más compleja de modificar los componentes de una tabla es la siguiente.

Sintaxis:

ALTER TAB LE table_name {[ADD | DROP]} CONSTRAINT constraint_name


{[PRIMARY KEY (column_name, column_name,…) ] |
[FOREIGN KEY (column_name, column_name,…)
REFERENCES table_name_refs(r_column_name, r_column_name,…)]|
[CHECK (condition)]}

Table_name Nombre de la tabla a modificar


Column_name Nombre columna a de la tabla.
Constraint_name Nombre de la Restricciones.
Table_name_refs Nombre de la tabla referenciada.
R_column_name Nombre columna a de la tabla Referenciada
Condition Condición que valida la restricción

Ejemplo:

1. Elimina la restricción ck_status_materia en la tabla MATERIAS; el pk_notas y


fk1_notas de la tabla de NOTAS.

ALTER TABLE materias DROP CONSTRAINT ck_status_materias;


ALTER TABLE notas DROP CONSTRAINT pk_notas;
ALTER TABLE notas DROP CONSTRAINT fk1_notas;

2. Adiciona la restricción ck_status_materias en la tabla MATERIAS.

ALTER TABLE materias ADD CONSTRAINT ck_status_materias


CHECK(status IS NOT NULL AND status IN ('A','D'));

3. Adiciona el Primary Key de la tabla de NOTAS.

ALTER TABLE notas ADD CONSTRAINT pk_notas


PRIMARY KEY (matricula, materia);

4. Adiciona el Foreign Key fk1_notas de la tabla de NOTAS.

ALTER TABLE notas ADD CONSTRAINT fk1_notas


FOREIGN KEY (matricula) REFERENCES estudiantes(matricula);
EJERCICIO I

1) Crear una tabla llamada DEPTOS con las siguientes características:

Id_departamento numérico de 5 dígitos, PK


Nom_departamento carácter de 5 posiciones.

2) Crear una tabla llamada EMPLEADOS con las siguientes características:

Id_empleado numérico de 5 dígitos, PK


Nom_empleado carácter de 35 posiciones, obligatorio.
Cargo carácter de 25 posiciones.
Id_departamento numérico de 5 dígitos, FK referenciado a la tabla DEPTOS.
Fecha_nacimiento tipo fecha, obligatorio
Sexo carácter de 1 posición, restringido a solo dos valores (F,M), obligatorio.
Sueldo numérico de 12 dígitos y 2 decimales, obligatorio.
Status_empleado carácter de 1 posición, restringido a (A,D), obligatorio y valor A
por defecto..

3) Crear tabla maestro de transacciones llamada TRANSACCIONES :

Id_transaccion numérico de 5 dígitos, PK Nom_transaccion


character de 35 posiciones, obligatorio. Origen carácter de 1
posición restringido a (D,C), obligatorio.

4) Crear una tabla de transacciones por empleados llamada TRANS_X_EMPLEADOS :

Sec_Transaccion numérico de 10 dígitos, PK


Id_empleado numérico de 5 dígitos, PK, FK referenciada a EMPLEADOS.
Id_transaccion numérico de 5, PK, FK referenciada a TRANSACCIONES.
Fecha_tra nsaccion tipo fecha, obligatorio.
Monto_transaccion numérico de 12 dígitos y 2 decimales, obligatorio.

5) Modificar la columna Nom_departamento de la tabla DEPTOS aumentando el


tamaño a 35 caracteres; obligatorio.

6) Agregar la columna Comentarios de tipo variable (LONG) a la tabla EMPLEADOS


CAPITULO III – SENTENCIAS DML

Creación De Sinónimos:

Los objetos de Base de Datos pertenecen a usuarios y cuando son de otros usuarios para
verlos se necesitan permisos y referirlos con el nombre del usuario (due ño), un punto y
luego el nombre del objeto (USUARIO.NOMBRE_OBJETO). Para evitar esto nos asistimos
de los sinónimos, los cuales pueden ser publicos o privados.

Sintaxis:
CREATE [PUBLIC] SYNONYM synonym_name FOR user.table_name;

Synonym_name Nombre del sinónimo.


User Nombre del usuario dueño de la tabla.
Table_name Nombre de la Tabla a la que se le hace el sinónimo.
Los sinonimos publicos estan disponible para todos los usuarios, los privados solo
para el usuario que los creo. Se puede tener ambos, en este caso oracle utiliza
primero el privado.

Ejemplos:
1) Veamos a crear un sinónimo privado de la tabla ciudades del usuario scott.

SQL> DESC scott.cities


Name Null? Type
------------------------------- -------- ----
STATE VARCHAR2(2)
CITY VARCHAR2(25)
POPULATION NUMBER(8)
WHITE NUMBER(6,2)
BLACK NUMBER(6,2)
HISPANIC NUMBER(6,2)
ASIAN NUMBER(6,2)
OTHER NUMBER(6,2)

CREATE SYNONYM cities FOR scott.cities;

SQL> DESC cities


Name Null? Type
------------------------------- -------- ----
STATE VARCHAR2(2)
CITY VARCHAR2(25)
POPULATION NUMBER(8)
WHITE NUMBER(6,2)
BLACK NUMBER(6,2)
HISPANIC NUMBER(6,2)
ASIAN NUMBER(6,2)
OTHER NUMBER(6,2)

2) Este comando crea un sinónimo público de la tabla item del usuario scott.

CREATE PUBLIC SYNONYM item FOR scott.item;


Creación De Índice a Tablas

El acceso a los datos de las tablas en oracle es bastante rápido, pero cuando la tabla es
grande es necesario utilizar índice para optimizar estos accesos. Los índices nos permiten el
acceso rápido de la data de una tabla, siempre y cuando estos sean usados correctamente.
Se debe estar consciente de los índices que se crean, ya que estos ocupan muchos espacios
de almacenamiento en disco y si no se definen adecuadamente en vez de ayudar nos
perjudican.

Oracle crea un índice implícito por cada Primary Key, si se tiene un modelo de data
normalizado a lo mejor se tenga que crear muy pocos índices en adición a los creados por
los PK.

CREATE [UNIQUE] INDEX index_name


ON table_name (column_name [ASC|DESC], column_name [ASC|DESC],….);

Index_name Nombre del índice a crear.


Unique Unico, los valores del índice no se repiten.
table_name Nombre de la Tabla a la que se le hace el índice.
column_name Nombre de columna por la que se ordenará el índice.
Asc|Desc Para ordenar el índice de manera ascendente o
Descendente por columna. El default es Asc.

Ejemplos:

1) Crea el índice nom_estudiantes a la tabla de estudiantes por la columna nombre en


forma ascendente.

CREATE INDEX nom_estudiante ON estudiantes (nombre asc);

2) Crea el índice calif_notas a la tabla de notas por las columnas materia descendente y
matricula ascendente.

CREATE INDEX calf_notas ON notas (materia desc,matric ula asc)


Eliminación de Objetos:

La sentencia DROP elimina de manera definitiva un objeto de la Base de Datos.

Drop Table:

Una tabla se puede borrar si no tiene ninguna tabla que dependa de ella. En el caso que
existan dependencias (hijos) se deben borrar primero los hijos y luego la tabla (padre), al
menos que se utilice la cláusula CASCADE CONSTRAINT que borra todas las relaciones
de la tabla; el uso de esta cláusula no es recomendada al menos que se esté seguro de lo que
se hace.

Sintaxis:

DROP TABLE tabla [CASCADE CONSTRAINT];

Tabla Nombre de la tabla a borrar.

CASCADE CONSTRAINT Borra la tabla y sus relaciones con otras tablas.

Ejemplos:

1) Borra la tabla de materias.

DROP TABLE materias;

No se pudo borrar porque la tabla de notas depende de ella.

2) Borra la tabla de materias con todas sus relaciones.

DROP TABLE materias CASCADE CONSTRAINT;


Drop Index:

Este comando se utiliza para borrar los índices de las tablas. Estos no se modifican, se
eliminan y se vuelven a crear. Al borrar una tabla automáticamente borra los índices de
ésta.

Sintaxis:

DROP INDEX índice;

Índice Nombre del Índice a borrar.

Ejemplos:

1) Borra el índice nom_estudiante de la tabla estudiantes.

DROP INDEX nom_estudiante;

Drop Synony ms:

Para Eliminar sinónimos. Los sinónimos son objetos independientes, no dependen de las
tablas.

DROP [PUBLIC] SYNONYM sinónimo;

Sinónimo Nombre de sinónimo a borrar.

Nota: si el sinónimo es public se debe emplear la cláusula PUBLIC.

Ejemplos:

1) Borra el sinónimo privado cities creado a la tabla cities del usuario scott.

DROP SYNONYM cities;

Si el sinónimo es público seria:

DROP PUBLIC SYNONYM cities;


Truncando Tablas:

Truncate Table

Esta es una manera rápida de borrar una tabla. Este comando es muy peligroso, se debe
tener mucho cuidado con su uso, ya que a diferencia del DELETE, UPDATE, INSERT que
necesitan del COMMIT para grabar definitivamente la información; este graba
automáticamente.

Sintaxis:
TRUNCATE TABLE Table_name;

Ejemplo:

Para borrar todos los registros de la tabla deptos :

TRUNCATE TABLE deptos;


EJERCICIO II

1) Crear un índice llamado nom_empleados_ind a la tabla de EMPLEADOS por el


nombre del empleado.

2) Crear un índice fk2_trans_emplados a la tabla de TRANS_X_EMPLEADOS por el


código del empleado.

3) Crear un índice sec_transaccion_ind de la tabla TRANS_X_EMPLEADOS sobre las


columnas secuencia de transacción de forma descendente y fecha de transacción
ascendente.

4) Borrar el índice calif_notas de la tabla NOTAS.

5) Borrar las tablas NOTAS Y ESTUDIANTES.

6) Borrar el índice sec_transaccion_ind de la tabla TRANS_X_EMPLEADOS.


CAPITULO IV - DML (Data Manipulation Language)

Una vez que tenemos definida la estructura de una tabla se pueden insertan los datos,
modificarlos o borrarlos de la tabla.
Esta tarea entra dentro de las operaciones que se realizan con el lenguaje DML. Este
lenguaje permite manipular los objetos de la base de datos, insertando, modificando y/o
borrando el contenido de las tablas. Hay que recordar que estas sentencias no son 'auto
confirmadas' y requieren de la sentencia COMMIT para que sus efectos perduren en el
tiempo, o de la sentencia ROLLBACK para deshacer los cambios efectuados.
A continuación vamos a estudiar tres de las sentencias DML más comunes.

INSERT (Inserción):
El comando que permite insertar filas en las tablas es el siguiente.

INSERT INTO tabla [({columna,}*)] VALUES ({expresión,}+);

Sólo especificaremos las columnas donde insertar y su orden cuando no insertemos datos
en todas ellas o no lo hagamos en el mismo orden en que definimos la tabla. La asociación
columna-valor es posicional. Los valores deben cumplir con los tipos de datos definidos.
Los valores de tipo caracter y fecha deben ir encerrados entre comillas simples, ('').
A continuación se puede ver la inserción de filas en las tablas de ejemplo.

SQL> insert into dept values (60,'Informatica','Neyba');

SQL> insert into emp values (101,'Rivas','VP',null,'3-FEB-96',2000,null,60);

UPDATE (Actualización):
Otra de las operaciones más comunes es la modificación de la información almacenada en
las tablas. Para ello se utiliza el comando UPDATE cuya sintaxis se muestra a
continuación.

UPDATE tabla SET {columna = expresión,}+ [WHERE condición];

Se especificará en la cláusula SET las columnas que se actualizarán y con qué valores. La
cláusula WHERE indica las filas con las que se va a trabajar. Si se omite la actualización
afectará a todas las filas de la tabla.

SQL> Update emp set ename = 'R. Rivas', sal = 40000 where ename = 'Rivas';
DELETE (Borrado):
Con insertar y modificar, la otra operación que completa el trío es la de borrado de filas. La
sintaxis es la que sigue:

DELETE tabla [WHERE condición];

Borrará todas las filas que cumplan la condición especificada en la cláusula WHERE. Si
esta cláusula no se fija, se borrarán todas las filas de la tabla. Aquí cabe decir que aunque
con DELETE borremos todas las filas de una tabla, no borramos la definición de la tabla
del diccionario y podemos insertar datos posteriormente en la tabla. Esta es una diferencia
con la sentencia DROP TABLE, que produce la eliminación tanto del contenido de la tabla
como de la definición de la misma.

SQL> delete emp where ename = 'Rivas';

SELECT (Selección):
La recuperación de los datos en el lenguaje SQL se realiza mediante la sentencia SELECT,
seleccionar. Esta sentencia permite indicar al SGBD la información que se quiere
recuperar. Esta es la sentencia SQL, con diferencia, más habitual. La sentencia SELECT
consta de cua tro partes básicas:
La cláusula SELECT seguida de la descripción de lo que se desea ver, los nombres
de las columnas a seleccionar. Esta parte es obligatoria.

La cláusula FROM seguida de la especificación de las tablas de las que se han de


obtener los datos. Esta parte es obligatoria.

La cláusula WHERE seguida por un criterio de selección, una condición. Esta parte
es opcional.

La cláusula ORDER BY seguida por el criterio de ordenación. Esta parte es


opcional.

Es importante señalar que para seleccionar datos desde una tabla o vista el usuario debe
tener permisos sobre esta.
La sintaxis de la sentencia SELECT es la siguiente:

SELECT [distinct | all] {* | column_mame [c_alias], column_mame [c_alias]…}


FROM {tabla [t_alias], tabla [t_alias]…}
WHERE condition
HAVING condition
GROUP BY { column_mame, column_mame …}
ORDER BY { column_mame [asc|desc], column_mame [asc|desc]…}

Distinct Retorna solo una ocurrencias de los valores de una columna

All Retorna todas las ocurrencias de los registros seleccionados.


El valor por defecto de un select es el all.

* Selecciona todas las columnas de una tabla o vista.

column_mame Nombre de la columna de la tabla o vista.

C_alias Sobrenombre de columna.

Table_name Nombre de la tabla o vista.

T_alias Sobrenombre de la tabla o vista utilizada

Condition Condición que se debe cumplir para retornar resultados.

Asc Ordena de forma ascendente los registros seleccionados.

Desc Ordena de forma descendente los registros seleccionados.


Selección de Columnas:
Las columnas a seleccionar se enumeran sin más en la cláusula SELECT. Si se desea
seleccionar todas las columnas de una tabla se puede hacer enumerando a todas las
columnas o colocando un asterisco, *, en su lugar.

Cuando se consulta una base de datos, los nombres de las columnas se usan como
cabeceras de presentación. Si éste resulta demasiado largo, corto o críptico, puede
cambiarse con la misma sentencia SQL de consulta, creando un alias de columna.

SQL> select dname "Departamento", loc "Está en" from dept;


Departamento Esta en
-------------- -------------
ACCOUNTING NEW YORK
RESEARCH DALLAS
SALES CHICAGO
OPERATIONS BOSTON

Cláusula FROM
La cláusula FROM define las tablas de las que se van a seleccionar las columnas.

Se puede añadir al nombre de las tablas el usuario propietario de las mismas de la forma
usuario.tabla. De esta manera podemos distinguir entre las tablas de un usuario y otro.
Oracle siempre considera como prefijo el nombre del propietario de las tablas, aunque no
se lo indiquemos. De esta forma dos o más usuarios pueden tener tablas que se llamen igual
sin que surjan conflictos. Si quisiéramos acceder a las filas de la tabla dept del usuario
scott, (además de tener pr ivilegios de lectura sobre esa tabla) deberíamos escribir la
siguiente sentencia SQL:

SQL> select * from scott.dept;

También se puede asociar un alias a las tablas para abreviar los nombres de las tablas. Un
ejemplo se puede ver en la sentencia SQL siguiente:

SQL> select d.dname from dept d;

Cláusula WHERE
Hasta ahora hemos visto como puede utilizarse la sentencia SELECT para recuperar todas
las columnas o un subconjunto de ellas de una tabla. Pero este efecto afecta a todas las filas
de la tabla, a menos que especifiquemos algo más en la cláusula WHERE. Es aquí donde
debemos proponer la condición que han de cumplir todas las filas para salir en el resultado
de la consulta. La complejidad del criterio de búsqueda es prácticamente ilimitada, y en él
se pueden conjugar operadores de diversos tipos con funciones de columnas, componiendo
expresiones más o menos complejas.
Operadores de Comparación
Operador Operación Ejemplo
= Igualdad select * from emp where deptno = 10;
!=, <>, ^= Desigualdad select * from emp where deptno != 10;
< Menor que select * from emp where deptno < 10;
> Mayor que select * from emp where deptno > 10;
<= Menor o igual que select * from emp where deptno <= 10;
>= Mayor o igual que select * from emp where deptno >= 10;
Igual a cualquiera de los
in miembros entre select * from emp where deptno in (10, 30);
paréntesis
Distinto a cualquiera de
Not in los miembros entre select * from emp where deptno not in (10,30);
paréntesis
select * from emp where empno between 1 and
between Contenido en el rango
1000;
select * from emp where empno not between 1
Not between Fuera del rango
and 1000;
Contiene la cadena 'abc' a
partir del segundo
like '_abc%' select * from emp where job like 'MA%';
carácter y luego cualquier
cadena de caracteres
Operadores de Aritméticos
Operador Operación Ejemplo
+ Suma select ename, sal+comm from emp where job='SALESMAN';
- Resta select ename from emp where sysdate-hiredate > 365;
* Producto select ename, sal *12 from emp;
/ División select ename, sal /31 from emp;

Operadores de Cadenas de Caracteres


Operador Operación Ejemplo
|| Concatenación select ename||’ – ‘||job from emp;
Cláusula ORDER BY
Se utiliza para especificar el criterio de ordenación de la respuesta a la consulta. Por
defecto la ordenación es ascendente, aunque se puede especificar un orden descendente. La
ordenación se puede establecer sobre el contenido de columnas o sobre expresiones con
columnas. A continuación se puede ver un ejemplo de uso de la cláusula ORDER BY en la
que quiere obtener un listado de los empleados ordenado de manera descendente por su
salario y en caso de igualdad de salario, ordenado ascendentemente por su nombre.

SQL> select ename, sal from emp order by sal desc, ename
ENAME SAL
---------- ---------
KING 5000
FORD 3000
SCOTT 3000
JONES 2975
BLAKE 2850
CLARK 2450
TURNER 1500
MILLER 1300
ADAMS 1100
JAMES 950

10 rows selected.

Cláusula DISTINCT
Cuando se realiza una consulta sobre una tabla en la que se extrae información de varias
columnas, puede ocurrir que, si no incluimos la/s columna/s que forman la clave principal,
obtengamos filas repetidas en la respuesta.

Si este comportamiento no nos resulta satisfactorio podemos utilizar la cláusula DISTINCT


para eliminar las filas duplicadas obtenidas como respuesta a una consulta.

Podemos ver como funciona en el siguiente ejemplo, en el que preguntamos por los
distintos oficios de nuestros empleados.

SQL> select distinct job from emp;

JOB
---------
ANALYST
CLERK
MANAGER
PRESIDENT
SALESMAN
Funciones de SQL:

Existen en SQL muchas funciones que pueden complementar el manejo de los datos en las
consultas. Se utilizan dentro de las expresiones y actúan con los valores de las columnas,
variables o constantes.
Se pueden incluir en las cláusulas SELECT, WHERE y ORDER BY.

Pueden anidarse funciones dentro de funciones. Y existe una gran variedad de funciones
para cada tipo de datos:
Aritméticas,
de Cadenas de Caracteres,
de Manejo de Fechas,
de Conversión,
de Grupo.
Otras,

Funciones Aritméticas
Función Cometido Ejemplo Resultado
ABS(n) Calcula el valor absoluto de n. select abs(-15) from dual; 15
Calcula el valor entero
CEIL(n) inmediatamente superior o igual a select ceil(15.7) from dual; 16
n.
Calcula el valor entero
Floor(n) inmediatamente inferior o igual a select floor(15.7) from dual; 15
n.
Calcula el resto resultante de
MOD(m,n) select mod(11,4) from dual; 3
dividir m entre n.
POWER(m,n) Calcula la potencia n-esima de m. select power(3,2) from dual; 9
Calcula el redondeo de m a n
decimales. Si n<0 el redondeo se select round(123.456,1) from
ROUND(m,n) 123.5
efectúa a por la izquierda del dual;
punto decimal.
SQRT(n) Calcula la raíz cuadrada de n. select sqrt(4) from dual; 2
Calcula m truncado a n decimales select trunc(123.456,1) from
TRUNC(m,n) 123.4
(n puede ser negativo). dual;
Calcula el signo de n, devolviendo
SIGN(n) select sign(-12) from dual; -1
-1 si n<0, 0 si n=0 y 1 si n>0.
Funciones de Cadenas de Caracteres
Función Cometido Ejemplo Resultado
Devuelve el carácter cuyo
CHR(n) select chr(65) from dual; A
valor codificado es n.
Devuelve el valor ascii de
ASCII(cad) select ascii('A') from dual; 65
cad.
Devuelve cad1
concatenada con cad2. Esta select concat(concat(nombre,' es Cano es
CONCAT(cad1,cad2)
función es equivalente al '),oficio) from emp; Presidente, etc.
operador ||.
Devuelve la cadena cad
select lower('MinUsCulAs') from
LOWER(cad) con todas sus letras minúsculas
dual;
convertidas a minúsculas.
Devuelve la cadena cad
select upper('maYuSCulAs') from
UPPER(cad) con todas sus letras MAYUSCULAS
dual;
convertidas a mayúsculas.
Devuelve cad con el
INITCAP(cad) primer caracter en select initcap('isabel') from dual; Isabel
mayúsculas.
Devuelve cad1 con
LPAD(cad1,n,cad2) longitud n, y ajustada a la
select lpad('P',5,'*') from dual; ****P
RPAD(cad1,n,cad2) derecha, rellenando por la
izquierda con cad2.
TRIM(cad) Devuelve cad1 sin los
LTRIM (cad) espacios (izquierda o select ltrim (' Espacio ‘) from dual; Espacio
RTRIM(cad) derecha)
Devuelve cad en la que
cada ocurrencia de la
select replace('digo','i','ie') from
REPLACE(cad,ant,nue) cadena ant ha sido diego
dual;
sustituida por la cadena
nue.
Devuelve la subcadena de
cad compuesta por n select substr('ABCDEFG',3,2) from
SUBSTR(cad,m,n) CD
caracteres a partir de la dual;
posicion m.
Devuelve la posición
select
INSTR(cad1, cad2, n1, donde se encuentra la cad2
dentro de la cad1 a partir INSTR('AAABBBDDDBBBAAA', 10
n2)
de la posición n1 y la 'BBB', 3, 2) FROM DUAL;
ocurrencia n2.
Devuelve la longitud de
LENGTH(cad) select length('cadena') from dual; 6
cad.
Funciones de Manejo de Fechas
Función Cometido Ejemplo Resultado
Devuelve la fecha y hora
SYSDATE select sysdate from dual; 14-MAR-97
actuales.
Devuelve la fecha d select add_months(sysdate,4)
ADD_MONTHS(d,n) 14-JUL-97
incrementada en n meses. from dual;
Devuelve la fecha del select last_day(sysdate) from
LAST_DAY(d) 31-MAR-97
último día del mes de d. dual;
Devuelve la diferencia en select
MONTHS_BETWEEN(d1,
meses entre las fechas d1 y months_between(sysdate,'01- 2.43409424
d2)
d2. JAN-97') from dual;
Devuelve la fecha del
select next_day(sysdate,
NEXT_DAY(d,cad) primer día de la semana 16-MAR-97
'sunday') from dual;
cad después de la fecha d.
Funciones de Conversión de Tipos
Función Cometido Ejemplo Resultado
Convierte la cadena cad a un
select to_number('12345')
TO_NUMBER(cad,fmto) número, opcionalmente de 124345
from dual;
acuerdo con el formato fmto.
Convierte la fecha d a una
cadena de caracteres, select to_char(sysdate) from
TO_CHAR(d, fmto) '14-MAR-97'
opcionalmente de acuerdo con dual;
el formato fmto.
Convierte la cadena cad de
tipo varchar2 a fecha, select to_date('1-JAN-97')
TO_DATE(cad,fmto) 01-JAN-97
opcionalmente de acuerdo con from dual;
el formato fmto.

Con las fechas pueden utilizarse varios formatos. Estos formatos permiten modificar la
presentación de una fecha. En la siguiente tabla se presentan algunos formatos de fecha y
el resultado que generan.

Formato Cometido Ejemplo Resultado


select to_char(sysdate,'cc') from
cc ó scc Valor del siglo. 20
dual;
y,yyy ó select to_char(sysdate,'y,yyy') from
Año con coma, con o sin signo. 1,997
sy,yyy dual;
yyyy ó yyy ó Año sin signo con cuatro, tres, dos select to_char(sysdate,'yyyy') from
1997
yy ó y o un dígitos. dual;
select to_char(sysdate,'q') from
q Trimestre. 1
dual;
Número de la semana del año o del select to_char(sysdate,'ww') from
ww ó w 11
mes. dual;
select to_char(sysdate,'mm') from
mm Número del mes. 03
dual;
Número del día del año, del mes o select to_char(sysdate,'ddd') from
ddd ó dd ó d 073
de la semana. dual;
hh ó hh12 ó select to_char(sysdate,'hh') from
La hora en formato 12h. o 24h. 12
hh24 dual;
select to_char(sysdate,'mi') from
mi Los minutos de la hora. 15
dual;
Los segundos dentro del minuto, o select to_char(sysdate,'sssss') from
ss ó sssss 44159
desde las 0 horas. dual;

Máscaras de Formato de Caracteres


Formato Cometido Ejemplo Resultado
select to_char(sysdate,'syear)
Syear ó year Año en Inglés nineteen ninety-seven
from dual;
Nombre del mes o su select to_char(sysdate,'month')
month o mon march
abreviatura de tres letras. from dual;
Nombre del día de la semana select to_char(sysdate,'day')
day ó dy friday
o su abreviatura de tres letras. from dual;
select to_char(sysdate,'a.m.')
a.m. ó p.m. El espacio del día. p.m.
from dual;
Indicador del año respecto al select to_char(sysdate,'b.c.')
b.c. ó a.d. a.d.
del nacimiento de Cristo. from dual;

Otras Funciones
Función Cometido Ejemplo Resultado
Convierte el
DECODE(var, valor de var, select JOB,decode(JOB,
val1, cod1, val2, de acuerdo con 'PRESIDENT','P','MANAGER','M','X') P, D, X, ...
cod2, ..., defecto) la from emp;
codificación.
Devuelve el SELECT
GREATEST(exp1,
mayor valor de GREATEST(1,2,4,33,4,45,6,56) 56
exp2, ...)
una lista. FROM DUAL;
Devuelve el
SELECT LEAST(1,2,4,33,4,45,6,56)
LEAST(cad,fmto) menor valor de 1
FROM DUAL;
una lista.
Devuelve la
expresión exp
NVL(val, exp) si val es select sal+nvl(comm,0) from emp; 450000, 350000, ...
NULL, y val si
en otro caso.
Cláusula GROUP BY
SQL nos permite agrupar las filas resultado de una consulta en conjuntos y aplicar
funciones sobre esos conjuntos de filas.
La sintaxis es la siguiente:

SELECT {* | {columna,}+}
FROM {tabla,}+
WHERE condición
GROUP BY {columna ,}+
HAVING condición
ORDER BY {expresiónColumna [ASC | DESC],}+;

En la cláusula GROUP BY se colocan las columnas por las que vamos a agrupar. Y en la
cláusula HAVING se especifica la condición que han de cumplir los grupos para pasar al
resultado.

La evaluación de las diferentes cláusulas en tiempo de ejecución se efectúa en el siguiente


orden:
WHERE filtra las filas

GROUP BY crea una tabla de grupo nueva

HAVING filtra los grupos


ORDER BY clasifica la salida

Un ejemplo de utilización de la selección de grupos puede ser seleccionar los empleados


agrupados por su oficio. Un primer intento de consulta es el siguiente:

SQL> select ename, job from emp group by job;

select ename, job from emp group by job


*
ERROR at line 1:
ORA-00979: not a GROUP BY expression

Se presenta un error debido a que cuando se utiliza GROUP BY, las columnas implicadas
en el SELECT y que no aparezcan en la cláusula GROUP BY deben tener una función de
agrupamiento. En otras palabras, la columna nombre debe tener una función de
agrupamiento que actue sobre ella (max, min, sum, count, avg). Si no puede ser así, deberá
llevar dicha columna a la cláusula GROUP BY.
De nuevo, el ejemplo quedará así:

SQL> select count(ename), job from emp group by job;

COUNT(ENAME) JOB
------------ ---------
2 ANALYST
3 CLERK
3 MANAGER
1 PRESIDENT
1 SALESMAN

Para condicionar basados en grupo utilizando HAVING:

SQL> select count(ename), job from emp group by job


2 having count(ename) >= 2 order by 1 desc;

COUNT(ENAME) JOB
------------ ---------
3 CLERK
3 MANAGER
2 ANALYST

Las funciones de agrupamiento que se pueden utilizar son las siguientes.

Funciones de Agrupamiento
Función Cometido Ejemplo
Cuenta el número de filas select count(ename),job
COUNT(col)
agrupadas. from emp group by job;
Calcula el valor medio de todos los select avg(sal),job from
AVG(col)
valores de la columna col. emp group by job;
Calcula el valor máximo de todos select max(sal),job from
MAX(col)
los valores de la columna col. emp group by job;
Calcula el valor mínimo de todos select min(sal),job from
MIN(col)
los valores de la columna col. emp group by job;
Calcula la suma de los valores de la select sum(sal),job from
SUM(col)
columna col. emp group by job;
Calcula la desviación típica de los
select stddev(sal),job from
STDDEV(col) valores de la columna col sin tener
emp group by job;
en cuenta los valores nulos.
Calcula la varianza de los valores
select variance(sal),job
VARIANCE(col) de la columna col sin tener en
from emp group by job;
cuenta los valores nulos.
Hay que tener en cuenta que los valores nulos no participan en el cálculo de las funciones
de conjuntos. Estas funciones se pueden utilizar con las cláusulas DISTINCT y ALL.
También se pueden utilizar aunque no realicemos agrupación alguna en la consulta,
considerando a toda la tabla como un grupo.

SQL> select count(*) from emp;

COUNT(*)
----------
10

Expresiones con Sentencias Select

El resultado de cada consulta es un conjunto de filas. Y con conjuntos se pueden realizar


tres operaciones típicas: la unión, la intersección y la diferencia.
Unión, UNION
Combina todas las filas del primer conjunto con todas las filas del segundo.
Cualquier fila duplicada se reducirá a una sola.
Intersección, INTERSECT
Examinará las filas de los conjuntos de entrada y devolverá aquellas que aparezcan
en ambos. Todas las filas duplicadas serán eliminadas antes de la generación del
conjunto resultante.
Diferencia, MINUS
Devuelve aquellas filas que están en el primer conjunto pero no en el segundo. Las
filas duplicadas del primer conjunto se reducirán a una fila única antes de empezar
la comparación con el segundo conjunto.

Reglas para el Manejo de los Operadores de Conjuntos:

Pueden ser encadenados en cualquier combinación, siendo evaluados de izquierda a


derecha.

No existe jerarquía de precedencia en el uso de estos operadores, pero puede ser


forzada mediante paréntesis.

Pueden ser empleados con conjuntos de diferentes tablas siempre que se apliquen
las siguientes reglas:
o Las columnas son relacionadas en orden, de izquierda a derecha.
o Los nombres de las columnas son irrelevantes.

Los tipos de datos deben coincidir.


Como ejemplo podemos consultar sobre todos los nombres de empleado que trabajan para
los departamentos 10 o 30. Esto se consigue restando a todos los nombres de empleados,
aquellos que están en el departamento 20.

SQL> select ename from emp


2 minus
3 select ename from emp where deptno =20;

ENAME
----------
BLAKE
CLARK
JAMES
KING
MILLER
TURNER

6 rows selected.

Combinaciones
Hasta ahora hemos construido consultas con una única tabla, pero esto no debe ser siempre
así.

De hecho, sólo se alcanza la verdadera potencia del SQL cuando combinamos el contenido
de más de una tabla.
Supongamos que queremos conseguir una lista con los empleados y los departamentos para
los que trabajan. Esta información está repartida en las dos tablas que tenemos, emp y dept.
Así, podríamos intentar una consulta que seleccionara el campo nombre de la tabla emp y
el nombre del departamento. Y aquí surge el primer problema, ¿cómo distinguimos entre
dos columnas que llamándose igual, pertenecen a tablas distintas? Para eso se utiliza como
prefijo o el nombre de la tabla (dept.nombre) o un alias de tabla, un nombre que se asocia a
cada tabla y se coloca como prefijo a la columna (d.nombre).
Realicemos la consulta ...

SQL> select e.ename, d.dname from emp e, dept d;

ENAME DNAME
---------- --------------
KING ACCOUNTING
JONES ACCOUNTING
BLAKE ACCOUNTING
CLARK ACCOUNTING
SCOTT ACCOUNTING
TURNER ACCOUNTING
ADAMS ACCOUNTING
JAMES ACCOUNTING
FORD ACCOUNTING
……

El resultado puede sorprender un poco. Lo que obtenemos es el producto cartesiano de


todos los empleados por todos los departamentos. SQL ha cogido cada fila de la tabla emp
y le ha asociado todos los dept de la tabla Dept..

Para conseguir lo que queremos tenemos que forzar que se asocie a un empleado con el
nombre del departamento para el que trabaja. Y esto se puede hacer si añadimos la
condición de que el deptno tenga el mismo valor en la fila de la tabla emp que en la fila
escogida de la tabla dept:
SQL> select e.ename, d.dname from emp e, dept d
2 where e.deptno = d.deptno;

ENAME DNAME
---------- --------------
KING ACCOUNTING
JONES RESEARCH
BLAKE SALES
CLARK ACCOUNTING
SCOTT RESEARCH
TURNER SALES
ADAMS RESEARCH
JAMES SALES
FORD RESEARCH
MILLER ACCOUNTING

10 rows selected.

De la misma manera se pueden combinar más de dos tablas. Lo importante es emparejar los
campos que han de tener valores iguales.

Reglas de Combinación:
Pueden combinarse tantas tablas como se desee.
El criterio de combinación puede estar formado por más de una pareja de columnas.

En la cláusula SELECT pueden citarse columnas de ambas tablas, condicionen o no


la combinación.

Si hay columnas con el mismo nombre en las distintas tablas, deben identificarse
especificando la tabla de procedencia o utilizando un alias de tabla.
Existe un tipo especial de combinación llamada Combinación Externa. Suponga que se
crea un nuevo departamento, (insert into dept values (80,'Distribucion','Barahona');) pero
todavía no hemos asignado personal al mismo. Si realizamos la consulta anterior, el nuevo
departamento no aparecerá en la respuesta. Pero esto se puede evitar si señalamos en la
cláusula WHERE la posibilidad de que en la tabla de empleados no existan algunos de los
códigos de departamento que si exista en la tabla de departamentos. Esto se hace colocando
un (+) de la siguiente manera:

SQL> select e.ename, d.dname


2 from emp e, dept d
3 where e.deptno(+)=d.deptno;

ENAME DNAME
---------- --------------
KING ACCOUNTING
CLARK ACCOUNTING
MILLER ACCOUNTING
JONES RESEARCH
SCOTT RESEARCH
ADAMS RESEARCH
FORD RESEARCH
BLAKE SALES
JAMES SALES
TURNER SALES
OPERATIONS

11 rows selected.
SubConsultas:
A veces se han de utilizar en una consulta los resultados de otra consulta, llamada
subconsulta.

Un ejemplo de esto ocurre cuando queremos conocer los nombres de los empleados cuyo
salario está por encima de la media:

SQL> select ename,sal from emp


2 where sal > (select avg(sal) from emp);

ENAME
----------
KING
JONES
BLAKE
CLARK
SCOTT
FORD

La consulta más interna calcula el salario medio, y la consulta más externa lo utiliza para
seleccionar los nombres que ganan más que la media.
El valor de comparación puede ser un valor simple, como en el ejemplo anterior, o un
conjunto de valores. Hay que tener en cuenta este detalle ya que el tipo de operador a
utilizar varía. En el primer caso se puede utilizar un operador de comparación de carácter
aritmético (<, >, etc.). Y en el segundo uno de tipo lógico (IN).

Las subconsultas pueden devolver más de una columna, y se habrán de comparar de


manera consecuente:
Las columnas de la cláusula WHERE de la consulta principal deben estar agrupadas
por paréntesis.

Las columnas encerradas entre paréntesis deben coincidir en número y tipo de datos
con los datos que devuelve la subconsulta.
El nivel de anidamiento de subconsultas es ilimitado.

Se puede utilizar una subconsulta para insertar valores en una tabla en el momento de la
creación de la misma con la cláusula AS. Si quisiéramos crear una tabla con los datos de
los empleados del departamento 10 lo podríamos hacer de la siguiente manera:

SQL> create table dep10 (ename, job, deptno)


2 as select ename, job, deptno from emp
3 where deptno = 10;

Table created.
Se puede utilizar su consulta a nivel de las columnas del SELECT:

SQL> select ename, job,


2 (select dname from dept where deptno = e.deptno) depto
3 from emp e;

ENAME JOB DEPTO


---------- --------- --------------
KING PRESIDENT ACCOUNTING
JONES MANAGER RESEARCH
BLAKE MANAGER SALES
CLARK MANAGER ACCOUNTING
SCOTT ANALYST RESEARCH
TURNER SALESMAN SALES
ADAMS CLERK RESEARCH
JAMES CLERK SALES
FORD ANALYST RESEARCH
MILLER CLERK ACCOUNTING

No es necesario especificar tipos ni tamaños de las columnas, ya que vienen determinados


por los tipos y tamaños de las columnas recuperadas en la subconsulta.

Clausula EXISTS:
Otra manera de emplear su consulta es la clausula EXISTS que permite evaluar el resultado
de otro query o subconsulta.
SQL> select deptno, dname from dept d
2 where exists (select 1 from emp
3 where deptno = d.deptno
4 and sal >= 1000);

DEPTNO DNAME
--------- --------------
10 ACCOUNTING
20 RESEARCH
30 SALES

Tambien se puede negar la condicion o la no existencia:

SQL> select deptno, dname from dept d


2 where NOT exists (select 1 from emp
3 where deptno = d.deptno
4 and sal >= 1000);

DEPTNO DNAME
--------- --------------
40 OPERATIONS
Creación de Vistas:

Create View:
Las vistas son objetos utilizados solo para la consulta de datos. Su uso se fundamenta en
agrupar informaciones de diferentes tablas y facilitar las consultas.

Sintaxis:
CREATE VIEW view_name(column_name, column_name, …) AS Select;

view_name Nombre de la vista a crear.


column_name Nombre de columnas.
Select Select de donde saldran los datos

SQL> create view empleados_v (codigo, nombre, salario, cargo)


2 as select empno, ename, sal, job from emp;

View created.

SQL> desc empleados_v


Name Null? Type
------------------------------- -------- ----
CODIGO NOT NULL NUMBER(4)
NOMBRE VARCHAR2(10)
SALARIO NUMBER(7,2)
CARGO VARCHAR2(9)

Renombrando Objetos:

RENAME
El comando RENAME se utiliza para modificar el nombre de uno objeto, tabla, vista o
sinónimo.
La sintaxis es la siguiente
RENAME {tabla | vista | sinónimo} to nuevoNombre ;

Esta sentencia cambiará el nombre antiguo por el nuevo, y a partir de este momento
cualquier acceso al objeto por el nombre antiguo será respondido con un mensaje de error.
Conviene resaltar la diferencia entre el comando SYNONYM y el comando RENAME.
Mientras que el primero mantiene el nombre original para acceder al objeto, el segundo
elimina ese primer nombre sustituyéndolo por el nuevo.

SQL> Rename empleados to empleado;


EJERCICIO III

1) Insertar 5 registros en cada una de las siguientes tablas:


Materias
Estudiantes
Notas

2) Borrar los registros de las tablas Materia y Estudiantes que no tengan registros
relacionados en la tabla de Notas.

3) Hacer consulta relacionando las tablas Materia, Estudiantes y Notas y utilizar la


cláusula ORDER BY y luego convertirla en una vista con los siguientes campos:

Columna Tabla
-------------- -----------
MATRICULA NOTAS
NOMBRE ESTUDIANTES
MATERIA NOTAS
NOM_MATERIA MATERIAS
CALIFICACION NOTAS
MAS SQL*Plus

En este apartado vamos a profundizar un poco en las otras posibilidades que nos brinda
SQL*Plus en los:
ficheros de comandos, y

generación de informes,

Ficheros de Comandos
Aunque ya vimos una introducción a los ficheros de comandos en anteriormente, vamos
ahora a profundizar un poco en las posibilidades que nos ofrece SQL*Plus.
En un fichero de comandos se pueden incluir:
líneas de comentarios,

líneas de ejecución,

líneas de comandos SQL, y


líneas de comandos SQL*Plus.

Líneas de Comentarios
Se pueden introducir comentarios en un archivo de comandos de tres maneras:

Utilizando del comando REM del SQL*Plus.

Utilizando los delimitadores de comentario de SQL /* y */.


Utilizando los símbolos de comentario PL/SQL " ".

Líneas de Ejecución
Constan de una única barra inclinada, "/", y se introducen a continuación de cada sentencia
SQL indicando su ejecución.
Sustituyen al punto y coma, ";" al final de las sentencias SQL.

Líneas de Comandos SQL

Se puede introducir cualquiera de los comandos SQL enumerados en este curso, y se


ejecutarán de manera secuencial.
Se permite el anidamiento de los ficheros de comandos.
Líneas de Comandos SQL*Plus

SQL*Plus aporta una serie de posibilidades al lenguaje SQL que le acerca un poco mas a lo
que entendemos como un lenguaje de programación.

Se pueden definir constantes y variables, capturar datos del teclado, introducir parámetros
en la llamada de un archivo de comandos, y alguna cosa más.

Variables de Usuario
Se pueden definir Variables de usuario con el comando DEFINE
DEFINE Variable = valor
Para borrar una variable se utiliza el comando UNDEFINE
UNDEFINE variable

Como ejemplo se puede definir la variable OFICIO


SQL> define oficio=analista

Variables de Sustitución

Las variables de sustitución son un nombre de variable de usuario con el símbolo &
delante. Cuando SQL*Plus detecta una variable de sustitución en un comando, ejecuta el
comando tomando el valor de la variable.
Esto se puede ver en el ejemplo, donde preguntamos por los empleados que son analistas:
SQL> define oficio=Analista
SQL> define tabla=emp
SQL> select nombre, oficio from &tabla where oficio='&oficio';
old 1: select nombre, oficio from &tabla where oficio='&oficio'
new 1: select nombre, oficio from emp where oficio='Analista'

NOMBRE OFICIO
---------- -----------
Sastre Analista
Recio Analista
Captura de Datos desde el Terminal

En muchas ocasiones es necesario recoger datos desde un terminal, que luego serán
utilizados en el archivo de comandos. Para realizarlo se pueden utilizar dos medios: las
variables de sustitución o los parámetros en la línea de comandos.

Cuando SQL*Plus reconoce una variable de sustitución sin valor asignado se lo pide al
usuario:

SQL> select * from dept where dname='&Nombre_depto';


Enter value for nombre_depto: SALES
old 1: select * from dept where dname='&Nombre_depto'
new 1: select * from dept where dname='SALES'

DEPTNO DNAME LOC


--------- -------------- -------------
30 SALES CHICAGO

Si se desea que SQL*Plus pregunte por el valor de la variable al usuario sólo la primera vez
que se encuentra con ella, se colocará "&&" delante de la variable de usuario.

También se pueden utilizar hasta nueve parámetros en la línea de comandos cuando se


llama a la ejecución de un archivo de comandos.
En el archivo de comandos nos referiremos a los parámetros con las variables &1, &2, ...
,&9 que se corresponden posicionalmente con ellos.

Desde el archivo de comandos se puede hacer referencia a los parámetros cualquier número
de veces y en cualquier orden.
Comandos de Comunicación con el Usuario
Los siguientes comandos proporcionan un medio de comunicación con el usuario:
PROMPT: presenta un mensaje en la pantalla.

ACCEPT: Solicita un valor y lo almacena en la variable de usuario que se


especifique.
PAUSE: Obliga al usuario a pulsar Return después de leer un mensaje.

Para ver cómo funcionan sirve el siguiente ejemplo:


prompt Buscar los datos de un empleado.
pause Pulse Return.
accept nombre_emp prompt 'Empleado? '
SQL> select * from emp where ename='&nombre_emp';
Otros Comandos
Los siguientes comandos también se pueden incluir en un archivo de comandos:
CONNECT: para conectarse como otro usuario.

HELP: para obtener ayuda en línea.

EXIT: para dejar SQL*PLus y salir al Sistema Operativo.

DESCRIBE ó DESC: para obtener información sobre la estructura de una tabla.


HOST o !: para ejecutar un comando del Sistema Operativo.

Generación de Informes
Con SQL*Plus podemos dar forma a los resultados de las consultas para producir un
informe. Podremos:
Cambiar las cabeceras de las columnas.

Dar forma a las columnas de tipo number, varchar2, date y long.

Copiar y listar atributos de presentación de las columnas.

Suprimir valores duplicados e introducir espacios para mejorar la presentación.


Realizar y mostrar cálculos (totales, medias, mínimos, máximos, etc.).

Definir las dimensiones de las páginas.

Ubicar títulos en la cabecera y pie de las páginas.


Introducir la fecha o el número de página en los títulos.

Pero de todo esto sólo vamos a ver el modo de realizar las operaciones más comunes y
sencillas.

Básicamente, el formato con el que se van a presentar los resultados de las consultas
dependen de unos parámetros y de unos comandos.
Parámetros

SET LINESIZE: pone el número máximo de caracteres por línea. Por defecto vale
80 y el máximo es 999.

SET PAGESIZE: pone el número de filas de la salida antes de empezar una nueva
página. Por defecto es 25. Incluye el título y las líneas de pausa.

SET HEADING [ON | OFF]: Activa/desactiva la utilización de encabezados de


columnas. Por defecto está activado.

SET NULL texto: Indica la cadena de caracteres que hay que colocar en sustitución
de los valores NULL. Por defecto es "".
SET ECHO [ON | OFF]: Activa/desactiva la visualización de los comandos que
SQL*Plus ejecuta según van siendo tratados. Por defecto está desactivada.
SET FEEDBACK [ n | ON | OFF]: Muestra el número de registros recuperados en
cada consulta cuando se recuperan n o más registros. ON se pueden considerar
como n=1, y OFF como n=0.

SET VERIFY [ON | OFF]: Controla la salida de confirmación para los valores de
las variables de sustitución. Por defecto está activado.
Comandos
TTITLE: formación del encabezado de página.
BTITLE: formación del pie de página.
COLUMN: formatear cada columna.

BREAK: puntos de ruptura en los listados.

COMPUTE: realizar cálculos con las columnas.

También podría gustarte