Está en la página 1de 24

Introduccin al Lenguaje Estructurado de Consultas (SQL)

Versin 3.63
Esta pgina es un tutorial de Structured Query Language ("Lenguaje Estructurado de consultas"), (tambin conocido como SQL) y es un esfuerzo pionero en la ord ide eb como primer tutorial comprensible de SQL e!istente en "nternet# SQL permite a los usuarios el acceso a un sistema de manejo de bases de datos relacional, como son $racle, Sybase, "nformi!, %icrosoft SQL Ser&er, 'ccess, y otras, permitiendo &er a los usuarios los datos (ue los usuarios (uieren &er# SQL asimismo permite a los usuarios definir los datos en una base de datos, y manipular estos datos# Esta pgina describir como usar SQL, y dar ejemplos# El SQL usado en este documento es "')S"", o estndar SQL, y no SQL caracter*stico de un sistema de manejo de bases de datos espec*fico, el cual ser &isto en la secci+n "SQL no estndar"#

NDICE CAPITULO 1.Introduccin


Bases de la sentencia SELECT Seleccin condicional Operadores relacionales Condiciones compuestas IN & BET EEN Usando LI!E

CAPITULO ". Uniones


Uniones Cla#es $eali%ando una unin Eliminando duplicados Alias & In&Su'consultas

CAPITULO (. )iscel*neo de sentencias S+L


,unciones a-re-adas .istas Creando nue#as ta'las )odi/icando ta'las A0adiendo datos Borrando datos Actuali%ando datos

CAP1TULO 2. )iscel*neo de Tpicos


Indices 3$OUP B4 & 5A.IN3 )*s su'consultas E6ISTS & ALL UNION & Otras uniones

CAP1TULO 7. S+L em'e'ido CAP1TULO 8. Pre-untas S+L comunes & Tpicos A#an%ados
Primera ,orma Normal Se-unda ,orma Normal Tercera ,orma Normal $elacin Uno9a9Uno $elacin Uno9a9)uc:os $elacin )uc:os9a9)uc:os

CAP1TULO ;. S+L no est*ndar CAP1TULO <. $esumen de sinta=is & Lin>s Importantes
$esumen de sinta=is Lin>s importantes

A-radecimientos

CAP1TULO 1. Introduccin

ases de la sentencia SELEC! En una B? relacional@ los datos son almacenados en ta'las. Un eAemplo de ta'la puede contener el ?NI@ el nom're B la ?ireccinC

Ta'laDdireccionesDempleados ?NI "(E<;;(E 278"(<EG Apellidos 3arcFa Lpe% Nom're Antonio Huan ?ireccin C& )aBor " Pl. ABuntamiento Ciudad .alencia Alicante

A:ora@ #amos a #er Iue :a'rFa Iue :acer para #er las direcciones de todos los empleados. Utili%a la sentencia SELECT de la si-uiente maneraC SELECT Nombre, Apellidos, Direccin, Ciudad, Provincia FROM Tabla direcciones empleados! Los si-uiente es el resultado de tu consulta de la B?C Nom're Antonio Apellidos 3arcFa ?ireccin C& )aBor" Ciudad Pro#incia

""""""""""""""""""""""""""""""""""""""""""""""""""""""
.alencia .alencia

Huan

Lpe%

Pl. ABuntamiento Alicante Alicante

La e=plicacin de lo Iue aca'as de :acer es la si-uiente@ :as pre-untado por todos los datos de la Ta'laDdireccionesDempleados@ B especF/icamente@ :as pre-untado por la columnas llamadas Nom're@ Apellidos@ ?ireccin@ Ciudad B Pro#incia. ?ate cuenta Iue los nom're de las columnas B los nom'res de las ta'las no tienen espacios...Jstos de'en ser escritos con una pala'raK B Iue la sentencia aca'a con un punto B coma LKM. La /orma -eneral para una sentencia SELECT@ recuperando las /ilas de una ta'la esC SELECT NombreColumna, NombreColumna, """ FROM NombreTabla! Para co-er todas las columnas de una ta'la sin escri'ir todos los nom'res de columna@ usaC SELECT # FROM NombreTabla! Cada administrador de B?Ns L?B)S@ O?ata )ana-ement SBstemOM B tipo de so/tPare de B?Ns tienen di/erentes mJtodos para identi/icarse en la 'ase de datos e introducir comandos S+L.

Seleccin Condicional

Para un maBor estudio de la sentencia SELECT@ ec:a un #ista%o a una nue#a ta'la de eAemploC

Ta'laDestadisticaDempleados CodDempleado 1G1 1G7 17" "17 "22 (GG ((7 2GG 221 #$eradores %elacionales Salario ;7GGG 87GGG 8GGGG 8GGGG 7GGGG 27GGG 2GGGG ("GGG "<GGG Bene/icios 17GGG 17GGG 17GGG 1"7GG 1"GGG 1GGGG 1GGGG ;7GG ;7GG Car-o

Encar-ado

Encar-ado

Encar-ado

Encar-ado TJcnico TJcnico TJcnico Aprendi% Aprendi%

5aB seis operadores relacionales en S+L@ B despuJs de introducirlos@ #eremos como usarlosC

Q R SQ R RQ Q

I-ual No i-ual L#er manual para m*s in/ormacinM )enor Iue )aBor Iue )enor o i-ual a )aBor o i-ual Iue

La cl*usula &'E%Ees usada para especi/icar Iue slo ciertas /ilas de la ta'la sean mostradas@ 'as*ndose en el criterio descrito en esta cl*usula 5E$E. Es m*s /*cil de entender #iendo un par de eAemplosC Si Iuieres #er el CodDempleado de aIuellos Iue ten-an un salario por encima de 7G.GGG@ usa la si-uiente e=presinC

SELECT Cod empleado FROM Tabla es$adis$ica empleados %&ERE Salario ' ())))! O'ser#a Iue el si-no Q LmaBor o i-ual IueM :a sido usado@ Ba Iue Iueremos #er listados Auntos aIuellos Iue -anen m*s de 7G.GGG o i-ual a 7G.GGG . Esto muestraC CodDempleado 999999999999999 G1G 1G7 17" "17 "22 La descripcin 5E$E Salario Q 7G.GGG@ es conocida como condicin. Lo mismo puede ser utili%ado para la columnas de tipo te=toC SELECT Cod empleado FROM Tabla es$adis$ica empleados %&ERE Car*o ' +Encar*ado+! Esto muestra la cdi-o de todos los encar-ados. 3eneralmente@ con las columnas de te=to@ usa i-ual o no i-ual a@ B comprue'a Iue el te=to Iue aparece en la condicin est* dentro de comillas simples.

()s Condiciones Co*$lejas+ Condiciones Co*$uestas

El operador AN? Aunta dos o m*s condiciones@ B muestra slo las /ilas Iue satis/acen TO?AS las condiciones listadas. Por eAemploC SELECT Cod empleado FROM Tabla es$adis$ica empleados %&ERE Salario ,)))) AND Car*o ' -T.cnico/ El operador O$ Aunta dos o m*s condiciones@ B de#uel#e una /ila si AL3UNA de las condiciones listadas en #erdadera. Para #er todos aIuellos Iue -anan menos de 2G.GGG o tienen menos de 1G.GGG en 'ene/icios listados Auntos@ usa la si-uiente consultaC

SELECT 0D EMPLEADO FROM TA1LA ESTAD0ST0CA EMPLEADOS %&ERE SALAR0O 2 ,)))) OR 1ENEF0C0OS 2 3))))! AN? & O$ pueden ser com'inadas@ por eAemploC SELECT 0D EMPLEADO FROM TA1LA ESTAD0ST0CA EMPLEADOS %&ERE CAR4O ' +Encar*ado+ AND SALAR0O 5)))) OR 1ENEF0C0OS 36)))! Primero@ S+L encuentra las /ilas donde el salario es maBor de 8G.GGG B la columna del car-o es i-ual a Encar-ado@ una #e% tomada esta nue#a lista de /ilas@ S+L 'uscar* si :aB otras /ilas Iue satis/a-an la condicin AN? pre#ia o la condicin Iue la columna de los Bene/icios sea maBor de 1".GGG. Consecuentemente@ S+L solo muestra esta se-unda nue#a lista de /ilas@ recordando Iue nadie con 'ene/icios so're 1".GGG ser* e=cluido Ba Iue el operador O$ incluBe una /ila si el resultado de al-una de las partes es .E$?A?E$O. ?ate cuenta Iue la operacin AN? se :a :ec:o primero. Para -enerali%ar este proceso@ S+L reali%a las operaciones AN? para determinar las /ilas donde las operaciones AN? se mantienen .E$?A?E$O LrecordarC todas las condiciones son #erdaderasM@ entonces estos resultados son usados para comparar con las condiciones O$@ B solo muestra aIuellas /ilas donde las condiciones unidas por el operador O$ se mantienen ciertas para al-una de las partes de la condicin.. Para reali%ar O$ antes de AN?@ p.e.@ si Iuisieras #er una lista de empleados -anando un -ran salario L7G.GGGM o con un -ran 'ene/icio L1G.GGGM@ B slo Iuieres Iue lo mire para los empleados con el car-o de Encar-ado@ usa parJntesisC SELECT 0D EMPLEADO FROM TA1LA ESTAD0ST0CA EMPLEADOS %&ERE CAR4O ' +Encar*ado+ AND 7SALAR0O ()))) OR 1ENEF0C0O 3))))8!

IN , E!&EEN

Un mJtodo /*cil de usar condiciones compuestas es usando IN o BET EEN. Por eAemplo si tu Iuieres listar todos los encar-ados B TJcnicoC SELECT 0D EMPLEADO FROM TA1LA ESTAD0ST0CA EMPLEADOS %&ERE CAR4O 0N 7+Encar*ado+, +T.cnico+8! O para listar aIuellos Iue -anen m*s o (G.GGG@ pero menos o i-ual Iue 7G.GGG@ usaC SELECT 0D EMPLEADO FROM TA1LA ESTAD0ST0CA EMPLEADOS %&ERE SALAR0O 1ET%EEN 9)))) AND ())))! Para listar todos los Iue no est*n en este ran-o@ intentaC SELECT 0D EMPLEADO FROM TA1LA ESTAD0ST0CA EMPLEADOS %&ERE SALAR0O NOT 1ET%EEN 9)))) AND ())))!

?e /orma similar@ NOT IN lista todas las /ilas e=cluBendo aIuellas de la lista IN.

-sando LI.E O'ser#a la Ta'laDestadisticaDempleados@ B di Iue Iuieres #er todas las personas en las cuales su apellido comience por OlOC@ intentaC SELECT 0D EMPLEADO %&ERE APELL0DOS L0:E +L;+! FROM TA1LA ESTAD0ST0CA EMPLEADOS El tanto por ciento LTM es usado para representar un posi'le car*cter Lsir#e como comodFnM@ Ba sea nUmero@ letra o puntuacin@ o para seleccionar todos los caracteres Iue puedan aparecer despuJs de OLO. Para encontrar las personas con el apellidos terminado en OLO@ usa VTLW@ o si Iuieres la VLW en medio de la pala'ra VTLTW. El VTW puede ser usado en lu-ar de cualIuier car*cter en la misma posicin relati#a a los caracteres dados. NOT LI!E muestra /ilas Iue no cumplen la descripcin dada. Otras posi'ilidades de uso de LI!E@ o cualIuiera de las condiciones anteriores son posi'les@ aunIue depende de IuJ ?B)S estJs usandoK lo m*s usual es consultar el manual@ o tu administrador de sistema so're la posi'ilidades del sistema@ o slo para estar se-uro de Iue lo Iue est*s intentando :acer es posi'le B correcto. Xste tipo de peculiaridades ser*n discutidas m*s adelante. Esta seccin slo pretende dar una idea de las posi'ilidades de consultas Iue pueden ser escritas en S+L.

CAP1TULO ". Uniones

-niones

En esta seccin@ slo estudiaremos las uniones de unin@ B interseccin@ Iue en -eneral son las m*s usadas. Un 'uen dise0o de una B? su-iere Iue cada lista de ta'la de datos sea considerada como una simple entidad@ B Iue la in/ormacin detallada puede ser o'tenida@ en una B? relacional@ usando ta'las adicionales B uniones. Primero considera los si-uientes eAemplos de ta'lasC

PropietariosDAnti-Yedades I?DPropietario G1 G" 17 "1 7G ApellidoPropietario Hones Smit: LaPson A>ins ,oPler Nom'rePropietario Bill Bo' Patricia Hane Sam

Pedidos I?DPropietario G" G" "1 17 ProductoPedido Ta'le Armario Silla EspeAo

Anti-Yedades I?D#endedor G1 G" 17 "1 7G G1 G" 17 G1 G" "1 7G Cla/es Primero@ #amos a estudiar el concepto de cla#es. Una cla/e $ri*aria es una columna o conAunto de columnas Iue identi/ican unF#ocamente el resto de datos en cualIuiera /ila. Por eAemplo@ en la ta'la PropietariosDAnti-Yedades@ la columna I?DPropietario identi/ica unF#ocamente esa /ila. Esto si-ni/ica dos cosasC dos /ilas no pueden tener el mismo I?DPropietario B@ aunIue dos propietarios tu#ieran el mismo nom're B apellidos@ la columna I?DPropietario #eri/ica Iue no ser*n con/undidos@ porIue la columna I?DPropietario podr* ser usada por el Administrador de la Base de ?atos L?B)SM para di/erenciarlos@ aunIue los nom'res sean los mismos. I?Dcomprador 7G 17 G" 7G G1 "1 "1 7G 17 "1 G" G1 Producto Cama Ta'le Silla EspeAo Armario Ca'inet Co/ee Ta'le Ca:air HePelrB Bo= PotterB Li'rerFa Plant Stand

Una cla/e ajena es una columna en una ta'la Iue es cla#e primaria en otra ta'la@ lo Iue si-ni/ica Iue cada dato en una columna con una cla#e aAena de'e de corresponder con datos@ en otra ta'la@ cuBa columna es cla#e primaria. En el len-uaAe ?B)S esta correspondencia es conocida como inte-ridad re/erencial. Por eAemplo@ en la ta'la Anti-Yedades@ tanto el I?Dcomprador como el I?D#endedor son cla#es aAenas de la cla#e primaria de la ta'la PropietariosDAnti-Yedades LI?DPropietarioK por supuesto@ se tiene Iue tener un propietario anti-uo antes de poder comprar o #ender cualIuier productoM@ por lo tanto@ en am'as ta'las@ las columnas I? son usadas para identi/icar los propietarios o compradores B #endedores@ B por lo tanto I?DPropietario es la cla#e primaria de la ta'la PropietariosDAnti-Yedades. En otras pala'ras@ todos estos datos OI?O son usados para re/erirse a los propietarios@ compradores@ o #endedores de anti-Yedades@ sin necesidad de usar sus nom'res reales.

Creando una -nin El propsito de estas cla#es es el poder re/erirse a datos de di/erentes ta'las@ sin tener Iue repetir los datos en cada una de ellas@ este es el poder de las 'ases de datos relacionales. Por eAemplo@ se pueden encontrar los nom'res de los Iue :an comprado una silla sin tener Iue listar el nom're completo de el comprador en la ta'la Anti-Yedades...puedes conse-uir el nom're relacionando aIuellos Iue compraron una silla con los nom'res en la ta'la de PropietariosDAnti-Yedades usando el I?DPropietario@ el cual relaciona los datos en las dos ta'las. Para encontrar los nom'res de aIuellos Iue compraron una silla@ usa la si-uiente consultaC SELECT APELL0DOPROP0ETAR0O, NOM1REPROP0ETAR0O FROM PROP0ETAR0OS ANT04<EDADES, ANT04<EDADES %&ERE 0D COMPRADOR ' 0D PROP0ETAR0O AND PROD=CTO ' +Silla+! ?ate cuenta de lo si-uiente so're la consulta... las ta'las in#olucradas en la relacin son listadas en la cl*usula ,$O) de la sentencia. En la cl*usula 5E$E@ primero o'ser#a Iue el P$O?UCTOQWSillaW restrin-e el listado a aIuellos Iue :an comprado una silla. Se-undo@ o'ser#a como las columnas I? son relacionadas de una ta'la a otra por el uso de la cl*usula I?DCO)P$A?O$QI?DP$OPIETA$IO. Slo cuando los I? coinciden B el o'Aeto comprado es una silla Lpor el AN?M@ los nom'res de la ta'la PropietariosDAnti-Yedades ser*n listados. ?e'ido a Iue la condicin de unin usada es el si-no i-ual@ esta unin se denomina interseccin. El resultado de esta consulta son dos nom'resC Smit:@ Bo' & ,oPler@ Sam. Para e#itar am'i-Yedades se puede poner el nom're de la ta'la antes del de la columna@ al-o comoC SELECT PROP0ETAR0OS ANT04<EDADES"APELL0DOPROP0ETAR0O, PROP0ETAR0OS ANT04<EDADES"NOM1REPROP0ETAR0O FROM PROP0ETAR0OS ANT04<EDADES, ANT04<EDADES %&ERE ANT04<EDADES"0D COMPRADOR ' PROP0ETAR0OS ANT04<EDADES"0D PROP0ETAR0O AND ANT04<EDADES"PROD=CTO ' +Silla+! Sin em'ar-o@ como los nom'res de las columnas en cada ta'la son di/erentes@ esto no es necesario.

DIS!INC! 0 Eli*inando Du$licados Consideremos Iue Iuieres #er los I? B los nom'res de toda aIuellas persona Iue :aBa #endido una anti-Yedad. O'#iamente@ Iuieres una lista donde cada #endedor sea listado una #e%@ B no Iuieres sa'er cu*ntos artFculos a #endido una persona@ solamente el nom're de las personas Iue :an #endido al-una anti-Yedad Lpara contar@ #er la seccin pr=ima ,unciones A-re-adasM. Esto si-ni/ica Iue necesitaras decir en S+L Iue Iuieres eliminar las /ilas de #endedores duplicadas@ B slo listar cada persona una #e%. Para :acer esto@ uso la pala'ra cla#e DIS!INC!.

Primero@ necesitaremos una interseccin para la ta'la de PropietariosDAnti-Yedades para conse-uir los datos detallados de las personas@ apellidos B nom're. Sin em'ar-o@ recuerda Iue la columna I?D#endedor de la ta'la Anti-Yedades es una cla#e aAena para la ta'la PropietariosDAnti-Yedades@ B por tanto@ un #endedor podrFa ser listado m*s de una #e%@ por cada producto de la ta'la Anti-Yedades@ listando el I? B sus datos@ como Iueremos eliminar mUltiples coincidencias del I?D#endedor en nuestra lista@ usaremos ?ISTINCT en la columna donde las repeticiones pueden ocurrir. Para complicarlo un poco m*s@ adem*s Iueremos la lista ordenada al/a'Jticamente por el Apellido@ despuJs por el Nom're@ B por Ultimo por su I?DPropietario. Para ello@ usaremos la clausula #%DE% 1. SELECT D0ST0NCT 0D >ENDEDOR, APELL0DOPROP0ETAR0O, NOM1REPROP0ETAR0O FROM ANT04<EDADES, PROP0ETAR0OS ANT04<EDADES %&ERE 0D >ENDEDOR ' 0D PROP0ETAR0O ORDER 1? APELL0DOPROP0ETAR0O, NOM1REPROP0ETAR0O, 0D PROP0ETAR0O! En este eAemplo@ o'tendremos un listado de todos los propietarios@ en orden al/a'Jtico por el Apellido. Para /uturas re/erencias LB si al-uien pre-untaM@ este tipo de uniones son consideradas en la cate-orFa de uniones interiores.

2lias , In3Su4consultas En esta seccin@ :a'laremos so're los Alias@ In B el uso de las su'consultas@ B como Jstas pueden ser usadas en un eAemplo con tres ta'las. Primero@ o'ser#a esta consulta Iue imprime el apellido de aIuellos propietarios Iue :an /ormulado un pedido B en IuJ consiste Jste@ solamente listando aIuellos cuBos pedidos pueden ser atendidos Lesto es@ :aB un #endedor Iue posee el producto pedidoM SELECT O%N"APELL0DOPROP0ETAR0O Apellido, ORD"PROD=CTOPED0DO Produc$o Pedido FROM PED0DOS ORD, PROP0ETAR0OS ANT04<EDADES O%N %&ERE ORD"0D PROP0ETAR0O ' O%N"0D PROP0ETAR0O AND ORD"PROD=CTOPED0DO 0N 7SELECT PROD=CTO FROM ANT04<EDADES8! Esto de#uel#eC Apellidos Producto Pedido 99999999999999999999999999999999 Smit: Ta'le Smit: Armario A>ins Silla LaPson EspeAo 5aB al-unas cosas a tener en cuenta so're esta consultaC 1. ". Primero@ el OApellidoO B el OProducto PedidoO en las lFneas Select de#uel#e los tFtulos en la salida. El O N & O$? son aliasK Jstos son dos nue#os nom'res para las dos ta'las listadas en la cl*usula ,$O) Iue son usado como pre/FAos para toda las notaciones con punto de los nom'res de las columnas en la consulta L#er arri'aM. Esto elimina am'i-Yedades@ especialmente en la cl*usula de interseccin 5E$E donde am'as ta'las tienen la columna I?DPropietario@ B la notacin con punto dice al S+L Iue estamos re/iriJndonos de dos di/erentes I?DPropietario de dos ta'las di/erentes.

(. 2.

O'ser#a Iue la ta'la de Pedidos est* utili%ada primero en la cl*usula ,$O)K esto ase-ura Iue el listado :ec:o 'as*ndose en esta ta'la@ B la ta'la AntiIuesOPners@ es solamente usado para la in/ormacin complementaria LapellidosM. )*s importante@ el AN? en la cl*usula 5E$E /uer%a en la su'consulta el ser in#ocada LOQAN4O or OQSO)EO@ son dos eIui#alente usos de INM. +uJ si-ni/ica esto@ la su'consulta se reali%a@ de#ol#iendo todos los productos Iue pertenecen a al-uien de la ta'la de Anti-Yedades@ como si no :u'iera la cl*usula 5E$E. AsF pues@ para Iue una /ila de la ta'la de Pedidos sea listada@ el ProductoPedido de'e de ser de#uelto en la lista de productos con propietario de la ta'la de Anti-Yedades@ Jsta lista un producto slo si el pedido puede ser cumplido por otro propietario. Puedes pensar Iue este es el caminoC la su'consulta de#uel#e un conAunto de productos los cuales son comparados con los de la ta'la PedidosK la condicin In es #erdadera slo si el producto deseado est* en el conAunto de#uelto de la ta'la Anti-Yedades. Adem*s@ date cuenta Iue este caso@ en el Iue :aB una anti-Yedad disponi'le para cada demanda@ o'#iamente no ser* siempre el caso. Adem*s@ o'ser#a Iue cuando IN@ OQAN4O@ o OQSO)EO es usada@ estas pala'ras cla#es se re/ieren a cualIuier posi'le /ila seleccionada@ no a columnas seleccionadas...esto es@ no puedes poner mUltiples columnas en una.

C25!-L# 3. (iscel)neo de Sentencias SQL


6unciones 2gregadas

.amos a #er cinco importantes /unciones a-re-adasC S-(@ 2V7@ (28 @ (IN B C#-N!. Son llamadas /unciones a-re-adas porIue resumen el resultado de una consulta.

SU) LM A.3 LM )A6 LM )IN LM

de#uel#e el total de todas las /ila@ satis/aciendo todas las condiciones de una columna dada@ cuando la columna dada es numJrica. de#uel#e la media de una columna dada. de#uel#e el maBor #alor de una columna dada. de#uel#e el menor #alor en una columna dada.

COUNTLZM de#uel#e el nUmero de /ilas Iue satis/acen las condiciones. .iendo las ta'las del principio del documento@ #eamos tres eAemplosC SELECT S=M7SALAR0O8, A>47SALAR0O8 FROM TA1LA ESTAD0ST0CA EMPLEADOS! Esta consulta muestra el total de todos los salarios de la ta'la@ B la media salarial de todas las entradas en la ta'la. SELECT M0N71ENEF0C0OS8 FROM TA1LA ESTAD0ST0CA EMPLEADOS %&ERE CAR4O ' +Encar*ado+! Esta consulta de#uel#e el menor #alor de la columan de 'ene/icios@ de los empleados Iue son )ana-ers@ la cual es 1".7GG. SELECT CO=NT7#8 FROM TA1LA ESTAD0ST0CA EMPLEADOS %&ERE CAR4O ' +T.cnico+!

Esta consulta nos dice cuantos empleados tienen la cate-orFa de TJcnico L(M.

Vistas

En S+L@ tu puedes Lcomprue'a tu ?BAM tener acceso a crear #istas por ti mismo. Lo Iue una #ista :ace es permitirte asi-nar resultados de una consulta a una ta'la nue#a B personal @ Iue puedes usar en otras consultas@ pudiendo utili%ar el nom're dado a la ta'la de tu #ista en la cl*usula ,$O). Cuando accedes a una #ista@ la consulta Iue est* de/inida en la sentencia Iue crea tu lista est* relacionada L-eneralmenteM@ B los resultados de esta consulta son como cualIuier otra ta'la en la consulta Iue escri'iste in#ocando tu #ista. Por eAemplo@ para crear una #istaC CREATE >0E% ANT>0E% AS SELECT PROD=CTOPED0DO FROM PED0DOS! A:ora@ escri'e una consulta usando esta #ista como ta'la@ donde la ta'la es una listado de todos los Productos Pedidos de la ta'la PedidosC SELECT 0D >ENDEDOR FROM ANT04<EDADES, ANT>0E% %&ERE PROD=CTOPED0DO ' PROD=CTO! Esta consulta muestra todos los I?D#endedor de la ta'la de Anti-Yedades donde el producto@ en esta ta'la@ aparece en la #ista Ant#ieP@ la cual no es m*s Iue todos los Productos ?esired de la ta'la Pedidos. El listado es -enerado Bendo uno por uno por los Productos Anti-Yos :asta donde :aB una coincidencia con la #ista Ant#ieP. Las #istas pueden ser usadas para restrin-ir el acceso a las 'ases de datos@ asF como para simpli/icar una consulta compleAa.

Creando nue/as ta4las Toda ta'la de una 'ase de datos de'e de ser creada al-una #e%... #eamos como :emos creado la ta'la de PedidosC CREATE TA1LE PED0DOS 70D PROP0ETAR0O 0NTE4ER NOT N=LL, PROD=CTOPED0DO C&AR7,)8 NOT N=LL8! Esta sentencia de#uel#e el nom're de la ta'la e in/orma a la ?B)S so're cada columna en la ta'la. O'ser#a Iue esta sentencia usa tipos de datos -enJricos@ B Iue los tipos de datos pueden ser di/erentes dependiendo del ?B)S Iue estes usando. Al-unos tipos de datos -enJricos sonC 9 C9ar(:) 9 Una columna de caracteres@ donde = es el nUmero m*=imo de caracteres permitido en la columna. 9 Integer [ Una columna de nUmeros enteros@ positi#os o ne-ati#os. 9 Deci*al(:; 0) [ Una columna de nUmeros decimales@ donde = es el nUmero m*=imo de di-itos del nUmero decimal en la columna e B el nUmero m*=imo de dF-itos despuJs del punto decimal. EAemploC L2@"MC EE.EE. 9 Date 9 Una columna /ec:a tiene un /ormato especial en cada ?B)S. 9 Logical [ Una columna Iue slo puede tomar dos #aloresC T$UE o ,ALSE L#erdadero o /alsoM. Otra nota@ NOT NULL si-ni/ica Iue la columna de'e tener un #alor en cada /ila. Si NULL es usado@ la columna podrFa tener un #alor #acio en una de sus /ilas.

(odi<icando !a4las .amos a a0adir una columna a la ta'la Anti-Yedades para permitir introducir el precio de un producto dadoC ALTER TA1LE ANT04<EDADES ADD 7PREC0O DEC0MAL7@,68 N=LL8! Los datos para esta nue#a columna pueden ser actuali%ados o insertados como se muestra a continuacin.

2=adiendo Datos

Para insertar /ilas en una ta'la@ :a% lo si-uienteC 0NSERT 0NTO ANT04<EDADES >AL=ES 763, )3, +O$$oman+, 6))"))8! Esto inserta los datos en la ta'la@ como una nue#a /ila@ columna por columna@ en el orden pre9de/inido. .eamos como modi/icar el orden B deAar el Precio en 'lancoC 0NSERT 0NTO ANT04<EDADES 70D COMPRADOR, 0D >ENDEDOR, PROD=CTO8 >AL=ES 7)3, 63, +O$$oman+8!

orrando datos .amos a 'orrar esta nue#a /ila de al 'ase de datosC DELETE FROM ANT04<EDADES %&ERE PROD=CTO ' +O$$oman+! Pero si :aB otra /ila Iue contiene VOttomanW@ esta /ila tam'iJn ser* 'orrada. Para di/erenciar la /ila de otra@ lo Iue :aremos ser* a0adir datosC DELETE FROM ANT04<EDADES %&ERE PROD=CTO ' +O$$oman+ AND 0D COMPRADOR ' )3 AND 0D >ENDEDOR ' 63!

2ctuali>ando Datos .amos a actuali%ar el Precio en una /ila Iue toda#Fa no tiene el precioC =PDATE ANT04<EDADES SET PREC0O ' ())")) %&ERE PROD=CTO ' +Silla+! Esto pone el precio de todas las sillas a 7GG.GG@ como en el caso anterior@ a0adiendo m*s condicionantes en la cl*usula 5E$E@ podemos especi/icar m*s aIuellas /ilas Iue Iueremos modi/icar.

C25!-L# ?. (iscel)neo de !$icos

ndices

Los Fndices permiten a ?B)S acceder a los datos m*s r*pidamente Lesto no ocurre en todos los sistemasM. El sistema crea esta estructura de datos interna Lel FndiceM con la cual se es posi'le seleccionar /ilas@ cuando la seleccin se 'asa en columnas inde=adas@ esto se :ace m*s r*pidamente. Este Fndice le dice a la ?B)S donde esta cierta /ila dando el #alor de una columna inde=ada@ como un li'ro@ cuBo Fndice te dice en Iue p*-inas aparece una cierta pala'ra. .amos a crear un Fndice por el I?DPropietario en la ta'la PropietariosDAnti-YedadesC CREATE 0NDEA O0D 0DA ON PROP0ETAR0OS ANT04<EDADES 70D PROP0ETAR0O8! A:ora en los nom'resC CREATE 0NDEA NAME 0DA ON PROP0ETAR0OS ANT04<EDADES 7APELL0DOPROP0ETAR0O, NOM1REPROP0ETAR0O8! Para 'orrar un Fndice@ utili%a la sentencia ?$OPC DROP 0NDEA O0D 0DA! AsF mismo@ tam'iJn puedes O'orrarO una ta'la L?$OP TABLE nom'reta'laM. En el se-undo eAemplo@ el Fndice se mantine en las dos columnas@ a-re-ado Aunto. Al-unos ?B)S no /uer%an la e=istencia de cla#es primariasK en otras pala'ra@ la unicidad de una columna no es /or%ada autom*ticamente. Lo Iue si-ni/ica Iue@ por eAemplo@ si intento insertar otra /ila dentro de la ta'la PropietariosDAnti-Yedades con el I?DPropietario de G"@ al-unos sistemas lo permitir*n :acer@ incluso@ si esta columna es la Unica de la ta'la Lcada /ila se supone Iue es di/erenteM. Una /orma de e#itar esto es crear un Unico Fndice en la columna Iue Iueramos Iue sea la cla#e primaria para /or%ar al sistema a pro:i'ir los duplicados. CREATE =N0B=E 0NDEA O0D 0DA ON PROP0ETAR0OS ANT04<EDADES 70D PROP0ETAR0O8!

7%#-5 1 , '2VIN7

Un uso especial de 3$OUP B4 es asociar una /uncin a-re-ada Lespecialmente COUNTM con -rupos de /ilas. Primero@ ima-ina Iue la ta'la Anti-Yedades tiene la columna Precio@ B Iue cada /ila tiene un #alor para esta columna. +ueremos #er el precio del producto m*s caro comprado por cada comprador. Tenemos Iue decirle a S+L Iue a-rupe cada tipo de compra@ B nos di-a la compra Iue ten-a el m*=imo precioC SELECT 0D COMPRADOR, MAA7PREC0O8 FROM ANT04<EDADES 4RO=P 1? 0D COMPRADOR! A:ora@ Iueremos decir Iue slo Iueremos #er la precio m*=imo de la compra si Jste es so're \1GGG@ asF Iue usamos la cl*usula 5A.IN3C SELECT 0D COMPRADOR, MAA7PREC0O8 FROM ANT04<EDADES 4RO=P 1? 0D COMPRADOR &A>0N4 PREC0O 3)))!

()s su4consultas

Otro uso comUn de las su'consultas in#olucra el uso de operadores para permitir a una condicin 5E$E incluir la salida de un Select de una su'consulta. Primero@ lista los compradores Iue compraron un producto caro Lel precio del producto es \1GG maBor Iue la media de precio de todos los productosMC SELECT 0D COMPRADOR FROM ANT04<EDADES %&ERE PREC0O 7SELECT A>47PREC0O8 C 3)) FROM ANT04<EDADES8! La su'consulta calcula la media del Precio m*s \1GG@ B usando esta /i-ura@ los I?DPropietario son impresos por cada producto Iue cuesta m*s. Se puede usar ?ISTINCT I?DP$OPIETA$IO@ para eliminar duplicados. Lista los apellidos de aIuellos de la ta'la AntiIueOPner@ S]LO si :an comprado un productoC SELECT APELL0DOPROP0ETAR0O FROM PROP0ETAR0OS ANT04<EDADES %&ERE 0D PROP0ETAR0O 0N 7SELECT D0ST0NCT 0D COMPRADOR FROM ANT04<EDADES8! La su'consulta de#uel#e la lista de compradores@ B el apellido es impreso para un AntiIue OPner si B slo si el I?DPropietario aparece en la lista de la su'consulta Ltam'iJn llamada lista de candidatosM. NotaC en al-unas ?B)S@ el i-ual puede ser usado de la misma /orma Iue IN@ aunIue@ por pre#isin@ IN es una meAor eleccin. Para un eAemplo de actuali%acin@ nosotros sa'emos Iue el :om're Iue compr la li'rerFa tiene el Nom're eIui#ocado en la 'ase de datos@ Jste de'erFa ser Ho:nC =PDATE PROP0ETAR0OS ANT04<EDADES SET NOM1REPROP0ETAR0O ' +DoEn+ %&ERE 0D PROP0ETAR0O ' 7SELECT 0D COMPRADOR FROM ANT04<EDADES %&ERE PROD=CTO ' +LibrerFa+8! Primero@ la su'consulta encuentra el I?Dcomprador de la personaLsM Iue compr la li'rerFa@ despuJs la consulta de salida actuali%a el apellido. $ecuerda esta re-la so're las su'consultasC cuando tienes una su'consulta como parte de una condicin 5E$E@ la cl*usula Selec en la su'consulta tiene Iue tener columnas Iue concuerden en nUmero B tipo con aIuellas Iue /ormen parte de la condicin 5E$E de la su'consulta. En otras pala'ras@ si tienes O 5E$E ColumnName Q LSELECT...MKO@ Select de'e de tener slo una columna en ella@ para coincidir con la salida en la cl*usula :ere@ B estas de'er*n de coincidir en tipo

E8IS!S , 2LL

E6ISTS usa una su'consulta como condicin@ donde la condicin es #erdadera si la su'consulta de#uel#e al-una /ila@ B /alsa si la su'consulta no de#uel#e nin-una /ilaK esta es una caracterFstica no intuiti#a con slo al-unos usos. Sin em'ar-o@ si un empleado Iuiere #er la lista de OPners slo si :aB sillas disponi'les@ intentaC

SELECT NOM1REPROP0ETAR0O, APELL0DOPROP0ETAR0O FROM PROP0ETAR0OS ANT04<EDADES %&ERE EA0STS 7SELECT # FROM ANT04<EDADES %&ERE PROD=CTO ' +Silla+8! Si :aB al-una silla en la columna Anti-Yedades@ la su'consulta de#ol#er* una o #arias /ilas@ :aciendo la cl*usula E6ISTS #erdadera@ :aciendo Iue S+L liste los AntiIue OPners. Si no :a :a'ido sillas@ nin-una /ila ser* de#uelta por la su'consulta. ALL es otra construccin poco usual @ como las consultas ALL pueden ser usadas con di/erentes B simples mJtodos@ #eamos un eAemplo de consultaC SELECT 0D COMPRADOR, PROD=CTO FROM ANT04<EDADES %&ERE PREC0O ' ALL 7SELECT PREC0O FROM ANT04<EDADES8! Esto de#ol#er* el precio de producto m*s alto Lo m*s de un producto si :aB un empateM@ B su comprador. La su'consulta de#uel#e una lista de todos los precios de la ta'la Anti-Yedades@ B la consulta de salida #a /ila por /ila de la ta'la Anti-Yedades B si el precio es maBor o i-ual a todos Lo ALLM precios en la lista@ es listado@ dando el precio del producto m*s caro. La ra%n de OQO es Iue el maBor precio en la lista puede ser i-ual al de la lista@ Ba Iue este producto est* en la lista de precios.

-NI#N , -niones de salida 5aB ocasiones donde puedes Iuerer #er los resultados de mUltiples consultas a la #e% com'inando sus salidasK usa UNION. Por eAemplo@ si Iueremos #er todos los I?DCO)P$A?O$ de la ta'la de Anti-Yedades Aunto con los I?DP$OPIETA$IO de la ta'la de PE?I?OS@ usaremosC SELECT 0D COMPRADOR FROM ANT04<EDADES =N0ON SELECT 0D PROP0ETAR0O FROM PED0DOS! S+L reIuiere Iue la lista de Select Lde columnasM coincida@ columna por columna@ en el tipo de datos. En este caso I?Dcomprador B I?DPropietario son del mismo tipo Linte-erM. Adem*s@ S+L elimina autom*ticamente los duplicados cuando se usa UNION Lcomo si ellos /uera dos OconAuntosOMK en las consultas simples@ tienes Iue usar ?ISTINCT. La unin de salida es usada cuando una consulta de unin est* OunidaO con /ilas no incluidas en la unin@ B son especialmente Utiles si las O/la-sO son incluidas. Primero o'ser#a la consultaC SELECT 0D PROP0ETAR0O, +is in bo$E Pedidos G An$i*Hedades+ FROM PED0DOS, ANT04<EDADES %&ERE 0D PROP0ETAR0O ' 0D COMPRADOR =N0ON SELECT 0D COMPRADOR, +is in An$i*Hedades onlI+ FROM ANT04<EDADES %&ERE 0D COMPRADOR NOT 0N 7SELECT 0D PROP0ETAR0O FROM PED0DOS8!

Esta consulta :ace una unin para listar todos los propietarios Iue est*n en am'as ta'las@ B pone una lFnea etiIueta despuJs de I? repitiendo la cita. La UNION une esta lista con al si-uiente lista. La se-unda lista es -enerada primero listando aIuellos I? Iue no est*n en la ta'la Pedidos@ -enerando una lista de I? e=cluidos de la consulta de unin. Entonces@ cada /ila en la ta'la Anti-Yedades es escaneada@ B si el I?Dcomprador no est* en esta lista de e=clusin@ es listado con su cita etiIueta. ?e'e :a'er un modo m*s sencillo de :acer esta lista@ pero es di/Fcil -enerar la in/ormati#a cita de te=to. Este concepto es muB Util en situaciones donde la cla#e primaria est* relacionada con una cla#e aAena@ pero el #alor de la cla#e aAena para al-unas cla#es primarias es NULL. Por eAemplo@ en una ta'la@ la cla#e primaria es #endedor@ B en otra ta'la es clientes@ con el nom're de los #endedores en la misma /ila. Sin em'ar-o@ si un #endedor no tiene clientes@ el nom're de esta persona no aparecer* en la ta'la de clientes. La unin de salida es usada si el listado de todos los #endedores #a :a ser impreso@ Aunto con sus clientes@ aunIue el #endedor no estJ en la ta'la de clientes@ pero est* en la ta'la de #endedores. En otro caso@ el #endedor ser* listado con cada cliente.

CAP1TULO 7. S+L E)BEBI?O


SQL e*4e4ido Un /eo eAemplo Lno escri'as un pro-rama como este ...esto es slo con propsitos educati#osM &Z 9 Para #erlo@ aIuF tienes un pro-rama eAemplo Iue usa S+L em'e'ido. S+L em'e'ido permite a los pro-ramadores conectar con una 'ase de datos e incluir cdi-o S+L en su pro-rama@ B poder usar@ manipular B procesar datos de la 'ase de datos.. 9 Este eAemplo de pro-rama en C Lusando S+L em'e'idoM imprimir* un in/orme. 9 Este pro-rama de'er* ser precompilado para las sentencias S+L@ antes de la compilacin normal. 9 Las partes E6EC S+L son las mismas Lest*ndarM@ pero el cdi-o C restante de'er* ser cam'iado@ incluBendo la declaracin de #aria'les si est*s usando un len-uaAe di/erente. 9S+L em'e'ido cam'ia de sistema a sistema@ asF Iue@ una #e% m*s@ comprue'a la documentacin@ especialmente la declaracin de #aria'les B procedimientos@ en donde las consideraciones del ?B)S B el sistema operati#o son cruciales. Z& &Z ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ& &Z ESTE P$O3$A)A NO ES CO)PILABLE O EHECUTABLE Z& &Z SU P$OPOSITO ES S]LO ?E SE.I$ ?E EHE)PLO Z& &ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ& ^include Rstdio.:_ &Z Esta seccin declara las #aria'les locales@ estas de'er*n ser las #aria'les Iue tu pro-rama use@ pero tam'iJn las #aria'les S+L podr*n ser utili%adas para tomar o dar #alores Z& E6EC S+L BE3IN ?ECLA$E SECTIONK int I?DcompradorK c:ar Nom're`1GGa@ Apellidos`1GGa@ Producto`1GGaK E6EC S+L EN? ?ECLA$E SECTIONK &Z Esto incluBe la #aria'le S+LCA @ aIuF puede :a'er al-Un error si se compilase. Z& E6EC S+L INCLU?E S+LCAK mainLM b &Z Este es un posi'le camino para conectarse con la 'ase de datos Z& E6EC S+L CONNECT UserI?&PassPordK

&Z Este cdi-o in/orma si est*s conectado a la 'ase de datos o si :a :a'ido al-Un error durante la cone=inZ& i/LsIlca.sIlcodeM b print/LPrinter@ OError conectando al ser#idor de la 'ase de datos.cnOMK e=itLMK d print/LOConectado al ser#idor de la 'ase de datos.cnOMK &Z Esto declara un OCursorO. Xste es usado cuando una consulta de#uel#e m*s de una /ila@ B una operacin #a a ser reali%ada en cada /ila resultante de la consulta. Con cada /ila esta'lecida por esta consulta@ lo usare en el in/orme. ?espuJs O,etc:O ser* usado para sacar cada /ila@ una a una@ pero para la consulta Iue est* actualmente eAecutada@ se usar* el estamento OOpenO. El O?eclareO simplemente esta'lece la consulta.Z& E6EC S+L ?ECLA$E ProductoCursor CU$SO$ ,O$ SELECT P$O?UCTO@ I?DCO)P$A?O$ ,$O) ANTI3eE?A?ES O$?E$ B4 P$O?UCTOK E6EC S+L OPEN ProductoCursorK &Z f99 PodrFas desear poner un 'loIue de c:eIueo de errores aIuF. 99f Z& &Z ,etc: pone los #alores de la Osi-uienteO /ila de la consulta en las #aria'les locales@ respecti#amente. Sin em'ar-o@ un Oprimin- /etc:O Ltecnica de pro-ramacinM de'e ser :ec:a antes. Cuando el cursor est* /uera de los datos@ un cdi-o S+L de'e de ser -enerado para permitirnos salir del 'ucle. Para simpli/icar@ el 'ucle ser* deAado cuando ocurra cualIuier cdi-o S+L@ incluso si es una cdi-o de error. ?e otra manera@ un cdi-o de c:eIueo especF/ico de'erFa de ser preparadoZ& E6EC S+L ,ETC5 ProductoCursor INTO CProducto@ CI?DcompradorK P:ileLSsIlca.sIlcodeM b &Z Con cada /ila@ adem*s :acemos un par de cosas. Primero@ aumentamos el precio \7 L:onorarios por tramitacionesM B e=traemos el nom're del comprador para ponerlo en el in/orme. Para :acer esto@ usaremos Update B Select@ antes de imprimir la lFnea en la pantalla. La actuacli%acin@ sin em'ar-o@ asume Iue un comprador dado slo :a comprado uno de todos los productos dados@ o sino@ el precio ser* incrementado demasiadas #eces. Por otra parte@ una O,ilaI?O podrFa :a'er sido utili%ada L#er documentacinM. Adem*s o'ser#a los dos puntos antes de los nom'res de las #aria'les locales cuando son usada dentro de sentencias de S+L.Z& E6EC S+L UP?ATE ANTI3eE?A?ES SET P$ECIO Q P$ECIO f 7 5E$E P$O?UCTO Q CProducto AN? I?DCO)P$A?O$ Q CI?DcompradorK E6EC S+L SELECT NO)B$EP$OPIETA$IO@ APELLI?OP$OPIETA$IO INTO CNom're@ CApellidos ,$O) P$OPIETA$IOSDANTI3eE?A?ES 5E$E I?DCO)P$A?O$ Q CI?DcompradorK print/LOT"7s T"7s T"7sO@ Nom're@ Apellidos@ ProductoMK &Z ,eo in/orme9 slo para propositos de eAemploS. .eamos la si-uiente /ila Z& E6EC S+L ,ETC5 ProductoCursor INTO CProducto@ CI?DcompradorK d &Z Cierra el cursor@ entre-a los cam'ios L#er de'aAoM@ B sale del pro-rama Z&

E6EC S+L CLOSE ProductoCursorK E6EC S+L CO))IT $ELEASEK e=itLMK d

CAP1TULO 8. Cuestiones Comunes & Tpicos A#an%ados


Por qu no puede preguntar simplemente por las tres primeras filas de la tabla @ PorIue en las 'ases de datos relacionales@ las /ilas son insertadas en un orden particular@ esto es@ el sistema las inserta en un orden ar'itrarioK asF@ Iue slo puedes pedir /ilas usando un #*lida construccin S+L@ como O$?E$ B4@ etc. Qu es eso de DDL y DML?. ??L L?ata ?e/inition Lan-ua-eM se re/iere a Len S+LM a la sentencia de creacin de ta'la... ?)L L?ata )anipulation Lan-ua-eM se re/iere a las sentencia Select@ Update@ Insert B ?elete. No son las tablas de las bases de datos como ficheros? Bueno@ el ?B)S almacena los datos en /ic:eros declarados por los administrados del sistema antes de Iue nue#as ta'las son creadas Len -randes sistemasM@ pero el sistema almacena los datos en un /ormato especial@ B puede diseminar los datos de una ta'la so're muc:os arc:i#os. En el mundo de la 'ase de datos@ un conAunto de arc:i#os creados por la 'ase de datos es llamado Ota'lespaceO. En -eneral@ en peIue0os sistemas@ todos lo relacionado con una 'ase de datos Lde/iniciones B todo los datos de la ta'laM son -uardados en un arc:i#o. S n las tablas de datos como ho!as diseminadas? No@ por dos ra%ones. Primeras@ las :oAas diseminadas pueden tener datos en una celda@ pero una celda es m*s Iue una simple interseccin de /ila9columna. ?ependiendo del so/tPare de diseminacin de :oAas@ una celda puede contener /ormulas B /ormatos@ los cuales no pueden ser tenidos por una ta'la de una 'ase de datos. Se-undo@ las celdas diseminadas son usualmente dependientes de datos en otras celdas. En las 'ases de datos@ las celdas son independientes@ e=cepto Iue las columnas estJn l-icamente relacionadas Lpor suerte@ una /ila de columnas@ descri'e@ en conAunto@ una entidadM@ B@ cada /ila en una ta'la es independiente del resto de /ilas. " mo puedo importar un archi#o te$to de datos dentro de una base de datos? Bueno@ no puedes :acerlo directamente... de'es usar una utilidad@ como OOracleWs S+LZLoaderO@ o escri'ir un pro-rama para car-ar los datos en la 'ase de datos. Un pro-rama para :acerlo simplemente irFa de re-istro en re-istro de un arc:i#o te=to@ di#idiJndolo en columnas@ B :aciendo un Insert dentro de la 'ase de datos. Qu es un esquema? Un esIuema es un conAunto l-ico de ta'las@ como la 'ase de datos Anti-Yedades arri'a... usualmente@ se piensa en Jl simplemente como Ola 'ase de datosO@ pero una 'ase de datos puede contener m*s de un esIuema. Por eAemplo@ un esIuema estrella est* compuesto de ta'las@ donde una -ran B central ta'la tiene toda la in/ormacin importante@ con la Iue se accede@ #Fa cla#es aAenas@ a ta'las dimensionales@ las cuales tienen in/ormacin de detalle@ B pueden ser usadas en una unin para crear in/ormes detallados. %ay alg&n filtro en general que puede usar para hacer mis consultas SQL y bases de datos me!ores y m's r'pidas (optimi)adas*? Puedes intentar@ si puedes@ e#itar e=presiones en Selects@ tales como SELECT ColumnaA f Columna B@ etc. La consulta optimi%ada de la 'ase de datos@ la porcin de la ?B)S Iue determina el meAor camino para conse-uir los datos deseados /uera de la 'ase de datos@ tiene e=presiones de tal /orma Iue puede reIuerir m*s tiempo recuperar los datos Iue si las columnas /ueran seleccionadas de /orma normal@ B las e=presiones se maneAaran $rogra*)tica*ente. Si estas usando una unin@ trata de tener las columnas unidas por Fndices Ldesde am'as ta'lasM. Cuando ten-as dudas@ Fndice. A no ser Iue ten-as mUltiples cuentas o consultas compleAas@ usa COUNTLZM Lel nUmero de /ilas -eneradas por la consultaM meAor Iue COUNTLNom'reDColumnaM.

Qu es normali)aci n? Normali%acin es una tJcnica de dise0o de 'ases de datos Iue su-iere un cierto criterio en la construccin del dise0o de una ta'la Ldecidir Iue columnas tendr* cada ta'la@ B creando la

estructura de cla#esM@ donde la idea es eliminar la redundancia de los datos no9cla#es entre ta'las. Normali%acin se re/iere usualmente a condiciones de /orma@ B slo introducirJ las tres primeras@ aunIue es usual el uso de otras m*s a#an%adas@ como la cuarta@ Iuinta@ BoBce9Codd...M La 5ri*era 6or*a Nor*al se re/iere a mo#er los datos en di/erentes ta'las donde los datos de cada ta'la son de tipo similar@ dando a cada ta'la una cla#e primaria. Poner los datos en la Segunda 6or*a Nor*al se re/iere a remo#er a otras ta'las datos Iue slo dependen de parte de la cla#e. Por eAemplo@ si :u'iera deAado los nom'res de anti-uos propietarios en la ta'la de productos@ esta no estar* en la Se-unda ,orma Normal@ porIue los datos ser*n redundantesK el nom're ser* repetido para cada producto del Iue se sea propietarioK teniendo en cuenta Iue los nom'res est*n almacenados en su propia ta'la. Los nom're en si mismos no tienen nada Iue :acer con los productos@ slo las identidades de los compradores B #endedores. La !ercera 6or*a Nor*al in#olucra des:acerse de todo aIuello de las ta'las Iue no dependa solamente de la cla#e primaria. Solo incluBe in/ormacin Iue es dependiente de la cla#e@ B mue#e a otras ta'las Iue son independientes de la cla#e primaria@ B crea cla#es primarias para las nue#as ta'las.

5aB al-una redundancia en cada /orma@ B si los datos est*n en la (,N @ tam'iJn lo estar*n en la 1,N B en la ",N@ B si lo est*n en la ",N@ tam'iJn lo estar*n en la 1,N. En tJrminos de dise0o de datos@ almacenar los datos@ de tal manera@ Iue cualIuier columna no9cla#e primaria estJ en dependencia slo de la entera cla#e primaria. Si o'ser#as el eAemplo de 'ase de datos@ #er*s Iue la Unica /orma de na#e-ar atra#Js de la 'ase de datos es utili%ando uniones usando columnas cla#e. Otros dos importantes puntos en una 'ase de datos es usar 'uenos@ consistentes@ l-icos@ B enteros nom'res para las ta'las B las columnas@ B usar nom'res completos en la 'ase de datos tam'iJn. En el Ultimo punto@ mi 'ase de datos es /alta de nom'res@ asF Iue uso cdi-os numJricos para la identi/icacin. Es@ usualmente@ meAor@ si es posi'le@ tener cla#es Iue@ por si misma@ sea e=pliIuen@ por eAemplo@ a cla#e meAor puede ser las primeras cuatro letras del apellido B la primera inicial del propietario@ como HONEB por Bill Hones Lo para e#itar redundancias@ a0adir un nUmero@ HONEB1@ HONEB" ...M.

"u'l es la diferencia entre una simple consulta de fila y una m&ltiple consulta de filas y por qu es importante conocer la diferencia? Primero@ para cu'rir lo o'#io@ una consulta de una slo /ila es una consulta Iue slo de#uel#e una /ila como resultado@ B una consulta de mUltiples /ilas es una consulta Iue de#uel#e m*s de una /ila como resultado. Si una consulta de#uel#a una /ila o m*s esto depende enteramente del dise0o Lo esIuemaM de las ta'las de la 'ase de datos. Como escritor de consultas@ de'es conocer el esIuema@ estar se-uro de incluir todas las condiciones@ B estructurar tu sentencia S+L apropiadamente@ de /orma Iue consi-as el resultado deseado LaunIue sea una o mUltiples /ilasM. Por eAemplo@ si Iuieres estar se-uro Iue una consulta de la ta'la PropietariosDAnti-Yedades de#uel#e slo una /ila@ considera una condicin de i-ualdad de la columna de la cla#e primaria@ I?DPropietario. Tres ra%ones #ienen inmediatamente a la mente de por IuJ esto es importante. Primero@ tener mUltiples /ilas cuando tU slo espera'as una@ o #ice#ersa@ puede si-ni/icar Iue la consulta es errnea@ Iue la 'ase de datos est* incompleta@ o simplemente@ :as aprendido al-o nue#o so're tus datos. Se-undo@ se est*s usando una sentencia Update o ?elete@ de'es de estar se-uro Iue la sentencia Iue est*s escri'iendo #a a :acer la operacin en la /ila Lo /ilasM Iue tU Iuieres... o sino@ estar*s 'orrando o actuali%ando m*s /ilas de las Iue IuerFas. Tercero@ cualIuier consulta escrita en S+L em'e'ido de'e necesitar ser construida para completar el pro-rama l-ico reIuerido. Si su consulta@ por otra parte@ de#uel#e mUltiples /ilas@ de'er*s usar la sentencia ,etc:@ B muB pro'a'lemente@ al-Un tipo de estructura de 'ucle para el procesamiento iterati#o de las /ilas de#ueltas por la consulta. Qu hay de las relaciones? Otra cuestin de dise0o... el tJrmino OrelacionesO usualmente se re/iere a las relaciones entre cla#es aAenas B primarias entre ta'las. Este concepto es importante porIue cuando las ta'las de una 'ase de datos relacional es dise0ada@ estas relaciones de'e de ser de/inidas porIue determinan Iue columnas son o no cla#es primarias o cla#es aAenas. ?e'es de :a'er oido al-o so're el ?ia-rama de Entidad9$elacin@ Iue es una #ista -r*/ica de las ta'las en el esIuema de una 'ase de datos@ con lFneas conectando columnas relacionadas entre ta'las. )ira el dia-rama en el /inal de esta seccin o

al-unos de los sitios de'aAo relacionados con Jste tpico@ Ba Iue :aB di/erentes maneras de di'uAar dia-ramas de E9$. Pero primero@ #eamos cada tipo de relacin ... Una relacin -no"a"-no si-ni/ica Iue tu tienes una columna cla#e primaria Iue est* relacionada con una columna cla#e aAena@ B Iue para cada #alor de la cla#e primaria@ :aB un #alor de cla#e aAena. Por eAemplo@ en el primer eAemplo@ la EmploBeeAddressTa'le@ nosotros a0adimos una columna I?DE)PLEA?O. Entonces@ la EmploBeeAddressTa'le est* relacionada con la Ta'laDestadisticaDempleados Lse-undo eAemplo de ta'laM por medio de este I?DE)PLEA?O. EspecF/icamente@ cada empleado en la EmploBeeAddressTa'le tiene estadFsticas Lun /ila de datosM en la Ta'laDestadisticaDempleados. Incluso@ piensa Iue este es un eAemplo e/ectuado@ es una relacin de O191O. Adem*s@ ten en cuenta@ el OtieneO en /uerte... cuando se e=presa una relacin@ es importante descri'ir la relacin con un #er'o. Las otras dos tipos de relaciones pueden o no puede usar cla#es primarias l-icas B cla#es aAenas necesariamente... esto es estrictamente una llamada del sistema. La primera de Jstas es la relacin Uno9a9)uc:os LO19)OM. Esto si-ni/ica Iue para cada #alor de la columna en una ta'la@ :aB uno o m*s #alores relaciones en otra ta'la. 5a'r* Iue a0adir de /orma necesaria cla#es en el dise0o o@ posi'lemente@ al-Un tipo de columna identi/icador de'er* ser usado para esta'lecer la relacin. Un eAemplo podrFa ser Iue para todos I?DPropietario en la ta'la PropietariosDAnti-Yedades@ :u'ier*n uno o mas Lcero tam'iJn pude serM productos comprados en la ta'la Anti-Yedades L#er'oC comprarM. ,inalmente@ la relacin de (uc9os"a"(uc9os LO)9)OM -eneralmente no in#olucra cla#es@ B usualmente in#olucra columnas identi/icati#as. La inusual ocurrencia de un O)9)O si-ni/ica Iue una columna en una ta'la est* relacionada con otra columna en otra ta'la@ B para cada #alor de uno de estas dos columnas@ :aB uno o m*s #alores relacionados en la correspondiente columna en la otra ta'la LB #ice#ersaM@ o m*s comUnmente posi'le@ dos ta'las tienen una relacin O19)O para cada una Ldos relaciones@ una 19) para cada caminoM. Un LmaloM eAemplo o Jsta m*s comUn situacin podrFa ser si tu#ieras una 'ase de datos Iue asi-nara tra'aAo@ donde una ta'la tu#iera una /ila por cada empleado B tra'aAo asi-nado@ B otra ta'la tu#iera una /ila por tra'aAo por cada uno de los tra'aAadores asi-nados. AIuF@ podrFas tener mUltiples /ilas por cada empleado en la primera ta'la@ o pro cada tra'aAo asi-nado@ B mUltiples /ilas por cada tra'aAo en la se-unda ta'la@ una por empleado asi-nado al proBecto. Estas ta'las tienen un )9)C cada empleado en la primera ta'la puede tener tantos tra'aAos asi-nados de la se-unda ta'la como tra'aAos :aBa en ella@ B cada tra'aAo puede tener tanto empleados como empleados :aBa en la primera ta'la. Esto es la punta del ice'er- en este tpico... mira los lin>s a'aAo para m*s in/ormacin B mira en dia-rama de de'aAo para un eAemplo simpli/icado de un dia-rama de E9$.

Qu hay de algunas construcciones no est'ndar importantes de SQL (pregunta e$tremadamente com&n*? Bueno@ #eamos la si-uiente seccin...

CAP1TULO ;. S+L no est*ndar

IN!E%SEC! B)INUS son como la sentencia UNION@ e=cepto Iue INTE$SECT produce /ilas Iue apareces en am'as consultas@ B )INUS produce /ilas Iue resultan de la primera consulta@ pero no de la se-unda. 3eneracin de construcciones de in/ormeC la cl*usula C#(5-!E es puesta al /inal de una consulta para poner el resultado en una /uncin a-re-ada al /inal del listado@ como CO)PUTE SU)LP$ECIOMK Otra opcin es usar el brea, l-icoC de/inir un brea, para di#idir un resultado de una consulta dentro de -rupos 'asados en una columna@ como %E2. ON I?DCO)P$A?O$. Entonces@ para producir un resultado despuJs de listar un -rupo@ usa CO)PUTE SU) O, P$ECIO ON I?DCO)P$A?O$. Si@ por eAemplo@ usas las tres cl*usulas Auntas LB$EA! primero@ CO)PUTE despuJs del B$EA!@ B CO)PUTE so're todo M@ o'tendr*s un in/orme Iue a-rupe los productos por su I?Dcomprador@ listando la suma de Precios despuJs de cada -rupo de productos de un I?Dcomprador@ B @ despuJs Iue todos los -rupos sean listados@ la suma de todos los Precios listados@ todos con ca'eceras B lFneas -enerados por S+L. Adem*s@ al-unos ?B)S permiten usar m*s /unciones en listas Select@ e=cepto Iue estas /unciones Lal-unas /unciones de car*cter permite resultados de mUltiples /ilasM #aBan a ser usadas con un #alor indi#idual Lno -ruposM@ en consultas de simples /ilas. Las /unciones de'en ser usada slo con tipos de datos apropiados. AIuF :aB al-unas /unciones )atem*ticasC 6unciones nu*Aricas+

2 S(8) CEIL(8) 6L##%(8) 7%E2!ES!(8;1) LE2S!(8;1) (#D(8;1) 5#&E%(8;1) %#-ND(8;1) SI7N(8) SQ%!(8)

.alor a'soluto. Con#ierte nUmero ne-ati#os en positi#os@ o deAa slo nUmeros positi#os. 6 es un #alor decimal Iue ser* redondeado :acia arri'a. 6 es un #alor decimal Iue ser* redondeado :acia a'aAo. ?e#uel#e el m*s -rande de los dos #alores. ?e#uel#e el m*s peIue0o de los dos #alores. ?e#uel#e el resto de 6&4. ?e#uel#e 6 ele#ado a 4 $edondea 6 a 4 lu-ares decimales. Si se omite 4@ 6 se redondea al entero m*s pr=imo. ?e#uel#e menos si 6RG@ sino un m*s. ?e#uel#e la rai% cuadrada de 6. 6unciones de Caracteres

LE6!(Bstring;8) %I7'!(Bstring;8) -55E%(Bstring) L#&E%(Bstring) INI!C25(Bstring) LEN7!'(Bstring) BstringCCBstring L52D(Bstring;8;DED)

?e#uel#e los 6 caracteres m*s a la i%Iuierda de la cadena. ?e#uel#e los 6 caracteres m*s a la derec:a de la cadena. Con#ierte la cadena a maBUsculas. Con#ierte la cadena a minUsculas. Con#ierte el primer car*cter de la cadena a maBUscula. ?e#uel#e el nUmero de car*cteres de cadena. Concatena dos cadenas de te=to. $ellena la cadena por la i%Iuierda con el Z Lo el car*cter Iue :aBa entre las comillasM@ para :acer la

cadena 6 caracteres m*s lar-a. %52D(Bstring;8;DED) S- S!%(Bstring;8;1) NVL(Bcolu*n;B/alue) $ellena la cadena por la derec:a con el Z Lo con el car*cter Iue :aBa entre las comillasM@ para :acer la cadena 6 caracteres m*s lar-a. E=trae 4 letras de la cadena comen%ando en la posicin 6. CualIuier Null de la Rcolumn ser* sustituido por lo Iue :aBa en R#alue. Si el #alor de la columna no el NULL@ N.L no tiene e/ecto

CAP1TULO <. $esumen de Sinta=is & Lin>s importantes


%esu*en de Sinta:is.

Slo para usuarios a#an%ados.

AIuF est*n las /ormas -enerales de las sentencias Iue :emos #isto en este tutorial@ adem*s de al-uno in/ormacin e=tra de al-unas. $ECUE$?A Iue todos estas sentencias pueden o no pueden estar disponi'les en tu sistema@ asF Iue comprue'a la documentacin del mismo. ALTER TA1LE 2TA1LE NAME ADDJDROPJMOD0F? 7COL=MN SPEC0F0CAT0ONKSL"""ver Crea$e Table8! Te permite a0adir@ 'orrar o modi/icar una columna o columnas de la ta'la@ o cam'iar la especi/icacin Ltipo de datos@ etcM de una columna e=istenteK esta sentencia tam'iJn es usada para las especi/icaciones /Fsicas de la ta'la Lcomo est* almacenada@ etc.M@ pero estas de/iniciones estas especi/icadas en el ?B)S@ asF Iue lJete la documentacin. Tam'iJn@ estas especi/icaciones /Fsicas son usada con la sentencia Create Ta'le@ cuando una ta'la es creada por primera #e%. Adem*s@ solo una opcin puede ser reali%ada por la sentencia Alter Ta'le en una simple sentenciaC add@ drop o modi/icar. CO))ITK 5ace cam'ios :ec:os por al-Un sistema permanente de 'ase de datos Ldesde el Ultimo CO))ITK conocido por transaccinM

CREATE K=N0B=EL 0NDEA 20NDEA NAME ON 2TA1LE NAME 72COL=MN L0ST8! 99UNI+UE es opcionalK entre corc:etes. CREATE TA1LE 2TA1LE NAME 72COL=MN NAME 2DATA T?PE K72S0ME8L 2COL=MN CONSTRA0NT, ...otras columnasK Ltam'iJn #alido con ALTE$ TABLEM 99donde SIgE slo se utili%a en determinados tipos@ B CONST$AIN incluBe las si-uientes posi'ilidades L/or%ado autom*tico por la ?B)SK causas de /allos B -eneracin de erroresMC 1.N-LL o N#! N-LL L#er arri'aM ".-NIQ-E /uer%a Iue dos /ilas no puedan tener el mismo #alor para esa columna. (.5%I(2%1 .E1 le dice a la 'ase de datos Iue la columna es la columna cla#e primaria Lslo usado si la cla#e primaria es slo un columna@ sino@ la sentencia P$I)A$4 !E4Lcolumna@ columna@...M aparece despuJs de la de/inicin de la Ultima columnaM 2.C'EC. permite Iue se comprue'a una condicin cuando un dato es esa columna es actuali%ado o insertadoK por eAemplo@ C&EC:7PREC0O )8@ :ace Iue el sistema comprue'e Iue el precio de la columna es maBor de cero antes de aceptar el #alor... al-unas #eces implementado como sentencia C#NS!%2IN!. 7.DE62-L! inserta el #alor por de/ecto en la 'ase de datos si una /ila es insertada sin insertar nin-Un dato en la columnaK por eAemploC 1ENEF0C0OS 0NTE4ER DEFA=LT'3))))!

8.6#%EI7N .E1 :ace lo mismo Iue la cla#e primaria@ pero es se-uida porCC REFERENCES 2TA1LE NAME 72COL=MN NAME8, Iue :acen re/erencia a la cla#e primaria relacionada.

CREATE >0E% 2TA1LE NAME AS 2B=ER?! DELETE FROM 2TA1LE NAME %&ERE 2COND0T0ON! 0NSERT 0NTO 2TA1LE NAME K72COL=MN L0ST8L >AL=ES 72>AL=E L0ST8! %#LL 2C.F ""des:ace los cam'ios en la 'ase de datos Iue :allas :ec:o desde el Ultimo Commit... cuidadoS Al-unos so/tPare usan autom*ticamente CommitWs en sistemas Iue usan construcciones de transaccin@ asF Iue el comando $ollBac> podrFa no ir. SELECT KD0ST0NCTJALLL 2L0STA DE COL=MNAS, F=NCT0ONES, CONSTANTES, ETC" FROM 2L0STA DE TA1LAS OR >0STAS K%&ERE 2COND0C0ON7S8L K4RO=P 1? 24RO=P0N4 COL=MN7S8L K&A>0N4 2COND0T0ONL KORDER 1? 2ORDER0N4 COL=MN7S8 KASCJDESCLL! 99donde ASCh?ESC permite ordenas en orden ASCendente o ?ESCendente =PDATE 2TA1LE NAME SET 2COL=MN NAME ' 2>AL=E K%&ERE 2COND0T0ONL! 9 si no se completa la cl*usula acuerdo con la sentencia SET.

:ere@ todas las /ilas ser*n actuali%adas de

LinGs I*$ortantes Computin- & S+L&?B Lin>sC Netscape 99 Oracle 99 SB'ase 99 In/ormi= 99)icroso/t S+L $e/erence Pa-e 99 As> t:e S+L Pro 99 S+L ProNs $elational ?B Use/ul Sites Pro-rammerNs Source 99 ?B)S Sites 99 inIuirB.com 99 ?B In-redients e' Aut:orin- 99 Computin- ?ictionarB 99 ?B)S La'&Lin>s 99 S+L ,A+ 99 +uerB List $IT ?ata'ase ?esi-n Pa-e 99 ?ata'ase Hump Site 99 Pro-rammin- Tutorials on t:e e' ?B Stu// 99 ?B)S&IS Pa-es 99 Access on t:e e' 99 Online Boo>s 99 A 3ood ?B Course Tutorial Pa-e 99 ?B)S )a-a%ine 99 ?ata'ase )inin)iscellaneousC CNN 99 USA TodaB 99 Pat:/inder 99 g?Net 99 CNet 99 Tec: e' 99 Loo>Smart BuscadoresCC 4a:oo 99 Alta .ista 99 E=cite 99 e'CraPler 99 LBcos 99 In/osee> 99 searc:.com

2gradeci*ientos.
Espero Iue :aBas aprendido al-o m*s de esta introduccin a uno de los len-uaAes m*s importantes B Iue m*s pre#alece en el mundo de la computacin cliente9ser#idor. Escri'F esta p*-ina Pe' para contri'uir con al-o de #alor a la Pe' B a la comunidad de la Pe'. ?e :ec:o@ :e sido in/ormado Iue este documento esta siendo usado en al-unos cole-ios para su uso en clases de 'ases de datos B por in#esti-adores. Adem*s@ Iuiero a-radecer a todo el mundo de los cinco continentes Iue :an contactado conmi-o a-radeciJndome esta p*-ina Pe'.

Espero continuar a0adiendo m*s material a este tutorial@ al-o como tpicos so're dise0o de 'ases de datos B e=tensiones S+L est*ndar@ incluso deseo estar aleAado de material so're Sistemas de Administracin de Bases de datos indi#iduales. Buena suerte en tu S+L B otras a#enturas computacionales. +im %offman Comentarios o su-erenciasi Escri'idme a A:o//manjone.net. Si IuerJis m*s in/ormacin so're mi podJis mirar mi p*-ina e'@ o mi nue#o Al-orit:ms Tutorial.

Tam'iJn podJis ec:ar un #ista%o a mi p*-ina Him 5o//manNs e' Pa-es para m*s in/ormacin so're mi@ o mi nue#o Al-orit:ms Tutorial. Si IuerJis tam'iJn podJis 'aAaros una #ersin modi/icada del tutorialC P?, #ersion o/ t:e tutorial L12">M LcourtesB o/ )att !ellB at PPP.:i-:cro/t.comM. Muchas ,raciasConse-uid el Lector Acro'at de Ado'e para documentos P?, en t:e Ado'e Pe' site. CopBri-:t 1EE891EE<@ Hames 5o//man. Este documento puede ser usado de /orma -ratuita por cualIuier usuario de Internet@ pero no puede ser incluido en otro documento@ pu'licado en cualIuier otra /orma de nin-Un modo. Esta p*-ina se #e meAor con Netscape Na#i-atorK no se #e demasiado 'ien con )icroso/t Internet E=plorer.

CopBri-:t 1EE891EE<@ Hames 5o//man. Traducido porC 3erm*n Lpe% .alencia@ 1;9791EE<K Last updatedC 79191EE<K .ersin ori-inalC :ttpC&&P(.one.net&kA:o//man&sIltut.:tm

También podría gustarte