Está en la página 1de 53

1. SQL.(Structure Query Language).

SQL es el lenguaje de consulta universal para bases de datos.


Desde esta opcin vamos a tratar los temas relacionados con SQL ANSI 92, que
es el standar SQL , ya que luego extinten variantes como T-SQL (TransactSQL! y
PL/SQL ("rocedure Language # SQL! que ser$n tratados en sus propias
opciones.
SQL propociona m%todos para de&inir la base datos, para manipular la
in&ormacin y para gestionar los permisos de acceso a dic'a in&ormacin.
"ara que un gestor de bases de datos sea consisderado como relacional, debe
soportar SQL, independientemente de las caracteristicas particulares que dic'o
gestor pueda aportar.
(onocer SQL es conocer las bases de datos, y todo su potencial.
)
2. Intr!ucci"n a SQL.
SQL es el lenguaje de consulta universal para bases de datos.
Los mandatos de SQL se dividen en tres grandes grupos di&erenciados, los
cuales ser$n tratados por separado y que unicamente se presentan aqui a modo
introductorio.
##L(Data De&inition Language!, es el encargado de la de&inicin de *ases de
Datos, tablas, vistas e +ndices entre otros.
Son comandos propios de este lenguaje,
CREATE TABLE
CREATE INDEX
CREATE VIEW
CREATE SYNONYM
#$L(Data -anipulation Language!, cuya misin es la manipulacin de datos. .
trav%s de %l podemos seleccionar, insertar, eliminar y actuali/ar datos. 0s la
parte que m$s &recuentemente utili/aremos, y que con ella se construyen las
consultas.
Son comandos propios de este lenguaje,
SELECT
UPDATE
INSERT
INSERT INTO
DELETE FROM
#%L (Data (ontrol Laguage!, encargado de la seguridad de la base de datos,
en todo lo re&erente al control de accesos y privilegios entre los usuarios.
Son comandos propios de este lenguaje,
GRANT
REVOKE
1
&. %'(nentes !el lengua)e SQL.
&.1. Ti(s !e !ats.
SQL admite una variada gama de tipos de datos para el tratamiento de la
in&ormacin contenida en las tablas, los tipos de datos pueden ser num%ricos
(con o sin decimales!, al&anum%ricos, de &ec'a o booleanos(si o no!. Seg2n el
gestor de base de datos que estemos utili/ando los tipos de datos var+an, pero se
reducen b$sicamente a los expuestos anteriormente, aunque en la actualidad
casi todos los gestores de bases de datos soportan un nuevo tipo, el *L3*
(*inary Large 3bject!, que es un tipo de datos especial destinado a almacenar
arc'ivos, im$genes entre otros.
Dependiendo de cada gestor de bases de datos el nombre que se da a cada uno
de estos tipos puede variar. *$sicamente tenemos los siguientes tipos de datos.
N*'erics Al+an*'erics ,ec-a L"gic .L/.
4nteger c'ar(n! Date *it 4mage
5umeric(n.m! varc'ar(n,m! DateTime Text
Decimal(n,m!
6loat
-as detalladamente tenemos,
Ti(s !e !ats nu'0rics
Ti( #e+inci"n .ytes
4nteger 7alores enteros con signo.
8
5umeric(n,m! 52meros reales de 'asta )9 digitos (con decimales!,
donde n representa el total de d+gitos admitidos
(normalmente denominado precisin! y m el n2mero de
posiciones decimales (escala!.
:);
Decimal(n,m!
4gual que el tipo numeric.
:);
6loat 52mero de coma &lotante, este tipo de datos se suele
utili/ar para los valores en notacin cienti&ica.
89
<
Ti(s !e !ats al+anu'0rics
Ti( #e+inci"n .ytes
c'ar(n! .lmacena de ) a 1:: caracteres al&anum%ricos. 0ste valor
viene dado por n, y es el tama=o utili/ado en disco para
almacenar dato. 0s decir si de&ino un campo como
c'ar(1::!, el tama=o real del campo ser$ de 1::, aunque
el valor solo contenga )>>.
>1::
varc'ar(n! 4gual que el tipo c'ar, con la salvedad que varc'ar
almacena 2nicamente los bytes que contenga el valor del
campo.
>1::
5ota,0l tama=o del campo var+a en &uncin de cada base de datos, siendo 1:: el
valor standart. 0n realidad el tama=o viene delimitado por el tama=o de las
p$ginas de datos, 1?, 8?, 9?.
Ti(s !e !ats +ec-a
Ti( #e+inici"n .ytes
Date .lmacena &ec'as, con d+a, mes y a=o. 9
Datetime .lmacena &ec'as con &ec'a y 'ora 8
5ota,La aparicin de los tipos de datos de &ec'a supuso una aut%ntica revolucin
en el mundo de la bases de datos, en realidad, la base de datos almacena
internamente n2meros enteros, de a'+ que el tama=o sea de 8 y 9 bytes (1
enteros!, pero aporta la validacin del dato introducido.
8
Ti(s !e !ats l"gics
Tipo De&inicin *ytes
*it Tipo bit. .lmacena un > no cero, seg2n las bases de
datos ser$ ) ). Se aplica la lgica booleana, > es &also y
no cero verdadero. 5o soportado para oracle.
) bit
Ti(s !e !ats .L/.
Tipo De&inicin *ytes
4mage .lmacena im$genes en &ormato binario, 'asta un m$ximo
de 1 @b de tama=o.
>1@b
Text .lmacena texto en &ormato binario, 'asta un m$ximo de 1
@b de tama=o.
>1@b
:
&.2. /(era!res.
Los operadores se pueden de&inir como combinaciones de caracteres que se
utili/an tanto para reali/ar asignaciones como comparaciones entre datos.
Los operadores se dividen en aritm%ticos, relacionales, lgicos, y concatenacin .
/(era!res SQL
Arit'0tics 1 Suma
- Aesta
2 "roducto
/ Divisin
22 3 0xponenciacin
4elacinales 5 -enor que
56 -enor o igual que
7 -ayor que
76 -ayor o igual que
57 86 Distinto
85 5o menor que
87 5o mayor que
L"gics AN# Los operadores lgicos permiten comparar
expresiones lgicas devolviendo siempre un valor
verdadero o &also.Los operadores lgicos se evaluan
de i/quierda a derec'a.
/4
N/T
%ncatenaci"n
1
Se emplea para unir datos de tipo al&anum%rico.
B
&.&. Pala9ras %lave.
Las palabras clave son identi&icadores con un signi&icado especial para SQL, por
lo que no pueden ser utili/adas para otro propsito distinto al que 'an sido
pensadas.
SQL dispone de muy pocas rdenes, pero de multiples p$labras clave, lo que le
convierten en un lenguaje sencillo pero tremendamente potente para llevar a
cabo su &uncin.
Pala9ras %lave
.LL .5D .5C .S(
.7@ *0@45 *C (D.A
(D0(? (L3S0 (3E5T (3--4T
(A0.T0 (EAS3A D0(4-.L D0(L.A0
D0L0T0 D0S( D4ST45(T D06.ELT
0F4STS 60T(D 6L3.T 63A
6A3- @A.5T @A3E" D.745@
45 45D0F 45S0AT 45T0@0A
45T3 L4?0 -.F -45
53T 5E-0A4( 35 3"05
3A 3AD0A A073?0 A3LL*.(?
S0L0(T S0T SE- T.*L0
E5435 E54QE0 E"D.T0 ES0A
7.LE0S 740G GD0A0 G4TD
;
&.:. ,uncines Agrega!as.
Las &unciones agregadas proporcionan a SQL utilidades de c$lculo sobre los
datos de las tablas.
0stas &unciones se incorporan en las consultas S;L;%T y retornan un *nic
valr al operar sobre un grupo de registros.
Las &unciones agregadas son.
6unciones .gregadas
$A<() Devuelve el valor m$ximo.
$IN() Devuelve el valor m+nimo.
S=$() Devuelve el valor de la suma de los valores del campo.
%/=NT() Devuelve el n2mero de &ilas que cumplen la condicin
A>?() Devuelve el promedia de los valores del campo
9
&.@. Pre!ica!s.
Los predicados son condiciones que se indican en cl$usula AB;4; de una
consulta SQL.
La siguiente tabla ilustra los predicados de SQL.
"redicados SQL
.;TA;;N...AN# (omprueba que al valor esta dentro de un intervalo
LIC; (ompara un campo con una cadena al&anum%rica. L4?0
admite el uso de caracteres comodines
ALL Se=ala a todos los elementos de la seleccin de la
consulta
AND 4ndica que la condicin se cumplir$ si la comparacin es
cierta para al menos un elemento del conjunto.
;<ISTS Devuelve un valor verdadero si el resultado de una
subconsulta devuelve resultados.
IN (omprueba si un campo se encuentra dentro de un
determinado rango. 0l rango puede ser una sentencia
S0L0(T.
H
:.##L.

:.1. Lengua)e !e #e+inici"n !e !ats (I).
:.1.1. Ta9las.
0l lenguaje de de&inicin de datos (DDL, Data De&inition Language! es el
encargado de permitir la descripcin de los objetos que &orman una base de
datos.
0l lenguaje de de&inicin de datos le va a permitir llevar a cabo las siguientes
acciones,
(reacin de tablas, +ndices y vistas.
-odi&icacin de las estructura de tablas, +ndices y vistas.
Supresin de tablas, +ndices y vistas.
"ero antes de continuar vamos a comentar la nomenclatura que emplearemos, si
tiene alg2n conocimiento de programacin le resultar$ &amiliar.
:.1.2. N'enclatura.
La sintaxis empleada para la sentencias en las di&erentes p$ginas esta basada en
la notacin 0*56 (II!. 7amos a ver el signi&icado de algunos s+mbolos.
SE'9l Signi+ica!
J K
0ncierran par$metros de una orden que el usuario debe sustituir
al escribir dic'a orden por los valores que queramos dar a los
par$metros.
L M
4ndica que su contenido es opcional.
N O
4ndica que su contenido puede repetirse una o mas veces.
P
Separa expresiones. 4ndica que pueden emplearse una u otra
expresin pero no m$s de una a la ve/.
)>
.dem$s las palabras clave aparecen en may2scula negrita y los argumentos en
min2scula cursiva.
La sintaxis de una sentencia tendr$ un aspecto como este,
CREATE TABLE <nombre_tabla>
(
<nombre_campo> <tipo_datos(tamao)>,
{
<nombre_campo> <tipo_datos(tamao)>}
) ;
:.1.&. %reaci"n !e ta9las.
0n el modelo relacional la in&ormacin de una base de datos se almacena en
tablas.
La creacin de la base de datos debe comen/ar por con la creacin de una o m$s
tablas. "ara ello utili/aremos la sentencia %4;AT; TA.L;.
La sintaxis de la sentencia es la siguiente,
%4;AT; TA.L; Jnombre_tb!K
(
Jnombre_"m#oK Jt$#o_%to&'tm(o)K
Lnull P nt nullM Lde&ault J*!or_#or_%e+e"toKM
N
,Jnombre_"m#oK Jt$#o_%to&'tm(o)K
Lnull P nt nullM Lde&ault J*!or_#or_%e+e"toKMO
L
, cnstraint JnombreK (ri'ary Fey (Jnombre_"m#oKL ,...n M!M
L
, cnstraint JnombreK +reign Fey (Jnombre_"m#oKL ,...n M!
re+erences JtablaQre&erenciadaK ( Jnombre_"m#oK L ,...n M ! M
! R
))
0jemplo, 7amos a simular una base de datos para un negocio de alquiler de
coc'es (renta de autos!, por lo que vamos a empe/ar creando una tabla para
almacenar los coc'es que tenemos.
%4;AT; TA.L; t(oc'es
(
matricula c'ar(9! nt null,
marca varc'ar(1::! null,
modelo varc'ar(1::! null,
color varc'ar(1::! null,
numeroQSilometros numeric()8,1! null !e+ault >,
cnstraint "?Q(oc'es (ri'ary Fey (matricula!
! R
0n este ejemplo creamos una tabla llamada t(oc'es con cinco campos
(matricula, marca, modelo, color, numeroQSilometros!.
5tese que se 'an omitido las tildes y los espacios a propsito. 5unca cree
campos que contengan caracteres espec+&icos de un idioma (tildes, e=es, ...! ni
espacios.
Las claves primarias y externas (o &or$neas! se pueden implementar
directamente a trav%s de la instruccin %4;AT; TA.L;, o bien se pueden
agregar a trav%s de sentencias ALT;4 TA.L;.
(ada gestor de bases de datos implementa distintas opciones para la instruccin
%4;AT; TA.L;, pudiendo especi&icarse gran cantidad de par$metros y
pudiendo variar el nombre que damos a los tipos de datos, pero la sintaxis
standart es la que 'emos mostrado aqu+. Si queremos conocer m$s acerca de las
opciones de %4;AT; TA.L; lo mejor es recurrir a la documentacin del
Sistema -anejador de *ase de Datos (S-*D! que se est% utili/ando.
)1
:.1.:. $!i+icaci"n !e ta9las.
0n ocasiones puede ser necesario modi&icar la estructura de una tabla,
com2nmente para a=adir un campo o reestriccin. "ara ello disponemos de la
instrucccin ALT;4 TA.L;.
ALT;4 TA.L; nos va a permitir,
.=adir campos a la estructura incial de una tabla.
.=adir reestriciones y re&erencias.
"ara a=adir un campo a una tabla existente,
ALT;4 TA.L; Jnombre_tb!K
A## JnombreQcampoK Jt$#o_%to&'tm(o)K
Lnull Pnt nullM L!e+ault JvalorQporQde&ectoKM
N
, Jnombre_"m#oK Jt$#o_%to&'tm(o)K
Lnull Pnt nullM L!e+ault JvalorQporQde&ectoKMO R
0jemplo,
ALT;4 TA.L; t(oc'es
A## numQpla/as integer null !e+ault :R
0n este ejemplo a=adimos el campo numQpla/as a la tabla t(oc'es que 'ab+amos
creado en el apartado anterior.
"ara a=adir una clave primaria vamos a crear una tabla de cliente y le
a=adiremos la clave primaria ejecutando una sentencia alter table,
)<
CREATE TABLE tClientes
(
codigo integer not null,
nombre varchar(255) not null,
apellidos varchar(255) null,
nif varchar(!) null,
telefono varchar(") null,
movil varchar(") null
);
ALTER TABLE tClientes ADD
CONSTRAINT #$%tClientes primary key (codigo);
(reamos la tabla clientes y le a=adimos una reestriccin primary Sey a la que
damos el nombre "?Qt(lientes en el campo codigo.
Solo podemos modi&icar una 2nica tabla a la ve/ con .LT0A T.*L0, para
modi&icar m$s de una tabla debemos ejecutar una sentencia .LT0A T.*L0 por
tabla.
"ara a=adir una clave externa (o &oranea! necesitamos una tercera tabla en
nuestra estructura. "or un lado tenemos la tabla t(oc'es y la tabla t(lientes,
a'ora vamos a crear la tabla t.lquileres que ser$ la encargada de TdecirnosT que
clientes 'an alquilado un coc'e.
CREATE TABLE t&l'uileres
(
codigo integer not null,
codigo%cliente integer not null,
matricula char(() not null,
f)%al'uiler datetime not null,
f)%devolucion datetime null
);

ALTER TABLE t&l'uileres ADD
CONSTRAINT #$%t&l'uileres primary key (codigo),
CONSTRAINT *$%Clientes foreign key (codigo%cliente)
references tClientes (Codigo),
CONSTRAINT *$%Coches foreign key (matricula)
references tCoches (matricula);
*ien, en este cdigo creamos la tabla t.lquileres, y luego mediante una
sentencia .LT0A T.*L0 a=adimos una clave primaria llamada "?Qt.lquileres en
el campo codigo, una clave externa llamada 6?Q(lientes re&erenciada al codigo
)8
de la tabla t(lientes, y por 2ltimo otra clave externa llamada 6?Q(oc'es
re&erenciada al campo matricula de la tabla t(oc'es.
5ota, (uando creamos una clave externa el campo re&erenciado y el que sirve de
re&erencia deben ser del mismo tipo de datos.
Si somos observadores nos daremos cuenta que los campos que sirven de
re&erencia a las claves &or$neas son las claves primarias de sus tablas. Slo
podemos crear claves externas que re&erencien claves primarias.
.l igual que ocurr+a con la sentencia %4;AT; TA.L; cada manejador de bases
de datos implementa sus mejoras, siendo la mejor &orma de conocerlas recurrir a
la documentacin del gestor de bases de datos.
0n principio, para borrar columnas de una tabla debemos,
). (rear una tabla con la nueva estructura.
1. Trans&erir los datos
<. *orrar la tabla original.
y digo en principio, porque como ya 'emos comentado seg2n el manejador de
bases de datos con el que trabajemos podremos reali/ar esta tarea a trav%s de
una sentencia ALT;4 TA.L;.
:.1.@. ;li'inaci"n !e ta9las.
"odemos eliminar una tabla de una base de datos mediante la instruccion #4/P
TA.L;.
#4/P TA.L; Jnombre_tb!KR
La instruccin #4/P TA.L; elimina de &orma permanente la tabla y los datos
en ella contenida.
Si intenta eliminar una tabla que tenga registros relacionados a trav%s de una
clave externa la instruccin #4/P TA.L; &allar$ por integridad re&erencial.
(uando se elimina una tabla eliminamos tambi%n sus +ndices.
):
:.2. Lengua)e !e !e+inici"n !e !ats (II).
:.2.1. #e+inici"n !e Gn!ices.
En +ndice es una estructura de datos que permite acceder a di&erentes &ilas de
una misma tabla a trav%s de un campo (o campos clave!.
En +ndice permite un acceso muc'o m$s r$pido a los datos.
:.2.2.Intr!ucci"n a ls En!ices.
"ara entender lo que es un +ndice se debe saber primero como se almacena la
in&ormacin internamente en las tablas de una base de datos.
(ada tabla se divide en p$ginas de datos, imaginemos un libro, podriamos
escribirlo en Tuna sola 'oja enormeT al estilo pergamino egipcio, o bien en
p$ginas a las que podemos acceder r$pidamente a traves de un +ndice. 0st$ idea
es la que se aplica en el mundo de las bases de datos, la in&ormacin est$
guardada en una tabla (el libro! que tiene muc'as 'ojas de datos (las p$ginas del
libro!, con un +ndice en el que podemos buscar la in&ormacin que interesa.
Si queremos buscar la palabra /apato en un diccionario , Uqu% 'acemosI
Leemos todo el diccionario 'asta encontrar la palabra, con lo que nos
'abremos leido el diccionario enterito.
*uscamos en el +ndice en que p$gina est$ la letra /, y es en esa p$gina
donde buscamos.
La opcin dos es la correcta, y es de este modo como se utili/a un +ndice en las
bases de datos, se de&ine el +nidice a trav%s de un campo (o campos! y es a partir
de este punto desde donde de busca.
)B
Los +ndices se actuali/an autom$ticamente cuando se reali/an operaciones de
escritura en la base de datos. 0ste es un aspecto muy importante de cara al
rendimiento de las operaciones de escritura, ya que adem$s de escribir los datos
en la tabla se escribir$n tambi%n en el +ndice. En n2mero elevado de +ndices 'ar$
m$s lentas %stas operaciones. Sin embargo, salvo casos excepcionales, el
bene&icio que aportan los +ndices compensa (de largo! %sta penali/acin.
:.2.&. %reaci"n !e En!ices.
La creacin de +ndices, como ya 'emos visto, permite acelerar las consultas que
se reali/an en la base de datos.
Las sentencias de SQL para manipular +ndices son,
CREATE INDEX;
DROP INDEX;
La sintaxis para la creacin de indices es la siguiente,
CREATE +UNIQUE, INDEX <nombre%indice>
ON <nombre%tabla>(
<nombre%campo> +ASC - DESC,
{,<nombre%campo> +ASC - DESC,})
);
);
La p$labra clave =NIQ=; especi&ica que no pueden existir claves duplicadas en
el +ndice.
AS% P #;S% especi&ican el criterio de ordenacin elegido, ascendente o
descendente, por de&ecto es ascendente.
0jemplo, 0n el apartado dedicado a la de&inicin de tablas creamos la tabla
t(lientes, este ejemplo crea un +ndice 2nico en el campo 546. 0sto nos permitir$
buscar muc'o mas r$pido por el campo 546 y nos asegurar$ que no tengamos
dos 546 iguales.
CREATE UNIQUE INDEX ./0%C1/23425%3/*
ON tC1/23425 (3/*);
Las claves primarias son +ndices.
:.2.:. ;li'inaci"n !e En!ices.
Los nombres de los +ndices deben ser 2nicos.
"ara eliminar un +ndice debemos emplear la sentencia #4/P IN#;<.
DROP INDEX <nombre%tabla>6<nombre%indice>;
0jemplo,"ara eliminar el +ndice creado anteriormente.
DROP INDEX tC1/234256./0%C1/23425%3/*;
)9
:.&. Lengua)e !e !e+inici"n !e !ats (III).
:.&.1. >istas.
0n el modelo de datos relacional la &orma de guardar la in&ormacin no es la
mejor para ver los datos
Ena vista es una consulta, que re&leja el contenido de una o m$s tablas, desde la
que se puede acceder a los datos como si &uera una tabla.
Dos son las principales ra/ones por las que podemos crear vistas.
Seguridad, nos pueden interesar que los usuarios tengan acceso a una
parte de la in&ormacin que 'ay en una tabla, pero no a toda la tabla.
(omodidad, como 'emos dic'o el modelo relacional no es el m$s cmodo
para visuali/ar los datos, lo que nos puede llevar a tener que escribir
complejas sentencias SQL, tener una vista nos simpli&ica esta tarea.
Las vistas no tienen una copia &+sica de los datos, son consultas a los datos que
'ay en las tablas, por lo que si actuali/amos los datos de una vista, estamos
actuali/ando realmente la tabla, y si actuali/amos la tabla estos cambios ser$n
visibles desde la vista.
5ota, 5o siempre podremos actuali/ar los datos de una vista, depender$ de la
complejidad de la misma (depender$ de si el cojunto de resultados tiene acceso a
la clave principal de la tabla o no!, y del gestor de base de datos. 5o todos los
gestores de bases de datos permiten actuali/ar vistas, 3A.(L0, por ejemplo, no
lo permite, mientrar que SQL Server si. ("robar esta anotacin!.
)H
:.&.2. %reaci"n !e vistas.
"ara crear una vista debemos utili/ar la sentencia %4;AT; >I;A,
debiendo proporcionar un nombre a la vista y una sentencia SQL S;L;%T
v$lida.
CREATE IE! <nombre%vista>
AS
(<sentencia%select>);
0jemplo, (rear una vista sobre nuestra tabla alquileres, en la que se nos muestre
el nombre y apellidos del cliente en lugar de su cdigo.
CREATE IE! "A#$%i#eres
AS
(
SELECT nombre,
apellidos,
matricula
&RO' t&l'uileres,
tClientes
!(ERE ( t&l'uileres6codigo%cliente 7 tClientes6codigo )
)
Si queremos, modi&icar la de&inicin de nuestra vista podemos utili/ar la
sentencia ALT;4 >I;A, de &orma muy parecida a como lo 'aciamos con las
tablas. 0n este caso queremos a=adir los campos &xQalquiler y &xQdevolucion a la
vista.
ALTER IE! v&l'uileres
AS
(
SELECT nombre,
apellidos,
matricula,
f)%al'uiler,
f)%devolucion
&RO' t&l'uileres,
tClientes
!(ERE ( t&l'uileres6codigo%cliente 7 tClientes6codigo )
)
1>
"or 2ltimo podemos eliminar la vista a trav%s de la sentencia #4/P >I;A. "ara
eliminar la vista que 'emos creado anteriormente se uitli/ar+a,
DROP IE! v&l'uileres;
Ena vista se consulta como si &uese una tabla.
:.&.&. Sin"ni's.
En sinnimo es un nombre alternativo que identi&ica un tabla en la base de
datos. (on un sinnimo se pretende normalmente simplicar el nombre original
de la tabla, aunque tambien se suelen utili/ar para evitar tener que escribir el
nombre del propietario de la tabla.
N t!as las 9ases !e !ats s(rtan ls sin"ni's.
"ara crear un sinnimo 'ay uque utili/ar la sentencia %4;AT; SDN/ND$
especi&icando el nombre que deseamos utili/ar como sinnimo y la tabla para la
que estamos creando el sinnimo.
CREATE S)NON)' <nombre%sinonimo>
&OR <nombre%tabla>;
0jemplo, 0l siguente ejemplo crea el sinnimo (oc'es para la tabla t(oc'es.
CREATE S)NON)' Coches
&OR tCoches;
"ara eliminar el sinnimo creado debemos emplear la sentencia #4/P
SDN/ND$.
DROP S)NON)' Coches;
1)
@. #$L
@.1. Lengua)e !e 'ani(ulaci"n !e !ats (I)
@.1.1. %nsulta !e !ats.
0l proceso m$s importate que podemos llevar a cabo en una base de datos es la
consulta de los datos. De nada servir+a una base de datos si no
puedi%ramos consultarla. 0s adem$s la operacin que e&ectuaremos con mayor
&recuencia.
"ara consultar la in&ormacin SQL pone a nuestra disposicin la sentencia
S;L;%T.
La sentencia S;L;%T nos permite consultar los datos almacenados en una tabla
de la base de datos.
0l &ormato de la sentencia select es,
S;L;%T LALL H #ISTIN%T M
Jnombre_"m#oK LN,Jnombre_"m#oKOM
,4/$ Jnombre_tb!KPJnombre_*$&tK
LN,Jnombre_tb!KPJnombre_*$&tKOM
LAB;4; J"on%$"$onK LN AN#P/4 JcondicionKOMM
L?4/=P .D Jnombre_"m#oK LN,Jnombre_"m#o KOMM
LBA>IN? J"on%$"$onKLN AN#P/4 JcondicionKOMM
L/4#;4 .D Jnombre_"m#oKPJindiceQcampoK LAS% P #;S%M
LN,Jnombre_"m#oKPJindiceQcampoK LAS% P #;S% MOMM

7eamos por partes que quiere decir cada una de las partes que con&orman la
sentecia.
11
Pala9ra Signi+ica!
S;L;%T
"alabra clave que indica que la sentencia de SQL que
queremos ejecutar es de seleccin.
ALL
4ndica que queremos seleccionar todos los valores.0s el
valor por de&ecto y no suele especi&icarse casi nunca.
#ISTIN%T
4ndica que queremos seleccionar slo los valores distintos.
,4/$
4ndica la tabla (o tablas! desde la que queremos recuperar
los datos. 0n el caso de que exista m$s de una tabla se
denomina a la consulta Tconsulta combinadaT o TjoinT. 0n las
consultas combinadas es necesario aplicar una condicin de
combinacin a trav%s de una cl$usula AB;4;.
AB;4;
0speci&ica una condicin que debe cumplirse para que los
datos sean devueltos por la consulta. .dmite los operadores
lgicos AN# y /4.
?4/=P .D
0speci&ica la agrupacin que se da a los datos. Se usa
siempre en combinacin con &unciones agregadas.
BA>IN?
0speci&ica una condicin que debe cumplirse para los
datos0speci&ica una condicin que debe cumplirse para que
los datos sean devueltos por la consulta. Su &uncionamiento
es similar al de AB;4; pero aplicado al conjunto de
resultados devueltos por la consulta. Debe aplicarse siempre
junto a ?4/=P .D y la condicion debe estar re&erida a los
campos contenidos en ella.
/4#;4 .D
"resenta el resultado ordenado por las columnas indicadas.
0l orden puede expresarse con AS% (orden ascendente! y
#;S% (orden descendente!. 0l valor predeterminado es
AS%.
"ara &ormular una consulta a la tabla t(oc'es (creada en el cap+tulo de tablas! y
recuperar los campos matricula, marca, modelo, color, numeroQSilometros,
numQpla/as debemos ejecutar la siguiente consulta. Los datos seran devueltos
ordenados por marca y por modelo en orden ascendente, de menor a mayor.
1<
S;L;%T matricula,
marca,
modelo,
color,
numeroQSilometros,
numQpla/as
,4/$ t(oc'es
/4#;4 .D marca,modeloR
La palabra clave ,4/$ indica que los datos ser$n recuperados de la tabla
t(oc'es. "odr+amos 'aber especi&icado mas de una tabla, pero esto se ver$ en el
apartado de consultas combinadas.
Tambien podr+amos 'aber simplicado la consulta a trav%s del uso del comod+n de
campos, el asterisco TVT.
S;L;%T V
,4/$ t(oc'es
/4#;4 .D marca,modeloR
0l uso del asterisco indica que queremos que la consulta devuelva todos los
campos que existen en la tabla.
@.1.2. La clIusula AB;4;
La cl$usula AB;4; es la instruccin que nos permite &iltrar el resultado de una
sentencia S;L;%T. Dabitualmente no deseamos obtener toda la in&ormacin
existente en la tabla, sino que queremos obtener slo la in&ormacin que nos
resulte 2til es ese momento. La cl$usula AB;4; &iltra los datos antes de ser
devueltos por la consulta.
0n nuestro ejemplo, si queremos consultar un auto en concreto debemos agregar
una cl$usula AB;4;. 0sta cl$usula especi&ica una o varias condiciones que
deben cumplirse para que la sentencia S;L;%T devuelva los datos. "or ejemplo,
para que la consulta devuelva slo los datos del coc'e con matr+cula -):1:W.
debemos ejecutar la siguiente sentencia,
18
S;L;%T matricula,
marca,
modelo,
color,
numeroQSilometros,
numQpla/as
,4/$ t(oc'es
AB;4; matricula X Y-):1:W.YR

(uando en una cl$usula Z'ere queremos incluir un tipo texto, debemos incluir el
valor entre comillas simples.
.dem$s, podemos utili/ar tantas condiciones como queramos, utili/ando los
operadores lgicos AN# y /4 . 0l siguiente ejemplo muestra una consulta que
devolver$ los coc'es cuyas matr+culas sean -):1:W. o bien -1:BB...
S;L;%T matricula,
marca,
modelo,
color,
numeroQSilometros,
numQpla/as
,4/$ t(oc'es
AB;4; matricula X Y-):1:W.Y
/4 matricula X Y-1:BB..Y R
.dem$s una condicin AB;4; puede ser negada a trav%s del operador lgico
N/T. La siguiente consulta devolver$ todos los datos de la tabla t(o'es menos el
que tenga matricula -):1:W..
S;L;%T matricula,
marca, modelo, color,
numeroQSilometros,
numQpla/as
,4/$ t(oc'es
AB;4; N/T matricula X Y-):1:W.Y R
1:
"odemos tambi%n obtener las di&erentes marcas y modelos de auots ejecutando
la consulta.
S;L;%T #ISTIN%T marca,
modelo
,4/$ t(oc'esJ
0n el caso anterior se devolver$n la palabra clave #ISTIN%T indica que slo
queremos os valores distintos del par &ormado por los campos marca y modelo.
@.1.&. La clIusula /4#;4 .D
(omo ya 'emos visto en los ejemplos anteriores podemos especi&icar el orden en
el que ser$n devueltos los datos a trav%s de la cl$usula /4#;4 .D.
S;L;%T matricula,
marca,
modelo,
color,
numeroQSilometros,
numQpla/as
,4/$ t(oc'es
/4#;4 .D marca AS%,modelo #;S%R
1B
(omo se puede ver en el ejemplo se puede especi&icar la ordenacin ascendente
o descendente a trav%s de las palabras clave AS% y #;S%. La ordenacin
depende del tipo de datos que est% de&inido en la columna, de &orma que un
campo num%rico ser$ ordenado como tal, y un al&anum%rico se ordenar$ de la .
a la W, aunque su contenido sea num%erico. De esta &orma el valor )>> se
devuelve antes que el )).
Tambi%n podemos especi&icar el en la cl$usula /4#;4 .D el +ndice n2merico
del campo dentro del la sentencia S;L;%T para la ordenacin, el siguiente
ejemplo ordenar+a los datos por el campo marca, ya que aparece en segundo
lugar dentro de la lista de campos que componen el S;L;%T.
S;L;%T matricula,
marca,
modelo,
color,
numeroQSilometros,
numQpla/as
,4/$ t(oc'es
/4#;4 .D 1R
0l resto de opciones que podemos especi&icar al construir sentencias S;L;%T se
ir$n presentando en los siguientes cap+tulos de este tutorial.
1;
@.2. Lengua)e !e 'ani(ulaci"n !e !ats (II).
@.2.1. Insertar !ats.
Dasta a'ora 'emos visto como se almacenan los datos en una base de datos y
como consultar esos datos almacenados, pero no 'emos visto como almacenar
dic'os datos.
"ara almacenar datos en una base de datos debemos insertar &ilas en las tablas.
"ara ellos SQL pone a nuestra disposicin la sentencia INS;4T.
Inserci"n !e +ilas.
0l proceso de insercin de &ilas consiste en a=adir a una tabla una o m$s &ilas y
en cada &ila todos o parte de sus campos.
"odemos distinguir dos &ormas de insertar &ilas,
4nsercin individual de &ilas.
4nsercin m2ltiple de &ilas.
La sintaxis de la sentencia INS;4T es di&erente seg2n cual sea nuestro
propsito.
Slo podremos omitir un campo al e&ectuar una insercin cuando %ste acepte
valores nulos.
19
@.2.1.1. Inserci"n in!ivi!ual !e +ilas.
"ara reali/ar la inserccin individual de &ilas SQL posee la instruccin INS;4T
INT/. La inserccin individual de &ilas es la que m$s comunmente utili/aremos.
Su sintaxis es la siguiente,
INSERT INTO <nombre_tabla>
+(<campo1>+,<campo2>,666,),
"a#%es
(<valor1>,<valor2>,666);
(omo se puede observar la sentencia tiene dos partes claramente di&erenciadas,
por un lado la propia INS;4T INT/ seguida de la lista de campos en los que
queremos insertar los datos, y por otro la lista de valores que queremos insertar
en los campos. La mejor &orma de ver esto es a trav%s de un ejemplo.
INSERT INTO tCoches
(matricula,
marca ,
modelo ,
color ,
numero%8ilometros)
"a#%es
(9:C&9,
9;23&.149,
9:2<&32 4;!!9,
932<;= >/&:&3429,
?(!!!);
3ota@Aemos utiliBado el color roCo para los datos de tipo te)to,
entrecomillados con la comilla simple, D el aBul para
los numericos6
(on esta sentencia INS;4T creamos un registro en la tabla t(oc'es con los
valores especi&icados, es decir, la matricula tendr$ el valor -))))(., la marca
ser$ A05.ELT y as+ sucesivamente.
UQue ocurrir+a si ya existiera un coc'e con la matricula -))))(.I Se
producir$ un error, porque 'emos de&inido la clave primaria en el campo
matr+cula, y como 'emos visto la clave primaria debe ser 2nica.
1H
Si omitimos alg2n par T campovalor T en la sentencia INS;4T, pueden ocurrir
varias cosas,
Que se produ/ca un error , si el campo no acepta valores nulos.
Que se grave el registro y se deje nulo el campo, cuando el campo acepte
valores nulos.
Que se grave el registro y se tome el valor por de&ecto, cuando el campo
tenga de&inido un valor por de&ecto.
Que 'acer en cada cada momento depender$ del programa.
"or ejemplo, la siguiente sentencia crear$ un registro en la tabla t(oc'es con el
campo numeroQSilometros cero, ya que este es su valor por de&ecto.
INSERT INTO tCoches
(matricula,
marca ,
modelo ,
color)
"a#%es
(9:C&9,
9;23&.149,
9:2<&32 4;!!9,
932<;= >/&:&3429);
@.2.1.2. Inserci"n '*lti(le !e +ilas.
La sentencia INS;4T permite tambien insertar varios registros en una tabla.
"are ello se utili/a una combinacin de la sentencia INS;4T junto a una
sentencia S;L;%T. 0l resultado es que se insertan todos los registros devueltos
por la consulta.
INSERT INTO <nombre_tabla>
+(<campo1>+,<campo2>,666,),
SELECT
+(<campo1>+,<campo2>,666,),
&RO'
<nombre_tabla_origen>;
<>
"ara poder utili/ar la insercin multiple de &ilas se deben cumplir las siguientes
normas,
La lista de campos de las sentencias insert y select deben coincidir en
n2mero y tipo de datos.
5inguna de las &ilas devueltas por la consulta debe in&ringir las reglas de
integridad de la tabla en la que vayamos a reali/ar la insercin.
"ongamos un ejemplo, vamos a crear una tabla con las di&erentes marcas que
tenemos en la base de datos. La sentencia SQL para crear la tabla es la
siguiente,
CREATE TABLE t:arcas
(
codigo integer not null i*en+i+y(,),
marca varchar(255),
cons+rain+ #$%:arcas primary key (codigo)
);
3ota@ Aemos incluido la funciEn identitD para el campo codigo, esta
funciEn es propia de 5F1 5erver e indica 'ue
el cEdigo se genera automGticamente cada veB 'ue se inserta un registro
con un valor autonumHrico6 #raticamente
todos los gestores de bases de datos dan la opciEn del campo autonumerico
o incremental, si bien el modo varias6
#ara 5F1 5erver utiliBaremos la funcion identitD, para =;&C12 las
secuencias 666
Ena ve/ que tenemos creada la tabla de marcas vamos a insetar otro par de
registros en la tabla de coc'es, para ello utili/amos una sentencia insert int
para una 2nica &ila.
INSERT INTO tCoches
(matricula, marca , modelo , color)
"a#%es
(9:22II*A9, 952&49, 912=3 *;9, 9;=J=9);

INSERT INTO tCoches (matricula, marca , modelo, color)
"a#%es
(9:II2*K9, 9*=;>9, 9*/254&9, 9<;/5 #1&4&9);
.'ora tenemos tres marcas di&erentes en la tabla t(oc'es, y queremos
insertarlas en la tabla de marcas, para ello podemos reali/ar tres inserciones
individuales, pero Uque pasar+a si no supi%ramos de antemano el n2mero de
marcasI Uy si &ueran unas cincuenta marcasI.
<)
.&ortunadamente podemos reali/ar una insercin multiple del siguiente modo,
INSERT INTO t:arcas
(marca)
SELECT DISTINCT marca &RO' tCoches;
(omo resultado obtenemos un registro en la tabla t-arcas por cada marca de la
tabla t(oc'es. 0l campo codigo se 'a generado autom$ticamente ya que est$
de&inido como identidad.
%/#I?/ $A4%A
) 63AD
1 A05.ELT
<
S0.T
Day que darnos cuenta de que el orden de generacin no 'a sido el mismo que el
de insercin, sino que se 'a aplicado el orden en el que 'an sido devueltos los
datos por la sentencia S0L0(T.
.'ora deber+amos cambiar los datos de la tabla t(oc'es, para guardar el cdigo
de la marca en lugar de su descripcin, pero para ello necesitamos saber como
modi&icar un dato grabado.
<1
@.2.2. .rra! !e !ats.
@.2.2.1. La sentencia #;L;T;.
"ara borrar datos de una tabla, debemos utili/ar la sentencia #;L;T;.
La sintaxis de la sentencia #;L;T; es la siguiente,
DELETE &RO' <nombre_tabla>
+ !(ERE <condicion>,;
0l siguiente ejemplo ilustra el uso de la sentencia #;L;T;. 0s buena idea
especi&icar en la sentencia AB;4; los campos que &orman la clave primaria de
la tabla para evitar borrar datos que no queramos eliminar.
DELETE &RO' tCoches
!(ERE marca 7 952&49;
(uando trabajemos con la sentencia #;L;T; debemos tener en cuenta las
siguientes consideraciones,
Solo podemos borrar datos de una 2nica tabla.
(uando borramos datos de una vista, los estamos borrando tambi%n de la
tabla. Las vistas son solo una &orma de ver los datos, no una copia.
Si intentamos borrar un registro de una tabla re&erenciada por una
,/4;IN? C;D como tabla maestra, si la tabla dependiente tiene registros
relacionados la sentencia #;L;T; &allar$.
<<
@.2.2.2. La sentencia T4=N%AT;.
"ara reali/ar un borrado completo de tabla debemos considerar la posibilidad de
utili/ar la sentencia T4=N%AT;, muc'o m$s r$pida que #;L;T;.
La sintaxis de la sentencia T4=N%AT; es la siguiente,
TRUNCATE TABLE <nombre_tabla>;
0l siguiente ejemplo muestra el uso de la sentencia T4=N%AT;.
TRUNCATE TABLE tCoches;
(uando trabajemos con la sentencia T4=N%AT; debemos tener en cuenta las
siguientes consideraciones.
La sentencia T4=N%AT; no es transaccional. 5o se puede des'acer.
La sentencia T4=N%AT; no admite clausula AB;4;. *orra toda la tabla.
5o todos los gestores de bases de datos admiten la sentencia T4=N%AT;.
<8
@.2.&. ActualiKaci"n !e !ats.
@.2.&.1. La sentencia =P#AT;.
"ara la actuali/acin de datos SQL dispone de la sentencia =P#AT;. La
sentencia =P#AT; permite la actuali/acin de uno o varios registros de una
2nica tabla. La sintaxis de la sentencia =P#AT; es la siguiente ,
UPDATE <nombre_tabla>
SET <campo1> 7 <valor1>
{+,<campo2> 7 <valor2>,666,<campoN> 7 <valorN>,}
+ !(ERE <condicion>,;
Las siguientes sentencias actuali/an los datos de la tabla t(oc'es con los valores
de la tabla t-arca obtenidos anteriormente.
UPDATE tCoches
SET marca 7 99
!(ERE marca 7 9*=;>9;

UPDATE tCoches
SET marca 7 929
!(ERE marca 7 9;23&.149;

UPDATE tCoches
SET marca 7 9I9
!(ERE marca 7 952&49;
5tese que los valores para el campo marca aparecen entrecomillados, ya
que es un campo de tipo varc-ar. Los valores con los que actualicemos los datos
deben ser del tipo del campo.
En aspecto a tener en cuenta es que los campos que &orman la (ri'ary Fey de
una tabla slo se podr$n modi&icar si los registros no est$n re&erenciados en
ninguna otra tabla. 0n nuestro caso slo podremos modi&icar la matr+cula de un
coc'e si no tiene registros asociados en la tabla t.lquileres.
0sto puede causar poblemas, ya que podr+amos 'abernos equivocado al dar de
alta el coc'e en la tabla t(oc'es y detectar el error despues de alquilar el coc'e.
0n tal caso tendr+amos dar de alta un nuevo coc'e con la matr+cula correcta,
actuali/ar los registros de la tabla alquileres y por 2ltimo borrar el registro
erroneo de la tabla t(oc'es. 0ste proceso puede ser bastante complicado en el
caso de que existieran m$s relaciones con la tabla.
<:
Se podr+a considerar que la clave primaria de la tabla esta mal de&inida y que la
matr+cula no debe ser el elemento que identi&ique el coc'e. Ena alternativa ser+a
crear un cdigo autonum%rico para la tabla t(oc'es que reali/ar$ las veces de
clave primaria y crear un +ndice 2nico para la matr+cula, %ste dise=o tambien
tiene sus TlimitantesT, por lo que debemos decidir que modelo utili/ar, y
seleccionar las claves primarias con sumo cuidado.
@.2.&.2. =s !e su9cnsultas cn =P#AT;.
0l uso de subconsultas es una t%cnica avan/ada de consulta que veremos
con detalle m$s adelante, pero que tratamos aqu+ de &orma introductoria.
Dasta a'ora 'emos actuali/ado los datos con valores que conocemos de
antemano, Upero qu% ocurre cuando esos datos deben tomarse de otra tabla de
la base de datosI. "odr+amos dise=ar un programa que recorriera toda la tabla y
buscara el valor adecuado para cada registro y lo actuali/ase. Sin duda es una
solucin, y en ocasiones cas+ la 2nica, pero es una solucin cara y compleja que
adem$s exige que cono/camos alg2n otro lenguaje de programacin. "ara estos
casos podemos utili/ar subconsultas con la sentencia =P#AT;.
La sintaxis es la siguiente,
UPDATE <nombre%tabla>
SET <campo> 7 <valor> - <subconsulta>
{+,<campo2> 7 <valor2> - <subconsulta2>
,666
, <campo3> 7 <valor3> - <subconsulta3>,}
+ !(ERE <condicion>,;
(omo puede verse la sintaxis es pr$cticamente igual a la sintaxis del la
sentencia =P#AT;, con la salvedad de que podemos utili/ar subconsultas en
lugar de valores al asignar los campos. De &orma generica podemos decir que las
subconsultas son consultas S;L;%T incluidas dentro de otra sentencia SQL.
<B
Las siguientes sentencias =P#AT; son equivalentes,
U+i#i,an*o sen+encias UPDATE norma#es-
UPDATE tCoches
SET marca 7 99
!(ERE marca 7 9*=;>9;
UPDATE tCoches
SET marca 7 929
!(ERE marca 7 9;23&.149;
UPDATE tCoches
SET marca 7 9I9
!(ERE marca 7 952&49;
.tiliBando sentencias .#>&42 combinadas con subconsultas@
UPDATE tCoches
SET marca 7 (SELECT C=>/<= &RO' t:arcas
!(ERE t:arcas6:arca 7 tCoches6:arca )
!(ERE marca IN (9*=;>9,9;23&.149,952&49);
"or cada registro de la tabla t(oc'es se ejecutar$ la subconsulta, actuali/ando el
campo marca a el valor del cdigo de la marca en la tabla t-arcas.
0l uso de subconsultas para actuali/ar datos tiene algunas limitaciones,
La subconsulta slo puede devover un 2nico campo.
La subconsulta slo puede devolver un slo registro.
0l tipo de datos devuelto por la subconsulta debe ser del mismo tipo que el
campo al que estamos asignando el valor.
5o todos los sistemas de bases de datos permiten usar subconsultas para
actuali/ar datos aunque si una buena parte de ellos (3A.(L0, SQL Server,
Sybase ...!
"ero en nuestro ejemplo el campo codigo de la tabla t-arcas es num%rico y el
campo marca de la tabla t(oc'es es texto. U"or qu% &uncionaI -uy &$cil, el
motor de la base de datos es capa/ de convertir el valor num%rico a un valor
texto de &orma autom$tica, si bien esta es una excepcin.
.'ora que ya tenemos modi&icado el valor de la marca de los registros, es
conveniente modi&icar su tipo de datos y crear una &oreign Sey contra la tabla
t-arcas. "ara ello ejecutaremos las siguientes sentencias.
<;
ALT;4 TA.L; t(oc'es
alter clu'n marca int nt nullJ
La opcion alter column es propia de SQL Server. "ara modi&icar el
tipo de datos de una tabla debemos consultar la ayuda del gestor
de bases de datos.
ALT;4 TA.L; t(oc'es
a!! cnstraint 6?Q(oc'esQ-arcas +reign Fey (marca!
re+erences t-arcas (codigo!R
<9
L. %nsultas c'9ina!as. M/INS.
L.1. %nsultas c'9ina!as.
Dabitualmente cuando necesitamos recuperar la in&ormacin de una base de
datos nos encontramos con que dic'a in&ormacin se encuentra repartida en
varias tablas, re&erenciadas a trav%s de varios cdigos. De este modo si se
tuviese una tabla de ventas con un campo cliente, dic'o campo contendr+a el
cdigo del cliente de la tabla de cliente.
Sin embargo est$ &orma de almacenar la in&ormacin no resulta muy util a la
'ora de consultar los datos. SQL nos proporciona una &orma &acil de mostrar la
in&ormacin repartida en varias tablas, las cnsultas c'9ina!as o M/INS.
Las consultas combinadas pueden ser de tres tipos,
(ombinacin interna
(ombinacin externa
Eniones
L.2. %'9inaci"n interna.
La combinacin interna permite mostrar los datos de dos o m$s tablas a trav%s
de una condicin AB;4;.
Si recuerda, los ejemplos de los cap+tulos anteriores existe una tabla de coc'es,
en la que es tiene re&erenciada la marca a trav%s del cdigo de marca. "ara
reali/ar la consulta combinada entre estas dos tablas debemos escribir una
consulta S;L;%T en cuya cl$usula ,4/$ se escribe el nombre de las dos
tablas, separados por comas, y una condicin AB;4; que obligue a que el
cdigo de marca de la tabla de coc'es sea igual al cdigo de la tabla de marcas.
Lo m$s sencillo es ver un ejemplo directamente,
<H
5212C4 tCoches6matricula,
t:arcas6marca,
tCoches6modelo,
tCoches6color,
tCoches6numero%8ilometros,
tCoches6num%plaBas
*;=: tCoches, t:arcas
LA2;2 tCoches6marca 7 t:arcas6codigo
La misma consulta de &orma TvisualT ...
Day que darse cuenta que 'emos antepuesto el nombre de cada tabla a el
nombre del campo, esto no es obligatorio si los nombres de campos no se repiten
en las tablas, pero es aconsejable para evitar con&lictos de nombres entre
campos. "or ejemplo, si para re&erirnos al campo marca no anteponemos el
nombre del campo la base de datos no sabe si queremos el campo marca de la
tabla t(oc'es, que contiene el cdigo de la marca, o el campo marca de la tabla
t-arcas, que contiene el nombre de la marca.
3tra opcin es utili/ar la cl$usula INN;4 M/IN. Su sintaxis es identica a la de
una consulta S;L;%T 'abitual, con la particularidad de que %n la cl$usula
,4/$ slo aparece una tabla o vista, a=adiendose el resto de tablas a trav%s de
cl$usulas INN;4 M/IN .
SELECT +ALL . DISTINCT ,
<nombre_campo> +{,<nombre_campo>},
&RO' <nombre_tabla>
+{INNER /OIN <nombre_tabla> ON <condicion_combinacion>}]
+!(ERE <condicion> +{ AND-OR <condicion>},,
+0ROUP B) <nombre_campo> +{,<nombre_campo >},,
+(AIN0 <condicion>+{ AND-OR <condicion>},,
+ORDER B) <nombre_campo>-<indice%campo> +ASC - DESC,
+{,<nombre_campo>-<indice%campo> +ASC - DESC ,},,
8>
0l ejemplo anterior escrito utili/ando la clausula INN;4 M/IN quedar+a de la
siguiente manera,
5212C4 tCoches6matricula,
t:arcas6marca,
tCoches6modelo,
tCoches6color,
tCoches6numero%8ilometros,
tCoches6num%plaBas
*;=: tCoches
/332; J=/3 t:arcas =3 tCoches6marca 7 t:arcas6codigo
La cl$usula INN;4 M/IN permite separar completamente las condiciones de
combinacin con otros criterios, cuando tenemos consultas que combinan nueve
o die/ tablas esto realmente se agradece. Sin embargo muc'os programadores
no son amigos de la cl$usula INN;4 M/IN, la ra/n es que uno de los
principales gestores de bases de datos, /4A%L;, no la soportaba. Si nuestro
porgrama deb+a trabajar sobre bases de datos /4A%L; no pod+amos utili/ar
INN;4 M/IN. A (artir !e la versin /4A%L; 9i racle s(rta la clIusula
INN;4 M/IN.
L.&. %'9inaci"n ;Nterna
La combinacin interna es excluyente. 0sto quiere decir que si un registro no
cumple la condicin de combinacin no se incluye en los resultados. De este
modo en el ejemplo anterior si un coc'e no tiene grabada la marca no se
devuelve en la consulta.
Seg2n la naturale/a de la consulta esto puede ser una ventaja , pero en otros
casos signi&ica un serio problema. "ara modi&icar este comportamiento SQL pone
a disposicin la combinacin externa. La combinacin externa no es excluyente.
La sintaxis es muy parecida a la combinacin interna,
8)
SELECT +ALL . DISTINCT ,
<nombre_campo> +{,<nombre_campo>},
&RO' <nombre_tabla>
+{LE&T.RI0(T OUTER /OIN <nombre_tabla> ON
<condicion_combinacion>}]
+!(ERE <condicion> +{ AND-OR <condicion>},,
+0ROUP B) <nombre_campo> +{,<nombre_campo >},,
+(AIN0 <condicion>+{ AND-OR <condicion>},,
+ORDER B) <nombre_campo>-<indice%campo> +ASC - DESC,
+{,<nombre_campo>-<indice%campo> +ASC - DESC ,},,
La combinacin externa puede ser diestra o siniestra, L;,T /=T;4 M/IN o
4I?BT /=T;4 M/IN. (on L;,T /=T;4 M/IN obtenemos todos los registros
de en la tabla que situemos a la i/quierda de la clausula M/IN, mientras que con
4I?BT /=T;4 M/IN obtenmos el e&ecto contrario.
(omo mejor se ve la combinacin externa es con un ejemplo.
5212C4 tCoches6matricula,
t:arcas6marca,
tCoches6modelo,
tCoches6color,
tCoches6numero%8ilometros,
tCoches6num%plaBas
*;=: tCoches
LE&T OUTER /OIN t:arcas =3 tCoches6marca 7 t:arcas6codigo
0sta consulta devolver$ todos los registros de la tabla t(oc'es,
independientemente de que tengan marca o no. 0n el caso de que el coc'e no
tenga marca se devolver$ el valor null para los campos de la tabla t-arcas.
7isualmente (la consulta devuelve los datos en sobreado a/ul! ...

81
0l mismo ejemplo con A4@DT 3ET0A [345.
5212C4 tCoches6matricula,
t:arcas6marca,
tCoches6modelo,
tCoches6color,
tCoches6numero%8ilometros,
tCoches6num%plaBas
*;=: tCoches
RI0(T OUTER /OIN t:arcas =3 tCoches6marca 7 t:arcas6codigo
0sta consulta devolver$ los registros de la tabla t(oc'es que tengan marca
relacionada y todos los registros de la tabla t-arcas, tengan alg2n registro en
t(oc'es o no.
7isualmente (la consulta devuelve los datos en en sombreado! ...
L.:. =nin
La cl$usula =NI/N permite unir dos o m$s conjuntos de resultados en uno
detr$s del otro como si se tratase de una 2nica tabla. De este modo podemos
obtener los registros de m$s de una tabla TunidosT.
La sintaxis corresponde a la de varias S;L;%T unidas a trav%s de =NI/N, como
se muestra a continuacin,
8<
SELECT +ALL . DISTINCT ,
<nombre_campo> +{,<nombre_campo>},
&RO' <nombre_tabla>
+{LE&T.RI0(T OUTER /OIN <nombre_tabla> ON
<condicion_combinacion>}]
+!(ERE <condicion> +{ AND-OR <condicion>},,
+0ROUP B) <nombre_campo> +{,<nombre_campo >},,
+(AIN0 <condicion>+{ AND-OR <condicion>},,
{
UNION 1ALL . DISTINCT 2
SELECT +ALL . DISTINCT ,
<nombre_campo> +{,<nombre_campo>},
&RO' <nombre_tabla>
+{LE&T.RI0(T OUTER /OIN <nombre_tabla> ON
<condicion_combinacion>}]
+!(ERE <condicion> +{ AND-OR <condicion>},,
+0ROUP B) <nombre_campo> +{,<nombre_campo >},,
+(AIN0 <condicion>+{ AND-OR <condicion>},,
}
+ORDER B) <nombre_campo>-<indice%campo> +ASC - DESC,
+{,<nombre_campo>-<indice%campo> +ASC - DESC ,},,
"ara utili/ar la cl$usula =NI/N debemos cumplir una serie de normas.
Las consultas a unir deben tener el mismo n2mero campos, y adem$s los
campos deben ser del mismo tipo.
Slo puede 'aber una 2nica clausula /4#;4 .D al &inal de la sentencia
S;L;%T.
88
0l siguiente ejemplo muestra el uso de =NI/N
5212C4 tCoches6matricula,
t:arcas6marca,
tCoches6modelo,
tCoches6color,
tCoches6numero%8ilometros,
tCoches6num%plaBas
*;=: tCoches
INNER /OIN t:arcas =3 tCoches6marca 7 t:arcas6codigo
.3/=3
5212C4 t:otos6matricula,
t:arcas6marca,
t:otos6modelo,
t:otos6color,
t:otos6numero%8ilometros,
!
*;=: t:otos
INNER /OIN t:arcas =3 t:otos6marca 7 t:arcas6codigo;

"uede observarse el uso de la constante cero en la segunda lista de seleccin
para 'acer coincidir el n2mero y tipo de campos que devuelve la consulta
E5435.
8:
O. %nsultas agrega!as.
O.1. La clIusula ?4/=P .D.
La clausula ?4/=P .D combina los registros con valores id%nticos en un 2nico
registro. "ara cada registro se puede crear un valor agregado si se incluye una
&uncin SQL agregada, como por ejemplo Sum o (ount, en la instruccin
S;L;%T. Su sintaxis es,
SELECT +ALL . DISTINCT ,
<nombre_campo> +{,<nombre_campo>},
+{,<funcion_agregado>},
&RO' <nombre_tabla>-<nombre_vista>
+{,<nombre_tabla>-<nombre_vista>},
+!(ERE <condicion> +{ AND-OR <condicion>},,
+0ROUP B) <nombre_campo> +{,<nombre_campo >},,
+(AIN0 <condicion>+{ AND-OR <condicion>},,
+ORDER B) <nombre_campo>-<indice%campo> +ASC - DESC,
+{,<nombre_campo>-<indice%campo> +ASC - DESC ,},,
?4/=P .D es opcional. Si se utili/a ?4/=P .D pero no existe una &uncin SQL
agregada en la instruccin S;L;%T se obtiene el mismo resultado que con una
consulta S;L;%T #ISTIN%T. Los valores 5ull en los campos ?4/=P .D se
agrupan y no se omiten. 5o obstante, los valores 5ull no se eval2an en ninguna
de las &unciones SQL agregadas.
Todos los campos de la lista de campos de S;L;%T deben incluirse en la
cl$usula ?4/=P .D o como argumentos de una &uncin SQL agregada.
SELECT marca, modelo, SU'(numero%8ilometros)
&RO' tCoches
0ROUP B) marca, modelo
8B
O.2. La clIusula BA>IN?.
Ena ve/ que ?4/=P .D 'a combinado los registros, BA>IN? muestra
cualquier registro agrupado por la cl$usula ?4/=P .D que satis&aga las
condiciones de la cl$usula BA>IN?. Se utili/a la cl$usula AB;4; para excluir
aquellas &ilas que no desea agrupar, y la cl$usula BA>IN? para &iltrar los
registros una ve/ agrupados.
BA>IN? es similar a AB;4;, determina qu% registros se seleccionan. Ena ve/
que los registros se 'an agrupado utili/ando ?4/=P .D, BA>IN? determina
cuales de ellos se van a mostrar. BA>IN? permite el uso de &unciones
agregadas.
SELECT marca, modelo, SU'(numero%8ilometros)
&RO' tCoches
!(ERE marca <> 9M:L9
0ROUP B) marca, modelo
(AIN0 SU'(numero%8ilometros)>!!!!!
0n el ejemplo anterior, no se cuentan los datos para todas las marcas
menos T*-GT, una ve/ que se 'an contado, se evalua BA>IN?, y el conjunto de
resultados devuelve solo aquellos modelos con m$s de )>>.>>> Sm.
A>?
(alcula la media aritm%tica de un conjunto de valores contenidos en un campo
especi&icado de una consulta. Su sintaxis es la siguiente
A0(<expr>)

0n donde expr representa el campo que contiene los datos num%ricos para los
que se desea calcular la media o una expresin que reali/a un c$lculo utili/ando
los datos de dic'o campo. La media calculada por .vg es la media aritm%tica (la
suma de los valores dividido por el n2mero de valores!. La &uncin .vg no incluye
ning2n campo 5ull en el c$lculo.
SELECT marca, modelo, A0(numero%8ilometros)
&RO' tCoches
0ROUP B) marca, modelo

8;
%unt
(alcula el n2mero de registros devueltos por una consulta. Su sintaxis es la
siguiente,
COUNT(<expr>)
0n donde e,#r contiene el nombre del campo que desea contar. Los operandos
de expr pueden incluir el nombre de un campo de una tabla, una constante o una
&uncin (la cual puede ser intr+nseca o de&inida por el usuario pero no otras de
las &unciones agregadas de SQL!. "uede contar cualquier tipo de datos incluso
texto.
.unque expr puede reali/ar un c$lculo sobre un campo, (ount simplemente
cuenta el n2mero de registros sin tener en cuenta qu% valores se almacenan en
los registros. La &uncin (ount no cuenta los registros que tienen campos null a
menos que expr sea el car$cter comod+n asterisco (V!. Si utili/a un asterisco,
(ount calcula el n2mero total de registros, incluyendo aquellos que contienen
campos null. (ount(V! es considerablemente m$s r$pida que (ount((ampo!. 5o
se debe poner el asterisco entre dobles comillas (YVY!.
SELECT COUNT(N) &RO' tCoches;
SELECT marca, COUNT(modelo)
&RO' tCoches
0ROUP B) marca;
SELECT marca, COUNT(DISTINCT modelo)
&RO' tCoches
0ROUP B) marca;

$aN, $in
Devuelven el m+nimo o el m$ximo de un conjunto de valores contenidos en un
campo especi&ico de una consulta. Su sintaxis es,
'IN(<expr>)
'AX(<expr>)
89
0n donde expr es el campo sobre el que se desea reali/ar el c$lculo. 0xpr pueden
incluir el nombre de un campo de una tabla, una constante o una &uncin (la cual
puede ser intr+nseca o de&inida por el usuario pero no otras de las &unciones
agregadas de SQL!.
SELECT marca, modelo, 'IN(numero%8ilometros)
, 'AX(numero%8ilometros)
&RO' tCoches
0ROUP B) marca, modelo
Su'
Devuelve la suma del conjunto de valores contenido en un campo especi&ico de
una consulta. Su sintaxis es,
SU'(<expr>)
0n donde e,#r respresenta el nombre del campo que contiene los datos que
desean sumarse o una expresin que reali/a un c$lculo utili/ando los datos de
dic'os campos. Los operandos de e,#r pueden incluir el nombre de un campo de
una tabla, una constante o una &uncin (la cual puede ser intr+nseca o de&inida
por el usuario pero no otras de las &unciones agregadas de SQL!.
SELECT marca, modelo, SU'(numero%8ilometros)
&RO' tCoches
0ROUP B) marca, modelo

8H
P. Su9cnsultas.
P.1. #e+inici"n !e su9cnsultas.
Ena subconsulta es una sentencia S;L;%T que aparece dentro de otra sentencia
S;L;%T. 5ormalmente se utili/an para &iltrar una clausula AB;4; o BA>IN?
con el conjunto de resultados de la subconsulta, aunque tambi%n pueden
utili/arse en la lista de seleccin.
"or ejemplo podr+amos consultar el alquirer 2ltimo de un cliente.
SELECT C=%C1/2342, 3=:M;2, :&;C&, :=>>21=
&RO' &1F./12;25
!(ERE C=%C1/2342 7
AND *2CA&%&1F./12; 7 (SELECT 'AX(!"#$_$%&'(%!))
&RO' $%&'(%!)!*
!(ERE "+_"%(!N,! - 1)

0n este caso, la subconsulta se ejecuta en primer lugar, obteniendo el valor de la
m$xima &ec'a de alquier, y posteriormente se obtienen los datos de la consulta
principal.
Ena subconsulta tiene la misma sintaxis que una sentencia S;L;%T normal
exceptuando que aparece encerrada entre par%ntesis.
La subconsulta se puede encontrar en la lista de seleccin, en la cl$usula
AB;4; o en la cl$usula BA>IN? de la consulta principal.
Tiene las siguientes reestricciones,
5o puede contener la cl$usula /4#;4 .D
5o puede ser la =NI/N de varias sentencias S;L;%T
Si la subconsulta aparece en la lista de seleccin, o est$ asociada a un
operador igual TXT solo puede devolver un 2nico registro.
:>
P.2. 4e+erencias eNternas.

. menudo, es necesario, dentro del cuerpo de una subconsulta, 'acer re&erencia
al valor de una columna de la &ila actual en la consulta principal, ese nombre de
columna se denomina re&erencia externa.
Ena re&erencia externa es un campo que aparece en la subconsulta pero se
re&iere a la una de las tablas designadas en la consulta principal.
(uando se ejecuta una consulta que contiene una subconsulta con re&erencias
externas, la subconsulta se ejecuta por cada &ila de la consulta principal.
0n este ejemplo la subconsulta aparece en la lista de seleccin, ejecutandose una
ve/ por cada &ila que devuelve la consulta principal.
SELECT C=%2:#12&>=,
3=:M;2,
(SELECT 'IN(!"#$_N+.(N$)
&RO' N+.(N$*
!(ERE "+_!./%!$0+ - !./%!$0+*1"+_!./%!$0+) #;/:2;&%3=:/3&
&RO' 2:#12&>=5;
P.&. Ani!ar su9cnsultas.

Las subconsultas pueden anidarse de &orma que una subconsulta apare/ca en la
cl$usula AB;4; (por ejemplo! de otra subconsulta que a su ve/ &orma parte de
otra consulta principal.
SELECT C=%2:#12&>=,
2:#12&>=5
&RO' 2:#12&>=5
!(ERE C=%2:#12&>= IN (SELECT "+_!./%!$0+
&RO' N+.(N$*
!(ERE !*,$0+ IN ( SELECT !*,$0+
&RO' !*,$0+*_N+.(N$*
!(ERE !.(,(0+ - 2*2
AND /$3$0+ - 3N3)
)
:)
Los resultados que se obtienen con subconsultas normalmente pueden
conseguirse a trav%s de consultas combinadas ( M/IN !.
SELECT C=%2:#12&>=,
3=:M;2
&RO' 2:#12&>=5
!(ERE 254&>= IN (SELECT !*,$0+
&RO' !*,$0+*
!(ERE $",(4+ - 2*2)
"odr$ escribirse como,
SELECT C=%2:#12&>=,
3=:M;2
&RO' 2:#12&>=5, 254&>=5
!(ERE 2:#12&>=56254&>= 7 254&>=56254&>=
AND 254&>=56&C4/O= 7 959
5ormalmente es m$s r$pido utili/ar un M/IN en lugar de una subconsulta,
aunque esto depende sobre todo del dise=o de la base de datos y del volumen de
datos que tenga.
P.:. =tiliKacin !e su9cnsultas cn =P#AT;.

"odemos utili/ar subconsultas tambi%n en consultas de actuali/acin
conjuntamente con E"D.T0 . 5ormalmente se utili/an para TcopiarT el valor de
otra tabla.
UPDATE 2:#12&>=5
SET 5&1&;/=%M;.4= 7 (SELECT SU'(5&1/;=%M;.4=)
&RO' 3=:/3&5
!(ERE 3=:/3&56C=%2:#12&>= 7 2:#12&>=56C=%2:#12&>=)
!(ERE 5&1&;/=%M;.4= IS NULL
:1
P.@. La +unci"n ;<ISTS.
;<ISTS es una &uncin SQL que devuelve veradero cuando una subconsulta
retorna al menos una &ila.
SELECT C=%C1/2342,
3=:M;2
&RO' C1/23425
!(ERE EXISTS ( SELECT 5
&RO' .+)+*+*
!(ERE "+_"%(!N,! - "%(!N,!*1"+_"%(!N,!
AND /$3$0+ - 2N2)
:<

También podría gustarte