Sunteți pe pagina 1din 36

Manuel 8en[amln Covarrublas Calvarlo

unldep
01/10/2011
Intiouuccion al SQL


1


Introduccion al SQL


8te cur8o pretende 8er una introduccion al SQL, y en particular a la ver8ion que utiliza el SGBD
Oracle (7.3) llamado SQL*Plu8. No 8e pretende realizar un e8tudio exhau8tivo de toda8 la8
opcione8, comando8 y a8pecto8 de almacenamiento y admini8tracion que 8e pueden con8iderar en
SQL. Solo 8e ha pretendido introducir y explicar lo8 comando8 ma8 utilizado8 con 8u8 opcione8 ma8
utile8, dejando lo8 detalle8 ma8 e8peciIico8 a lo8 manuale8 de reIerencia.


ndice

1. %erminologia ............................ 2
2. %ipo8 de 8entencia8 SQL ...................... 3
3. SQL*Plu8 ............................. 4
o onexion .......................... 4
o Po8ibilidade8 de dicion .................... 5
o &tilizacion de Fichero8 ..................... 5
4. reacion .............................. 6
o %ipo8 de olumna8 ...................... 7
o #e8triccione8 ......................... 7
o omando DESCRIBE ..................... 9
5. odiIicacion ............................ 10
6. In8ercion, Actualizacion y Borrado .................... 10
o In8ercion .......................... 11
o Actualizacion ......................... 12
o Borrado ............................12
7. Seleccion ............................ 12
o Seleccion de olumna8
o lau8ula RJM
o lau8ula ERE
o lau8ula JRDER BY
o lau8ula DISTINCT
o Funcione8
o lau8ula GRJUP BY
o xpre8ione8 con Sentencia8 SELECT
o ombinacione8
o Subcon8ulta8
8. liminacion
9. Vi8ta8
10.Jugando con lo8 Nombre8
o Sinonimo8
o l omando RENAME
11.Lo a8 SQL*Plu8
o Fichero8 de omando8
o Generacion de InIorme8



2


Introduccion al SQL

TerminoIoga

SQL
Structured Query Language o Lenguaje de on8ulta8 8tructurado. 8 el lenguaje que
permite la comunicacion con el Si8tema Ge8tor de Ba8e8 de Dato8 (Oracle en nue8tro ca8o).
l SQL e8 un lenguaje uniIicado
Lo utilizan todo tipo de u8uario8, de8de el admini8trador de la ba8e de dato8, DBA, ha8ta el
u8uario Iinal.
l SQL e8 un lenguaje no procedimental.
l u8uario e8peciIica Que quiere, no Como ni Donde con8eguirlo.
l SQL e8 relacionalmente completo.
Permite la realizacion de cualquier con8ulta de dato8.
SQL DDL DL
La8 8entencia8 del SQL 8e cla8iIican como parte del DDL o del DL.
Lenguaje de DeIinicion de Dato8, DDL
Sentencia8 del SQL que permiten deIinir lo8 objeto8 de la Ba8e de Dato8 (create,
revoke, grant, alter, etc.). uando 8e deIinen dicho8 objeto8 8e almacenan en el
diccionario de dato8.
Lenguaje de anipulacion de Dato8, DL
Sentencia8 del SQL que 8e utilizan para manejar lo8 dato8 de la ba8e de dato8 (select,
insert, update, delete, etc.).
Commit/rollback
ada vez que 8e realiza alguna operacion en la ba8e de dato8 8e realiza no 8obre la tabla en
8i, 8ino 8obre una copia local de la mi8ma. A8i, 8i queremo8 que lo8 re8ultado8 de la
modiIicacion 8e tra8laden a la ba8e de dato8 y perduren en el tiempo hay que conIirmar
dicha operacion con el comando commit. %ambien 8e puede impedir que lo8 ultimo8
cambio8 lleguen a eIectuar8e con rollback, aunque exi8ten alguna8 8entencia8 SQL que
8e 'auto conIirman' y no 8e pueden volver atra8.
Diccionario de la Ba8e de Dato8
Guarda la deIinicion de todo8 lo8 objeto8 almacenado8 en la ba8e de dato8 8u8
caracteri8tica8, re8triccione8, privilegio8, relacione8 entre ello8, etc.




















3


Introduccion al SQL


Tipos de Sentencias

La8 8entencia8 SQL pertenecen a do8 categoria8 principale8 Lenguaje de DeIinicion de Dato8, DDL
y Lenguaje de anipulacion de Dato8, DL. 8to8 do8 lenguaje8 no 8on lenguaje8 en 8i mi8mo8,
8ino que e8 una Iorma de cla8iIicar la8 8entencia8 de lenguaje SQL en Iuncion de 8u cometido. La
diIerencia principal re8ide en que el DDL crea objeto8 en la ba8e de dato8 y 8u8 eIecto8 8e pueden
ver en el diccionario de la ba8e de dato8 mientra8 que el DL e8 el que permite con8ultar, in8ertar,
modiIicar y eliminar la inIormacion almacenada en lo8 objeto8 de la ba8e de dato8.
uando 8e ejecutan la8 8entencia8 DDL de SQL, el SGBD conIirma la tran8accion actual ante8 y
de8pue8 de cada una de la8 8entencia8 DDL. n cambio, la8 8entencia8 DL no llevan implicito el
commit y 8e pueden de8hacer. xi8te pue8 un problema al mezclar 8entencia8 DL con DDL, ya
que e8ta8 ultima8 pueden conIirmar la8 primera8 de manera involuntaria e implicita, lo que en
oca8ione8 puede 8er un problema.
A continuacion 8e pre8enta una tabla con la8 8entencia8 SQL ma8 comune8, cla8iIicada8 8egun el
lenguaje al que pertenecen.
Sentencia
DDL
Objetivo
Alter
procedure
#ecompilar un procedimiento almacenado.
Alter %able Aadir o redeIinir una columna, modiIicar la a8ignacion de almacenamiento.
Analyze
#ecoger e8tadi8tica8 de rendimiento 8obre lo8 objeto8 de la BD para utilizarla8 en
el optimizador ba8ado en co8te8.
reate %able rear una tabla.
reate Index rear un indice.
Drop %able liminar una tabla.
Drop Index liminar un indice.
Grant onceder privilegio8 o papele8, role8, a un u8uario o a otro rol.
%runcate liminar toda8 la8 Iila8 de una tabla.
#evoke #etirar lo8 privilegio8 de un u8uario o rol de la ba8e de dato8.
Sentencia
DML
Objetivo
In8ert Aadir Iila8 de dato8 a una tabla.
Delete liminar Iila8 de dato8 de una tabla.
&pdate odiIicar lo8 dato8 de una tabla.
Select #ecuperar dato8 de una tabla.
ommit onIirmar como permanente8 la8 modiIicacione8 realizada8.
#ollback De8hacer toda8 la8 modiIicacione8 realizada8 de8de la ultima conIirmacion.





4


Introduccion al SQL



SQL*PIus

La herramienta que no8 proporciona O#AL para interactuar con la ba8e de dato8 8e llama
SQL*Plu8. Ba8icamente, e8 un interprete SQL con alguna8 opcione8 de edicion y Iormateo de
re8ultado8.
Ante8 de ver la manera de conectar8e a SQL*Plu8, conviene tener claro8 alguno8 concepto8
&8uario/lave
Para poder acceder a una ba8e de dato8 ge8tionada por O#AL debemo8 8er un u8uario
autorizado de la mi8ma y conocer la palabra clave, 5assword, a8ociada al u8uario.
Variable de ambiente JRACLE_SID
Indica la ba8e de dato8 con la que vamo8 a trabajar.

Conexin
Para entrar en SQL*Plu8 8e debe ejecutar el comando
$ 8qlplu8 u8uario/pa88d
Donde le indicamo8 al SGBD Oracle quien 8omo8 y nue8tra palabra clave.
Si la conIiguracion del SGBD Oracle 8e corre8ponde a una conIiguracion cliente-8ervidor a8entada
8obre una red (SQL*Net v2) deberemo8 indicar, adema8, el 8ervicio (o ba8e de dato8) con el que
queremo8 contactar. 8to 8e hace colocando el 8imbolo ante8 del nombre del 8ervicio como 8e
indica a continuacion
$ 8qlplu8 u8uario/pa88d8ervicio
Otra circun8tancia que hay que tener en cuenta a la hora de conectarno8 a SQL*Plu8 e8 el modo
e8tablecido por el DBA para la autentiIicacion del u8uario de la ba8e de dato8. La primera
po8ibilidad e8 que recaiga 8obre el SGBD Oracle la autentiIicacion de lo8 u8uario8, por lo que
tendremo8 que darle nue8tro nombre de u8uario y la palabra de pa8o. Pero exi8te la po8ibilidad de
que el SGBD Oracle deje en mano8 del Si8tema Operativo e8ta re8pon8abilidad. A8i, no 8era
nece8ario demo8trarle al SGBD Oracle quien 8omo8 ya que el SO 8e ha encargado previamente de
comprobar que todo e8 correcto. n e8te 8egundo ca8o, el comando de conexion con SQL*Plu8 debe
omitir el nombre de u8uario y la palabra clave, pero manteniendo el re8to de e8ta manera

$ 8qlplu8 /8ervicio
&na vez que hemo8 con8eguido entrar en SQL*Plu8 no8 pre8enta el 5rom5t y e8pera la in8ercion de
8entencia8 SQL. %oda8 la8 8entencia8 deben acabar con un ''. &na 8entencia puede continuar en
varia8 linea8, que SQL*Plu8 va numerando. Si queremo8 anular la 8entencia actual podemo8 hacerlo
colocando un '.' como unico caracter en una linea. Si queremo8 volver a ejecutar la ultima 8entencia
8e puede hacer con el comando '/'. Si queremo8 ejecutar la8 8entencia8 que almacena un Iichero .8ql
podemo8 hacerlo anteponiendo el 8imbolo '' al nombre del Iichero.
Para cerrar la 8e8ion vale con teclear 'exit'.



5


Introduccion al SQL

PosibiIidades de Edicin
SQL*Plu8 almacena en un -uffer la ultima 8entencia SQL introducida. l -uffer mantiene 8olo una
8entencia cada vez, y 8i 8e introduce una nueva 8entencia 8e 8obre8cribe 8obre la anterior.
La 8entencia en el -uffer puede 8er recuperada para ejecutarla de nuevo con lo8 comando8
O RUN que vi8ualiza la 8entencia en el -uffer ante8 de ejecutarla
O / que ejecuta la 8entencia 8in vi8ualizarla.
SQL*Plu8 tambien no8 permite editar la 8entencia SQL almacenada en el -uffer mediante un
8encillo (y limitado) editor en linea, cuyo8 comando8 8e enumeran a continuacion
omando Abreviatura Descripcin
APPND texto A texto Aade texto al Iinal de la linea.
ANG/Iuente/de8tino /Iuente/de8tino ambia el contenido 'Iuente' por el 'de8tino'
ANG/texto /texto Quita 'texto' de una linea.
LA# B&FF# L B&FF Borra el -uffer
DL DL Borra una linea.
INP&% I In8erta una o ma8 linea8.
INP&% texto I texto In8erta una linea con 'texto'.
LIS% L Li8ta la8 linea8 del -uffer
LIS% n L n o n Li8ta la linea ene8ima.
LIS% * L * Li8ta la linea actual.
LIS% LAS% L LAS% Li8ta la ultima linea.
LIS% m n L m n Li8ta la8 linea8 de8de la eme8ima a la ene8ima.
Al contenido del -uffer tambien 8e puede acceder de8de el editor del Si8tema Operativo. A8i, el
buIIer podra 8er manipulado con la8 po8ibilidade8 del editor con el que e8temo8 aco8tumbrado8 a
trabajar. Al 8alir del editor 8e devuelve el control al SQL*Plu8. Para con8eguir trabajar con el editor
del Si8tema Operativo ba8ta con colocar la variable DEINE_EDITJR y luego llamar al editor.
SQL~ deIineeditorvi
SQL~ edit




UtiIizacin de Ficheros
SQL*Plu8 con8idera do8 tipo8 de Iichero8 de s5ool y de comando8.
&n fichero de spool almacena lo8 re8ultado8 de una con8ulta (o varia8) en un Iichero con la
exten8ion .l8t (o lo manda a la impre8ora).
Lo8 comando8 a8ociado8 con lo8 Iichero8 s5ool 8on





Introduccion al SQL

SPJJL fichero
anda el re8ultado de la8 con8ulta8 al Iichero.
SPJJL JUT
anda el re8ultado de la8 con8ulta8 a la impre8ora.
SPJJL J
ierra el Iichero de s5ool.
EXIT
Al 8alir de SQL*Plu8 8e cierran lo8 Iichero8 de s5ool.
Lo8 ,rchivos de com,3dos almacenan comando8 SQL y SQL*Plu8 para 8er editado, almacenado
y/o ejecutado y tienen por deIecto la exten8ion .8ql
O Para editarlo 8e puede utilizar el comando edit fichero.
O Para ejecutarlo 8e utilizara el comando START fichero o fichero
l SQL*Plu8 no8 proporciona ma8 po8ibilidade8 en relacion con lo8 Iichero8 de comando8, la
comunicacion con el u8uario Iinal y la generacion de inIorme8. Pero ante8 de ver e8te tipo de co8a8,
e8 mejor que 8igamo8 proIundizando en el conocimiento del lenguaje SQL. Al Iinal del cur8o 8e
puede 8e encuentra un capitulo con alguna8 de la8 co8illa8 que quedan por contar del SQL*Plu8.

Creacin

La primera Ia8e de cualquier ba8e de dato8 comienza 8iempre con 8entencia8 DDL, ya que ante8 de
poder almacenar inIormacion debemo8 deIinir lo8 objeto8 ba8ico8 donde agrupar la inIormacion.
Lo8 objeto8 ba8ico8 con que trabaja SQL 8on la8 tabla8. &na tabla e8 un conjunto de celda8
agrupada8 en Iila8 y columna8 donde 8e almacenan elemento8 de inIormacion.
Ante8 de llevar a cabo la creacion de una tabla conviene planiIicar
O nombre de la tabla,
O nombre de cada columna,
O tipo y tamao de lo8 dato8 almacenado8 en cada columna,
O inIormacion adicional, re8triccione8, etc.
ay que tener en cuenta tambien cierta8 re8triccione8 en la Iormacion de lo8 nombre8 de la8 tabla8
longitud maxima de 30 caractere8, no puede haber nombre8 de tabla duplicado8, deben comenzar
con un caracter alIabetico, permitir caractere8 alIanumerico8 y el guion bajo '', y Oracle no
di8tingue entre mayu8cula8 y minu8cula8.
La 8intaxi8 del comando que permite crear una tabla e8 la 8iguiente

CREATE TABLE |esquema.]tabla ({columna tipo Columna |NOT NULL],}
+
,
{CONSTRA!NT nombre Restriccin
{UN!QUE (|column,]
+
)]
DEFAULT expresin]
CHECK (condicin)]
PR!NARY KEY (|column,]
+
)]





Introduccion al SQL

FORE!CN KEY (column) REFERENCES tabla (columna)},}
*
)
Del examen de la 8intaxi8 de la 8entencia Create Table 8e pueden concluir que nece8itamo8
conocer lo8 di8tinto8 tipo8 de columna y la8 di8tinta8 re8triccione8 que 8e pueden imponer al
contenido de la8 columna8. Vayamo8 por parte8.

Tipos de CoIumnas
xi8ten vario8 tipo8 de dato8 en SQL. De e8ta manera, cada columna puede albergar una
inIormacion de naturaleza di8tinta. Lo8 tipo8 de dato8 ma8 comune8 y 8u8 caracteri8tica8 8e re8umen
en la 8iguiente tabla.
%ipo de Dato Descripcin
'ARCAR2(tamao)
Almacena dato8 de tipo caracter alIanumerico de longitud variable, con un
tamao maximo de 2.000.
CAR(tamao)
Almacena dato8 de tipo caracter alIanumerico de longitud Iija, con un tamao
maximo de 255.
LJNG
Almacena dato8 de tipo caracter alIanumerico de longitud variable con un
tamao maximo de ha8ta 2 Gb.
NUMBER(dig,dec)
Almacena dato8 numerico8 de dig digito8, de lo8 cuale8 dec 8on decimale8.
l tamao maximo e8 de 38 digito8.
DATE Almacena Iecha8 de8de el 1-ne-4712 A ha8ta el 31-Dic-4712 D.
RA(tamao)
Almacena dato8 de longitud variable, con un tamao maximo de 255 byte8.
LJNG RA Almacena dato8 de longitud variable, con un tamao maximo de 2 Gb.


Restricciones
La8 re8triccione8 de lo8 dato8 8e imponen para a8egurarno8 que lo8 dato8 cumplen con una 8erie de
condicione8 predeIinida8 para cada tabla. 8ta8 re8triccione8 ayudan a con8eguir la integridad de
reIerencia toda8 la8 reIerencia8 dentro de una BD 8on valida8 y toda8 la8 re8triccione8 8e han
cumplido.
La8 re8triccione8 8e van a deIinir acompaada8 por un nombre, lo que permitira activarla8 o
de8activarla8 8egun 8ea el ca8o o tambien mezclada8 en la deIinicione8 de la8 columna8 de la tabla.
A continuacion vamo8 a de8cribir cada una de la8 re8triccione8 mencionada8.
NJT NULL
8tablece la obligatoriedad de que e8ta columna tenga un valor no nulo. Se debe e8peciIicar
junto a la columna a la que aIecta. Lo8 valore8 nulo8 no ocupan e8pacio, y 8on di8tinto8 a 0
y al e8pacio en blanco. ay que tener cuidado con lo8 valore8 nulo8 en la8 operacione8, ya
que 1 NULL e8 igual a NULL.
UNIQUE
vita valore8 repetido8 en una columna, admitiendo valore8 nulo8. Oracle crea un indice
automaticamente cuando 8e habilita e8ta re8triccion y lo borra al de8habilitar8e.
DEAULT





Introduccion al SQL

8tablece un valor por deIecto para e8a columna, 8i no 8e le a8igna ninguno.


CECK
omprueba que 8e cumpla una condicion determinada al rellenar e8a columna. 8ta
condicion 8olo debe e8tar con8truida con columna8 de e8ta mi8ma tabla.
PRIMARY KEY
8tablece el conjunto de columna8 que Iorman la clave primaria de e8a tabla. Se comporta
como unica y obligatoria 8in nece8idad de explicitarlo. Solo puede exi8tir una clave
primaria por tabla. Puede 8er reIerenciada como clave ajena por otra8 tabla8. rea un indice
automaticamente cuando 8e habilita o 8e crea e8ta re8triccion. n Oracle, lo8 indice8 8on
con8truido8 8obre arbole8 B

.
JREIGN KEY
8tablece que el contenido de e8ta columna 8era uno de lo8 valore8 contenido8 en una
columna de otra tabla mae8tra. 8ta columna marcada como clave ajena puede 8er N&LL.
No hay limite en el numero de clave8 ajena8. La clave ajena puede 8er otra columna de la
mi8ma tabla. Se puede Iorzar que cuando una Iila de la tabla mae8tra 8ea borrada, toda8 la8
Iila8 de la tabla detalle cuya clave ajena coincida con la clave borrada 8e borren tambien.
8to 8e con8igue aadiendo la coletilla JN DELETE CASCADE en la deIinicion de la
clave ajena.
Seguidamente 8e pre8enta un ejemplo en el que 8e crean do8 tabla8, una de departamento8 y otra de
empleado8
#
# tabla departamento con un codigo de departamento, un nombre y una
# localizacion.
#

reate table dep (
coddep number(3),
Nombre varchar2(15) not null,
loc varchar2(10),
con8traint deppk primary key (coddep),
con8traint deploc check
(loc in ('Valladolid', 'Boecillo', 'igale8'))
)

#
# tabla empleado con un codigo de empleado, un nombre, un oIicio, un
# jeIe, una Iecha de alta en la empre8a, un 8alario men8ual, una
# comi8ion y el codigo del departamento donde trabaja.
#

create table emp (
codemp number(3),
nombre varchar2(10) not null,
oIicio varchar2(11),





Introduccion al SQL

jeIe number(3),
Iechaalta date,
8alario number(10),
comi8ion number(10),
coddep number(3),
con8traint emppk primary key (codemp),
con8traint empIk Ioreign key (coddep) reIerence8 dep(coddep)
on delete ca8cade,
con8traint empck check (8alario ~ 0)
)


Comando Describe
Oracle no8 proporciona un comando que re8ulta muy util cuando queremo8 conocer la e8tructura de
una tabla, la8 columna8 que la Iorman y 8u tipo y re8triccione8. 8te comando toma una mayor
importancia 8egun no8 alejemo8 del momento de creacion de una tabla.
La 8intaxi8 e8 la 8iguiente
DESCR!BE tabla
un ejemplo de 8u utilizacion 8e puede ver al de8cribir la deIinicion de la8 do8 tabla8 creada8 ante8.
omo no e8 una 8entencia SQL no nece8ita el '' al Iinal. %ambien 8e puede abreviar como DESC.
SQL~ de8cribe dep
Name Null? %ype
------------------------------- -------- ----
ODDP NO% N&LL N&B#(3)
NOB# NO% N&LL VA#A#2(15)
LO VA#A#2(10)

SQL~ de8c emp
Name Null? %ype
------------------------------- -------- ----
ODP NO% N&LL N&B#(4)
NOB# NO% N&LL VA#A#2(10)
OFIIO VA#A#2(10)
JF N&B#(4)
FAAL%A DA%
SALA#IO N&B#(10)
OISION N&B#(10)
ODDP N&B#(3)







10


Introduccion al SQL





5 Modificacin

De8pue8 de crear una tabla, a vece8 no8 encontramo8 con que 8e nece8ita aadir una columna
adicional o modiIicar la deIinicion de una columna exi8tente. 8ta operacion 8e puede realizar con
el comando ALTER TABLE.
ALTER TABLE tabla {ADD ] NOD!FY} ({columna tipoColumna |NOT NULL],}
+
),

ay que tener en cuenta vario8 punto8


O No e8 po8ible di8minuir el tamao de un columna.
O n la8 modiIicacione8, lo8 tipo8 anterior y nuevo deben 8er compatible8, o la tabla debe
e8tar vacia.
O La opcion ADD ... NJT NULL 8olo 8era po8ible 8i la tabla e8ta vacia.
O La opcion MJDIY ... NJT NULL 8olo podra realizar8e cuando la tabla no contenga
ninguna Iila con valor nulo en la columna en cue8tion.
Por ejemplo la 8entencia 8iguiente aade la Iecha de nacimiento a la tabla de empleado8.
SQL~ alter table emp add (Iechanac date not null)
%ambien 8e puede querer modiIicar una tabla aadiendo o eliminando re8triccione8. n e8te ca8o el
comando a utilizar 8era
ALTER TABLE tabla {ADD ] DROP} CONSTRA!NT restriccin,


Insercin, ActuaIizacin y Borrado

&na vez que tenemo8 deIinida la e8tructura de una tabla 8e pueden in8ertan lo8 dato8, modiIicarlo8 o
borrarlo8 de la tabla.
8ta tarea entra dentro de la8 operacione8 que 8e realizan con el lenguaje DL. 8te lenguaje
permite manipular lo8 objeto8 de la ba8e de dato8, in8ertando, modiIicando y/o borrando el
contenido de la8 tabla8. ay que recordar que e8ta8 8entencia8 no 8on 'auto conIirmada8' y requieren
de la 8entencia CJMMIT para que 8u8 eIecto8 perduren en el tiempo, o de la 8entencia RJLLBACK
para de8hacer lo8 cambio8 eIectuado8.
A continuacion vamo8 a e8tudiar tre8 de la8 8entencia8 DL ma8 comune8.

Insercin


11


Introduccion al SQL

l comando que permite in8ertar Iila8 en la8 tabla8 e8 el 8iguiente.
!NSERT !NTO tabla |({columna,}
*
)] vALUES ({expresin,}
+
),
Solo e8peciIicaremo8 la8 columna8 donde in8ertar y 8u orden cuando no in8ertemo8 dato8 en toda8
ella8 o no lo hagamo8 en el mi8mo orden en que deIinimo8 la tabla. La a8ociacion columna-valor e8
po8icional. Lo8 valore8 deben cumplir con lo8 tipo8 de dato8 deIinido8. Lo8 valore8 de tipo caracter
y Iecha deben ir encerrado8 entre comilla8 8imple8, ('').
A continuacion 8e puede ver la in8ercion de Iila8 en la8 tabla8 de ejemplo.
# in8ertar Iila8 en la tabla dep
in8ert into dep value8 (100,'Admini8tracion','Valladolid')
in8ert into dep value8 (200,'ID','Boecillo')
in8ert into dep value8 (300,'Produccion','igale8')

# in8ertar Iila8 en la tabla emp
in8ert into emp value8 (101,'ano','Pre8idente',null,'3-FB-96',450000,null,100)
in8ert into emp value8 (102,'#oncal','Director',101,'3-FB-96',350000,null,100)
in8ert into emp value8 (103,'#ueda','Secretario',102,'17-A#-96',175000,null,100)
in8ert into emp value8 (104,'artin','ontable',102,'17-A#-96',235000,null,100)
in8ert into emp value8 (105,'Sanz','omercial',101,'17-A#-96',150000,10,100)
in8ert into emp value8 (106,'Lopez','omercial',101,'21-A#-96',150000,15,100)
in8ert into emp value8 (201,'Perez','Director',101,'4-J&N-96',350000,null,200)
in8ert into emp value8 (202,'Sa8tre','Anali8ta',201,'8-J&N-96',300000,null,200)
in8ert into emp value8 (203,'Garcia','Programador',202,'8-J&N-96',225000,null,200)
in8ert into emp value8 (204,'ateo','Programador',202,'8-J&N-96',200000,null,200)
in8ert into emp value8 (301,'u8te','Director',101,'3-O%-96',350000,null,300)
in8ert into emp value8 (302,'#ecio','Anali8ta',301,'4-FB-97',300000,null,300)
in8ert into emp value8 (303,'Garcia','Programador',302,'4-FB-97',210000,null,300)
in8ert into emp value8 (304,'Santana','Programador',302,'4-FB-97',200000,null,300)

ActuaIizacin
Otra de la8 operacione8 ma8 comune8 e8 la modiIicacion de la inIormacion almacenada en la8
tabla8. Para ello 8e utiliza el comando UPDATE cuya 8intaxi8 8e mue8tra a continuacion.
UPDATE tabla SET {columna = expresin,}
+
|WHERE condicin],
Se e8peciIicara en la clau8ula SET la8 columna8 que 8e actualizaran y con que valore8. La clau8ula
W# indica la8 Iila8 con la8 que 8e va a trabajar. Si 8e omite la actualizacion aIectara a toda8 la8
Iila8 de la tabla.
Borrado
on in8ertar y modiIicar, la otra operacion que completa el trio e8 la de borrado de Iila8. La 8intaxi8
e8 la que 8igue


12


Introduccion al SQL

DELETE FRON tabla |WHERE condicin],
Borrara toda8 la8 Iila8 que cumplan la condicion e8peciIicada en la clau8ula ERE. Si e8ta clau8ula
no 8e Iija, 8e borraran toda8 la8 Iila8 de la tabla. Aqui cabe decir que aunque con DELETE borremo8
toda8 la8 Iila8 de una tabla, no borramo8 la deIinicion de la tabla del diccionario y podemo8 in8ertar
dato8 po8teriormente en la tabla. 8ta e8 una diIerencia con la 8entencia DRJP TABLE, que
produce la eliminacion tanto del contenido de la tabla como de la deIinicion de la mi8ma.


SeIeccin

La recuperacion de lo8 dato8 en el lenguaje SQL 8e realiza mediante la 8entencia SELECT,
8eleccionar. 8ta 8entencia permite indicar al SGBD la inIormacion que 8e quiere recuperar. 8ta e8
la 8entencia SQL, con diIerencia, ma8 habitual. La 8entencia SELECT con8ta de cuatro parte8
ba8ica8
O La clau8ula SELECT 8eguida de la de8cripcion de lo que 8e de8ea ver, lo8 nombre8 de la8
columna8 a 8eleccionar. 8ta parte e8 obligatoria.
O La clau8ula RJM 8eguida de la e8peciIicacion de la8 tabla8 de la8 que 8e han de obtener lo8
dato8. 8ta parte e8 obligatoria.
O La clau8ula ERE 8eguida por un criterio de 8eleccion, una condicion. 8ta parte e8
opcional.
O La clau8ula JRDER BY 8eguida por el criterio de ordenacion. 8ta parte e8 opcional.

&na primera aproximacion a la 8intaxi8 de la 8entencia SELECT puede mo8trarno8 la 8iguiente
expre8ion
SELECT {* ] {columna,}
+
}
FRON {tabla,}
+
|WHERE condicin]
|ORDER BY {expresin Columna |ASC ] DESC],}
+
],

omo una primera utilizacion de la 8entencia SELECT podemo8 utilizarla para ver toda8 la8 tabla8
que tenemo8 en la ba8e de dato8.
SQL~ 8elect tablename Irom u8ertable8

%ABLNA
------------------------------
DP
P



13


Introduccion al SQL

&n breve anali8i8 de la 8entencia anterior no8 permite ob8ervar que hemo8 con8ultado 8obre la
columna llamada table_name almacenada en la tabla user_tables, que e8 la tabla que guarda
la inIormacion 8obre toda8 la8 tabla8 de cada u8uario.

SeIeccin de CoIumnas
La8 columna8 a 8eleccionar 8e enumeran 8in ma8 en la clau8ula SELECT. Si 8e de8ea 8eleccionar
toda8 la8 columna8 de una tabla 8e puede hacer enumerando a toda8 la8 columna8 o colocando un
a8teri8co, , en 8u lugar.
uando 8e con8ulta una ba8e de dato8, lo8 nombre8 de la8 columna8 8e u8an como cabecera8 de
pre8entacion. Si e8te re8ulta dema8iado largo, corto o criptico, puede cambiar8e con la mi8ma
8entencia SQL de con8ulta, creando un ,i,s de co:m3,.
SQL~ 8elect nombre "Departamento", loc "8ta en" Irom dep

Departamento 8ta en
--------------- ----------
Admini8tracion Valladolid
ID Boecillo
Produccion igale8


CIusuIa FROM
La clau8ula RJM deIine la8 tabla8 de la8 que 8e van a 8eleccionar la8 columna8.
Se puede aadir al nombre de la8 tabla8 el u8uario propietario de la8 mi8ma8 de la Iorma
usuario.tabla. De e8ta manera podemo8 di8tinguir entre la8 tabla8 de un u8uario y otro. Oracle
8iempre con8idera como preIijo el nombre del propietario de la8 tabla8, aunque no 8e lo indiquemo8.
De e8ta Iorma do8 o ma8 u8uario8 pueden tener tabla8 que 8e llamen igual 8in que 8urjan conIlicto8.
Si qui8ieramo8 acceder a la8 Iila8 de la tabla dep del u8uario jperez, (adema8 de tener privilegio8
de lectura 8obre e8a tabla) deberiamo8 e8cribir la 8iguiente 8entencia SQL
SQL~ 8elect * Irom jperez.dep

%ambien 8e puede a8ociar un alia8 a la8 tabla8 para abreviar lo8 nombre8 de la8 tabla8. &n ejemplo
8e puede ver en la 8entencia SQL 8iguiente
SQL~ 8elect d.nombre Irom dep d


CIusuIa R
a8ta ahora hemo8 vi8to como puede utilizar8e la 8entencia SELECT para recuperar toda8 la8
columna8 o un 8ubconjunto de ella8 de una tabla. Pero e8te eIecto aIecta a toda8 la8 Iila8 de la tabla,
a meno8 que e8peciIiquemo8 algo ma8 en la clau8ula ERE. 8 aqui donde debemo8 proponer la
condicion que han de cumplir toda8 la8 Iila8 para 8alir en el re8ultado de la con8ulta. La complejidad


14


Introduccion al SQL

del criterio de bu8queda e8 practicamente ilimitada, y en el 8e pueden conjugar operadore8 de
diver8o8 tipo8 con Iuncione8 de columna8, componiendo expre8ione8 ma8 o meno8 compleja8.
Oper,dores de Comp,r,ci3
Operador Operacin Ejemplo
Igualdad
select from emp where
cod_dep = 100;
!, ~, ` De8igualdad
select from emp where
cod_dep != 100;
enor que
select from emp where
cod_dep < 200;
~ ayor que
select from emp where
cod_dep 200;
enor o igual que
select from emp where
cod_dep <= 200;
~ ayor o igual que
select from emp where
cod_dep = 200;
in
Igual a cualquiera de lo8 miembro8
entre parente8i8
select from emp where
cod_dep in (100, 300);
not in
Di8tinto a cualquiera de lo8
miembro8 entre parente8i8
select from emp where
cod_dep not in (200);
beteen ontenido en el rango
select from emp where
cod_emp between 100 and
199;
not beteen Fuera del rango
select from emp where
cod_emp not between 100
and 199;
like 'abc'
ontiene la cadena 'abc' a partir del
8egundo caracter y luego cualquier
cadena de caractere8
select from emp where
nombre like 'Ma%';
Oper,dores de Aritmticos
Operador Operacin Ejemplo
Suma
select nombre, salario+comision from emp
where oficio=''ENDEDJR';
- #e8ta
select nombre from emp where sysdate-
fecha_alta 365;
* Producto select nombre, salario12 from emp;
/ Divi8ion
select nombre, salario/31 from emp;
Oper,dores de C,de3,s de C,r,cteres


15


Introduccion al SQL

Operador Operacin Ejemplo
,, oncatenacion
select nombre||oficio from emp;


CIusuIa ORDR BY
Se utiliza para e8peciIicar el criterio de ordenacion de la re8pue8ta a la con8ulta. Por deIecto la
ordenacion e8 a8cendente, aunque 8e puede e8peciIicar un orden de8cendente. La ordenacion 8e
puede e8tablecer 8obre el contenido de columna8 o 8obre expre8ione8 con columna8. A continuacion
8e puede ver un ejemplo de u8o de la clau8ula JRDER BY en la que quiere obtener un li8tado de lo8
empleado8 ordenado de manera de8cendente por 8u 8alario y en ca8o de igualdad de 8alario,
ordenado a8cendentemente por 8u nombre.
SQL~ 8elect nombre, 8alario Irom emp order by 8alario de8c, nombre

NOB# SALA#IO
---------- ----------
ano 450000
Perez 350000
#oncal 350000
u8te 350000
#ecio 300000
Sa8tre 300000
artin 235000
Garcia 225000
Garcia 210000
ateo 200000
Santana 200000
#ueda 175000
Lopez 150000
Sanz 150000

14 ro8 8elected.


5 CIusuIa DISTINCT
uando 8e realiza una con8ulta 8obre una tabla en la que 8e extrae inIormacion de varia8 columna8,
puede ocurrir que, 8i no incluimo8 la/8 columna/8 que Iorman la clave principal, obtengamo8 Iila8
repetida8 en la re8pue8ta.
Si e8te comportamiento no no8 re8ulta 8ati8Iactorio podemo8 utilizar la clau8ula DISTINCT para
eliminar la8 Iila8 duplicada8 obtenida8 como re8pue8ta a una con8ulta.
Podemo8 ver como Iunciona en el 8iguiente ejemplo, en el que preguntamo8 por lo8 di8tinto8 oIicio8
de nue8tro8 empleado8.
SQL~ 8elect oIicio Irom emp


1


Introduccion al SQL

Sin utilizar la clau8ula DISTINCT obtendremo8 la 8iguiente re8pue8ta

OFIIO
-----------
Pre8idente
Director
Secretario
ontable
omercial
omercial
Director
Anali8ta
Programador
Programador
Director
Anali8ta
Programador
Programador

14 ro8 8elected.

Pero 8i incluimo8 la clau8ula DISTINCT la re8pue8ta varia para adecuar8e ma8 a nue8tra8
expectativa8.
SQL~ 8elect di8tinct oIicio Irom emp

OFIIO
-----------
Anali8ta
omercial
ontable
Director
Pre8idente
Programador
Secretario

7 ro8 8elected.



Funciones
xi8ten en SQL mucha8 Iuncione8 que pueden complementar el manejo de lo8 dato8 en la8
con8ulta8. Se utilizan dentro de la8 expre8ione8 y actuan con lo8 valore8 de la8 columna8, variable8 o
con8tante8.


1


Introduccion al SQL

Se pueden incluir en la8 cla8ula8 SELECT, ERE y JRDER BY.
Pueden anidar8e Iuncione8 dentro de Iuncione8. exi8te una gran variedad de Iuncione8 para cada
tipo de dato8
O aritmetica8,
O de cadena8 de caractere8,
O de manejo de Iecha8,
O de conver8ion,
O otra8,
O de grupo.
:3cio3es Aritmtic,s
uncin ometido Ejemplo Resultado
ABS(n)
alcula el valor ab8oluto de
n.
select abs(-15) from
dual;
15
IL(n)
alcula el valor entero
inmediatamente 8uperior o
igual a n.
select ceil(15.7)
from dual;
16
FLOO#(n)
alcula el valor entero
inmediatamante inIerior o
igual a n.
select floor(15.7)
from dual;
15
OD(m,n)
alcula el re8to re8ultante de
dividir m entre n.
select mod(11,4) from
dual;
3
POW#(m,n)
alcula la potencia n-e8ima
de m.
select power(3,2)
from dual;
9
#O&ND(m,n)
alcula el redondeo de m a
n decimale8. Si n0 el
redondeo 8e eIectua a por la
izquierda del punto decimal.
select
round(123.456,1) from
dual;
123.5
SQ#%(n)
alcula la raiz cuadrada de
n.
select sqrt(4) from
dual;
2
%#&N(m,n)
alcula m truncado a n
decimale8 (n puede 8er
negativo).
select
trunc(123.456,1) from
dual;
123.4
SIGN(n)
alcula el 8igno de n,
devolviendo -1 8i n0, 0 8i
n0 y 1 8i n~0.
select sign(-12) from
dual;
-1
:3cio3es de C,de3,s de C,r,cteres
uncin ometido Ejemplo Resultado
#(n) Devuelve el
select chr(65) from
A


1


Introduccion al SQL

caracter
cuyo valor
codiIicado
e8 n.
dual;
ASII(cad)
Devuelve el
valor a8cii
de cad.
select ascii('A') from
dual;
65
ONA%(cad1,cad2)
Devuelve
cad1
concatenada
con cad2.
8ta
Iuncion e8
e8quivalente
al operador
,,.
select
concat(concat(nombre,'
es '),oficio) from emp;
ano e8
Pre8idente, etc.
LOW#(cad)
Devuelve la
cadena cad
con toda8
8u8 letra8
convertida8
a
minu8cula8.
select
lower('MinUsCulAs') from
dual;
minu8cula8
&PP#(cad)
Devuelve la
cadena cad
con toda8
8u8 letra8
convertida8
a
mayu8cula8.
select
upper('maYuSCulAs') from
dual;
A&S&LAS
INI%AP(cad)
Devuelve
cad con el
primer
caracter en
mayu8cula8.
select initcap('isabel')
from dual;
I8abel
LPAD(cad1,n,cad2)
Devuelve
cad1 con
longitud n,
y aju8tada a
la derecha,
rellenando
por la
izquierda
con cad2.
select lpad('P',5,'')
from dual;
****P


1


Introduccion al SQL

#PAD(cad1,n,cad2)
Devuelve
cad1 con
longitud n,
y aju8tada a
la izquierda,
rellenando
por la
derecha con
cad2.
select rpad('P',5,'')
from dual;
P****
#PLA(cad,ant,nue)
Devuelve
cad en la
que cada
ocurrencia
de la cadena
ant ha 8ido
8u8tituida
por la
cadena nue.
select
replace('digo','i','ie')
from dual;
diego
S&BS%#(cad,m,n)
Devuelve la
8udcadena
de cad
compue8ta
por n
caractere8 a
partir de la
po8icion m.
select
substr('ABCDEG',3,2)
from dual;
D
LNG%(cad)
Devuelve la
longitud de
cad.
select length('cadena')
from dual;
6
:3cio3es de M,3ejo de ech,s
uncin ometido Ejemplo Resultado
SSDA%
Devuelve la
Iecha y hora
actuale8.
select sysdate from dual;
14-A#-
97
ADDON%S(d,n)
Devuelve la
Iecha d
incrementada
en n me8e8.
select
add_months(sysdate,4) from
dual;
14-J&L-97
LAS%DA(d)
Devuelve la
Iecha del
ultimo dia
del me8 de d.
select last_day(sysdate)
from dual;
31-A#-
97


20


Introduccion al SQL

ON%SB%WN(d1,
d2)
Devuelve la
diIerencia en
me8e8 entre
la8 Iecha8 d1
y d2.
select
months_between(sysdate,'01-
JAN-97') from dual;
2.43409424
N%DA(d,cad)
Devuelve la
Iecha del
primer dia de
la 8emana
cad de8pue8
de la Iecha d.
select next_day(sysdate,
'sunday') from dual;
16-A#-
97
:3cio3es de Co3versi3 de Tipos
uncin ometido Ejemplo Resultado
%ON&B#(cad,Imto)
onvierte la
cadena cad a un
numero,
opcionalmente de
acuerdo con el
Iormato fmto.
select
to_number('12345')
from dual;
124345
%OA#(d, Imto)
onvierte la Iecha
d a una cadena de
caractere8,
opcionalmente de
acuerdo con el
Iormato fmto.
select
to_char(sysdate)
from dual;
'14-A#-
97'
%ODA%(cad,Imto)
onvierte la
cadena cad de tipo
varchar2 a Iecha,
opcionalmente de
acuerdo con el
Iormato fmto.
select to_date('1-
JAN-97') from dual;
01-JAN-
97
on la8 Iecha8 pueden utilizar8e vario8 Iormato8. 8to8 Iormato8 permiten modiIicar la pre8entacion
de una Iecha. n la 8iguiente tabla 8e pre8entan alguno8 Iormato8 de Iecha y el re8ultado que
generan.
Msc,r,s de orm,to N:mric,s
ormato ometido Ejemplo Resultado
cc o 8cc Valor del 8iglo.
select to_char(sysdate,'cc')
from dual;
20
y,yyy o
8y,yyy
Ao con coma, con o
8in 8igno.
select
to_char(sysdate,'y,yyy')
1,997


21


Introduccion al SQL

from dual;
yyyy o yyy
o yy o y
Ao 8in 8igno con
cuatro, tre8, do8 o un
digito8.
select
to_char(sysdate,'yyyy') from
dual;
1997
q %rime8tre.
select to_char(sysdate,'q')
from dual;
1
o
Numero de la
8emana del ao o del
me8.
select to_char(sysdate,'ww')
from dual;
11
mm Numero del me8.
select to_char(sysdate,'mm')
from dual;
03
ddd o dd o
d
Numero del dia del
ao, del me8 o de la
8emana.
select
to_char(sysdate,'ddd') from
dual;
073
hh o hh12 o
hh24
La hora en Iormato
12h. o 24h.
select to_char(sysdate,'hh')
from dual;
12
mi
Lo8 minuto8 de la
hora.
select to_char(sysdate,'mi')
from dual;
15
88 o 88888
Lo8 8egundo8 dentro
del minuto, o de8de
la8 0 hora8.
select
to_char(sysdate,'sssss')
from dual;
44159
Msc,r,s de orm,to de C,r,cteres
ormato ometido Ejemplo Resultado
8year o
year
Ao en Ingle8
select
to_char(sysdate,'syear) from
dual;
nineteen
ninety-8even
month o
mon
Nombre del me8 o 8u
abreviatura de tre8
letra8.
select
to_char(sysdate,'month')
from dual;
march
day o dy
Nombre del dia de la
8emana o 8u
abreviatura de tre8
letra8.
select
to_char(sysdate,'day') from
dual;
Iriday
a.m. o
p.m.
l e8pacio del dia.
select
to_char(sysdate,'a.m.') from
dual;
p.m.
b.c. o a.d.
Indicador del ao
re8pecto al del
nacimiento de ri8to.
select
to_char(sysdate,'b.c.') from
dual;
a.d.
Otr,s :3cio3es


22


Introduccion al SQL

uncin ometido Ejemplo Resultado
DOD(var, val1,
cod1, val2, cod2, ...,
deIecto)
onvierte el
valor de ;ar, de
acuerdo con la
codiIicacion.
select decode(oficio,
'Presidente', 'P',
'Director', 'D', 'X')
from emp;
P, D, , ...
G#A%S%(exp1,
exp2, ...)
Devuelve el
mayor valor de
una li8ta.
8in ejemplo.
8in
ejemplo.
LAS%(cad,Imto)
Devuelve el
menor valor de
una li8ta.
8in ejemplo.
8in
ejemplo.
NVL(val, exp)
Devuelve la
expre8ion exp
8i ;al e8
N&LL, y ;al 8i
en otro ca8o.
select
salario+nvl(comision,0)
from emp;
450000,
350000, ...


CIusuIa ROUP BY
SQL no8 permite agrupar la8 Iila8 re8ultado de una con8ulta en conjunto8 y aplicar Iuncione8 8obre
e8o8 conjunto8 de Iila8.
La 8intaxi8 e8 la 8iguiente
SELECT {* ] {columna,}
+
}
FRON {tabla,}
+
WHERE condicin
CROUP BY {columna ,}
+
HAv!NC condicin
ORDER BY {expresinColumna |ASC ] DESC],}
+
,

n la clau8ula GRJUP BY 8e colocan la8 columna8 por la8 que vamo8 a agrupar. en la clau8ula
A'ING 8e e8peciIica la condicion que han de cumplir lo8 grupo8 para pa8ar al re8ultado.
La evaluacion de la8 diIerente8 clau8ula8 en tiempo de ejecucion 8e eIectua en el 8iguiente orden
O ERE Iiltra la8 Iila8
O GRJUP BY crea una tabla de grupo nueva
O A'ING Iiltra lo8 grupo8
O JRDER BY cla8iIica la 8alida
&n ejemplo de utilizacion de la 8eleccion de grupo8 puede 8er 8eleccionar lo8 empleado8 agrupado8
por 8u oIicio. &n primer intento de con8ulta e8 el 8iguiente
SQL~ 8elect nombre, oIicio Irom emp group by oIicio


23


Introduccion al SQL


8elect nombre, oIicio Irom emp
*
##O# at line 1
O#A-00979 not a G#O&P B expre88ion

Se pre8enta un error debido a que cuando 8e utiliza GRJUP BY, la8 columna8 implicada8 en el
SELECT y que no aparezcan en la clau8ula GRJUP BY deben tener una Iuncion de agrupamiento.
n otra8 palabra8, la columna nombre debe tener una Iuncion de agrupamiento que actue 8obre ella
(max, min, 8um, count, avg). Si no puede 8er a8i, debera llevar dicha columna a la clau8ula GRJUP
BY.
De nuevo, el ejemplo quedara a8i
SQL~ 8elect count(nombre), oIicio Irom emp group by oIicio

O&N%(NOB#) OFIIO
------------- -----------
2 Anali8ta
2 omercial
1 ontable
3 Director
1 Pre8idente
4 Programador
1 Secretario

7 ro8 8elected.

La8 Iuncione8 de agrupamiento que 8e pueden utilizar 8on la8 8iguiente8.


:3cio3es de Agr:p,mie3to
uncin ometido Ejemplo
O&N%(col)
uenta el numero de Iila8
agrupada8.
select count(nombre),oficio
from emp group by oficio;
AVG(col)
alcula el valor medio de
todo8 lo8 valore8 de la
columna col.
select avg(salario),oficio
from emp group by oficio;
A(col)
alcula el valor maximo de
todo8 lo8 valore8 de la
columna col.
select max(salario),oficio
from emp group by oficio;
IN(col)
alcula el valor minimo de
todo8 lo8 valore8 de la
columna col.
select min(salario),oficio
from emp group by oficio;
S&(col) alcula la 8uma de lo8
select sum(salario), oficio


24


Introduccion al SQL

valore8 de la columna col.
from emp group by oficio;
S%DDV(col)
alcula la de8viacion tipica
de lo8 valore8 de la columna
col 8in tener en cuenta lo8
valore8 nulo8.
select stddev(salario),
oficio from emp group by
oficio;
VA#IAN(col)
alcula la varianza de lo8
valore8 de la columna col
8in tener en cuenta lo8
valore8 nulo8.
select variance(salario),
oficio from emp group by
oficio;
ay que tener en cuenta que lo8 valore8 nulo8 no participan en el calculo de la8 Iuncione8 de
conjunto8. 8ta8 Iuncione8 8e pueden utilizar con la8 clau8ula8 DISTINCT y ALL. %ambien 8e
pueden utilizar aunque no realicemo8 agrupacion alguna en la con8ulta, con8iderando a toda la tabla
como un grupo.
SQL~ 8elect count(*) Irom emp

O&N%(*)
----------
14


Expresiones con Sentencias Select
l re8ultado de cada con8ulta e8 un conjunto de Iila8. con conjunto8 8e pueden realizar tre8
operacione8 tipica8 la union, la inter8eccion y la diIerencia.
&nion, UNIJN
ombina toda8 la8 Iila8 del primer conjunto con toda8 la8 Iila8 del 8egundo. ualquier Iila
duplicada 8e reducira a una 8ola.
Inter8eccion, INTERSECT
xaminara la8 Iila8 de lo8 conjunto8 de entrada y devolvera aquella8 que aparezcan en
ambo8. %oda8 la8 Iila8 duplicada8 8eran eliminada8 ante8 de la generacion del conjunto
re8ultante.
DiIerencia, MINUS
Devuelve aquella8 Iila8 que e8tan en el primer conjunto pero no en el 8egundo. La8 Iila8
duplicada8 del primer conjunto 8e reduciran a una Iila unica ante8 de empezar la
comparacion con el 8egundo conjunto.
#eg,s p,r, e M,3ejo de os Oper,dores de Co3j:3tos:
O Pueden 8er encadenado8 en cualquier combinacion, 8iendo evaluado8 de izquierda a
derecha.
O No exi8te jerarquia de precedencia en el u8o de e8to8 operadore8, pero puede 8er Iorzada
mediante parente8i8.
O Pueden 8er empleado8 con conjunto8 de diIerente8 tabla8 8iempre que 8e apliquen la8
8iguiente8 regla8


25


Introduccion al SQL

o La8 columna8 8on relacionada8 en orden, de izquierda a derecha.
o Lo8 nombre8 de la8 columna8 8on irrelevante8.
o Lo8 tipo8 de dato8 deben coincidir.
omo ejemplo podemo8 con8ultar 8obre todo8 lo8 nombre8 de empleado que trabajan para lo8
departamento8 100 o 300. 8to 8e con8igue re8tando a todo8 lo8 nombre8 de empleado8, aquello8
que e8tan en el departamento 200.
SQL~ 8elect nombre Irom emp
2 minu8
3 8elect nombre Irom emp here coddep200

NOB#
----------
ano
Lopez
artin
#ecio
#oncal
#ueda
Santana
Sanz
u8te

9 ro8 8elected.


Combinaciones
a8ta ahora hemo8 con8truido con8ulta8 con una unica tabla, pero e8to no debe 8er 8iempre a8i.
De hecho, 8olo 8e alcanza la verdadera potencia del SQL cuando combinamo8 el contenido de ma8
de una tabla.
Supongamo8 que queremo8 con8eguir una li8ta con lo8 empleado8 y lo8 departamento8 para lo8 que
trabajan. 8ta inIormacion e8ta repartida en la8 do8 tabla8 que tenemo8, emp y dep. A8i, podriamo8
intentar una con8ulta que 8eleccionara el campo nombre de la tabla emp y el nombre del
departamento. aqui 8urge el primer problema, como di8tinguimo8 entre do8 columna8 que
llamando8e igual, pertenecen a tabla8 di8tinta8? Para e8o 8e utiliza como preIijo o el nombre de la
tabla (dep.nombre) o un alia8 de tabla, un nombre que 8e a8ocia a cada tabla y 8e coloca como
preIijo a la columna (d.nombre).
#ealicemo8 la con8ulta ...
SQL~ 8elect e.nombre, d.nombre Irom emp e, dep d

NOB# NOB#
---------- ---------------
ano Admini8tracion
#oncal Admini8tracion
#ueda Admini8tracion


2


Introduccion al SQL

artin Admini8tracion
Sanz Admini8tracion
Lopez Admini8tracion
Perez Admini8tracion
Sa8tre Admini8tracion
Garcia Admini8tracion
ateo Admini8tracion
u8te Admini8tracion
#ecio Admini8tracion
Garcia Admini8tracion
Santana Admini8tracion
ano ID
#oncal ID
#ueda ID
...
42 ro8 8elected.

l re8ultado puede 8orprender un poco. Lo que obtenemo8 e8 el producto carte8iano de todo8 lo8
empleado8 por todo8 lo8 departamento8. SQL ha cogido cada Iila de la tabla emp y le ha a8ociado
todo8 lo8 cod_dep de la tabla dep.
Para con8eguir lo que queremo8 tenemo8 que Iorzar que 8e a8ocie a un empleado con el nombre del
departamento para el que trabaja. e8to 8e puede hacer 8i aadimo8 la condicion de que el
cod_dep tenga el mi8mo valor en la Iila de la tabla emp que en la Iila e8cogida de la tabla dep
SQL~ 8elect e.nombre, d.nombre Irom emp e, dep d
2~ here e.coddep d.coddep

NOB# NOB#
---------- ---------------
ano Admini8tracion
#oncal Admini8tracion
#ueda Admini8tracion
artin Admini8tracion
Sanz Admini8tracion
Lopez Admini8tracion
Perez ID
Sa8tre ID
Garcia ID
ateo ID
u8te Produccion
#ecio Produccion
Garcia Produccion
Santana Produccion

14 ro8 8elected.



2


Introduccion al SQL

De la mi8ma manera 8e pueden combinar ma8 de do8 tabla8. Lo importante e8 emparejar lo8 campo8
que han de tener valore8 iguale8.
#eg,s de Combi3,ci3:
O Pueden combinar8e tanta8 tabla8 como 8e de8ee.
O l criterio de combinacion puede e8tar Iormado por ma8 de una pareja de columna8.
O n la clau8ula SELECT pueden citar8e columna8 de amba8 tabla8, condicionen o no la
combinacion.
O Si hay columna8 con el mi8mo nombre en la8 di8tinta8 tabla8, deben identiIicar8e
e8peciIicando la tabla de procedencia o utilizando un alia8 de tabla.
xi8te un tipo e8pecial de combinacion llamada Combi3,ci3 Exter3,. Suponga que 8e crea un
nuevo departamento, (insert into dep values
(400,'Distribucion',''alladolid');) pero todavia no hemo8 a8ignado per8onal al
mi8mo. Si realizamo8 la con8ulta anterior, el nuevo departamento no aparecera en la re8pue8ta. Pero
e8to 8e puede evitar 8i 8ealamo8 en la clau8ula ERE la po8ibilidad de que en la tabla de
empleado8 no exi8ta alguno de lo8 codigo8 de departamento que 8i exi8ta en la tabla de
departamento8. 8to 8e hace colocando un (+) de la 8iguiente manera
SQL~ 8elect e.nombre, d.nombre
2 Irom emp e, dep d
3 here e.coddep()d.coddep

NOB# NOB#
---------- ---------------
ano Admini8tracion
#oncal Admini8tracion
#ueda Admini8tracion
artin Admini8tracion
Sanz Admini8tracion
Lopez Admini8tracion
Perez ID
Sa8tre ID
Garcia ID
ateo ID
u8te Produccion
#ecio Produccion
Garcia Produccion
Santana Produccion
Di8tribucion

15 ro8 8elected.


SubconsuItas
A vece8 8e han de utilizar en una con8ulta lo8 re8ultado8 de otra con8ulta, llamada 8ubcon8ulta.


2


Introduccion al SQL

&n ejemplo de e8to ocurre cuando queremo8 conocer lo8 nombre8 de lo8 empleado8 cuyo 8alario
e8ta por encima de la media
SQL~ 8elect nombre Irom emp
2 here 8alario ~ (8elect avg(8alario) Irom emp)

NOB#
----------
ano
#oncal
Perez
Sa8tre
u8te
#ecio

6 ro8 8elected.

La con8ulta ma8 interna calcula el 8alario medio, y la con8ulta ma8 externa lo utiliza para
8eleccionar lo8 nombre8 que ganan ma8 que la media.
l valor de comparacion puede 8er un valor 8imple, como en el ejemplo anterior, o un conjunto de
valore8. ay que tener en cuenta e8te detalle ya que el tipo de operador a utilizar varia. n el primer
ca8o 8e puede utilizar un operador de comparacion de caracter aritmetico (, ~, etc.). en el
8egundo uno de tipo logico (IN).
La8 8ubcon8ulta8 pueden devolver ma8 de una columna, y 8e habran de comparar de manera
con8ecuente
O La8 columna8 de la clau8ula ERE de la con8ulta principal deben e8tar agrupada8 por
parente8i8.
O La8 columna8 encerrada8 entre parente8i8 deben coincidir en numero y tipo de dato8 con lo8
dato8 que devuelve la 8ubcon8ulta.
l nivel de anidamiento de 8ubcon8ulta8 e8 ilimitado.
Se puede utilizar una 8ubcon8ulta para in8ertar valore8 en una tabla en el momento de la creacion de
la mi8ma con la clau8ula AS. Si qui8ieramo8 crear una tabla con lo8 dato8 de lo8 empleado8 del
departamento 200 lo podriamo8 hacer de la 8iguiente manera
SQL~ create table dep200 (nombre, oIicio)
2 a8 8elect nombre,oIicio Irom emp
3 here coddep200

%able created.

No e8 nece8ario e8peciIicar tipo8 ni tamao8 de la8 columna8, ya que vienen determinado8 por lo8
tipo8 y tamao8 de la8 columna8 recuperada8 en la 8ubcon8ulta.



2


Introduccion al SQL


EIiminacin

uando una tabla ya no e8 util y no vamo8 a volver a nece8itarla debe 8er borrada. 8ta operacion 8e
puede realizar con el comando DRJP TABLE.
DROP TABLE tabla |CASCADE CONSTRA!NTS],

Se borra la tabla de la ba8e de dato8, borrando toda la inIormacion contenida en la tabla, e8 decir,
toda8 la8 Iila8. %ambien 8e borrara toda la inIormacion que 8obre la tabla exi8tiera en el diccionario.
Puede que 8i alguna columna de e8ta tabla a borrar 8irva como clave ajena de alguna tabla detalle,
impida la eliminacion de la tabla, ya que exi8te una re8triccion que requiere de la exi8tencia de la
tabla mae8tra. 8to 8e puede arreglar colocando la coletilla CASCADE CJNSTRAINTS. 8to
produce que la8 re8triccione8 de la tabla detalle 8e borren ante8 de borrar la tabla mae8tra.
La 8iguiente 8entencia produce la eliminacion de la tabla de departamento8.
SQL~ drop table dep ca8cade con8traint8

%able dropped.



Vistas

&na vi8ta e8 como una ventana a trave8 de la cual 8e puede con8ultar o cambiar inIormacion de la
tabla a la que e8ta a8ociada.
La8 vi8ta8 tienen la mi8ma e8tructura que una tabla Iila8 y columna8. La unica diIerencia e8 que
8olo 8e almacena de ella8 la deIinicion, no lo8 dato8. Lo8 dato8 que 8e recuperan mediante una
con8ulta a una vi8ta 8e pre8entaran igual que lo8 de una tabla. De hecho, 8i no 8e 8abe que 8e e8ta
trabajando con una vi8ta, nada hace 8uponer que e8 a8i. Al igual que 8ucede con una tabla, 8e
pueden in8ertar, actualizar, borrar y 8eleccionar dato8 en una vi8ta. Aunque 8iempre e8 po8ible
8eleccionar dato8 de una vi8ta, en alguna8 condicione8 exi8ten re8triccione8 para realizar el re8to de
la8 operacione8 8obre vi8ta8.
!or q: :tiiz,r vist,s?
O La8 vi8ta8 pueden proporcionar un nivel adicional de 8eguridad. Por ejemplo, en la tabla de
empleado8, cada re8pon8able de departamento 8olo tendra acce8o a la inIormacion de 8u8
empleado8. La 8iguiente 8entencia produce la creacion de la vi8ta de lo8 empleado8 del
departamento de admini8tracion (cod_dep=100).

SQL~ create vie ampAdmin a8
2 8elect * Irom ep here coddep100
Vie created.


30


Introduccion al SQL

O La8 vi8ta8 permiten ocultar la complejidad de lo8 dato8. &na BD 8e compone de mucha8
tabla8. La inIormacion de do8 o ma8 tabla8 puede recuperar8e utilizando una combinacion
de do8 o ma8 tabla8, y e8ta8 combinacione8 pueden llegar a 8er muy conIu8a8. reando una
vi8ta como re8ultado de la combinacion 8e puede ocultar la complejidad al u8uario.
O La8 vi8ta8 ayudan a mantener uno8 nombre8 razonable8.
Cre,ci3 de :3, Vist,
CREATE v!EW vista |({columna ,}
+
] AS consulta ,

La vi8ta 8e crea con la8 columna8 que devuelve una con8ulta. Si no no8 importa que la8 columna8 de
la vi8ta hereden lo8 nombre8 de la8 columna8 recuperada8 en la con8ulta no tenemo8 que
e8peciIicarlo8.
orr,do de :3, Vist,
DROP v!EW vista ,


Operaciones sobre Vistas
Co3s:t,s
La8 con8ulta8 8obre la8 vi8ta8 8e tratan de igual modo que 8obre la8 tabla8.
Act:,iz,cio3es
La inIormacion puede 8er actualizada en la8 vi8ta8 directamente o a trave8 de la8 tabla8 8obre la8
que 8e deIinen.
8i8ten alguna8 re8triccione8
Borrado de Iila8 de una tabla a trave8 de una vi8ta
La vi8ta 8e debe crear con Iila8 de una 8ola tabla 8in utilizar la8 clau8ula8 GRJUP BY y
DISTINCT y 8in utilizar Iuncione8 de grupo o reIerencia8 a p8eudocolumna8
(#OWN&).
Actualizacion de Iila8 a trave8 de una vi8ta
La vi8ta ha de e8tar deIinida 8egun la8 re8triccione8 anteriore8 y adema8 ninguna de la8
columna8 a actualizar debe haber 8ido deIinida como una expre8ion.
In8ercion de Iila8 en una tabla a trave8 de una vi8ta
%oda8 la8 re8triccione8 y adema8 toda8 la8 columna8 obligatoria8 de la tabla a8ociada deben
e8tar pre8ente8 en la vi8ta.

Vistas de ms de una TabIa
Se pueden deIinir vi8ta8 8obre ma8 de una tabla. Por ejemplo, 8obre la combinacion de do8 tabla8.
Podemo8 querer ver todo8 lo8 dato8 de lo8 empleado8 del departamento Admini8tracion.
SQL~ create vie depAdmin (codemp, nombreemp, nombredep, dir)
2 a8 8elect e.codemp, e.nombre, d.nombre, d.loc
3 Irom emp e, dep d
4 here e.coddepd.coddep and d.nombre'Admini8tracion'



31


Introduccion al SQL

SQL~ 8elect * Irom depAdmin

ODP NOB#P NOB#DP DI#
---------- ---------- --------------- ----------
101 ano Admini8tracion Valladolid
102 #oncal Admini8tracion Valladolid
103 #ueda Admini8tracion Valladolid
104 artin Admini8tracion Valladolid
105 Sanz Admini8tracion Valladolid
106 Lopez Admini8tracion Valladolid

6 ro8 8elected.



Jugando con Ios Nombres

A continuacion do8 comando8 que permiten jugar con lo8 nombre8 de lo8 objeto8 en SQL
SINJNYM y RENAME.

Sinnimos
SQL permite crear un 8inonimo para una tabla o vi8ta. 8to 8upone que pueden utilizar8e do8
nombre8 diIerente8 para un mi8mo objeto.
Cre,ci3 de :3 Si33imo
CREATE SYNONYN sinonimo FOR |usuario.]{tabla ] vista} ,

orr,do de :3 Si33imo
DROP SYNONYN sinonimo ,

&na primera utilidad de lo8 8inonimo8 e8 la po8ibilidad de independizar la8 aplicacione8 de


lo8 nombre8 Ii8ico8 de la8 tabla8 que manejan. A8i, la8 aplicacione8 haran reIerencia a un
8inonimo de tabla, que en cada ca8o puede e8tar a8ociado a una tabla di8tinta.
Otra utilidad e8 la po8ibilidad de que un u8uario acceda a la8 tabla8 de otro u8uario como 8i
Iueran 8uya8, 8iempre que tenga permi8o para hacerlo, 8i al deIinir el 8inonimo incluye el
nombre del u8uario en la denominacion de la tabla. A8i 8i el u8uarioA tiene permi8o para
leer el contenido de la tabla emp del u8uarioB, entonce8 de8de la ejecucion de la 8entencia
CREATE SYNJNYM plantilla JR usuarioB.emp vera la tabla usuarioB.emp como
plantilla.


32


Introduccion al SQL


Comando RNAM
l comando RENAME 8e utiliza para modiIicar el nombre de una tabla, vi8ta o 8inonimo.
La 8inta8i8 e8 la 8iguiente
RENANE {tabla ] vista ] sinonimo} to nuevoNombre ,

8ta 8entencia cambiara el nombre antiguo por el nuevo, y a partir de e8te momento cualquier
acce8o al objeto por el nombre antiguo 8era re8pondido con un men8aje de error.
onviene re8altar la diIerencia entre el comando SYNJNYM y el comando RENAME. ientra8 que el
primero mantiene el nombre original para acceder al objeto, el 8egundo elimina e8e primer nombre
8u8tituyendolo por el nuevo.


Lo Ms SQL*PIus

n e8te apartado vamo8 a proIundizar un poco en la8 otra8 po8ibilidade8 que no8 brinda SQL*Plu8
en lo8
O Iichero8 de comando8, y
O generacion de inIorme8,

Ficheros de Comandos
Aunque ya vimo8 una introduccion a lo8 Iichero8 de comando8 en anteriormente, vamo8 ahora a
proIundizar un poco en la8 po8ibilidade8 que no8 oIrece SQL*Plu8.
n un Iichero de comando8 8e pueden incluir
O linea8 de comentario8,
O linea8 de ejecucion,
O linea8 de comando8 SQL, y
O linea8 de comando8 SQL*Plu8.
J3e,s de Come3t,rios
Se pueden introducir comentario8 en una archivo de comando8 de tre8 manera8
O &tilizando del comando REM del SQL*Plu8.
O &tilizando lo8 delimitadore8 de comentario de SQL / y /.
O &tilizando lo8 8imbolo8 de comentario PL/SQL "__".
J3e,s de Ejec:ci3
on8tan de una unica barra inclinada, "/", y 8e introducen a continuacion de cada 8entencia SQL
indicando 8u ejecucion.
Su8tituyen al punto y coma, ";" al Iinal de la8 8entencia8 SQL.


33


Introduccion al SQL

J3e,s de Com,3dos SQ
Se puede introducir cualquiera de lo8 comando8 SQL enumerado8 en e8te cur8o, y 8e ejecutaran de
manera 8ecuencial.
Se permite el anidamiento de lo8 Iichero8 de comando8.
J3e,s de Com,3dos SQ!:s
SQL*Plu8 aporta una 8erie de po8ibilidade8 al lenguaje SQL que le acerca un poco ma8 a lo que
entendemo8 como un lenguaje de programacion.
Se pueden deIinir con8tante8 y variable8, capturar dato8 del teclado, introducir parametro8 en la
llamada de un archivo de comando8, y alguna co8a ma8.
V,ri,bes de Us:,rio
Se pueden deIinir Variable8 de u8uario con el comando DEINE
DEF!NE variable = valor
Para borrar una variable 8e utiliza el comando UNDEINE
UNDEF!NE variable

omo ejemplo 8e puede deIinir la variable JICIJ


SQL~ deIine oIicioanali8ta

V,ri,bes de S:stit:ci3
La8 variable8 de 8u8titucion 8on un nombre de variable de u8uario con el 8imbolo delante. uando
SQL*Plu8 detecta una variable de 8u8titucion en un comando, ejecuta el comando tomando el valor
de la variable.
8to 8e puede ver en el ejemplo, donde preguntamo8 por lo8 empleado8 que 8on anali8ta8
SQL~ deIine oIicioAnali8ta
SQL~ deIine tablaemp
SQL~ 8elect nombre, oIicio Irom &tabla here oIicio'&oIicio'
old 1 8elect nombre, oIicio Irom &tabla here oIicio'&oIicio'
ne 1 8elect nombre, oIicio Irom emp here oIicio'Anali8ta'

NOB# OFIIO
---------- -----------
Sa8tre Anali8ta
#ecio Anali8ta

C,pt:r, de D,tos desde e Termi3,


n mucha8 oca8ione8 e8 nece8ario recoger dato8 de8de un terminal, que luego 8eran utilizado8 en el
archivo de comando8. Para realizarlo 8e pueden utilizar do8 medio8 la8 variable8 de 8u8titucion o
lo8 parametro8 en la linea de comando8.
uando SQL*Plu8 reconoce una variable de 8u8titucion 8in valor a8ignado 8e lo pide al u8uario
SQL~ 8elect * Irom dep here nombre'&nombredep'
nter value Ior nombredep ID
old 1 8elect * Irom dep here nombre'&nombredep'


34


Introduccion al SQL

ne 1 8elect * Irom dep here nombre'ID'

ODDP NOB# LO
---------- --------------- ----------
200 ID Boecillo

Si 8e de8ea que SQL*Plu8 pregunte por el valor de la variable al u8uario 8olo la primera vez que 8e
encuentra con ella, 8e colocara "" delante de la variable de u8uario.
%ambien 8e pueden utilizar ha8ta nueve parametro8 en la linea de comando8 cuando 8e llama a la
ejecucion de un archivo de comando8.
n el archivo de comando8 no8 reIeriremo8 a lo8 parametro8 con la8 variable8 1, 2, ... ,9 que 8e
corre8ponden po8icionalmente con ello8.
De8de el archivo de comando8 8e puede hacer reIerencia a lo8 parametro8 cualquier numero de
vece8 y en cualquier orden.
Com,3dos de Com:3ic,ci3 co3 e Us:,rio
Lo8 8iguiente8 comando8 proporcionan un medio de comunicacion con el u8uario
O P#OP% pre8enta un men8aje en la pantalla.
O AP% Solicita un valor y lo almacena en la variable de u8uario que 8e e8peciIique.
O PA&S Obliga al u8uario a pul8ar #eturn de8pue de leer un men8aje.
Para ver como Iuncionan 8irve el 8iguiente ejemplo
prompt Bu8car lo8 dato8 de un empleado.
pau8e Pul8e #eturn.
accept nombremp prompt 'mpleado? '
8elect * Irom emp here nombre'&nombremp'

Otros Com,3dos
Lo8 8iguiente8 comando8 tambien 8e pueden incluir en un archivo de comando8
O ONN% para conectar8e como otro u8uario.
O LP para obtener ayuda en linea.
O I% para dejar SQL*PLu8 y 8alir al Si8tema Operativo.
O DS#IB o DS para obtener inIormacion 8obre la e8tructura de una tabla.
O OS% o ! para ejecutar un comando del Si8tema Operativo.

Generacin de Informes
on SQL*Plu8 podemo8 dar Iorma a lo8 re8ultado8 de la8 con8ulta8 para producir un inIorme.
Podremo8
O ambiar la8 cabecera8 de la8 columna8.
O Dar Iorma a la8 columna8 de tipo number, varchar2, date y long.
O opiar y li8tar atributo8 de pre8entacion de la8 columna8.
O Suprimir valore8 duplicado8 e introducir e8pacio8 para mejorar la pre8entacion.
O #ealizar y mo8trar calculo8 (totale8, media8, minimo8, maximo8, etc.).


35


Introduccion al SQL

O DeIinir la8 dimen8ione8 de la8 pagina8.
O &bicar titulo8 en la cabecera y pie de la8 pagina8.
O Introducir la Iecha o el numero de pagina en lo8 titulo8.
Pero de todo e8to 8olo vamo8 a ver el modo de realizar la8 operacione8 ma8 comune8 y 8encilla8.
Ba8icamente, el Iormato con el que 8e van a pre8entar lo8 re8ultado8 de la8 co8ulta8 dependen de
uno8 parametro8 y de uno8 comando8.
!,rmetros
O S% LINSIZ pone el numero maximo de caractere8 por linea. Por deIecto vale 80 y el
maximo e8 999.
O S% PAGSIZ pone el numero de Iila8 de la 8alida ante8 de empezar una nueva pagina.
Por deIecto e8 25. Incluye el titulo y la8 linea8 de pau8a.
O S% ADING |ON , OFF| Activa/de8activa la utilizacion de encabezado8 de columna8.
Por deIecto e8ta activado.
O S% N&LL texto Indica la cadena de caractere8 que hay que colocar en 8u8titucion de lo8
valore8 N&LL. Por deIecto e8 "".
O S% O |ON , OFF| Activa/de8activa la vi8ualizacion de lo8 comando8 que SQL*Plu8
ejecuta 8egun van 8iendo tratado8. Por deIecto e8ta de8activada.
O S% FDBA | n , ON , OFF| ue8tra el numero de regi8tro8 recuperado8 en cada
con8ulta cuando 8e recuperan n o ma8 regi8tro8. ON 8e pueden con8iderar como n1, y OFF
como n0.
O S% V#IF |ON , OFF| ontrola la 8alida de conIirmacion para lo8 valore8 de la8
variable8 de 8u8titucion. Por deIecto e8ta activado.
Com,3dos
O %%I%L Iormacion del encabezado de pagina.
O B%I%L Iormacion del pie de pagina.
O OL&N Iormatear cada columna.
O B#A punto8 de ruptura en lo8 li8tado8.
O OP&% realizar calculo8 con la8 columna8.