Sunteți pe pagina 1din 19

2013

Gabriel Bentos Pereira Eguren

[SQL]
Este documento pretende ser una gua complementaria para el aprendizaje de SQL, mediante la utilizacin de la herramienta SQLI E! "omplementario a las diapositi#as $ue se encuentran en el sitio de aulas!ort!edu!u% del curso de Base de &atos ' de la (ni#ersidad )* !

SQL + (ni#ersidad )* , Gabriel Bentos Pereira Eguren

Contents
&escarga % ejecucin de SQLI E! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! G(I. '! Primeros Pasos! "reando tablas, consulta, insertado % borrado de datos! !!!!!!!!!!!!!!!!!!!!! / "reando una tabla !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! / Insercin de &atos!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! / "onsulta de datos insertados! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 0 "lausula &istinct !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 0 "lausula 12E*E! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 3 Borrado de datos!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 4 G(I. -! )peradores de conjuntos! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 4 *enombramientos!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 5 (nin !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 5 &i6erencia !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 7 Interseccin !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 7 "onser#ar las tuplas repetidas !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 7 Gua /! I8 % E9IS S!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : I8 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : 8) I8 % el dilema de los 8(LL! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! '; E9IS S % 8) E9I S!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 'G(I. 0! "ociente! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! '/ G(I. 3! <unciones .gregadas! ")(8 , S(=, =.9, =I8 % .>G !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! '0 ")(8 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! '0 S(= !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! '0 =.9 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! '0 =I8 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! '0 .>G!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! '0 G(I. 4! Group b%! 2a#ing!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! '3 Group b% !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! '3 2a#ing!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! '3 G(I. 5! Insert! &elete, (pdate, .lias! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! '4 I8SE* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! '4 &ELE E !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! '4 (P&. E !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! '4 .LI.S!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! '4 '

SQL + (ni#ersidad )* , Gabriel Bentos Pereira Eguren G(I. 7! "la#es primarias % e?ternas! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! '5

Descarga y ejecucin de SQLITE.


SQLite es una base de datos de dominio p@blico % escrita en "! Siendo *ichard 2ipp su autor! En la Aeb httpBCCAAA!s$lite!orgCdoAnload!html pueden encontrarse los archi#os $ue necesitamos para su 6uncionamiento! En caso de utilizar 1indoAs, descargamos el siguiente archi#oB

&escomprimimos el archi#o s$lite/!e?e! Luego abrimos una lnea de comandos DinicioCejecutarCcmdE % nos dirigimos a la carpeta donde se encuentra el archi#o! En la lnea de comandos escribimos s$lite/ seguido del nombre de la base $ue deseamosB

F %a estamos listos para comenzar las prGcticas!

SQL + (ni#ersidad )* , Gabriel Bentos Pereira Eguren

GUI 1. !ri"eros !asos. Creando ta#$as% consu$ta% insertado y #orrado de datos.


Creando una ta#$a
Para crear tablas se utiliza el comando "*E. E, especi6icando los atributos, sus dominios % cla#es! CREATE TABLE Ciudad (idCiudad INT, nombre VARCHAR(20), numeroCiudad INT) "rearG una tabla de nombre H"iudadI con / atributos! (n Hid"iudadI de dominio los enteros DI8 E, un atributo de nombre HnombreI de dominio las palabras compuestas por -; caracteres % un Hnumero"iudadI de dominio los enteros! 8otaB SQLI E es 6le?ible con los dominios, es decir podremos ingresar una cadena de te?to ma%or $ue -; en el nombre % no nos darG error! 8o sucede lo mismo en =%SQLB

8otaB SQLite no maneja cla#es 6orGneas! Por lo $ue recomendamos consultar espec6icamente para su sistema de base de datos las respecti#as instrucciones para de6inir cla#es 6orGneas % primarias! .l 6inal de la gua se hace re6erencia al manejo de cla#es 6orGneas % primarias con =%SQL! )b#iamente no podemos crear una nue#a tabla de igual nombre, de hacerlo tendremos el siguiente errorB

Insercin de Datos.
Para realizar la insercin de datos a una tabla creada pre#iamente es necesario utilizar el I8SE* , probemos los siguientes comandosB

SQL + (ni#ersidad )* , Gabriel Bentos Pereira Eguren in!er" in"o #iudad (idCiudad, nombre, numeroCiudad) $a%ue!(&,'(on"e$ideo',&&) in!er" in"o #iudad (idCiudad, nombre, numeroCiudad) $a%ue!(2,'Ro#)a',22) in!er" in"o #iudad (idCiudad, nombre, numeroCiudad) $a%ue!(*,'Co%onia',**) in!er" in"o #iudad (idCiudad, nombre, numeroCiudad) $a%ue!(+,'Carme%o',++) in!er" in"o #iudad (idCiudad, nombre, numeroCiudad) $a%ue!(,,'-iria-o%i!',,,) in!er" in"o #iudad (idCiudad, numeroCiudad) $a%ue!(.,//) 8otar $ue la @ltima de las instrucciones no posee el #alor nombre! Esto es posible por$ue el nombre puede ser nulo, sal#o $ue se diga lo contrario o sea cla#e! Luego de ello, #ol#emos a insertar la @ltima lneaB in!er" in"o #iudad (idCiudad, numeroCiudad) $a%ue!(.,//)

Consu$ta de datos insertados.


Luego de insertar nuestros primeros datos, comenzaremos por consultar los mismos! Luego de la palabra SELE" le especi6icaremos los atributos $ue deseamos $ue se muestren, utilizando el J le especi6icamos $ue deseamos $ue muestre la totalidad de los mismos! SELECT 0 1R2( #iudad &ando como resultadoB

8otar $ue se muestran datos repetidos!

C$ausu$a Distinct
Si no $ueremos #er los datos repetidos agregamos la opcin distinctB SELE" &IS I8" J <*)= ciudadK

Esto puede ser mu% @til a la hora de $uerer contar tuplas di6erentes! .hora deseamos consultar @nicamente los nombres de ciudad!

SQL + (ni#ersidad )* , Gabriel Bentos Pereira Eguren SELECT nombre 1R2( #iudad

8otar $ue nos muestra @nicamente los nombres de las ciudades con - espacios en blanco! "omprobaremos $ue dentro de esos espacios blancos estGn los #alores nulos! Para ello especi6icamos $ue deseamos #er la palabra 8(LL en los #alores nulosB 3nu%%$a%ue N4LL 8otaB El comando !null#alue es propio % aplicable @nicamente a SQLI E! >ol#emos a ejecutar la consulta % obtenemos el siguiente resultadoB

8o necesariamente tiene $ue mostrar un atributo de la tabla, ejemploB SELECT & 5rom #iudad

) podemos realizar operaciones con el resultadoB Se%e#" numero#iudad 6&00 5rom #iudad

C$ausu$a &'E(E.
Podemos condicionar nuestra b@s$ueda a una condicin lgica!

SQL + (ni#ersidad )* , Gabriel Bentos Pereira Eguren HQuiero obtener los nombres de las ciudades $ue tengan un identi6icador menor a /!I SELECT nombre 1R2( #iudad 7HERE id#iudad8*

)orrado de datos.
.hora deseamos borrar los datos de las ciudad cu%o identi6icar sea 4! 9e%e"e 5rom #iudad :)ere id#iudad;.

GUI 2. *+eradores de conjuntos.


En esta seccin #eremos los operadores para realizar la unin, interseccin % di6erencia de conjuntos! ener en cuenta $ue los operadores sobre conjuntos deben aplicarse cuando los conjuntos son compatibles! ambiLn tener en cuenta $ue los resultados eliminan las tuplas repetidas! Para esta seccin, ademGs de las tablas $ue han $uedado de la primera gua, ejecutamos las siguientes instruccionesB CREATE TABLE A<en#ia (idA<en#ia INT, nombre VARCHAR(20), numeroCiudad INT) in!er" in"o A<en#ia (idA<en#ia, nombre, numeroCiudad) $a%ue!(&,'A<en#ia (on"e$ideo',&&) in!er" in"o A<en#ia (idA<en#ia, nombre, numeroCiudad) $a%ue!(2,'A<en#ia Ro#)a',22) in!er" in"o A<en#ia (idA<en#ia, nombre, numeroCiudad) $a%ue!(*,'A<en#ia Co%onia',**) in!er" in"o A<en#ia (idA<en#ia, nombre, numeroCiudad) $a%ue!(+,'A<en#ia Carme%o',++) in!er" in"o A<en#ia (idA<en#ia, nombre, numeroCiudad) $a%ue!(,,'A<en#ia =iria-o%i!',,,) &ando como resultado

SQL + (ni#ersidad )* , Gabriel Bentos Pereira Eguren

(eno"#ra"ientos
Es posible renombrar las relaciones a la hora de realizar operaciones $ue in#olucren tablas con nombres compartidos, de 6orma de no generar ambigMedad! Ejemplo, SELECT nombre 1R2( a<en#ia , #iudad :)ere a<en#ia3ida<en#ia;#iudad3id#iudad &a como resultadoB

Para e#itar la ambigMedad %a $ue no se sabe si nombre pertenece a la tabla .gencia o a la tabla "iudad! SerG necesario renombrar las relacionesB SELECT a3nombre 1R2( a<en#ia a, #iudad b :)ere a3ida<en#ia;b3id#iudad

Unin
=ediante SELECT nombre 1R2( a<en#ia 4NI2N SELECT nombre 1R2( #iudad )btenemos la unin de estos dos conjuntos, por un lado el conjunto resultante de seleccionar los nombres de la tabla agencia % por otro el resultante de seleccionar los nombres de la ciudad!

8otar $ue para esta unin 6ue necesario $ue ambos resultados sean compatibles, de no ser as nos da error, como el siguiente ejemploB SELECT 0 1R2( a<en#ia 4NI2N SELECT nombre 1R2( #iudad

SQL + (ni#ersidad )* , Gabriel Bentos Pereira Eguren

Di,erencia
.l igual $ue la unin los grupos dentro de la di6erencia deben ser compatibles en cuanto a su dominio! Se utiliza el comando E9"EP DSQL Ser#er, SQLI EE, e$ui#alente a =I8(S D=%s$l, )racleE! SELECT nombre 1R2( a<en#ia E>CE=T SELECT nombre 1R2( #iudad )bteniendo el siguiente resultadoB

Interseccin
Para realizar la interseccin tambiLn deben ser compatibles! Se utiliza el comando I8 E*SE" SELECT nombre 1R2( a<en#ia INTERSECT SELECT nombre 1R2( #iudad )btenemos de lo anterior el conjunto #aco! Es por ello $ue agregamos el siguiente e?presin in!er" in"o A<en#ia (idA<en#ia, nombre, numeroCiudad) $a%ue!(?,'(on"e$ideo',,,) F luego #ol#emos a ejecutar SELECT nombre 1R2( a<en#ia INTERSECT SELECT nombre 1R2( #iudad )bteniendo el siguiente resultadoB

Conser-ar $as tu+$as re+etidas


Si deseamos e#itar la consecuencia de obtener resultados sin tuplas repetidas, deberemos utilizar el comando .LL! Para ello #ol#emos a insertar =onte#ideo dentro de agenciaB in!er" in"o A<en#ia (idA<en#ia, nombre, numeroCiudad) $a%ue!(?,'(on"e$ideo',,,) % luego aplicamos la consulta con % sin el .LLB SELECT nombre 1R2( a<en#ia 4NI2N SELECT nombre 1R2( #iudad SELECT nombre 1R2( a<en#ia 4NI2N ALL SELECT nombre 1R2( #iudad

SQL + (ni#ersidad )* , Gabriel Bentos Pereira Eguren

8tese $ue aparece / #eces, por$ue estaba en la interseccin Den ambas tablasE % por$ue la agregamos una #ez mGs en agencia, es decir - #eces en agencia % ' #ez en ciudad!

Gu.a 3. I/ y E0ISTS.
I/
.l utilizar el I8 debemos de pensar en conjuntos, $ueremos saber cuGles elementos de nuestra consulta estGn dentro de un conjunto particular! Para ello creamos una nue#a base de datos en s$lite, mediante el comando Hs$lite/ nue#abaseI Dpor mas in6o #er gua 'E CREATE TABLE 2-erario (id2-erario INT, nombre VARCHAR(20)) CREATE TABLE Condu#"or (idCondu#"or INT, nombre VARCHAR(20)) "reamos las tablas $ue representan a los operarios % a los conductores, a@n no haremos hincapiL en las cla#es! Ingresamos los siguientes datosB in!er" in"o 2-erario (id2-erario, nombre) $a%ue!(&,@Ao!e@) in!er" in"o 2-erario (id2-erario, nombre) $a%ue!(2,@Buan@) in!er" in"o 2-erario (id2-erario, nombre) $a%ue!(*,@(ar"in@) in!er" in"o 2-erario (id2-erario, nombre) $a%ue!(+,@(anue%@) in!er" in"o 2-erario (id2-erario, nombre) $a%ue!(,,@Hora#io@) in!er" in"o 2-erario (id2-erario, nombre) $a%ue!(.,@Lu#a!@) in!er" in"o 2-erario (id2-erario, nombre) $a%ue!(/,@Ni#o%a!@) in!er" in"o 2-erario (id2-erario, nombre) $a%ue!(?,@9ie<o@) Luego nos $uedamos con los operarios $ue estLn dentro del grupo constituido por las cadenas NjoseO % la cadena NmartinO!

SQL + (ni#ersidad )* , Gabriel Bentos Pereira Eguren SELECT 0 1R2( o-erario 7HERE nombre IN (CAo!e@,@mar"in@) *esultado B

Esto se debe a $ue no es lo mismo NmartinO $ue N=artinO % $ue el @nico $ue integra los dos grupos Del del resultado del SELE" % el especi6icadoE es NjoseO! .hora ingresemos los siguientes datos de conductoresB in!er" in"o Condu#"or (idCondu#"or, nombre) $a%ue!(&,@Ao!e@) in!er" in"o Condu#"or (idCondu#"or, nombre) $a%ue!(2,@Buan@) in!er" in"o Condu#"or (idCondu#"or, nombre) $a%ue!(*,@9anie%@) in!er" in"o Condu#"or (idCondu#"or, nombre) $a%ue!(+,@9ario@) in!er" in"o Condu#"or (idCondu#"or, nombre) $a%ue!(,,@Ba$ier@)

Buscamos en el lado derecho del I8 el resultado de una consulta sobre conductores! Es decir saber los operarios $ue son conductoresB SELECT 0 1R2( o-erario 7HERE nombre IN (SELECT nombre 1R2( #ondu#"or) *esultadoB

/*T I/ y e$ di$e"a de $os /ULL.


Fa comprobamos como la anterior instruccin nos de#ol#a a$uellos operarios $ue sean conductores Djose % PuanE, ahora buscamos saber los operarios $ue no son conductores, para ello utilizamos el 8) I8B SELECT 0 1R2( o-erario 7HERE nombre N2T IN (SELECT nombre 5rom #ondu#"or)

El resultado es el esperado, las tuplas pertenecientes a operario $ue no estGn dentro de conductor! Pero probemos de agregar la siguiente instruccinB in!er" in"o Condu#"or (idCondu#"or) $a%ue!(.) F de repetir las anteriores consultasB

';

SQL + (ni#ersidad )* , Gabriel Bentos Pereira Eguren SELECT 0 1R2( o-erario 7HERE nombre IN (SELECT nombre 5rom #ondu#"or) SELECT 0 1R2( o-erario 7HERE nombre N2T IN (SELECT nombre 5rom #ondu#"or) )btenemos el siguiente resultadoB

QR Podemos obser#ar perplejos $ue la segunda #ez aplicada la consulta de 8) I8Dluego de insertar el #alor con nombre nuloE nos da un resultado nulo! F ejecutemos lo siguienteB

.mbas nos dan #acoS!Qpor $uLR Esto sucede as por la lgica ternaria, en la cual e?isten tres #alores de #erdad! El #erdadero, el 6also % el desconocido!

DE?trado de 1iTipedia!orgE

&ebemos considerar el 8(LL como un indicador de ausencia de #alor! F realmente no se puede comparar #alor con algo $ue carece de #alor! .nalicemos mGs detalladamente lo $ue sucedeB "uando realizamos SELECT CEn#on"re a Ao!e@ 7HERE CAo!e@ IN (SELECT nombre 5rom #ondu#"or) ''

SQL + (ni#ersidad )* , Gabriel Bentos Pereira Eguren 8os dice acertadamente $ue encontr a jose dentro de conductor! .hora probemos con alguien $ue no estG dentro de conductor, Njuan albertoO SELECT CEn#on"re Buan A%ber"o@ 7HERE CBuan A%ber"o@ IN (SELECT nombre 5rom #ondu#"or) .certadamente nos muestra $ue no ha encontrado a Puan .lberto dentro de la tabla conductor! Pero SELECT CNo en#on"re Buan A%ber"o@ 7HERE CBuan A%ber"o@ N2T IN (SELECT nombre 5rom #ondu#"or) 8os da algo e$ui#ocado, %a $ue al de#ol#er #aco muestra $ue Puan .lberto estG dentro de la tabla conductor, algo $ue %a conocemos errneo! Esto sucede por$ue el 8) I8 realiza comparacin #alor a #alor, obteniendo lo siguienteB SELECT CNo en#on"re Buan A%ber"o@ 7HERE CBuan A%ber"o@ 8D @Ao!e@AN9 CBuan A%ber"o@ 8D @Buan@AN9 CBuan A%ber"o@ 8D @9anie%@ AN9 CBuan A%ber"o@ 8D @9ario@ AN9 CBuan A%ber"o@ 8D @Ba$ier@AN9 CBuan A%ber"o@ 8D N4LL &onde todas las condiciones son #erdaderas sal#o la @ltima! La ultima CBuan A%ber"o@ 8D N4LL es desconocida, % eso signi6ica $ue no es true, por lo $ue la e?presin total no serG #erdadera! Es por ello $ue debemos de tener especial cuidado al utilizar el 8) I8 de e?istir la posibilidad de #alores nulos, es por ello recomendable la utilizacin del 8) E9IS S para estos casos!

E0ISTS y /*T E0ITS.


Permite obtener las tuplas $ue #eri6ican cierta condicin! &onde el E9IS S #eri6ica $ue si la consulta interna arroja alguna 6ila, se ejecuta la consulta e?terna! Ejemplo, encontremos los operarios $ue son conductores a la #ezB SELECT 0 1R2( o-erario o 7HERE E>ISTS (SELECT 0 1R2( #ondu#"or # 7HERE #3nombre;o3nombre)

.plicando ahora su #ersin con 8) E9IS S, obtenemos los operarios $ue no son conductoresB SELECT 0 1R2( o-erario o 7HERE N2T E>ISTS (SELECT 0 1R2( #ondu#"or # 7HERE #3nombre;o3nombre)

'-

SQL + (ni#ersidad )* , Gabriel Bentos Pereira Eguren

8otar $ue lo anterior no lo podemos hacer con un 8) I8 por$ue lo $ue sucede con los #alores nulos! Lo anterior es cla#e para concluir $ue I8 % E9IS S no son lo mismo!

GUI 1. Cociente.
.greguemos una nue#a tabla $ue represente las marcas de #ehculos % sus conductoresB

CREATE TABLE mar#a (id(ar#a INT, mar#a VARCHAR(20)) in!er" in"o mar#a (id(ar#a , mar#a) $a%ue!(&,'Ci"roen') in!er" in"o mar#a (id(ar#a , mar#a) $a%ue!(2, '1ia"') in!er" in"o mar#a (id(ar#a , mar#a) $a%ue!(*,'C)e$ro%e"') in!er" in"o mar#a (id(ar#a , mar#a) $a%ue!(+, 'EIA')

CREATE TABLE #ondu#e ( mar#a VARCHAR(20), nombreCondu#"or VARCHAR(20)) in!er" in"o #ondu#e (mar#a, nombreCondu#"or) $a%ue!('Ci"roen', '(ar"in') in!er" in"o #ondu#e (mar#a, nombreCondu#"or) $a%ue!( '1ia"', '9ie<o') in!er" in"o #ondu#e (mar#a, nombreCondu#"or) $a%ue!('C)e$ro%e"', '9ario') in!er" in"o #ondu#e (mar#a, nombreCondu#"or) $a%ue!( 'EIA', '(ar"in') in!er" in"o #ondu#e (mar#a, nombreCondu#"or) $a%ue!( '1ia"', 'Ao!e') in!er" in"o #ondu#e ( mar#a, nombreCondu#"or) $a%ue!('Ci"roen', 'Ao!e') in!er" in"o #ondu#e ( mar#a, nombreCondu#"or) $a%ue!( 'EIA', 'Ao!e') in!er" in"o #ondu#e ( mar#a, nombreCondu#"or) $a%ue!( 'C)e$ro%e"', 'Ao!e') F tratemos de encontrar el conductor $ue conduce todas las marcas, es decir juan! Para ello debemos de razonar de la siguiente maneraB H&ame todos los conductores donde no e?ista una marca $ue ese conductor no ha%a conducidoI Esto implica $ue inter#ienen / tablas, la de conductor, la de marca % la de conduce! SELECT 0 1R2( #ondu#"or # 7HERE N2T E>ISTS(SELECT 0 1R2( mar#a m 7HERE N2T E>ISTS( SELECT 0 1R2( #ondu#e u 7HERE #3nombre;u3nombre#ondu#"or AN9 u3mar#a;m3mar#a))

'/

SQL + (ni#ersidad )* , Gabriel Bentos Pereira Eguren ratemos de desmenuzar esta compleja e?presinB SELECT 0 1R2( #ondu#"or # 7HERE N2T E>ISTS (SELECT 0 1R2( mar#a m 7HERE N2T E>ISTS( SELECT 0 1R2( #ondu#e u 7HERE #3nombre;u3nombre#ondu#"or AN9 u3mar#a;m3mar#a)) 8otemos como inter#ienen / tablas, donde ha% una HPuenteI DconduceE $ue une condiciones de las otras dos Dmarca % conductorE! 8otemos tambiLn $ue la condicin 6inal del ultimo 12E*E es la condicin $ue $ueremos obtener! Es decir es $ue Hconduzca ese auto de esa marcaI! Es decir, es una condicin al $ue le 6ueron aplicadas dos #eces el 8) E9IS S, % algo $ue Hno e?ista $ue no e?istaI e$ui#ale a decir H$ue e?istaI!

GUI 2. 3unciones gregadas. C*U/T% SU4% 4 0% 4I/ y 5G


C*U/T
Permite de#ol#er el n@mero de tuplas o de #alores especi6icados al realizar la consulta!

SU4
Permite de#ol#er la suma del #alor de un atributo!

4 0
Permite de#ol#er el mG?imo #alor de un atributo!

4I/
Permite de#ol#er el mnimo #alor de un atributo!

5G
Permite de#ol#er el promedio de un atributo! Para ello creamos CREATE TABLE Sue%do (mon"o INT, nombre VARCHAR(20)) in!er" in"o Sue%do (mon"o in!er" in"o Sue%do (mon"o in!er" in"o Sue%do (mon"o in!er" in"o Sue%do (mon"o in!er" in"o Sue%do (mon"o % ejecutamosB SELECT C24NT(mon"o), S4((mon"o),(A>(mon"o),(IN(mon"o),AVF(mon"o) 1R2( Sue%do &ando como resultado lo siguienteK '0 , nombre) $a%ue!(&0000,@Ao!e@) , nombre) $a%ue!(20000,@Buan@) , nombre) $a%ue!(*0000,@9anie%@) , nombre) $a%ue!(+0000,@9ario@) , nombre) $a%ue!(,0000,@Ba$ier@)

SQL + (ni#ersidad )* , Gabriel Bentos Pereira Eguren

GUI 6. Grou+ #y. 'a-ing.


Grou+ #y
8os permite aplicar 6unciones agregadas a subgrupos de tuplas de una relacin! (n ejemplo puede ser el de obtener cuantos conductores e?isten para cada marca de autoB SELECT mar#a, C24NT(mar#a) 1R2( #ondu#e <rou- bG mar#a

'a-ing
2.>I8G nos permite especi6icar una condicin aplicada al agrupamiento! "omencemos agregando a la tabla Sueldo nue#os sueldos para Puan DPuan agradecidoE! in!er" in"o Sue%do (mon"o , nombre) $a%ue!(20000,@Buan@) in!er" in"o Sue%do (mon"o , nombre) $a%ue!(20000,@Buan@) Podemos acceder a las personas % la sumatoria de sus sueldosB SELECT S4((mon"o), nombre 1R2( !ue%do FR24= BH nombre F si ademGs deseamos $uedarnos con $uienes en total cobran mGs de /;;;;B SELECT S4((mon"o), nombre 1R2( !ue%do FR24= BH nombre HAVINF !um(mon"o)D*0000

ambiLn podramos $uerer saber, a modo de poder aplicar cuestiones impositi#as DPuan no estarG tan contento ahoraE la totalidad de lo $ue cobran $uienes tienen mGs de dos trabajos! SELECT S4((mon"o), nombre 1R2( !ue%do FR24= BH nombre HAVINF C24NT(mon"o)D2

'3

SQL + (ni#ersidad )* , Gabriel Bentos Pereira Eguren

GUI 7. Insert. De$ete% U+date% $ias.


I/SE(T
. lo largo de las di6erentes guas hemos #isto di6erentes ejemplos donde utilizGbamos el I8SE* !

DELETE
El &ELE E se utiliza con una condicin! Ejemplo, borremos los sueldos de Puan ! &ELE E <*)= sueldo 12E*E nombreUOPuanOK

U!D TE
El (P&. E permite actualizar los #alores de las tuplas! Ejemplo, buscamos aumentar el sueldo a jose en 3;;;! 4=9ATE !ue%do SET mon"o ; mon"o 6 ,000 :)ere nombre;@Ao!e@

LI S
Los alias nos permiten hacer mGs prolijos los resultados! Queremos encontrar los nombres % sus respecti#os sueldos, % buscamos $ue los nombres re6ieran a N)perarioO % los montos a NSueldo Li$uidoO! Ejecutando lo siguiente Den m%s$lE SELECT nombre C2-erario@, mon"o CSue%do LiIuido@ 1R2( !ue%do FR24= BH nombre )btenemosB

'4

SQL + (ni#ersidad )* , Gabriel Bentos Pereira Eguren

GUI 8. C$a-es +ri"arias y e9ternas.


Esta gua la realizaremos en =FSQL, debido a $ue el SQLI E no maneja cla#es 6orGneas en algunas de sus #ersiones! "omencemos creando la tabla cliente con una cla#e primaria id"liente, para ello debemos de agregar HP*I=.*F VEFI e indicar a $ue atributo nos re6erimos! Si ademGs deseamos $ue la misma se incremente automGticamente, agregamos HA4T2JINCRE(ENTI! 8otar tambiLn $ue el resto de los I8SE* S no insertan un #alor para id"liente! CREATE TABLE #%ien"e (idC%ien"e INTEFER N2T N4LL A4T2JINCRE(ENT, nombre VARCHAR(20) N2T N4LL, =RI(ARH EEH(idC%ien"e)) INSERT INT2 #%ien"e (nombre) VAL4ES (C(ar"in@) INSERT INT2 #%ien"e (nombre) VAL4ES (CBuan@) INSERT INT2 #%ien"e (nombre) VAL4ES (C1ran#i!#o@) INSERT INT2 #%ien"e (nombre) VAL4ES (CAndrea@)

.hora creamos la siguiente tablaB CREATE TABLE #om-rador (id#om-rador INTEFER, id#%ien"e INTEFER) ALTER TABLE #om-rador A99 12REIFN EEH (id#%ien"e) RE1ERENCES #%ien"e(id#%ien"e)

8otar $ue la columna idcliente e?ista pre#iamente cuando se realiza el .L E*! Bus$uemos insertar datos de un cliente en la tabla comprador, $ue no estG en la tabla clienteB '5

SQL + (ni#ersidad )* , Gabriel Bentos Pereira Eguren I8SE* I8 ) comprador Did"omprador, id"lienteE >.L(ES D',-;;E

Podemos apreciar el error H"annot add or update a child roAB a 6oreign Te% constraintI, luego cambiamos -;; por - % nos permite realizar la insercin!

'7

S-ar putea să vă placă și