Documente Academic
Documente Profesional
Documente Cultură
[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 )* !
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
&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
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!(.,//)
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;.
(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
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
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
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!
.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)
'-
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!
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@)
'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
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
.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