Está en la página 1de 29

Manual SQL

Indice
1. Introduccin
2. Consultas de Seleccin
3. Criterios de Seleccin
4. Agrupamiento de Registros
5. Consultas de Accin
. !ipos de "atos
#. Su$Consultas
%. Consultas de Re&erencias Cru'adas
(. Consultas de )nin Internas
1*. Consultas de )nin +,ternas
11. +structuras de las !a$las
12. Consultas con -ar.metros
13. /ases de "atos +,ternas
14. 0mitir los -ermisos de +1ecucin
15. La Cl.usula -R0C+")R+
1. Ane,os
1. Introduccin
El lenguaje de consulta estructurado (SQL) es un lenguaje de base de datos normalizado, utilizado por el motor de
base de datos de Microsoft Jet. SQL se utiliza para crear objetos Queryef, como el argumento de origen del m!todo
"pen#ecordSet y como la propiedad #ecordSource del control de datos. $ambi!n se puede utilizar con el m!todo
E%ecute para crear y manipular directamente las bases de datos Jet y crear consultas SQL de paso a tra&!s para
manipular bases de datos remotas cliente ' ser&idor.
(omponentes del SQL
El lenguaje SQL est) compuesto por comandos, cl)usulas, operadores y funciones de agregado. Estos elementos se
combinan en las instrucciones para crear, actualizar y manipular las bases de datos.
(omandos
E%isten dos tipos de comandos SQL*
los LL +ue permiten crear y definir nue&as bases de datos, campos e ,ndices.
los ML +ue permiten generar consultas para ordenar, filtrar y e%traer datos de la base de datos.

(omandos LL
(omando escripci-n
(#E.$E /tilizado para crear nue&as tablas, campos e ,ndices
#"0 Empleado para eliminar tablas e ,ndices
.L$E#
/tilizado para modificar las tablas agregando campos o cambiando la definici-n de
los campos.

(omandos ML
(omando escripci-n
SELE($
/tilizado para consultar registros de la base de datos +ue satisfagan un criterio
determinado
12SE#$ /tilizado para cargar lotes de datos en la base de datos en una 3nica operaci-n.
/0.$E /tilizado para modificar los &alores de los campos y registros especificados
ELE$E /tilizado para eliminar registros de una tabla de una base de datos
(l)usulas
Las cl)usulas son condiciones de modificaci-n utilizadas para definir los datos +ue desea seleccionar o manipular.

(l)usula escripci-n
4#"M /tilizada para especificar la tabla de la cual se &an a seleccionar los registros
56E#E
/tilizada para especificar las condiciones +ue deben reunir los registros +ue se &an
a seleccionar
7#"/0 89 /tilizada para separar los registros seleccionados en grupos espec,ficos
6.:127 /tilizada para e%presar la condici-n +ue debe satisfacer cada grupo
"#E# 89
/tilizada para ordenar los registros seleccionados de acuerdo con un orden
espec,fico
"peradores L-gicos

"perador /so
.2
Es el ;y; l-gico. E&alua dos condiciones y de&uel&e un &alor de &erdad s-lo si ambas
son ciertas.
"#
Es el ;o; l-gico. E&al3a dos condiciones y de&uel&e un &alor de &erdad si alguna de
las dos es cierta.
2"$ 2egaci-n l-gica. e&uel&e el &alor contrario de la e%presi-n.
"peradores de (omparaci-n

"perador /so
< Menor +ue
= Mayor +ue
<= istinto de
<> Menor - 1gual +ue
=> Mayor - 1gual +ue
> 1gual +ue
8E$5EE2 /tilizado para especificar un inter&alo de &alores.
L1?E /tilizado en la comparaci-n de un modelo
1n
/tilizado para especificar registros de una base de datos

4unciones de .gregado
Las funciones de agregado se usan dentro de una cl)usula SELE($ en grupos de registros para de&ol&er un 3nico
&alor +ue se aplica a un grupo de registros.

4unci-n escripci-n
.:7 /tilizada para calcular el promedio de los &alores de un campo determinado
("/2$ /tilizada para de&ol&er el n3mero de registros de la selecci-n
S/M /tilizada para de&ol&er la suma de todos los &alores de un campo determinado
M.@ /tilizada para de&ol&er el &alor m)s alto de un campo especificado
M12 /tilizada para de&ol&er el &alor m)s bajo de un campo especificado

2. Consultas de Seleccin
Las consultas de selecci-n se utilizan para indicar al motor de datos +ue de&uel&a informaci-n de las bases de datos,
esta informaci-n es de&uelta en forma de conjunto de registros +ue se pueden almacenar en un objeto recordset. Este
conjunto de registros es modificable.
(onsultas b)sicas
La sinta%is b)sica de una consulta de selecci-n es la siguiente*
SELE($ (ampos 4#"M $ablaA
En donde campos es la lista de campos +ue se deseen recuperar y tabla es el origen de los mismos, por ejemplo*
SELE($ 2ombre, $elefono 4#"M (lientesA
Esta consulta de&uel&e un recordset con el campo nombre y tel!fono de la tabla clientes.
"rdenar los registros
.dicionalmente se puede especificar el orden en +ue se desean recuperar los registros de las tablas mediante la
cla3sula "#E# 89 Lista de (ampos. En donde Lista de campos representa los campos a ordenar. Ejemplo*
SELE($ (odigo0ostal, 2ombre, $elefono 4#"M (lientes "#E# 89 2ombreA
Esta consulta de&uel&e los campos (odigo0ostal, 2ombre, $elefono de la tabla (lientes ordenados por el campo
2ombre.
Se pueden ordenar los registros por mas de un campo, como por ejemplo*
SELE($ (odigo0ostal, 2ombre, $elefono 4#"M (lientes "#E# 89
(odigo0ostal, 2ombreA
1ncluso se puede especificar el orden de los registros* ascendente mediante la cla3sula (.S( 'se toma este &alor por
defecto) - descendente (ES()
SELE($ (odigo0ostal, 2ombre, $elefono 4#"M (lientes "#E# 89
(odigo0ostal ES( , 2ombre .S(A
(onsultas con 0redicado
El predicado se incluye entre la cla3sula y el primer nombre del campo a recuperar, los posibles predicados son*
0redicado escripci-n
.LL e&uel&e todos los campos de la tabla
$"0 e&uel&e un determinado n3mero de registros de la tabla
1S$12($ "mite los registros cuyos campos seleccionados coincidan totalmente
1S$12($#"5
"mite los registros duplicados basandose en la totalidad del registro y no
s-lo en los campos seleccionados.
.LL
Si no se incluye ninguno de los predicados se asume .LL. El Motor de base de datos selecciona todos los registros
+ue cumplen las condiciones de la instrucci-n SQL. 2o se con&eniente abusar de este predicado ya +ue obligamos al
motor de la base de datos a analizar la estructura de la tabla para a&eriguar los campos +ue contiene, es mucBo m)s
r)pido indicar el listado de campos deseados.
SELE($ .LL 4#"M EmpleadosA
SELE($ C 4#"M EmpleadosA
$"0
e&uel&e un cierto n3mero de registros +ue entran entre al principio o al final de un rango especificado por una
cl)usula "#E# 89. Supongamos +ue +ueremos recuperar los nombres de los DE primeros estudiantes del curso
FGGH*
SELE($ $"0 DE 2ombre, .pellido 4#"M Estudiantes
"#E# 89 2ota ES(A
Si no se incluye la cl)usula "#E# 89, la consulta de&ol&er) un conjunto arbitrario de DE registros de la tabla
Estudiantes .El predicado $"0 no elige entre &alores iguales. En el ejemplo anterior, si la nota media n3mero DE y la DI
son iguales, la consulta de&ol&er) DI registros. Se puede utilizar la palabra reser&ada 0E#(E2$ para de&ol&er un
cierto porcentaje de registros +ue caen al principio o al final de un rango especificado por la cl)usula "#E# 89.
Supongamos +ue en lugar de los DE primeros estudiantes deseamos el FJ por ciento del curso*
SELE($ $"0 FJ 0E#(E2$ 2ombre, .pellido 4#"M Estudiantes
"#E# 89 2ota ES(A
El &alor +ue &a a continuaci-n de $"0 debe ser un 1nteger sin signo.$"0 no afecta a la posible actualizaci-n de la
consulta.
1S$12($
"mite los registros +ue contienen datos duplicados en los campos seleccionados. 0ara +ue los &alores de cada campo
listado en la instrucci-n SELE($ se incluyan en la consulta deben ser 3nicos.
0or ejemplo, &arios empleados listados en la tabla Empleados pueden tener el mismo apellido. Si dos registros
contienen L-pez en el campo .pellido, la siguiente instrucci-n SQL de&uel&e un 3nico registro*
SELE($ 1S$12($ .pellido 4#"M EmpleadosA
(on otras palabras el predicado 1S$12($ de&uel&e a+uellos registros cuyos campos indicados en la cl)usula
SELE($ posean un contenido diferente. El resultado de una consulta +ue utiliza 1S$12($ no es actualizable y no
refleja los cambios subsiguientes realizados por otros usuarios.
1S$12($#"5
e&uel&e los registros diferentes de una tablaA a diferencia del predicado anterior +ue s-lo se fijaba en el contenido de
los campos seleccionados, !ste lo Bace en el contenido del registro completo independientemente de los campo
indicados en la cl)usula SELE($.
SELE($ 1S$12($#"5 .pellido 4#"M EmpleadosA
Si la tabla empleados contiene dos registros* .ntonio L-pez y Marta L-pez el ejemplo del predicado 1S$12($
de&ule&e un 3nico registro con el &alor L-pez en el campo .pellido ya +ue busca no duplicados en dicBo campo. Este
3ltimo ejemplo de&uel&e dos registros con el &alor L-pez en el apellido ya +ue se buscan no duplicados en el registro
completo.

.lias
En determinadas circunstancias es necesario asignar un nombre a alguna columna determinada de un conjunto
de&uelto, otras &eces por simple capricBo o por otras circunstancias. 0ara resol&er todas ellas tenemos la palabra
reser&ada .S +ue se encarga de asignar el nombre +ue deseamos a la columna deseada. $omado como referencia el
ejemplo anterior podemos Bacer +ue la columna de&uelta por la consulta, en lugar de llamarse apellido (igual +ue el
campo de&uelto) se llame Empleado. En este caso proceder,amos de la siguiente forma*
SELE($ 1S$12($#"5 .pellido .S Empleado 4#"M EmpleadosA
#ecuperar 1nformaci-n de una base de atos E%terna
0ara concluir este cap,tulo se debe Bacer referencia a la recuperaci-n de registros de bases de datos e%terna. Es
ocasiones es necesario la recuperaci-n de informaci-n +ue se encuentra contenida en una tabla +ue no se encuentra
en la base de datos +ue ejecutar) la consulta o +ue en ese momento no se encuentra abierta, esta situaci-n la
podemos sal&ar con la palabra reser&ada 12 de la siguiente forma*
SELE($ 1S$12($#"5 .pellido .S Empleado 4#"M Empleados
12 Kc*LdatabasesLgestion.mdbKA
En donde c*LdatabasesLgestion.mdb es la base de datos +ue contiene la tabla Empleados.
3. Criterios de Seleccin
En el cap,tulo anterior se &io la forma de recuperar los registros de las tablas, las formas empleadas de&ol&,an todos
los registros de la mencionada tabla. . lo largo de este cap,tulo se estudiar)n las posibilidades de filtrar los registros
con el fin de recuperar solamente a+uellos +ue cumplan una condiciones preestablecidas.
.ntes de comenzar el desarrollo de este cap,tulo Bay +ue recalcar tres detalles de &ital importancia. El primero de ellos
es +ue cada &ez +ue se desee establecer una condici-n referida a un campo de te%to la condici-n de b3s+ueda debe ir
encerrada entre comillas simplesA la segunda es +ue no se posible establecer condiciones de b3s+ueda en los campos
memo yA la tercera y 3ltima Bace referencia a las fecBas. Las fecBas se deben escribir siempre en formato mm'dd'aa
en donde mm representa el mes, dd el d,a y aa el aMo, Bay +ue prestar atenci-n a los separadores 'no sir&e la
separaci-n Babitual de la barra (N), Bay +ue utilizar el gui-n (') y adem)s la fecBa debe ir encerrada entre almoBadillas
(O). 0or ejemplo si deseamos referirnos al d,a P de Septiembre de FGGE deberemos Bacerlo de la siguente formaA OJG'
JP'GEO - OG'P'GEO.
P.F "peradores L-gicos
Los operadores l-gicos soportados por SQL son* .2, "#, @"#, E+&, 1mp, 1s y 2ot. . e%cepci-n de los dos 3ltimos
todos poseen la siguiente sinta%is*
<e%presi-nF= operador <e%presi-nD=
En donde e%presi-nF y e%presi-nD son las condiciones a e&aluar, el resultado de la operaci-n &ar,a en funci-n del
operador l-gico. La tabla adjunta muestra los diferentes posibles resultados*

<e%presi-nF= "perador <e%presi-nD= #esultado
:erdad .2 4also 4also
:erdad .2 :erdad :erdad
4also .2 :erdad 4also
4also .2 4also 4also
:erdad "# 4also :erdad
:erdad "# :erdad :erdad
4also "# :erdad :erdad
4also "# 4also 4also
:erdad @"# :erdad 4also
:erdad @"# 4also :erdad
4also @"# :erdad :erdad
4also @"# 4also 4also
:erdad E+& :erdad :erdad
:erdad E+& 4also 4also
4also E+& :erdad 4also
4also E+& 4also :erdad
:erdad 1mp :erdad :erdad
:erdad 1mp 4also 4also
:erdad 1mp 2ull 2ull
4also 1mp :erdad :erdad
4also 1mp 4also :erdad
4also 1mp 2ull :erdad
2ull 1mp :erdad :erdad
2ull 1mp 4also 2ull
2ull 1mp 2ull 2ull
Si a cual+uiera de las anteriores condiciones le anteponemos el operador 2"$ el resultado de la operaci-n ser) el
contrario al de&uelto sin el operador 2"$.
El 3ltimo operador denominado 1s se emplea para comparar dos &ariables de tipo objeto <"bjetoF= 1s <"bjetoD=. este
operador de&uel&e &erdad si los dos objetos son iguales
SELE($ C 4#"M Empleados 56E#E Edad = DE .2 Edad < EJA
SELE($ C 4#"M Empleados 56E#E (Edad = DE .2 Edad < EJ) "# Sueldo > FJJA
SELE($ C 4#"M Empleados 56E#E 2"$ Estado > KSolteroKA
SELE($ C 4#"M Empleados 56E#E (Sueldo = FJJ .2 Sueldo < EJJ) "#
0ro&incia > KMadridK .2 Estado > K(asadoK)A
1nter&alos de :alores
0ara indicar +ue deseamos recuperar los registros seg3n el inter&alo de &alores de un campo emplearemos el
operador 8etQeen cuya sinta%is es* campo R2otS 8etQeen &alorF .nd &alorD (la condici-n 2ot es opcional)
En este caso la consulta de&ol&er,a los registros +ue contengan en ;campo; un &alor incluido en el inter&alo &alorF,
&alorD (ambos inclusi&e). Si anteponemos la condici-n 2ot de&ol&er) a+uellos &alores no incluidos en el inter&alo.
SELE($ C 4#"M 0edidos 56E#E (od0ostal 8etQeen DTJJJ .nd DTGGGA
(e&uel&e los pedidos realizados en la pro&incia de Madrid)
SELE($ 11f((od0ostal 8etQeen DTJJJ .nd DTGGG, K0ro&incialK, K2acionalK)
4#"M EditoresA
(e&uel&e el &alor K0ro&incialK si el c-digo postal se encuentra en el inter&alo,
K2acionalK en caso contrario)
El "perador LiUe
Se utiliza para comparar una e%presi-n de cadena con un modelo en una e%presi-n SQL. Su sinta%is es* e%presi-n
LiUe modelo
En donde e%presi-n es una cadena modelo o campo contra el +ue se compara e%presi-n. Se puede utilizar el operador
LiUe para encontrar &alores en los campos +ue coincidan con el modelo especificado. 0or modelo puede especificar un
&alor completo (.na Mar,a), o se pueden utilizar caracteres comod,n como los reconocidos por el sistema operati&o
para encontrar un rango de &alores (LiUe .nC).
El operador LiUe se puede utilizar en una e%presi-n para comparar un &alor de un campo con una e%presi-n de
cadena. 0or ejemplo, si introduce LiUe (C en una consulta SQL, la consulta de&uel&e todos los &alores de campo +ue
comiencen por la letra (. En una consulta con par)metros, puede Bacer +ue el usuario escriba el modelo +ue se &a a
utilizar.
El ejemplo siguiente de&uel&e los datos +ue comienzan con la letra 0 seguido de cual+uier letra entre . y 4 y de tres
d,gitos*
LiUe K0R.'4SOOOK
Este ejemplo de&uel&e los campos cuyo contenido empiece con una letra de la . a la seguidas de cual+uier cadena.
LiUe KR.'SCK
En la tabla siguiente se muestra c-mo utilizar el operador LiUe para comprobar
e%presiones con diferentes modelos.

$ipo de coincidencia Modelo 0lanteado (oincide 2o coincide
:arios caracteres KaCaK KaaK, Ka8aK, Ka888aK Ka8(K
(ar)cter especial KaRCSaK KaCaK KaaaK
:arios caracteres KabCK KabcdefgK, KabcK KcabK, KaabK
/n solo car)cter KaVaK KaaaK, KaPaK, Ka8aK Ka888aK
/n solo d,gito KaOaK KaJaK, KaFaK, KaDaK KaaaK, KaFJaK
#ango de caracteres KRa'zSK KfK, KpK, KjK KDK, KWK
4uera de un rango KRXa'zSK KGK, KWK, KYK KbK, KaK
istinto de un d,gito KRXJ'GSK K.K, KaK, KWK, KZK KJK, KFK, KGK
(ombinada KaRXb'mSOK K.nGK, KazJK, KaGGK KabcK, KajJK

El "perador 1n
Este operador de&uel&e a+uellos registros cuyo campo indicado coincide con alguno de los en una lista. Su sinta%is es*
e%presi-n R2otS 1n(&alorF, &alorD, . . .)
SELE($ C 4#"M 0edidos 56E#E 0ro&incia 1n (KMadridK, K8arcelonaK, KSe&illaK)A
La cl)usula 56E#E
La cl)usula 56E#E puede usarse para determinar +u! registros de las tablas enumeradas en la cl)usula 4#"M
aparecer)n en los resultados de la instrucci-n SELE($. epu!s de escribir esta cl)usula se deben especificar las
condiciones e%puestas en los partados P.F y P.D. Si no se emplea esta cl)usula, la consulta de&ol&er) todas las filas de
la tabla. 56E#E es opcional, pero cuando aparece debe ir a continuaci-n de 4#"M.
SELE($ .pellidos, Salario 4#"M Empleados 56E#E Salario = DFJJJA
SELE($ 1d[0roducto, E%istencias 4#"M 0roductos
56E#E E%istencias <> 2ue&o[0edidoA
SELE($ C 4#"M 0edidos 56E#E 4ecBa[En&io > OENFJNGHOA
SELE($ .pellidos, 2ombre 4#"M Empleados 56E#E .pellidos > K?ingKA
SELE($ .pellidos, 2ombre 4#"M Empleados 56E#E .pellidos LiUe KSCKA
SELE($ .pellidos, Salario 4#"M Empleados 56E#E Salario 8etQeen DJJ .nd PJJA
SELE($ .pellidos, Salario 4#"M Empl 56E#E .pellidos 8etQeen KLonK .nd K$olKA
SELE($ 1d[0edido, 4ecBa[0edido 4#"M 0edidos 56E#E 4ecBa[0edido
8etQeen OF'F'GHO .nd OPJ'I'GHOA
SELE($ .pellidos, 2ombre, (iudad 4#"M Empleados 56E#E (iudad
1n (KSe&illaK, KLos .ngelesK, K8arcelonaK)A
4. Agrupamiento de Registros
7#"/0 89
(ombina los registros con &alores id!nticos, en la lista de campos especificados, en un 3nico registro. 0ara cada
registro se crea un &alor sumario si se incluye una funci-n SQL agregada, como por ejemplo Sum o (ount, en la
instrucci-n SELE($. Su sinta%is es*
SELE($ campos 4#"M tabla 56E#E criterio 7#"/0 89 campos del grupo
7#"/0 89 es opcional. Los &alores de resumen se omiten si no e%iste una funci-n SQL agregada en la instrucci-n
SELE($. Los &alores 2ull en los campos 7#"/0 89 se agrupan y no se omiten. 2o obstante, los &alores 2ull no se
e&al3an en ninguna de las funciones SQL agregadas.
Se utiliza la cl)usula 56E#E para e%cluir a+uellas filas +ue no desea agrupar, y la cl)usula 6.:127 para filtrar los
registros una &ez agrupados.
. menos +ue contenga un dato Memo u "bjeto "LE , un campo de la lista de campos 7#"/0 89 puede referirse a
cual+uier campo de las tablas +ue aparecen en la cl)usula 4#"M, incluso si el campo no esta incluido en la instrucci-n
SELE($, siempre y cuando la instrucci-n SELE($ incluya al menos una funci-n SQL agregada.
$odos los campos de la lista de campos de SELE($ deben o bien incluirse en la cl)usula 7#"/0 89 o como
argumentos de una funci-n SQL agregada.
SELE($ 1d[4amilia, Sum(StocU) 4#"M 0roductos 7#"/0 89 1d[4amiliaA
/na &ez +ue 7#"/0 89 Ba combinado los registros, 6.:127 muestra cual+uier registro agrupado por la cl)usula
7#"/0 89 +ue satisfaga las condiciones de la cl)usula 6.:127.
6.:127 es similar a 56E#E, determina +u! registros se seleccionan. /na &ez +ue los registros se Ban agrupado
utilizando 7#"/0 89, 6.:127 determina cuales de ellos se &an a mostrar.
SELE($ 1d[4amilia Sum(StocU) 4#"M 0roductos 7#"/0 89 1d[4amilia
6.:127 Sum(StocU) = FJJ .2 2ombre0roducto LiUe 8"SCA
.:7
(alcula la media aritm!tica de un conjunto de &alores contenidos en un campo especificado de una consulta. Su
sinta%is es la siguiente
.&g(e%pr)
En donde e%pr representa el campo +ue contiene los datos num!ricos para los +ue se desea calcular la media o una
e%presi-n +ue realiza un c)lculo utilizando los datos de dicBo campo. La media calculada por .&g es la media
aritm!tica (la suma de los &alores di&idido por el n3mero de &alores). La funci-n .&g no incluye ning3n campo 2ull en
el c)lculo.
SELE($ .&g(7astos) .S 0romedio 4#"M 0edidos 56E#E 7astos = FJJA
(ount
(alcula el n3mero de registros de&ueltos por una consulta. Su sinta%is es la siguiente
(ount(e%pr)
En donde e%pr contiene el nombre del campo +ue desea contar. Los operandos de e%pr pueden incluir el nombre de un
campo de una tabla, una constante o una funci-n (la cual puede ser intr,nseca o definida por el usuario pero no otras
de las funciones agregadas de SQL). 0uede contar cual+uier tipo de datos incluso te%to.
.un+ue e%pr puede realizar un c)lculo sobre un campo, (ount simplemente cuenta el n3mero de registros sin tener en
cuenta
+u! &alores se almacenan en los registros. La funci-n (ount no cuenta los registros +ue tienen campos null a menos
+ue e%pr sea el car)cter comod,n asterisco (C). Si utiliza un asterisco, (ount calcula el n3mero total de registros,
incluyendo a+uellos +ue contienen campos null. (ount(C) es considerablemente m)s r)pida +ue (ount((ampo). 2o se
debe poner el asterisco entre dobles comillas (KCK).
SELE($ (ount(C) .S $otal 4#"M 0edidosA
Si e%pr identifica a m3ltiples campos, la funci-n (ount cuenta un registro s-lo si al menos uno de los campos no es
2ull. Si todos los campos especificados son 2ull, no se cuenta el registro. 6ay +ue separar los nombres de los campos
con ampersand (W).
SELE($ (ount(4ecBaEn&,o W $ransporte) .S $otal 4#"M 0edidosA
Ma%, Min
e&uel&en el m,nimo o el m)%imo de un conjunto de &alores contenidos en un campo especifico de una consulta. Su
sinta%is es*
Min(e%pr)
Ma%(e%pr)
En donde e%pr es el campo sobre el +ue se desea realizar el c)lculo. E%pr pueden incluir el nombre de un campo de
una tabla, una constante o una funci-n (la cual puede ser intr,nseca o definida por el usuario pero no otras de las
funciones agregadas de SQL).
SELE($ Min(7astos) .S ElMin 4#"M 0edidos 56E#E 0ais > KEspaMaKA
SELE($ Ma%(7astos) .S ElMa% 4#"M 0edidos 56E#E 0ais > KEspaMaKA
Ste&, Ste&0
e&uel&e estimaciones de la des&iaci-n est)ndar para la poblaci-n (el total de los registros de la tabla) o una muestra
de la poblaci-n representada (muestra aleatoria) . Su sinta%is es*
Ste&(e%pr)
Ste&0(e%pr)
En donde e%pr representa el nombre del campo +ue contiene los datos +ue desean e&aluarse o una e%presi-n +ue
realiza un c)lculo utilizando los datos de dicBos campos. Los operandos de e%pr pueden incluir el nombre de un campo
de una tabla, una constante o una funci-n (la cual puede ser intr,nseca o definida por el usuario pero no otras de las
funciones agregadas de SQL)
Ste&0 e&al3a una poblaci-n, y Ste& e&al3a una muestra de la poblaci-n. Si la consulta contiene menos de dos
registros (o ning3n registro para Ste&0), estas funciones de&uel&en un &alor 2ull (el cual indica +ue la des&iaci-n
est)ndar no puede calcularse).
SELE($ Ste&(7astos) .S es&iacion 4#"M 0edidos 56E#E 0ais > KEspaMaKA
SELE($ Ste&0(7astos) .S es&iacion 4#"M 0edidos 56E#E 0ais> KEspaMaKA
Sum
e&uel&e la suma del conjunto de &alores contenido en un campo especifico de una consulta. Su sinta%is es*
Sum(e%pr)
En donde e%pr respresenta el nombre del campo +ue contiene los datos +ue desean sumarse o una e%presi-n +ue
realiza un c)lculo utilizando los datos de dicBos campos. Los operandos de e%pr pueden incluir el nombre de un campo
de una tabla, una constante o una funci-n (la cual puede ser intr,nseca o definida por el usuario pero no otras de las
funciones agregadas de SQL).
SELE($ Sum(0recio/nidad C (antidad) .S $otal 4#"M etalle0edidoA
:ar, :ar0
e&uel&e una estimaci-n de la &arianza de una poblaci-n (sobre el total de los registros) o una muestra de la poblaci-n
(muestra aleatoria de registros) sobre los &alores de un campo. Su sinta%is es*
:ar(e%pr)
:ar0(e%pr)
:ar0 e&al3a una poblaci-n, y :ar e&al3a una muestra de la poblaci-n. E%pr el nombre del campo +ue contiene los
datos +ue desean e&aluarse o una e%presi-n +ue realiza un c)lculo utilizando los datos de dicBos campos. Los
operandos de e%pr pueden incluir el nombre de un campo de una tabla, una constante o una funci-n (la cual puede ser
intr,nseca o definida por el usuario pero no otras de las funciones agregadas de SQL)
Si la consulta contiene menos de dos registros, :ar y :ar0 de&uel&en 2ull (esto indica +ue la &arianza no puede
calcularse). 0uede utilizar :ar y :ar0 en una e%presi-n de consulta o en una 1nstrucci-n SQL.
SELE($ :ar(7astos) .S :arianza 4#"M 0edidos 56E#E 0ais > KEspaMaKA
SELE($ :ar0(7astos) .S :arianza 4#"M 0edidos 56E#E 0ais > KEspaMaKA

5. Consultas de Accin
Las consultas de acci-n son a+uellas +ue no de&uel&en ning3n registro, son las encargadas de acciones como aMadir y
borrar y modificar registros.
elete
(rea una consulta de eliminaci-n +ue elimina los registros de una o m)s de las tablas listadas en la cl)usula 4#"M
+ue satisfagan la cl)usula 56E#E. Esta consulta elimina los registros completos, no es posible eliminar el contenido
de alg3n campo en concreto. Su sinta%is es*
ELE$E $abla.C 4#"M $abla 56E#E criterio
ELE$E es especialmente 3til cuando se desea eliminar &arios registros. En una instrucci-n ELE$E con m3ltiples
tablas, debe incluir el nombre de tabla ($abla.C). Si especifica m)s de una tabla desde la +ue eliminar registros, todas
deben ser tablas de mucBos a uno. Si desea eliminar todos los registros de una tabla, eliminar la propia tabla es m)s
eficiente +ue ejecutar una consulta de borrado.
Se puede utilizar ELE$E para eliminar registros de una 3nica tabla o desde &arios lados de una relaci-n uno a
mucBos. Las operaciones de eliminaci-n en cascada en una consulta 3nicamente eliminan desde &arios lados de una
relaci-n. 0or ejemplo, en la relaci-n entre las tablas (lientes y 0edidos, la tabla 0edidos es la parte de mucBos por lo
+ue las operaciones en cascada solo afectaran a la tabla 0edidos. /na consulta de borrado elimina los registros
completos, no 3nicamente los datos en campos espec,ficos. Si desea eliminar &alores en un campo especificado, crear
una consulta de actualizaci-n +ue cambie los &alores a 2ull.
/na &ez +ue se Ban eliminado los registros utilizando una consulta de borrado, no puede desBacer la operaci-n. Si
desea saber +u! registros se eliminar)n, primero e%amine los resultados de una consulta de selecci-n +ue utilice el
mismo criterio y despu!s ejecute la consulta de borrado. Mantenga copias de seguridad de sus datos en todo
momento. Si elimina los registros e+ui&ocados podr) recuperarlos desde las copias de seguridad.
ELE$E C 4#"M Empleados 56E#E (argo > K:endedorKA
1nsert 1nto
.grega un registro en una tabla. Se la conoce como una consulta de datos aMadidos. Esta consulta puede ser de dos
tipo* 1nsertar un 3nico registro - 1nsertar en una tabla los registros contenidos en otra tabla.
0ara insertar un 3nico #egistro*
En este caso la sinta%is es la siguiente*
12SE#$ 12$" $abla (campoF, campoD, .., campo2)
:.L/ES (&alorF, &alorD, ..., &alor2)
Esta consulta graba en el campoF el &alorF, en el campoD y &alorD y as, sucesi&amente. 6ay +ue prestar especial
atenci-n a acotar entre comillas simples (K) los &alores literales (cadenas de caracteres) y las fecBas indicarlas en
formato mm'dd'aa y entre caracteres de almoBadillas (O).
0ara insertar #egistros de otra $abla*
En este caso la sinta%is es*
12SE#$ 12$" $abla R12 base[e%ternaS (campoF, campoD, ..., campo2)
SELE($ $abla"rigen.campoF, $abla"rigen.campoD, ..., $abla"rigen.campo2
4#"M $abla"rigen
En este caso se seleccionar)n los campos F,D, ..., n dela tabla origen y se grabar)n en los campos F,D,.., n de la $abla.
La condici-n SELE($ puede incluir la cl)usula 56E#E para filtrar los registros a copiar. Si $abla y $abla"rigen poseen
la misma estrucutra podemos simplificar la sinta%is a*
12SE#$ 12$" $abla SELE($ $abla"rigen.C 4#"M $abla"rigen
e esta forma los campos de $abla"rigen se grabar)n en $abla, para realizar esta operaci-n es necesario +ue todos
los campos de $abla"rigen est!n contenidos con igual nombre en $abla. (on otras palabras +ue $abla posea todos los
campos de $abla"rigen (igual nombre e igual tipo).
En este tipo de consulta Bay +ue tener especial atenci-n con los campos contadores o autonum!ricos puesto +ue al
insertar un &alor en un campo de este tipo se escribe el &alor +ue contenga su campo Bom-logo en la tabla origen, no
incrementandose como le corresponde.
Se puede utilizar la instrucci-n 12SE#$ 12$" para agregar un registro 3nico a una tabla, utilizando la sinta%is de la
consulta de adici-n de registro 3nico tal y como se mostr- anteriormente. En este caso, su c-digo espec,fica el nombre
y el &alor de cada campo del registro. ebe especificar cada uno de los campos del registro al +ue se le &a a asignar
un &alor as, como el &alor para dicBo campo. (uando no se especifica dicBo campo, se inserta el &alor predeterminado
o 2ull. Los registros se agregan al final de la tabla.
$ambi!n se puede utilizar 12SE#$ 12$" para agregar un conjunto de registros pertenecientes a otra tabla o consulta
utilizando la cl)usula SELE($ ... 4#"M como se mostr- anteriormente en la sinta%is de la consulta de adici-n de
m3ltiples registros. En este caso la cl)usula SELE($ especifica los campos +ue se &an a agregar en la tabla destino
especificada.
La tabla destino u origen puede especificar una tabla o una consulta.
Si la tabla destino contiene una cla&e principal, Bay +ue segurarse +ue es 3nica, y con &alores no'2ull A si no es as,, no
se agregar)n los registros. Si se agregan registros a una tabla con un campo (ontador , no se debe incluir el campo
(ontador en la consulta. Se puede emplear la cl)usula 12 para agregar registros a una tabla en otra base de datos.
Se pueden a&eriguar los registros +ue se agregar)n en la consulta ejecutando primero una consulta de selecci-n +ue
utilice el mismo criterio de selecci-n y &er el resultado. /na consulta de adici-n copia los registros de una o m)s tablas
en otra. Las tablas +ue contienen los registros +ue se &an a agregar no se &er)n afectadas por la consulta de adici-n.
En lugar de agregar registros e%istentes en otra tabla, se puede especificar los &alores de cada campo en un nue&o
registro utilizando la cl)usula :.L/ES. Si se omite la lista de campos, la cl)usula :.L/ES debe incluir un &alor para
cada campo de la tabla, de otra forma fallar) 12SE#$.
12SE#$ 12$" (lientes SELE($ (lientes[:iejos.C 4#"M (lientes[2ue&osA
12SE#$ 12$" Empleados (2ombre, .pellido, (argo)
:.L/ES (KLuisK, KS)ncBezK, K8ecarioK)A
12SE#$ 12$" Empleados SELE($ :endedores.C 4#"M :endedores
56E#E 4ecBa[(ontratacion < 2oQ() ' PJA
/pdate
(rea una consulta de actualizaci-n +ue cambia los &alores de los campos de una tabla especificada bas)ndose en un
criterio espec,fico. Su sinta%is es*
/0.$E $abla SE$ (ampoF>:alorF, (ampoD>:alorD, ... (ampo2>:alor2
56E#E (riterioA
/0.$E es especialmente 3til cuando se desea cambiar un gran n3mero de registros o cuando !stos se encuentran
en m3ltiples tablas. 0uede cambiar &arios campos a la &ez. El ejemplo siguiente incrementa los &alores (antidad
pedidos en un FJ por ciento y los &alores $ransporte en un P por ciento para a+uellos +ue se Bayan en&iado al #eino
/nido.*
/0.$E 0edidos SE$ 0edido > 0edidos C F.F, $ransporte > $ransporte C F.JP
56E#E 0aisEn&,o > KESKA
/0.$E no genera ning3n resultado. 0ara saber +u! registros se &an a cambiar, Bay +ue e%aminar primero el
resultado de una consulta de selecci-n +ue utilice el mismo criterio y despu!s ejecutar la consulta de actualizaci-n.
/0.$E Empleados SE$ 7rado > E 56E#E 7rado > DA
/0.$E 0roductos SE$ 0recio > 0recio C F.F 56E#E 0ro&eedor > T .2 4amilia > PA
Si en una consulta de actualizaci-n suprimimos la cl)usula 56E#E todos los registros de la tabla seMalada ser)n
actualizados.
/0.$E Empleados SE$ Salario > Salario C F.F

. !ipos de "atos
Los tipos de datos SQL se clasifican en FP tipos de datos primarios y de &arios sin-nimos &)lidos reconocidos por
dicBos tipos de datos.
$ipos de datos primarios*

$ipo de atos Longitud escripci-n
812.#9 F byte
0ara consultas sobre tabla adjunta de productos de bases de
datos +ue definen un tipo de datos 8inario.
81$ F byte :alores SiN2o - $rueN4alse
89$E F byte /n &alor entero entre J y DEE.
("/2$E# H bytes /n n3mero incrementado autom)ticamente (de tipo Long)
(/##E2(9 T bytes
/n entero escalable entre GDD.PP\.DJP.ITE.H\\,ETJT y
GDD.PP\.DJP.ITE.H\\,ETJ\.
.$E$1ME T bytes /n &alor de fecBa u Bora entre los aMos FJJ y GGGG.
S127LE H bytes
/n &alor en punto flotante de precisi-n simple con un rango de
'P.HJDTDPCFJ
PT
a 'F.HJFDGTCFJ
'HE
para &alores negati&os,
F.HJFDGTCFJ
'HE
a P.HJDTDPCFJ
PT
para &alores positi&os, y J.
"/8LE T bytes
/n &alor en punto flotante de doble precisi-n con un rango de
'F.\G\IGPFPHTIDPDCFJ
PJT
a 'H.GHJIEIHETHFDH\CFJ
'PDH
para
&alores negati&os, H.GHJIEIHETHFDH\CFJ
'PDH
a
F.\G\IGPFPHTIDPDCFJ
PJT
para &alores positi&os, y J.
S6"#$ D bytes /n entero corto entre 'PD,\IT y PD,\I\.
L"27 H bytes /n entero largo entre 'D,FH\,HTP,IHT y D,FH\,HTP,IH\.
L"27$E@$
F byte por
car)cter
e cero a un m)%imo de F.D gigabytes.
L"27812.#9
Seg3n se
necesite
e cero F gigabyte. /tilizado para objetos "LE.
$E@$
F byte por
caracter
e cero a DEE caracteres.
La siguiente tabla recoge los sinonimos de los tipos de datos definidos*


$ipo de ato Sin-nimos
812.#9 :.#812.#9
81$
8""LE.2
L"71(.L
L"71(.LF
9ES2"
89$E 12$E7E#F
("/2$E# ./$"12(#EME2$
(/##E2(9 M"2E9
.$E$1ME
.$E
$1ME
$1MES$.M0
S127LE
4L".$H
1EEES127LE
#E.L
"/8LE
4L".$
4L".$T
1EEE"/8LE
2/M8E#
2/ME#1(
S6"#$
12$E7E#D
SM.LL12$
L"27
12$
12$E7E#
12$E7E#H
L"27812.#9
7E2E#.L
"LE"8JE($
L"27$E@$
L"27(6.#
MEM"
2"$E
$E@$ .L06.2/ME#1(
(6.#
(6.#.($E#
S$#127
:.#(6.#
:.#1.2$ (2o .dmitido) :.L/E

#. Su$Consultas
/na subconsulta es una instrucci-n SELE($ anidada dentro de una instrucci-n SELE($, SELE($...12$",
12SE#$...12$", ELE$E, o /0.$E o dentro de otra subconsulta.
0uede utilizar tres formas de sinta%is para crear una subconsulta*
comparaci-n R.29 ] .LL ] S"MES (instrucci-n s+l)
e%presi-n R2"$S 12 (instrucci-n s+l)
R2"$S E@1S$S (instrucci-n s+l)
En donde*
comparaci-n
Es una e%presi-n y un operador de comparaci-n +ue compara la e%presi-n con el resultado de la subconsulta.
e%presi-n
Es una e%presi-n por la +ue se busca el conjunto resultante de la subconsulta.
instrucci-n s+l
Es una instrucci-n SELE($, +ue sigue el mismo formato y reglas +ue cual+uier otra instrucci-n SELE($. ebe ir entre
par!ntesis.
Se puede utilizar una subconsulta en lugar de una e%presi-n en la lista de campos de una instrucci-n SELE($ o en
una cl)usula 56E#E o 6.:127. En una subconsulta, se utiliza una instrucci-n SELE($ para proporcionar un conjunto
de uno o m)s &alores especificados para e&aluar en la e%presi-n de la cl)usula 56E#E o 6.:127.
Se puede utilizar el predicado .29 o S"ME, los cuales son sin-nimos, para recuperar registros de la consulta
principal, +ue satisfagan la comparaci-n con cual+uier otro registro recuperado en la subconsulta. El ejemplo siguiente
de&uel&e todos los productos cuyo precio unitario es mayor +ue el de cual+uier producto &endido con un descuento
igual o mayor al DE por ciento.*
SELE($ C 4#"M 0roductos 56E#E 0recio/nidad = .29
(SELE($ 0recio/nidad 4#"M etalle0edido 56E#E escuento => J .DE)A
El predicado .LL se utiliza para recuperar 3nicamente a+uellos registros de la consulta principal +ue satisfacen la
comparaci-n con todos los registros recuperados en la subconsulta. Si se cambia .29 por .LL en el ejemplo anterior,
la consulta de&ol&er) 3nicamente a+uellos productos cuyo precio unitario sea mayor +ue el de todos los productos
&endidos con un descuento igual o mayor al DE por ciento. Esto es mucBo m)s restricti&o.
El predicado 12 se emplea para recuperar 3nicamente a+uellos registros de la consulta principal para los +ue algunos
registros de la subconsulta contienen un &alor igual. El ejemplo siguiente de&uel&e todos los productos &endidos con un
descuento igual o mayor al DE por ciento.*
SELE($ C 4#"M 0roductos 56E#E 10roducto 12
(SELE($ 10roducto 4#"M etalle0edido 56E#E escuento => J.DE)A
1n&ersamente se puede utilizar 2"$ 12 para recuperar 3nicamente a+uellos registros de la consulta principal para los
+ue no Bay ning3n registro de la subconsulta +ue contenga un &alor igual.
El predicado E@1S$S (con la palabra reser&ada 2"$ opcional) se utiliza en comparaciones de &erdadNfalso para
determinar si la subconsulta de&uel&e alg3n registro.
Se puede utilizar tambi!n alias del nombre de la tabla en una subconsulta para referirse a tablas listadas en la cl)usula
4#"M fuera de la subconsulta. El ejemplo siguiente de&uel&e los nombres de los empleados cuyo salario es igual o
mayor +ue el salario medio de todos los empleados con el mismo t,tulo. . la tabla Empleados se le Ba dado el alias $F**
SELE($ .pellido, 2ombre, $itulo, Salario 4#"M Empleados .S $F
56E#E Salario => (SELE($ .&g(Salario) 4#"M Empleados
56E#E $F.$itulo > Empleados.$itulo) "#E# 89 $ituloA
En el ejemplo anterior , la palabra reser&ada .S es opcional.
SELE($ .pellidos, 2ombre, (argo, Salario 4#"M Empleados
56E#E (argo L1?E ;.gente :enC; .2 Salario = .LL (SELE($ Salario 4#"M
Empleados 56E#E ((argo L1?E ;CJefeC;) "# ((argo L1?E ;CirectorC;))A
"btiene una lista con el nombre, cargo y salario de todos los agentes de &entas cuyo salario es mayor +ue el de todos
los jefes y directores.
SELE($ 1S$12($#"5 2ombre0roducto, 0recio[/nidad 4#"M 0roductos
56E#E (0recio[/nidad > (SELE($ 0recio[/nidad 4#"M 0roductos 56E#E
2ombre[0roducto > ;.lm,bar anisado;)A
"btiene una lista con el nombre y el precio unitario de todos los productos con el mismo precio +ue el alm,bar anisado.
SELE($ 1S$12($#"5 2ombre[(ontacto, 2ombre[(ompaMia, (argo[(ontacto,
$elefono 4#"M (lientes 56E#E (1[(liente 12 (SELE($ 1S$12($#"5
1[(liente 4#"M 0edidos 56E#E 4ecBa[0edido => OJHNFNGPO <OJ\NFNGPO)A
"btiene una lista de las compaM,as y los contactos de todos los clientes +ue Ban realizado un pedido en el segundo
trimestre de FGGP.
SELE($ 2ombre, .pellidos 4#"M Empleados .S E 56E#E E@1S$S
(SELE($ C 4#"M 0edidos .S " 56E#E ".1[Empleado > E.1[Empleado)A
Selecciona el nombre de todos los empleados +ue Ban reser&ado al menos un pedido.
SELE($ 1S$12($#"5 0edidos.1d[0roducto, 0edidos.(antidad,
(SELE($ 1S$12($#"5 0roductos.2ombre 4#"M 0roductos 56E#E
0roductos.1d[0roducto > 0edidos.1d[0roducto) .S El0roducto 4#"M
0edidos 56E#E 0edidos.(antidad = FEJ "#E# 89 0edidos.1d[0roductoA
#ecupera el (-digo del 0roducto y la (antidad pedida de la tabla pedidos, e%trayendo el nombre del producto de la
tabla de productos.
%. Consultas de Re&erencias Cru'adas
/na consulta de referencias cruzadas es a+uella +ue nos permite &isualizar los datos en filas y en columnas, estilo
tabla, por ejemplo*

0roducto N .Mo FGGI FGG\
0antalones F.DEJ P.JJJ
(amisas T.EIJ F.DEP
^apatos H.PIG D.EIP

Si tenemos una tabla de productos y otra tabla de pedidos, podemos &isualizar en total de productos pedidos por aMo
para un art,culo determinado, tal y como se &isualiza en la tabla anterior.
La sinta%is para este tipo de consulta es la siguiente*
$#.2S4"#M funci-n agregada instrucci-n select 01:"$ campo pi&ot
R12 (&alorFR, &alorDR, ...SS)S
En donde*
funci-n agregada
Es una funci-n SQL agregada +ue opera sobre los datos seleccionados.
instrucci-n select
Es una instrucci-n SELE($.
campo pi&ot
Es el campo o e%presi-n +ue desea utilizar para crear las cabeceras de la columna en el resultado de la consulta.
&alorF, &alorD
Son &alores fijos utilizados para crear las cabeceras de la columna.
0ara resumir datos utilizando una consulta de referencia cruzada, se seleccionan los &alores de los campos o
e%presiones especificadas como cabeceras de columnas de tal forma +ue pueden &erse los datos en un formato m)s
compacto +ue con una consulta de selecci-n.
$#.2S4"#M es opcional pero si se incluye es la primera instrucci-n de una cadena SQL. 0recede a la instrucci-n
SELE($ +ue especifica los campos utilizados como encabezados de fila y una cl)usula 7#"/0 89 +ue especifica el
agrupamiento de las filas. "pcionalmente puede incluir otras cl)usulas como por ejemplo 56E#E, +ue especifica una
selecci-n adicional o un criterio de ordenaci-n .
Los &alores de&ueltos en campo pi&ot se utilizan como encabezados de columna en el resultado de la consulta. 0or
ejemplo, al utilizar las cifras de &entas en el mes de la &enta como pi&ot en una consulta de referencia cruzada se
crear,an FD columnas. 0uede restringir el campo pi&ot para crear encabezados a partir de los &alores fijos (&alorF,
&alorD) listados en la cl)usula opcional 12.
$ambi!n puede incluir &alores fijos, para los +ue no e%isten datos, para crear columnas adicionales.
Ejemplos
$#.2S4"#M Sum((antidad) .S :entas SELE($ 0roducto, (antidad 4#"M
0edidos 56E#E 4ecBa 8etQeen OJF'JF'GTO .nd OFD'PF'GTO 7#"/0 89 0roducto
"#E# 89 0roducto 01:"$ ate0art(;m;, 4ecBa)A
(rea una consulta de tabla de referencias cruzadas +ue muestra las &entas de productos por mes para un aMo
espec,fico. Los meses aparecen de iz+uierda a derecBa como columnas y los nombres de los productos aparecen de
arriba Bacia abajo como filas.
$#.2S4"#M Sum((antidad) .S :entas SELE($ (ompania 4#"M 0edidos
56E#E 4ecBa 8etQeen OJF'JF'GTO .nd OFD'PF'GTO 7#"/0 89 (ompania
"#E# 89 (ompania 01:"$ ;$rimestre ; W ate0art(;+;, 4ecBa) 1n (K$rimestreFK,
$rimestreDK, K$rimestre PK, K$rimestre HK)A
(rea una consulta de tabla de referencias cruzadas +ue muestra las &entas de productos por trimestre de cada
pro&eedor en el aMo indicado. Los trimestres aparecen de iz+uierda a derecBa como columnas y los nombres de los
pro&eedores aparecen de arriba Bacia abajo como filas.
/n caso pr)ctico*
Se trata de resol&er el siguiente problema* tenemos una tabla de productos con dos campos, el c-digo y el nombre del
producto, tenemos otra tabla de pedidos en la +ue anotamos el c-digo del producto, la fecBa del pedido y la cantidad
pedida. eseamos consultar los totales de producto por aMo, calculando la media anual de &entas.
Estructura y datos de las tablas*
F. .rt,culos*

1 2ombre
F ^apatos
D 0antalones
P 8lusas
D. 0edidos*

1d 4ecBa (antidad
F FFNFFNFGGI DEJ
D FFNFFNFGGI FDE
P FFNFFNFGGI EDJ
F FDNFJNFGGI EJ
D JHNJENFGGI DEJ
P JENJTNFGGI FJJ
F JFNJFNFGG\ HJ
D JDNJTNFGG\ IJ
P JENFJNFGG\ \J
F FDNFDNFGG\ T
D FENFDNFGG\ EDJ
P F\NFJNFGG\ FDEJ
0ara resol&er la consulta planteamos la siguiente consulta*
$#.2S4"#M Sum(0edidos.(antidad) .S #esultado SELE($ 2ombre .S 0roducto,
0edidos.1d .S (-digo, Sum(0edidos.(antidad) .S $"$.L, .&g(0edidos.(antidad)
.S Media 4#"M 0edidos 122E# J"12 .rt,culos "2 0edidos.1d > .rt,culos.1d
7#"/0 89 0edidos.1d, .rt,culos.2ombre 01:"$ 2ear(4ecBa)A y obtenemos el siguiente resultado*

0roducto (-digo $"$.L Media FGGI FGG\
^apatatos F PHT T\ PJJ HT
0antalones D GEE DPT,\E P\E ETJ
8lusas P FGHJ HTE IDJ FPDJ
(omentarios a la consulta*
La cl)sula $#.2S4"#M indica el &alor +ue deseamos &isualizar en las columnas +ue realmente pertenecen a la
consulta, en este caso FGGI y FGG\, puesto +ue las dem)s columnas son opcionales.
SELE($ especifica el nombre de las columnas opcionales +ue deseamos &isualizar, en este caso 0roducto, (-digo,
$otal y Media, indicando el nombre del campo +ue deseamos mostrar en cada columna o el &alor de la misma. Si
incluimos una funci-n de c)lculo el resultado se Bar) en base a los datos de la fila actual y no al total de los datos.
4#"M especifica el origen de los datos. La primera tabla +ue debe figurar es a+uella de donde deseamos e%traer los
datos, esta tabla debe contener al menos tres campos, uno para los t,tulos de la fila, otros para los t,tulos de la
columna y otro para calcular el &alor de las celdas.
En este caso en concreto se deseaba &isualizar el nombre del producto, como el tabla de pedidos s-lo figuraba el
c-digo del mismo se aMadi- una nue&a columna en la cl)usula select llamada 0roducto +ue se corresponda con el
campo 2ombre de la tabla de art,culos. 0ara &incular el c-digo del art,culo de la tabla de pedidos con el nombre del
misma de la tabla art,culos se insert- la cl)usula 122E# J"12.
La cl)usula 7#"/0 89 especifica el agrupamiento de los registros, contrariamente a los manuales de instrucci-n esta
cl)usula no es opcional ya +ue debe figurar siempre y debemos agrupar los registros por el campo del cual e%traemos
la informaci-n. En este caso e%isten dos campos del cual e%traemos la informaci-n* pedidos.cantidad y
art,culos.nombre, por ellos agrupamos por los campos.
0ara finalizar la cl)usula 01:"$ indica el nombre de las columnas no opcionales, en este caso FGGI y FGG\ y como
&amos a el dato +ue aparecer) en las columnas, en este caso empleamos el aMo en +ue se produjo el pedido,
e%tray!ndolo del campo pedidos.fecBa.
"tras posibilidades de fecBa de la cl)usula pi&ot son las siguientes*
F. 0ara agrupamiento por $rimestres
01:"$ ;$ri ; W ate0art(;+;,R4ecBaS)A
D. 0ara agrupamiento por meses (sin tener en cuenta el aMo)
01:"$ 4ormat(R4ecBaS,;mmm;) 1n (;Ene;, ;4eb;, ;Mar;, ;.br;, ;May;, ;Jun;, ;Jul;, ;.go;, ;Sep;, ;"ct;, ;2o&;, ;ic;)A
P. 0ara agrupar por d,as
01:"$ 4ormat(R4ecBaS,;SBort ate;)A

(. Consultas de )nin Internas
Las &inculaciones entre tablas se realiza mediante la cl)usula 122E# +ue combina registros de dos tablas siempre +ue
Baya concordancia de &alores en un campo com3n. Su sinta%is es*
SELE($ campos 4#"M tbF 122E# J"12 tbD "2 tbF.campoF comp tbD.campoD
En donde*
tbF, tbD
Son los nombres de las tablas desde las +ue se combinan los registros.
campoF, campoD
Son los nombres de los campos +ue se combinan. Si no son num!ricos, los campos deben ser del mismo tipo de datos
y contener el mismo tipo de datos, pero no tienen +ue tener el mismo nombre.
comp
Es cual+uier operador de comparaci-n relacional * >, <, =, <>, =>, o <=.
Se puede utilizar una operaci-n 122E# J"12 en cual+uier cl)usula 4#"M. Esto crea una combinaci-n por
e+ui&alencia, conocida tambi!n como uni-n interna. Las combinaciones E+ui son las m)s comunesA !stas combinan
los registros de dos tablas siempre +ue Baya concordancia de &alores en un campo com3n a ambas tablas. Se puede
utilizar 122E# J"12 con las tablas epartamentos y Empleados para seleccionar todos los empleados de cada
departamento. 0or el contrario, para seleccionar todos los departamentos (incluso si alguno de ellos no tiene ning3n
empleado asignado) se emplea LE4$ J"12 o todos los empleados (incluso si alguno no est) asignado a ning3n
departamento), en este caso #176$ J"12.
Si se intenta combinar campos +ue contengan datos Memo u "bjeto "LE, se produce un error. Se pueden combinar
dos campos num!ricos cuales+uiera, incluso si son de diferente tipo de datos. 0or ejemplo, puede combinar un campo
2um!rico para el +ue la propiedad Size de su objeto 4ield est) establecida como Entero, y un campo (ontador.
El ejemplo siguiente muestra c-mo podr,a combinar las tablas (ategor,as y 0roductos bas)ndose en el campo
1(ategoria*
SELE($ 2ombre[(ategor,a, 2ombre0roducto
4#"M (ategorias 122E# J"12 0roductos
"2 (ategorias.1(ategoria > 0roductos.1(ategoriaA
En el ejemplo anterior, 1(ategoria es el campo combinado, pero no est) incluido en la salida de la consulta ya +ue no
est) incluido en la instrucci-n SELE($. 0ara incluir el campo combinado, incluir el nombre del campo en la instrucci-n
SELE($, en este caso, (ategorias.1(ategoria.
$ambi!n se pueden enlazar &arias cl)usulas "2 en una instrucci-n J"12, utilizando la sinta%is siguiente*
SELE($ campos
4#"M tablaF 122E# J"12 tablaD
"2 tbF.campoF comp tbD.campoF .2
"2 tbF.campoD comp tbD.campoD) "#
"2 tbF.campoP comp tbD.campoP)SA
$ambi!n puede anidar instrucciones J"12 utilizando la siguiente sinta%is*
SELE($ campos
4#"M tbF 122E# J"12
(tbD 122E# J"12 R( StbP
R122E# J"12 R( Stabla% R122E# J"12 ...)S
"2 tbP.campoP comp tb%.campo%)S
"2 tbD.campoD comp tbP.campoP)
"2 tbF.campoF comp tbD.campoDA
/n LE4$ J"12 o un #176$ J"12 puede anidarse dentro de un 122E# J"12, pero un 122E# J"12 no puede anidarse
dentro de un LE4$ J"12 o un #176$ J"12.
Ejemplo
SELE($ 1S$12($#"5 Sum(R0recio unidadS C R(antidadS) .S R:entasS,
R2ombreS W ; ; W R.pellidosS .S R2ombre completoS 4#"M Retalles de pedidosS,
0edidos, Empleados, 0edidos 122E# J"12 Retalles de pedidosS "2 0edidos.
R1 de pedidoS > Retalles de pedidosS.R1 de pedidoS, Empleados 122E# J"12
0edidos "2 Empleados.R1 de empleadoS > 0edidos.R1 de empleadoS 7#"/0 89
R2ombreS W ; ; W R.pellidosSA
(rea dos combinaciones e+ui&alentes* una entre las tablas etalles de pedidos y 0edidos, y la otra entre las tablas
0edidos y Empleados. Esto es necesario ya +ue la tabla Empleados no contiene datos de &entas y la tabla etalles de
pedidos no contiene datos de los empleados. La consulta produce una lista de empleados y sus &entas totales.
Si empleamos la cl)usula 122E# en la consulta se seleccionar)n s-lo a+uellos registros de la tabla de la +ue Bayamos
escrito a la iz+uierda de 122E# J"12 +ue contengan al menos un registro de la tabla +ue Bayamos escrito a la
derecBa. 0ara solucionar esto tenemos dos cl)usulas +ue sustituyen a la palabra cla&e 122E#, estas cl)usulas son
LE4$ y #176$. LE4$ toma todos los registros de la tabla de la iz+uierda aun+ue no tengan ning3n registro en la tabla
de la iz+uierda. #176$ realiza la misma operaci-n pero al contrario, toma todos los registros de la tabla de la derecBa
aun+ue no tenga ning3n registro en la tabla de la iz+uierda.

1*. Consultas de )nin +,ternas
Se utiliza la operaci-n /21"2 para crear una consulta de uni-n, combinando los resultados de dos o m)s consultas o
tablas independientes. Su sinta%is es*
R$.8LES consultaF /21"2 R.LLS R$.8LES
consultaD R/21"2 R.LLS R$.8LES consultan R ... SS
En donde*
consultaF, consultaD, consultan
Son instrucciones SELE($, el nombre de una consulta almacenada o el nombre de una tabla almacenada precedido
por la palabra cla&e $.8LE.
0uede combinar los resultados de dos o m)s consultas, tablas e instrucciones SELE($, en cual+uier orden, en una
3nica operaci-n /21"2. El ejemplo siguiente combina una tabla e%istente llamada 2ue&as (uentas y una instrucci-n
SELE($*
$.8LE R2ue&as (uentasS /21"2 .LL SELE($ C 4#"M (lientes
56E#E R(antidad pedidosS = FJJJA
Si no se indica lo contrario, no se de&uel&en registros duplicados cuando se utiliza la operaci-n /21"2, no obstante
puede incluir el predicado .LL para asegurar +ue se de&uel&en todos los registros. Esto Bace +ue la consulta se
ejecute m)s r)pidamente. $odas las consultas en una operaci-n /21"2 deben pedir el mismo n3mero de campos, no
obstante los campos no tienen por+u! tener el mismo tamaMo o el mismo tipo de datos.
Se puede utilizar una cl)usula 7#"/0 89 yNo 6.:127 en cada argumento consulta para agrupar los datos de&ueltos.
0uede utilizar una cl)usula "#E# 89 al final del 3ltimo argumento consulta para &isualizar los datos de&ueltos en un
orden espec,fico.
SELE($ R2ombre de compaM,aS, (iudad 4#"M 0ro&eedores 56E#E
0a,s > K8rasilK /21"2 SELE($ R2ombre de compaM,aS, (iudad 4#"M (lientes
56E#E 0a,s > ;8rasil;
#ecupera los nombres y las ciudades de todos pro&eedores y clientes de 8rasil
SELE($ R2ombre de compaM,aS, (iudad 4#"M 0ro&eedores 56E#E 0a,s > K8rasilK
/21"2 SELE($ R2ombre de compaM,aS, (iudad 4#"M (lientes 56E#E 0a,s >
K8rasilK "#E# 89 (iudad
#ecupera los nombres y las ciudades de todos pro&eedores y clientes radicados en 8rasil, ordenados por el nombre de
la ciudad
SELE($ R2ombre de compaM,aS, (iudad 4#"M 0ro&eedores 56E#E 0a,s > K8rasilK
/21"2 SELE($ R2ombre de compaM,aS, (iudad 4#"M (lientes 56E#E 0a,s >
K8rasilK /21"2 SELE($ R.pellidosS, (iudad 4#"M Empleados 56E#E #egi-n >
K.m!rica del SurK
#ecupera los nombres y las ciudades de todos los pro&eedores y clientes de brasil y los apellidos y las ciudades de
todos los empleados de .m!rica del Sur
$.8LE RLista de clientesS /21"2 $.8LE RLista de pro&eedoresS
#ecupera los nombres y c-digos de todos los pro&eedores y clientes
11. +structuras de las !a$las
(reaci-n de $ablas 2ue&as
Si se est) utilizando el motor de datos de Microsoft para acceder a bases de datos access, s-lo se puede emplear esta
instrucci-n para crear bases de datos propias de access. Su sinta%is es*
(#E.$E $.8LE tabla (campoF tipo (tamaMo) ,ndiceF ,
campoD tipo (tamaMo) ,ndiceD , ...,
,ndice multicampo , ... )
En donde*

0arte escripci-n
tabla Es el nombre de la tabla +ue se &a a crear.
campoF
campoD
Es el nombre del campo o de los campos +ue se &an a crear en la nue&a tabla.
La nue&a tabla debe contener, al menos, un campo.
tipo Es el tipo de datos de campo en la nue&a tabla. (:er $ipos de atos)
tamaMo Es el tamaMo del campo s-lo se aplica para campos de tipo te%to.
,ndiceF
,ndiceD
Es una cl)usula ("2S$#.12$ +ue define el tipo de indice a crear. Esta
cl)usula en opcional.
,ndice
multicampos
Es una cl)usula ("2S$#.12$ +ue define el tipo de indice multicampos a crear.
/n ,ndice multi campo es a+uel +ue est) inde%ado por el contenido de &arios
campos. Esta cl)usula en opcional.

(#E.$E $.8LE Empleados (2ombre $E@$ (DE) , .pellidos $E@$ (EJ))A
(rea una nue&a tabla llamada Empleados con dos campos, uno llamado 2ombre de tipo te%to y longutid DE y otro
llamado apellidos con longitud EJ.
(#E.$E $.8LE Empleados (2ombre $E@$ (FJ), .pellidos $E@$,
4ecBa[2acimiento .$E$1ME) ("2S$#.12$ 1ndice7eneral /21Q/E
(R2ombreS, R.pellidosS, R4ecBa[2acimientoS)A
(rea una nue&a tabla llamada Empleados con un campo 2ombre de tipo te%to y longitud FJ, otro con llamado .pellidos
de tipo te%to y longitud predeterminada (EJ) y uno m)s llamado 4ecBa[2acimiento de tipo 4ecBaN6ora. $ambi!n crea
un ,ndice 3nico (no permite &alores repetidos) formado por los tres campos.
(#E.$E $.8LE Empleados (1 12$E7E# ("2S$#.12$ 1ndice0rimario 0#1M.#9,
2ombre $E@$, .pellidos $E@$, 4ecBa[2acimiento .$E$1ME)A
(rea una tabla llamada Empleados con un campo $e%to de longitud predeterminada (EJ) llamado 2ombre y otro igual
llamado .pellidos, crea otro campo llamado 4ecBa[2acimiento de tipo 4ecBaN6ora y el campo 1 de tipo entero el +ue
establece como cla&e principal.
FF.D La cl)usula ("2S$#.12$
Se utiliza la cl)usula ("2S$#.12$ en las instrucciones .L$E# $.8LE y (#E.$E $.8LE para crear o eliminar
,ndices. E%isten dos sinta%is para esta cl)usula dependiendo si desea (rear - Eliminar un ,ndice de un 3nico campo o
si se trata de un campo multi,ndice. Si se utiliza el motor de datos de Microsoft, s-lo podr) utilizar esta cl)usula con las
bases de datos propias de dicBo motor.
0ara los ,ndices de campos 3nicos*
("2S$#.12$ nombre _0#1M.#9 ?E9 ] /21Q/E ] #E4E#E2(ES tabla e%terna
R(campo e%ternoF, campo e%ternoD)S`
0ara los ,ndices de campos m3ltiples*
("2S$#.12$ nombre _0#1M.#9 ?E9 (primarioFR, primarioD R, ...SS) ]
/21Q/E (3nicoFR, 3nicoD R, ...SS) ]
4"#E172 ?E9 (refFR, refD R, ...SS) #E4E#E2(ES tabla e%terna R(campo e%ternoF
R,campo e%ternoD R, ...SS)S`

0arte escripci-n
nombre Es el nombre del ,ndice +ue se &a a crear.
primario2 Es el nombre del campo o de los campos +ue forman el ,ndice primario.
3nico2 Es el nombre del campo o de los campos +ue forman el ,ndice de cla&e 3nica.
ref2
Es el nombre del campo o de los campos +ue forman el ,ndice e%terno (Bacen
referencia a campos de otra tabla).
tabla e%terna
Es el nombre de la tabla +ue contiene el campo o los campos referenciados en
ref2
campos
e%ternos
Es el nombre del campo o de los campos de la tabla e%terna especificados por
refF, refD, ..., ref2
Si se desea crear un ,ndice para un campo cuando se esta utilizando las instrucciones .L$E# $.8LE o (#E.$E
$.8LE la cl)usula ("2$#.12$ debe aparecer inmediatamente despu!s de la especificaci-n del campo inde%eado.
Si se desea crear un ,ndice con m3ltiples campos cuando se est) utilizando las instrucciones .L$E# $.8LE o (#E.$E
$.8LE la cl)usula ("2S$#.12$ debe aparecer fuera de la cl)usula de creaci-n de tabla.

$ipo de 1ndice escripci-n
/21Q/E
7enera un ,ndece de cla&e 3nica. Lo +ue implica +ue los registros de la tabla no
pueden contener el mismo &alor en los campos inde%ados.
0#1M.#9
?E9
7enera un ,ndice primario el campo o los campos especificados. $odos los
campos de la cla&e principal deben ser 3nicos y no nulos, cada tabla s-lo puede
contener una 3nica cla&e principal.
4"#E172
?E9
7enera un ,ndice e%terno (toma como &alor del ,ndice campos contenidos en
otras tablas). Si la cla&e principal de la tabla e%terna consta de m)s de un campo,
se debe utilizar una definici-n de ,ndice de m3ltiples campos, listando todos los
campos de referencia, el nombre de la tabla e%terna, y los nombres de los
campos referenciados en la tabla e%terna en el mismo orden +ue los campos de
referencia listados. Si los campos referenciados son la cla&e principal de la tabla
e%terna, no tiene +ue especificar los campos referenciados, predeterminado por
&alor, el motor Jet se comporta como si la cla&e principal de la tabla e%terna
fueran los campos referenciados .

(reaci-n de andices
Si se utiliza el motor de datos Jet de Microsoft s-lo se pueden crear ,ndices en bases de datos del mismo motor. La
sinta%is para crear un ,ndice en ua tabla ya definida en la siguiente*
(#E.$E R /21Q/E S 12E@ ,ndice
"2 tabla (campo R.S(]ES(SR, campo R.S(]ES(S, ...S)
R51$6 _ 0#1M.#9 ] 1S.LL"5 2/LL ] 172"#E 2/LL `S
En donde*

0arte escripci-n
,ndice Es el nombre del ,ndice a crear.
tabla Es el nombre de una tabla e%istentes en la +ue se crear) el ,ndice.
campo Es el nombre del campo o lista de campos +ue consituyen el ,ndice.
.S(]ES(
1ndica el orden de los &alores de lso campos .S( indica un orden ascendente
(&alor predeterminado) y ES( un orden descendente.
/21Q/E 1ndica +ue el indice no puede contener &alores duplicados.
1S.LL"5
2/LL
0roBibe &alores nulos en el ,ndice
172"#E 2/LL E%cluye del ,ndice los &alores nulos incluidos en los campos +ue lo componen.
0#1M.#9
.signa al ,ndice la categor,a de cla&e principal, en cada tabla s-lo puede e%istir
un 3nico indice +ue sea ;(la&e 0rincipal;. Si un ,ndice es cla&e principal implica
+ue +ue no puede contener &alores nulos ni duplicados.
Se puede utilizar (#E.$E 12E@ para crear un pseudo ,ndice sobre una tabla adjunta en una fuente de datos "8(
tal como SQL Ser&er +ue no tenga toda&,a un ,ndice. 2o necesita permiso o tener acceso a un ser&idor remoto para
crear un pseudo ,ndice, adem)s la base de datos remota no es consciente y no es afectada por el pseudo ,ndice. Se
utiliza la misma sinta%is para las tabla adjunta +ue para las originales. Esto es especialmente 3til para crear un ,ndice
en una tabla +ue ser,a de s-lo lectura debido a la falta de un ,ndice.
(#E.$E 12E@ Mi1ndice "2 Empleados (0refijo, $elefono)A
(rea un ,ndice llamado Mi1ndice en la tabla empleados con los campos 0refijo y $elefono.
(#E.$E /21Q/E 12E@ Mi1ndice "2 Empleados (1) 51$6 1S.LL"5 2/LLA
(rea un ,ndice en la tabla Empleados utilizando el campo 1, obligando +ue +ue el campo 1 no contenga &alores
nulos ni repetidos.
Modificar el iseMo de una $abla
Modifica el diseMo de una tabla ya e%istente, se puden modificar los campos o los ,ndices e%istentes. Su sinta%is es*
.L$E# $.8LE tabla _. _("L/M2 tipo de campoR(tamaMo)S R("2S$#.12$ ,ndiceS
("2S$#.12$ ,ndice multicampo` ]
#"0 _("L/M2 campo 1 ("2S$#.12$ nombre del ,ndice` `
En donde*

0arte escripci-n
tabla Es el nombre de la tabla +ue se desea modificar.
campo Es el nombre del campo +ue se &a a aMadir o eliminar.
tipo Es el tipo de campo +ue se &a a aMadir.
tamaMo El el tamaMo del campo +ue se &a a aMadir (s-lo para campos de te%to).
,ndice
Es el nombre del ,ndice del campo (cuando se crean campos) o el nombre del
,ndice de la tabla +ue se desea eliminar.
,ndice
multicampo
Es el nombre del ,ndice del campo multicampo (cuando se crean campos) o el
nombre del ,ndice de la tabla +ue se desea eliminar.

"peraci-n escripci-n
. ("L/M2
Se utiliza para aMadir un nue&o campo a la tabla, indicando el nombre, el tipo de
campo y opcionalmente el tamaMo (para campos de tipo te%to).
. Se utliza para agregar un ,ndice de multicampos o de un 3nico campo.
#"0
("L/M2
Se utliza para borrar un campo. Se especifica 3nicamente el nombre del
campo.
#"0
Se utiliza para eliminar un ,ndice. Se especifica 3nicamente el nombre del
,ndice a continuaci-n de la palabra reser&ada ("2S$#.12$.

.L$E# $.8LE Empleados . ("L/M2 Salario (/##E2(9A
.grega un campo Salario de tipo Moneda a la tabla Empleados.
.L$E# $.8LE Empleados #"0 ("L/M2 SalarioA
Elimina el campo Salario de la tabla Empleados.
.L$E# $.8LE 0edidos . ("2S$#.12$ #elacion0edidos 4"#E172 ?E9
(1[Empleado) #E4E#E2(ES Empleados (1[Empleado)A
.grega un indice e%terno a la tabla 0edidos. El ,ndice e%terno se basa en el campo 1[Empleado y se refiere al campo
1[Empleado de la tabla Empleados. En este ejemplo no es necesario indicar el campo junto al nombre de la tabla en
la
cl)usula #E4E#E2(ES, pues 1[Empleado es la cla&e principal de la tabla Empleados.
.L$E# $.8LE 0edidos #"0 ("2S$#.12$ #elacion0edidosA
Elimina el ,ndide de la tabla 0edidos.
12. Consultas con -ar.metros
Las consultas con par)metros son a+uellas cuyas condiciones de b3s+ueda se definen mediante par)metros. Si se
ejecutan directamente desde la base de datos donde Ban sido definidas aparecer) un mensaje solicitando el &alor de
cada uno de los par)metros. Si deseamos ejecutarlas desde una aplicaci-n Bay +ue asignar primero el &alor de los
par)metros y despu!s ejecutarlas. Su sinta%is es la siguiente*
0.#.ME$E#S nombreF tipoF, nombreD tipoD, ... , nombre2 tipo2 (onsulta
En donde*

0arte escripci-n
nombre Es el nombre del par)metro
tipo Es el tipo de datos del par)metro
consulta /na consulta SQL
0uede utilizar nombre pero no tipo de datos en una cl)usula 56E#E o 6.:127.
0.#.ME$E#S 0recio[Minimo (urrency, 4ecBa[1nicio ate$imeA
SELE($ 10edido, (antidad 4#"M 0edidos 56E#E 0recio = 0recio[Minimo
.2 4ecBa0edido => 4ecBa[1nicioA
El ejemplo siguiente muestra como utilizar los par)metros en el programa de :isual 8asic*
0ublic Sub 7enera(onsulta()
im SQL .s String
im Qd .s Queryef
im #s .s #ecordset
SQL > ;0.#.ME$E#S 0recio[Minimo (urrency, 4ecBa[1nicio ate$imeA ;
SQL > SQL W ;SELE($ 10edido, (antidad 4#"M 0edidos 56E#E 0recio = ;
SQL > SQL W ;0recio[Minimo .2 4ecBa0edido => 4ecBa[1nicioA ;
Set Qd > 8aseatos.(reateQueryef(Mi(onsulta, SQL)
Qd.0arametersX0recio[Minimo > D
Qd.0arametersX4ecBa1nicio > OPFNFDNGEO
Set #s > Qd."pen#ecordset()
End Sub
Ejemplo*
0.#.ME$E#S REscriba los .pellidos*S $e%tA SELE($ C 4#"M Empleados
56E#E REscriba los .pellidos*S > R.pellidosSA
La ejecuci-n desde la base de datos solicita al usuario los apellidos del empleado y despu!s muestra los resultados.
13. /ases de "atos +,ternas
0ara el acceso a bases de datos e%ternas se utiliza la cl)usula 12. Se puede acceder a base de datos d8ase, 0arado%
o 8trie&e. Esta cl)usula s-lo permite la cone%i-n de una base de datos e%terna a la &ez. /na base de datos e%terna es
una base de datos +ue no sea la acti&a. .un+ue para mejorar los rendimientos es mejor adjuntarlas a la base de datos
actual y trabajar con ellas.
0ara especificar una base de datos +ue no pertenece a .ccess 8asic, se agrega un punto y coma (A) al nombre y se
encierra entre comillas simples. $ambi!n puede utilizar la palabra reser&ada .$.8.SE para especificar la base de
datos e%terna. 0or ejemplo, las l,neas siguientes especifican la misma tabla*
4#"M $abla 12 KRd8.SE 1:A .$.8.SE>(*L8.SEL.$"SL:E2$.SASKA
4#"M $abla 12 K(*L8.SEL.$"SL:E2$.SK Kd8.SE 1:AK
.cceso a una base de datos e%terna de Microsoft .ccess*
SELE($ 1(liente 4#"M (lientes 12 M1S.$"S.M8 56E#E 1(liente LiUe K.CKA
En donde M1S.$"S.M8 es el nombre de una base de datos de Microsoft .ccess +ue contiene la tabla (lientes.
.cceso a una base de datos e%terna de d8.SE 111 o 1:*
SELE($ 1(liente 4#"M (lientes 12 K(*L8.SEL.$"SL:E2$.SK Kd8.SE 1:KA
56E#E 1(liente LiUe K.CKA
0ara recuperar datos de una tabla de d8.SE 111b Bay +ue utilizar Kd8.SE 111bAK en lugar de Kd8.SE 1:AK.
.cceso a una base de datos de 0arado% P.% o H.%*
SELE($ 1(liente 4#"M (lientes 12 K(*L0.#."@L.$"SL:E2$.SK
K0arado% H.%AK 56E#E 1(liente LiUe K.CKA
0ara recuperar datos de una tabla de 0arado% &ersi-n P.%, Bay +ue sustituir K0arado% H.%AK por K0arado% P.%AK.
.cceso a una base de datos de 8trie&e*
SELE($ 1(liente 4#"M (lientes 12 K(*L8$#1E:EL.$"SL:E2$.SL41LE.4K
K8trie&eAK 56E#E 1(liente LiUe K.CKA
(*L8$#1E:EL.$"SL:E2$.SL41LE.4 es la ruta de acceso y nombre de arcBi&o del arcBi&o de definici-n de datos
de 8trie&e.
14. 0mitir los -ermisos de +1ecucin
En entornos de bases de datos con permisos de seguridad para grupos de trabajo se puede utilizar la cl)usula 51$6
"52E#.((ESS "0$1"2 para +ue el usuario actual ad+uiera los derecBos de propietario a la Bora de ejecutar la
consulta. Su sinta%is es*
instrucci-n s+l 51$6 "52E#.((ESS "0$1"2
SELE($ .pellido, 2ombre, Salario 4#"M Empleados "#E# 89 .pellido
51$6 "52E#.((ESS "0$1"2A
Esta opci-n re+uiere +ue est! declarado el acceso al ficBero de grupo de trabajo (generalmente system.mda -
system .mdQ) de la base de datos actual.
15. La Cl.usula -R0C+")R+
Esta cl)usula es poco usual y se utiliza para crear una consulta a la misma &ez +ue se ejecuta, opcionalmente define
los par)metros de la misma. Su sinta%is es la siguiente*
0#"(E/#E 2ombre(onsulta 0ar)metroF tipoF, .... , 0ar)metro2 tipon (onsultaSQL
En donde*

0arte escripci-n
2ombre(onsulta Es el nombre con se guardar) la consulta en la base de datos.
0ar)metro Es el nombre de par)metro o de los par)metros de dicBa consulta.
tipo Es el tipo de datos del par)metro
(onsultaSQL Es la consulta +ue se desea grabar y ejecutar.
0#"(E/#E Lista[(ategoriasA SELE($ 1S$12($#"5 2ombre[(ategoria,
1[(ategor,a 4#"M (ategorias "#E# 89 2ombre[(ategoriaA
.signa el nombre Lista[de[categor,as a la consulta y la ejecuta.
0#"(E/#E #esumen 4ecBa[1nicio ate$ime, 4ecBa[4inal ate$imeA SELE($
1S$12($#"5 4ecBa[En&io, 1[0edido, 1mporte[0edido, 4ormat(4ecBa[En&io, ;yyyy;)
.S .Mo 4#"M 0edidos 56E#E 4ecBa[En&io 8etQeen 4ecBa[1nicio .nd 4ecBa[4inalA
.signa el nombre #esumen a la consulta e incluye dos par)metros.
1. Ane,os
#esoluci-n de 0roblemas
8uscar 1nformaci-n duplicada en un campo de una tabla.
0ara generar este tipo de consultas lo m)s sencillo es utilizar el asistente de consultas de .ccess, editar la sentencia
SQL de la consulta y pegarla en nuestro c-digo. 2o obstante este tipo de consulta se consigue de la siguiente forma*
SELE($ 1S$12($#"5 Lista de (ampos a :isualizar 4#"M $abla
56E#E (ampoe8us+ueda 1n (SELE($ (ampoe8us+ueda 4#"M $abla .s psud-nimo
7#"/0 89 (ampoe8us+ueda 6.:127 (ount(C)=F ) "#E# 89 (ampoe8us+uedaA
/n caso pr)ctico, si deseamos localizar a+uellos empleados con igual nombre y &isualizar su c-digo correspondiente,
la consulta ser,a la siguiente*
SELE($ 1S$12($#"5 Empleados.2ombre, Empleados.1dEmpleado
4#"M Empleados 56E#E Empleados.2ombre 1n (SELE($ 2ombre 4#"M
Empleados .s $mp 7#"/0 89 2ombre 6.:127 (ount(C)=F)
"#E# 89 Empleados.2ombreA
#ecuperar #egistros de una tabla +ue no contengan registros relacionados en otra.
Este tipo de consulta se emplea en situaciones tales como saber +ue productos no se Ban &endido en un determinado
periodo de tiempo,
SELE($ 1S$12($#"5 0roductos.1d0roducto, 0roductos.2ombre 4#"M 0roductos
LE4$ J"12 0edidos "2 0roductos.1d0roducto > 0edidos.1d0roduct 56E#E
(0edidos.1d0roducto 1s 2ull) .2 (0edidos.4ecBa 8etQeen OJF'JF'GTO .nd OJF'PJ'GTO)A
La sinta%is es sencilla, se trata de realizar una uni-n interna entre dos tablas seleccionadas mediante un LE4$ J"12,
establecimiendo como condici-n +ue el campo relacionado de la segunda sea 2ull.
/tlizar SQL desde :isual 8asic
E%isten dos tipos de consultas SQL* las consultas de selecci-n (nos de&uel&en datos) y las consultas de acci-n
(a+uellas +ue no de&uel&en ning3n registro). .mbas pueden ser tratadas en :isual 8asic pero de forma diferente.
Las consultas de selecci-n se ejecutan recogiendo la informaci-n en un recordset pre&iamente definido mediante la
instrucci-n openrecordset(), por ejemplo*
im SQL as String
im #S as recordset
SQL > ;SELE($ C 4#"M EmpleadosA;
Set #S>Mi8aseatos."pen#ecordSet(SQL)
Si la consula de selecci-n se encuentra almacenada en una consulta de la base de datos*
Set #S>Mi8aseatos."pen#ecordset(;Mi(onsulta;)
Las consultas de acci-n, al no de&ol&er ning3n registro, no las podemos asignar a ning3n recordset, en este caso la
forma de ejecutarlas es mediante los m!todos E%ecute y E%ecuteSQL (para bases de datos "8(), por ejemplo*
im SQL as string
SQL > ;ELE$E C 4#"M Empleados 56E#E (ategoria > K"rdenanzaKA;
Mi8aseatos.E%ecute SQL
4unciones de :isual 8asic utilizables en una 1nstrucci-n SQL

4unci-n Sinta%is escripci-n
2oQ :ariable> 2oQ e&uel&e la fecBa y la Bora actual del sistema
ate :ariable>ate e&uel&e la fecBa actual del sistema
$ime :ariable>$ime e&uel&e la Bora actual del sistema
9ear :ariable>9ear(4ecBa)
e&uel&e los cuatro d,gitos correspondientes al aMo de
4ecBa
MontB :ariable>MontB(4ecBa) e&uel&e el n3mero del mes del par)metro fecBa.
ay :ariable>ay(4ecBa)
e&uel&e el n3mero del d,a del mes del par)metro
fecBa.
5eeUday :ariable>5eeUday(4ecBa)
e&uel&e un n3mero entero +ue representa el d,a de la
semana del par)metro fecBa.
6our :ariable>6our(6ora)
e&uel&e un n3mero entre J y DP +ue representa la Bora
del par)metro 6ora.
Minute :ariable>Minute(6ora)
e&uel&e un n3mero entre J y EG +ue representa los
minutos del par)metro Bora.
Second :ariable>Second(6ora)
e&uel&e un n3mero entre J y EG +ue representa los
segundos del par)metro Bora.
ate0art
Esta funci-n de&uel&e una parte seMalada de una fecBa concreta. Su sinta%is es*
ate0art(0arte, 4ecBa, (omienzoSemana, (omienzo.Mo)
0arte representa a la porci-n de fecBa +ue se desea obtener, los posibles &alores son*

:alor escripci-n
yyyy .Mo
+ $rimestre
m Mes
y ,a del aMo
d ,a del mes
Q ,a de la semana
QQ Semana del aMo
B 6ora
m Minutos
s Segundos

(omienzoSemana indica el primer d,a de la semana. Los posibles &alores son*

:alor escripci-n
J /tiliza el &alor pode efecto del sistema
F omingo (:alor predeterminado)
D Lunes
P Martes
H Mi!rcoles
E Jue&es
I :iernes
\ S)bado

(omienzo.Mo indica cual es la primera semana del aMoA los posibles &alores son*

:alor escripci-n
J :alor del sistema
F (omienza el aMo el F de enero (&alor predeterminado).
D Empieza con la semana +ue tenga al memos cuatro d,as en el nue&o aMo.
P Empieza con la semana +ue est! contenida completamente en el nue&o aMo.

E&aluar &alores antes de ejecutar la (onsuta.
entro de una sentencia SQL podemos emplear la funci-n iif para indicar las condiciones de b3s+ueda. La sinta%is de
la funci-n iif es la siguiente*
iif(E%presion,:alorF,:alorD)
En donde E%presi-n es la sentencia +ue e&aluamosA si E%presi-n es &erdadera entonces se de&uel&e :alorF, si
E%presi-n es falsa se de&uel&e :alorD.
SELE($ C $otal 4#"M Empleados 56E#E .pellido >
iff($@[.pellido.$e%t <= KK, $@[.pellido.$e%t, C) A
Supongamos +ue en un formulario tenemos una casilla de te%to llamanda $@[.pellido. Si cuando ejecutamos esta
consulta la casilla contiene alg3n &alor se de&uel&en todos los empleados cuyo apellido coincida con el te%to de la
casilla, en caso contrario se de&uel&en todos los empleados.
SELE($ 4ecBa, 0roducto, (antidad, (iif((odigo0ostal=>DTJJJ .nd
(odigo0ostal <>DTGGG,KMadridK,K2acionalK)) .S estino 4#"M 0edidosA
Esta consulta de&uel&e los campos 4ecBa, 2ombre del 0roducto y (antidad de la tabla pedidos, aMadiendo un campo
al final con el &alor Madrid si el c-digo posta est) dentro del inter&alo, en caso contario de&uel&e 2acional.
/n 0e+ueMo Manual de Estilo
Siempre es bueno intentar Bacer las cosas de igual modo para +ue el mantenimiento y la re&isi-n nos sea una labor lo
m)s sencilla posible. En lo +ue a mi respecta utilizo las siguiente normas a la Bora de elaborar sentecias SQL*
F. Las cl)usulas siempre las escribo con May3sculas.
D. Los operadores l-gicos de sentencias siempre con May3sculas.
P. Las operaciones siempre la primera letra con may3sculas y el resto en min3sculas.
H. Los operadores l-gicos incluidos en otros operadores la primera letra con may3sculas y el resto con min3culas.
Los 2ombres de las $ablas, (ampos y (onsultas, los escribo siempre la primera letra con may3sculas y el resto con
min3sculas, en algunos casos utilizo el car)cter ;[; para definir mejor el nombre* etalles[0edidos.
.un+ue con el motor Jet se pueden utilizar acentos y espacios en blanco para nombrar los campos, las tablas y las
consultas no los utilizo por+ue cuando se e%portar tablas a otros sistemas los acentos y los espacios en blanco pueden
producir errores innecesarios.
#ecuerda siempre +ue si utilizas espacios en blanco para llamar tablas o consultas cada &ez +ue Bagas referencias a
ellos en una consulta debes incluir sus nombres entre corcBetes.
SELE($ R1 de 0edidoS, R2ombre del 0roductoS, (antidad 4#"M Retalles del 0edidoSA

También podría gustarte