Sie sind auf Seite 1von 59

DDL y DML

Lenguaje de definicin de datos (DDL: Data Definition Language):Sencillo lenguaje


artificial para definir y describir los objetos de la base de datos, su estructura, relaciones y
restricciones. En la prctica puede consistir en un subconjunto de instrucciones de otro lenguaje
informtico. Aparte suele poseer dos subconjuntos de instrucciones:
Lenguaje de definicin del almacenamiento de los datos (DSDL: Data Storage
Definition Language): permite especificar caractersticas fsicas de la base de datos
(volmenes y arcivos donde van a ser almacenados los datos, etc!.
Lenguaje de control de datos (DCL: Data Control Language): encargado del control y
seguridad de los datos (privilegios y modos de acceso, etc!.
Lenguaje de manipulacin de datos (DML: Data Manipulation Language): "enguaje
artificial de cierta complejidad #ue permite el manejo y procesamiento del contenido de la base
de datos. En la prctica puede consistir en un subconjunto de instrucciones de otro lenguaje
informtico. "as aplicaciones #ue trabajan sobre la base de datos se programan en un lenguaje
de programaci$n (%, %obol, ...! insertando en el c$digo fuente sentencias del &'". Al utili(ar un
&'" se deben especificar los datos #ue sern afectados por las sentencias del lenguaje. )n &'"
puede tener o no procedimientos, segn sea necesario especificar adems c$mo deben
obtenerse esos datos. "os &'" con procedimientos tienen sentencias de control de flujo como
bucles o condicionales. "os &'" sin procedimientos son conocidos tambi*n como declarativos.
Comandos del DDL y del DML
Comandos DDL
Comando Descripcin
%+EA,E
)tili(ado para crear nuevas tablas, stored procedures e
ndices
&+-. Empleado para eliminar tablas, stored procedures e ndices
A",E+
)tili(ado para modificar las tablas agregando campos o
cambiando la definici$n de los campos
Comandos DML
Comando Descripcin
SE"E%,
)tili(ado para consultar registros de la base de datos #ue
satisfagan un criterio determinado.
/0SE+,
)tili(ado para cargar lotes de datos en la base de datos en
una nica operaci$n.
&E"E,E
)tili(ado para eliminar los valores de los campos y registros
especificados.
).&A,E
)tili(ado para modificar registros de una tabla de una base de
datos.
Consultas de Seleccin
Consulta
1er la informacion #ue desea ver un usuario por medio de comandos dentro de la base de datos
"as consultas de selecci$n se utili(an para indicar al motor de datos #ue devuelva informaci$n
de las bases de datos, esta informaci$n es devuelta en forma de conjunto de registros #ue se
pueden almacenar en un objeto recordset. Este conjunto de registros es modificable.
Consultas bsicas
"a sinta2is bsica de una consulta de selecci$n es la siguiente:
SELECT %ampos
FROM ,abla
En donde campos es la lista de campos #ue se deseen recuperar y tabla es el origen de los
mismos, por ejemplo:
SELECT 0ombre, ,el*fono
FROM %lientes
Esta consulta devuelve un recordset con el campo nombre y tel*fono de la tabla clientes.
Ordenar los registros
Adicionalmente se puede especificar el orden en #ue se desean recuperar los registros de las
tablas mediante la clusula OD! "# "ista de %ampos. En donde "ista de campos representa
los campos a ordenar. Ejemplo:
SELECT %$digo .ostal, 0ombre, ,el*fono
FROM %lientes
ORDER BY 0ombre
Esta consulta devuelve los campos %$digo .ostal, 0ombre, ,el*fono de la tabla %lientes
ordenados por el campo 0ombre.
Se pueden ordenar los registros por ms de un campo, como por ejemplo:
SELECT %$digo .ostal, 0ombre, ,el*fono
FROM %lientes
ORDER BY %$digo .ostal, 0ombre
/ncluso se puede especificar el orden de los registros: ascendente mediante la clusula ($SC 3se
toma este valor por defecto! $ descendente (D!SC!
SELECT %$digo .ostal, 0ombre, ,el*fono
FROM %lientes
ORDER BY %$digo .ostal D!SC, 0ombre $SC
!l predicado D%S&%'C&
Se /ncluye entre la clausula y el primer nombre del campo a recuperar.
El predicado D%S&%'C& omite los registros #ue contienen datos duplicados en los campos
seleccionados. .ara #ue los valores de cada campo listado en la instrucci$n SE"E%, se incluyan
en la consulta deben ser nicos.
.or ejemplo, varios empleados listados en la tabla Empleados pueden tener el mismo apellido. Si
dos registros contienen "$pe( en el campo Apellido, la siguiente instrucci$n S4" devuelve un
nico registro:
SELECT DISTINCT Apellido
FROM Empleados
%on otras palabras el predicado &/S,/0%, devuelve a#uellos registros cuyos campos indicados
en la clusula SE"E%, posean un contenido diferente. El resultado de una consulta #ue utili(a
&/S,/0%, no es actuali(able y no refleja los cambios subsiguientes reali(ados por otros usuarios.
Tema 8. El DDL, lenguaje de
definicin de datos (I)

Bsqueda
Introduccin
Hasta ahora hemos estudiado las sentencias que forman parte del DML (Data Management
Language) lenguaje de manipulacin de datos, todas esas sentencias siren para recuperar,
insertar, !orrar, modificar los datos almacenados en la !ase de datos" lo que eremos en este
tema son las sentencias que afectan a la estructura de los datos#
$l DDL (Data Definition Language) lenguaje de definicin de datos es la parte del %&L
que ms vara de un sistema a otro 'a que esa area tiene que er con cmo se organi(an
internamente los datos ' eso, cada sistema lo hace de una manera u otra#
)s* como el DML de Microsoft +et inclu'e todas las sentencias DML que nos podemos
encontrar en otros %&Ls (o casi todas), el DDL de Microsoft +et en cam!io contiene menos
instrucciones que otros sistemas#

CRETE T!LE
La sentencia CRETE T!LE sire para crear la estructura de una ta"la no para
rellenarla con datos, nos permite definir las columnas que tiene # ciertas restricciones que
de!en cumplir esas columnas#
La sinta$is es la siguiente,


n!ta!la, nom"re de la ta"la que estamos definiendo
n!col, nom"re de la columna que estamos definiendo
tipo, ti%o de dato de la columna, todos los datos almacenados en la columna de!er-n ser de
ese tipo# .ara er qu/ tipos de datos se pueden emplear ha( clic aqu*
0na restriccin consiste en la definicin de una caracterstica adicional &ue tiene una
columna o una com!inacin de columnas, suelen ser caracter*sticas como alores no nulos
(campo requerido), definicin de *ndice sin duplicados, definicin de clae principal ' definicin
de clae for-nea (clae ajena o e1terna, campo que sire para relacionar dos ta!las entre s*)#
restriccin2, una restriccin de ti%o ' es una restriccin que aparece dentro de la
definicin de la columna despu/s del tipo de dato ' afecta a una columna, la que se est-
definiendo#
restriccin3, una restriccin de ti%o ( es una restriccin que se define des%u)s de definir
todas las columnas de la ta!la ' afecta a una columna o a una com"inacin de columnas.
.ara escri!ir una sentencia CRETE T!LE se empie(a por indicar el nom"re de la
ta"la que queremos crear ' a continuacin entre %ar)ntesis indicamos se%aradas %or comas
las definiciones de cada columna de la ta!la, la definicin de una columna consta
de su nom"re, el ti%o de dato que tiene # podemos a4adir si &ueremos una serie de
es%ecificaciones que de!er-n cumplir los datos almacenados en la columna, des%u)s de
definir cada una de las columnas que compone la ta!la se %ueden a*adir una serie
de restricciones, esas restricciones son las mismas que se pueden indicar para cada columna
pero ahora%ueden afectar a ms de una columna por eso tienen una sinta1is ligeramente
diferente#
0na restriccin de ti%o ' se utili(a para indicar una caracter*stica de la columna que
estamos definiendo, tiene la siguiente sinta1is,
La cl-usula +,T +-LL indica que la columna no %odr contener un valor nulo, es decir
que se de!er- rellenar o!ligatoriamente ' con un alor -lido (equiale a la propiedad requerido
%* de las propiedades del campo)#
La cl-usula C,+.TRI+T sire para definir una restriccin que se podr- eliminar cuando
queramos sin tener que !orrar la columna# ) cada restriccin se le asigna un nom!re que se
utili(a para identificarla ' para poder eliminarla cuando se quiera#
5omo restricciones tenemos la de clae primaria (clae principal), la de *ndice nico (sin
duplicados), la de alor no nulo, ' la de clae for-nea#
La cl-usula /RI0R1 2E1 se utili(a para definir la columna como clave %rinci%al de la
ta"la# $sto supone que la columna no %uede contener valores nulos ni %ueden 3a"er
valores du%licados en esa columna, es decir que dos filas no pueden tener el mismo alor en
esa columna#
$n una ta!la no %ueden 3a"er varias claves %rinci%ales, por lo que no podemos incluir la
cl-usula /RI0R1 2E1 m-s de una e(, en caso contrario la sentencia da un error# 6o ha'
que confundir la definicin de arias claes principales con la definicin de una clae principal
compuesta por arias columnas, esto ltimo s* est- permitido ' se define con una restriccin de
tipo 3#
La cl-usula -+I4-E sire para definir un ndice 5nico so!re la columna# 0n *ndice nico es
un *ndice que no %ermite valores du%licados, es decir que si una columna tiene definida un
restriccin de -+I4-E no podr-n ha!er dos filas con el mismo alor en esa columna# %e suele
emplear para que el sistema comprue!e el mismo que no se a4aden alores que 'a e1isten,
por ejemplo si en una ta!la de clientes queremos asegurarnos que dos clientes no puedan
tener el mismo D#6#I# ' la ta!la tiene como clae principal un cdigo de cliente, definiremos la
columna dni con la restriccin de -+I4-E#
La cl-usula +,T +-LL indica que la columna no puede contener alores nulos, cuando
queremos indicar que una columna no puede contener el alor nulo lo podemos hacer sin poner
la cl-usula C,+.TRI+T, o utili(ando una cl-usula C,+.TRI+T#
La ltima restriccin que podemos definir so!re una columna es la de clae for-nea,
una clave fornea es una columna o conjunto de columnas &ue contiene un valor &ue 3ace
referencia a una fila de otra ta"la, en una restriccin de tipo 2 se puede definir con la
cl-usula RE6ERE+CE., despu/s de la pala!ra reserada indicamos a qu/ ta!la hace
referencia, opcionalmente podemos indicar entre par/ntesis el nom!re de la columna donde
tiene que !uscar el alor de referencia, por defecto coge la clae principal de la ta!la3, si el
alor que tiene que !uscar se encuentra en otra columna de ta!la3, entonces de!emos inidicar
el nom!re de esta columna entre par/ntesis, adem-s slo podemos utili(ar una columna que
est/ definida con una restriccin de -+I4-E, si la columna3 que indicamos no est- definida sin
duplicados, la sentencia CRETE nos dar- un error# %i quieres repasar conceptos de clae
for-nea e integridad referencial ha( clic aqu*
.ara seguir con la instruccin CRETE T!LE pasa a la siguiente p-gina###
$jemplo,
CRETE T!LE ta"' 7
col' I+TE8ER C,+.TRI+T %9 /RI0R1 2E1,
col( C:R7(;< +,T +-LL,
col= C:R7'>< C,+.TRI+T uni' -+I4-E,
col? I+TE8ER,
col; I+T C,+.TRI+T f9; RE6ERE+CE. ta"( <@
5on este ejemplo estamos creando la ta!la tab1 compuesta por, una columna
llamada col1 de tipo entero definida como clae principal, una columna col2 que puede
almacenar hasta 37 caracteres alfanum/ricos ' no puede contener alores nulos, una
columna col3 de hasta 28 caracteres que no podr- contener alores repetidos, una
columna col4 de tipo entero sin ninguna restriccin, ' una columna col5 de tipo entero clae
for-nea que hace referencia a alores de la clae principal de la ta!la tab2#
CRETE T!LE...Continuacin
0na restriccin de ti%o ( se utili(a %ara definir una caracterstica &ue afecta a una
columna o a una com"inacin de columnas de la ta!la que estamos definiendo, se escri"e
des%u)s de 3a"er definido todas las columnas de la ta!la#
9iene la siguiente sinta$is,
La sinta1is de una restriccin de tipo 3 es mu' similar a la C,+.TRI+T de una restriccin 2
la diferencia es que ahora tenemos que indicar so!re qu/ columnas queremos definir la
restriccin# %e utili(an o!ligatoriamente las restricciones de tipo 3 cuando la restriccin afecta a
un grupo de columnas o cuando queremos definir m-s de una C,+.TRI+T para una
columna (slo se puede definir una restriccin2 en cada columna)#
La cl-usula /RI0R1 2E1 se utili(a para definir la clave %rinci%al de la ta!la# Despu/s
de las pala!ras /RI0R1 2E1 se indica entre par/ntesis el nom!re de la columna o las
columnas que forman la clae principal# Las columnas que forman la clae principal no pueden
contener alores nulos ni pueden ha!er alores duplicados de la com!inacin de columnas, por
ejemplo la ta!la pedidos de nuestros ejemplos tiene una clae principal formada por idfa! e
idproducto, pues no pueden ha!er dos filas con la misma com!inacin de idfa! con idproducto
(aci,0001 por ejemplo) pero s* pueden ha!er dos filas con el alor aci en la columna idfab si
tienen alores diferentes en la columna idproducto, ' pueden ha!er dos filas con el mismo
idproducto pero distinto idfa!#
$n una ta!la no %ueden 3a"er varias claves %rinci%ales, por lo que no podemos indicar la
cl-usula /RI0R1 2E1 m-s de una e(, en caso contrario la sentencia da un error#
La cl-usula -+I4-E sire para definir un ndice 5nico so!re una columna o so!re una
com!inacin de columnas# 0n *ndice nico es un *ndice que no %ermite valores du%licados#
%i el *ndice es so!re arias columnas no se puede repetir la misma com!inacin de alores en
dos o m-s filas# %e suele emplear para que el sistema comprue!e el mismo que no se a4aden
alores que 'a e1isten#
La cl-usula 6,REI8+ 2E1 sire para definir una clave fornea so!re una columna o una
com!inacin de columnas# 0na clae for-nea es una columna o conjunto de columnas
que contiene un valor &ue 3ace referencia a una fila de otra ta"la, en una restriccin 2 se
puede definir con la cl-usula RE6ERE+CE.# .ara definir una clae for-nea en una restriccin
de tipo 3 de!emos empe(ar por las pala!ras 6,REI8+ 2E1despu/s indicamos entre
par/ntesis la:s columna:s que es clae for-nea, a continuacin la pala!ra
reserada RE6ERE+CE. seguida del nom!re de la ta!la a la que hace referencia,
opcionalmente podemos indicar entre par/ntesis el nom!re de la:s columna:s donde tiene que
!uscar el alor de referencia, por defecto coge la clae principal de la ta!la3, si el alor que
tiene que !uscar se encuentra en otra:s columna:s de ta!la3, entonces de!emos escri!ir el
nom!re de esta:s columna:s entre par/ntesis, adem-s slo podemos utili(ar una columna (o
com!inacin de columnas) que est/ definida con una restriccin de -+I4-E, de lo contrario la
sentencia CRETE T!LE nos dar- un error#
%i necesitas repasar los conce%tos de integridad referencial pincha aqu*
$jemplo,
CRETE T!LE ta"' 7col' I+TE8ER,
col( C:R7(;< +,T +-LL,
col= C:R7'><,
col? I+TE8ER,
col; I+T,
C,+.TRI+T %9 /RI0R1 2E1 7col'<,
C,+.TRI+T uni' -+I4-E 7col=<,
C,+.TRI+T f9; 6,REI8+ 2E1 7col;< RE6ERE+CE. ta"( <@
5on este ejemplo estamos creando la misma ta!la tab1 del ejemplo de la p-gina anterior
pero ahora hemos definido las restricciones utili(ando restricciones de tipo 3#
LTER T!LE
La sentencia LTER T!LE sire para modificar la estructura de una ta"la que 'a e1iste#
Mediante esta instruccin podemos a4adir columnas nueas, eliminar columnas# 9en cuenta
que cuando eliminamos una columna se pierden todos los datos almacenados en ella#
9am!i/n nos permite crear nueas restricciones o !orrar algunas e1istentes# La sinta1is
puede parecer algo complicada pero sa!iendo el significado de las pala!ras reseradas la
sentencia se aclara !astante" )DD (a4ade), )L9$; (modifica), D;<. (elimina), 5<L0M6
(columna), 5<6%9;)I69 (restriccin)#
La sinta$is es la siguiente,
La sinta$is de restriccion' es id/ntica a la restriccin2 de la sentencia CRETE T!LE, te
la descri!imos a continuacin, si tienes alguna duda repasa la sentencia CRETE T!LE#
La sinta$is de restriccion( es id/ntica a la restriccin3 de la sentencia CRETE T!LE, te
la descri!imos a continuacin, si tienes alguna duda repasa la sentencia CRETE T!LE#
La cl-usula DD C,L-0+ (la pala!ra C,L-0+ es opcional) permite a*adir una
columna nueva a la ta!la# 5omo en la creacin de ta!la, ha' que definir la columna indicando
su nom!re, tipo de datos que puede contener, ' si lo queremos alguna restriccin de alor no
nulo, clae primaria, clae for-nea, e *ndice nico, restriccion' es o%cional e indica una
restriccin de tipo 2 que afecta a la columna que estamos definiendo#
$jemplo,
LTER T!LE ta"' DD C,L-0+ col= integer +,T +-LL C,+.TRI+T c' -+I4-E
5on este ejemplo estamos a4adiendo a la ta!la ta!2 una columna llamada col= de tipo
entero, requerida (no admite nulos) ' con un *ndice sin duplicados llamado c2#
5uando a4adimos una columna lo m*nimo que se puede poner ser*a,
LTER T!LE ta"' DD col= integer
$n este caso la nuea columna admite alores nulos ' duplicados#
.ara a*adir una nueva restriccin en la ta!la podemos utili(ar la cl-usula DD
restriccion( (DD C,+.TRI+T.##)#
$jemplo,
LTER T!LE ta"' DD C,+.TRI+T c' -+I4-E 7col=<
5on este ejemplo estamos a4adiendo a la ta!la ta!2 un *ndice nico (sin duplicados) llamado
c2 so!re la columna col=#
.ara "orrar una columna !asta con utili(ar la cl-usula DR,/ C,L-0+ (C,L-0+ es
opcional) ' el nom!re de la columna que queremos !orrar, se perder-n todos los datos
almacenados en la columna#
$jemplo,
LTER T!LE ta"' DR,/ C,L-0+ col=
9am!i/n podemos escri!ir,
LTER T!LE ta"' DR,/ col=
$l resultado es el mismo, la columna col= desaparece de la ta!la ta!2#
.ara "orrar una restriccin !asta con utili(ar la cl-usula DR,/ C,+.TRI+T ' el
nom!re de la restriccin que queremos !orrar, en este caso slo se elimina la definicin de la
restriccin pero los datos almacenados no se modifican ni se pierden#
$jemplo,
LTER T!LE ta"' DR,/ C,+.TRI+T c'
5on esta sentencia !orramos el *ndice c2 creado anteriormente pero los datos de la columna
col= no se en afectados por el cam!io#
DR,/ T!LE
La sentencia DR,/ T!LE sire para eliminar una ta"la# 6o se puede eliminar una ta!la si
est- a!ierta, tampoco la podemos eliminar si el !orrado infringe las reglas de integridad
referencial (si interiene como ta!la padre en una relacin ' tiene registros relacionados)#
La sinta$is es la siguiente,
Ejem%lo,
DR,/ T!LE ta"'
$limina de la !ase de datos la ta!la ta!2#

CRETE I+DEA
La sentencia CRETE I+DEA sire para crear un ndice so!re una o arias columnas de
una ta!la# %i quieres repasar conceptos !-sicos so!re *ndices ha( clic aqu*
La sinta$is es la siguiente,
n"indi, nom"re del ndice que estamos definiendo# En una ta"la no %ueden 3a"er dos
ndices con el mismo nom"re de lo contrario da error#
n"ta"la, nom"re de la ta"la donde definimos el ndice# ) continuacin entre par/ntesis se
indica la composicin del *ndice (las columnas que lo forman)#
n"col, nom"re de la columna &ue inde$amos# Despu/s del nom!re de la columna
podemos indicar cmo queremos que se ordenen las filas segn el *ndice mediante las
cl-usulas .C:DE.C#
.C, la cl-usula .C es la que se asume %or defecto e indica que el orden elegido para el
*ndice es ascendente (en orden alfa!/tico si la columna es de tipo te1to, de menor a ma'or si
es de tipo num/rico, en orden cronolgico si es de tipo fecha)#
DE.C, indica orden descendente, es decir el orden inerso al ascendente#
.odemos formar un *ndice "asado en varias columnas, en este caso despu/s de indicar la
primera columna con su orden, se escri!e una coma ' la segunda columna tam!i/n con su
orden, as* sucesiamente hasta indicar todas las columnas que forman el *ndice#
<pcionalmente se pueden indicar las cl-usulas,
BIT: /RI0R1 indica que el *ndice define la clave %rinci%al de la ta!la, si la ta!la 'a tiene
una clae principal, la sentencia CRETE I+DEA dar- error#
BIT: DI.LL,B +-LL indica que no %ermite valores nulos en las columnas que forman
el *ndice#
BIT: I8+,RE +-LL indica que las filas que tengan valores nulos en las columnas que
forman el *ndice se ignoran, no aparecen cuando recuperamos las filas de la ta!la utili(ando
ese *ndice#

Ejem%loC
CRETE -+I4-E I+DEA ind' ,+ clientes 7%rovincia, %o"lacion .C, fec3aDnacimiento
DE.C<
5rea un *ndice llamado ind1 so!re la ta!la clientes formado por las columnas provincia,
poblacin y fecha_nacimiento# $ste *ndice permite tener ordenadas las filas de la
ta!la clientes de forma que apare(can los clientes ordenados por provincia, dentro de la misma
proincia por poblacin ' dentro de la misma po!lacin por edad ' del m-s joen al m-s ma'or#
)l a4adir la cl-usula -+I4-E el *ndice no permitir- duplicados por lo que no podr*a tener dos
clientes con la misma fecha de nacimiento en la misma po!lacin ' misma proincia, para eitar
el po!lema ser*a mejor utili(ar,
CRETE I+DEA ind' ,+ clientes 7%rovincia, %o"lacion .C, fec3aDnacimiento DE.C<

DR,/ I+DEA
La sentencia DR,/ I+DEA sire para eliminar un ndice de una ta!la# %e elimina el *ndice
pero no las columnas que lo forman#
La sinta$is es la siguiente,
Ejem%loC
DR,/ I+DEA ind' ,+ clientes
$limina el *ndice que ha!*amos creado en el ejemplo anterior#
Tema (. Las consultas sim%les (I)

Bsqueda
,"jetivo
$mpe(aremos por estudiar la sentencia .ELECT, que permite recu%erar datos de una o
arias ta"las# La sentencia %$L$59 es con mucho la m-s compleja ' potente de las sentencias
%&L# $mpe(aremos por er las consultas m-s sim%les, "asadas en una sola ta"la#
$sta sentencia forma parte del DML (lenguaje de manipulacin de datos), en este tema
eremos cmo seleccionar columnas de una ta!la, cmo seleccionar filas ' cmo o!tener
las filas ordenadas por el criterio que queramos#
$l resultado de la consulta es una ta"la lgica, porque no se guarda en el disco sino que
est- en memoria ' cada e( que ejecutamos la consulta se uele a calcular#
5uando ejecutamos la consulta se isuali(a el resultado en forma de ta!la con columnas '
filas, pues en la %$L$59 tenemos que indicar qu/ columnas queremos que tenga el resultado '
qu/ filas queremos seleccionar de la ta!la origen#
%i no conoces toda*a las ta!las que utili(aremos para los ejemplos ' ejercicios clic aqu*
.inta$is de la sentencia .ELECT (consultas
simples)
La ta"la origen E 6R,0 E
5on la cl-usula 6R,0 indicamos en &u) ta"la tiene que "uscar la informacin# $n este
cap*tulo de consultas simples el resultado se o!tiene de una nica ta!la# La sinta1is de la
cl-usula es,
6R,0 es%ecificacin de ta"la
0na especificacin de ta!la puede ser el nom!re de una consulta guardada (las que
aparecen en la entana de !ase de datos), o el nom!re de una ta!la que a su e( puede tener
el siguiente formato,
liasta"la es un nom!re de alias, es como un segundo nom"re que asignamos a
la ta"la, si en una consulta definimos un alias para la ta!la, esta se de!er- nom!rar utili(ando
ese nom!re ' no su nom!re real, adem-s ese nom"re slo es vlido en la consulta donde se
define# $l alias se suele emplear en consultas !asadas en m-s de una ta!la que eremos en el
tema siguiente# La pala!ra . que se puede poner delante del nom!re de alias es opcional '
es el alor por defecto por lo que no tienen ningn efecto#
$jemplo, .ELECT ......6R,0 oficinas ofi " equialente a .ELECT ......6R,0 oficinas .
ofi esta sentencia me indica que se an a !uscar los datos en la ta!la oficinas que queda
renom!rada en esta consulta con ofi#
$n una .ELECT podemos utili(ar ta!las que no est-n definidas en la !ase de datos
(siempre que tengamos los permisos adecuados claro), si la ta!la no est- en la !ase de datos
actia, de!emos indicar en qu/ !ase de datos se encuentra con la cl-usula I+#
$n la cl-usula I+ el nom!re de la !ase de datos de!e incluir el camino com%leto,
la e$tensin (#md!), ' estar entre comillas sim%les#
%upongamos que la ta!la empleados estuiese en otra !ase de datos llamada otra en la
carpeta c:\mis documentos\, ha!r*a que indicarlo as*,
.ELECT F
6R,0 em%leados I+ GcCHmis documentosHotra.md"G
>eneralmente tenemos las ta!las en la misma !ase de datos ' no ha' que utili(ar la
cl-usula I+#
.eleccin de columnas
La lista de columnas que queremos que a%areIcan en el resultado es lo que
llamamos lista de seleccin ' se especifica delante de la cl-usula 6R,0#

-tiliIacin del F
%e utili(a el asterisco ? en la lista de seleccin para indicar Gtodas las columnas de la ta"laG#
9iene dos ventajas,
$itar nom!rar las columnas una a una (es m-s corto)#
%i a4adimos una columna nuea en la ta!la, esta nuea columna saldr- sin tener que modificar
la consulta#
%e puede com!inar el ? con el nom!re de una ta!la (ej# oficinas#?), pero esto se utili(a m-s
cuando el origen de la consulta son dos ta!las#
.ELECT F 6R,0 oficinas
o !ien
.ELECT oficinas.F 6R,0 oficinas
Lista todos los datos de las oficinas
columnas de la ta"la origen
Las columnas se pueden especificar mediante su nom"re sim%le (n!col) o su nom"re
cualificado (n!ta!la#n!col, el nom!re de la columna precedido del nom!re de la ta!la que
contiene la columna ' separados por un punto)#
$l nom!re cualificado se puede emplear siempre que queramos ' es o!ligatorio en algunos
casos que eremos m-s adelante#
5uando el nom"re de la columna o de la ta!la contiene es%acios en "lanco, ha' que
poner el nom!re entre corc3etes @ A ' adem-s el nmero de espacios en !lanco de!e coincidir#
.or ejemplo @codigo de clienteA no es lo mismo que @ codigo de clienteA (el segundo llea un
espacio en !lanco delante de cdigo)
$jemplos ,
.ELECT nom"re, oficina, contrato
6R,0 ofiventas
Lista el nom!re, oficina, ' fecha de contrato de
todos los empleados#
.ELECT idfa", id%roducto,
descri%cion, %recio
6R,0 %roductos
Lista una tarifa de productos
lias de columna#
5uando se isuali(a el resultado de la consulta, normalmente las columnas toman el nom!re
que tiene la columna en la ta!la, si queremos cam!iar ese nom!re lo podemos hacer
definiendo un alias de columna mediante la cl-usula . ser- el nom!re que aparecer-
como ttulo de la columna.
$jemplo,
.ELECT idfa" . fa"ricante,
id%roducto, descri%cion
6R,0 %roductos
5omo t*tulo de la primera columna aparecer-
fa!ricante en e( de idfa!
Columnas calculadas#
)dem-s de las columnas que proienen directamente de la ta!la origen, una consulta %&L
puede incluir columnas calculadas cu'os alores se calculan a partir de los alores de los
datos almacenados#
.ara solicitar una columna calculada, se especifica en la lista de seleccin una e$%resin en
e( de un nom!re de columna# La e1presin puede contener sumas, restas, multiplicaciones '
diisiones, concatenacin B , par/ntesis ' tam!i/n funciones predefinidas)#
.ara er con m-s detalle cmo formar una e1presin pincha aqu*
$jemplos,
.ELECT ciudad, regin, 7ventasE
o"jetivo< . su%eravit
6R,0 oficinas
Lista la ciudad, regin ' el superait de cada
oficina#
.ELECT idfa", id%roducto, descri%cion,
7e$istencias F %recio< . valoracion
6R,0 %roductos
De cada producto o!tiene su
fa!ricante, idproducto, su descripcin ' el
alor del inentario
.ELECT nom"re, 0,+T:7contrato<,
1ER7contrato<
6R,0 re%ventas
Lista el nom!re, mes ' a4o del contrato de
cada endedor#
La funcin M<69H() deuele el mes de una
fecha
La funcin C$);() deuele el a4o de una
fecha
.ELECT oficina, Gtiene
ventas de G, ventas
6R,0 oficinas
Listar las entas en cada oficina con el formato, 33 tiene
entas de 2DE,8F3#88 ptas
,rdenacin de las filas E ,RDER !1 E
.ara ordenar las filas del resultado de la consulta, tenemos la cl-usula ,RDER !1#
5on esta cl-usula se altera el orden de isuali(acin de las filas de la ta!la pero en ningn
caso se modifica el orden de las filas dentro de la ta!la# La ta!la no se modifica#
.odemos indicar la columna por la que queremos ordenar utili(ando su nom"re de
columna (n!columna) o utili(ando su n5mero de orden que ocupa en la lista de seleccin
(6Gcolumna)#
$jemplo,
SELECT nombre, oficina,
contrato
FROM empleados
ORDER BY oficina
es equivalente
a
SELECT nombre, oficina,
contrato
FROM empleados
ORDER BY 2
.or defecto el orden ser- ascendente (.C) (de menor a ma'or si el campo es
num/rico, por orden alfa!/tico si el campo es de tipo te1to, de anterior a posterior si el campo
es de tipo fecha:hora, etc###
$jemplos,
.ELECT nom"re, numem%,
oficinare%
6R,0 em%leados
,RDER !1 nom"re
<!tiene un listado alfa!/tico de los empleados#
.ELECT nom"re, numem%,
contrato
6R,0 em%leados
,RDER !1 contrato
<!tiene un listado de los empleados por orden de
antiguedad en la empresa (los de m-s antiguedad
aparecen primero)#
.ELECT nom"re,
numem%,ventas
6R,0 em%leados
,RDER !1 ventas
<!tiene un listado de los empleados ordenados por
olmen de entas sac-ndo los de menores entas
primero#
%i queremos podemos alterar ese orden utili(ando la cl-usula DE.C (D$%5endente), en
este caso el orden ser- el inerso al )%5#
$jemplos,
.ELECT nom"re, numem%,
contrato
6R,0 em%leados
,RDER !1 contrato DE.C
<!tiene un listado de los empleados por orden de
antiguedad en la empresa empe(ando por los m-s
recientemente incorporados#
.ELECT nom"re,
numem%,ventas
6R,0 em%leados
,RDER !1 ventas DE.C
<!tiene un listado de los empleados ordenados por
olmen de entas sacando primero los de ma'ores
entas#
9am!i/n podemos ordenar por varias columnas, en este caso se indican las columnas
separadas por comas#
%e ordenan las filas por la primera columna de ordenacin, para un mismo alor de la primera
columna, se ordenan por la segunda columna, ' as* sucesiamente#
La cl-usula DE.C o .C se puede indicar para cada columna ' as* utili(ar una ordenacin
distinta para cada columna# .or ejemplo ascendente por la primera columna ' dentro de la
primera columna, descendente por la segunda columna#
$jemplos,
.ELECT region, ciudad,
ventas
6R,0 oficinas
,RDER !1 region, ciudad
Muestra las entas de cada oficina , ordenadas por
orden alfa!/tico de regin ' dentro de cada regin por
ciudad#
.ELECT region, ciudad,
7ventas E o"jetivo< . su%eravit
6R,0 oficinas
Lista las oficinas clasificadas por regin ' dentro de
cada regin por superait de modo que las de ma'or
superait apare(can las primeras#
,RDER !1 region, = DE.C
.eleccin de filas
) continuacin eremos las cl-usulas que nos permiten indicar &u)
filas queremos visualiIar#

Las clusulas DI.TI+CT J LL
)l incluir la cl-usula DI.TI+CT en la %$L$59, se eliminan del resultado las re%eticiones de
filas# %i por el contrario queremos que apare(can todas las filas incluidas las du%licadas,
podemos incluir la cl-usulaLL o nada, 'a que )LL es el alor que %&L asume por defecto#
.or ejemplo queremos sa!er los cdigos de los directores de oficina#
.ELECT dir 6R,0 oficinas
.ELECT LL dir 6R,0 oficinas
Lista los cdigos de los directores de las
oficinas# $l director 28D aparece en cuatro
oficinas, por lo tanto aparecer- cuatro eces en el
resultado de la consulta#
.ELECT DI.TI+CT dir 6R,0 oficinas
$n este caso el alor 28D aparecer- una sola
e( 'a que le decimos que liste los distintos
alores de directores#
La clusula T,/
La cl-usula T,/ permite sacar las n %rimeras filas de la ta!la origen# 6o elige entre
alores iguales, si pido los 37 primeros alores pero el que hace 3E es el mismo alor que el
37, entonces deoler- 3E registros en e( de 37 (o los que sea)# %iempre se guia por la
columna de ordenacin, la que aparece en la cl-usula <;D$; BC o en su defecto la clae
principal de la ta!la#
.or ejemplo queremos sa!er los dos empleados m-s antiguos de la empresa#
.ELECT T,/ ( numem%, nom"re
6R,0 em%leado
,RDER !1 contrato
Lista el cdigo ' nom!re de los empleados
orden-ndolos por fecha de contrato, sacando
unicamente los dos primeros (ser-n los dos m-s
antiguos)#
.ELECT T,/ = numem%, nom"re
6R,0 em%leado
,RDER !1 contrato
$n este caso tiene que sacar los tres primeros,
pero si nos fijamos en las fechas de contrato
tenemos 38:28:DE, 28:23:DE, 82:8=:DH, 82:8=:DH,
la tercera fecha es igual que la cuarta, en este
caso sacar- estas cuatro filas en e( de tres, '
sacar*a todas las filas que tuiesen el mismo alor
que la tercera fecha de contrato#
$l nmero de filas que queremos isuali(ar se puede e1presar con un nmero entero o
como un %orcentaje so!re el n5mero total de filas que se recuperar*an sin la cl-usula 9<.#
$n este ltimo caso utili(aremos la cl-usula T,/ n /ERCE+T (porcentaje en ingl/s)#
.ELECT T,/ (> /ERCE+T nom"re
6R,0 em%leado
,RDER !1 contrato
Lista el nom!re de los empleados orden-ndolos
por fecha de contrato, sacando unicamente un
38I del total de empleados# 5omo tenemos 28
empleados, sacar- los dos primeros, si
tuiesemos 288 empleados sacar*a los 38
primeros#
La clusula B:ERE
La cl-usula B:ERE selecciona unicamente las filas que cum%lan la condicin de
seleccin especificada#
$n la consulta slo aparecer-n las filas para las cuales la condicin es erdadera (9;0$), los
alores nulos (60LL) no se inclu'en por lo tanto en las filas del resultado# La condicin de
seleccin puede ser cualquiercondicin vlida o com"inacin de condiciones utili(ando los
operadores +,T (no) +D (') ' ,R ()# $n )55$%%3888 una cl-usula JH$;$ puede
contener hasta F8 e1presiones inculadas por operadores lgicos )6D ' <;# %i quieres er
cmo funcionan los operadores lgicos
.ara empe(ar eamos un ejemplo sencillo,
.ELECT nom"re
6R,0 em%leados
B:ERE oficina K '(
Lista el nom!re de los empleados de la oficina
23#
.ELECT nom"re
6R,0 em%leados
B:ERE oficina K '( +D edad L =>
Lista el nom!re de los empleados de la oficina
23 que tengan m-s de =8 a4os# (oficina igual a
23 # edad ma'or que =8)
Tema (. Las consultas sim%les (IK)
Condiciones de seleccin

Las condiciones de seleccin son las condiciones que pueden aparecer en la clusula !ERE.
En SQL tenemos cinco condiciones bsicas:
el test de comparacin
el test de ran"o
el test de pertenencia a #n con$#nto
el test de %alor n#lo
el test de correspondencia con patrn .
El test de comparacin.
Compara el valor de una expresin con el valor de otra.
La sintaxis es la siguiente:

= igual que
< distinto de
< menor que
<= menor o igual
ma!or que
= ma!or o igual
SELECT n#memp, nombre
FROM empleados
!ERE %entas & c#ota
Lista los empleados cu!as ventas superan su cuota
SELECT n#memp, nombre
FROM empleados
!ERE contrato ' ()*+)*+*,--(
Lista los empleados contratados antes del a"o ## $cu!a
%ec&a de contrato sea anterior al ' de enero de '(##).
**+,o--. las %ec&as entre almo&adillas / / deben estar con
el %ormato mes.dia.a"o aunque tengamos de%inido otro
%ormato para nuestras %ec&as.
SELECT n#memp, nombre
FROM empleados
!ERE YE.R/contrato0 ' *,--
Este e,emplo obtiene lo mismo que el anterior pero
utili0a la %uncin !ear$). +btiene los empleados cu!o a"o
de la %ec&a de contrato sea menor que '(##.
SELECT oficina
FROM oficinas
!ERE %entas ' ob$eti%o 1 )2-
Lista las o%icinas cu!as ventas est1n por deba,o del #23
de su ob,etivo.
4a! que utili0ar siempre el punto decimal aunque
tengamos de%inida la coma como separador de decimales.
SELECT oficina
FROM oficinas
!ERE dir 3 *)-
Lista las o%icinas dirigidas por el empleado '2#.
Test de ran"o $BETEE4).
Examina si el %alor de la expresin est comprendido entre los dos %alores de%inidos por exp' ! exp5.
6iene la siguiente sintaxis:
SELECT n#memp, nombre
FROM empleados
!ERE %entas BETEE4 *)))))
.4D 5)))))
Lista los empleados cu!as ventas est1n comprendidas
entre '22.222 ! 722.22
SELECT n#memp, nombre
FROM empleados
!ERE /%entas &3 *)))))0 .4D
/%entas '3 5)))))0
+btenemos lo mismo que en el e,emplo anterior. Los
par1ntesis son opcionales.
Test de pertenencia a con$#nto $64)
Examina si el %alor de la expresin es uno de los valores incl#idos en la lista de %alores.
6iene la siguiente sintaxis:
SELECT n#memp, nombre, oficina
FROM empleados
!ERE oficina 64 /*2,*7,*80
Lista los empleados de las o%icinas '5. '8 ! '9
SELECT n#memp, nombre
FROM empleados
!ERE /oficina 3 *20 OR /oficina 3 *70
OR /oficina 3 *80
+btenemos lo mismo que en el e,emplo anterior. Los
par1ntesis son opcionales.
Test de %alor n#lo $6S 49LL)
:na condicin de seleccin puede dar como resultado el valor verdadero 6;:E. %also <=LSE o nulo
>:LL.
Cuando una col#mna que interviene en una condicin de seleccin contiene el %alor
n#lo, el res#ltado de la condicin no es verdadero ni %also. sino n#lo. sea c#al sea el test que se &a!a
utili0ado. ?or eso si queremos listar las %ilas que tienen valor en una determinada columna. no podemos
utili0ar el test de comparacin. la condicin o%icina = null devuelve el valor nulo sea cual sea el valor
contenido en o%icina. Si queremos preguntar si una columna contiene el valor nulo debemos utili0ar
un test especial. el test de valor nulo.
6iene la siguiente sintaxis:

E,emplos:
SELECT oficina, ci#dad
FROM oficinas
!ERE dir 6S 49LL
Lista las o%icinas que no tienen director.
SELECT n#memp, nombre
FROM empleados
!ERE oficina 6S 4OT 49LL
Lista los empleados asignados a alguna o%icina $los que
tienen un valor en la columna o%icina).
Test de correspondencia con patrn $L6:E)
Se utili0a cuando queremos #tili;ar caracteres comodines para %ormar el valor con el comparar.
6iene la siguiente sintaxis:

Los comodines ms usados son los siguientes:
< representa un carcter cualquiera
1 representa cero o ms caracteres
( representa un d@gito cualquiera $2A()
E,emplos:
SELECT n#memp, nombre
FROM empleados
!ERE nombre L6:E =L#is1=
Lista los empleados cu!o nombre empiece por Luis
$Luis seguido de cero o ms caracteres).
SELECT n#memp, nombre
FROM empleados
!ERE nombre L6:E =1L#is1=
Lista los empleados cu!o nombre contiene Luis. en este
caso tambi1n saldr@a los empleados Bos1 Luis $cero o
ms caracteres seguidos de L:CS ! seguido de cero o
ms caracteres).
SELECT n#memp, nombre
FROM empleados
!ERE nombre L6:E =<<a1=
Lista los empleados cu!o nombre contenga una a como
tercera letra $dos caracteres. la letra a. ! cero o ms
caracteres.
Tema =. Las consultas
multita"la (I)

Bsqueda
Introduccin
$n este tema amos a estudiar las consultas multita"la llamadas as* porque
est-n "asadas en ms de una ta"la#
$l %&L de Microsoft +et F#1 soporta dos grupos de consultas multita!la,
L la unin de ta!las
L la com%osicin de ta!las
La unin de ta"las
$sta operacin se utili(a cuando tenemos dos ta"las con las mismas columnas '
queremos o!tener una nueva ta"la con las filas de la %rimera # las filas de la segunda# $n
este caso la ta!la resultante tiene las mismas columnas que la primera ta!la (que son las
mismas que las de la segunda ta!la)#
.or ejemplo tenemos una ta!la de li!ros nueos ' una ta!la de li!ros antiguos ' queremos
una lista con todos los li!ros que tenemos# $n este caso las dos ta!las tienen las mismas
columnas, lo nico que ar*a son las filas, adem-s queremos o!tener una lista de li!ros (las
columnas de una de las ta!las) con las filas que est-n tanto en li!ros nueos como las que
est-n en li!ros antiguos, en este caso utili(aremos este tipo de operacin#
5uando ha!lamos de ta!las pueden ser ta"las reales almacenadas en la !ase de
datos o ta"las lgicas (resultados de una consulta), esto nos permite utili(ar la operacin con
m-s frecuencia 'a que pocas eces tenemos en una !ase de datos ta!las id/nticas en cuanto a
columnas# $l resultado es siempre una ta"la lgica#
.or ejemplo queremos en un slo listado los productos cu'as e1istencias sean iguales a cero
' tam!i/n los productos que aparecen en pedidos del a4o M8# $n este caso tenemos unos
productos en la ta!la de productos ' los otros en la ta!la de pedidos, las ta!las no tienen las
mismas columnas no se puede hacer una union de ellas pero lo que interesa realmente es el
identificador del producto (idfa!,idproducto), luego por una parte sacamos los cdigos de los
productos con e1istencias cero (con una consulta), por otra parte los cdigos de los productos
que aparecen en pedidos del a4o M8 (con otra consulta), ' luego unimos estas dos ta!las
lgicas#
$l operador que permite reali(ar esta operacin es el operador -+I,+#

La com%osicin de ta"las
La composicin de ta!las consiste en concatenar filas de una ta!la con filas de otra# $n este
caso o!tenemos una ta!la con las columnas de la %rimera ta"la unidas a las columnas de
la segunda ta"la, ' las filas de la ta!la resultante son concatenaciones de filas de la %rimera
ta"la con filas de la segunda ta"la#
$l ejemplo anterior quedar*a de la siguiente forma con la composicin,


) diferencia de la unin la composicin permite o!tener una fila con datos de las dos ta!las,
esto es mu' til cuando queremos isuali(ar filas cu'os datos se encuentran en dos ta!las#
.or ejemplo queremos listar los pedidos con el nom!re del representante que ha hecho el
pedido, pues los datos del pedido los tenemos en la ta!la de pedidos pero el nom!re del
representante est- en la ta!la de empleados ' adem-s queremos que apare(can en la misma
l*nea" en este caso necesitamos componer las dos ta!las (6ota, en el ejemplo e1puesto a
continuacin, hemos seleccionado las filas que nos interesan)#




$1isten distintos tipos de composicin, aprenderemos a utili(arlos todos ' a elegir el tipo m-s
apropiado a cada caso#
Los ti%os de com%osicin de ta!las son,
# $l %roducto cartesiano
# $l I++ER M,I+
# $l LE6T J RI8:T M,I+
El o%erador -+I,+
5omo 'a hemos isto en la p-gina anterior, el operador -+I,+ sire para o!tener a partir de
dos ta"las con las mismas columnas, una nuea ta!la con las filas de
la %rimera # las filas de la segunda#
La sinta1is es la siguiente,

Consulta puede ser un nom"re de ta"la, un nom"re de consulta (en estos dos casos el
nom!re de!e estar precedido de la pala!ra T!LE), o una sentencia .ELECT completa (en
este caso no se puede ponerT!LE)# La sentencia .ELECT puede ser cualquier
sentencia .ELECT con la nica restriccin de que no puede contener la cl-usula ,RDER !1#
Despu/s de la primera consulta iene la pala!ra -+I,+ ' a continuacin la segunda
consulta# La segunda consulta sigue las mismas reglas que la primera consulta#
Las dos consultas de!en tener el mismo n5mero de columnas pero las columnas
pueden llamarse de diferente forma ' ser de ti%os de datos distintos#
Las columnas del resultado se llaman como las de la %rimera consulta#
.or defecto la unin no inclu#e filas re%etidas, si alguna fila est- en las dos ta!las, slo
aparece una e( en el resultado#
%i &ueremos que apare(can todas las filas incluso las re%eticiones de filas, incluimos la
pala!ra LL (todo en ingl/s)#
$l empleo de LL tienen una ventaja, la consulta se ejecutar ms ra%idamente# .uede
que la diferencia no se note con ta!las peque4as, pero si tenemos ta!las con muchos registros
(filas) la diferencia puede ser nota!le#
%e puede unir ms de dos ta!las, para ello despu/s de la segunda
consulta re%etimos la pala!ra -+I,+ ### ' as* sucesiamente#
9am!i/n podemos indicar que queremos el resultado ordenado por algn criterio, en
este caso se inclu'e la cl-usula ,RDER !1 que 'a imos en el tema anterior# La
cl-usula ,RDER !1 se escri!e des%u)s de la 5ltima consulta, al final de la sentencia" para
indicar las columnas de ordenacin podemos utili(ar su n5mero de orden o el nom"re de la
columna, en este ltimo caso se de!en de utili(ar los nom!res de columna de la %rimera
consulta 'a que son los que se an a utili(ar para nom!rar las columnas del resultado#

.ara ilustrar la operacin amos a reali(ar el ejercicio isto en la p-gina anterior, amos a
o!tener los cdigos de los productos que tienen e1istencias iguales a cero o que apare(can en
pedidos del a4o M8#

.ELECT idfa",id%roducto
6R,0 %roductos
B:ERE e$istencias K >
-+I,+ LL
.ELECT fa",%roducto
6R,0 %edidos
B:ERE #ear7fec3a%edido< K 'NN>
,RDER !1 id%roducto

o !ien
T!LE Oe$istencias ceroP
-+I,+ LL
T!LE O%edidos N>P
,RDER !1 id%roducto
%e ha incluido la cl-usula LL porque no nos importa que salgan filas repetidas#
%e ha incluido ,RDER !1 para que el resultado salga ordenado por idproducto, o!serar que
hemos utili(ado el nom!re de la columna de la primera .ELECT, tam!i/n pod*amos ha!er
puesto ,RDER !1 ( pero no,RDER !1 %roducto (es el nom!re de la columna de la segunda
ta!la)#
.ara el 3G caso hemos creado una consulta llamada eistencias cero con la primera .ELECT, '
una consulta llamada pedidos !0 con la segunda .ELECT# <!serar que los nom!res de las
consultas est-n entre corchetes porque contienen espacios en !lanco, ' que en este caso ha'
que utili(ar T!LE#

Tema =. Las consultas
multita"la (III)

Bsqueda
El %roducto cartesiano
El producto cartesiano es un tipo de composicin de tablas. aplicando el producto cartesiano a dos
tablas se obtiene una tabla con las col#mnas de la primera tabla #nidas a las col#mnas de la se"#nda
tabla. ! las %ilas de la tabla resultante son todas las posibles concatenaciones de filas de la primera
tabla con %ilas de la se"#nda tabla.
La sintaxis es la siguiente:


El prod#cto cartesiano se indica poniendo en la FROM las tablas que queremos
componer separadas por comas. podemos obtener as@ el producto cartesiano de dos. tres. o ms tablas.
nbtabla puede ser un nombre de tabla o un nombre de cons#lta. Si todas las tablas estn en una
base de datos externa. a"adiremos la clusula 64 basedatose>terna desp#?s de la @ltima tabla. ?ero
para me,orar el rendimiento ! %acilitar el uso. se recomienda utili0ar una tabla vinculada en lugar de la
clusula C>.
4a! que tener en cuenta que el producto cartesiano obtiene todas las posibles combinaciones de
%ilas por lo tanto si tenemos dos tablas de '22 registros cada una. el resultado tendr '22x'22 %ilas. si el
producto lo &acemos de estas dos tablas con una tercera de 52 %ilas. el resultado tendr 522.222 %ilas
$'22x'22x52) ! estamos &ablando de tablas peque"as. Se ve claramente que el producto cartesiano es
unaoperacin costosa sobre todo si operamos con ms de dos tablas o con tablas voluminosas.
Se puede componer una tabla consi"o misma. en este caso es obli"atorio utili0ar un nombre
de alias por lo menos para una de las dos.
?or e,emplo: SELECT 1 FROM empleados, empleados emp
En este e,emplo obtenemos el producto cartesiano de la tabla de empleados con ella misma. 6odas las
posibles combinaciones de empleados con empleados.

?ara ver cmo %unciona el producto cartesiano cogemos las consultas Dexistencias ceroE ! Dpedidos
(2E creadas en la pgina anterior. ! creamos una consulta que &alle el producto cartesiano de las dos.

SELECT 1
FROM Ae>istencias ceroB,Apedidos ,)B

obtenemos
la
siguiente
tabla:
Se observa que tenemos las dos %ilas de la primera consulta combinadas con las dos %ilas de la segunda.
Esta operacin no es de las mCs #tili;adas. normalmente cuando queremos componer dos tablas es
para a"adir a las %ilas de una tabla. una %ila de la otra tabla. por e,emplo a"adir a los pedidos los datos
del cliente correspondiente. o los datos del representante. esto equivaldr@a a un producto cartesiano con
una seleccin de %ilas:
SELECT 1
FROM pedidos,clientes
!ERE pedidos2clie3clientes2n#mclie
Combinamos todos los pedidos con todos los clientes pero luego seleccionamos los que cumplan que el
cdigo de cliente de la tabla de pedidos sea igual al cdigo de cliente de la tabla de clientes. por lo tanto
nos quedamos con los pedidos combinados con los datos del cliente correspondiente.
Las columnas que aparecen en la clusula F4E;E de nuestra consulta anterior se
denominan col#mnas de empare$amiento !a que permiten empare,ar las %ilas de las dos tablas. Las
columnas de empare,amiento no tienen por qu1 estar incluidas en la lista de seleccin.
>ormalmente empare,amos tablas que estn relacionadas entre s@ ! una de las columnas de
empare,amiento es clave principal. pues en este caso. cuando #na de las col#mnas de
empare$amiento tienen unDndice de%inido es ms e%iciente utili0ar otro tipo de composicin. el 644ER
EO64.
El I++ER M,I+
$l I++ER M,I+ es otro tipo de composicin de ta!las, permite em%arejar filas de distintas
ta!las de forma ms eficiente que con el producto cartesiano cuando una de las columnas de
em%arejamiento est-inde$ada# Ca que en e( de hacer el producto cartesiano completo '
luego seleccionar la filas que cumplen la condicin de emparejamiento, para cada fila de una de
las ta!las "usca directamente en la otra ta!la las filas &ue cumplen la condicin, con lo
cual se em%arejan slo las filas que luego aparecen en el resultado#
La sinta1is es la siguiente,


$jemplo,
.ELECT F
6R,0 %edidos I++ER M,I+ clientes ,+ %edidos.clie K clientes.numclie
tabla1 ' tabla2 son es%ecificaciones de ta"la (nom!re de ta!la con alias o no, nom!re de
consulta guardada), de las ta!las cu'os registros se an a com!inar#
.ueden ser las dos la misma ta"la, en este caso es o"ligatorio definir al menos un alias de
ta!la#
col1, col2 son las columnas de em%arejamiento#
<!serar que dentro de la cl-usula ,+ los nom!res de columna de!en ser nom"res
cualificados (llean delante el nom!re de la ta!la ' un punto)#
Las columnas de em%arejamiento de!en contener la misma clase de datos, las dos de
tipo te1to, de tipo fecha etc### los campos num/ricos de!en ser de tipos similares# .or ejemplo,
se puede com!inar campos )uto6um/rico ' Long puesto que son tipos similares, sin em!argo,
no se puede com!inar campos de tipo %imple ' Do!le# )dem-s las columnas no pueden ser de
tipo Memo ni <L$#
com% representa cualquier operador de com%aracin ( N, O, P, ON, PN, o OP ) ' se utili(a
para esta!lecer la condicin de emparejamiento#
%e pueden definir varias condiciones de emparejamiento unidas por los
operadores +D ' ,R poniendo cada condicin entre %ar)ntesis# $jemplo,
.ELECT F
6R,0 %edidos I++ER M,I+ %roductos ,+ 7%edidos.fa" K %roductos.idfa"< +D
7%edidos.%roducto K %roductos.id%roducto<
%e pueden com"inar ms de dos ta"las
$n este caso ha' que sustituir en la sinta1is una ta"la por un I++ER M,I+ com%leto#
.or ejemplo,
.ELECT F
6R,0 7%edidos I++ER M,I+ clientes ,+ %edidos.clie K clientes.numclie< I++ER M,I+
em%leados ,+ %edidos.re% K em%leados.numem%
$n e( de tabla1 hemos escrito un I66$; +<I6 completo, tam!i/n podemos escri!ir,
.ELECT F
6R,0 clientes I++ER M,I+ 7%edidos I++ER M,I+ em%leados ,+ %edidos.re% K
em%leados.numem%< ,+ %edidos.clie K clientes.numclie
$n este caso hemos sustituido tabla2 por un I66$; +<I6 completo#

El LE6T M,I+ # RI8:T M,I+
$l LE6T M,I+ ' RI8:T M,I+ son otro tipo de composicin de ta!las, tam!i/n
denominada com%osicin e$terna# %on una e1tensin del I++ER M,I+#
Las composiciones istas hasta ahora (el %roducto cartesiano ' el I++ER M,I+)
son com%osiciones internas 'a que todos los alores de las filas del resultado son alores
que est-n en las ta!las que se com!inan#
5on una composicin interna slo se o!tienen las filas que tienen al menos una fila de la otra
ta!la que cumpla la condicin, eamos un ejemplo,
&ueremos com!inar los empleados con las oficinas para sa!er la ciudad de la oficina donde
tra!aja cada empleado, si utili(amos un producto cartesiano tenemos,
.ELECT em%leados.F,ciudad
6R,0 em%leados, oficinas
B:ERE em%leados.oficina K oficinas.oficina
<!serar que hemos cualificado el nom!re de columna oficina 'a que ese nom!re aparece en
las dos ta!las de la Q;<M#
5on esta sentencia los em%leados que no tienen una oficina asignada (un alor nulo en el
campo oficina de la ta!la empleados) no a%arecen en el resultado 'a que la
condicin em%leados.oficina K oficinas.oficina ser- siempre nula para esos empleados#
%i utili(amos el I++ER M,I+,
.ELECT em%leados.F, ciudad
6R,0 em%leados I++ER M,I+ oficinas ,+ em%leados.oficina K oficinas.oficina
6os pasa lo mismo, el empleado 228 tiene un alor nulo en el campo oficina ' no aparecer-
en el resultado#
.ues en los casos en que &ueremos que tam"i)n a%areIcan las filas &ue no tienen una
fila coincidente en la otra ta!la, utiliIaremos el LE6T o RI8:T M,I+#
La sinta1is del LE6T M,I+ es la siguiente,

La descripcin de la sinta1is es la misma que la del I++ER M,I+ (er p-gina anterior), lo
nico que cam!ia es la pala!ra I++ER por LE6T (iI&uierda en ingl/s)#

$sta operacin consiste en a*adir al resultado del I++ER M,I+ las filas de la ta"la de
la iI&uierda que no tienen corres%ondencia en la otra ta!la, ' rellenar en esas filas
los cam%os de la ta"la de la derec3acon valores nulos#
$jemplo,
.ELECT F
6R,0 em%leados LE6T M,I+ oficinas ,+ em%leados.oficina K oficinas.oficina
5on el ejemplo anterior o!tenemos una lista de los empleados con los datos de su oficina, '
el empleado 228 que no tiene oficina aparece con sus datos normales ' los datos de su oficina
a nulos#

La sinta1is del RI8:T M,I+ es la siguiente,
La sinta1is es la misma que la del I++ER M,I+ (er p-gina anterior), lo nico que cam!ia es la
pala!ra I++ER por RI8:T (derec3a en ingl/s)#

$sta operacin consiste en a*adir al resultado del I++ER M,I+ las filas de la ta"la de
la derec3a que no tienen corres%ondencia en la otra ta!la, ' rellenar en esas filas
los cam%os de la ta"la de la iI&uierdacon valores nulos#
$jemplo,
.ELECT F
6R,0 em%leados RI8:T M,I+ oficinas ,+ em%leados.oficina K oficinas.oficina
5on el ejemplo anterior o!tenemos una lista de los empleados con los datos de su oficina, '
adem-s aparece una fila por cada oficina que no est- asignada a ningn empleado con los
datos del empleado a nulos#

0na operacin LE6T +<I6 o RI8:T M,I+ se %uede anidar dentro de una
operacin I++ER +<I6, pero una operacin I++ER +<I6 no se
puede anidar dentro de LE6T +<I6 o RI8:T M,I+# Los anidamientos deM,I+ de distinta
naturale(a no funcionan siempre, a eces depende del orden en que colocamos las ta!las, en
estos casos lo mejor es pro!ar ' si no permite el anudamiento, cam!iar el orden de las ta!las
( ' por tanto de los M,I+s) dentro de la cl-usula 6R,0#
.or ejemplo podemos tener,
.ELECT F
6R,0 clientes I++ER M,I+ 7em%leados LE6T M,I+ oficinas ,+ em%leados.oficina K
oficinas.oficina< ,+ clientes.re%clie K em%leados.numclie
5om!inamos empleados con oficinas para o!tener los datos de la oficina de cada empleado,
' luego a4adimos los clientes de cada representante, as* o!tenemos los clientes que tienen un
representante asignado ' los datos de la oficina del representante asignado#
%i hu!i/ramos puesto I++ER en e( de LE6T no saldr*an los clientes que tienen el
empleado 228 (porque no tiene oficina ' por tanto no aparece en el resultado del LE6T M,I+ '
por tanto no entrar- en el c-lculo delI++ER M,I+ con clientes)#

Resumen de cundo utiliIar cada o%eracin.
.ara sa!er en cada caso qu/ tipo de operacin se de!e utili(ar, a continuacin tienes un
gr-fico que indica qu/ preguntas se tienen que hacer ' segn la respuesta, qu/ operacin
utili(ar#
.ara resumir hemos llamado 92 ' 93 las ta!las de las que queremos sacar los datos ' ; la
ta!la lgica que representa el resultado de consulta# 92 ' 93 podr*an ser ta!las guardadas o
consultas#
$n la ltima parte cuando se pregunta R$n 92 ha' filas que no tienen pareja en 93R, la
pregunta se de!e de interpretar como Ren alguna de las ta!las ha' filas que no tienen parejaR#



Tema ?. Las consultas de
resumen (I)

Bsqueda
Introduccin
$n %&L de Microsoft +et F#1 ' de la ma'or*a de los motores de !ases de datos relacionales,
podemos definir un ti%o de consultas cu'as filas resultantes son un resumen de las filas de
la ta"la origen, por eso las denominamos consultas de resumen, tam!i/n se conocen como
consultas sumarias#
$s importante entender que las filas del resultado de una consulta de resumen tienen
una naturaleIa distinta a las filas de las dem-s ta!las resultantes de consultas, 'a que
corresponden a arias filas de la ta!la orgen# .ara simplificar, eamos el caso de una consulta
!asada en una sola ta!la, una fila de una consulta Sno resumenS corresponde a una fila de la
ta!la origen, contiene datos que se encuentran en una sola fila del origen, mientras que una
fila de una consulta de resumen corres%onde a un resumen de varias filas de la ta"la
origen, esta diferencia es lo que a a originar una serie de restricciones que sufren las
consultas de resumen ' que eremos a lo largo del tema#
$n el ejemplo que iene a continuacin tienes un ejemplo de consulta normal en la que se
isuali(an las filas de la ta!la oficinas ordenadas por region, en este caso cada fila del resultado
se corresponde con una sola fila de la ta!la oficinas, mientras que la segunda consulta es una
consulta resumen, cada fila del resultado se corresponde con una o arias filas de la ta!la
oficinas#
Las consultas de resumen introducen dos nuevas clusulas a la sentencia %$L$59,
la clusula 8R,-/ !1 ' la clusula :QI+8, son cl-usulas que slo se pueden utili(ar en
una consulta de resumen, se tienen que escri!ir entre la cl-usula B:ERE ' la
cl-usula ,RDER !1 ' tienen la siguiente sinta1is,
Las detallaremos en la p-gina siguiente del tema, primero amos a introducir otro concepto
relacionado con las consultas de resumen, las funciones de columna#

6unciones de columna
$n la lista de seleccin de una consulta de resumen aparecen funciones de
columna tam!i/n denominadas funciones de dominio agregadas# 0na funcin de columna se
a%lica a una columna ' o!tiene un valor&ue resume el contenido de la columna#
9enemos las siguientes funciones de columna,
$l argumento de la funcin indica con &u) valores se tiene que operar, por
eso expresin suele ser un nom"re de columna, columna que contiene los alores a resumir,
pero tam!i/n puede ser cualquier e1presin -lida que deuela una lista de alores#
La funcin .-07< calcula la suma de los alores indicados en el argumento# Los datos
que se suman de!en ser de ti%o num)rico (entero, decimal, coma flotante o monetario###)# $l
resultado ser- del mismo tipo aunque puede tener una precisin ma'or#
$jemplo,
.ELECT <!tiene una sola fila con el resultado de sumar todos los alores de
.-07ventas<
6R,0 oficinas
la columna entas de la ta!la oficinas#
La funcin Q87< calcula el %romedio (la media arim/tica) de los alores indicados en el
argumento, tam!i/n se aplica a datos num)ricos, ' en este caso el tipo de dato del resultado
puede cam!iar segn las necesidades del sistema para representar el alor del resultado#
.tDev7< ' .tDev/7< calculan la desviacin estndar de una po!lacin o de una muestra
de la po!lacin representada por los alores contenidos en la columna indicada en el
argumento# %i la consulta !ase (el origen) tiene menos de dos registros, el resultado es nulo#
$s interesante destacar que el valor nulo no e&uivale al valor >, las funciones de
columna no consideran los valores nulos mientras que consideran el alor 8 como un alor,
por lo tanto en las funciones )K>(), %9D$K(), %9D$K.() los resultados no ser-n los mismos
con alores 8 que con alores nulos# Ke-moslo con un ejemplo,
%i tenemos esta
ta!la,
La consulta
.ELECT
Q87col'< .
media
6R,0 ta"la'
deuele,
$n este caso los
ceros entran en la
media por lo que
sale igual a F
(28T7T8T=TET8):E
N F
5on esta otra
ta!la,
.ELECT
Q87col'< .
media
6R,0 ta"la(
deuele,
$n este caso los
ceros se han
sustituido por
alores nulos ' no
entran en el
c-lculo por lo que
la media sale igual
a E
(28T7T=TE):F N F
Las funciones 0I+7< ' 0A7< determinan los valores
menores ' ma#ores respectiamente# Los alores de la columna pueden ser
de ti%o num)rico, te$to o fec3a# $l resultado de la funcin tendr- el mismo tipo de dato que la
columna# %i la columna es de ti%o num)rico 0I+7< deuele el valor menor contenido en la
columna, si la columna es de ti%o te$to 0I+7< deuele el %rimer valor en orden alfa")tico, '
si la columna es de ti%o fec3a, 0I+7< deuele la fec3a ms antigua ' 0A7< la fec3a ms
reciente#
La funcin C,-+T7n" columna< cuenta el n5mero de valores que ha' en la columna,
los datos de la columna pueden ser de cual&uier ti%o, ' la funcin siempre deuele un
nmero entero# %i la columna contiene valores nulos esos alores no se cuentan, si en la
columna aparece un valor re%etido, lo cuenta varias veces#
C,-+T7F< permite contar filas en e( de alores# %i la columna no contiene ningn alor
nulo, C,-+T(n!columna) ' C,-+T7F< deuelen el mismo resultado, mientras que si ha'
alores nulos en la columna,C,-+T7F< cuenta tam!i/n esos alores mientras que C,-+T(n!
columna) no los cuenta#
Ejem%lo,
U5u-ntos empleados tenemosV
.ELECT C,-+T7numem%<
6R,0 em%leados
o !ien
.ELECT C,-+T7F<
6R,0 em%leados
$n este caso las dos sentencias deuelen el mismo resultado 'a que la columna numemp no
contiene alores nulos (es la clae principal de la ta!la empleados)#
U5u-ntos empleados tienen una oficina asignadaV
.ELECT C,-+T7oficina<
6R,0 em%leados
$sta sentencia por el contrario, nos deuele el nmero de alores no nulos que se encuentran
en la columna oficina de la ta!la empleados, por lo tanto nos dice cu-ntos empleados tienen
una oficina asignada#
%e pueden com!inar arias funciones de columna en una e1presin pero no se pueden
anidar funciones de columna, es decir,
.ELECT 7Q87ventas< F =< R .-07cuota<
6R,0 ...
es correcto
.ELECT Q87.-07ventas<<
6R,0 ...
6< es correcto, no se puede incluir una
funcin de columna dentro de una funcin de
columna
.eleccin en el origen de datos.
%i queremos eliminar del origen de datos algunas filas, !asta incluir la cl-usula B:ERE que
'a conocemos despu/s de la cl-usula 6R,0#
$jemplo, &ueremos sa!er el acumulado de entas de los empleados de la oficina 23#
.ELECT .-07ventas<
6R,0 em%leados
B:ERE oficina K '(
,rigen m5lti%le.
%i los datos que necesitamos utili(ar para o!tener nuestro resumen se
encuentran en varias ta"las, formamos el origen de datos adecuado en la
cl-usula 6R,0 como si fuera una consulta multita"la normal#
$jemplo, &ueremos o!tener el importe total de entas de todos los empleados ' el ma'or
o!jetio de las oficinas asignadas a los empleados,
.ELECT .-07em%leados.ventas<, 0A7o"jetivo<
6R,0 em%leados LE6T M,I+ oficinas ,+ em%leados.oficinaKoficinas.oficina
6<9), com!inamos empleados con oficinas por un LE6T M,I+ para que apare(can en el
origen de datos todos los empleados incluso los que no tengan una oficina asignada, as* el
origen de datos estar- formado por una ta!la con tantas filas como empleados ha'an en la
ta!la empleados, con los datos de cada empleado ' de la oficina a la que est- asignado# De
esta ta!la sacamos la suma del campo entas (importe total de entas de todos los empleados)
' el o!jetio m-1imo# <!serar que el origen de datos no inclu'e las oficinas que no tienen
empleados asignados, por lo que esas oficinas no entran a la hora de calcular el alor m-1imo
del o!jetio#
La clusula 8R,-/ !1
Hasta ahora las consultas de resumen que hemos isto utili(an todas las filas de la ta!la '
producen una nica fila resultado#
%e pueden o!tener su"totales con la cl-usula 8R,-/ !1# 0na consulta con una
cl-usula 8R,-/ !1 se denomina consulta agru%ada 'a que agrupa los datos de la ta!la
origen ' %roduce una 5nica fila resumen %or cada gru%o formado# Las columnas indicadas
en el 8R,-/ !1 se llaman columnas de agru%acin#
$jemplo,
.ELECT .-07ventas<
6R,0 re%ventas
<!tiene la suma de las entas de todos los empleados#
.ELECT .-07ventas<
6R,0 re%ventas
8R,-/ !1 oficina
%e forma un grupo para cada oficina, con las filas de la oficina, '
la suma se calcula so!re las filas de cada grupo# $l ejemplo
anterior o!tiene una lista con la suma de las entas de los
empleados de cada oficina#
La consulta quedar*a mejor inclu'endo en la lista de seleccin la oficina para sa!er a qu/
oficina corresponde la suma de entas,
.ELECT oficina,.-07ventas<
6R,0 re%ventas
8R,-/ !1 oficina
0n columna de agrupacin no puede ser de tipo memo u <L$#
La columna de agru%acin se puede indicar mediante un nom"re de columna o
cualquier e1presin -lida !asada en una columna pero no se pueden utili(ar los alias de
campo#
$jemplo,
.ELECT im%orteJcant , .-07im%orte<
6R,0 %edidos
8R,-/ !1 im%orteJcant
$st- permitido, equialdr*a a agrupar las
l*neas de pedido por precio unitario ' sacar
de cada precio unitario el importe total
endido#
.ELECT im%orteJcant . %recio,
.-07im%orte<
6R,0 %edidos
8R,-/ !1 %recio
6o est- permitido, no se puede utili(ar un
alias campo#
En la lista de seleccin slo %ueden a%arecer ,
valores constantes
funciones de columna
columnas de agru%acin (columnas que aparecen en la cl-usula 8R,-/ !1)
o cual&uier e$%resin "asada en las anteriores#
.ELECT
.-07im%orte<,re%F'>
6R,0 %edidos
8R,-/ !1 re%F'>
$st- permitido
.ELECT .-07im%orte<,re%
6R,0 %edidos
8R,-/ !1 re%F'>
6o est- permitido, rep es una columna simple que no est-
encerrrada en una funcin de columna, ni est- en la lista
de columnas de agrupacin#
%e %ueden agru%ar las filas %or varias columnas, en este caso se indican las columnas
separadas por una coma ' en el orden de ma#or a menor agru%acin# %e permite incluir en la
lista de agrupacin hasta 28 columnas#
$jemplo, &ueremos o!tener la suma de las entas de las oficinas agrupadas por region '
ciudad,
.ELECT .-07ventas<
6R,0 oficinas
8R,-/ !1 region,ciudad
%e agrupa primero por regin, ' dentro de cada regin por ciudad#
Todas las filas que tienen valor nulo en el campo de agrupacin, pasan a formar un
5nico gru%o# $s decir, considera el alor nulo como un alor cualquiera a efectos de
agrupacin#
$jemplo,
.ELECT oficina,.-07ventas< . ventasDtotales
6R,0 re%ventas
8R,-/ !1 oficina
$n el resultado aparece una fila con el campo oficina sin alor ' a continuacin una cantidad en
el campo entasWtotales, esta cantidad corresponde a la suma de las entas de los empleados
que no tienen oficina asignada (campo oficina igual a nulo)#
La clusula :QI+8
La cl-usula :QI+8 nos permite seleccionar filas de la ta!la resultante de una
consulta de resumen#
.ara la condicin de seleccin se pueden utili(ar los mismos tests de comparacin
descritos en la cl-usula B:ERE, tam!i/n se pueden escri!ir condiciones compuestas (unidas
por los operadores ,R, +D,+,T), pero e1iste una restriccin#
En la condicin de seleccin slo %ueden a%arecer ,
valores constantes
funciones de columna
columnas de agru%acin (columnas que aparecen en la cl-usula >;<0. BC)
o cual&uier e$%resin "asada en las anteriores#
$jemplo, &ueremos sa!er las oficinas con un promedio de entas de sus empleados ma'or
que 788#888 ptas#
.ELECT oficina
6R,0 em%leados
8R,-/ !1 oficina
:QI+8 Q87ventas< L ;>>>>>
6<9), .ara o!tener lo que se pide ha' que calcular el promedio de entas de los empleados
de cada oficina, por lo que ha' que utili(ar la ta!la empleados#9enemos que agrupar los
empleados por oficina ' calcular el promedio para cada oficina, por ltimo nos queda
seleccionar del resultado las filas que tengan un promedio superior a 788#888 ptas#
Resumen del tema
U5mo se ejecuta internamente una consulta de resumenV
L .rimero se forma la ta!la origen de datos segn la cl-usula 6R,0,
L se seleccionan del origen de datos las filas segn la cl-usula B:ERE,
L se forman los grupos de filas segn la cl-usula 8R,-/ !1,
L por cada grupo se o!tiene una fila en la ta!la resultante con los alores que aparecen en las
cl-usulas 8R,-/ !1, :QI+8 ' en la lista de seleccin,
L se seleccionan de la ta!la resultante las filas segn la cl-usula :QI+8,
L se eliminan de la ta!la resultante las columnas que no aparecen en la lista de seleccin,
L se ordenan las filas de la ta!la resultante segn la cl-usula ,RDER !1
0na consulta se conierte en consulta de resumen en cuanto aparece 8R,-/
!1, :QI+8 o una funcin de columna#
$n una consulta de resumen, la lista de seleccin ' la cl-usula :QI+8 slo pueden
contener,
alores constantes
funciones de columna
columnas de agrupacin (columnas que aparecen en la cl-usula 8R,-/ !1)
o cualquier e1presin !asada en las anteriores#
Tema ;. Las su"consultas (I)

Bsqueda
Definiciones
0na su"consulta es una sentencia .ELECT &ue a%arece dentro de otra
sentencia .ELECT que llamaremos consulta %rinci%al#
%e puede encontrar en la lista de seleccin, en la clusula B:ERE o en la clusula
:QI+8 de la consulta principal#
0na su!consulta tiene la misma sinta1is que una sentencia %$L$59 normal e1ceptuando
que aparece encerrada entre %ar)ntesis, no puede contener la cl-usula ,RDER !1, ni puede
ser la -+I,+ de arias sentencias .ELECT, adem-s tiene algunas restricciones en cuanto a
nmero de columnas segn el lugar donde aparece en la consulta principal# $stas restricciones
las iremos descri!iendo en cada caso#
5uando se ejecuta una consulta que contiene una su!consulta, la su"consulta se ejecuta
%or cada fila de la consulta %rinci%al#
%e aconseja no utili(ar campos calculados en las su!consultas, ralenti(an la consulta#
Las consultas que utili(an su!consultas suelen ser ms fciles de inter%retar %or el
usuario#
Referencias e$ternas
) menudo, es necesario, dentro del cuerpo de una su!consulta, hacer referencia al alor de
una columna en la fila actual de la consulta principal, ese nom!re de columna se denomina
referencia e1terna#
0na referencia e$terna es un nom!re de columna que estando en la su!consulta, no se refiere
a ninguna columna de las ta!las designadas en la 6R,0 de la su!consulta sino a
una columna de las ta"las designadas en la 6R,0 de la consulta %rinci%al. 5omo la
su!consulta se ejecuta por cada fila de la consulta principal, el alor de la referencia e1terna ir-
cam!iando#
$jemplo,
.ELECT numem%, nom"re, 7.ELECT 0I+7fec3a%edido< 6R,0 %edidos B:ERE re% K
numem%<
6R,0 em%leados@
$n este ejemplo la consulta principal es .ELECT... 6R,0 em%leados#
La su!consulta es 7 .ELECT 0I+7fec3a%edido< 6R,0 %edidos B:ERE re% K numem% <#
$n esta su!consulta tenemos una referencia e1terna ( numemp ) es un campo de la ta!la
empleados (origen de la consulta principal)#
U&u/ pasa cuando se ejecuta la consulta principalV
L se coge el primer empleado ' se calcula la su!consulta sustitu'endo numemp por el alor que
tiene en el primer empleado# La su!consulta o!tiene la fecha m-s antigua en los pedidos del
rep N 282,
L se coge el segundo empleado ' se calcula la su!consulta con numemp N 283 (numemp del
segundo empleado)### ' as* sucesiamente hasta llegar al ltimo empleado#
)l final o!tenemos una lista con el nmero, nom!re ' fecha del primer pedido de cada
empleado#
%i quitamos la cl-usula B:ERE de la su!consulta o!tenemos la fecha del primer pedido de
todos los pedidos no del empleado correspondiente#
nidar su"consultas
Las su!consultas pueden anidarse de forma que una su"consulta a%areIca en la
clusula B:ERE (por ejemplo) de otra su"consulta que a su e( forma parte de otra
consulta principal# $n la pr-ctica, una consulta consume mucho m-s tiempo ' memoria cuando
se incrementa el nmero de nieles de anidamiento# La consulta resulta tam!i/n m-s dif*cil de
leer , comprender ' mantener cuando contiene m-s de uno o dos nieles de su!consultas#
$jemplo,
.ELECT numem%, nom"re
6R,0 em%leados
B:ERE numem% K 7.ELECT re% 6R,0 %edidos B:ERE clie K 7.ELECT numclie 6R,0
clientes B:ERE nom"re K GMulia nte&ueraG<<
$n este ejemplo, por cada linea de pedido se calcula la su!consulta de clientes, ' esto se
repite por cada empleado, en el caso de tener 28 filas de empleados ' 388 filas de pedidos
(ta!las realmente peque4as), la su!consulta m-s interna se ejecutar*a 3888 eces (28 1 388)#
.u"consulta en la lista de seleccin
5uando la su!consulta aparece en la lista de seleccin de la consulta principal, en este
caso la su!consulta, no %uede devolver varias filas ni varias columnas, de lo contrario se da
un mensaje de error#
Muchos %&Ls no permiten que una su!consulta apare(ca en la lista de seleccin de la
consulta principal pero eso no es ningn pro!lema 'a que normalmente se puede o!tener lo
mismo utili(ando como origen de datos las dos ta!las# $l ejemplo anterior se puede o!tener de
la siguiente forma,
.ELECT numem%, nom"re, 0I+7fec3a%edido<
6R,0 em%leados LE6T M,I+ %edidos ,+ em%leados.numem% K %edidos.re%
8R,-/ !1 numem%, nom"re
En la clusula 6R,0
$n la cl-usula Q;<M se puede encontrar una sentencia %$L$59 encerrada entre par/ntesis
pero ms &ue su"consulta sera una consulta 'a que no se ejecuta para cada fila de la ta!la
origen sino que se ejecuta una sola e( al principio, su resultado se com!ina con las filas de la
otra ta!la para formar las filas origen de la %$L$59 primera ' no admite referencias e1ternas#
$n la cl-usula Q;<M imos que se pod*a poner un nom!re de ta!la o un nom!re de
consulta, pues en e( de poner un nom!re de consulta se puede poner directamente la
sentencia %$L$59 correspondiente a esa consulta encerrada entre par/ntesis#

.u"consulta en las clusulas B:ERE #
:QI+8
%e suele utili(ar su!consultas en las cl-usulas JH$;$ o H)KI6> cuando los datos que
queremos isuali(ar est-n en una ta!la pero para seleccionar las filas de esa ta!la necesitamos
un dato que est- en otra ta!la#
$jemplo,
.ELECT numem%, nom"re
6R,0 em%leados
B:ERE contrato K 7.ELECT 0I+7fec3a%edido< 6R,0 %edidos<
$n este ejemplo listamos el nmero ' nom!re de los empleados cu'a fecha de contrato sea
igual a la primera fecha de todos los pedidos de la empresa#
$n una cl-usula B:ERE : :QI+8 tenemos siempre una condicin ' la su!consulta acta
de operando dentro de esa condicin#
$n el ejemplo anterior se compara contrato con el resultado de la su!consulta# Hasta ahora las
condiciones estudiadas ten*an como operandos alores simples (el alor contenido en una
columna de una fila de la ta!la, el resultado de una operacin aritm/tica###) ahora la su!consulta
puede deoler una columna entera por lo que es necesario definir otro tipo de condiciones
es%eciales para cuando se utili(an con su!consultas#
Condiciones de seleccin con su"consultas

Las condiciones de seleccin son las condiciones que pueden aparecer en la
cl-usula B:ERE o :QI+8# La ma'or*a se han isto en el tema 3 pero ahora incluiremos las
condiciones que utili(an una su!consulta como operando#
$n %&L tenemos cuatro nueas condiciones,
el test de com%aracin con su"consulta
el test de com%aracin cuantificada
el test de %ertenencia a un conjunto
el test de e$istencia
$n todos los tests estudiados a continuacin epresion puede ser cualquier nom!re de columna
de la consulta principal o una e1presin -lida como 'a imos en el tema 3#
$l test de com%aracin con su"consulta#
$s el e&uivalente al test de com%aracin sim%le# %e utili(a para comparar un alor de la
fila que se est- e1aminado con un nico alor producido por la su!consulta# La su!consulta
de!e deoler una 5nica columna, sino se produce un error#
%i la su!consulta no produce ninguna fila o deuele el alor nulo, el test deuele el valor
nulo, si la su!consulta produce varias filas, %&L deuele una condicin de error#
La sinta1is es la siguiente,

.ELECT oficina, ciudad
6R,0 oficinas
Lista las oficinas cu'o o!jetio sea superior a la
suma de las entas de sus empleados#
B:ERE o"jetivo L 7.ELECT
.-07ventas< 6R,0 em%leados
B:ERE em%leados.oficina K
oficinas.oficina<
$n este caso la su!consulta deuele una nica
columna ' una nica fila (es un consulta de resumen
sin 8R,-/ !1)
$l test de com%aracin cuantificada#
$ste test es una e1tensin del test de comparacin ' del test de conjunto# Com%ara el
valor de la e1presin con cada uno de los valores producidos por la su!consulta# La
su!consulta de!e deoler una 5nica columna sino se produce un error#
9enemos el test +1 (al"#n, al"uno en ingl/s) ' el test LL (todos en ingl/s)#
La sinta1is es la siguiente,
$l test +1#
La su!consulta de!e deoler una nica columna sino se produce un error#
%e eala la comparacin con cada alor deuelto por la su!consulta#
%i alguna de las com%araciones individuales %roduce el resultado verdadero, el test +1
devuelve el resultado verdadero#
%i la su!consulta no deuele ning5n valor, el test +1 deuele falso#
%i el test de comparacin es falso para todos los valores de la columna, +1 deuele falso#
%i el test de comparacin no es verdadero para ningn alor de la columna, # es nulo para al
menos alguno de los alores, +1 deuele nulo#
.ELECT oficina, ciudad
6R,0 oficinas
B:ERE o"jetivo L +1 7.ELECT
.-07cuota< 6R,0 em%leados
8R,-/ !1 oficina<
$n este caso la su!consulta deuele una nica
columna con las sumas de las cuotas de los
empleados de cada oficina#
Lista las oficinas cu'o o!jetio sea superior a alguna
de las sumas o!tenidas#
$l test LL#
La su!consulta de!e deoler una nica columna sino se produce un error#
%e eala la comparacin con cada alor deuelto por la su!consulta#
.i todas las comparaciones indiiduales, producen un resultado verdadero, el test deuele el
alor verdadero#
%i la su!consulta no deuele ning5n valor el test LL deuele el alor verdadero# (X<jo con
estoY)
%i el test de comparacin es falso para algn alor de la columna, el resultado es falso#
%i el test de comparacin no es falso para ningn alor de la columna, pero es nulo para
alguno de esos alores, el test LL deuele alor nulo.
.ELECT oficina, ciudad
6R,0 oficinas
B:ERE o"jetivo L LL 7.ELECT
.-07cuota< 6R,0 em%leados
8R,-/ !1 oficina<
$n este caso se listan las oficinas cu'o o!jetio sea
superior a todas las sumas#
Test de %ertenencia a conjunto (I+)#
$1amina si el valor de la e1presin es uno de los alores incluidos en la lista de valores
%roducida %or la su"consulta#
La su!consulta de!e generar una nica columna ' las filas que sean#
%i la su!consulta no produce ninguna fila, el test da falso#
9iene la siguiente sinta1is,

.ELECT numem%, nom"re, oficina
6R,0 em%leados
B:ERE oficina I+ 7.ELECT oficina
6R,0 oficinas B:ERE region K
GesteG<
5on la su!consulta se o!tiene la lista de los
nmeros de oficina del este ' la consulta principal
o!tiene los empleados cu'o nmero de oficina sea
uno de los nmeros de oficina del este#
.or lo tanto lista los empleados de las oficinas
del este#
$l test de e$istencia EAI.T.#
$1amina si la su!consulta produce alguna fila de resultados#
.i la su"consulta contiene filas, el test adopta el alor verdadero, si la su!consulta no
contiene ninguna fila, el test toma el alor falso, nunca puede tomar el alor nulo#
5on este test la su!consulta %uede tener varias columnas, no importa 'a que el test se fija no
en los alores deueltos sino en si ha' o no fila en la ta!la resultado de la su!consulta#
5uando se utili(a el test de e1istencia en la ma'or*a de los casos ha!r- que utili(ar una
referencia e1terna# %i no se utili(a una referencia e1terna la su!consulta deuelta siempre ser-
la misma para todas las filas de la consulta principal ' en este caso se seleccionan todas las
filas de la consulta principal (si la su!consulta genera filas) o ninguna (si la su!consulta no
deuele ninguna fila)
La sinta1is es la siguiente,
.ELECT numem%, nom"re, oficina
6R,0 em%leados
B:ERE EAI.T. 7.ELECT F 6R,0
oficinas B:ERE region K GesteG +D
em%leados.oficina K
oficinas.oficina<
$ste ejemplo o!tiene lo mismo que el ejemplo del
test I+#
<!sera que delante de EAI.T. no a ningn
nom!re de columna#
$n la su!consulta se pueden poner las columnas
que queramos en la lista de seleccin (hemos
utili(ado el ?)#
Hemos a4adido una condicin adicional al B:ERE,
la de la referencia e1terna para que la oficina que se
compare sea la oficina del empleado#
6<9)# 5uando se tra!aja con ta!las mu' oluminosas el test EAI.T. suele dar mejor
rendimiento que el test I+#
Resumen del tema

0na su!consulta es una sentencia .ELECT que aparece en la lista de seleccin, o en las
cl-usulas B:ERE o :QI+8 de otra sentencia .ELECT#
La su!consulta se ejecuta por cada fila de la consulta principal#
Dentro de una consulta se puede utili(ar una columna del origen de la consulta principal,
una referencia e1terna#
)unque se puedan anidar su!consultas no es aconsejado m-s de un niel de
anidamiento#
La su!consulta sufre una serie de restricciones segn el lugar donde se encuentre#
Las condiciones asociadas a las su!consultas son las siguientes,
el test de comparacin con su!consulta
el test +1
el test LL
el test I+
el test EAI.T.
Tema S. ctualiIacin de datos (I)

Bsqueda
Introduccin
Hasta ahora hemos estudiado el cmo recuperar datos almacenados en las ta!las de
nuestra !ase de datos# $n este tema amos a tratar el de la actualiIacin de esos datos, es
decir insertar nuevas filas, "orrar filas o cam"iar el contenido de las filas de una
ta"la. $stas operaciones modifican los datos almacenados en las ta"las %ero no su
estructura, ni su definicin#
$mpe(aremos por er cmo insertar nueas filas (con la sentencia I+.ERT I+T,), eremos
una ariante (la sentencia .ELECT... I+T,), despu/s eremos cmo "orrar filas de una ta!la
(con la sentencia DELETE) ' por ltimo cmo modificar el contenido de las filas de una ta!la
(con la sentencia -/DTE)# %i tra!ajamos en un entorno multiusuario, todas estas
operaciones se podr-n reali(ar siem%re &ue tengamos los %ermisos corres%ondientes#
Insertar una fila I+.ERT I+T,...QL-E.
La insercin de nueos datos en una ta!la se reali(a a*adiendo filas enteras a la ta"la, la
sentencia %&L que lo permite es la orden I+.ERT I+T,#
La insercin se puede reali(ar de una fila o de arias filas de golpe, eremos las dos
opciones por separado ' empe(aremos por la insercin de una fila.
La sinta1is es la siguiente,
$sta sinta1is se utili(a para insertar una sola fila cu'os alores indicamos despu/s de la
pala!ra reserada QL-E.# $n castellano la sentencia se leer*a, I+.ERT E+
destino...QL,RE. ....
Los registros se agregan siempre al final de la ta"la#
Destino es el nom!re de la ta"la donde vamos a insertar la fila tam!i/n se puede
utili(ar un nom"re de consulta, consulta que tenga como origen de datos una 5nica ta"la# )l
nom!re de la ta!la se le puede a4adir la cl-usula I+ si la ta!la se encuentra en otra !ase de
datos (en una !ase de datos e1terna)#
La pala!ra reserada QL-E. se puede sustituir por la pala!ra .ELECT ( en otros %&Ls
se emplea nicamente QL-E.)#
) continuacin de la pala!ra QL-E., entre %ar)ntesis se escri"en los valores &ue
&ueremos a*adir# $stos alores se tienen que escri!ir de acuerdo al ti%o de dato de la
columna donde se an a insertar (encerrados entre comillas simples S S para alores de tipo
te1to, entre Z Z para alores de fecha###) la asignacin de valores se realiIa %or %osicin, el
primer alor lo asigna a la primera columna, el segundo alor a la segunda columna, as*
sucesiamente###
5uando la ta!la tiene una columna de ti%o contador ()uto6um!er), lo normal es no
asignar valor a esa columna para que el sistema le asigne el alor que le toque segn el
contador, si por el contrario queremos que la columna tenga un alor concreto, lo indicamos en
la lista de alores#
5uando no se indica ninguna lista de columnas despu/s del destino, se asume por
defecto todas las columnas de la ta"la, en este caso, los alores se tienen que especificar en
el mismo orden en que aparecen las columnas en la entana de dise*o de dic3a ta"la, ' se
tiene que utili(ar el alor +-LL para rellenar las columnas de las cuales no tenemos alores#
$jemplo,
I+.ERT I+T, em%leados QL-E. 7(>>, GMuan L%eIG, =>, +-LL, Gre% ventasG, T>SJ(=J>'T,
+-LL, =;>>>>, ><
<!serar en el ejemplo que los alores de tipo te1to se encierran entre comillas simples S S
(tam!i/n se pueden emplear las comillas do!les R R) ' que la fecha de contrato se encierra entre
almohadillas Z Z con el formato mes:dia:a4o# 5omo no tenemos alor para los campos oficina '
director (a este nueo empleado toda*a no se le ha asignado director ni oficina) utili(amos la
pala!ra reserada +-LL# Los alores num/ricos se escri!en tal cual, para separar la parte
entera de la parte decimal ha' que utili(ar siempre el punto independientemente de la
configuracin que tengamos#
Cuando indicamos nom"res de columnas, estos corresponden a nom!res de columna
de la ta"la, pero no tienen por qu/ estar en el orden en que aparecen en la entana dise4o de
la ta!la, tam!i/n se %ueden omitir algunas columnas, la columnas que no se nom!ran
tendr-n %or defecto el valor +-LL o el valor %redeterminado indicado en la entana de
dise4o de ta!la#
$l ejemplo anterior se podr*a escri!ir de la siguiente forma,
I+.ERT I+T, em%leados 7numem%,oficina, nom"re, titulo,cuota, contrato, ventas<
QL-E. 7(>>, =>, GMuan L%eIG, Gre% ventasG,=;>>>>, T>SJ(=J>'T,><
<!serar que ahora hemos ariado el orden de los alores ' los nom!res de columna no
siguen el mismo orden que en la ta!la origen, no importa, lo importante es poner los alores en
el mismo orden que las columnas que enunciamos# 5omo no enunciamos las columnas oficina
' director se rellenar-n con el alor nulo (porque es el alor que tienen esas columnas como
alor predeterminado)#
$l utili(ar la opcin de %oner una lista de columnas podr*a parecer peor 'a que se tiene
que escri!ir m-s pero realmente tiene ventajas so!re todo cuando la sentencia la vamos a
almacenar # reutiliIar,
la sentencia queda ms fcil de inter%retar le'/ndola emos qu/ alor asignamos a qu/
columna,
de paso nos aseguramos que el alor lo asignamos a la columna que queremos,
si por lo que sea cam"ia el orden de las columnas en la ta"la en el dise4o, no pasar*a
nada mientras que de la otra forma intentar*a asignar los alores a otra columna, esto
producir*a errores de $tipo no corresponde$ ' lo que es peor podr*a asignar alores errneos sin
que nos demos cuenta,
otra entaja es que si se a*ade una nueva columna a la ta"la en el dise4o, la primera
sentencia I6%$;9 dar*a error 'a que el nmero de alores no corresponde con el nmero de
columnas de la ta!la, mientras que la segunda I+.ERT no dar*a error ' en la nuea columna se
insertar*a el alor predeterminado#

Errores &ue se %ueden %roducir cuando se ejecuta la sentencia I+.ERT I+T,,
.i la ta"la de destino tiene clave %rinci%al ' en ese campo intentamos no asignar alor,
asignar el alor nulo o un alor que 'a e1iste en la ta!la, el motor de !ase de datos Microsoft
+et no a4ade la fila ' da un mensaje de error de S infracciones de claveS#
.i tenemos definido un ndice 5nico (sin duplicados) e intentamos asignar un alor que 'a
e1iste en la ta!la tam!i/n deuele el mismo error#
.i la ta"la est relacionada con otra, se seguir-n las reglas de integridad referencial
Insertar varias filas I+.ERT I+T,....ELECT
.odemos insertar en una ta"la varias filas con una sola sentencia .ELECT I+T, si los
alores a insertar se pueden o!tener como resultado de una consulta, en este caso sustituimos
la cl-usula QL-E. lista de valores por una sentencia .ELECT como las que hemos isto
hasta ahora# Cada fila resultado de la .ELECT forma una lista de valores que son los que
se insertan en una nuea fila de la ta!la destino# $s como si tuiesemos
una I+.ERT...QL-E. por cada fila resultado de la sentencia .ELECT#
La sinta1is es la siguiente,
$l origen de la .ELECT puede ser el nom"re de una consulta guardada, un nom"re
de ta"la o una com%osicin de varias ta"las ( mediante I++ER M,I+, LE6T M,I+, RI8:T
M,I+ o producto cartesiano)#
Cada fila devuelta por la .ELECT act5a como la lista de valores que imos con
la I+.ERT...QL-E. por lo que tiene las mismas restricciones en cuanto a tipo de dato, etc#
La asignacin de valores se realiIa %or %osicin por lo que la .ELECT de!e deoler
el mismo n5mero de columnas que las de la ta!la destino ' en el mismo orden, o el mismo
nmero de columnas que indicamos en la lista de columnas despu/s de destino#
Las columnas de la .ELECT no tienen %or&ue llamarse igual &ue en la ta"la
destino 'a que el sistema slo se fija en los alores deueltos por la .ELECT#
.i no &ueremos asignar valores a todas las columnas entonces tenemos que
indicar entre %ar)ntesis la lista de columnas a rellenar des%u)s del nom"re del destino.
$l estndar +.IJI., especifica varias restricciones so"re la consulta que aparece
dentro de la sentencia I+.ERT,
la consulta no puede tener una cl-usula ,RDER !1,
la ta!la destino de la sentencia I+.ERT no puede aparecer en la cl-usula 6R,0 de la
consulta o de ninguna su!consulta que /sta tenga# $sto prohi!e insertar parte de una ta!la en
s* misma,
la consulta no puede ser la -+I,+ de arias sentencias .ELECT diferentes,
el resultado de la consulta de!e contener el mismo nmero de columnas que las indicadas
para insertar ' los tipos de datos de!en ser compati!les columna a columna#
%in em!argo en .4L de 0icrosoft Met,
se %uede incluir la clusula ,RDER !1 aun&ue no tiene muc3o sentido.
se %uede %oner en la cl-usula 6R,0 de la consulta, la ta"la en la que amos a insertar,
pero no podemos utili(ar una -+I,+#

$jemplo, %upongamos que tenemos una ta!la llamada repres con la misma estructura que la
ta!la empleados, ' queremos insertar en esa ta!la los empleados que tengan como titulo rep
ventas
I+.ERT I+T, re%res .ELECT F 6R,0 em%leados B:ERE titulo K Gre% ventasG
5on la .ELECT o!tenemos las filas correspondientes a los empleados con t*tulo rep
ventas,' las insertamos en la ta!la repres# 5omo las ta!las tienen la misma estructura no hace
falta poner la lista de columnas ' podemos emplear ? en la lista de seleccin de la .ELECT#
$jemplo, %upongamos ahora que la ta!la repres tuiese las siguientes
columnas numemp, oficinarep, nombrerep# $n este caso no podr*amos utili(ar el asterisco,
tendr*amos que poner,
I+.ERT I+T, re%res .ELECT numem%, oficina, nom"re 6R,0 em%leados B:ERE titulo
K Gre% ventasG
< !ien,
I+.ERT I+T, re%res 7numem%, oficinare%, nom"rere%< .ELECT numem%, oficina, nom"re
6R,0 em%leados B:ERE titulo K Gre% ventasG
Insertar filas en una nueva ta"la .ELECT ... I+T,
$sta sentencia inserta filas creando en ese momento la ta"la donde se insertan las filas#
%e suele utili(ar %ara guardar en una ta"la el resultado de una .ELECT#
La sinta$is es la siguiente,
Las columnas de la nueva ta"la tendr-n el mismo ti%o # tama*o &ue las columnas
origen, ' se llamarn con el nom"re de alias de la columna origen o en su defecto con el
nom"re de la columna origen, pero no se transfiere ninguna otra %ro%iedad del campo o
de la ta!la como %or ejem%lo las claves e ndices.
La sentencia .ELECT puede ser cual&uier sentencia .ELECT sin ninguna restriccin,
puede ser una consulta multita!la, una consulta de resumen, una -+I,+ ###
$jemplo,
.ELECT F I+T, t( 6R,0 t'
$sta sentencia genera una nuea ta!la t3 con todas las filas de la ta!la t2# Las columnas se
llamar-n igual que en t2 pero t3 no ser- una copia e1acta de t2 'a no tendr- clae principal ni
relaciones con las otras ta!las, ni *ndices si los tuiese t2 etc###
.i en la "ase de datos 3a# #a una ta"la del mismo nom"re, el sistema nos avisa '
nos pregunta si la queremos !orrar# %i le contestamos que no, la .ELECT no se ejecuta#
/ara formar una sentencia .ELECT I+T, lo mejor es escri"ir la .ELECT que permite
generar los datos que queremos guardar en la nuea ta!la, ' des%u)s a*adir delante de la
cl-usula 6R,0 la cl-usulaI+T, nuevata"la#
La sentencia .ELECT I+T, se suele utiliIar %ara crear ta"las de tra"ajo, o ta!las
intermedias, las creamos para una determinada tarea ' cuando hemos terminado esa tarea las
!orramos# 9am!i/n puede ser til %ara sacar datos en una ta"la %ara enviarlos a alguien#
.or ejemplo, &ueremos eniarle a un representante una ta!la con todos los datos personales
de sus clientes para que les pueda eniar cartas etc###
.ELECT numclie . codigo, nom"re, direccion, telefono I+T, susclientes 6R,0 clientes
B:ERE re%clie K G'>=G"
Kamos a suponer que hemos a4adido a nuestra ta!la de clientes los campos direccion '
telefono# $n el ejemplo anterior la nuea ta!la tendr- cuatro columnas
llamadas codi"o, nombre, direccion, telefono ' contendr- las filas correspondientes a los
clientes del representante 28=#
0odificar el contenido de las filas 7 -/DTE <
La sentencia -/DTE modifica los valores de una o ms columnas en las filas
seleccionadas de una o varias ta"las#
La sinta1is es la siguiente,
,rigen puede ser un nom"re de ta"la, un nom"re de consulta o una com%osicin de
ta"las, tam!i/n puede incluir la cl-usula I+ si la ta!la a modificar se encuentra en una !ase de
datos e1terna#
La cl-usula .ET especifica &u) columnas van a modificarse ' &u) valores asignar a
esas columnas#
n"columna, es el nom"re de la columna a la cual &ueremos asignar un nuevo
valor por lo tanto de!e ser una columna de la ta!la origen# $l %&L est-ndar e1ige nom!res sin
cualificar pero algunas implementaciones (como por ejemplo el %&L de Microsoft +et que
estamos estudiando) s* lo permiten#
La e$%resin en cada asignacin de"e generar un valor del ti%o de dato
a%ro%iado para la columna indicada# La e1presin de"e ser calcula"le a %artir de los
valores de la fila &ue se est actualiIando# %presin no %uede ser una su"consulta#
$jemplo,
-/DTE oficinas I++ER M,I+ em%leados
,+ oficinas.oficina K em%leados.oficina
.ET cuotaKo"jetivoF>.>'@
$n este ejemplo queremos actuali(ar las cuotas de nuestros empleados de tal forma que la
cuota de un empleado sea el 2I del o!jetio de su oficina# La columna a actuali(ar es la cuota
del empleado ' el alor a asignar es el 2I del o!jetio de la oficina del empleado, luego la
cl-usula .ET ser- .ET cuota K o"jetivoF>.>' o .ET cuota K o"jetivoJ'>># $l origen de!e
contener la cuota del empleado ' el o!jetio de su oficina, luego el origen ser- el I++ER
M,I+ de empleados con oficinas#
La cl-usula B:ERE indica &u) filas van a ser modificadas# .i se omite la
cl-usula B:ERE se actualiIan todas las filas#
$n la condicin del B:ERE se %uede incluir una su"consulta# $n %&L standard la
ta!la que aparece en la 6R,0 de la su!consulta no puede ser la misma que la ta!la que
aparece como origen, pero en el %&L de Microsoft +et s* se puede#
$jemplo, &ueremos poner a cero las entas de los empleados de la oficina 23
-/DTE em%leados .ET ventas K > B:ERE oficina K '(@
$jemplo, &ueremos poner a cero el limite de credito de los clientes asignados a empleados
de la oficina 23#
-/DTE clientes .ET limitecredito K >
B:ERE re%clie I+ 7.ELECT numem% 6R,0 em%leados B:ERE oficina K '(<@
%i para el c-lculo de epresion se utili(a una columna que tam!i/n se modifica, el alor
que se utili(a es el antes de la modificacin, lo mismo para la condicin de !squeda#
5uando se ejecuta una sentencia -/DTE %rimero se genera el origen # se
seleccionan las filas segn la cl-usula B:ERE# ) continuacin se coge una fila de la
seleccin # se le a%lica la clusula .ET,se actualiIan todas las columnas incluidas en la
cl-usula .ET a la veI por lo que los nom!res de columna pueden especificarse en cualquier
orden# Despu/s se coge la siguiente fila de la seleccin ' se le aplica del mismo modo la
cl-usula .ET, as* sucesiamente con todas las filas de la seleccin#
$jemplo,
-/DTE oficinas .ET ventasK>, o"jetivoKventas@
< !ien,
-/DTE oficinas .ET o"jetivoKventas, ventasK>@
Los dos ejemplos anteriores son equialentes 'a que el alor de ventas que se asigna
a ob&etivo es el alor antes de la actuali(acin, se deja como ob&etivo las entas que ha tenido
la oficina hasta el momento ' se pone a cero la columna ventas#
.i actualiIamos una columna definida como clave fornea, esta columna se podr-
actuali(ar o no siguiendo las reglas de integridad referencial# $l alor que se le asigna de!e
e1istir en la ta!la de referencia#
.i actualiIamos una columna definida como columna %rinci%al de una relacin
entre dos ta"las, esta columna se podr- actuali(ar o no siguiendo las reglas de integridad
referencial
!orrar filas 7DELETE<
La sentencia DELETE elimina filas de una ta"la#
La sinta1is es la siguiente,
,rigen es el nom!re de la ta"la de donde vamos a "orrar, podemos indicar un nom!re
de ta!la, incluir la cl-usula I+ si la ta!la se encuentra en una !ase de datos e1terna, tam!i/n
podemos escri!ir una composicin de ta!las#
La opcin ta"la.F se utili(a cuando el origen est "asado en varias ta"las, ' sire para
indicar en &u) ta"la vamos a "orrar#
La opcin F es opcional ' es la que se asume %or defecto ' se puede poner unicamente
cuando el origen es una sola ta"la#
La cl-usula B:ERE sire para especificar &u) filas &ueremos "orrar# %e eliminaran de
la ta!la todas las filas que cumplan la condicin# %i no se indica la clusula B:ERE, se
"orran T,D. las filas de la ta!la#
En la condicin de "5s&ueda de la sentencia DELETE, se %uede utiliIar una
su"consulta# $n %&L standard la ta!la que aparece en la 6R,0 de la su!consulta no puede
ser la misma que la ta!la que aparece en la 6R,0 de la DELETE pero en el %&L de Microsoft
+et s* se puede hacer#
0na e( !orrados, los registros no se %ueden recu%erar#
.i la ta"la donde "orramos est relacionada con otras ta"las se podr-n !orrar o no
los registros siguiendo las reglas de integridad referencial definidas en las relaciones# )qu*
puedes repasar las reglas de integridad referencial#
$jemplo,
DELETE F 6R,0 %edidos B:ERE clie I+ 7.ELECT numclie 6R,0 clientes B:ERE
nom"re K GMulian L%eIG<@
< !ien,
DELETE %edidos.F 6R,0 %edidos I++ER M,I+ clientes ,+ %edidos.clie K
clientes.numclie B:ERE nom"re K GMulian L%eIG@
Las dos sentencias !orran los pedidos del cliente 'ulian (pe)# $n la segunda estamos
o!ligados a poner pedidos#? porque el origen est- !asado en arias ta!las#
DELETE F 6R,0 %edidos@ o DELETE 6R,0 %edidos@ Borra todas las filas de pedidos#

Resumen del tema
%i queremos a*adir en una ta!la una fila con valores conocidos utili(amos la
sentencia I+.ERT I+T, ta"la QL-E. 7lista de valores<#
.i los valores a insertar se encuentran en una o arias ta"las utili(amos I+.ERT I+T,
ta"la .ELECT ...
.ara crear una nueva ta"la con el resultado de una consulta con la
sentencia .ELECT...I+T, ta"la 6R,0...
.ara cam"iar los datos contenidos en una ta"la, tenemos que actuali(ar las filas de
dicha ta!la con la sentencia -/DTE ta"la .ET asignacin de nuevos valores#
.ara eliminar filas de una ta"la se utili(a la sentencia DELETE 6R,0 ta"la#
5on la cl-usula B:ERE podemos indicar a &u) filas afecta la actualiIacin o el
"orrado#
Tema U. Ta"las de referencias
cruIadas (I)

Bsqueda
Introduccin
5uando queremos representar una consulta sumaria con dos
columnas de agru%acin como una ta"la de do"le entrada en
la &ue cada una de las columnas de agru%acin es una
entrada de la ta"la utiliIaremos una consulta de ta!la de
referencias cru(adas#
.or ejemplo queremos o!tener las entas mensuales de
nuestros empleados# 9enemos que dise4ar una consulta sumaria
calculando la suma de los importes de los pedidos agrupando por
empleado ' mes de la enta#
La consulta ser*a,
.ELECT re% as em%leado, mont37fec3a%edido< as mes,
sum7im%orte< as vendido
6R,0 %edidos
8R,-/ !1 re%, mont37fec3a%edido<
$l resultado ser*a la ta!la que aparece a la derecha,

La consulta quedar*a mucho m-s elegante ' clara presentando los datos en un formato
m-s compacto como el siguiente,
.ues este ltimo resultado se o!tiene mediante una consulta de referencias cru(adas#
<!serar que una de las columnas de agrupacin (rep) sigue definiendo las filas que aparecen
(ha' una fila por cada empleado), mientras que la otra columna de agrupacin (mes) ahora
sire para definir las otras columnas, cada alor de mes define una columna en el resultado, '
la celda en la interseccin de un alor de rep ' un alor de mes es la columna resumen, la que
contiene la funcin de columna (la suma de importe)#
Las consultas de referencias cru(adas se pueden crear utili(ando el asistente, es mucho m-s
cmodo pero es til sa!er cmo hacerlo directamente en %&L por si queremos ariar algn
dato una e( reali(ada la consulta con el asistente o si queremos definir una consulta de
referencias cru(adas que no se puede definir con el asistente#

La sentencia TR+.6,R0
La sentencia TR+.6,R0 es la que se utili(a %ara definir una consulta de referencias
cruIadas#
La sinta1is es la siguiente,
Resultado es la funcin de columna que permite o!tener el resultado de las celdas#
$n la .ELECT la columna fija es la columna que define el enca"eIado de filas, el
origen que indicamos en la cl-usula Q;<M es la ta!la (o ta!las) de donde sacamos la
informacin, ' en la cl-usula 8R,-/ !1ponemos la columna &ue va a definir las filas del
resultado#
La .ELECT puede contener una cl-usula B:ERE para seleccionar la filas que se utili(an
para calcular el resultado, puede contener su!consultas pero no la cl-usula :QI+8#
$n la cl-usula /IQ,T indicamos la columna cu'os alores an a definir columnas
dinmicas del resultado a esta columna la llamaremos %ivote#
La cl-usula I+ permite definir el conjunto de valores &ue &ueremos &ue a%areIcan
como columnas dinmicas#
$s coneniente que la columna piote que sire de enca"eIado de columna tenga
un n5mero limitado de %osi"les valores para que no se generen demasiadas columnas# $n
nuestro ejemplo es mejor utili(ar el mes como enca!e(ado de columna ' no de fila 'a que
posi!les empleados ha' muchos m-s ' adem-s el mes toma alores que conocemos '
podemos utili(ar por lo tanto la cl-usula I+ para que apare(can todos los meses del a4o#

$n nuestro ejemplo resultado ser*a .-07im%orte<, la columna fija es rep con un alias
para que salga la pala!ra empleado en el enca!e(ado, el origen de datos es la ta!la pedidos
(porque el resultado.-07im%orte< se o!tiene de pedidos), la columna del 8R,-/ !1 es rep
'a que queremos una fila por cada representante, la columna din-mica, la que ponemos en la
cl-usula /IQ,T ser*a 0,+T:7fec3a%edido<#
La sentencia quedar*a de la siguiente forma,
TR+.6,R0 .um7im%orte<
.ELECT re% as em%leado
6R,0 %edidos
8R,-/ !1 re%
/IQ,T mont37fec3a%edido<
Lo mejor para montar una consulta de referencias cru(adas en %&L es pensar la sumaria
normal ' luego distri!uir los t/rminos segn corresponda#
Las columnas dinmicas
5omo hemos dicho las columnas din-micas son las que se generan segn los alores
almacenados en la columna piote (la que aparece en la cl-usula /IQ,T), normalmente se
genera una columna din-mica por cada alor que se encuentre en la columna piote del origen
de datos#
5uando los posi!les alores que puede tomar la columna piote son conocidos ' queremos
definir cuales queremos que apare(can, slo unos cuantos porque no nos interesan algunos o
todos incluso si no generan resultado, en este caso usaremos la cl-usula I+, en la
cl-usula I+ se ponen entre par/ntesis todos los posi!les alores, o por lo menos los que
queremos que apare(can en el resultado#
.or ejemplo slo nos interesan los meses de fe!rero, ma'o ' diciem!re,

TR+.6,R0 .um7im%orte<
.ELECT re% as em%leado
6R,0 %edidos
8R,-/ !1 re%
/IQ,T mont37fec3a%edido< I+ 7(,;,'(<@
%i no utili(amos la cl-usula I+, los meses de ma'o ' septiem!re no aparecen 'a que no ha'
pedidos reali(ados durante estos meses, si utili(amos la cl-usula I+ ' definimos los doces
alores posi!les, s* aparecen las columnas correspondientes a estos meses ' o!seramos que
ningn empleado tiene entas en esos mes#
TR+.6,R0
.um7im%orte<
.ELECT re% as
em%leado
6R,0 %edidos
8R,-/ !1 re%
/IQ,T
mont37fec3a%edido
< I+
7',(,=,?,;,S,U,8,N,'>,
'','(<@
La cl-usula I+ tam!i/n sire para cam!iar el orden de aparicin de las columnas din-micas,
las columnas aparecen en el mismo orden en que aparecen en la cl-usula I+.
TR+.6,R0
.um7im%orte<
.ELECT re% as
em%leado
6R,0 %edidos
8R,-/ !1 re%
/IQ,T
mont37fec3a%edido
< I+
7'>,'','(,',(,=,?,;,S,
U,8,N<@
Las columnas fijas
Las columnas fijas son las que aparecen delante de las columnas din-micas ' son fijas
porque se genera una sola columna en el resultado por cada columna ha'amos indicado en la
lista de columnas fijas# Las columnas fijas se indican en la lista de seleccin de la sentencia
%$L$59, una columna fija que siempre de!emos incluir es la que sire de enca!e(ado de fila
para que podamos sa!er cada fila a qu/ alor de enca!e(ado de fila corresponde# .ero
adem-s podemos incluir otras columnas por ejemplo columnas de resumen de cada fila, sin
que se tenga en cuenta la agrupacin por la columna piote#
.or ejemplo queremos sa!er para cada empleado cu-nto ha endido en total ' cu-l ha sido
el importe ma'or endido en un pedido#
TR+.6,R0
.um7im%orte< .
.uma
.ELECT re% .
em%leado,
.-07im%orte< .
OTotal
vendidoP,0A7im
%orte< . ma#or
6R,0 %edidos
8R,-/ !1 re%
/IQ,T
mont37fec3a%edi
do< @
Resumen del tema
La instruccin TR+.6,R0 se utili(a %ara definir una consulta de referencias cruIadas#
.ermite presentar los resultados de una sumaria en una ta!la de do!le entrada como la que
se presenta a continuacin,

Das könnte Ihnen auch gefallen