Sie sind auf Seite 1von 44

MANUAL DE SQL INDICE 1. Introduccin 1.1 Componentes del SQL 1.2 Comandos 1.3 Clusulas 1.

4 Operadores Lgicos 1.5 Operadores de Comparacin 1.6 Funciones de gregado 2.Consultas de Seleccin 2.1 Consultas !sicas 2.2 Ordenar los "egistros 2.3 Consultas con #redicado 2.4 lias 2.5 !ases de $atos %&ternas 3. Criterios de Seleccin 3.1 Operadores Lgicos 3.2 'nter(alos de )alores 3.3 %l Operador Li*e 3.4 %l Operador 'n 3.5 La clusula +,%"% 4. Agru a!iento de "egistros 4.1 %l clusula -"O.# !/ 4.2 )- 01edia ritm2tica3 4.3 Count 0Contar "egistros3 4.4 1a& 4 1in 0)alores 1&imos 4 15nimos3 4.5 St$e( 4 St$e(# 0$es(iacin %stndar3 4.6 Sum 0Sumar )alores3 4.6 )ar 4 )ar# 0)arian7a3 #. Consultas de Accin 5.1 Consultas de %liminacin 5.2 Consultas de $atos 8adidos 5.3 Consultas de ctuali7acin $. %i os de Datos &. Su'Consultas (. Consultas de "e)erencias Cru*adas +. Consultas de Unin Internas 1,. Consultas de Unin E-ternas 11. Estructuras de las %a'las 11.1 Creacin de 9a:las 11.2 La clusula CO;S9" ';9 11.3 Creacin de <ndices 11.4 %liminar 4 8adir Campos e <ndices 12. Consultas con .ar/!etros 13. 0ases de Datos E-ternas 14. Derec1os de .ro ietario

1#. La Cl/usula ."2CEDU"E 1$. Ane-os 16.1 "esolucin de #ro:lemas 16.1.1 'n=ormacin $uplicada 16.1.2 "egistros no "elacionados 16.2 .tili7ar SQL desde )isual !asic 16.3 Funciones utili7a:les 16.4 La =uncin ii= 16.5 1anual de %stilo

1. Introduccin %l lengua>e de consulta estructurado 0SQL3 es un lengua>e de :ase de datos normali7ado? utili7ado por el motor de :ase de datos de 1icroso=t @et. SQL se utili7a para crear o:>etos Quer4$e=? como el argumento de origen del m2todo Open"ecordSet 4 como la propiedad "ecordSource del control de datos. 9am:i2n se puede utili7ar con el m2todo %&ecute para crear 4 manipular directamente las :ases de datos @et 4 crear consultas SQL de paso a tra(2s para manipular :ases de datos remotas cliente A ser(idor. 1.1. Co! onentes del SQL %l lengua>e SQL est compuesto por comandos? clusulas? operadores 4 =unciones de agregado. %stos elementos se com:inan en las instrucciones para crear? actuali7ar 4 manipular las :ases de datos. 1.2 Co!andos %&isten dos tipos de comandos SQLB los $LL Cue permiten crear 4 de=inir nue(as :ases de datos? campos e 5ndices. los $1L Cue permiten generar consultas para ordenar? =iltrar 4 e&traer datos de la :ase de datos. Co!andos DLL Comando $escripcin C"% 9% $"O# L9%" .tili7ado para crear nue(as ta:las? campos e 5ndices %mpleado para eliminar ta:las e 5ndices .tili7ado para modi=icar las ta:las agregando campos o cam:iando la de=inicin de los campos.

Co!andos DML Comando $escripcin S%L%C9 ';S%"9 .#$ 9% $%L%9% .tili7ado para consultar registros de la :ase de datos Cue satis=agan un criterio determinado .tili7ado para cargar lotes de datos en la :ase de datos en una Dnica operacin. .tili7ado para modi=icar los (alores de los campos 4 registros especi=icados .tili7ado para eliminar registros de una ta:la de una :ase de datos

1.3 Cl/usulas Las clusulas son condiciones de modi=icacin utili7adas para de=inir los datos Cue desea seleccionar o manipular. Clusula F"O1 +,%"% -"O.# !/ , )';O"$%" !/ $escripcin .tili7ada para especi=icar la ta:la de la cual se (an a seleccionar los registros .tili7ada para especi=icar las condiciones Cue de:en reunir los registros Cue se (an a seleccionar .tili7ada para separar los registros seleccionados en grupos espec5=icos .tili7ada para e&presar la condicin Cue de:e satis=acer cada grupo .tili7ada para ordenar los registros acuerdo con un orden espec5=ico seleccionados de

1.4 2 eradores Lgicos Operador .so ;$ O" ;O9 %s el E4E lgico. %(alua dos condiciones 4 de(uel(e un (alor de (erdad slo si am:as son ciertas. %s el EoE lgico. %(alDa dos condiciones 4 de(uel(e un (alor de (erdar si alguna de las dos es cierta. ;egacin lgica. $e(uel(e el (alor contrario de la e&presin.

1.# 2 eradores de Co! aracin Operador .so F G FG FH GH H L'I% 'n 1enor Cue 1a4or Cue $istinto de 1enor 'gual Cue 1a4or 'gual Cue 'gual Cue .tili7ado en la comparacin de un modelo .tili7ado para especi=icar registros de una :ase de datos

!%9+%%; .tili7ado para especi=icar un inter(alo de (alores.

1.$ 3unciones de Agregado Las =unciones de agregado se usan dentro de una clusula S%L%C9 en grupos de registros para de(ol(er un Dnico (alor Cue se aplica a un grupo de registros.

Funcin $escripcin ).tili7ada para calcular el promedio de los (alores de un campo determinado .tili7ada para de(ol(er la suma de todos los (alores de un campo determinado .tili7ada para de(ol(er el (alor ms alto de un campo especi=icado .tili7ada para de(ol(er el (alor ms :a>o de un campo especi=icado

CO.;9 .tili7ada para de(ol(er el nDmero de registros de la seleccin S.1 1 J 1';

2.Consultas de Seleccin Las consultas de seleccin se utili7an para indicar al motor de datos Cue de(uel(a in=ormacin de las :ases de datos? esta in=ormacin es de(uelta en =orma de con>unto de registros Cue se pueden almacenar en un o:>eto recordset. %ste con>unto de registros es modi=ica:le. 2.1 Consultas '/sicas La sinta&is :sica de una consulta de seleccin es la siguienteB SELECT Campos FROM Tabla; %n donde campos es la lista de campos Cue se deseen recuperar 4 ta:la es el origen de los mismos? por e>emploB SELECT Nombre, Telefono FROM Clientes; %sta consulta de(uel(e un recordset con el campo nom:re 4 tel2=ono de la ta:la clientes. 2.2 2rdenar los registros dicionalmente se puede especi=icar el orden en Cue se desean recuperar los registros de las ta:las mediante la claDsula O"$%" !/ Lista de Campos. %n donde Lista de campos representa los campos a ordenar. %>emploB SELECT CodigoPostal, Nombre, Telefono FROM Clientes ORDER B Nombre; %sta consulta de(uel(e los campos Codigo#ostal? ;om:re? 9ele=ono de la ta:la Clientes ordenados por el campo ;om:re. Se pueden ordenar los registros por mas de un campo? como por e>emploB

SELECT CodigoPostal, Nombre, Telefono FROM Clientes ORDER B CodigoPostal, Nombre; 'ncluso se puede especi=icar el orden de los registrosB ascendente mediante la claDsula 0 SC Ase toma este (alor por de=ecto3 descendente 0$%SC3 SELECT CodigoPostal, Nombre, Telefono FROM Clientes ORDER B CodigoPostal DESC , Nombre !SC; 2.3 Consultas con .redicado %l predicado se inclu4e entre la claDsula 4 el primer nom:re del campo a recuperar? los posi:les predicados sonB

#redicado LL 9O# $'S9';C9

$escripcin $e(uel(e todos los campos de la ta:la $e(uel(e un determinado nDmero de registros de la ta:la Omite los registros coincidan totalmente cu4os campos seleccionados

Omite los registros duplicados :asandose en la $'S9';C9"O+ totalidad del registro 4 no slo en los campos seleccionados. LL Si no se inclu4e ninguno de los predicados se asume LL. %l 1otor de :ase de datos selecciona todos los registros Cue cumplen las condiciones de la instruccin SQL. ;o se con(eniente a:usar de este predicado 4a Cue o:ligamos al motor de la :ase de datos a anali7ar la estructura de la ta:la para a(eriguar los campos Cue contiene? es mucKo ms rpido indicar el listado de campos deseados. SELECT !LL FROM Empleados; SELECT " FROM Empleados; 9O# $e(uel(e un cierto nDmero de registros Cue entran entre al principio o al =inal de un rango especi=icado por una clusula O"$%" !/. Supongamos Cue Cueremos recuperar los nom:res de los 25 primeros estudiantes del curso 1LL4B SELECT TOP #$ Nombre, !pellido FROM Est%diantes ORDER B Nota DESC; Si no se inclu4e la clusula O"$%" !/? la consulta de(ol(er un con>unto ar:itrario de 25 registros de la ta:la %studiantes .%l predicado 9O# no elige entre (alores iguales. %n el e>emplo anterior? si la nota media nDmero 25 4 la 26 son iguales? la consulta de(ol(er 26 registros. Se puede utili7ar la pala:ra reser(ada #%"C%;9 para de(ol(er un cierto porcenta>e de registros Cue caen al principio o al

=inal de un rango especi=icado por la clusula O"$%" !/. Supongamos Cue en lugar de los 25 primeros estudiantes deseamos el 1M por ciento del cursoB SELECT TOP &' PERCENT Nombre, !pellido FROM Est%diantes ORDER B Nota DESC; %l (alor Cue (a a continuacin de 9O# de:e ser un 'nteger sin signo.9O# no a=ecta a la posi:le actuali7acin de la consulta. $'S9';C9 Omite los registros Cue contienen datos duplicados en los campos seleccionados. #ara Cue los (alores de cada campo listado en la instruccin S%L%C9 se inclu4an en la consulta de:en ser Dnicos. #or e>emplo? (arios empleados listados en la ta:la %mpleados pueden tener el mismo apellido. Si dos registros contienen Lpe7 en el campo pellido? la siguiente instruccin SQL de(uel(e un Dnico registroB SELECT D(ST(NCT !pellido FROM Empleados; Con otras pala:ras el predicado $'S9';C9 de(uel(e aCuellos registros cu4os campos indicados en la clusula S%L%C9 posean un contenido di=erente. %l resultado de una consulta Cue utili7a $'S9';C9 no es actuali7a:le 4 no re=le>a los cam:ios su:siguientes reali7ados por otros usuarios. $'S9';C9"O+ $e(uel(e los registros di=erentes de una ta:laN a di=erencia del predicado anterior Cue slo se =i>a:a en el contenido de los campos seleccionados? 2ste lo Kace en el contenido del registro completo independientemente de los campos indicados en la clusula S%L%C9. SELECT D(ST(NCTRO) !pellido FROM Empleados; Si la ta:la empleados contiene dos registrosB ntonio Lpe7 4 1arta Lpe7 el e>emplo del predicado $'S9';C9 de(ule(e un Dnico registro con el (alor Lpe7 en el campo pellido 4a Cue :usca no duplicados en dicKo campo. %ste Dltimo e>emplo de(uel(e dos registros con el (alor Lpe7 en el apellido 4a Cue se :uscan no duplicados en el registro completo. 2.4 Alias %n determinadas circunstancias es necesario asignar un nom:re a alguna columna determinada de un con>unto de(uelto? otras (eces por simple capricKo o por otras circunstancias. #ara resol(er todas ellas tenemos la pala:ra reser(ada S Cue se encarga de asignar el nom:re Cue deseamos a la columna deseada. 9omado como re=erencia el e>emplo anterior podemos Kacer Cue la columna de(uelta por la consulta? en lugar de llamarse apellido 0igual Cue el campo de(uelto3 se llame %mpleado. %n este caso proceder5amos de la siguiente =ormaB SELECT D(ST(NCTRO) !pellido !S Empleado FROM Empleados; 2.# "ecu erar In)or!acin de una 'ase de Datos E-terna #ara concluir este cap5tulo se de:e Kacer re=erencia a la recuperacin

de registros de :ases de datos e&terna. %s ocasiones es necesario la recuperacin de in=ormacin Cue se encuentra contenida en una ta:la Cue no se encuentra en la :ase de datos Cue e>ecutar la consulta o Cue en ese momento no se encuentra a:ierta? esta situacin la podemos sal(ar con la pala:ra reser(ada '; de la siguiente =ormaB SELECT D(ST(NCTRO) !pellido !S Empleado FROM Empleados (N *+,-databases-gestion.mdb*; %n donde cBOdata:asesOgestion.md: es la :ase de datos Cue contiene la ta:la %mpleados. 3. Criterios de Seleccin %n el cap5tulo anterior se (io la =orma de recuperar los registros de las ta:las? las =ormas empleadas de(ol(5an todos los registros de la mencionada ta:la. lo largo de este cap5tulo se estudiarn las posi:ilidades de =iltrar los registros con el =in de recuperar solamente aCuellos Cue cumplan unas condiciones preesta:lecidas. ntes de comen7ar el desarrollo de este cap5tulo Ka4 Cue recalcar tres detalles de (ital importancia. %l primero de ellos es Cue cada (e7 Cue se desee esta:lecer una condicin re=erida a un campo de te&to la condicin de :DsCueda de:e ir encerrada entre comillas simplesN la segunda es Cue no se posi:le esta:lecer condiciones de :DsCueda en los campos memo 4N la tercera 4 Dltima Kace re=erencia a las =ecKas. Las =ecKas se de:en escri:ir siempre en =ormato mmAddAaa en donde mm representa el mes? dd el d5a 4 aa el a8o? Ka4 Cue prestar atencin a los separadores Ano sir(e la separacin Ka:itual de la :arra 0P3? Ka4 Cue utili7ar el guin 0A3 4 adems la =ecKa de:e ir encerrada entre almoKadillas 0Q3. #or e>emplo si deseamos re=erirnos al d5a 3 de Septiem:re de 1LL5 de:eremos Kacerlo de la siguente =ormaN QMLAM3AL5Q QLA3AL5Q. 3.1 2 eradores Lgicos Los operadores lgicos soportados por SQL sonB ;$? O"? JO"? %C(? 'mp? 's 4 ;ot. e&cepcin de los dos Dltimos todos poseen la siguiente sinta&isB /e0presi1n&2 operador /e0presi1n#2 %n donde e&presin1 4 e&presin2 son las condiciones a e(aluar? el resultado de la operacin (ar5a en =uncin del operador lgico. La ta:la ad>unta muestra los di=erentes posi:les resultadosB

Fe&presin1G )erdad )erdad Falso Falso

Operador ;$ ;$ ;$ ;$

Fe&presin2G Falso )erdad )erdad Falso

"esultado Falso )erdad Falso Falso

)erdad )erdad Falso Falso )erdad )erdad Falso Falso )erdad )erdad Falso Falso )erdad )erdad )erdad Falso Falso Falso ;ull ;ull ;ull

O" O" O" O" JO" JO" JO" JO" %C( %C( %C( %C( 'mp 'mp 'mp 'mp 'mp 'mp 'mp 'mp 'mp

Falso )erdad )erdad Falso )erdad Falso )erdad Falso )erdad Falso )erdad Falso )erdad Falso ;ull )erdad Falso ;ull )erdad Falso ;ull

)erdad )erdad )erdad Falso Falso )erdad )erdad Falso )erdad Falso Falso )erdad )erdad Falso ;ull )erdad )erdad )erdad )erdad ;ull ;ull

Si a cualCuiera de las anteriores condiciones le anteponemos el operador ;O9 el resultado de la operacin ser el contrario al de(uelto sin el operador ;O9. %l Dltimo operador denominado 's se emplea para comparar dos (aria:les de tipo o:>eto FO:>eto1G 's FO:>eto2G. este operador de(uel(e (erdad si los dos o:>etos son iguales SELECT " FROM Empleados )3ERE Edad 2 #$ !ND Edad / $'; SELECT " FROM Empleados )3ERE 4Edad 2 #$ !ND Edad / $'5 OR S%eldo 6 &''; SELECT " FROM Empleados )3ERE NOT Estado 6 *Soltero*; SELECT " FROM Empleados )3ERE 4S%eldo 2 &'' !ND S%eldo / $''5 OR 4Pro7in+ia 6 *Madrid* !ND Estado 6 *Casado*5; 3.2 Inter4alos de 5alores #ara indicar Cue deseamos recuperar los registros segDn el inter(alo de (alores de un campo emplearemos el operador !etReen cu4a sinta&is esB

+ampo 8Not9 Bet:een 7alor& !nd 7alor# 4la +ondi+i1n Not es op+ional5 %n este caso la consulta de(ol(er5a los registros Cue contengan en EcampoE un (alor incluido en el inter(alo (alor1? (alor2 0am:os inclusi(e3. Si anteponemos la condicin ;ot de(ol(er aCuellos (alores no incluidos en el inter(alo. SELECT " FROM Pedidos )3ERE CodPostal Bet:een #;''' !nd #;<<<; 4De7%el7e los pedidos reali=ados en la pro7in+ia de Madrid5 SELECT ((f4CodPostal Bet:een #;''' !nd #;<<<, *Pro7in+ial*, *Na+ional*5 FROM Editores; 4De7%el7e el 7alor *Pro7in+ial* si el +1digo postal se en+%entra en el inter7alo, *Na+ional* en +aso +ontrario5 3.3 El 2 erador Li6e Se utili7a para comparar una e&presin de cadena con un modelo en una e&presin SQL. Su sinta&is esB e0presi1n Li>e modelo %n donde e&presin es una cadena modelo o campo contra el Cue se compara e&presin. Se puede utili7ar el operador Li*e para encontrar (alores en los campos Cue coincidan con el modelo especi=icado. #or modelo puede especi=icar un (alor completo 0 na 1ar5a3? o se pueden utili7ar caracteres comod5n como los reconocidos por el sistema operati(o para encontrar un rango de (alores 0Li*e nS3. %l operador Li*e se puede utili7ar en una e&presin para comparar un (alor de un campo con una e&presin de cadena. #or e>emplo? si introduce Li*e CS en una consulta SQL? la consulta de(uel(e todos los (alores de campo Cue comiencen por la letra C. %n una consulta con parmetros? puede Kacer Cue el usuario escri:a el modelo Cue se (a a utili7ar. %l e>emplo siguiente de(uel(e los datos Cue comien7an con la letra # seguido de cualCuier letra entre 4 F 4 de tres d5gitosB Li>e *P8!?F9@@@* %ste e>emplo de(uel(e los campos cu4o contenido empiece con una letra de la a la $ seguidas de cualCuier cadena. Li>e *8!?D9"* %n la ta:la siguiente se muestra cmo utili7ar el operador Li*e para compro:ar e&presiones con di=erentes modelos.

9ipo de coincidencia 1odelo #lanteado Coincide )arios caracteres Carcter especial TaSaT TaUSVaT TaSaT

;o coincide TaaaT

TaaT? Ta!aT? Ta!!!aT Ta!CT

)arios caracteres .n solo carcter .n solo d5gito Fuera de un rango Com:inada

Ta:ST TaWaT TaQaT TUYaA7VT TaUY:AmVQT

Ta:cde=gT? Ta:cT TaaaT? Ta3aT? Ta!aT TaMaT? Ta1aT? Ta2aT T=T? TpT? T>T TLT? TXT? TZT T T? TaT? TXT? T[T T nLT? Ta7MT? TaLLT

Tca:T? Taa:T Ta!!!aT TaaaT? Ta1MaT T2T? TXT T:T? TaT TMT? T1T? TLT Ta:cT? Ta>MT

"ango de caracteres TUaA7VT $istinto de un d5gito TUYMALVT

3.4 El 2 erador In %ste operador de(uel(e aCuellos registros cu4o campo indicado coincide con alguno de los en una lista. Su sinta&is esB e0presi1n 8Not9 (n47alor&, 7alor#, . . .5 SELECT " FROM Pedidos )3ERE Pro7in+ia (n 4*Madrid*, *Bar+elona*, *Se7illa*5; 3.# La cl/usula 78E"E La clusula +,%"% puede usarse para determinar Cu2 registros de las ta:las enumeradas en la clusula F"O1 aparecern en los resultados de la instruccin S%L%C9. $epu2s de escri:ir esta clusula se de:en especi=icar las condiciones e&puestas en los partados 3.1 4 3.2. Si no se emplea esta clusula? la consulta de(ol(er todas las =ilas de la ta:la. +,%"% es opcional? pero cuando aparece de:e ir a continuacin de F"O1. SELECT !pellidos, Salario FROM Empleados )3ERE Salario 2 #&'''; SELECT (dAProd%+to, E0isten+ias FROM Prod%+tos )3ERE E0isten+ias /6 N%e7oAPedido; SELECT " FROM Pedidos )3ERE Fe+BaAEn7io 6 @$C&'C<D@; SELECT !pellidos, Nombre FROM Empleados )3ERE !pellidos 6 *Eing*; SELECT !pellidos, Nombre FROM Empleados )3ERE !pellidos Li>e *S"*; SELECT !pellidos, Salario FROM Empleados )3ERE Salario Bet:een #'' !nd F''; SELECT !pellidos, Salario FROM Empl )3ERE !pellidos Bet:een *Lon* !nd *Tol*; SELECT (dAPedido, Fe+BaAPedido FROM Pedidos )3ERE Fe+BaAPedido Bet:een @&?&?<D@ !nd @F'?G?<D@; SELECT !pellidos, Nombre, Ci%dad FROM Empleados )3ERE Ci%dad (n 4*Se7illa*, *Los !ngeles*, *Bar+elona*5;

4. Agru a!iento de "egistros 4.1 9"2U. 0: Com:ina los registros con (alores id2nticos? en la lista de campos especi=icados? en un Dnico registro. #ara cada registro se crea un (alor sumario si se inclu4e una =uncin SQL agregada? como por e>emplo Sum o Count? en la instruccin S%L%C9. Su sinta&is esB SELECT +ampos FROM tabla )3ERE +riterio HROIP B +ampos del gr%po -"O.# !/ es opcional. Los (alores de resumen se omiten si no e&iste una =uncin SQL agregada en la instruccin S%L%C9. Los (alores ;ull en los campos -"O.# !/ se agrupan 4 no se omiten. ;o o:stante? los (alores ;ull no se e(alDan en ninguna de las =unciones SQL agregadas. Se utili7a la clusula +,%"% para e&cluir aCuellas =ilas Cue no desea agrupar? 4 la clusula , )';- para =iltrar los registros una (e7 agrupados. menos Cue contenga un dato 1emo u O:>eto OL% ? un campo de la lista de campos -"O.# !/ puede re=erirse a cualCuier campo de las ta:las Cue aparecen en la clusula F"O1? incluso si el campo no esta incluido en la instruccin S%L%C9? siempre 4 cuando la instruccin S%L%C9 inclu4a al menos una =uncin SQL agregada. 9odos los campos de la lista de campos de S%L%C9 de:en o :ien incluirse en la clusula -"O.# !/ o como argumentos de una =uncin SQL agregada. SELECT (dAFamilia, S%m4Sto+>5 FROM Prod%+tos HROIP B (dAFamilia; .na (e7 Cue -"O.# !/ Ka com:inado los registros? , )';- muestra cualCuier registro agrupado por la clusula -"O.# !/ Cue satis=aga las condiciones de la clusula , )';-. , )';- es similar a +,%"%? determina Cu2 registros se seleccionan. .na (e7 Cue los registros se Kan agrupado utili7ando -"O.# !/? , )';- determina cuales de ellos se (an a mostrar. SELECT (dAFamilia S%m4Sto+>5 FROM Prod%+tos HROIP B (dAFamilia 3!J(NH S%m4Sto+>5 2 &'' !ND NombreProd%+to Li>e BOS"; 4.2 A59 Calcula la media aritm2tica de un con>unto de (alores contenidos en un campo especi=icado de una consulta. Su sinta&is es la siguiente !7g4e0pr5 %n donde e&pr representa el campo Cue contiene los datos nu!;ricos para los Cue se desea calcular la media o una e&presin Cue reali7a un clculo utili7ando los datos de dicKo campo. La media calculada por (g es la media aritm2tica 0la suma de los (alores di(idido por el nDmero de (alores3. La =uncin (g no inclu4e ningDn campo ;ull en el clculo.

SELECT !7g4Hastos5 Hastos 2 &'';

!S

Promedio

FROM

Pedidos

)3ERE

4.3 Count Calcula el nDmero de registros de(ueltos por una consulta. Su sinta&is es la siguiente Co%nt4e0pr5 %n donde e&pr contiene el nom:re del campo Cue desea contar. Los operandos de e&pr pueden incluir el nom:re de un campo de una ta:la? una constante o una =uncin 0la cual puede ser intr5nseca o de=inida por el usuario pero no otras de las =unciones agregadas de SQL3. #uede contar cualCuier tipo de datos incluso te&to. unCue e&pr puede reali7ar un clculo so:re un campo? Count simplemente cuenta el nDmero de registros sin tener en cuenta Cu2 (alores se almacenan en los registros. La =uncin Count no cuenta los registros Cue tienen campos null a menos Cue e&pr sea el carcter comod5n asterisco 0S3. Si utili7a un asterisco? Count calcula el nDmero total de registros? inclu4endo aCuellos Cue contienen campos null. Count0S3 es considera:lemente ms rpida Cue Count0Campo3. ;o se de:e poner el asterisco entre do:les comillas 0TST3. SELECT Co%nt4"5 !S Total FROM Pedidos;

Si e&pr identi=ica a mDltiples campos? la =uncin Count cuenta un registro slo si al menos uno de los campos no es ;ull. Si todos los campos especi=icados son ;ull? no se cuenta el registro. ,a4 Cue separar los nom:res de los campos con ampersand 0X3. SELECT Co%nt4Fe+BaEn7Ko L Transporte5 !S Total FROM PedidosN 4.4 Ma-< Min

$e(uel(en el m5nimo o el m&imo de un con>unto de (alores contenidos en un campo especi=ico de una consulta. Su sinta&is esB Min4e0pr5 Ma04e0pr5 %n donde e&pr es el campo so:re el Cue se desea reali7ar el clculo. %&pr pueden incluir el nom:re de un campo de una ta:la? una constante o una =uncin 0la cual puede ser intr5nseca o de=inida por el usuario pero no otras de las =unciones agregadas de SQL3. SELECT Min4Hastos5 !S ElMin FROM Pedidos )3ERE Pais 6 *EspaMa*; SELECT Ma04Hastos5 !S ElMa0 FROM Pedidos )3ERE Pais 6 *EspaMa*;

4.#

StDe4< StDe4.

$e(uel(e estimaciones de la des(iacin estndar para la po:lacin 0el total de los registros de la ta:la3 o una muestra de la po:lacin representada 0muestra aleatoria3 . Su sinta&is esB StDe74e0pr5 StDe7P4e0pr5 %n donde e&pr representa el nom:re del campo Cue contiene los datos Cue desean e(aluarse o una e&presin Cue reali7a un clculo utili7ando los datos de dicKos campos. Los operandos de e&pr pueden incluir el nom:re de un campo de una ta:la? una constante o una =uncin 0la cual puede ser intr5nseca o de=inida por el usuario pero no otras de las =unciones agregadas de SQL3 St$e(# e(alDa una po:lacin? 4 St$e( e(alDa una muestra de la po:lacin. Si la consulta contiene menos de dos registros 0o ningDn registro para St$e(#3? estas =unciones de(uel(en un (alor ;ull 0el cual indica Cue la des(iacin estndar no puede calcularse3. SELECT StDe74Hastos5 !S Des7ia+ion FROM Pedidos )3ERE Pais 6 *EspaMa*; SELECT StDe7P4Hastos5 !S Des7ia+ion FROM Pedidos )3ERE Pais6 *EspaMa*; 4.$ Su! $e(uel(e la suma del con>unto de (alores contenido en un campo especi=ico de una consulta. Su sinta&is esB S%m4e0pr5 %n donde e&pr respresenta el nom:re del campo Cue contiene los datos Cue desean sumarse o una e&presin Cue reali7a un clculo utili7ando los datos de dicKos campos. Los operandos de e&pr pueden incluir el nom:re de un campo de una ta:la? una constante o una =uncin 0la cual puede ser intr5nseca o de=inida por el usuario pero no otras de las =unciones agregadas de SQL3. SELECT S%m4Pre+ioInidad " Cantidad5 !S Total FROM DetallePedido; 4.& 5ar< 5ar. $e(uel(e una estimacin de la (arian7a de una po:lacin 0so:re el total de los registros3 o una muestra de la po:lacin 0muestra aleatoria de registros3 so:re los (alores de un campo. Su sinta&is esB Jar4e0pr5 JarP4e0pr5 )ar# e(alDa una po:lacin? 4 )ar e(alDa una muestra de la po:lacin. %&pr el nom:re del campo Cue contiene los datos Cue desean e(aluarse o una e&presin Cue reali7a un clculo utili7ando los datos de dicKos campos. Los operandos de e&pr pueden incluir el nom:re de un campo de una ta:la? una constante o una =uncin 0la cual

puede ser intr5nseca o de=inida por el usuario pero no otras de las =unciones agregadas de SQL3 Si la consulta contiene menos de dos registros? )ar 4 )ar# de(uel(en ;ull 0esto indica Cue la (arian7a no puede calcularse3. #uede utili7ar )ar 4 )ar# en una e&presin de consulta o en una 'nstruccin SQL. SELECT Jar4Hastos5 !S Jarian=a FROM Pedidos )3ERE Pais 6 *EspaMa*; SELECT JarP4Hastos5 !S Jarian=a FROM Pedidos )3ERE Pais 6 *EspaMa*; #. Consultas de Accin Las consultas de accin son aCuellas Cue no de(uel(en ningDn registro? son las encargadas de acciones como a8adir 4 :orrar 4 modi=icar registros. #.1 DELE%E Crea una consulta de eliminacin Cue elimina los registros de una o ms de las ta:las listadas en la clusula F"O1 Cue satis=agan la clusula +,%"%. %sta consulta elimina los registros completos? no es posi:le eliminar el contenido de algDn campo en concreto. Su sinta&is esB DELETE Tabla." FROM Tabla )3ERE +riterio $%L%9% es especialmente Dtil cuando se desea eliminar (arios registros. %n una instruccin $%L%9% con mDltiples ta:las? de:e incluir el nom:re de ta:la 09a:la.S3. Si especi=ica ms de una ta:la desde la Cue eliminar registros? todas de:en ser ta:las de mucKos a uno. Si desea eliminar todos los registros de una ta:la? eliminar la propia ta:la es ms e=iciente Cue e>ecutar una consulta de :orrado. Se puede utili7ar $%L%9% para eliminar registros de una Dnica ta:la o desde (arios lados de una relacin uno a mucKos. Las operaciones de eliminacin en cascada en una consulta Dnicamente eliminan desde (arios lados de una relacin. #or e>emplo? en la relacin entre las ta:las Clientes 4 #edidos? la ta:la #edidos es la parte de mucKos por lo Cue las operaciones en cascada solo a=ectaran a la ta:la #edidos. .na consulta de :orrado elimina los registros completos? no Dnicamente los datos en campos espec5=icos. Si desea eliminar (alores en un campo especi=icado? crear una consulta de actuali7acin Cue cam:ie los (alores a ;ull. .na (e7 Cue se Kan eliminado los registros utili7ando una consulta de :orrado? no puede desKacer la operacin. Si desea sa:er Cu2 registros se eliminarn? primero e&amine los resultados de una consulta de seleccin Cue utilice el mismo criterio 4 despu2s e>ecute la consulta de :orrado. 1antenga copias de seguridad de sus datos en todo momento. Si elimina los registros eCui(ocados podr recuperarlos desde las copias de seguridad. DELETE " FROM Empleados )3ERE Cargo 6 *Jendedor*;

#.2 INSE"% IN%2 grega un registro en una ta:la. Se la conoce como una consulta de datos a8adidos. %sta consulta puede ser de dos tipoB 'nsertar un Dnico registro 'nsertar en una ta:la los registros contenidos en otra ta:la. #.2.1 .ara insertar un =nico "egistro>

%n este caso la sinta&is es la siguienteB (NSERT (NTO Tabla 4+ampo&, +ampo#, .., +ampoN5 J!LIES 47alor&, 7alor#, ..., 7alorN5 %sta consulta gra:a en el campo1 el (alor1? en el campo2 4 (alor2 4 as5 sucesi(amente. ,a4 Cue prestar especial atencin a acotar entre comillas simples 0T3 los (alores literales 0cadenas de caracteres3 4 las =ecKas indicarlas en =ormato mmAddAaa 4 entre caracteres de almoKadillas 0Q3. #.2.2 .ara insertar "egistros de otra %a'la> %n este caso la sinta&is esB (NSERT (NTO Tabla 8(N baseAe0terna9 4+ampo&, +ampo#, ...,+ampoN5 SELECT TablaOrigen.+ampo&, TablaOrigen.+ampo#, ..., TablaOrigen.+ampoN FROM TablaOrigen %n este caso se seleccionarn los campos 1?2? ...? n dela ta:la origen 4 se gra:arn en los campos 1?2?..? n de la 9a:la. La condicin S%L%C9 puede incluir la clusula +,%"% para =iltrar los registros a copiar. Si 9a:la 4 9a:laOrigen poseen la misma estrucutra podemos simpli=icar la sinta&is aB (NSERT (NTO Tabla SELECT TablaOrigen." FROM TablaOrigen

$e esta =orma los campos de 9a:laOrigen se gra:arn en 9a:la? para reali7ar esta operacin es necesario Cue todos los campos de 9a:laOrigen est2n contenidos con igual nom:re en 9a:la. Con otras pala:ras Cue 9a:la posea todos los campos de 9a:laOrigen 0igual nom:re e igual tipo3. %n este tipo de consulta Ka4 Cue tener especial atencin con los campos contadores o autonum2ricos puesto Cue al insertar un (alor en un campo de este tipo se escri:e el (alor Cue contenga su campo Komlogo en la ta:la origen? no incrementandose como le corresponde.

Se puede utili7ar la instruccin ';S%"9 ';9O para agregar un registro Dnico a una ta:la? utili7ando la sinta&is de la consulta de adicin de registro Dnico tal 4 como se mostr anteriormente. %n este caso? su cdigo espec5=ica el nom:re 4 el (alor de cada campo del registro. $e:e especi=icar cada uno de los campos del registro al Cue se le (a a asignar un (alor as5 como el (alor para dicKo campo. Cuando no se especi=ica dicKo campo? se inserta el (alor predeterminado o ;ull. Los registros se agregan al =inal de la ta:la. 9am:i2n se puede utili7ar ';S%"9 ';9O para agregar un con>unto de registros pertenecientes a otra ta:la o consulta utili7ando la clusula S%L%C9 ... F"O1 como se mostr anteriormente en la sinta&is de la consulta de adicin de mDltiples registros. %n este caso la clusula S%L%C9 especi=ica los campos Cue se (an a agregar en la ta:la destino especi=icada. La ta:la destino u origen puede especi=icar una ta:la o una consulta. Si la ta:la destino contiene una cla(e principal? Ka4 Cue segurarse Cue es Dnica? 4 con (alores noA;ull N si no es as5? no se agregarn los registros. Si se agregan registros a una ta:la con un campo Contador ? no se de:e incluir el campo Contador en la consulta. Se puede emplear la clusula '; para agregar registros a una ta:la en otra :ase de datos. Se pueden a(eriguar los registros Cue se agregarn en la consulta e>ecutando primero una consulta de seleccin Cue utilice el mismo criterio de seleccin 4 (er el resultado. .na consulta de adicin copia los registros de una o ms ta:las en otra. Las ta:las Cue contienen los registros Cue se (an a agregar no se (ern a=ectadas por la consulta de adicin. %n lugar de agregar registros e&istentes en otra ta:la? se puede especi=icar los (alores de cada campo en un nue(o registro utili7ando la clusula ) L.%S. Si se omite la lista de campos? la clusula ) L.%S de:e incluir un (alor para cada campo de la ta:la? de otra =orma =allar ';S%"9. (NSERT (NTO Clientes SELECT ClientesAJieNos." FROM ClientesAN%e7os; (NSERT (NTO Empleados 4Nombre, !pellido, Cargo5 J!LIES 4*L%is*, *SOn+Be=*, *Be+ario*5; (NSERT (NTO Empleados SELECT Jendedores." Jendedores )3ERE Fe+BaAContrata+ion / No:45 ? F';

FROM

#.3 U.DA%E Crea una consulta de actuali7acin Cue cam:ia los (alores de los campos de una ta:la especi=icada :asndose en un criterio espec5=ico. Su sinta&is esB

IPD!TE Tabla SET Campo&6Jalor&, Campo#6Jalor#, ... CampoN6JalorN )3ERE Criterio; .#$ 9% es especialmente Dtil cuando se desea cam:iar un gran nDmero de registros o cuando 2stos se encuentran en mDltiples ta:las. #uede cam:iar (arios campos a la (e7. %l e>emplo siguiente incrementa los (alores Cantidad pedidos en un 1M por ciento 4 los (alores 9ransporte en un 3 por ciento para aCuellos Cue se Ka4an en(iado al "eino .nido.B IPD!TE Pedidos SET Pedido 6 Pedidos " &.&, Transporte 6 Transporte " &.'F )3ERE PaisEn7Ko 6 *ES*; .#$ 9% no genera ningDn resultado. #ara sa:er Cu2 registros se (an a cam:iar? Ka4 Cue e&aminar primero el resultado de una consulta de seleccin Cue utilice el mismo criterio 4 despu2s e>ecutar la consulta de actuali7acin. IPD!TE Empleados SET Hrado 6 $ )3ERE Hrado 6 #; IPD!TE Prod%+tos Pro7eedor 6 ; !ND Familia 6 F; SET Pre+io 6 Pre+io " &.& )3ERE

Si en una consulta de actuali7acin suprimimos la clusula +,%"% todos los registros de la ta:la se8alada sern actuali7ados. IPD!TE Empleados SET Salario 6 Salario " &.& $. %i os de Datos Los tipos de datos SQL se clasi=ican en 13 tipos de datos primarios 4 de (arios sinnimos (lidos reconocidos por dicKos tipos de datos. 9ipos de datos primariosB 9ipo de $atos Longitud $escripcin !'; "/ !'9 !/9% CO.;9%" C.""%;C/ 1 :4te 1 :4te 1 :4te 4 :4tes \ :4tes #ara consultas so:re ta:la ad>unta de productos de :ases de datos Cue de=inen un tipo de datos !inario. )alores SiP;o 9ruePFalse .n (alor entero entre M 4 255. .n nDmero incrementado automticamente 0de tipo Long3 .n entero escala:le entre

L22.336.2M3.6\5.466?5\M\ L22.336.2M3.6\5.466?5\M6. $ 9%9'1% \ :4tes

.n (alor de =ecKa u Kora entre los a8os 1MM 4 LLLL. .n (alor en punto =lotante de precisin simple con un rango de A3.4M2\23S1M 3\ a A45 A1.4M12L\S1M para (alores negati(os? 1.4M12L\S1MA45 a 3.4M2\23S1M3\ para (alores positi(os? 4 M. .n (alor en punto =lotante de do:le precisin con un rango de A1.6L66L3134\6232S1M 3M\ a A4.L4M65645\41246S1MA324 para (alores A324 negati(os? 4.L4M65645\41246S1M a 1.6L66L3134\6232S1M3M\ para (alores positi(os? 4 M. .n entero corto entre A32?66\ 4 32?666. .n entero largo 2?146?4\3?646. entre A2?146?4\3?64\ 4

S';-L%

4 :4tes

$O.!L%

\ :4tes

S,O"9 LO;LO;-9%J9 LO;-!'; "/ 9%J9

2 :4tes 4 :4tes

1 :4te por $e cero a un m&imo de 1.2 giga:4tes. carcter SegDn se $e cero 1 giga:4te. necesite OL%. .tili7ado para o:>etos

1 :4te por $e cero a 255 caracteres. caracter

La siguiente ta:la recoge los sinnimos de los tipos de datos de=inidosB 9ipo de $ato !'; "/ !'9 !/9% CO.;9%" C.""%;C/ $ 9%9'1% Sinnimos ) "!'; "/ !OOL% ; LO-'C L LO-'C L1 /%S;O ';9%-%"1 .9O';C"%1%;9 1O;%/ $ 9% 9'1% 9'1%S9 1#

S';-L%

FLO 94 '%%%S';-L% "% L FLO 9 FLO 9\ '%%%$O.!L% ;.1!%" ;.1%"'C ';9%-%"2 S1 LL';9 ';9 ';9%-%" ';9%-%"4 -%;%" L OL%O!@%C9 LO;-C, " 1%1O ;O9% L#, ;.1%"'C C, " C, " C9%" S9"';) "C, " dmitido3 ) L.%

$O.!L%

S,O"9 LO;LO;-!'; "/ LO;-9%J9

9%J9

) "' ;9 0;o

&. Su'Consultas .na su:consulta es una instruccin S%L%C9 anidada dentro de una instruccin S%L%C9? S%L%C9...';9O? ';S%"9...';9O? $%L%9%? o .#$ 9% o dentro de otra su:consulta. #uede utili7ar tres =ormas de sinta&is para crear una su:consultaB +ompara+i1n 8!N P !LL P SOME9 4instr%++i1n sQl5

e0presi1n 8NOT9 (N 4instr%++i1n sQl5 8NOT9 ER(STS 4instr%++i1n sQl5 %n dondeB co! aracin %s una e&presin 4 un operador de comparacin Cue compara la e&presin con el resultado de la su:consulta.

e- resin %s una e&presin por la Cue se :usca el con>unto resultante de la su:consulta. instruccin s?l %s una instruccin S%L%C9? Cue sigue el mismo =ormato 4 reglas Cue cualCuier otra instruccin S%L%C9. $e:e ir entre par2ntesis. Se puede utili7ar una su:consulta en lugar de una e&presin en la lista de campos de una instruccin S%L%C9 o en una clusula +,%"% o , )';-. %n una su:consulta? se utili7a una instruccin S%L%C9 para proporcionar un con>unto de uno o ms (alores especi=icados para e(aluar en la e&presin de la clusula +,%"% o , )';-. Se puede utili7ar el predicado ;/ o SO1%? los cuales son sinnimos? para recuperar registros de la consulta principal? Cue satis=agan la comparacin con cualCuier otro registro recuperado en la su:consulta. %l e>emplo siguiente de(uel(e todos los productos cu4o precio unitario es ma4or Cue el de cualCuier producto (endido con un descuento igual o ma4or al 25 por ciento.B SELECT " FROM Prod%+tos )3ERE Pre+ioInidad 2 !N 4SELECT Pre+ioInidad FROM DetallePedido )3ERE Des+%ento 26 ' .#$5; %l predicado LL se utili7a para recuperar Dnicamente aCuellos registros de la consulta principal Cue satis=acen la comparacin con todos los registros recuperados en la su:consulta. Si se cam:ia ;/ por LL en el e>emplo anterior? la consulta de(ol(er Dnicamente aCuellos productos cu4o precio unitario sea ma4or Cue el de todos los productos (endidos con un descuento igual o ma4or al 25 por ciento. %sto es mucKo ms restricti(o. %l predicado '; se emplea para recuperar Dnicamente aCuellos registros de la consulta principal para los Cue algunos registros de la su:consulta contienen un (alor igual. %l e>emplo siguiente de(uel(e todos los productos (endidos con un descuento igual o ma4or al 25 por ciento.B SELECT " FROM Prod%+tos )3ERE (DProd%+to (N 4SELECT (DProd%+to FROM DetallePedido )3ERE Des+%ento 26 '.#$5; 'n(ersamente se puede utili7ar ;O9 '; para recuperar Dnicamente aCuellos registros de la consulta principal para los Cue no Ka4 ningDn registro de la su:consulta Cue contenga un (alor igual. %l predicado %J'S9S 0con la pala:ra reser(ada ;O9 opcional3 se

utili7a en comparaciones de (erdadP=also para determinar si la su:consulta de(uel(e algDn registro. Se puede utili7ar tam:i2n alias del nom:re de la ta:la en una su:consulta para re=erirse a ta:las listadas en la clusula F"O1 =uera de la su:consulta. %l e>emplo siguiente de(uel(e los nom:res de los empleados cu4o salario es igual o ma4or Cue el salario medio de todos los empleados con el mismo t5tulo. la ta:la %mpleados se le Ka dado el alias 91BB SELECT !pellido, Nombre, Tit%lo, Salario FROM Empleados !S T& )3ERE Salario 26 4SELECT !7g4Salario5 FROM Empleados )3ERE T&.Tit%lo 6 Empleados.Tit%lo5 ORDER B En el eNemplo op+ional. anterior , la palabra Tit%lo; !S es

reser7ada

SELECT !pellidos, Nombre, Cargo, Salario FROM Empleados )3ERE Cargo L(EE S!gente Jen"S !ND Salario 2 !LL 4SELECT Salario FROM Empleados )3ERE 4Cargo L(EE S"Tefe"S5 OR 4Cargo L(EE S"Dire+tor"S55;
Obtiene una lista con el nombre, cargo y salario de todos los agentes de ventas cuyo salario es mayor que el de todos los jefes y directores.

SELECT D(ST(NCTRO) NombreProd%+to, Pre+ioAInidad FROM Prod%+tos )3ERE 4Pre+ioAInidad 6 4SELECT Pre+ioAInidad FROM Prod%+tos )3ERE NombreAProd%+to 6 S!lmKbar anisadoS5;
Obtiene una lista con el nombre y el precio unitario de todos los productos con el mismo precio que el almbar anisado.

SELECT D(ST(NCTRO) NombreAConta+to, NombreACompaMia, CargoAConta+to, Telefono FROM Clientes )3ERE 4(DACliente (N 4SELECT D(ST(NCTRO) (DACliente FROM Pedidos )3ERE Fe+BaAPedido 26 @'DC&C<F@ /@'UC&C<F@5;
Obtiene una lista de las compaas y los contactos de todos los clientes que han realizado un pedido en el segundo trimestre de 199 .

SELECT Nombre, !pellidos FROM Empleados !S E )3ERE ER(STS 4SELECT " FROM 6E.(DAEmpleado5; Pedidos !S O )3ERE O.(DAEmpleado

!elecciona el nombre de todos los empleados que han reservado al menos un pedido.

SELECT D(ST(NCTRO) Pedidos.(dAProd%+to, Pedidos.Cantidad, 4SELECT D(ST(NCTRO) Prod%+tos.Nombre FROM Prod%+tos )3ERE Prod%+tos.(dAProd%+to 6 Pedidos.(dAProd%+to5 !S ElProd%+to FROM Pedidos )3ERE Pedidos.Cantidad 2 &$' ORDER B Pedidos.(dAProd%+to;
"ecupera el #$digo del %roducto y la #antidad pedida de la tabla pedidos, e&trayendo el nombre del producto de la tabla de productos.

(. Consultas de "e)erencias Cru*adas .na consulta de re=erencias cru7adas es aCuella Cue nos permite (isuali7ar los datos en =ilas 4 en columnas? estilo ta:la? por e>emploB #roducto P #antalones Camisas ]apatos 8o 1LL6 1.25M \.56M 4.36L 1LL6 3.MMM 1.253 2.563

Si tenemos una ta:la de productos 4 otra ta:la de pedidos? podemos (isuali7ar en total de productos pedidos por a8o para un art5culo determinado? tal 4 como se (isuali7a en la ta:la anterior. La sinta&is para este tipo de consulta es la siguienteB TR!NSFORM f%n+i1n agregada instr%++i1n sele+t P(JOT +ampo pi7ot 8(N 47alor&8, 7alor#8, ...9959 %n dondeB )uncin agregada %s una =uncin SQL seleccionados. agregada Cue opera so:re los datos

instruccin select %s una instruccin S%L%C9. ca! o i4ot %s el campo o e&presin Cue desea utili7ar para crear las ca:eceras de la columna en el resultado de la consulta. 4alor1< 4alor2 Son (alores =i>os utili7ados para crear las ca:eceras de la columna.

#ara resumir datos utili7ando una consulta de re=erencia cru7ada? se seleccionan los (alores de los campos o e&presiones especi=icadas como ca:eceras de columnas de tal =orma Cue pueden (erse los datos en un =ormato ms compacto Cue con una consulta de seleccin. 9" ;SFO"1 es opcional pero si se inclu4e es la primera instruccin de una cadena SQL. #recede a la instruccin S%L%C9 Cue especi=ica los campos utili7ados como enca:e7ados de =ila 4 una clusula -"O.# !/ Cue especi=ica el agrupamiento de las =ilas. Opcionalmente puede incluir otras clusulas como por e>emplo +,%"%? Cue especi=ica una seleccin adicional o un criterio de ordenacin. Los (alores de(ueltos en campo pi(ot se utili7an como enca:e7ados de columna en el resultado de la consulta. #or e>emplo? al utili7ar las ci=ras de (entas en el mes de la (enta como pi(ot en una consulta de re=erencia cru7ada se crear5an 12 columnas. #uede restringir el campo pi(ot para crear enca:e7ados a partir de los (alores =i>os 0(alor1? (alor23 listados en la clusula opcional ';. 9am:i2n puede incluir (alores =i>os? para los Cue no e&isten datos? para crear columnas adicionales. %>emplos TR!NSFORM S%m4Cantidad5 !S Jentas SELECT Prod%+to, Cantidad FROM Pedidos )3ERE Fe+Ba Bet:een @'&?'&?<;@ !nd @&#?F&?<;@ HROIP B Prod%+to ORDER B Prod%+to P(JOT DatePart4SmS, Fe+Ba5;
#rea una consulta de tabla de referencias cruzadas que muestra las ventas de productos por mes para un ao especfico. 'os meses aparecen de izquierda a derecha como columnas y los nombres de los productos aparecen de arriba hacia abajo como filas.

TR!NSFORM S%m4Cantidad5 !S Jentas SELECT Compania FROM Pedidos )3ERE Fe+Ba Bet:een @'&?'&?<;@ !nd @&#?F&?<;@ HROIP B Compania ORDER B Compania P(JOT STrimestre S L DatePart4SQS, Fe+Ba5 (n 4*Trimestre&*, *Trimestre#*, *Trimestre F*, *Trimestre D*5;
#rea una consulta de tabla de referencias cruzadas que muestra las ventas de productos por trimestre de cada proveedor en el ao indicado. 'os trimestres aparecen de izquierda a derecha como columnas y los nombres de los proveedores aparecen de arriba hacia abajo como filas.

.n caso prcticoB

Se trata de resol(er el siguiente pro:lemaB tenemos una ta:la de productos con dos campos? el cdigo 4 el nom:re del producto? tenemos otra ta:la de pedidos en la Cue anotamos el cdigo del producto? la =ecKa del pedido 4 la cantidad pedida. $eseamos consultar los totales de producto por a8o? calculando la media anual de (entas. %structura 4 datos de las ta:lasB 1. '$ 1 2 3 2. #edidosB rt5culosB ;om:re ]apatos #antalones !lusas

'd 1 2 3 1 2 3 1 2 3 1 2 3

FecKa 11P11P1LL6 11P11P1LL6 11P11P1LL6 12P1MP1LL6 M4PM5P1LL6 M5PM\P1LL6 M1PM1P1LL6 M2PM\P1LL6 M5P1MP1LL6 12P12P1LL6 15P12P1LL6 16P1MP1LL6

Cantidad 25M 125 52M 5M 25M 1MM 4M 6M 6M \ 52M 125M

#ara resol(er la consulta planteamos la siguiente consultaB TR!NSFORM S%m4Pedidos.Cantidad5 !S Res%ltado SELECT Nombre !S Prod%+to, Pedidos.(d !S C1digo, S%m4Pedidos.Cantidad5 !S TOT!L, !7g4Pedidos.Cantidad5 !S Media FROM Pedidos Pedidos.(d 6 !rtK+%los.(d (NNER TO(N !rtK+%los ON

HROIP B Pedidos.(d, Year4Fe+Ba5; / o:tenemos el siguiente resultadoB

!rtK+%los.Nombre

P(JOT

#roducto ]apatatos #antalones !lusas

Cdigo 1 2 3

9O9 L 34\ L55 1L4M

1edia \6 23\?65 4\5

1LL6 3MM 365 62M

1LL6 4\ 5\M 132M

Comentarios a la consultaB La clsula 9" ;SFO"1 indica el (alor Cue deseamos (isuali7ar en las columnas Cue realmente pertenecen a la consulta? en este caso 1LL6 4 1LL6? puesto Cue las dems columnas son opcionales. S%L%C9 especi=ica el nom:re de las columnas opcionales Cue deseamos (isuali7ar? en este caso #roducto? Cdigo? 9otal 4 1edia? indicando el nom:re del campo Cue deseamos mostrar en cada columna o el (alor de la misma. Si incluimos una =uncin de clculo el resultado se Kar en :ase a los datos de la =ila actual 4 no al total de los datos. F"O1 especi=ica el origen de los datos. La primera ta:la Cue de:e =igurar es aCuella de donde deseamos e&traer los datos? esta ta:la de:e contener al menos tres campos? uno para los t5tulos de la =ila? otros para los t5tulos de la columna 4 otro para calcular el (alor de las celdas. %n este caso en concreto se desea:a (isuali7ar el nom:re del producto? como el ta:la de pedidos slo =igura:a el cdigo del mismo se a8adi una nue(a columna en la clusula select llamada #roducto Cue se corresponda con el campo ;om:re de la ta:la de art5culos. #ara (incular el cdigo del art5culo de la ta:la de pedidos con el nom:re del misma de la ta:la art5culos se insert la clusula ';;%" @O';. La clusula -"O.# !/ especi=ica el agrupamiento de los registros? contrariamente a los manuales de instruccin esta clusula no es opcional 4a Cue de:e =igurar siempre 4 de:emos agrupar los registros por el campo del cual e&traemos la in=ormacin. %n este caso e&isten dos campos del cual e&traemos la in=ormacinB pedidos.cantidad 4 art5culos.nom:re? por ellos agrupamos por los campos. #ara =inali7ar la clusula #')O9 indica el nom:re de las columnas no opcionales? en este caso 1LL6 4 1LL6 4 como (amos a el dato Cue aparecer en las columnas? en este caso empleamos el a8o en Cue se

produ>o el pedido? e&tra42ndolo del campo pedidos.=ecKa. Otras posi:ilidades de =ecKa de la clusula pi(ot son las siguientesB 1. #ara agrupamiento por 9rimestres P(JOT STri S L DatePart4SQS,8Fe+Ba95; 2. #ara agrupamiento por meses 0sin tener en cuenta el a8o3 P(JOT Format48Fe+Ba9,SmmmS5 (n 4SEneS, SFebS, SMarS, S!brS, SMaVS, ST%nS, ST%lS, S!goS, SSepS, SO+tS, SNo7S, SDi+S5; 3. #ara agrupar por d5as P(JOT Format48Fe+Ba9,SSBort DateS5; +. Consultas de Unin Internas Las (inculaciones entre ta:las se reali7a mediante la clusula ';;%" Cue com:ina registros de dos ta:las siempre Cue Ka4a concordancia de (alores en un campo comDn. Su sinta&is esB SELECT +ampos FROM tb& (NNER TO(N tb# ON tb&.+ampo& +omp tb#.+ampo# %n dondeB t'1< t'2 Son los nom:res de las ta:las desde las Cue se com:inan los registros. ca! o1< ca! o2 Son los nom:res de los campos Cue se com:inan. Si no son num2ricos? los campos de:en ser del mismo tipo de datos 4 contener el mismo tipo de datos? pero no tienen Cue tener el mismo nom:re. co! %s cualCuier operador de comparacin relacionalB H? F? G? FH? GH? o FG. Se puede utili7ar una operacin ';;%" @O'; en cualCuier clusula F"O1. %sto crea una com:inacin por eCui(alencia? conocida tam:i2n como unin interna. Las com:inaciones %Cui son las ms comunesN 2stas com:inan los registros de dos ta:las siempre Cue Ka4a concordancia de (alores en un campo comDn a am:as ta:las. Se

puede utili7ar ';;%" @O'; con las ta:las $epartamentos 4 %mpleados para seleccionar todos los empleados de cada departamento. #or el contrario? para seleccionar todos los departamentos 0incluso si alguno de ellos no tiene ningDn empleado asignado3 se emplea L%F9 @O'; o todos los empleados 0incluso si alguno no est asignado a ningDn departamento3? en este caso "'-,9 @O';. Si se intenta com:inar campos Cue contengan datos 1emo u O:>eto OL%? se produce un error. Se pueden com:inar dos campos num2ricos cualesCuiera? incluso si son de di=erente tipo de datos. #or e>emplo? puede com:inar un campo ;um2rico para el Cue la propiedad Si7e de su o:>eto Field est esta:lecida como %ntero? 4 un campo Contador. %l e>emplo siguiente muestra cmo podr5a com:inar las ta:las Categor5as 4 #roductos :asndose en el campo '$CategoriaB SELECT NombreACategorKa, NombreProd%+to FROM Categorias (NNER TO(N Prod%+tos ON Categorias.(DCategoria 6 Prod%+tos.(DCategoria; %n el e>emplo anterior? '$Categoria es el campo com:inado? pero no est incluido en la salida de la consulta 4a Cue no est incluido en la instruccin S%L%C9. #ara incluir el campo com:inado? incluir el nom:re del campo en la instruccin S%L%C9? en este caso? Categorias.(DCategoria. 9am:i2n se pueden enla7ar (arias clusulas O; en una instruccin @O';? utili7ando la sinta&is siguienteB SELECT +ampos FROM tabla& (NNER TO(N tabla# ON tb&.+ampo& +omp tb#.+ampo& !ND ON tb&.+ampo# +omp tb#.+ampo#5 OR ON tb&.+ampoF +omp tb#.+ampoF59; 9am:i2n puede anidar instrucciones @O'; utili7ando la siguiente sinta&isB SELECT +ampos FROM tb& (NNER TO(N

4tb# (NNER TO(N 84 9tbF 8(NNER TO(N 84 9tabla0 8(NNER TO(N ...59 ON tbF.+ampoF +omp tb0.+ampo059 ON tb#.+ampo# +omp tbF.+ampoF5 ON tb&.+ampo& +omp tb#.+ampo#; .n L%F9 @O'; o un "'-,9 @O'; puede anidarse dentro de un ';;%" @O';? pero un ';;%" @O'; no puede anidarse dentro de un L%F9 @O'; o un "'-,9 @O';. %>emplo SELECT D(ST(NCTRO) S%m48Pre+io %nidad9 " 8Cantidad95 !S 8Jentas9, 8Nombre9 L S S L 8!pellidos9 !S 8Nombre +ompleto9 FROM 8Detalles de pedidos9, Pedidos, Empleados, Pedidos (NNER TO(N 8Detalles de pedidos9 ON Pedidos. 8(D de pedido9 6 8Detalles de pedidos9.8(D de pedido9, Empleados (NNER TO(N Pedidos ON Empleados.8(D de empleado9 6 Pedidos.8(D de empleado9 HROIP B 8Nombre9 L S S L 8!pellidos9;
#rea dos combinaciones equivalentes( una entre las tablas )etalles de pedidos y %edidos, y la otra entre las tablas %edidos y *mpleados. *sto es necesario ya que la tabla *mpleados no contiene datos de ventas y la tabla )etalles de pedidos no contiene datos de los empleados. 'a consulta produce una lista de empleados y sus ventas totales.

Si empleamos la clusula ';;%" en la consulta se seleccionarn slo aCuellos registros de la ta:la de la Cue Ka4amos escrito a la i7Cuierda de ';;%" @O'; Cue contengan al menos un registro de la ta:la Cue Ka4amos escrito a la derecKa. #ara solucionar esto tenemos dos clusulas Cue sustitu4en a la pala:ra cla(e ';;%"? estas clusulas son L%F9 4 "'-,9. L%F9 toma todos los registros de la ta:la de la i7Cuierda aunCue no tengan ningDn registro en la ta:la de la i7Cuierda. "'-,9 reali7a la misma operacin pero al contrario? toma todos los registros de la ta:la de la derecKa aunCue no tenga ningDn registro en la ta:la de la i7Cuierda.

1,. Consultas de Unin E-ternas Se utili7a la operacin .;'O; para crear una consulta de unin? com:inando los resultados de dos o ms consultas o ta:las independientes. Su sinta&is esB 8T!BLE9 +ons%lta& IN(ON 8!LL9 8T!BLE9 +ons%lta# 8IN(ON 8!LL9 8T!BLE9 +ons%ltan 8 ... 99 %n dondeB consulta1< consulta2< consultan Son instrucciones S%L%C9? el nom:re de una consulta almacenada o el nom:re de una ta:la almacenada precedido por la pala:ra cla(e 9 !L%. #uede com:inar los resultados de dos o ms consultas? ta:las e instrucciones S%L%C9? en cualCuier orden? en una Dnica operacin .;'O;. %l e>emplo siguiente com:ina una ta:la e&istente llamada ;ue(as Cuentas 4 una instruccin S%L%C9B T!BLE 8N%e7as C%entas9 IN(ON !LL SELECT " FROM Clientes )3ERE 8Cantidad pedidos9 2 &'''; Si no se indica lo contrario? no se de(uel(en registros duplicados cuando se utili7a la operacin .;'O;? no o:stante puede incluir el predicado LL para asegurar Cue se de(uel(en todos los registros. %sto Kace Cue la consulta se e>ecute ms rpidamente. 9odas las consultas en una operacin .;'O; de:en pedir el mismo nDmero de campos? no o:stante los campos no tienen porCu2 tener el mismo tama8o o el mismo tipo de datos. Se puede utili7ar una clusula -"O.# !/ 4Po , )';- en cada argumento consulta para agrupar los datos de(ueltos. #uede utili7ar una clusula O"$%" !/ al =inal del Dltimo argumento consulta para (isuali7ar los datos de(ueltos en un orden espec5=ico. SELECT )3ERE 8Nombre de +ompaMKa9, Ci%dad FROM Pro7eedores

PaKs 6 *Brasil* IN(ON SELECT 8Nombre de +ompaMKa9, Ci%dad FROM Clientes )3ERE PaKs 6 SBrasilS

"ecupera los nombres y las ciudades de todos proveedores y clientes de +rasil

SELECT 8Nombre de )3ERE PaKs 6 *Brasil*

+ompaMKa9, Ci%dad

FROM

Pro7eedores

IN(ON SELECT 8Nombre de +ompaMKa9, Ci%dad FROM Clientes )3ERE PaKs 6 *Brasil* ORDER B Ci%dad
"ecupera los nombres y las ciudades de todos proveedores y clientes radicados en +rasil, ordenados por el nombre de la ciudad

SELECT 8Nombre de +ompaMKa9, Ci%dad FROM Pro7eedores )3ERE PaKs 6 *Brasil* IN(ON SELECT 8Nombre de +ompaMKa9, Ci%dad FROM Clientes )3ERE PaKs 6 *Brasil* IN(ON SELECT 8!pellidos9, Ci%dad FROM Empleados )3ERE Regi1n 6 *!mWri+a del S%r*
"ecupera los nombres y las ciudades de todos los proveedores y clientes de brasil y los apellidos y las ciudades de todos los empleados de ,m-rica del !ur

T!BLE 8Lista pro7eedores9

de

+lientes9

IN(ON

T!BLE

8Lista

de

"ecupera los nombres y c$digos de todos los proveedores y clientes

11. Estructuras de las %a'las 11.1 Creacin de %a'las Nue4as Si se est utili7ando el motor de datos de 1icroso=t para acceder a :ases de datos access? slo se puede emplear esta instruccin para crear :ases de datos propias de access. Su sinta&is esB CRE!TE T!BLE tabla 4+ampo& tipo 4tamaMo5 Kndi+e& , +ampo# tipo 4tamaMo5 Kndi+e# , ..., Kndi+e m%lti+ampo , ... 5 %n dondeB #arte ta:la campo1 $escripcin %s el nom:re de la ta:la Cue se (a a crear. %s el nom:re del campo o de los campos Cue se (an a

campo2 tipo tama8o 5ndice1 5ndice2 5ndice multicampos

crear en la nue(a ta:la. La nue(a ta:la de:e contener? al menos? un campo. %s el tipo de datos de campo en la nue(a ta:la. 0)er 9ipos de $atos3 %s el tama8o del campo slo se aplica para campos de tipo te&to. %s una clusula CO;S9" ';9 Cue de=ine el tipo de indice a crear. %sta clusula en opcional. %s una clusula CO;S9" ';9 Cue de=ine el tipo de indice multicampos a crear. .n 5ndice multi campo es aCuel Cue est inde&ado por el contenido de (arios campos. %sta clusula en opcional.

CRE!TE T!BLE Empleados 4Nombre TERT 4#$5 , !pellidos TERT 4$'55;


#rea una nueva tabla llamada *mpleados con dos campos, uno llamado .ombre de tipo te&to y longutid /0 y otro llamado apellidos con longitud 01.

CRE!TE T!BLE Empleados 4Nombre TERT 4&'5, !pellidos TERT, Fe+BaANa+imiento D!TET(ME5 CONSTR!(NT (ndi+eHeneral IN(XIE 48Nombre9, 8!pellidos9, 8Fe+BaANa+imiento95;
#rea una nueva tabla llamada *mpleados con un campo .ombre de tipo te&to y longitud 11, otro con llamado ,pellidos de tipo te&to y longitud predeterminada 2013 y uno m4s llamado 5echa6.acimiento de tipo 5echa78ora. 9ambi-n crea un ndice :nico 2no permite valores repetidos3 formado por los tres campos.

CRE!TE T!BLE Empleados 4(D (NTEHER CONSTR!(NT (ndi+ePrimario PR(M!R , Nombre TERT, !pellidos TERT, Fe+BaANa+imiento D!TET(ME5;
#rea una tabla llamada *mpleados con un campo 9e&to de longitud predeterminada 2013 llamado .ombre y otro igual llamado ,pellidos, crea otro campo llamado 5echa6.acimiento de tipo 5echa78ora y el campo ;) de tipo entero el que establece como clave principal.

11.2 La cl/usula C2NS%"AIN% Se utili7a la clusula CO;S9" ';9 en las instrucciones L9%" 9 !L% 4 C"% 9% 9 !L% para crear o eliminar 5ndices. %&isten dos sinta&is para esta clusula dependiendo si desea Crear %liminar un 5ndice de un Dnico campo o si se trata de un campo multi5ndice. Si se utili7a el motor de datos de 1icroso=t? slo podr utili7ar esta clusula con las :ases de datos propias de dicKo motor.

#ara los 5ndices de campos DnicosB CONSTR!(NT nombre YPR(M!R EE P IN(XIE P REFERENCES tabla e0terna 84+ampo e0terno&, +ampo e0terno#59Z Para los Kndi+es de +ampos m[ltiples, CONSTR!(NT nombre YPR(M!R EE 4primario&8, primario# 8, ...995 P IN(XIE 4[ni+o&8, [ni+o# 8, ...995 P FORE(HN EE 4ref&8, ref# 8, ...995 REFERENCES tabla e0terna 84+ampo e0terno& 8,+ampo e0terno# 8, ...9959Z

#arte nom:re primario; Dnico; re=; ta:la e&terna campos e&ternos

$escripcin %s el nom:re del 5ndice Cue se (a a crear. %s el nom:re del campo o de los campos Cue =orman el 5ndice primario. %s el nom:re del campo o de los campos Cue =orman el 5ndice de cla(e Dnica. %s el nom:re del campo o de los campos Cue =orman el 5ndice e&terno 0Kacen re=erencia a campos de otra ta:la3. %s el nom:re de la ta:la Cue contiene el campo o los campos re=erenciados en re=; %s el nom:re del campo o de los campos de la ta:la e&terna especi=icados por re=1? re=2? ...? re=;

Si se desea crear un 5ndice para un campo cuando se esta utili7ando las instrucciones L9%" 9 !L% o C"% 9% 9 !L% la clusula CO;9" ';9 de:e aparecer inmediatamente despu2s de la especi=icacin del campo inde&eado. Si se desea crear un 5ndice con mDltiples campos cuando se est utili7ando las instrucciones L9%" 9 !L% o C"% 9% 9 !L% la clusula CO;S9" ';9 de:e aparecer =uera de la clusula de creacin de ta:la.

%i o de Descri cin Indice .;'Q.% #"'1 "/ -enera un 5ndece de cla(e Dnica. Lo Cue implica Cue los registros de la ta:la no pueden contener el mismo (alor en los campos inde&ados. -enera un 5ndice primario el campo o los campos

I%/

especi=icados. 9odos los campos de la cla(e principal de:en ser Dnicos 4 no nulos? cada ta:la slo puede contener una Dnica cla(e principal. -enera un 5ndice e&terno 0toma como (alor del 5ndice campos contenidos en otras ta:las3. Si la cla(e principal de la ta:la e&terna consta de ms de un campo? se de:e utili7ar una de=inicin de 5ndice de mDltiples campos? listando todos los campos de re=erencia? el nom:re de la ta:la e&terna? 4 los nom:res de los campos re=erenciados en la ta:la e&terna en el mismo orden Cue los campos de re=erencia listados. Si los campos re=erenciados son la cla(e principal de la ta:la e&terna? no tiene Cue especi=icar los campos re=erenciados? predeterminado por (alor? el motor @et se comporta como si la cla(e principal de la ta:la e&terna =ueran los campos re=erenciados .

FO"%'-; I%/

11.3 Creacin de @ndices Si se utili7a el motor de datos @et de 1icroso=t slo se pueden crear 5ndices en :ases de datos del mismo motor. La sinta&is para crear un 5ndice en ua ta:la 4a de=inida en la siguienteB CRE!TE 8 IN(XIE 9 (NDER Kndi+e ON tabla 4+ampo 8!SCPDESC98, +ampo 8!SCPDESC9, ...95 8)(T3 Y PR(M!R %n dondeB #arte 5ndice ta:la campo SC^$%SC .;'Q.% $'S LLO+ ;.LL $escripcin %s el nom:re del 5ndice a crear. %s el nom:re de una ta:la e&istentes en la Cue se crear el 5ndice. %s el nom:re del campo o lista de campos Cue consitu4en el 5ndice. 'ndica el orden de los (alores de lso campos SC indica un orden ascendente 0(alor predeterminado3 4 $%SC un orden descendente. 'ndica Cue duplicados. el indice no puede contener (alores P D(S!LLO) NILL P (HNORE NILL Z9

#roKi:e (alores nulos en el 5ndice

'-;O"% ;.LL #"'1 "/

%&clu4e del 5ndice los (alores nulos incluidos en los campos Cue lo componen. signa al 5ndice la categor5a de cla(e principal? en cada ta:la slo puede e&istir un Dnico indice Cue sea ECla(e #rincipalE. Si un 5ndice es cla(e principal implica Cue Cue no puede contener (alores nulos ni duplicados.

Se puede utili7ar C"% 9% ';$%J para crear un pseudo 5ndice so:re una ta:la ad>unta en una =uente de datos O$!C tal como SQL Ser(er Cue no tenga toda(5a un 5ndice. ;o necesita permiso o tener acceso a un ser(idor remoto para crear un pseudo 5ndice? adems la :ase de datos remota no es consciente 4 no es a=ectada por el pseudo 5ndice. Se utili7a la misma sinta&is para las ta:la ad>unta Cue para las originales. %sto es especialmente Dtil para crear un 5ndice en una ta:la Cue ser5a de slo lectura de:ido a la =alta de un 5ndice. CRE!TE (NDER Mi(ndi+e ON Empleados 4PrefiNo, Telefono5;
#rea un ndice llamado <i;ndice en la tabla empleados con los campos %refijo y 9elefono.

CRE!TE IN(XIE (NDER Mi(ndi+e ON Empleados 4(D5 )(T3 D(S!LLO) NILL;


#rea un ndice en la tabla *mpleados utilizando el campo ;), obligando que que el campo ;) no contenga valores nulos ni repetidos.

11.4 Modi)icar el DiseAo de una %a'la 1odi=ica el dise8o de una ta:la 4a e&istente? se puden modi=icar los campos o los 5ndices e&istentes. Su sinta&is esB !LTER T!BLE tabla Y!DD YCOLIMN tipo de +ampo84tamaMo59 8CONSTR!(NT Kndi+e9 CONSTR!(NT Kndi+e m%lti+ampoZ P DROP YCOLIMN +ampo ( CONSTR!(NT nombre del Kndi+eZ Z %n dondeB #arte ta:la campo tipo tama8o 5ndice $escripcin %s el nom:re de la ta:la Cue se desea modi=icar. %s el nom:re del campo Cue se (a a a8adir o eliminar. %s el tipo de campo Cue se (a a a8adir. %l el tama8o del campo Cue se (a a a8adir 0slo para campos de te&to3. %s el nom:re del 5ndice del campo 0cuando se crean campos3 o el nom:re del 5ndice de la ta:la Cue se desea eliminar.

5ndice multicampo

%s el nom:re del 5ndice del campo multicampo 0cuando se crean campos3 o el nom:re del 5ndice de la ta:la Cue se desea eliminar.

Operacin $$ COL.1; $$ $"O# COL.1; $"O#

$escripcin Se utili7a para a8adir un nue(o campo a la ta:la? indicando el nom:re? el tipo de campo 4 opcionalmente el tama8o 0para campos de tipo te&to3. Se utli7a para agregar un 5ndice de multicampos o de un Dnico campo. Se utli7a para :orrar un campo. Se especi=ica Dnicamente el nom:re del campo. Se utili7a para eliminar un 5ndice. Se especi=ica Dnicamente el nom:re del 5ndice a continuacin de la pala:ra reser(ada CO;S9" ';9.

!LTER T!BLE Empleados !DD COLIMN Salario CIRRENC ;


,grega un campo !alario de tipo <oneda a la tabla *mpleados.

!LTER T!BLE Empleados DROP COLIMN Salario; Elimina el campo Salario de la tabla Empleados. !LTER FORE(HN EE T!BLE Pedidos !DD CONSTR!(NT Rela+ionPedidos

4(DAEmpleado5 REFERENCES Empleados 4(DAEmpleado5;


,grega un indice e&terno a la tabla %edidos. *l ndice e&terno se basa en el campo ;)6*mpleado y se refiere al campo ;)6*mpleado de la tabla *mpleados. *n este ejemplo no es necesario indicar el campo junto al nombre de la tabla en la cl4usula "*5*"*.#*!, pues ;)6*mpleado es la clave principal de la tabla *mpleados.

!LTER T!BLE Pedidos DROP CONSTR!(NT Rela+ionPedidos;


*limina el ndide de la tabla %edidos.

12. Consultas con .ara!etros Las consultas con parmetros son aCuellas cu4as condiciones de :DsCueda se de=inen mediante parmetros. Si se e>ecutan directamente desde la :ase de datos donde Kan sido de=inidas aparecer un mensa>e solicitando el (alor de cada uno de los parmetros. Si deseamos e>ecutarlas desde una aplicacin Ka4 Cue

asignar primero el (alor de los parmetros 4 despu2s e>ecutarlas. Su sinta&is es la siguienteB P!R!METERS nombre& tipo&, nombre# tipo#, ... , nombreN tipoN Cons%lta %n dondeB #arte nom:re tipo consulta $escripcin %s el nom:re del parmetro %s el tipo de datos del parmetro .na consulta SQL

#uede utili7ar nom:re pero no tipo de datos en una clusula +,%"% o , )';-. P!R!METERS Pre+ioAMinimo C%rren+V, Fe+BaA(ni+io DateTime; SELECT (DPedido, Cantidad FROM Pedidos )3ERE Pre+io 2 Pre+ioAMinimo !ND Fe+BaPedido 26 Fe+BaA(ni+io; %l e>emplo siguiente muestra como utili7ar los parmetros en el programa de )isual !asicB P%bli+ S%b HeneraCons%lta45 Dim SXL !s String Dim Xd !s X%erVDef Dim Rs !s Re+ordset SXL 6 SP!R!METERS Pre+ioAMinimo C%rren+V, DateTime; S Fe+BaA(ni+io

SXL 6 SXL L SSELECT (DPedido, Cantidad FROM Pedidos )3ERE Pre+io 2 S SXL 6 SXL Fe+BaA(ni+io; S L SPre+ioAMinimo !ND Fe+BaPedido 26

Set Xd 6 BaseDatos.CreateX%erVDef4MiCons%lta, SXL5 Xd.Parameters\Pre+ioAMinimo 6 # Xd.Parameters\Fe+Ba(ni+io 6 @F&C&#C<$@ Set Rs 6 Xd.OpenRe+ordset45

End S%b %>emploB P!R!METERS 8Es+riba los !pellidos,9 Te0t; SELECT " FROM Empleados )3ERE 8Es+riba los !pellidos,9 6 8!pellidos9;
'a ejecuci$n desde la base de datos solicita al usuario los apellidos del empleado y despu-s muestra los resultados

13. 0ases de Datos E-ternas #ara el acceso a :ases de datos e&ternas se utili7a la clusula ';. Se puede acceder a :ase de datos d!ase? #arado& o !trie(e. %sta clusula slo permite la cone&in de una :ase de datos e&terna a la (e7. .na :ase de datos e&terna es una :ase de datos Cue no sea la acti(a. unCue para me>orar los rendimientos es me>or ad>untarlas a la :ase de datos actual 4 tra:a>ar con ellas. #ara especi=icar una :ase de datos Cue no pertenece a ccess !asic? se agrega un punto 4 coma 0N3 al nom:re 4 se encierra entre comillas simples. 9am:i2n puede utili7ar la pala:ra reser(ada $ 9 ! S% para especi=icar la :ase de datos e&terna. #or e>emplo? las l5neas siguientes especi=ican la misma ta:laB FROM Tabla (N *8dB!SE (J; D!T!B!SE6C,-DB!SE-D!TOS-JENT!S;9*; FROM Tabla (N *C,-DB!SE-D!TOS-JENT!S* *dB!SE (J;* cceso a una :ase de datos e&terna de 1icroso=t SELECT (DCliente FROM (DCliente Li>e *!"*; Clientes (N ccessB )3ERE

M(SD!TOS.MDB

*n donde <;!),9O!.<)+ es el nombre de una base de datos de <icrosoft ,ccess que contiene la tabla #lientes.

cceso a una :ase de datos e&terna de d! S% ''' o ')B SELECT (DCliente FROM *C,-DB!SE-D!TOS-JENT!S* *dB!SE (J*; )3ERE (DCliente Li>e *!"*;
%ara recuperar datos de una tabla de d+,!* ;;;= hay que utilizar >d+,!* ;;;=?> en lugar de >d+,!* ;@?>.

Clientes

(N

Acceso a una 'ase de datos de .arado- 3.- o 4.-> SELECT (DCliente FROM Clientes *C,-P!R!DOR-D!TOS-JENT!S* *Parado0 D.0;* )3ERE (DCliente Li>e *!"*;
%ara recuperar datos de una tabla de %arado& versi$n >%arado& A.&?> por >%arado& .&?>.

(N

.&, hay que sustituir

Acceso a una 'ase de datos de 0trie4e> SELECT (DCliente FROM Clientes (N *C,-BTR(EJE-D!TOS-JENT!S-F(LE.DDF* *Btrie7e;* )3ERE (DCliente Li>e *!"*;
#(B+9";*@*B),9O!B@*.9,!B5;'*.))5 es la ruta de acceso y nombre de archivo del archivo de definici$n de datos de +trieve.

14. Derec1os de .ro ietario %n entornos de :ases de datos con permisos de seguridad para grupos de tra:a>o se puede utili7ar la clusula +'9, O+;%" CC%SS O#9'O; para Cue el usuario actual adCuiera los derecKos de propietario a la Kora de e>ecutar la consulta. Su sinta&is esB instruccin sCl +'9, O+;%" CC%SS O#9'O; SELECT !pellido, Nombre, Salario FROM Empleados ORDER B !pellido )(T3 O)NER!CCESS OPT(ON; %sta opcin reCuiere Cue est2 declarado el acceso al =icKero de grupo de tra:a>o 0generalmente s4stem.mda s4stem .mdR3 de la :ase de datos actual. 1#. La Clausula ."2CEDU"E %sta clusula es poco usual 4 se utili7a para crear una consulta a la misma (e7 Cue se e>ecuta? opcionalmente de=ine los parmetros de la misma. Su sinta&is es la siguienteB PROCEDIRE NombreCons%lta ParOmetroN tipon Cons%ltaSXL %n dondeB #arte ;om:reConsulta $escripcin %s el nom:re con se guardar la consulta en la :ase de datos. ParOmetro& tipo&, .... ,

#armetro tipo ConsultaSQL

%s el nom:re de parmetro o de los parmetros de dicKa consulta. %s el tipo de datos del parmetro %s la consulta Cue se desea gra:ar 4 e>ecutar.

PROCEDIRE ListaACategorias; SELECT D(ST(NCTRO) NombreACategoria, (DACategorKa FROM Categorias ORDER B NombreACategoria;
,signa el nombre 'ista6de6categoras a la consulta y la ejecuta.

PROCEDIRE Res%men Fe+BaA(ni+io DateTime, Fe+BaAFinal DateTime; SELECT D(ST(NCTRO) Fe+BaAEn7io, (DAPedido, (mporteAPedido, Format4Fe+BaAEn7io, SVVVVS5 !S !Mo FROM Pedidos )3ERE Fe+BaAEn7io Bet:een Fe+BaA(ni+io !nd Fe+BaAFinal;
,signa el nombre "esumen a la consulta e incluye dos par4metros.

1$. Ane-os 1$.1 "esolucin de .ro'le!as 1$.1.1 0uscar In)or!acin du licada en un ca! o de una ta'la. #ara generar este tipo de consultas lo ms sencillo es utili7ar el asistente de consultas de ccess? editar la sentencia SQL de la consulta 4 pegarla en nuestro cdigo. ;o o:stante este tipo de consulta se consigue de la siguiente =ormaB SELECT D(ST(NCTRO) Lista de Campos a Jis%ali=ar FROM Tabla )3ERE CampoDeB%sQ%eda (n 4SELECT CampoDeB%sQ%eda FROM Tabla !s ps%d1nimo HROIP B CampoDeB%sQ%eda 3!J(NH Co%nt4"52& 5 ORDER B CampoDeB%sQ%eda; .n caso prctico? si deseamos locali7ar aCuellos empleados con igual nom:re 4 (isuali7ar su cdigo correspondiente? la consulta ser5a la siguienteB SELECT D(ST(NCTRO) Empleados.Nombre, Empleados.(dEmpleado FROM Empleados )3ERE Empleados.Nombre (n 4SELECT Nombre FROM Empleados !s Tmp HROIP B Nombre 3!J(NH Co%nt4"52&5 ORDER B Empleados.Nombre;

1$.1.2 "ecu erar "egistros de una ta'la ?ue no contengan registros relacionados en otra. %ste tipo de consulta se emplea en situaciones tales como sa:er Cue productos no se Kan (endido en un determinado periodo de tiempo? SELECT D(ST(NCTRO) Prod%+tos.(dProd%+to, Prod%+tos.Nombre FROM Prod%+tos LEFT TO(N Pedidos ON Prod%+tos.(dProd%+to 6 Pedidos.(dProd%+t )3ERE 4Pedidos.(dProd%+to (s N%ll5 !ND 4Pedidos.Fe+Ba Bet:een @'&?'&?<;@ !nd @'&?F'?<;@5; La sinta&is es sencilla? se trata de reali7ar una unin interna entre dos ta:las seleccionadas mediante un L%F9 @O';? esta:lecimiendo como condicin Cue el campo relacionado de la segunda sea ;ull. 1$.2 Utli*ar SQL desde 5isual 0asic %&isten dos tipos de consultas SQLB las consultas de seleccin 0nos de(uel(en datos3 4 las consultas de accin 0aCuellas Cue no de(uel(en ningDn registro3. m:as pueden ser tratadas en )isual !asic pero de =orma di=erente. Las consultas de seleccin se e>ecutan recogiendo la in=ormacin en un recordset pre(iamente de=inido mediante la instruccin openrecordset03? por e>emploB Dim SXL as String Dim RS as re+ordset SXL 6 SSELECT " FROM Empleados;S Set RS6MiBaseDatos.OpenRe+ordSet4SXL5 Si la consula de seleccin se encuentra almacenada en una consulta de la :ase de datosB Set "SH1i!ase$atos.Open"ecordset0E1iConsultaE3 Las consultas de accin? al no de(ol(er ningDn registro? no las podemos asignar a ningDn recordset? en este caso la =orma de e>ecutarlas es mediante los m2todos %&ecute 4 %&ecuteSQL 0para :ases de datos O$!C3? por e>emploB Dim SXL as string

SXL 6 SDELETE " FROM Empleados )3ERE Categoria 6 *Ordenan=a*;S MiBaseDatos.E0e+%te SXL 1$.3 3unciones de 5isual 0asic utili*a'les en una Instruccin SQL

Funcin ;oR $ate 9ime /ear 1ontK $a4

Sinta&is )aria:leH ;oR )aria:leH$ate )aria:leH9ime )aria:leH/ear0FecKa3 )aria:leH1ontK0FecKa3 )aria:leH$a40FecKa3

$escripcin $e(uel(e la =ecKa 4 la Kora actual del sistema $e(uel(e la =ecKa actual del sistema $e(uel(e la Kora actual del sistema $e(uel(e los cuatro d5gitos correspondientes al a8o de FecKa $e(uel(e el nDmero del mes del parmetro =ecKa. $e(uel(e el nDmero del d5a del mes del parmetro =ecKa. $e(uel(e un nDmero entero Cue representa el d5a de la semana del parmetro =ecKa. $e(uel(e un nDmero entre M 4 23 representa la Kora del parmetro ,ora. Cue

+ee*da4 )aria:leH+ee*da40FecKa3 ,our 1inute Second )aria:leH,our0,ora3 )aria:leH1inute0,ora3 )aria:leHSecond0,ora3

$e(uel(e un nDmero entre M 4 5L Cue representa los minutos del parmetro Kora. $e(uel(e un nDmero entre M 4 5L Cue representa los segundos del parmetro Kora.

$ate#art %sta =uncin de(uel(e una parte se8alada de una =ecKa concreta. Su sinta&is esB DatePart4Parte, Fe+Ba, Comien=oSemana, Comien=o!Mo5 #arte representa a la porcin de =ecKa Cue se desea o:tener? los posi:les (alores sonB
)alor 4444 C m 4 d R RR $escripcin 8o 9rimestre 1es $5a del a8o $5a del mes $5a de la semana Semana del a8o

K m s

,ora 1inutos Segundos

Comien7oSemana indica el primer d5a de la semana. Los posi:les (alores sonB


)alor M 1 2 3 4 5 6 6 $escripcin .tili7a el (alor pode e=ecto del sistema $omingo 0)alor predeterminado3 Lunes 1artes 1i2rcoles @ue(es )iernes S:ado

Comien7o 8o indica cual es la primera semana del a8oN los posi:les (alores sonB
)alor $escripcin M 1 2 3 )alor del sistema Comien7a el a8o el 1 de enero 0(alor predeterminado3. %mpie7a con la semana Cue tenga al memos cuatro d5as en el nue(o a8o. %mpie7a con la semana Cue est2 contenida completamente en el nue(o a8o.

1$.4 E4aluar 4alores antes de eBecutar la Consuta. $entro de una sentencia SQL podemos emplear la =uncin ii= para indicar las condiciones de :DsCueda. La sinta&is de la =uncin ii= es la siguienteB iif4E0presion,Jalor&,Jalor#5 %n donde %&presin es la sentencia Cue e(aluamosN si %&presin es (erdadera entonces se de(uel(e )alor1? si %&presin es =alsa se de(uel(e )alor2. SELECT " Total FROM Empleados )3ERE !pellido 6 iff4TRA!pellido.Te0t /2 **, TRA!pellido.Te0t, "5 ;
!upongamos que en un formulario tenemos una casilla de te&to llamanda 9C6,pellido. !i cuando ejecutamos esta consulta la casilla contiene alg:n valor se devuelven todos los empleados cuyo apellido coincida con el te&to de la casilla, en caso contrario se devuelven todos los empleados.

SELECT Fe+Ba, Prod%+to, Cantidad, 4iif4CodigoPostal26#;''' !nd CodigoPostal /6#;<<<,*Madrid*,*Na+ional*55 !S Destino FROM Pedidos;
*sta consulta devuelve los campos 5echa, .ombre del %roducto y #antidad de la tabla pedidos, aadiendo un campo al final con el valor <adrid si el c$digo posta est4 dentro del intervalo, en caso contario devuelve .acional.

1$.# Un .e?ueAo Manual de Estilo Siempre es :ueno intentar Kacer las cosas de igual modo para Cue el mantenimiento 4 la re(isin nos sea una la:or lo ms sencilla posi:le. %n lo Cue a mi respecta utili7o las siguiente normas a la Kora de ela:orar sentencias SQLB 1. Las clusulas siempre las escri:o con 1a4Dsculas. 2. Los operadores lgicos de sentencias siempre con 1a4Dsculas. 3. Las operaciones siempre la primera letra con ma4Dsculas 4 el resto en minDsculas. 4. Los operadores lgicos incluidos en otros operadores la primera letra con ma4Dsculas 4 el resto con minDsculas. Los ;om:res de las 9a:las? Campos 4 Consultas? los escri:o siempre la primera letra con ma4Dsculas 4 el resto con minDsculas? en algunos casos utili7o el carcter E_E para de=inir me>or el nom:reB DetallesAPedidos. unCue con el motor @et se pueden utili7ar acentos 4 espacios en :lanco para nom:rar los campos? las ta:las 4 las consultas no los utili7o porCue cuando se e&portar ta:las a otros sistemas los acentos 4 los espacios en :lanco pueden producir errores innecesarios. "ecuerda siempre Cue si utili7as espacios en :lanco para llamar ta:las o consultas cada (e7 Cue Kagas re=erencias a ellos en una consulta de:es incluir sus nom:res entre corcKetes. SELECT 8(D de Pedido9, 8Nombre del Prod%+to9, Cantidad FROM 8Detalles del Pedido9;