Tutorial MySql
-1-
Índice 1 - Introducción..........................................................................................................................................4 2 - show databases......................................................................................................................................5 3 - Creación de una tabla y mostrar sus campos (create table - show tables - describe - drop table)...... .. 4 - Car!a de re!istros a una tabla y su recuperación recuperación (insert into - select)............................................... ..." 5 - #$pos de datos b%sicos b%sicos de un campo de una tabla........................................................... ......................& - 'ecuperación de al!unos campos (select)..........................................................................................1 - 'ecuperación 'ecuperación de re!istros espec$*icos espec$*icos (select - where)................................................... ................. ........ ...........11 ..11 " - +peradores 'elacionales , , ,..........................................................................................12 & - /orrado de re!istros re!istros de una tabla tabla (delete).......................................................................... ................ ........ ........ 13 1 - 0odi*icación de re!istros de una tabla (update)............................................................................. ..14 1 - 0odi*icación de re!istros de una tabla (update)............................................................................. ..15 11 - Clae primaria...................................................................................................................................1 12 - Campo entero con autoincremento...................................................................................................1" 13 - Comando truncate table....................................................................................................................2 14 - alores null.......................................................................................................................................21 15 - alores alores numricos numricos sin si!no (unsi!ned)............................................................. (unsi!ned)............................................................. .................... ............ ................. ..........23 .23 15 - alores alores numricos numricos sin si!no (unsi!ned)............................................................. (unsi!ned)............................................................. .................... ............ ................. ..........24 .24 1 - #ipos de datos...................................................................................................................................25 1 - #ipos de datos (teto)........................................................................................................................2 1" - #ipos de datos (numricos)...............................................................................................................2 2 - alores por de*ecto...........................................................................................................................3 21 - alores alores in%lidos................................................................ in%lidos................................................................ ...................................................... .........31 ........ .31 22 - tributo de*ault en una columna de una tabla..................................................................................34 23 - tributo tributo 6ero*ill en una columna de una tabla............................................................. tabla............................................................. .....................3 ................. ....3 24 - Columnas calculadas.........................................................................................................................3 25 - 7unciones 7unciones para el mane8o de cadenas................................................................................. cadenas................................................................................. ..............3" ........ ......3" 2 - 7unciones matem%ticas.....................................................................................................................43 2 - 7unciones 7unciones para el uso de *echa *echa y hora................................................................... ......................... ................ ...........45 ..45 2" - Cl%usula order by del select..............................................................................................................4 2& - +peradores 9ó!icos (and - or - not).................................................................................................4" 3 - +tros operadores relacionales (between - in)...................................................................................5 31 - /:s;ueda de patrones patrones (li
45 - Creación de $ndices a tablas tablas eistentes (create (create inde)............................................................. .........1 ........ .1 4 - Cl%usula limit del comando select....................................................................................................2 4 - 'ecuperación 'ecuperación de re!istros en *orma aleatoria(rand aleatoria(rand)................................................... )................................................... ...................... ............... .......4 4 4" - 'empla6ar re!istros (replace)...........................................................................................................5 4& - !re!ar !re!ar campos campos a una tabla (alter table table - add)........................................................... ................. ........ .............. ..... 5 - >liminar campos de una tabla (alter (alter table - drop)............................................................... ..............& 51 - 0odi*icar campos de una tabla (alter table - modi*y)......................................................................" 52 - Cambiar el nombre de un campo de una tabla (alter table - chan!e)................................................ "2 53 - !re!ar y eliminar la clae primaria (alter table).......................................................................... ..."3 54 - !re!ar $ndices(alter $ndices(alter table - add inde)..................................................................... ......................."5 55 - /orrado de $ndices (alter table - drop inde)...................................................................................." 5 - renombrar tablas (alter (alter table - rename - rename table).............................................................. ......." ....... " 5 - #ipo de dato enum............................................................................................................................"" 5" - #ipo de dato set.................................................................................................................................& - 7unciones de control de *lu8o (i*).....................................................................................................&3 1 - 7unciones de control de *lu8o (case).................................................................................................&5 2 - arias tablas (8oin)............................................................................................................................& 3 - Clae *or%nea..................................................................................................................................1 4 - arias arias tablas (le*t 8oin)....................................................... 8oin)....................................................... .................................................. .......................................................... ...........11 ...11 5 - arias arias tablas (ri!ht 8oin)........................................................................................ .......................... 13 - arias tablas (cross 8oin).................................................................................................................14 - arias tablas (natural 8oin)..............................................................................................................1 " - arias tablas (inner 8oin - strai!ht 8oin)..........................................................................................1" & - 8oin? !roup by y *unciones *unciones de a!rupamiento................................................................................... 1& - 8oin con m%s de dos tablas..............................................................................................................11 1 - 7unción de control i* con arias tablas...........................................................................................112 2 - ariables de usuario........................................................................................................................113 3 - Crear tabla a partir partir de otra (create (create - insert)........................................................................ .............115 ........ .....115 4 - Crear tabla a partir de otras (create - insert - 8oin)................................................................... .......11" ....... 11" 5 - Insertar datos en una tabla buscando buscando un alor en otra (insert - select)............................. select)..................................... .............. ......12 12 - Insertar re!istros re!istros con alores de otra tabla (insert (insert - select)................................................ select)....................................... ................. ............ ....122 122 - Insertar re!istros con alores de otra tabla (insert - select - 8oin)....................................... ............124 ............ 124 " - ctuali6ar ctuali6ar datos con alores alores de otra tabla (update)............................................................. ...........12 ......... ..12 & - ctuali6ación en cascada (update - 8oin)........................................................................................12" " - /orrar re!istros re!istros consultando otras otras tablas (delete - 8oin)........................................................ .........13 ........ .13 "1 - /orrar re!istros re!istros buscando coincidencias coincidencias en otras tablas (delete - 8oin)..................................... .....132 "2 - /orrar re!istros en cascada (delete - 8oin)......................................................................................134 "3 - Che;uear y reparar tablas tablas (chec< - repair)................................................................................. .....13 "4 - >ncriptación de datos (encode - decode)........................................................................................13
-3-
1 - Introducción. =@9? =tructure @uery 9an!ua!e (9en!ua8e de Consulta >structurado) es un len!ua8e de pro!ramacion para traba8ar con base de datos relacionales como 0y=@9? +racle? etc. 0y=@9 es un interpretador de =@9? es un seridor de base de datos. 0y=@9 permite crear base de datos y tablas? insertar datos? modi*icarlos? eliminarlos? ordenarlos? hacer consultas y reali6ar muchas operaciones? etc.? resumiendoA administrar bases de datos. In!resando instrucciones en la linea de comandos o embebidas en un len!ua8e como BB nos comunicamos con el seridor. Cada sentencia debe acabar con punto y coma (D). 9a sensibilidad a may:sculas y min:sculas? es decir? si hace di*erencia entre ellas? depende del sistema operatio? Eindows no es sensible? pero 9inu si. Bor e8emplo Eindows interpreta i!ualmente las si!uientes sentenciasA create database administracion; Create DataBase administracion;
Bero 9inu interpretar% como un error la se!unda. =e recomienda usar siempre min:sculas. >s m%s el sitio mys;lya.com.ar est% instalado sobre un seridor 9inu por lo ;ue todos los e8ercicios deber%n respetarse may:sculas y min:sculas.
-4-
2 - show databases Fna base de datos es un con8unto de tablas. Fna base de datos tiene un nombre con el cual accederemos a ella. amos a traba8ar en una base de datos ya creada en el sitio mys;lya.com.ar? llamada GadministracionG. Bara ;ue el seridor nos muestre las bases de datos eistentes? se lo solicitamos eniando la instrucciónA show databases;
Hos mostrar% los nombres de las bases de datos? debe aparecer en este sitio GadministracionG.
-5-
3 - Creación de una tabla y mostrar sus campos (create table - show tables - describe drop table) Fna base de datos almacena sus datos en tablas. Fna tabla es una estructura de datos ;ue or!ani6a los datos en columnas y *ilasD cada columna es un campo (o atributo) y cada *ila? un re!istro. 9a intersección de una columna con una *ila? contiene un dato espec$*ico? un solo alor. Cada re!istro contiene un dato por cada columna de la tabla. Cada campo (columna) debe tener un nombre. >l nombre del campo hace re*erencia a la in*ormación ;ue almacenar%. Cada campo (columna) tambin debe de*inir el tipo de dato ;ue almacenar%. nombre
clave
0arioBere6 0arito 0ariaarcia 0ary Jie!o'odri!ue6 6"" r%*icamente ac% tenemos la tabla usuarios? ;ue contiene dos campos llamadosAnombre y clae. 9ue!o tenemos tres re!istros almacenados en esta tabla? el primero almacena en el campo nombre el alor G0arioBere6G y en el campo clae G0aritoG? y as$ sucesiamente con los otros dos re!istros. 9as tablas *orman parte de una base de datos. Hosotros traba8aremos con la base de datos llamada GadministracionG? ;ue ya hemos creado en el seridor mys;lya.com.ar. Bara er las tablas eistentes en una base de datos tipeamosA show tables;
Jeben aparecer todas las tablas ;ue han creado los isitantes al sitio mys;lya.com.ar l crear una tabla debemos resoler ;u campos (columnas) tendr% y ;ue tipo de datos almacenar%n cada uno de ellos? es decir? su estructura. 9a tabla debe ser de*inida con un nombre ;ue la identi*i;ue y con el cual accederemos a ella. Creamos una tabla llamada GusuariosG? tipeamosA
--
create table usuarios ( nombre varchar(30), clave varchar(10) );
=i intentamos crear una tabla con un nombre ya eistente (eiste otra tabla con ese nombre)? mostrar% un mensa8e de error indicando ;ue la acción no se reali6ó por;ue ya eiste una tabla con el mismo nombre. Bara er las tablas eistentes en una base de datos tipeamos nueamenteA show tables;
hora aparece GusuariosG entre otras ;ue ya pueden estar creadas. Cuando se crea una tabla debemos indicar su nombre y de*inir sus campos con su tipo de dato. >n esta tabla GusuariosG de*inimos 2 camposA - nombre: que contendr una cadena de hasta 30 caracteres de lon!itud, que almacenar el nombre de usuario " - clave: otra cadena de caracteres de 10 de lon!itud, que !uardar la clave de cada usuario#
Cada usuario ocupar% un re!istro de esta tabla? con su respectio nombre y clae. Bara er la estructura de una tabla usamos el comando GdescribeG 8unto al nombre de la tablaA describe usuarios;
parece lo si!uienteA $ield %"&e 'ull nombre varchar(30) *+ clave varchar(10) *+
>sta es la estructura de la tabla GusuariosGD nos muestra cada campo? su tipo? lo ;ue ocupa en bytes y otros datos como la aceptación de alores nulos etc? ;ue eremos m%s adelante en detalle. Bara eliminar una tabla usamos Gdrop tableG. #ipeamosA dro& table usuarios;
=i tipeamos nueamenteA dro& table usuarios;
parece un mensa8e de error? indicando ;ue no eiste? ya ;ue intentamos borrar una tabla ineistente. Bara eitar este mensa8e podemos tipearA dro& table i eists usuarios;
>n la sentencia precedente especi*icamos ;ue elimine la tabla GusuariosG si eiste.
--
4 - Cara de reistros a una tabla y su recuperación (insert into - select) Fn re!istro es una *ila de la tabla ;ue contiene los datos propiamente dichos. Cada re!istro tiene un dato por cada columna. 'ecordemos como crear la tabla GusuariosGA create table usuarios ( nombre varchar(30), clave varchar(10) );
l in!resar los datos de cada re!istro debe tenerse en cuenta la cantidad y el orden de los campos. hora amos a a!re!ar un re!istro a la tablaA insert into usuarios (nombre, clave) values (./arioere.,./arito.);
Fsamos Ginsert intoG. >speci*icamos los nombres de los campos entre parntesis y separados por comas y lue!o los alores para cada campo? tambin entre parntesis y separados por comas. 9a tabla usuarios ahora la podemos !ra*icar de la si!uiente *ormaA nombre
clave
0arioBere6 0arito >s importante in!resar los alores en el mismo orden en ;ue se nombran los campos? si in!resamos los datos en otro orden? no aparece un mensa8e de error y los datos se !uardan de modo incorrecto. Hote ;ue los datos in!resados? como corresponden a campos de cadenas de caracteres se colocan entre comillas simples. 9as comillas simples son +/9I#+'I=. Bara er los re!istros de una tabla usamos GselectGA select nombre,clave rom usuarios;
parece un re!istro. >l comando GselectG recupera los re!istros de una tabla. 9ue!o del comando select indicamos los nombres de los campos a rescatar.
-"-
! - "#pos de datos b$sicos de un campo de una tabla. Ka eplicamos ;ue al crear una tabla debemos resoler ;u campos (columnas) tendr% y ;ue tipo de datos almacenar% cada uno de ellos? es decir? su estructura. >stos son al!unos tipos de datos b%sicosA - archarA se usa para almacenar cadenas de caracteres. Fna cadena es una secuencia de caracteres. =e coloca entre comillas (simples)A LolaL. >l tipo GarcharG de*ine una cadena de lon!itud ariable en la cual determinamos el m%imo de caracteres. Buede !uardar hasta 255 caracteres. Bara almacenar cadenas de hasta 3 caracteres? de*inimos un campo de tipo archar(3). =i asi!namos una cadena de caracteres de mayor lon!itud ;ue la de*inida? la cadena se corta. Bor e8emplo? si de*inimos un campo de tipo archar(1) y le asi!namos la cadena L/uenas tardesL? se almacenar% L/uenas tarL a8ust%ndose a la lon!itud de 1 caracteres. - inte!erA se usa para !uardar alores numricos enteros? de -2 a 2 apro. Je*inimos campos de este tipo cuando ;ueremos representar? por e8emplo? cantidades. - *loatA se usa para almacenar alores numricos decimales. =e utili6a como separador el punto (.). Je*inimos campos de este tipo para precios? por e8emplo.
ntes de crear una tabla debemos pensar en sus campos y optar por el tipo de dato adecuado para cada uno de ellos. Bor e8emplo? si en un campo almacenaremos n:meros enteros? el tipo G*loatG ser$a una mala elecciónD si amos a !uardar precios? el tipo G*loatG es correcto? no as$ Ginte!erG ;ue no tiene decimales.
-&-
% - &ecuperación de alunos campos (select) emos aprendido cómo er todos los re!istros de una tablaA select 2 rom libros;
>l comando GselectG recupera los re!istros de una tabla. Con el asterisco (M) indicamos ;ue seleccione todos los campos de la tabla ;ue nombramos. Bodemos especi*icar el nombre de los campos ;ue ;ueremos er separ%ndolos por comasA select titulo,autor,editorial rom libros;
>n la sentencia anterior la consulta mostrar% sólo los campos GtituloG? GautorG y GeditorialG. >n la si!uiente sentencia? eremos los campos correspondientes al t$tulo y precio de todos los librosA select titulo,&recio rom libros;
Bara er solamente la editorial y la cantidad de libros tipeamosA select editorial,cantidad rom libros;
- 1 -
' - &ecuperación de reistros espec#icos (select - where) emos aprendido cómo er todos los re!istros de una tablaA select nombre, clave rom usuarios;
>l comando GselectG recupera los re!istros de una tabla. Jetallando los nombres de los campos separados por comas? indicamos ;ue seleccione todos los campos de la tabla ;ue nombramos. >iste una cl%usula? GwhereG ;ue es opcional? con ella podemos especi*icar condiciones para la consulta GselectG. >s decir? podemos recuperar al!unos re!istros? sólo los ;ue cumplan con ciertas condiciones indicadas con la cl%usula GwhereG. Bor e8emplo? ;ueremos er el usuario cuyo nombre es G0arioBere6G? para ello utili6amos GwhereG y lue!o de ella? la condiciónA select nombre, clave rom usuarios where nombre./arioere.;
Bara las condiciones se utili6an operadores relacionales (tema ;ue trataremos m%s adelante en detalle). >l si!no i!ual(,) es un operador relacional. Bara la si!uiente selección de re!istros especi*icamos una condición ;ue solicita los usuarios cuya clae es i!ual a Lboca8uniorLA select nombre, clave rom usuarios where clave.boca4unior.;
=i nin!:n re!istro cumple la condición establecida con el GwhereG? no aparecer% nin!:n re!istro.
- 11 -
- *peradores &elacionales + , , ,+ + emos aprendido a especi*icar condiciones de i!ualdad para seleccionar re!istros de una tablaD por e8emploA select titulo,autor,editorial rom libros where autor.Bor!es.;
Ftili6amos el operador relacional de i!ualdad. 9os operadores relacionales inculan un campo con un alor para ;ue 0y=@9 compare cada re!istro (el campo especi*icado) con el alor dado. 9os operadores relacionales son los si!uientesA 56 6 5 6 5
i!ual distinto ma"or menor ma"or o i!ual menor o i!ual
Bodemos seleccionar los re!istros cuyo autor sea di*erente de L/or!esL? para ello usamos la condiciónA select titulo,autor,editorial rom libros where autor56.Bor!es.;
Bodemos comparar alores numricos. Bor e8emplo? ;ueremos mostrar los libros cuyos precios sean mayores a 2 pesosA select titulo,autor,editorial,&recio rom libros where &recio670;
#ambin? los libros cuyo precio sea menor o i!ual a 3A select titulo,autor,editorial,&recio rom libros where &recio530;
- 12 -
- /orrado de reistros de una tabla (delete) Bara eliminar los re!istros de una tabla usamos el comando GdeleteGA delete rom usuarios;
9a e8ecución del comando indicado en la l$nea anterior borra #+J+= los re!istros de la tabla. =i ;ueremos eliminar uno o arios re!istros debemos indicar cu%l o cu%les? para ello utili6amos el comando GdeleteG 8unto con la clausula GwhereG con la cual establecemos la condición ;ue deben cumplir los re!istros a borrar. Bor e8emplo? ;ueremos eliminar a;uel re!istro cuyo nombre de usuario es L9eonardoLA delete rom usuarios where nombre.8eonardo.;
=i solicitamos el borrado de un re!istro ;ue no eiste? es decir? nin!:n re!istro cumple con la condición especi*icada? no se borrar%n re!istros? pues no encontró re!istros con ese dato.
- 13 -
10 - odiicación de reistros de una tabla (update) Bara modi*icar uno o arios datos de uno o arios re!istros utili6amos GupdateG (actuali6ar). Bor e8emplo? en nuestra tabla GusuariosG? ;ueremos cambiar los alores de todas las claes? por G'eal0adridGA u&date usuarios set clave.9eal/adrid.;
Ftili6amos GupdateG 8unto al nombre de la tabla y GsetG 8unto con el campo a modi*icar y su nueo alor. >l cambio a*ectar% a todos los re!istros. Bodemos modi*icar al!unos re!istros? para ello debemos establecer condiciones de selección con GwhereG. Bor e8emplo? ;ueremos cambiar el alor correspondiente a la clae de nuestro usuario llamado L0arioBere6L? ;ueremos como nuea clae L/ocaL? necesitamos una condición GwhereG ;ue a*ecte solamente a este re!istroA u&date usuarios set clave.Boca. where nombre./arioere.;
=i no encuentra re!istros ;ue cumplan con la condición del GwhereG? nin!:n re!istro es a*ectado. 9as condiciones no son obli!atorias? pero si omitimos la cl%usula GwhereG? la actuali6ación a*ectar% a todos los re!istros. #ambin se puede actuali6ar arios campos en una sola instrucciónA u&date usuarios set nombre./arceloDuarte., clave./arce. where nombre./arcelo.;
Bara ello colocamos GupdateG? el nombre de la tabla? GsetG 8unto al nombre del campo y el nueo alor y separado por coma? el otro nombre del campo con su nueo alor.
- 14 -
10 - odiicación de reistros de una tabla (update) Bara modi*icar uno o arios datos de uno o arios re!istros utili6amos GupdateG (actuali6ar). Bor e8emplo? en nuestra tabla GusuariosG? ;ueremos cambiar los alores de todas las claes? por G'eal0adridGA u&date usuarios set clave.9eal/adrid.;
Ftili6amos GupdateG 8unto al nombre de la tabla y GsetG 8unto con el campo a modi*icar y su nueo alor. >l cambio a*ectar% a todos los re!istros. Bodemos modi*icar al!unos re!istros? para ello debemos establecer condiciones de selección con GwhereG. Bor e8emplo? ;ueremos cambiar el alor correspondiente a la clae de nuestro usuario llamado L0arioBere6L? ;ueremos como nuea clae L/ocaL? necesitamos una condición GwhereG ;ue a*ecte solamente a este re!istroA u&date usuarios set clave.Boca. where nombre./arioere.;
=i no encuentra re!istros ;ue cumplan con la condición del GwhereG? nin!:n re!istro es a*ectado. 9as condiciones no son obli!atorias? pero si omitimos la cl%usula GwhereG? la actuali6ación a*ectar% a todos los re!istros. #ambin se puede actuali6ar arios campos en una sola instrucciónA u&date usuarios set nombre./arceloDuarte., clave./arce. where nombre./arcelo.;
Bara ello colocamos GupdateG? el nombre de la tabla? GsetG 8unto al nombre del campo y el nueo alor y separado por coma? el otro nombre del campo con su nueo alor.
- 15 -
11 - Clave primaria. Fna clae primaria es un campo (o arios) ;ue identi*ica 1 solo re!istro (*ila) en una tabla. Bara un alor del campo clae eiste solamente 1 re!istro. 9os alores no se repiten ni pueden ser nulos. eamos un e8emplo? si tenemos una tabla con datos de personas? el n:mero de documento puede establecerse como clae primaria? es un alor ;ue no se repiteD puede haber personas con i!ual apellido y nombre? incluso el mismo domicilio (padre e hi8o por e8emplo)? pero su documento ser% siempre distinto. =i tenemos la tabla GusuariosG? el nombre de cada usuario puede establecerse como clae primaria? es un alor ;ue no se repiteD puede haber usuarios con i!ual clae? pero su nombre de usuario ser% siempre distinto. >stablecemos ;ue un campo sea clae primaria al momento de creación de la tablaA create table usuarios ( nombre varchar(70), clave varchar(10), &rimar" e"(nombre) );
Bara de*inir un campo como clae primaria a!re!amos Gprimary
=i intentamos in!resar un alor para el campo clae ;ue ya eiste? aparece un mensa8e de error indicando ;ue el re!istro no se car!ó pues el dato clae eiste. >sto sucede por;ue los campos de*inidos como clae primaria no pueden repetirse. In!resamos un re!istro con un nombre de usuario repetido? por e8emploA insert into usuarios (nombre, clave)
- 1 -
values (.ustavo.,.Boca.);
Fna tabla sólo puede tener una clae primaria. Cual;uier campo (de cual;uier tipo) puede ser clae primaria? debe cumplir como re;uisito? ;ue sus alores no se repitan. l establecer una clae primaria estamos indeando la tabla? es decir? creando un $ndice para dicha tablaD a este tema lo eremos m%s adelante.
- 1 -
12 - Campo entero con autoincremento. Fn campo de tipo entero puede tener otro atributo etra LautoNincrementL. 9os alores de un campo LautoNincrementL? se inician en 1 y se incrementan en 1 autom%ticamente. =e utili6a !eneralmente en campos correspondientes a códi!os de identi*icación para !enerar alores :nicos para cada nueo re!istro ;ue se inserta. =ólo puede haber un campo GautoNincrementG y debe ser clae primaria (o estar indeado). Bara establecer ;ue un campo autoincremente sus alores autom%ticamente? ste debe ser entero (inte!er) y debe ser clae primariaA create table libros( codi!o int autoincrement, titulo varchar(70), autor varchar(30), editorial varchar(1<), &rimar" e" (codi!o) );
Bara de*inir un campo autoincrementable colocamos GautoNincrementG lue!o de la de*inición del campo al crear la tabla. asta ahora? al in!resar re!istros? colocamos el nombre de todos los campos antes de los aloresD es posible in!resar alores para al!unos de los campos de la tabla? pero recuerde ;ue al in!resar los alores debemos tener en cuenta los campos ;ue detallamos y el orden en ;ue lo hacemos. Cuando un campo tiene el atributo GautoNincrementG no es necesario in!resar alor para l? por;ue se inserta autom%ticamente tomando el :ltimo alor como re*erencia? o 1 si es el primero. Bara in!resar re!istros omitimos el campo de*inido como GautoNincrementG? por e8emploA insert into libros (titulo,autor,editorial) values(.*l ale&h.,.Bor!es.,.laneta.);
>ste primer re!istro in!resado !uardar% el alor 1 en el campo correspondiente al códi!o. =i continuamos in!resando re!istros? el códi!o (dato ;ue no in!resamos) se car!ar% autom%ticamente si!uiendo la secuencia de autoincremento. Fn campo GautoNincrementG *unciona correctamente sólo cuando contiene :nicamente alores positios. 0%s adelante eplicaremos cómo de*inir un campo con sólo alores positios. >st% permitido in!resar el alor correspondiente al campo GautoNincrementG? por e8emploA insert into libros (codi!o,titulo,autor,editorial) values(=,./artin $ierro.,.>ose ?ernande.,.aidos.);
- 1" -
Bero debemos tener cuidado con la inserción de un dato en campos GautoNincrementG. Jebemos tener en cuenta ;ueA - si el valor est re&etido a&arecer un mensa4e de error " el re!istro no se in!resar# - si el valor dado saltea la secuencia, lo toma i!ualmente " en las si!uientes inserciones, continuar la secuencia tomando el valor ms alto# - si el valor in!resado es 0, no lo toma " !uarda el re!istro continuando la secuencia# - si el valor in!resado es ne!ativo (" el cam&o no est deinido &ara ace&tar s@lo valores &ositivos), lo in!resa#
Bara ;ue este atributo *uncione correctamente? el campo debe contener solamente alores positiosD m%s adelante trataremos este tema.
- 1& -
13 - Comando truncate table. prendimos ;ue para borrar todos los re!istro de una tabla se usa GdeleteG sin condición GwhereG. #ambin podemos eliminar todos los re!istros de una tabla con Gtruncate tableG. Bor e8emplo? ;ueremos aciar la tabla GlibrosG? usamosA truncate table libros;
9a sentencia Gtruncate tableG ac$a la tabla (elimina todos los re!istros) y uele a crear la tabla con la misma estructura. 9a di*erencia con Gdrop tableG es ;ue esta sentencia borra la tabla? Gtruncate tableG la ac$a. 9a di*erencia con GdeleteG es la elocidad? es m%s r%pido Gtruncate tableG ;ue GdeleteG (se nota cuando la cantidad de re!istros es muy !rande) ya ;ue ste borra los re!istros uno a uno. +tra di*erencia es la si!uienteA cuando la tabla tiene un campo GautoNincrementG? si borramos todos los re!istros con GdeleteG y lue!o in!resamos un re!istro? al car!arse el alor en el campo autoincrementable? contin:a con la secuencia teniendo en cuenta el alor mayor ;ue se hab$a !uardadoD si usamos Gtruncate tableG para borrar todos los re!istros? al in!resar otra e6 un re!istro? la secuencia del campo autoincrementable uele a iniciarse en 1. Bor e8emplo? tenemos la tabla GlibrosG con el campo Gcodi!oG de*inido GautoNincrementG? y el alor m%s alto de ese campo es G5G? si borramos todos los re!istros con GdeleteG y lue!o in!resamos un re!istro sin alor de códi!o? se !uardar% el alor GGD si en cambio? aciamos la tabla con Gtruncate tableG? al in!resar un nueo re!istro sin alor para el códi!o? iniciar% la secuencia en 1 nueamente.
- 2 -
14 - alores null. nali6aremos la estructura de una tabla ;ue emos al utili6ar el comando GdescribeG. #omamos como e8emplo la tabla GlibrosGA $ield %"&e 'ull Ae" Deault *tra codi!o int(11) b## ' 9 autoincrement titulo varchar(70) 11 b## *+ ('E88) autor varchar(30) 11 b## *+ ('E88) editorial varchar(1<) 11 b## *+ ('E88) &recio loat < b## *+ ('E88)
9a primera columna indica el tipo de dato de cada campo. 9a se!unda columna GHullG especi*ica si el campo permite alores nulosD emos ;ue en el campo Gcodi!oG? aparece GH+G y en las dem%s GK>=G? esto si!ni*ica ;ue el primer campo no acepta alores nulos (por;ue es clae primaria) y los otros si los permiten. 9a tercera columna GOeyG? muestra los campos ;ue son clae primariaD en el campo Gcodi!oG aparece GB'IG (es clae primaria) y los otros est%n ac$os? por;ue no son clae primaria. 9a cuarta columna GJe*aultG? muestra los alores por de*ecto? esto es? los alores ;ue 0y=@9 in!resa cuando omitimos un dato o colocamos un alor in%lidoD para todos los campos? ecepto para el ;ue es clae primaria? el alor por de*ecto es GnullG. 9a ;uinta columna G>traG? muestra al!unos atributos etra de los camposD el campo Gcodi!oG es GautoNincrementG. amos a eplicar los alores nulos. GnullL si!ni*ica Gdato desconocidoG o Galor ineistenteG. Ho es lo mismo ;ue un alor ? una cadena ac$a o una cadena literal GnullG. eces? puede desconocerse o no eistir el dato correspondiente a al!:n campo de un re!istro. >n estos casos decimos ;ue el campo puede contener alores nulos. Bor e8emplo? en nuestra tabla de libros? podemos tener alores nulos en el campo GprecioG por;ue es posible ;ue para al!unos libros no le hayamos establecido el precio para la enta. >n contraposición? tenemos campos ;ue no pueden estar ac$os 8am%s? por e8emplo? los campos ;ue identi*ican cada re!istro? como los códi!os de identi*icación? ;ue son clae primaria. Bor de*ecto? es decir? si no lo aclaramos en la creación de la tabla? los campos permiten alores nulos. Ima!inemos ;ue in!resamos los datos de un libro? para el cual a:n no hemos de*inido el precioA
- 21 -
insert into libros (titulo,autor,editorial,&recio) values (.*l ale&h.,.Bor!es.,.laneta.,null);
Hote ;ue el alor GnullG no es una cadena de caracteres? no se coloca entre comillas. =i un campo acepta alores nulos? podemos in!resar GnullG cuando no conocemos el alor. 9os campos establecidos como clae primaria no aceptan alores nulos. Huestro campo clae primaria? est% de*inido GautoNincrementGD si intentamos in!resar el alor GnullG para este campo? no lo tomar% y se!uir% la secuencia de incremento. >l campo GtituloG? no deber$a aceptar alores nulos? para establecer este atributo debemos crear la tabla con la si!uiente sentenciaA create table libros( codi!o int autoincrement, titulo varchar(70) not null autor varchar(30), editorial varchar(1<), &recio loat, &rimar" e" (codi!o) );
>ntonces? para ;ue un campo no permita alores nulos debemos especi*icarlo lue!o de de*inir el campo? a!re!ando Gnot nullG. Bor de*ecto? los campos permiten alores nulos? pero podemos especi*icarlo i!ualmente a!re!ando GnullG. >plicamos ;ue GnullG no es lo mismo ;ue una cadena ac$a o un alor (cero). Bara recuperar los re!istros ;ue conten!an el alor GnullG en el campo GprecioG no podemos utili6ar los operadores relacionales istos anteriormenteA , (i!ual) y (distinto)D debemos utili6ar los operadores Gis nullG (es i!ual a null) y Gis not nullG (no es null)A select 2 rom libros where &recio is null;
9a sentencia anterior tendr% una salida di*erente a la si!uienteA select 2 rom libros where &recio0;
Con la primera sentencia eremos los libros cuyo precio es i!ual a GnullG (desconocido)D con la se!unda? los libros cuyo precio es . I!ualmente para campos de tipo cadena? las si!uientes sentencias GselectG no retornan los mismos re!istrosA select 2 rom libros where editorial is null; select 2 rom libros where editorial..;
Con la primera sentencia eremos los libros cuya editorial es i!ual a GnullG? con la se!unda? los libros cuya editorial !uarda una cadena ac$a.
- 22 -
- 23 -
1! - alores numricos sin sino (unsined) emos isto al!unos atributos etra para los campos. 9os campos de tipo entero pueden tener el atributo GautoNincrementG? ;ue incrementa autom%ticamente el alor del campo en 1. 9os campos de cual;uier tipo aceptan el atributo GnullG y Gnot nullG con lo cual permiten o no alores nulos. +tro atributo ;ue permiten los campos de tipo numrico es Gunsi!nedG. >l atributo Gunsi!nedG (sin si!no) permite sólo alores positios. =i necesitamos almacenar edades? por e8emplo? nunca !uardaremos alores ne!atios? entonces ser$a adecuado de*inir un campo GedadG de tipo entero sin si!noA edad inte!er unsi!ned;
=i necesitamos almacenar el precio de los libros? de*inimos un campo de tipo G*loat unsi!nedG por;ue 8am%s !uardaremos un alor ne!atio. emos aprendido ;ue al crear una tabla? es importante ele!ir el tipo de dato adecuado? el m%s preciso? se!:n el caso. =i un campo almacenar% sólo alores positios? es :til de*inir dicho campo con este atributo. >n los tipos enteros? Gunsi!nedG duplica el ran!o? es decir? el tipo Ginte!erG permite alores de -2 a 2 apro.? si se de*ine Ginte!er unsi!nedG el ran!o a de a 4 apro. 9os tipos de coma *lotante (*loat por e8emplo) tambin aceptan el atributo Gunsi!nedG? pero el alor del l$mite superior del ran!o se mantiene.
- 24 -
1! - alores numricos sin sino (unsined) emos isto al!unos atributos etra para los campos. 9os campos de tipo entero pueden tener el atributo GautoNincrementG? ;ue incrementa autom%ticamente el alor del campo en 1. 9os campos de cual;uier tipo aceptan el atributo GnullG y Gnot nullG con lo cual permiten o no alores nulos. +tro atributo ;ue permiten los campos de tipo numrico es Gunsi!nedG. >l atributo Gunsi!nedG (sin si!no) permite sólo alores positios. =i necesitamos almacenar edades? por e8emplo? nunca !uardaremos alores ne!atios? entonces ser$a adecuado de*inir un campo GedadG de tipo entero sin si!noA edad inte!er unsi!ned;
=i necesitamos almacenar el precio de los libros? de*inimos un campo de tipo G*loat unsi!nedG por;ue 8am%s !uardaremos un alor ne!atio. emos aprendido ;ue al crear una tabla? es importante ele!ir el tipo de dato adecuado? el m%s preciso? se!:n el caso. =i un campo almacenar% sólo alores positios? es :til de*inir dicho campo con este atributo. >n los tipos enteros? Gunsi!nedG duplica el ran!o? es decir? el tipo Ginte!erG permite alores de -2 a 2 apro.? si se de*ine Ginte!er unsi!nedG el ran!o a de a 4 apro. 9os tipos de coma *lotante (*loat por e8emplo) tambin aceptan el atributo Gunsi!nedG? pero el alor del l$mite superior del ran!o se mantiene.
- 25 -
1% - "ipos de datos Ka eplicamos ;ue al crear una tabla debemos ele!ir la estructura adecuada? esto es? de*inir los campos y sus tipos m%s precisos? se!:n el caso. Bor e8emplo? si un campo numrico almacenar% solamente alores enteros positios el tipo Ginte!erG con el atributo Gunsi!nedG es m%s adecuado ;ue? por e8emplo un G*loatG. asta ahora hemos isto 3 tipos de datosA archar? inte!er (con y sin si!no) y *loat (con y sin si!no). ay m%s tipos? incluso? subtipos. 9os alores ;ue podemos !uardar sonA ) #>P#+A Bara almacenar teto usamos cadenas de caracteres. 9as cadenas se colocan entre comillas simples. Bodemos almacenar d$!itos con los ;ue no se reali6an operaciones matem%ticas? por e8emplo? códi!os de identi*icación? n:meros de documentos? n:meros tele*ónicos. #enemos los si!uientes tiposA archar? char y tet. /) HF0>'+=A >iste ariedad de tipos numricos para representar enteros? ne!atios? decimales. Bara almacenar alores enteros? por e8emplo? en campos ;ue hacen re*erencia a cantidades? precios? etc.? usamos el tipo inte!er. Bara almacenar alores con decimales utili6amosA *loat o decimal. C) 7>C= K +'=A para !uardar *echas y horas dispone de arios tiposA date (*echa)? datetime (*echa y hora)? time (hora)? year (aQo) y timestamp. J) +#'+= #IB+=A enum y set representan una enumeración y un con8unto respectiamente. 9o eremos m%s adelante. >) +tro alor ;ue podemos almacenar es el alor GnullG. >l alor LnullL si!ni*ica Ralor desconocidoR o Gdato ineistenteG? ya lo estudiamos. Ho es lo mismo ;ue o una cadena ac$a.
- 2 -
1' - "ipos de datos (teto) Ka eplicamos ;ue al crear una tabla debemos ele!ir la estructura adecuada? esto es? de*inir los campos y sus tipos m%s precisos? se!:n el caso. asta ahora hemos isto 3 tipos de datosA archar? inte!er (con y sin si!no) y *loat (con y sin si!no). ay m%s tipos? incluso? subtipos. Bara almacenar #>P#+ usamos cadenas de caracteres. 9as cadenas se colocan entre comillas simples. Bodemos almacenar d$!itos con los ;ue no se reali6an operaciones matem%ticas? por e8emplo? códi!os de identi*icación? n:meros de documentos? n:meros tele*ónicos. #enemos los si!uientes tiposA 1) archar()A de*ine una cadena de caracteres de lon!itud ariable en la cual determinamos el m%imo de caracteres con el ar!umento GG ;ue a entre parntesis. =u ran!o a de 1 a 255 caracteres. Fn archar(1) ocupa 11 bytes? pues en uno de ellos almacena la lon!itud de la cadena. +cupa un byte m%s ;ue la cantidad de*inida. 2) char()A de*ine una cadena de lon!itud *i8a? su ran!o es de 1 a 255 caracteres. =i la cadena in!resada es menor a la lon!itud de*inida (por e8emplo car!amos LSuanL en un char(1))? almacena espacios en blanco a la derecha? tales espacios se eliminan al recuperarse el dato. Fn char(1) ocupa 1 bytes? pues al ser *i8a su lon!itud? no necesita ese byte adicional donde !uardar la lon!itud. Bor ello? si la lon!itud es inariable? es coneniente utili6ar el tipo charD caso contrario? el tipo archar. +cupa tantos bytes como se de*inen con el ar!umento GG. =i in!resa un ar!umento mayor al permitido (255) aparece un mensa8e indicando ;ue no se permite y su!iriendo ;ue use GblobG o GtetG. =i omite el ar!umento? coloca 1 por de*ecto. 3) blob o tetA blo;ues de datos de caracteres de lon!itud apro. Ho lo eremos por ahora. Bara los tipos ;ue almacenan cadenas? si asi!namos una cadena de caracteres de mayor lon!itud ;ue la permitida o de*inida? la cadena se corta. Bor e8emplo? si de*inimos un campo de tipo archar(1) y le asi!namos la cadena L/uenas tardesL? se almacenar% L/uenas tarL a8ust%ndose a la lon!itud de 1. >s importante ele!ir el tipo de dato adecuado se!:n el caso? el m%s preciso. Bor e8emplo? si amos a almacenar un caracter? coniene usar char(1)? ;ue ocupa 1 byte y no archar(1)? ;ue ocupa 2 bytes. %i&o B"tes de almacenamiento char() varchar() F1
- 2 -
- 2" -
1 - "ipos de datos (numricos) asta ahora hemos isto 2 tipos de datos para almacenar alores numricosA inte!er (con y sin si!no) y *loat (con y sin si!no). >iste ariedad de tipos numricos para representar enteros? ne!atios? decimales. Bara almacenar alores enteros? por e8emplo? en campos ;ue hacen re*erencia a cantidades? precios? etc.? usamosA 1) inte!er() o int()A su ran!o es de -2 a 2 apro. >l tipo Gint unsi!nedG a de a 4. >l tipo Ginte!erG tiene subtiposA - mediumint()A a de R" a " apro. =in si!no a de a 1 apro. - smallint()A a de R3 a 3 apro.? sin si!no? de a apro. - tinyint()A de*ine un alor entero pe;ueQo? cuyo ran!o es de -12" a 12. >l tipo sin si!no a de a 255. - bool o booleanA sinónimos de tinyint(1). Fn alor cero se considera *also? los alores distintos de cero? erdadero. - bi!int()A es un entero lar!o. a de R& a & apro. =in si!no es de a 1. Bara almacenar alores con decimales utili6amosA 2) *loat (t?d)A n:mero de coma *lotante. =u ran!o es de -3.4eT3" a R1.1e-3" (& ci*ras). 3) decimal o numeric (t?d)A el primer ar!umento indica el total de d$!itos y el se!undo? la cantidad de decimales. >l ran!o depende de los ar!umentos? tambin los bytes ;ue ocupa. =i ;ueremos almacenar alores entre . y &&.&& debemos de*inir el campo como tipo Gdecimal (4?2)G. =i no se indica el alor del se!undo ar!umento? por de*ecto es . Bara los tipos G*loatG y GdecimalG se utili6a el punto como separador de decimales. #odos los tipos enteros pueden tener el atributo Gunsi!nedG? esto permite sólo alores positios y duplica el ran!o. 9os tipos de coma *lotante tambin aceptan el atributo Gunsi!nedG? pero el alor del l$mite superior del ran!o no se modi*ica. >s importante ele!ir el tipo de dato adecuado se!:n el caso? el m%s preciso. Bor e8emplo? si un campo numrico almacenar% alores positios menores a 1? el tipo GintG no es el m%s adecuado? por;ue su ran!o a de -2 a 2 apro.? coniene el tipo Gsmallint unsi!nedG? cuyo ran!o a de a apro. Je esta manera usamos el menor espacio de almacenamiento posible. %i&o
B"tes de almacenamiento
- 2& -
tin"int 1 smallint 7 mediumint 3 int G bi!int H loat decimal(t,d)
G tF7 si d60, tF1 si d0 " dF7 si t5d
- 3 -
- 31 -
20 - alores por deecto. emos isto los alores por de*ecto de los distintos tipos de datos. hora ;ue conocemos m%s tipos de datos? amos a ampliar la in*ormación re*erente a ellos y a repasar los conocidos. Bara campos de cual;uier tipo no declarados Gnot nullG el alor por de*ecto es GnullG (ecepto para tipos GtimestampG ;ue no trataremos a;u$). Bara campos declarados Gnot nullG? el alor por de*ecto depende del tipo de dato. Bara cadenas de caracteres el alor por de*ecto es una cadena ac$a. Bara alores numricos el alor por de*ecto es D en caso de ser GautoNincrementG es el alor mayor eistenteT1 comen6ando en 1. Bara campos de tipo *echa y hora? el alor por de*ecto es (por e8emplo? en un campo GdateG es G--G). Bara todos los tipos? ecepto GblobG? GtetG y GautoNincrementG se pueden eplicitar alores por de*ecto con la cl%usula Gde*aultGD tema ;ue eremos m%s adelante. Fn alor por de*ecto se inserta cuando no est% presente al in!resar un re!istro y en al!unos casos en ;ue el dato in!resado es in%lido. 9os campos para los cuales no se in!resaron alores tomar%n los alores por de*ecto se!:n el tipo de dato del campo? en el campo Gcodi!oG in!resar% el si!uiente alor de la secuencia por;ue es GautoNincrementGD en el campo GtituloG? in!resar% una cadena ac$a por;ue es Garchar not nullGD en el campo GeditorialG almacenar% GnullG? por;ue no est% de*inido Gnot nullGD en el campo GprecioG !uardar% GnullG por;ue es el alor por de*ecto de los campos no de*inidos como Gnot nullG y en el campo GcantidadG in!resar% por;ue es el alor por de*ecto de los campos numricos ;ue no admiten alores nulos. %i&o Ialor &or deecto Clusula JdeaultJ caracter not null cadena vacKa &ermite numerico not null 0 &ermite echa not null 0000-00-00 &ermite hora not null 00:00:00 &ermite autoincrement si!uiente de la sec#, em&iea en 1 no &ermite carac#,numer#,echa,hora null null &ermite
- 32 -
21 - alores inv$lidos. emos isto los alores por de*ecto de los distintos tipos de datos. Fn alor por de*ecto se inserta cuando no est% presente al in!resar un re!istro y en al!unos casos en ;ue el dato in!resado es in%lido. Fn alor es in%lido por tener un tipo de dato incorrecto para el campo o por estar *uera de ran!o. eamos los distintos tipos de datos in%lidos. Bara campos de tipo caracterA -alor numricoA si en un campo de*inido de tipo caracter in!resamos un alor numrico? lo conierte autom%ticamente a cadena. Bor e8emplo? si !uardamos 234 en un archar? almacena L234L. -mayor lon!itudA si intentamos !uardar una cadena de caracteres mayor a la lon!itud de*inida? la cadena se corta !uardando sólo la cantidad de caracteres ;ue ;uepa. Bor e8emplo? si de*inimos un campo de tipo archar(1) y le asi!namos la cadena L/uenas tardesL? se almacenar% L/uenas tarL a8ust%ndose a la lon!itud de 1. Bara campos numricosA -cadenasA si en un campo numrico in!resamos una cadena? lo pasa por alto y coloca . Bor e8emplo? si en un campo de tipo Ginte!erG !uardamos LabcL? almacenar% . -alores *uera de ran!oA si en un campo numrico intentamos !uardar un alor *uera de ran!o? se almacena el alor l$mite del ran!o m%s cercano (menor o mayor). Bor e8emplo? si de*inimos un campo LtinyintL (cuyo ran!o a de -12" a 12) e intentamos !uardar el alor 2? se almacenar% 12? es decir el m%imo permitido del ran!oD si intentamos !uardar -2? se !uardar% -12"? el m$nimo permitido por el ran!o. +tro e8emplo? si intentamos !uardar el alor 1. en un campo de*inido como decimal(5?2) !uardar% &&&.&& ;ue es el mayor del ran!o. -alores incorrectosA si car!amos en un campo de*inido de tipo decimal un alor con m%s decimales ;ue los permitidos en la de*inición? el alor es redondeado al m%s cercano. Bor e8emplo? si car!amos en un campo de*inido como decimal(4?2) el alor 22.22&? se !uardar% 22.23? si car!amos 22.221 se !uardar% 22.22. Bara campos de*inidos autoNincrement el tratamiento es el si!uienteA - Basa por alto los alores *uera del ran!o? en caso de no ser Gunsi!nedG y todos los menores a 1 en caso de ser Gunsi!nedG.
- 33 -
- =i in!resamos un alor *uera de ran!o contin:a la secuencia. - =i in!resamos un alor eistente? aparece un mensa8e de error indicando ;ue el alor ya eiste. Bara campos de *echa y horaA -alores incorrectosA si intentamos almacenar un alor ;ue 0y=;l no reconoce como *echa (sea *uera de ran!o o un alor in%lido)? conierte el alor en ceros (se!:n el tipo y *ormato). Bor e8emplo? si intentamos !uardar L2UU2L en un campo de*inido de tipo GdateG? se almacena L--L. =i intentamos !uardar L2UU2 15A3L en un campo de*inido de tipo GdatetimeG? se almacena L- AAL. =i intentamos almacenar un alor in%lido en un campo de tipo GtimeG? se !uarda ceros. Bara GtimeG? si intentamos car!ar un alor *uera de ran!o? se !uarda el menor o mayor alor permitido (se!:n sea uno u otro el m%s cercano). Bara campos de cual;uier tipoA -alor GnullGA si un campo est% de*inido Gnot nullG e intentamos in!resar GnullG? aparece un mensa8e de error y la sentencia no se e8ecuta. 9os alores in%lidos para otros tipos de campos lo trataremos m%s adelante. 9*+E/*': %i&o Ialor invlido 9esultado caracter nullL not null 173 .173. caracter nullL not null ma"or lon!itud se corta caracter not null null error numMrico nullL not null .173. 0 numMrico nullL not null uera de ran!o lKmite ms cercano numMrico not null null error numMrico decimal nullL not null ms decimales que los deinidos redondea al ms cercano num# autoincr# cLsi!no nullLnot null 0 si!uiente de la secuencia num# autoincr# sLsi!no nullLnot null todos los menores a 1 si!uiente de la secuencia num# autoincr# cLs si!no null null si!uiente de la secuencia num# autoincr# cLs si!no nullLnot null valor eistente error echa uera de ran!o 0000-00-00 echa .70-0-700=. (otro orden) 0000-00-00
- 34 -
hora lKmite ms cercano echa " hora not null error
uera de ran!o null
- 35 -
22 - 5tributo deault en una columna de una tabla. =i al insertar re!istros no se especi*ica un alor para un campo? se inserta su alor por de*ecto impl$cito se!:n el tipo de dato del campo. Bor e8emploA insert into libros (titulo,autor,editorial,&recio,cantidad) values(.>ava en 10 minutos.,.>uan ere"ra.,.aidos.,7<#,100);
Como no in!resamos alor para el campo Gcodi!oG? 0y=@9 insertar% el alor por de*ecto? como Gcodi!oG es un campo GautoNincrementG? el alor por de*ecto es el si!uiente de la secuencia. =i omitimos el alor correspondiente al autorA insert into libros (titulo,editorial,&recio,cantidad) values(.>ava en 10 minutos.,.aidos.,7<#,700);
0y=@9 insertar% GnullG? por;ue el alor por de*ecto de un campo (de cual;uier tipo) ;ue acepta alores nulos? es GnullG. 9o mismo sucede si no in!resamos el alor del precioA insert into libros (titulo,autor,editorial,cantidad) values(.>ava en 10 minutos.,.>uan ere"ra.,aidos.,1<0);
0y=@9 insertar% el alor GnullG por;ue el alor por de*ecto de un campo (de cual;uier tipo) ;ue acepta alores nulos? es GnullG. =i omitimos el alor correspondiente al t$tuloA insert into libros (autor,editorial,&recio,cantidad) values (.Bor!es.,.aidos.,7<#,700);
0y=@9 !uardar% una cadena ac$a? ya ;ue ste es el alor por de*ecto de un campo de tipo cadena de*inido como Gnot nullG (no acepta alores nulos). =i omitimos el alor correspondiente a la cantidadA insert into libros (titulo,autor,editorial,&recio) values(.Nlicia a traves del es&e4o.,.8ewis Carroll.,.*mece.,3G#<);
el alor ;ue se almacenar% ser% ? por;ue el campo GprecioG es de tipo numrico Gnot nullG y el alor por de*ecto de los tipos numricos ;ue no aceptan alores nulos es . Bodemos establecer alores por de*ecto para los campos cuando creamos la tabla. Bara ello utili6amos Gde*aultG al de*inir el campo. Bor e8emplo? ;ueremos ;ue el alor por de*ecto del campo GprecioG sea 1.11 y el alor por de*ecto del campo GautorG sea GJesconocidoGA create table libros( codi!o int unsi!ned autoincrement,
- 3 -
titulo varchar(G0) not null, autor varchar(30) deault .Desconocido., &recio decimal(<,7) unsi!ned deault 1#11, cantidad int unsi!ned not null, &rimar" e" (codi!o) );
=i al in!resar un nueo re!istro omitimos los alores para el campo GautorG y GprecioG? 0y=@9 insertar% los alores por de*ecto de*inidos con la palabra clae Gde*aultGA insert into libros (titulo,editorial,cantidad) values(.>ava en 10 minutos.,.aidos.,700);
0y=@9 insertar% el re!istro con el si!uiente alor de la secuencia en Gcodi!oG? con el t$tulo? editorial y cantidad in!resados? en GautorG colocar% GJesconocidoG y en precio G1.11G. >ntonces? si al de*inir el campo eplicitamos un alor mediante la cl%usula Gde*aultG? se ser% el alor por de*ectoD sino insertar% el alor por de*ecto impl$cito se!:n el tipo de dato del campo. 9os campos de*inidos GautoNincrementG no pueden eplicitar un alor con Gde*aultG? tampoco los de tipo GblobG y GtetG. 9os alores por de*ecto impl$citos son los si!uientesA -para campos de cual;uier tipo ;ue admiten alores nulos? el alor por de*ecto GnullGD -para campos ;ue no admiten alores nulos? es decir? de*inidos Gnot nullG? el alor por de*ecto depende del tipo de datoA -para campos numricos no declarados GautoNincrementGA D -para campos numricos de*inidos GautoNincrementGA el alor si!uiente de la secuencia? comen6ando en 1D -para los tipos cadenaA cadena ac$a. hora al isuali6ar la estructura de la tabla con GdescribeG podemos entender un poco m%s lo ;ue in*orma cada columnaA describe libros;
G7ieldG contiene el nombre del campoD G#ypeG? el tipo de datoD GHF99G indica si el campo admite alores nulosD GOeyG indica si el campo est% indeado (lo eremos m%s adelante)D GJe*aultG muestra el alor por de*ecto del campo y G>traG muestra in*ormación adicional respecto al campo? por e8emplo? a;u$ indica ;ue Gcodi!oG est% de*inido GautoNincrementG. #ambin se puede utili6ar Gde*aultG para dar el alor por de*ecto a los campos en sentencias GinsertG? por e8emploA insert into libros (titulo,autor,&recio,cantidad) values (.*l !ato con botas.,deault,deault,100 botas.,deault,deault,100); );
- 3 -
- 3" -
23 - 5tributo 5tributo 6eroill en una columna de una tabla. Cual;uier campo numrico puede tener otro atributo etra G6ero*illG. G6ero*illG rellena con ceros los espacios disponibles a la i6;uierda. Bor e8emplo? creamos la tabla GlibrosG? de*iniendo los campos Gcodi!oG y GcantidadG con el atributo G6ero*illGA create table libros( codi!o int(=) eroill autoincrement, titulo varchar(G0) not null, autor varchar(30), editorial varchar(1<), &recio decimal(<,7) unsi!ned, cantidad smallint eroill, &rimar" e" (codi!o) );
Hote ;ue especi*icamos el tamaQo del tipo GintG entre parntesis para ;ue muestre por la i6;uierda ceros? cuando los alores son in*eriores al indicadoD dicho par%metro no restrin!e el ran!o de alores ;ue se pueden almacenar ni el n:mero de di!itos. l in!resar un alor de códi!o con menos ci*ras ;ue las especi*icadas ()? aparecer%n ceros a la i6;uierda rellenando los espaciosD por e8emplo? si in!resamos G33G? aparecer% G33G. l in!resar un alor para el campo GcantidadG? suceder% lo mismo. =i especi*icamos G6ero*illG a un campo numrico? se coloca autom%ticamente el atributo Gunsi!nedG. Cual;uier alor ne!atio in!resado en un campo de*inido G6ero*illG es un alor in%lido.
- 3& -
24 - Columnas calculadas. >s posible obtener salidas en las cuales una columna sea el resultado de un c%lculo y no un campo de una tabla. =i ;ueremos er los t$tulos? precio y cantidad de cada libro escribimos la si!uiente sentenciaA select titulo,&recio,cantidad rom libros;
=i ;ueremos saber el monto total en dinero de un t$tulo podemos multiplicar el precio por la cantidad por cada t$tulo? pero tambin podemos hacer ;ue 0y=@9 realice el c%lculo y lo incluya en una columna etra en la salidaA select titulo, &recio,cantidad,&recio2cantidad rom libros;
=i ;ueremos saber el precio de cada libro con un 1V de descuento podemos incluir en la sentencia los si!uientes c%lculosA select titulo, &recio,&recio20#1,&recio-(&recio20#1) rom libros;
- 4 -
2! - 7unciones para el mane8o de cadenas. '>CF>'J> ;ue H+ debe haber espacios entre un nombre de *unción y los parntesis por;ue 0y=@9 puede con*undir una llamada a una *unción con una re*erencia a una tabla o campo ;ue ten!a el mismo nombre de una *unción. 0y=@9 tiene al!unas *unciones para traba8ar con cadenas de caracteres. >stas son al!unasA -ord(caracter)A 'etorna el códi!o =CII para el caracter eniado como ar!umento. >8emploA select ord(.N.);
retorna 5. -char(?..)A retorna una cadena con los caracteres en códi!o =CII de los enteros eniados como ar!umentos. >8emploA select char(=<,==,=);
retorna G/CG. -concat(cadena1?cadena2?...)A deuele la cadena resultado de concatenar los ar!umentos. >8emploA select concat(.?ola,.,. .,.como estaO.);
retorna Gola? como estaRG. -concatNws(separador?cadena1?cadena2?...)A GwsG son las iniciales de Gwith separatorG. >l primer ar!umento especi*ica el separador ;ue utili6a para los dem%s ar!umentosD el separador se a!re!a entre las cadenas a concatenar. >8emploA select concatws(.-.,.>uan.,.edro.,.8uis.);
retorna GSuan-Bedro-9uisG. -*indNinNset(cadena?lista de cadenas)A deuele un alor entre de a n (correspondiente a la posición)? si la cadena enidada como primer ar!umento est% presente en la lista de cadenas eniadas como se!undo ar!umento. 9a lista de cadenas eniada como se!undo ar!umento es una cadena *ormada por subcadenas separadas por comas. Jeuele si no encuentra GcadenaG en la Glista de cadenasG. >8emploA select indinset(.hola.,.como esta,hola,buen dia.);
retorna 2? por;ue la cadena GholaG se encuentra en la lista de cadenas? en la posición 2. -len!th(cadena)A retorna la lon!itud de la cadena eniada como ar!umento. >8emploA select len!th(.?ola.);
deuele 4.
- 41 -
- locate(subcadena?cadena)A retorna la posición de la primera ocurrencia de la subcadena en la cadena eniadas como ar!umentos. Jeuele GG si la subcadena no se encuentra en la cadena. >8emploA select locale(.o.,.como le va.);
retorna 2. - position(subcadena in cadena)A *unciona como Glocate()G. Jeuele GG si la subcadena no se encuentra en la cadena. >8emploA select &osition(.o. in .como le va.);
retorna 2. - locate(subcadena?cadena?posicioninicial)A retorna la posición de la primera ocurrencia de la subcadena eniada como primer ar!umentos en la cadena eniada como se!undo ar!umento? empe6ando en la posición eniada como tercer ar!umento. Jeuele GG si la subcadena no se encuentra en la cadena. >8emplosA select locate(.ar.,./ar!arita.,1);
retorna 1. select locate(.ar.,./ar!arita.,3);
retorna 5. - instr(cadena?subcadena)A retorna la posición de la primera ocurrencia de la subcadena eniada como se!undo ar!umento en la cadena eniada como primer ar!umento. >8emploA select instr(.como le va.,.om.);
deuele 2. - lpad(cadena?lon!itud?cadenarelleno)A retorna la cadena eniada como primer ar!umento? rellenada por la i6;uierda con la cadena eniada como tercer ar!umento hasta ;ue la cadena retornada ten!a la lon!itud especi*icada como se!undo ar!umento. =i la cadena es m%s lar!a? la corta. >8emploA select l&ad(.hola.,10,.0.);
retorna GholaG. - rpad(cadena?lon!itud?cadenarelleno)A i!ual ;ue GlpadG ecepto ;ue rellena por la derecha. - le*t(cadena?lon!itud)A retorna la cantidad (lon!itud) de caracteres de la cadena comen6ando desde la in;uierda? primer caracter. >8emploA select let(.buenos dias.,H);
retorna Gbuenos dG. - ri!ht(cadena?lon!itud)A retorna la cantidad (lon!itud) de caracteres de la cadena comen6ando desde la derecha? :ltimo caracter. >8emploA select ri!ht(.buenos dias.,H);
retorna Gnos diasG.
- 42 -
- substrin!(cadena?posicion?lon!itud)A retorna una subcadena de tantos caracteres de lon!itud como especi*ica en tercer ar!umento? de la cadena eniada como primer ar!umento? empe6ando desde la posición especi*icada en el se!undo ar!umento. >8emploA select substrin!(.Buenas tardes.,3,<);
retorna GenasG. - substrin!(cadena *rom posicion *or lon!itud)A ariante de Gsubstrin!(cadena?posicion?lon!itud)G. >8emploA select substrin!(.Buenas tardes. rom 3 or <);
- mid(cadena?posicion?lon!itud)A i!ual ;ue Gsubstrin!(cadena?posicion?lon!itud)G. >8emploA select mid(.Buenas tardes. rom 3 or <);
retorna GenasG. - substrin!(cadena?posicion)A retorna la subcadena de la cadena eniada como ar!umento? empe6ando desde la posición indicada por el se!undo ar!umento. >8emploA select substrin!(./ar!arita.,G);
retorna G!aritaG. -substrin!(cadena *rom posicion)A ariante de Gsubstrin!(cadena?posicion)G. >8emploA select substrin!(./ar!arita. rom G);
retorna G!aritaG. -substrin!Ninde(cadena?delimitador?ocurrencia)A retorna la subcadena de la cadena eniada como ar!umento antes o despus de la GocurrenciaG de la cadena eniada como delimitador. =i GocurrenciaG es positia? retorna la subcadena anterior al delimitador (comien6a desde la i6;uierda)D si GocurrenciaG es ne!atia? retorna la subcadena posterior al delimitador (comien6a desde la derecha). >8emploA select substrin!inde( .mar!arita.,.ar.,7);
retorna Gmar!G? todo lo anterior a la se!unda ocurrencia de GarG. select substrin!inde( .mar!arita.,.ar.,-7);
retorna G!aritaG? todo lo posterior a la se!unda ocurrencia de GarG. -ltrim(cadena)A retorna la cadena con los espacios de la i6;uierda eliminados. >8emploA select ltrim(.
?ola
.);
retorna J?ola
J
. - rtrim(cadena)A retorna la cadena con los espacios de la derecha eliminados. >8emploA select rtrim(.
?ola
.);
retorna J
?olaJ
- 43 -
. -trim(WWbothXleadin!Xtrailin!Y WsubcadenaY *romY cadena)A retorna una cadena i!ual a la eniada pero eliminando la subcadena pre*i8o yUo su*i8o. =i no se indica nin!:n especi*icador (both? leadin! o trailin!) se asume GbothG (ambos). =i no se especi*ica pre*i8os o su*i8os elimina los espacios. >8emplosA select trim(.
?ola
.);
retorna LolaL. select trim (leadin! .0. rom .00hola00.);
retorna GholaG. select trim (trailin! .0. rom .00hola00.);
retorna GholaG. select trim (both .0. rom .00hola00.);
retorna GholaG. select trim (.0. rom .00hola00.);
retorna GholaG. select trim (.
hola
.);
retorna GholaG. -replace(cadena?cadenareempla6o?cadenareempla6ar)A retorna la cadena con todas las ocurrencias de la subcadena reempla6o por la subcadena a reempla6ar. >8emploA select re&lace(.#m"sql#com.,..,.w.);
retorna Gwww.mys;l.comL. -repeat(cadena?cantidad)A deuele una cadena consistente en la cadena repetida la cantidad de eces especi*icada. =i GcantidadG es menor o i!ual a cero? retorna una cadena ac$a. >8emploA select re&eat(.hola.,3);
retorna GholaholaholaG. -reerse(cadena)A deuele la cadena inirtiendo el order de los caracteres. >8emploA select reverse(.?ola.);
retorna GaloG. -insert(cadena?posicion?lon!itud?nueacadena)A retorna la cadena con la nuea cadena coloc%ndola en la posición indicada por GposicionG y elimina la cantidad de caracteres indicados por Glon!itudG. >8emploA select insert(.buenas tardes.,7,=,..);
retorna GGbtardesG. -lcase(cadena) y lower(cadena)A retornan la cadena con todos los caracteres en min:sculas. >8emploA select lower(.?8N *+%EDNnte.);
retorna Ghola estudianteG.
- 44 -
select lcase(.?8N *+%EDNnte.);
retorna Ghola estudianteG. -ucase(cadena) y upper(cadena)A retornan la cadena con todos los caracteres en may:sculas. >8emploA select u&&er(.?8N *+%EDNnte.);
retorna G+9 >=#FJIH#>G. select ucase(.?8N *+%EDNnte.);
retorna G+9 >=#FJIH#>G. -strcmp(cadena1?cadena2)A retorna si las cadenas son i!uales? -1 si la primera es menor ;ue la se!unda y 1 si la primera es mayor ;ue la se!unda. >8emploA select strcm&(.?ola.,.Chau.);
retorna 1.
- 45 -
2% - 7unciones matem$ticas. 9os operadores aritmticos son GTG?G-G?GMG y GUG. #odas las operaciones matem%ticas retornan GnullG en caso de error. >8emploA select
0y=@9 tiene al!unas *unciones para traba8ar con n:meros. ;u$ presentamos al!unas. '>CF>'J> ;ue H+ debe haber espacios entre un nombre de *unción y los parntesis por;ue 0y=@9 puede con*undir una llamada a una *unción con una re*erencia a una tabla o campo ;ue ten!a el mismo nombre de una *unción. -abs()A retorna el alor absoluto del ar!umento GG. >8emploA select abs(-70);
retorna 2. -ceilin!()A redondea hacia arriba el ar!umento GG. >8emploA select ceilin!(17#3G),
retorna 13. -*loor()A redondea hacia aba8o el ar!umento GG. >8emploA select loor(17#3G);
retorna 12. -!reatest(?y?..)A retorna el ar!umento de m%imo alor. -least(?y?...)A con dos o m%s ar!umentos? retorna el ar!umento m%s pe;ueQo. -mod(n?m)A si!ni*ica Gmódulo aritmticoGD retorna el resto de GnG diidido en GmG. >8emplosA select mod(10,3);
retorna 1. select mod(10,7);
retorna . - VA select 10P3;
retorna 1. select 10P7;
retorna . -power(?y)A retorna el alor de GG eleado a la GyG potencia. >8emploA - 4 -
select &ower(7,3);
retorna ". -rand()A retorna un alor de coma *lotante aleatorio dentro del ran!o a 1.. -round()A retorna el ar!umento GG redondeado al entero m%s cercano. >8emplosA select round(17#3G);
retorna 12. select round(17#=G);
retorna 13. -sr;t()A deuele la rai6 cuadrada del alor eniado como ar!umento. -truncate(?d)A retorna el n:mero GG? truncado a GdG decimales. =i GdG es ? el resultado no tendr% parte *raccionaria. >8emplosA select truncate(173#G<=,7);
retorna 123.45D select truncate (173#G<=,0);
retorna 123. #odas retornan null en caso de error.
- 4 -
2' - 7unciones para el uso de echa y hora. 0y=@9 tiene al!unas *unciones para traba8ar con *echas y horas. >stas son al!unasA -adddate(*echa? interal epresion)A retorna la *echa a!re!%ndole el interalo especi*icado. >8emplosA adddate(L2-1-1L?interal 25 day) retorna G2-11-4G. adddate(L2-1-1L?interal 5 month) retorna G2-3-1G. -adddate(*echa? dias)A retorna la *echa a!re!%ndole a *echa GdiasG. >8emploA adddate(L2-1-1L?25)? retorna G2-11-4G. -addtime(epresion1?epresion2)A a!re!a epresion2 a epresion1 y retorna el resultado. -currentNdateA retorna la *echa de hoy con *ormato GKKKK-00-JJG o GKKKK00JJG. -currentNtimeA retorna la hora actual con *ormato GA00A==G o G00==G. -dateNadd(*echa?interal epresion tipo) y dateNsub(*echa?interal epresion tipo)A el ar!umento G*echaG es un alor GdateG o GdatetimeG? GepresionG especi*ica el alor de interalo a ser aQadido o substra$do de la *echa indicada (puede empe6ar con G-G? para interalos ne!atios)? GtipoG indica la medida de adición o substracción. >8emploA dateNadd(L2-"-1L? interal 1 month) retorna G2&-1GD dateNadd(L2-"-1L? interal -1 day) retorna G2-&-&GD dateNsub(L2-"-1 1"A55A44L? interal 2 minute) retorna G2-"-1 1"A53A44GD dateNsub(L2-"-1 1"A55A44L? interal L2A3L minuteNsecond) retorna G2-"-1 1"A52A41G. 9os alores para GtipoG pueden serA second? minute? hour? day? month? year? minuteNsecond (minutos y se!undos)? hourNminute (horas y minutos)? dayNhour (d$as y horas)? yearNmonth (aQo y mes)? hourNsecond (hora? minuto y se!undo)? dayNminute (dias? horas y minutos)? dayNsecond(dias a se!undos). -datedi**(*echa1?*echa2)A retorna la cantidad de d$as entre *echa1 y *echa2. -dayname(*echa)A retorna el nombre del d$a de la semana de la *echa. >8emploA dayname(L2-"-1L) retorna GthursdayG. -dayo*month(*echa)A retorna el d$a del mes para la *echa dada? dentro del ran!o 1 a 31. >8emploA dayo*month(L2-"-1L) retorna 1. -dayo*wee<(*echa)A retorna el $ndice del d$a de semana para la *echa pasada como ar!umento. 9os alores de los $ndices sonA 1,domin!o? 2,lunes?... ,s%bado). >8emploA dayo*wee<(L2-"-1L) retorna 5? o sea 8uees. -dayo*year(*echa)A retorna el d$a del aQo para la *echa dada? dentro del ran!o 1 a 3. >8emploA dayo*month(L2-"-1L) retorna 222. - 4" -
-etract(tipo *rom *echa)A etrae partes de una *echa. >8emplosA etract("ear rom .700=-10-10.), retorna J700=J# etract("earmonth rom .700=-10-10 10:1<:7<.) retorna J700=10J# etract(da"minute rom .700=-10-10 10:1<:7<.) retorna J10101
9os alores para tipo pueden serA second? minute? hour? day? month? year? minuteNsecond? hourNminute? dayNhour? yearNmonth? hourNsecond (horas? minutos y se!undos)? dayNminute (d$as? horas y minutos)? dayNsecond (d$as a se!undos). -hour(hora)A retorna la hora para el dato dado? en el ran!o de a 23. >8emploA hour(L1"A25A&L) retorna G1"GD -minute(hora)A retorna los minutos de la hora dada? en el ran!o de a 5&. -monthname(*echa)A retorna el nombre del mes de la *echa dada. >8emploA monthname(L2-"-1L) retorna Gu!ustG. -month(*echa)A retorna el mes de la *echa dada? en el ran!o de 1 a 12. -now() y sysdate()A retornan la *echa y hora actuales. -periodNadd(p?n)A a!re!a GnG meses al periodo GpG? en el *ormato GKK00G o GKKKK00GD retorna un alor en el *ormato GKKKK00G. >l ar!umento GpG no es una *echa? sino un aQo y un mes. >8emploA periodNadd(L2"L?2) retorna G21G. -periodNdi**(p1?p2)A retorna el n:mero de meses entre los per$odos Gp1G y Gp2G? en el *ormato GKK00G o GKKKK00G. 9os ar!umentos de per$odo no son *echas sino un aQo y un mes. >8emploA periodNdi**(L2"L?L22L) retorna . -second(hora)A retorna los se!undos para la hora dada? en el ran!o de a 5&. -secNtoNtime(se!undos)A retorna el ar!umento Gse!undosG conertido a horas? minutos y se!undos. >8emploA secNtoNtime(&) retorna G1A3G. -timedi**(hora1?hora2)A retorna la cantidad de horas? minutos y se!undos entre hora1 y hora2. -timeNtoNsec(hora)A retorna el ar!umento GhoraG conertido en se!undos. -toNdays(*echa)A retorna el n:mero de d$a (el n:mero de d$a desde el aQo ). -wee
8emploA wee8emploA year(L-"-1L) retorna G2G.
- 4& -
- 5 -
2 - Cl$usula order by del select. Bodemos ordenar el resultado de un GselectG para ;ue los re!istros se muestren ordenados por al!:n campo? para ello usamos la cl%usula Gorder byG. Bor e8emplo? recuperamos los re!istros de la tabla GlibrosG ordenados por el t$tuloA select codi!o,titulo,autor,editorial,&recio rom libros order b" titulo;
parecen los re!istros ordenados al*abticamente por el campo especi*icado. #ambin podemos colocar el n:mero de orden del campo por el ;ue ;ueremos ;ue se ordene en lu!ar de su nombre. Bor e8emplo? ;ueremos el resultado del GselectG ordenado por GprecioGA select codi!o,titulo,autor,editorial,&recio rom libros order b" <;
Bor de*ecto? si no aclaramos en la sentencia? los ordena de manera ascendente (de menor a mayor). Bodemos ordenarlos de mayor a menor? para ello a!re!amos la palabra clae GdescGA select codi!o,titulo,autor,editorial,&recio rom libros order b" editorial desc;
#ambin podemos ordenar por arios campos? por e8emplo? por GtituloG y GeditorialGA select codi!o,titulo,autor,editorial,&recio rom libros order b" titulo, editorial;
Incluso? podemos ordenar en distintos sentidos? por e8emplo? por GtituloG en sentido ascendente y GeditorialG en sentido descendenteA select codi!o,titulo,autor,editorial,&recio rom libros order b" titulo asc, editorial desc;
Jebe aclararse al lado de cada campo? pues estas palabras claes a*ectan al campo inmediatamente anterior.
- 51 -
2 - *peradores 9óicos (and - or - not) asta el momento? hemos aprendido a establer una condición con GwhereG utili6ando operadores relacionales. Bodemos establecer m%s de una condición con la cl%usula GwhereG? para ello aprenderemos los operadores ló!icos. =on los si!uientesA -
and, si!niica J"J, or, si!niica J"LoJ, or, si!niica JoJ, not, si!niica JnoJ, invierte el resultado (), &arMntesis
9os operadores ló!icos se usan para combinar condiciones. @ueremos recuperar todos los re!istros cuyo autor sea i!ual a G/or!esG y cuyo precio no supere los 2 pesos? para ello necesitamos 2 condicionesA select 2 rom libros where (autor.Bor!es.) and (&recio570);
9os re!istros recuperados en una sentencia ;ue une 2 condiciones con el operador GandG? cumplen con las 2 condiciones. @ueremos er los libros cuyo autor sea G/or!esG yUo cuya editorial sea GBlanetaGA select 2 rom libros where autor.Bor!es. or editorial.laneta.;
>n la sentencia anterior usamos el operador GorG? indicamos ;ue recupere los libros en los cuales el alor del campo GautorG sea G/or!esG yUo el alor del campo GeditorialG sea GBlanetaG? es decir? seleccionar% los re!istros ;ue cumplan con la primera condición? con la se!unda condición o con ambas condiciones. 9os re!istros recuperados con una sentencia ;ue une 2 condiciones con el operador GorG? cumplen 1 de las condiciones o ambas. @ueremos er los libros cuyo autor sea G/or!esG o cuya editorial sea GBlanetaGA select 2 rom libros where (autor.Bor!es.) or (editorial.laneta.);
>n la sentencia anterior usamos el operador GorG? indicamos ;ue recupere los libros en los cuales el alor del campo GautorG sea G/or!esG o el alor del campo GeditorialG sea GBlanetaG? es decir? seleccionar% los re!istros ;ue cumplan con la primera condición o con la se!unda condición pero no los
- 52 -
;ue cumplan con ambas condiciones. 9os re!istros recuperados con una sentencia ;ue une 2 condiciones con el operador GorG? cumplen 1 de las condiciones? no ambas. @ueremos recuperar los libros ;ue no cumplan la condición dada? por e8emplo? a;uellos cuya editorial H+ sea GBlanetaGA select 2 rom libros where not (editorial.laneta.);
>l operador GnotG inierte el resultado de la condición a la cual antecede. 9os re!istros recuperados en una sentencia en la cual aparece el operador GnotG? no cumplen con la condición a la cual a*ecta el GH+G. 9os parntesis se usan para encerrar condiciones? para ;ue se eal:en como una sola epresión. Cuando eplicitamos arias condiciones con di*erentes operadores ló!icos (combinamos GandG? GorG) permite establecer el orden de prioridad de la ealuaciónD adem%s permite di*erenciar las epresiones m%s claramente. Bor e8emplo? las si!uientes epresiones deuelen un resultado di*erenteA select 2 rom libros where (autor.Bor!es.) or (editorial.aidos. and &recio570); select2rom libros where (autor.Bor!es. or editorial.aidos.) and (&recio570);
=i bien los parntesis no son obli!atorios en todos los casos? se recomienda utili6arlos para eitar con*usiones. >l orden de prioridad de los operadores ló!icos es el si!uienteA GnotG se aplica antes ;ue GandG y GandG antes ;ue GorG? si no se especi*ica un orden de ealuación mediante el uso de parntesis. >l orden en el ;ue se eal:an los operadores con i!ual niel de precedencia es inde*inido? por ello se recomienda usar los parntesis.
- 53 -
30 - *tros operadores relacionales (between in) emos isto los operadores relacionalesA , (i!ual)? (distinto)? (mayor)? (menor)? , (mayor o i!ual)? , (menor o i!ual)? is nullUis not null (si un alor es HF99 o no). >isten otros ;ue simpli*ican al!unas consultasA Bara recuperar de nuestra tabla GlibrosG los re!istros ;ue tienen precio mayor o i!ual a 2 y menor o i!ual a 4? usamos 2 condiciones unidas por el operador ló!ico GandGA select 2 rom libros where &recio670 and &recio5G0;
Bodemos usar GbetweenGA select 2 rom libros where &recio between 70 and G0;
GbetweenG si!ni*ica GentreG. eri!uamos si el alor de un campo dado (precio) est% entre los alores m$nimo y m%imo especi*icados (2 y 4 respectiamente). =i a!re!amos el operador GnotG antes de GbetweenG el resultado se inierte. Bara recuperar los libros cuyo autor sea LBaen6aL o L/or!esL usamos 2 condicionesA select 2 rom libros where autor.Bor!es. or autor.aena.;
Bodemos usar GinGA select 2 rom libros where autor in(.Bor!es.,.aena.);
Con GinG aeri!uamos si el alor de un campo dado (autor) est% incluido en la lista de alores especi*icada (en este caso? 2 cadenas). Bara recuperar los libros cuyo autor no sea LBaen6aL ni L/or!esL usamosA select 2 rom libros where autor56.Bor!es. and autor56.aena.;
#ambin podemos usar GinG A select 2 rom libros where autor not in (.Bor!es.,.aena.);
Con GinG aeri!uamos si el alor del campo est% incluido en la lista? con GnotG antecediendo la condición? inertimos el resultado.
- 54 -
- 55 -
31 - /:s;ueda de patrones (li
9os operadores relacionales nos permiten comparar alores numricos y cadenas de caracteres. Bero al reali6ar la comparación de cadenas? busca coincidencias de cadenas completas. Ima!inemos ;ue tenemos re!istrados estos 2 librosA *l Nle&h de Bor!es; Nntolo!ia &oetica de >#8# Bor!es;
=i ;ueremos recuperar todos los libros cuyo autor sea G/or!esG? y especi*icamos la si!uiente condiciónA select 2 rom libros where autor.Bor!es.;
sólo aparecer% el primer re!istro? ya ;ue la cadena G/or!esG no es i!ual a la cadena GS.9. /or!esG. >sto sucede por;ue el operador G,G (i!ual)? tambin el operador GG (distinto) comparan cadenas de caracteres completas. Bara comparar porciones de cadenas utili6amos los operadores Glintonces? podemos comparar tro6os de cadenas de caracteres para reali6ar consultas. Bara recuperar todos los re!istros cuyo autor conten!a la cadena G/or!esG debemos tipearA select 2 rom libros where autor lie JPBor!esPJ;
>l s$mbolo GVG (porcenta8e) reempla6a cual;uier cantidad de caracteres (incluyendo nin!:n caracter). >s un caracter comod$n. Gli
Hote ;ue el s$mbolo GVG ya no est% al comien6o? con esto indicamos ;ue el t$tulo debe tener como primera letra la GG y lue!o? cual;uier cantidad de caracteres. Bara seleccionar todos los libros ;ue no comiencen con GGA select 2 rom libros where titulo not lie .NP.;
s$ como GVG reempla6a cual;uier cantidad de caracteres? el !uión ba8o GNG reempla6a un caracter? es el otro caracter comod$n. Bor e8emplo? ;ueremos er los libros de G9ewis CarrollG pero no recordamos si se escribe GCarrollG o GCarroltG? entonces tipeamos esta condiciónA - 5 -
select 2 rom libros where autor lie JPCarrolJ;
=i necesitamos buscar un patrón en el ;ue apare6can los caracteres comodines? por e8emplo? ;ueremos er todos los re!istros ;ue comiencen con un !uión ba8o? si utili6amos LNVL? mostrar% todos los re!istros por;ue lo interpreta como Gpatrón ;ue comien6a con un caracter cual;uiera y si!ue con cual;uier cantidad de caracteresG. Jebemos utili6ar GZNVG? esto se interpreta como Lpatrón ;ue comien6a con !uión ba8o y contin:a con cual;uier cantidad de caracteresG. >s decir? si ;ueremos incluir en una b:s;ueda de patrones los caracteres comodines? debemos anteponer al caracter comod$n? la barra inertida GZG? as$ lo tomar% como caracter de b:s;ueda literal y no como comod$n para la b:s;ueda. Bara buscar el caracter literal GVG se debe colocar GZVG.
- 5 -
32 - /:s;ueda de patrones (reep) 9os operadores Gre!epG y Gnot re!epG busca patrones de modo similar a Gli
Bara buscar los autores ;ue tienen al menos una GhG o una G
Bara buscar los autores ;ue no tienen ni GhG o una G
Bara buscar los autores ;ue tienen por lo menos una de las letras de la GaG hasta la GdG? es decir? Ga?b?c?dG? usamosA select autor rom libros where autor re!e& .Qa-dR.;
Bara er los t$tulos ;ue comien6an con GG tipeamosA select titulo rom libros where titulo re!e& .SN.;
Bara er los t$tulos ;ue terminan en GBG usamosA select titulo rom libros where titulo re!e& .?T.;
Bara buscar t$tulos ;ue conten!an una GaG lue!o un caracter cual;uiera y lue!o una GeG utili6amos la si!uiente sentenciaA select titulo rom libros where titulo re!e& .a#e.;
>l punto (.) identi*ica cual;uier caracter. Bodemos mostrar los t$tulos ;ue contienen una GaG se!uida de 2 caracteres y lue!o una GeGA select titulo rom libros where titulo re!e& .a##e.;
Bara buscar autores ;ue ten!an caracteres eactamente usamosA select autor rom libros where autor re!e& .S######T.;
Bara buscar autores ;ue ten!an al menos caracteres usamosA select autor rom libros where autor re!e& .######.;
Bara buscar t$tulos ;ue conten!an 2 letras GaG usamosA - 5" -
select titulo rom libros where titulo re!e& .a#2a.;
>l asterisco indica ;ue bus;ue el caracter inmediatamente anterior? en este caso cual;uiera por;ue hay un punto.
- 5& -
33 - Contar reistros (count) >isten en 0y=@9 *unciones ;ue nos permiten contar re!istros? calcular sumas? promedios? obtener alores m%imos y m$nimos. eamos al!unas de ellas. Ima!inemos ;ue nuestra tabla GlibrosG contiene muchos re!istros. Bara aeri!uar la cantidad sin necesidad de contarlos manualmente usamos la *unción Gcount()GA select count(2) rom libros;
9a *unción Gcount()G cuenta la cantidad de re!istros de una tabla? incluyendo los ;ue tienen alor nulo. Bara saber la cantidad de libros de la editorial GBlanetaG tipeamosA select count(2) rom libros where editorial.laneta.;
#ambin podemos utili6ar esta *unción 8unto con la clausula GwhereG para una consulta m%s espec$*ica. Bor e8emplo? solicitamos la cantidad de libros ;ue contienen la cadena G/or!esGA select count(2) rom libros where autor lie .PBor!esP.;
Bara contar los re!istros ;ue tienen precio (sin tener en cuenta los ;ue tienen alor nulo)? usamos la *unción Gcount()G y en los parntesis colocamos el nombre del campo ;ue necesitamos contarA select count(&recio) rom libros;
Hote ;ue Gcount(M)G retorna la cantidad de re!istros de una tabla (incluyendo los ;ue tienen alor GnullG) mientras ;ue Gcount(precio)G retorna la cantidad de re!istros en los cuales el campo GprecioG no es nulo. Ho es lo mismo. Gcount(M)G cuenta re!istros? si en lu!ar de un asterisco colocamos como ar!umento el nombre de un campo? se contabili6an los re!istros cuyo alor en ese campo no es nulo. #en!a en cuenta ;ue no debe haber espacio entre el nombre de la *unción y el parntesis? por;ue puede con*undirse con una re*erencia a una tabla o campo. 9as si!uientes sentencias son distintasA select count(2) rom libros; select count (2) rom libros;
9a primera es correcta? la se!unda incorrecta.
- -
34 - 7unciones de arupamiento (count - ma min - sum - av) >isten en 0y=@9 *unciones ;ue nos permiten contar re!istros? calcular sumas? promedios? obtener alores m%imos y m$nimos. Ka hemos aprendido Gcount()G? eamos otras. 9a *unción Gsum()G retorna la suma de los alores ;ue contiene el campo especi*icado. Bor e8emplo? ;ueremos saber la cantidad de libros ;ue tenemos disponibles para la entaA select sum(cantidad) rom libros;
#ambin podemos combinarla con GwhereG. Bor e8emplo? ;ueremos saber cu%ntos libros tenemos de la editorial GBlanetaGA select sum(cantidad) rom libros where editorial .laneta.;
Bara aeri!uar el alor m%imo o m$nimo de un campo usamos las *unciones Gma()G y Gmin()G respectiamente. >8emplo? ;ueremos saber cu%l es el mayor precio de todos los librosA select ma(&recio) rom libros;
@ueremos saber cu%l es el alor m$nimo de los libros de G'owlin!GA select min(&recio) rom libros where autor lie .P9owlin!P.;
9a *unción a!() retorna el alor promedio de los alores del campo especi*icado. Bor e8emplo? ;ueremos saber el promedio del precio de los libros re*erentes a GBBGA select av!(&recio) rom libros where titulo lie .P?P.;
>stas *unciones se denominan G*unciones de a!rupamientoG por;ue operan sobre con8untos de re!istros? no con datos indiiduales. #en!a en cuenta ;ue no debe haber espacio entre el nombre de la *unción y el parntesis? por;ue puede con*undirse con una re*erencia a una tabla o campo. 9as si!uientes sentencias son distintasA select count(2) rom libros; select count (2) rom libros;
9a primera es correcta? la se!unda incorrecta.
- 1 -
3% - =elección de un rupo de reistros (havin) s$ como la cl%usula GwhereG permite seleccionar (o recha6ar) re!istros indiidualesD la cl%usula Ghain!G permite seleccionar (o recha6ar) un !rupo de re!istros. =i ;ueremos saber la cantidad de libros a!rupados por editorial usamos la si!uiente instrucción ya aprendidaA select editorial, count(2) rom libros !rou& b" editorial;
=i ;ueremos saber la cantidad de libros a!rupados por editorial pero considerando sólo al!unos !rupos? por e8emplo? los ;ue deuelan un alor mayor a 2? usamos la si!uiente instrucciónA select editorial, count(2) rom libros !rou& b" editorial havin! count(2)67;
=e utili6a Ghain!G? se!uido de la condición de b:s;ueda? para seleccionar ciertas *ilas retornadas por la cl%usula G!roup byG. eamos otros e8emplos. @ueremos el promedio de los precios de los libros a!rupados por editorialA select editorial, av!(&recio) rom libros !rou& b" editorial;
hora? sólo ;ueremos a;uellos cuyo promedio supere los 25 pesosA select editorial, av!(&recio) rom libros !rou& b" editorial havin! av!(&recio)67<;
>n al!unos casos es posible con*undir las cl%usulas GwhereG y Ghain!G. @ueremos contar los re!istros a!rupados por editorial sin tener en cuenta a la editorial GBlanetaG. nalicemos las si!uientes sentenciasA select editorial, count(2) rom libros where editorial56.laneta. !rou& b" editorial; select editorial, count(2) rom libros !rou& b" editorial havin! editorial56.laneta.;
mbas deuelen el mismo resultado? pero son di*erentes. 9a primera? selecciona todos los re!istros recha6ando los de editorial GBlanetaG y lue!o los a!rupa para contarlos. 9a se!unda? selecciona todos los re!istros? los a!rupa para contarlos y *inalmente recha6a la cuenta correspondiente a la editorial GBlanetaG.
- 2 -
Ho debemos con*undir la cl%usula GwhereG con la cl%usula Ghain!GD la primera establece condiciones para la selección de re!istros de un GselectGD la se!unda establece condiciones para la selección de re!istros de una salida G!roup byG. eamos otros e8emplos combinando GwhereG y Ghain!G. @ueremos la cantidad de libros? sin considerar los ;ue tienen precio nulo? a!rupados por editorial? sin considerar la editorial GBlanetaGA select editorial, count(2) rom libros where &recio is not null !rou& b" editorial havin! editorial56.laneta.;
;u$? selecciona los re!istros recha6ando los ;ue no cumplan con la condición dada en GwhereG? lue!o los a!rupa por GeditorialG y *inalmente recha6a los !rupos ;ue no cumplan con la condición dada en el Ghain!G. eneralmente se usa la cl%usula Ghain!G con *unciones de a!rupamiento? esto no puede hacerlo la cl%usula GwhereG. Bor e8emplo ;ueremos el promedio de los precios a!rupados por editorial? de a;uellas editoriales ;ue tienen m%s de 2 librosA select editorial, av!(&recio) rom libros !rou& b" editorial havin! count(2) 6 7;
Bodemos encontrar el mayor alor de los libros a!rupados por editorial y lue!o seleccionar las *ilas ;ue ten!an un alor mayor o i!ual a 3A select editorial, ma(&recio) rom libros !rou& b" editorial havin! ma(&recio)630;
>sta misma sentencia puede usarse empleando un GaliasG? para hacer re*erencia a la columna de la epresiónA select editorial, ma(&recio) as .ma"or. rom libros !rou& b" editorial havin! ma"or630;
- 3 -
3' - &eistros duplicados (distinct) Con la cl%usula GdistinctG se especi*ica ;ue los re!istros con ciertos datos duplicados sean obiadas en el resultado. Bor e8emplo? ;ueremos conocer todos los autores de los cuales tenemos libros? si utili6amos esta sentenciaA select autor rom libros;
parecen repetidos. Bara obtener la lista de autores sin repetición usamosA select distinct autor rom libros;
#ambin podemos tipearA select autor rom libros !rou& b" autor;
Hote ;ue en los tres casos anteriores aparece GnullG como un alor para GautorG[ =i sólo ;ueremos la lista de autores conocidos? es decir? no ;ueremos incluir GnullG en la lista? podemos utili6ar la sentencia si!uienteA select distinct autor rom libros where autor is not null;
Bara contar los distintos autores? sin considerar el alor GnullG usamosA select count(distinct autor) rom libros;
Hote ;ue si contamos los autores sin GdistinctG? no incluir% los alores GnullG pero si los repetidosA select count(autor) rom libros;
>sta sentencia cuenta los re!istros ;ue tienen autor. Bara obtener los nombres de las editoriales usamosA select editoriales rom libros;
Bara una consulta en la cual los nombres no se repitan tipeamosA select distinct editorial rom libros;
Bodemos saber la cantidad de editoriales distintas usamosA select count(distinct editoriales) rom libros;
Bodemos combinarla con GwhereG. Bor e8emplo? ;ueremos conocer los distintos autores de la editorial GBlanetaGA select distinct autor rom libros where editorial.laneta.;
#ambin puede utili6arse con G!roup byGA select editorial, count(distinct autor) rom libros
- 4 -
!rou& b" editorial;
Bara mostrar los t$tulos de los libros sin repetir t$tulos? usamosA select distinct titulo rom libros order b" titulo;
9a cl%usula GdistinctG a*ecta a todos los campos presentados. Bara mostrar los t$tulos y editoriales de los libros sin repetir t$tulos ni editoriales? usamosA select distinct titulo,editorial rom libros order b" titulo;
Hote ;ue los re!istros no est%n duplicados? aparecen t$tulos i!uales pero con editorial di*erente? cada re!istro es di*erente.
- 5 -
3 - 5lias Fn GaliasG se usa como nombre de un campo o de una epresión o para re*erenciar una tabla cuando se utili6an m%s de una tabla (tema ;ue eremos m%s adelante). Cuando usamos una *unción de a!rupamiento? por e8emploA select count(2) rom libros where autor lie .PBor!esP.;
la columna en la salida tiene como encabe6ado Gcount(M)G? para ;ue el resultado sea m%s claro podemos utili6ar un aliasA select count(2) as librosdebor!es rom libros where autor lie .PBor!esP.;
9a columna de la salida ahora tiene como encabe6ado el alias? lo ;ue hace m%s comprensible el resultado. Fn alias puede tener hasta 255 caracteres? acepta todos los caracteres. 9a palabra clae GasG es opcional en al!unos casos? pero es coneniente usarla. =i el alias consta de una sola cadena las comillas no son necesarias? pero si contiene m%s de una palabra? es necesario colocarla entre comillas. =e pueden utili6ar alias en las cl%sulas G!roup byG? Gorder byG? Ghain!G. Bor e8emploA select editorial as .'ombre de editorial. rom libros !rou& b" .'ombre de editorial.; select editorial, count(2) as cantidad rom libros !rou& b" editorial order b" cantidad; select editorial, count(2) as cantidad rom libros !rou& b" editorial havin! cantidad67;
Ho est% permitido utili6ar alias de campos en las cl%usulas GwhereG. 9os alias ser%n de suma importancia cuando rescate datos desde el len!ua8e BB
- -
3 - Clave primaria compuesta. 9as claes primarias pueden ser simples? *ormadas por un solo campo o compuestas? m%s de un campo. 'ecordemos ;ue una clae primaria identi*ica 1 solo re!istro en una tabla. Bara un alor del campo clae eiste solamente 1 re!istro. 9os alores no se repiten ni pueden ser nulos. 'etomemos el e8emplo de la playa de estacionamiento ;ue almacena cada d$a los datos de los eh$culos ;ue in!resan en la tabla llamada GehiculosG con los si!uientes camposA -
&atente char(=) not null, ti&o char (G), horalle!ada time not null, horasalida time,
Hecesitamos de*inir una clae primaria para una tabla con los datos descriptos arriba. Ho podemos usar la patente por;ue un mismo auto puede in!resar m%s de una e6 en el d$a a la playaD tampoco podemos usar la hora de entrada por;ue arios autos pueden in!resar a una misma hora. #ampoco siren los otros campos. Como nin!:n campo? por si solo cumple con la condición para ser clae? es decir? debe identi*icar un solo re!istro? el alor no puede repetirse? debemos usar 2 campos. Je*inimos una clae compuesta cuando nin!:n campo por si solo cumple con la condición para ser clae. >n este e8emplo? un auto puede in!resar arias eces en un d$a a la playa? pero siempre ser% a distinta hora. Fsamos 2 campos como clae? la patente 8unto con la hora de lle!ada? as$ identi*icamos un$ocamente cada re!istro. Bara establecer m%s de un campo como clae primaria usamos la si!uiente sintaisA create table vehiculos( &atente char(=) not null, ti&o char(G), horalle!ada time not null horasalida time, &rimar" e"(&atente,horalle!ada) );
Hombramos los campos ;ue *ormar%n parte de la clae separados por comas. =i emos la estructura de la tabla con GdescribeG emos ;ue en la columna G
- -
Fn campo ;ue es parte de una clae primaria puede ser autoincrementable sólo si es el primer campo ;ue compone la clae? si es secundario no se permite. >s posible eliminar un campo ;ue es parte de una clae primaria? la clae ;ueda con los campos restantes. >sto? siempre ;ue no ;ueden re!istros con clae repetida. Bor e8emplo? podemos eliminar el campo Ghoralle!adaGA alter table vehiculos dro& horalle!ada;
siempre ;ue no haya re!istros con GpatenteG duplicada? en ese caso aparece un mensa8e de error y la eliminación del campo no se reali6a. >n caso de e8ecutarse la sentencia anterior? la clae ;ueda *ormada sólo por el campo GpatenteG.
- " -
40 - Indice de una tabla. Bara *acilitar la obtención de in*ormación de una tabla se utili6an $ndices. >l indice de una tabla desempeQa la misma *unción ;ue el $ndice de un libroA permite encontrar datos r%pidamenteD en el caso de las tablas? locali6a re!istros. Fna tabla se indea por un campo (o arios). >l $ndice es un tipo de archio con 2 entradasA un dato (un alor de al!:n campo de la tabla) y un puntero. Fn $ndice posibilita el acceso directo y r%pido haciendo m%s e*iciente las b:s;uedas. =in $ndice? se debe recorrer secuencialmente toda la tabla para encontrar un re!istro. >l ob8etio de un indice es acelerar la recuperación de in*ormación. 9a desenta8a es ;ue consume espacio en el disco. 9a indeación es una tcnica ;ue optimi6a el acceso a los datos? me8ora el rendimiento acelerando las consultas y otras operaciones. >s :til cuando la tabla contiene miles de re!istros. 9os $ndices se usan para arias operacionesA - para buscar re!istros r%pidamente. - para recuperar re!istros de otras tablas empleando G8oinG. >s importante identi*icar el o los campos por los ;ue ser$a :til crear un indice? a;uellos campos por los cuales se reali6an operaciones de b:s;ueda con *recuencia. ay distintos tipos de $ndices? a saberA 1) Gprimary
- & -
pueden de*inirse arios por tabla. Bodemos darle un nombre? si no se lo damos? se coloca uno por de*ecto. #odos los $ndices pueden ser multicolumna? es decir? pueden estar *ormados por m%s de 1 campo. >n las si!uientes lecciones aprenderemos sobre cada uno de ellos. Fna tabla puede tener hasta 4 $ndices. 9os nombres de $ndices aceptan todos los caracteres y pueden tener una lon!itud m%ima de 4 caracteres. Bueden comen6ar con un d$!ito? pero no pueden tener sólo d$!itos. Fna tabla puede ser indeada por campos de tipo numrico o de tipo caracter. #ambin se puede indear por un campo ;ue conten!a alores HF99? ecepto los B'I0'K. Gshow indeG muestra in*ormación sobre los $ndices de una tabla. Bor e8emploA show inde rom libros;
- -
41 - Indice de tipo primary. >l $ndice llamado primary se crea autom%ticamente cuando establecemos un campo como clae primaria? no podemos crearlo directamente. >l campo por el cual se indea puede ser de tipo numrico o de tipo caracter. 9os alores indeados deben ser :nicos y adem%s no pueden ser nulos. Fna tabla solamente puede tener una clae primaria por lo tanto? solamente tiene un $ndice B'I0'K. Buede ser multicolumna? es decir? pueden estar *ormados por m%s de 1 campo. eamos un e8emplo de*iniendo la tabla GlibrosG con una clae primariaA create table libros( codi!o int unsi!ned autoincrement, titulo varchar(G0) not null, autor varchar(30), editorial varchar(1<), &rimar" e"(codi!o) );
Bodemos er la estructura de los $ndices de una tabla con Gshow indeG. Bor e8emploA show inde rom libros;
parece el $ndice B'I0'K creado autom%ticamente al de*inir el campo Gcodi!oG como clae primaria.
- 1 -
42 - Indice com:n (inde) Ji8imos ;ue hay 3 tipos de $ndices. asta ahora solamente conocemos la clae primaria ;ue de*inimos al momento de crear una tabla. amos a er el otro tipo de $ndice? com:n. Fn $ndice com:n se crea con GindeG? los alores no necesariamente son :nicos y aceptan alores GnullG. Buede haber arios por tabla. amos a traba8ar con nuestra tabla GlibrosG. Fn campo por el cual reali6amos consultas *recuentemente es GeditorialG? indear la tabla por ese campo ser$a :til. Creamos un $ndice al momento de crear la tablaA create table libros( codi!o int unsi!ned autoincrement, titulo varchar(G0) not null, autor varchar(30), editorial varchar(1<), &rimar" e"(codi!o), inde ieditorial (editorial) );
9ue!o de la de*inición de los campos colocamos GindeG se!uido del nombre ;ue le damos y entre parntesis el o los campos por los cuales se indear% dicho $ndice. Gshow indeG muestra la estructura de los $ndicesA show inde rom libros;
=i no le asi!namos un nombre a un $ndice? por de*ecto tomar% el nombre del primer campo ;ue *orma parte del $ndice? con un su*i8o opcional (N2?N3?...) para ;ue sea :nico. Ciertas tablas (0yI=0? InnoJ/ y /J/) soportan $ndices en campos ;ue permiten alores nulos? otras no? debiendo de*inirse el campo como Gnot nullG. =e pueden crear $ndices por arios camposA create table libros( codi!o int unsi!ned autoincrement, titulo varchar(G0) not null, autor varchar(30), editorial varchar(1<), inde itituloeditorial (titulo,editorial) );
Bara crear $ndices por m:ltiple campos se listan los campos dentro de los parntesis separados con comas. 9os alores de los $ndices se crean concatenando los alores de los campos mencionados.
- 2 -
'ecuerde ;ue GindeG es sinónimo de G
- 3 -
43 - Indice :nico (uni;ue) eamos el otro tipo de $ndice? :nico. Fn $ndice :nico se crea con Guni;ueG? los alores deben ser :nicos y di*erentes? aparece un mensa8e de error si intentamos a!re!ar un re!istro con un alor ya eistente. Bermite alores nulos y pueden de*inirse arios por tabla. Bodemos darle un nombre? si no se lo damos? se coloca uno por de*ecto. amos a traba8ar con nuestra tabla GlibrosG. Crearemos dos $ndices :nicos? uno por un solo campo y otro multicolumnaA create table libros( codi!o int unsi!ned autoincrement, titulo varchar(G0) not null, autor varchar(30), editorial varchar(1<), unique icodi!o(codi!o), unique itituloeditorial (titulo,editorial) );
9ue!o de la de*inición de los campos colocamos Guni;ueG se!uido del nombre ;ue le damos y entre parntesis el o los campos por los cuales se indear% dicho $ndice. Gshow indeG muestra la estructura de los $ndicesA show inde rom libros;
'>=F0>HA ay 3 tipos de $ndices con las si!uientes caracter$sticasA %i&o 'ombre alabra clave Ialores Unicos Nce&ta null Cantidad &or tabla clave &rimaria 9/N9 no +i 'o 1 comUn darlo o &or deecto JindeJ o Je"J 'o +i varios Unico darlo o &or deecto JuniqueJ +i +i varios
- 4 -
44 - /orrar indice (drop inde) Bara eliminar un $ndice usamos Gdrop indeG. >8emploA dro& inde ieditorial on libros; dro& inde itituloeditorial on libros;
=e elimina el $ndice con Gdrop indeG se!uido de su nombre y GonG se!uido del nombre de la tabla a la cual pertenece. Bodemos eliminar los $ndices creados con GindeG y con Guni;ueG pero no el ;ue se crea al de*inir una clae primaria. Fn $ndice B'I0'K se elimina autom%ticamente al eliminar la clae primaria (tema ;ue eremos m%s adelante).
- 5 -
4! - Creación de #ndices a tablas eistentes (create inde) Bodemos a!re!ar un $ndice a una tabla eistente. Bara a!re!ar un $ndice com:n a la tabla GlibrosG tipeamosA create inde ieditorial on libros (editorial);
>ntonces? para a!re!ar un $ndice com:n a una tabla eistente usamos Gcreate indeG? indicamos el nombre? sobre ;u tabla y el o los campos por los cuales se indear%? entre parntesis. Bara a!re!ar un $ndice :nico a la tabla GlibrosG tipeamosA create unique inde itituloeditorial on libros (titulo,editorial);
Bara a!re!ar un $ndice :nico a una tabla eistente usamos Gcreate uni;ue indeG? indicamos el nombre? sobre ;u tabla y entre parntesis? el o los campos por los cuales se indear%. Fn $ndice B'I0'K no puede a!re!arse? se crea autom%ticamente al de*inir una clae primaria.
- -
4% - Cl$usula limit del comando select. 9a cl%usula GlimitG se usa para restrin!ir los re!istros ;ue se retornan en una consulta GselectG. 'ecibe 1 ó 2 ar!umentos numricos enteros positiosD el primero indica el n:mero del primer re!istro a retornar? el se!undo? el n:mero m%imo de re!istros a retornar. >l n:mero de re!istro inicial es (no 1). =i el se!undo ar!umento supera la cantidad de re!istros de la tabla? se limita hasta el :ltimo re!istro. >8emploA select 2 rom libros limit 0,G;
0uestra los primeros 4 re!istros? ?1?2 y 3. =i tipeamosA select 2 rom libros limit <,G;
recuperamos 4 re!istros? desde el 5 al ". =i se coloca un solo ar!umento? indica el m%imo n:mero de re!istros a retornar? comen6ando desde . >8emploA select 2 rom libros limit H;
0uestra los primeros " re!istros. Bara recuperar los re!istros desde cierto n:mero hasta el *inal? se puede colocar un n:mero !rande para el se!undo ar!umentoA select 2 rom libros limit =,10000;
recupera los re!istros al :ltimo. GlimitG puede combinarse con el comando GdeleteG. =i ;ueremos eliminar 2 re!istros de la tabla GlibrosG FsamosA delete rom libros limit 7;
Bodemos ordenar los re!itros por precio (por e8emplo) y borrar 2A delete rom libros order b" &recio limit 7;
esta sentencia borrar% los 2 primeros re!istros? es decir? los de precio m%s ba8o. Bodemos emplear la cl%usula GlimitG para eliminar re!istros duplicados. Bor e8emplo? continuamos con la tabla GlibrosG de una librer$a? ya hemos almacenado el libro G>l alephG de G/or!esG de la editorial GBlanetaG? pero nos e;uiocamos y olemos a in!resar el mismo libro? del mismo autor y editorial 2 - -
eces m%s? es un error ;ue no controla 0y=@9. Bara eliminar el libro duplicado y ;ue sólo ;uede un re!istro de l emos cu%ntos tenemosA select 2 rom libros where titulo.*l ale&h. and autor.Bor!es. and editorial.laneta.;
9ue!o eliminamos con GlimitG la cantidad sobrante (tenemos 3 y ;ueremos solo 1)A delete rom libros where titulo.*l ale&hJ and autor.Bor!es. and editorial.laneta. limit 7;
Fn mensa8e nos muestra la cantidad de re!istros eliminados. >s decir? con GlimitG indicamos la cantidad a eliminar. eamos cu%ntos hay ahoraA select 2 rom libros where titulo.*l ale&hJ and autor.Bor!es. and editorial.laneta.;
=ólo ;ueda 1.
- " -
4' - &ecuperación de reistros en orma aleatoria(rand) Fna librer$a ;ue tiene almacenados los datos de sus libros en una tabla llamada GlibrosG ;uiere donar a una institución 5 libros tomados al a6ar. Bara recuperar de una tabla re!istros aleatorios se puede utili6ar la *unción Grand()G combinada con Gorder byG y GlimitGA select 2 rom libros order b" rand() limit <;
Hos deuele 5 re!istros tomados al a6ar de la tabla GlibrosG. Bodemos e8ecutar la sentencia anterior arias eces se!uidas y eremos ;ue los re!istros recuperados son di*erentes en cada ocasión.
- & -
4 - &empla6ar reistros (replace) GreplaceG reempla6a un re!istro por otro. Cuando intentamos in!resar con GinsertG un re!istro ;ue repite el alor de un campo clae o indeado con $ndice :nico? aparece un mensa8e de error indicando ;ue el alor est% duplicado. =i empleamos GreplaceG en lu!ar de GinsertG? el re!istro eistente se borra y se in!resa el nueo? de esta manera no se duplica el alor :nico. =i tenemos la tabla GlibrosG con el campo Gcodi!oG establecido como clae primaria e intentamos in!resar (GinsertG) un alor de códi!o eistente? aparece un mensa8e de error por;ue no est% permitido repetir los alores del campo clae. =i empleamos GreplaceG en lu!ar de GinsertG? la sentencia se e8ecuta reempla6ando el re!istro con el alor de códi!o eistente por el nueo re!istro. eamos un e8emplo. #enemos los si!uientes re!istros almacenados en GlibrosGA codi!o titulo autor editorial &recio 10 Nlicia en ## 8ewis Carroll *mece 1<#G 1< N&renda ? /ario /olina laneta G<#H 73 *l ale&h Bor!es laneta 73#0
Intentamos insertar un re!istro con alor de clae repetida (códi!o 23)A insert into libros values(73,.>ava en 10 minutos.,./ario /olina.,.*mece.,7<#<);
parece un mensa8e de error indicando ;ue hay re!istros duplicados. =i empleamos GreplaceGA re&lace into libros values(73,.>ava en 10 minutos.,./ario /olina.,.*mece.,7<#<);
la sentencia se e8ecuta y aparece un mensa8e indicando ;ue se a*ectaron 2 *ilas? esto es por;ue un re!istro se eliminó y otro se insertó. GreplaceG *unciona como GinsertG en los si!uientes casosA - si los datos in!resados no a*ectan al campo :nico? es decir no se in!resa alor para el campo indeadoA re&lace into libros(titulo,autor,editorial,&recio) values(.Cervantes " el qui4ote.,.Bor!es.,.aidos.,7H);
aparece un mensa8e indicando ;ue se a*ectó un solo re!istro? el in!resado? ;ue se !uarda con alor de códi!o . - si el dato para el campo indeado ;ue se in!resa no eisteA re&lace into libros values(30,./atematica estas ahi.,.aena.,.aidos.,17#H);
aparece un mensa8e indicando ;ue se a*ectó solo una *ila? no hubo reempla6o por;ue el códi!o no eist$a antes de la nuea inserción.
- " -
- si la tabla no tiene indeación. =i la tabla GlibrosG no tuiera establecida nin!una clae primaria (ni $ndice :nico)? podr$amos in!resar arios re!istros con i!ual códi!oA re&lace into libros values(1,.?arr" otter "a la &iedra ilosoal.,.?awin!.,.*mece.,GH);
aparecer$a un mensa8e indicando ;ue se a*ectó 1 re!istro (el in!resado)? no se reempla6ó nin!uno y ahora habr$a 2 libros con códi!o 1.
- "1 -
4 - 5rear campos a una tabla (alter table add) Bara modi*icar la estructura de una tabla eistente? usamos Galter tableG. Galter tableG se usa paraA - a!re!ar nueos campos? - eliminar campos eistentes? - modi*icar el tipo de dato de un campo? - a!re!ar o ;uitar modi*icadores como GnullG? Gunsi!nedG? GautoNincrementG? - cambiar el nombre de un campo? - a!re!ar o eliminar la clae primaria? - a!re!ar y eliminar $ndices? - renombrar una tabla. Galter tableG hace una copia temporal de la tabla ori!inal? reali6a los cambios en la copia? lue!o borra la tabla ori!inal y renombra la copia. prenderemos a a!re!ar campos a una tabla. Bara ello utili6amos nuestra tabla GlibrosG? de*inida con la si!uiente estructuraA -
c@di!o, int unsi!ned autoincrement, clave &rimaria, titulo, varchar(G0) not null, autor, varchar(30), editorial, varchar (70), &recio, decimal(<,7) unsi!ned#
Hecesitamos a!re!ar el campo GcantidadG? de tipo smallint unsi!ned not null? tipeamosA alter table libros add cantidad smallint unsi!ned not null;
Fsamos Galter tableG se!uido del nombre de la tabla y GaddG se!uido del nombre del nueo campo con su tipo y los modi*icadores. !re!uemos otro campo a la tablaA alter table libros add edicion date;
- "2 -
=i intentamos a!re!ar un campo con un nombre eistente? aparece un mensa8e de error indicando ;ue el campo ya eiste y la sentencia no se e8ecuta. Cuando se a!re!a un campo? si no especi*icamos? lo coloca al *inal? despus de todos los campos eistentesD podemos indicar su posición (lue!o de ;u campo debe aparecer) con Ga*terGA alter table libros add cantidad tin"int unsi!ned ater autor;
- "3 -
!0 - >liminar campos de una tabla (alter table - drop) Galter tableG nos permite alterar la estructura de la tabla? podemos usarla para eliminar un campo. Continuamos con nuestra tabla GlibrosG. Bara eliminar el campo GedicionG tipeamosA alter table libros dro& edicion;
>ntonces? para borrar un campo de una tabla usamos Galter tableG 8unto con GdropG y el nombre del campo a eliminar. =i intentamos borrar un campo ineistente aparece un mensa8e de error y la acción no se reali6a. Bodemos eliminar 2 campos en una misma sentenciaA alter table libros dro& editorial, dro& cantidad;
=i se borra un campo de una tabla ;ue es parte de un $ndice? tambin se borra el $ndice. =i una tabla tiene sólo un campo? ste no puede ser borrado. ay ;ue tener cuidado al eliminar un campo? ste puede ser clae primaria. >s posible eliminar un campo ;ue es clae primaria? no aparece nin!:n mensa8eA alter table libros dro& codi!o;
=i eliminamos un campo clae? la clae tambin se elimina.
- "4 -
!1 - odiicar campos de una tabla (alter table - modiy) Con Galter tableG podemos modi*icar el tipo de al!:n campo incluidos sus atributos. Continuamos con nuestra tabla GlibrosG? de*inida con la si!uiente estructuraA -
c@di!o, int unsi!ned, titulo, varchar(30) not null, autor, varchar(30), editorial, varchar (70), &recio, decimal(<,7) unsi!ned, cantidad int unsi!ned#
@ueremos modi*icar el tipo del campo GcantidadG? como !uardaremos alores ;ue no superar%n los 5 usaremos smallint unsi!ned? tipeamosA alter table libros modi" cantidad smallint unsi!ned;
Fsamos Galter tableG se!uido del nombre de la tabla y Gmodi*yG se!uido del nombre del nueo campo con su tipo y los modi*icadores. @ueremos modi*icar el tipo del campo GtituloG para poder almacenar una lon!itud de 4 caracteres y ;ue no permita alores nulos? tipeamosA alter table libros modi" titulo varchar(G0) not null;
ay ;ue tener cuidado al alterar los tipos de los campos de una tabla ;ue ya tiene re!istros car!ados. =i tenemos un campo de teto de lon!itud 5 y lo cambiamos a 3 de lon!itud? los re!istros car!ados en ese campo ;ue superen los 3 caracteres? se cortar%n. I!ualmente? si un campo *ue de*inido permitiendo alores nulos? se car!aron re!istros con alores nulos y lue!o se lo de*ine Gnot nullG? todos los re!istros con alor nulo para ese campo cambiar%n al alor por de*ecto se!:n el tipo (cadena ac$a para tipo teto y para numricos)? ya ;ue GnullG se conierte en un alor in%lido. =i de*inimos un campo de tipo decimal(5?2) y tenemos un re!istro con el alor G&.G y lue!o modi*icamos el campo a Gdecimal(4?2)G? el alor G&.G se conierte en un alor in%lido para el tipo? entonces !uarda en su lu!ar? el alor l$mite m%s cercano? G&&.&&G. =i intentamos de*inir GautoNincrementG un campo ;ue no es clae primaria? aparece un mensa8e de error indicando ;ue el campo debe ser clae primaria. Bor e8emploA alter table libros modi" codi!o int unsi!ned autoincrement;
- "5 -
Galter tableG combinado con Gmodi*yG permite a!re!ar y ;uitar campos y atributos de campos. Bara modi*icar el alor por de*ecto (Gde*aultG) de un campo podemos usar tambin Gmodi*yG pero debemos colocar el tipo y sus modi*icadores? entonces resulta muy etenso? podemos setear sólo el alor por de*ecto con la si!uienmte sintaisA alter table libros alter autor set deault .Iarios.;
Bara eliminar el alor por de*ecto podemos emplearA alter table libros alter autor dro& deault;
- " -
!2 - Cambiar el nombre de un campo de una tabla (alter table - chane) Con Galter tableG podemos cambiar el nombre de los campos de una tabla. Continuamos con nuestra tabla GlibrosG? de*inida con la si!uiente estructuraA - códi!o? int unsi!ned autoNincrement? - nombre? archar(4)? - autor? archar(3)? - editorial? archar (2)? - costo? decimal(5?2) unsi!ned? - cantidad int unsi!ned? - clae primariaA códi!o. @ueremos cambiar el nombre del campo GcostoG por GprecioG? tipeamosA alter table libros chan!e costo &recio decimal (<,7);
Fsamos Galter tableG se!uido del nombre de la tabla y Gchan!eG se!uido del nombre actual y el nombre nueo con su tipo y los modi*icadores. Con Gchan!eG cambiamos el nombre de un campo y tambin podemos cambiar el tipo y sus modi*icadores. Bor e8emplo? ;ueremos cambiar el nombre del campo GnombreG por GtituloG y rede*inirlo como Gnot nullG? tipeamosA alter table libros chan!e nombre titulo varchar(G0) not null;
- " -
!3 - 5rear y eliminar la clave primaria (alter table) asta ahora hemos aprendido a de*inir una clae primaria al momento de crear una tabla. Con Galter tableG podemos a!re!ar una clae primaria a una tabla eistente. Continuamos con nuestra tabla GlibrosG? de*inida con la si!uiente estructuraA -
c@di!o, int unsi!ned autoincrement, titulo, varchar(G0), autor, varchar(30), editorial, varchar (70), &recio, decimal(<,7) unsi!ned, cantidad smallint unsi!ned#
Bara a!re!ar una clae primaria a una tabla eistente usamosA alter table libros add &rimar" e" (codi!o);
Fsamos Galter tableG con Gadd primary
Con Galter tableG y Gdrop primary /> ser clae primaria. Brimero se debe modi*icar el campo ;uit%ndole el atributo GautoNincrementG y lue!o se podr% eliminar la clae.
- "" -
=i intentamos establecer como clae primaria un campo ;ue tiene alores repetidos? aparece un mensa8e de error y la operación no se reali6a.
- "& -
!4 - 5rear #ndices(alter table - add inde) prendimos a crear $ndices al momento de crear una tabla. #ambin a crearlos lue!o de haber creado la tabla? con Gcreate indeG. #ambin podemos a!re!arlos a una tabla usando Galter tableG. Creamos la tabla GlibrosGA create table libros( codi!o int unsi!ned, titulo varchar(G0), autor varchar(30), editorial varchar (70), &recio decimal(<,7) unsi!ned, cantidad smallint unsi!ned );
Bara a!re!ar un $ndice com:n por el campo GeditorialG usamos la si!uiente sentenciaA alter table libros add inde ieditorial (editorial);
Fsamos Galter tableG 8unto con Gadd indeG se!uido del nombre ;ue le daremos al $ndice y entre parntesis el nombre de el o los campos por los cuales se indear%. Bara a!re!ar un $ndice :nico multicampo? por los campos GtituloG y GeditorialG? usamos la si!uiente sentenciaA alter table libros add unique inde itituloeditorial (titulo,editorial);
Fsamos Galter tableG 8unto con Gadd uni;ue indeG se!uido del nombre ;ue le daremos al $ndice y entre parntesis el nombre de el o los campos por los cuales se indear%. >n ambos casos? para $ndices comunes o :nicos? si no colocamos nombre de $ndice? se coloca uno por de*ecto? como cuando los creamos 8unto con la tabla.
- & -
!! - /orrado de #ndices (alter table - drop inde) 9os $ndices com:n y :nicos se eliminan con Galter tableG. #raba8amos con la tabla GlibrosG de una librer$a? ;ue tiene los si!uientes campos e $ndicesA create table libros( codi!o int unsi!ned autoincrement, titulo varchar(G0) not null, autor varchar(30), editorial varchar(1<), &rimar" e"(codi!o), inde ieditorial (editorial), unique itituloeditorial (titulo,editorial) );
Bara eliminar un $ndice usamos la si!uiente sintaisA alter table libros dro& inde ieditorial;
Fsamos Galter tableG y Gdrop indeG se!uido del nombre del $ndice a borrar. Bara eliminar un $ndice :nico usamos la misma sintaisA alter table libros dro& inde itituloeditorial;
- &1 -
!% - renombrar tablas (alter table - rename rename table) Bodemos cambiar el nombre de una tabla con Galter tableG. Bara cambiar el nombre de una tabla llamada Gami!osG por GcontactosG usamos esta sintaisA alter table ami!os rename contactos;
>ntonces usamos Galter tableG se!uido del nombre actual? GrenameG y el nueo nombre. #ambin podemos cambiar el nombre a una tabla usando la si!uiente sintaisA rename table ami!os to contactos;
9a renombración se hace de i6;uierda a derecha? con lo cual? si ;ueremos intercambiar los nombres de dos tablas? debemos tipear lo si!uienteA rename table ami!os to auiliar, contactos to ami!os, auiliar to contactos;
- &2 -
!' - "ipo de dato enum. dem%s de los tipos de datos ya conocidos? eisten otros ;ue anali6aremos ahora? los tipos GenumG y GsetG. >l tipo de dato GenumG representa una enumeración. Buede tener un m%imo de 5535 alores distintos. >s una cadena cuyo alor se eli!e de una lista enumerada de alores permitidos ;ue se especi*ica al de*inir el campo. Buede ser una cadena ac$a? incluso GnullG. 9os alores presentados como permitidos tienen un alor de $ndice ;ue comien6a en 1. Fna empresa necesita personal? arias personas se han presentado para cubrir distintos car!os. 9a empresa almacena los datos de los postulantes a los puestos en una tabla llamada GpostulantesG. 9e interesa? entre otras cosas? conocer los estudios ;ue tiene cada persona? si tiene estudios primario? secundario? terciario? uniersitario o nin!uno. Bara ello? crea un campo de tipo GenumG con esos alores. Bara de*inir un campo de tipo GenumG usamos la si!uiente sintais al crear la tablaA create table &ostulantes( numero int unsi!ned autoincrement, documento char(H), nombre varchar(30), estudios enum(.nin!uno.,.&rimario.,.secundario., .terciario.,.universitario.), &rimar" e"(numero) );
9os alores presentados deben ser cadenas de caracteres. =i un GenumG permite alores nulos? el alor por de*ecto el GnullGD si no permite alores nulos? el alor por de*ecto es el primer alor de la lista de permitidos. =i se in!resa un alor numrico? lo interpreta como $ndice de la enumeración y almacena el alor de la lista con dicho n:mero de $ndice. Bor e8emploA insert into &ostulantes (documento,nombre,estudios) values(.777<<7=<.,.>uana ere"ra.,<);
>n el campo GestudiosG almacenar% GuniersitarioG ;ue es alor de $ndice 5. =i se in!resa un alor in%lido? puede ser un alor no presente en la lista o un alor de $ndice *uera de ran!o? coloca una cadena ac$a. Bor e8emploA insert into &ostulantes (documento,nombre,estudios) values(.777<<7=<.,.>uana ere"ra.,0); insert into &ostulantes (documento,nombre,estudios) values(.777<<7=<.,.>uana ere"ra.,=); insert into &ostulantes (documento,nombre,estudios)
- &3 -
values(.777<<7=<.,.>uana ere"ra.,.ostrado.);
>n los 3 casos !uarda una cadena ac$a? en los 2 primeros por;ue los $ndices in!resados est%n *uera de ran!o y en el tercero por;ue el alor no est% incluido en la lista de permitidos. >sta cadena ac$a de error? se di*erencia de una cadena ac$a permitida por;ue la primera tiene el alor de $ndice D entonces? podemos seleccionar los re!istros con alores in%lidos en el campo de tipo GenumG as$A select 2 rom &ostulantes where estudios0;
>l $ndice de un alor GnullG es GnullG. Bara seleccionar re!istros con un alor espec$*ico de un campo enumerado usamos GwhereG? por e8emplo? ;ueremos todos los postulantes con estudios uniersitariosA select 2 rom &ostulantes where estudios.universitario.;
9os tipos GenumG aceptan cl%usula Gde*aultG. =i el campo est% de*inido como Gnot nullG e intenta almacenar el alor GnullG aparece un mensa8e de error y la sentencia no se e8ecuta. 9os bytes de almacenamiento del tipo GenumG depende del n:mero de alores enumerados.
- &4 -
! - "ipo de dato set. >l tipo de dato GsetG representa un con8unto de cadenas. Buede tener 1 ó m%s alores ;ue se eli!en de una lista de alores permitidos ;ue se especi*ican al de*inir el campo y se separan con comas. Buede tener un m%imo de 4 miembros. >8emploA un campo de*inido como set (LaL? LbL) not null? permite los alores LaL? LbL y La?bL. =i car!a un alor no incluido en el con8unto GsetG? se i!nora y almacena cadena ac$a. >s similar al tipo GenumG ecepto ;ue puede almacenar m%s de un alor en el campo. Fna empresa necesita personal? arias personas se han presentado para cubrir distintos car!os. 9a empresa almacena los datos de los postulantes a los puestos en una tabla llamada GpostulantesG. 9e interesa? entre otras cosas? saber los distintos idiomas ;ue conoce cada personaD para ello? crea un campo de tipo GsetG en el cual !uardar% los distintos idiomas ;ue conoce cada postulante. Bara de*inir un campo de tipo GsetG usamos la si!uiente sintaisA create table &ostulantes( numero int unsi!ned autoincrement, documento char(H), nombre varchar(30), idioma set(.in!les.,.italiano.,.&ortu!es.), &rimar" e"(numero) );
In!resamos un re!istroA insert into &ostulantes (documento,nombre,idioma) values(.77<<
Bara in!resar un alor ;ue conten!a m%s de un elemento del con8unto? se separan por comas? por e8emploA insert into &ostulantes (documento,nombre,idioma) values(.73<<uana ere"ra.,.in!les,italiano.);
Ho importa el orden en el ;ue se inserten? se almacenan en el orden ;ue han sido de*inidos? por e8emplo? si in!resamosA insert into &ostulantes (documento,nombre,idioma) values(.73<<uana ere"ra.,.italiano,in!les.);
en el campo GidiomaG !uardar% Lin!les?italianoL. #ampoco importa si se repite al!:n alor? cada elemento repetido? se i!nora y se !uarda una e6 y en el orden ;ue ha sido de*inido? por e8emplo? si in!resamosA insert into &ostulantes (documento,nombre,idioma) values(.73<<uana ere"ra.,.italiano,in!les,italiano.);
- &5 -
en el cam&o JidiomaJ !uardar .in!les,italiano.#
=i in!resamos un alor ;ue no est% en la lista GsetG? se i!nora y se almacena una cadena ac$a? por e8emploA insert into &ostulantes (documento,nombre,idioma) values(.777<<7=<.,.>uana ere"ra.,.rances.);
=i un GsetG permite alores nulos? el alor por de*ecto es GnullGD si no permite alores nulos? el alor por de*ecto es una cadena ac$a. =i se in!resa un alor de $ndice *uera de ran!o? coloca una cadena ac$a. Bor e8emploA insert into &ostulantes (documento,nombre,idioma) values(.777<<7=<.,.>uana ere"ra.,0); insert into &ostulantes (documento,nombre,idioma) values(.777<<7=<.,.>uana ere"ra.,H);
=i se in!resa un alor numrico? lo interpreta como $ndice de la enumeración y almacena el alor de la lista con dicho n:mero de $ndice. 9os alores de $ndice se de*inen en el si!uiente orden? en este e8emploA 1.in!les., 7.italiano., 3.in!les,italiano., G.&ortu!ues., <.in!les,&ortu!ues., =.italiano,&ortu!ues., .in!les,italiano,&ortu!ues.#
In!resamos al!unos re!istros con alores de $ndiceA insert into &ostulantes (documento,nombre,idioma) values(.777<<7=<.,.>uana ere"ra.,7); insert into &ostulantes (documento,nombre,idioma) values(.77<<uana ere"ra.,3);
>n el campo GidiomaG? con la primera inserción se almacenar% GitalianoG ;ue es alor de $ndice 2 y con la se!unda inserción? Gin!les?italianoG ;ue es el alor con $ndice 3. Bara b:s;uedas de alores en campos GsetG se utili6a el operador Gli
2 rom &ostulantes idioma lie .Pin!lesP.; 2 rom &ostulantes indinset(.in!les.,idioma)60;
9a *unción G*indNinNset()G retorna si el primer ar!umento (cadena) no se encuentra en el campo set colocado como se!undo ar!umento. >sta *unción no *unciona correctamente si el primer ar!umento contiene una coma. Bara recuperar todos los alores ;ue incluyan Gin!les?italianoG tipeamosA select 2 rom &ostulantes where idioma lie .Pin!les,italianoP.;
- & -
Bara reali6ar b:s;uedas? es importante respetar el orden en ;ue se presentaron los alores en la de*inición del campoD por e8emplo? si se busca el alor Gitaliano?in!lesG en lu!ar de Gin!les?italianoG? no retornar% re!istros. Bara buscar re!istros ;ue conten!an sólo el primer miembro del con8unto GsetG usamosA select 2 rom &ostulantes where idioma.in!les.;
#ambin podemos buscar por el n:mero de $ndiceA select 2 rom &ostulantes where idioma1;
Bara buscar los re!istros ;ue conten!an el alor Gin!les?italianoG podemos utili6ar cual;uiera de las si!uientes sentenciasA select where select where
2 rom &ostulantes idioma.in!les,italiano.; 2 rom &ostulantes idioma3;
#ambin podemos usar el operador GnotG. Bara recuperar todos los alores ;ue no conten!an la cadena Gin!lesG podemos usar cual;uiera de las si!uientes sentenciasA select where select where
2 rom &ostulantes idioma not lie .Pin!lesP.; 2 rom &ostulantes not indinset(.in!les.,idioma)60;
9os tipos GsetG admiten cl%usula Gde*aultG. 9os bytes de almacenamiento del tipo GsetG depende del n:mero de miembros? se calcula as$A (cantidad de miembrosT)U" bytesD entonces puede ser 1?2?3?4 u " bytes.
- & -
%0 - 7unciones de control de lu8o (i) #raba8amos con las tablas GlibrosG de una librer$a. Ho nos interesa el precio eacto de cada libro? sino si el precio es menor o mayor a \5. Bodemos utili6ar estas sentenciasA select titulo rom libros where &recio5<0; select titulo rom libros where &recio 6<0;
>n la primera sentencia mostramos los libros con precio menor a 5 y en la se!unda los dem%s. #ambin podemos usar la *unción Gi*G. Gi*G es una *unción a la cual se le en$an 3 ar!umentosA el se!undo y tercer ar!umento corresponden a los alores ;ue retornar% en caso ;ue el primer ar!umento (una epresión de comparación) sea GerdaderoG o G*alsoGD es decir? si el primer ar!umento es erdadero? retorna el se!undo ar!umento? sino retorna el tercero. eamos el e8emploA select titulo, i (&recio6<0,.caro.,.economico.) rom libros;
=i el precio del libro es mayor a 5 (primer ar!umento del Gi*G)? coloca GcaroG (se!undo ar!umento del Gi*G)? en caso contrario coloca GeconomicoG (tercer ar!umento del Gi*G). eamos otros e8emplos. @ueremos mostrar los nombres de los autores y la cantidad de libros de cada uno de ellosD para ello especi*icamos el nombre del campo a mostrar (GautorG)? contamos los libros con GautorG conocido con la *unción Gcount()G y a!rupamos por nombre de autorA select autor, count(2) rom libros !rou& b" autor;
>l resultado nos muestra cada autor y la cantidad de libros de cada uno de ellos. =i solamente ;ueremos mostrar los autores ;ue tienen m%s de 1 libro? es decir? la cantidad mayor a 1? podemos usar esta sentenciaA select autor, count(2) rom libros !rou& b" autor havin! count(2)61;
- &" -
Bero si no ;ueremos la cantidad eacta sino solamente saber si cada autor tiene m%s de 1 libro? podemos usar Gi*GA select autor, i (count(2)61,./s de 1.,.1.) rom libros !rou& b" autor;
=i la cantidad de libros de cada autor es mayor a 1 (primer ar!umento del Gi*G)? coloca G0%s de 1G (se!undo ar!umento del Gi*G)? en caso contrario coloca G1G (tercer ar!umento del Gi*G). @ueremos saber si la cantidad de libros por editorial supera los 4 o noA select editorial, i (count(2)6G,.< o ms.,.menos de <.) as cantidad rom libros !rou& b" editorial order b" cantidad;
=i la cantidad de libros de cada editorial es mayor a 4 (primer ar!umento del Gi*G)? coloca G5 o m%sG (se!undo ar!umento del Gi*G)? en caso contrario coloca Gmenos de 5G (tercer ar!umento del Gi*G).
- && -
%1 - 7unciones de control de lu8o (case) 9a *unción GcaseG es similar a la *unción Gi*G? sólo ;ue se pueden establecer arias condiciones a cumplir. #raba8emos con la tabla GlibrosG de una librer$a. @ueremos saber si la cantidad de libros de cada editorial es menor o mayor a 1? tipeamosA select editorial, i (count(2)61,./as de 7.,.1.) as .cantidad. rom libros !rou& b" editorial;
emos los nombres de las editoriales y una columna GcantidadG ;ue especi*ica si hay m%s o menos de uno. Bodemos obtener la misma salida usando un GcaseGA select editorial, case count(2) when 1 then 1 else .mas de 1. end as .cantidad. rom libros !rou& b" editorial;
Bor cada alor hay un GwhenG y un GthenGD si encuentra un alor coincidente en al!:n GwhereG e8ecuta el GthenG correspondiente a ese GwhereG? si no encuentra nin!una coincidencia? se e8ecuta el GelseG? si no hay parte GelseG retorna GnullG. 7inalmente se coloca GendG para indicar ;ue el GcaseG ha *inali6ado. >ntonces? la sintais esA case when ### else
then end
=e puede obiar la parte GelseGA select editorial, case count(2) when 1 then 1 end as .cantidad. rom libros !rou& b" editorial;
Con el Gi*G solamente podemos obtener dos salidas? cuando la condición resulta erdadera y cuando es *alsa? si ;ueremos m%s opciones podemos usar GcaseG. amos a etender el GcaseG anterior para mostrar distintos mensa8esA select editorial, case count(2) when 1 then 1 when 7 then 7
- 1 -
when 3 then 3 else ./s de 3. end as .cantidad. rom libros !rou& b" editorial;
Incluso podemos a!re!ar una cl%usula Gorder byG y ordenar la salida por la columna GcantidadGA select editorial, case count(2) when 1 then 1 when 7 then 7 when 3 then 3 else ./s de 3. end as .cantidad. rom libros !rou& b" editorial order b" cantidad;
9a di*erencia con Gi*G es ;ue el GcaseG toma alores puntuales? no epresiones. 9a si!uiente sentencia proocar% un errorA select editorial, case count(2) when 1 then 1 when 61 then .mas de 1. end as .cantidad. rom libros !rou& b" editorial;
Bero eiste otra sintais de GcaseG ;ue permite condicionesA case when ### else end
then
eamos un e8emploA select editorial, case when count(2)1 then 1 else .mas de uno. end as cantidad rom libros !rou& b" editorial;
- 11 -
%2 - arias tablas (8oin) asta ahora hemos traba8ado con una sola tabla? pero en !eneral? se traba8a con arias tablas. Bara eitar la repetición de datos y ocupar menos espacio? se separa la in*ormación en arias tablas. Cada tabla tendr% parte de la in*ormación total ;ue ;ueremos re!istrar. Bor e8emplo? los datos de nuestra tabla GlibrosG podr$an separarse en 2 tablas? una GlibrosG y otra GeditorialesG ;ue !uardar% la in*ormación de las editoriales. >n nuestra tabla GlibrosG haremos re*erencia a la editorial colocando un códi!o ;ue la identi*i;ue. eamosA create table libros( codi!o int unsi!ned autoincrement, titulo varchar(G0) not null, autor varchar(30) not null deault .Desconocido., codi!oeditorial tin"int unsi!ned not null, &recio decimal(<,7) unsi!ned, cantidad smallint unsi!ned deault 0, &rimar" e" (codi!o) ); create table editoriales( codi!o tin"int unsi!ned autoincrement, nombre varchar(70) not null, &rimar" e"(codi!o) );
Je este modo? eitamos almacenar tantas eces los nombres de las editoriales en la tabla GlibrosG y !uardamos el nombre en la tabla GeditorialesGD para indicar la editorial de cada libro a!re!amos un campo re*erente al códi!o de la editorial en la tabla GlibrosG y en GeditorialesG. l recuperar los datos de los librosA select 2 rom libros;
emos ;ue en el campo GeditorialG aparece el códi!o? pero no sabemos el nombre de la editorial. Bara obtener los datos de cada libro? incluyendo el nombre de la editorial? necesitamos consultar ambas tablas? traer in*ormación de las dos. Cuando obtenemos in*ormación de m%s de una tabla decimos ;ue hacemos un G8oinG (unión). eamos un e8emploA select 2 rom libros 4oin editoriales on libros#codi!oeditorialeditoriales#codi!o;
nalicemos la consulta anterior.
- 12 -
Indicamos el nombre de la tabla lue!o del G*romG (GlibrosG)? unimos esa tabla con G8oinG y el nombre de la otra tabla (GeditorialesG)? lue!o especi*icamos la condición para enla6arlas con GonG? es decir? el campo por el cual se combinar%n. GonG hace coincidir re!istros de las dos tablas bas%ndose en el alor de al!:n campo? en este e8emplo? los códi!os de las editoriales de ambas tablas? el campo Gcodi!oeditorialG de GlibrosG y el campo Gcodi!oG de GeditorialesG son los ;ue enla6ar%n ambas tablas. Cuando se combina (8oin? unión) in*ormación de arias tablas? es necesario indicar ;u re!istro de una tabla se combinar% con ;u re!istro de la otra tabla. =i no especi*icamos por ;u campo relacionamos ambas tablas? por e8emploA select 2 rom libros 4oin editoriales;
el resultado es el producto cartesiano de ambas tablas (cada re!istro de la primera tabla se combina con cada re!istro de la se!unda tabla)? un G8oinG sin condición GonG !enera un resultado en el ;ue aparecen todas las combinaciones de los re!istros de ambas tablas. 9a in*ormación no sire. Hote ;ue en la consulta select 2 rom libros 4oin editoriales on libros#codi!oeditorialeditoriales#codi!o;
al nombrar el campo usamos el nombre de la tabla tambin. Cuando las tablas re*erenciadas tienen campos con i!ual nombre? esto es necesario para eitar con*usiones y ambi!uedades al momento de re*erenciar un campo. >n este e8emplo? si no especi*icamos Geditoriales.codi!oG y solamente tipeamos Gcodi!oG? 0y=@9 no sabr% si nos re*erimos al campo Gcodi!oG de GlibrosG o de GeditorialesG. =i omitimos la re*erencia a las tablas al nombrar el campo Gcodi!oG (nombre de campo ;ue contienen ambas tablas)A select 2 rom libros 4oin editoriales on codi!oeditorialcodi!o;
aparece un mensa8e de error indicando ;ue Gcodi!oG es ambi!uo. >ntonces? si en las tablas? los campos tienen el mismo nombre? debemos especi*icar a cu%l tabla pertenece el campo al hacer re*erencia a l? para ello se antepone el nombre de la tabla al nombre del campo? separado por un punto (.). >ntonces? se nombra la primer tabla? se coloca G8oinG 8unto al nombre de la se!unda tabla de la cual obtendremos in*ormación y se asocian los re!istros de ambas tablas usando un GonG ;ue ha!a coincidir los alores de un campo en com:n en ambas tablas? ;ue ser% el enlace. Bara simpli*icar la sentencia podemos usar un alias para cada tablaA select 2 rom libros as l 4oin editoriales as e on l#codi!oeditoriale#codi!o;
- 13 -
Cada tabla tiene un alias y se re*erencian los campos usando el alias correspondiente. >n este e8emplo? el uso de alias es para *ines de simpli*icación? pero en al!unas consultas es absolutamente necesario. >n la consulta anterior emos ;ue el códi!o de la editorial aparece 2 eces? desde la tabla GlibrosG y GeditorialesG. Bodemos solicitar ;ue nos muestre al!unos camposA select titulo,autor,nombre rom libros as l 4oin editoriales as e on l#codi!oeditoriale#codi!o;
l presentar los campos? en este caso? no es necesario aclarar a ;u tabla pertenecen por;ue los campos solicitados no se repiten en ambas tablas? pero si solicit%ramos el códi!o del libro? debemos especi*icar de ;u tabla por;ue el campo Gcodi!oG se repite en ambas tablas (GlibrosG y GeditorialesG)A select l#codi!o,titulo,autor,nombre rom libros as l 4oin editoriales as e on l#codi!oeditoriale#codi!o;
=i obiamos la re*erencia a la tabla? la sentencia no se e8ecuta y aparece un mensa8e indicando ;ue el campo Gcodi!oG es ambi!uo.
- 14 -
%3 - Clave or$nea. Fn campo ;ue se usa para establecer un G8oinG (unión) con otra tabla en la cual es clae primaria? se denomina Gclae a8ena o *or%neaG. >n el e8emplo de la librer$a en ;ue utili6amos las tablas GlibrosG y GeditorialesG con los camposA libros: codi!o (clave &rimaria), titulo, autor, codi!oeditorial, &recio, cantidad " editoriales: codi!o (clave &rimaria), nombre#
el campo Gcodi!oeditorialG de GlibrosG es una clae *or%nea? se emplea para enla6ar la tabla GlibrosG con GeditorialesG y es clae primaria en GeditorialesG con el nombre Gcodi!oG. Cuando alteramos una tabla? debemos tener cuidado con las claes *or%neas. =i modi*icamos el tipo? lon!itud o atributos de una clae *or%nea? sta puede ;uedar inhabilitada para hacer los enlaces. 9as claes *or%neas y las claes primarias deben ser del mismo tipo para poder enla6arse. =i modi*icamos una? debemos modi*icar la otra para ;ue los alores se correspondan.
- 15 -
%4 - arias tablas (let 8oin) emos isto cómo usar re!istros de una tabla para encontrar re!istros de otra tabla? uniendo ambas tablas con G8oinG y enla6%ndolas con una condición GonG en la cual colocamos el campo en com:n. + sea? hacemos un G8oinG y asociamos re!istros de 2 tablas usando el GonG? buscando coincidencia en los alores del campo ;ue tienen en comun ambas tablas. #raba8amos con las tablas de una librer$aA -libros: codi!o (clave &rimaria), titulo, autor, codi!oeditorial, &recio, cantidad " -editoriales: codi!o (clave &rimaria), nombre#
@ueremos saber de ;u editoriales no tenemos libros. Bara aeri!uar ;u re!istros de una tabla no se encuentran en otra tabla necesitamos usar un G8oinG di*erente. Hecesitamos determinar ;u re!istros no tienen correspondencia en otra tabla? cu%les alores de la primera tabla (de la i6;uierda) no est%n en la se!unda (de la derecha). Bara obtener la lista de editoriales y sus libros? incluso de a;uellas editoriales de las cuales no tenemos libros usamosA select 2 rom editoriales let 4oin libros on editoriales#codi!olibros#codi!oeditorial;
Fn Gle*t 8oinG se usa para hacer coincidir re!istros en una tabla (i6;uierda) con otra tabla (derecha)? pero? si un alor de la tabla de la i6;uierda no encuentra coincidencia en la tabla de la derecha? se !enera una *ila etra (una por cada alor no encontrado) con todos los campos seteados a GnullG. >ntonces? la sintais es la si!uienteA se nombran ambas tablas? una a la i6;uierda del G8oinG y la otra a la derecha? y la condición para enla6arlas? es decir? el campo por el cual se combinar%n? se establece lue!o de GonG. >s importante la posición en ;ue se colocan las tablas en un Gle*t 8oinG? la tabla de la i6;uierda es la ;ue se usa para locali6ar re!istros en la tabla de la derecha. Bor lo tanto? estos G8oinG no son i!ualesA select 2 rom editoriales let 4oin libros on editoriales#codi!olibros#codi!oeditorial; select 2 rom libros let 4oin editoriales on editoriales#codi!olibros#codi!oeditorial;
9a primera sentencia opera as$A por cada alor de codi!o de GeditorialesG busca coincidencia en la tabla GlibrosG? si no encuentra coincidencia para al!:n alor? !enera una *ila seteada a GnullG. - 1 -
9a se!unda sentencia opera de modo inersoA por cada alor de Gcodi!oeditorialG de GlibrosG busca coincidencia en la tabla GeditorialesG? si no encuentra coincidencia? setea la *ila a GnullG. Fsando re!istros de la tabla de la i6;uierda se encuentran re!istros en la tabla de la derecha. 9ue!o del GonG se especi*ican los campos ;ue se asociar%nD no se deben colocar condiciones en la parte GonG para restrin!ir re!istros ;ue deber$an estar en el resultado? para ello hay ;ue usar la cl%usula GwhereG. Fn Gle*t 8oinG puede tener clausula GwhereG ;ue restrin!a el resultado de la consulta considerando solamente los re!istros ;ue encuentran coincidencia en la tabla de la derechaA select e#nombre,l#titulo rom editoriales as e let 4oin libros as l on e#codi!ol#codi!oeditorial where l#codi!oeditorial is not null;
>l anterior Gle*t 8oinG muestra los alores de la tabla GeditorialesG ;ue est%n presentes en la tabla de la derecha (GlibrosG). #ambin podemos mostrar las editoriales ;ue no est%n presentes en GlibrosGA select e#nombre,l#titulo rom editoriales as e let 4oin libros as l on e#codi!ol#codi!oeditorial where l#codi!oeditorial is null;
>l anterior Gle*t 8oinG muestra los alores de la tabla GeditorialesG ;ue no encuentran correspondencia en la tabla de la derecha? GlibrosG.
- 1 -
%! - arias tablas (riht 8oin) Gri!ht 8oinG opera del mismo modo ;ue Gle*t 8oinG sólo ;ue la b:s;ueda de coincidencias la reali6a de modo inerso? es decir? los roles de las tablas se inierten? busca coincidencia de alores desde la tabla de la derecha en la tabla de la i6;uierda y si un alor de la tabla de la derecha no encuentra coincidencia en la tabla de la i6;uierda? se !enera una *ila etra (una por cada alor no encontrado) con todos los campos seteados a GnullG. #raba8amos con las tablas de una librer$aA -libros: codi!o (clave &rimaria), titulo, autor, codi!oeditorial, &recio, cantidad " -editoriales: codi!o (clave &rimaria), nombre#
>stas sentencias deuelen el mismo resultadoA select nombre,titulo rom editoriales as e let 4oin libros as l on e#codi!ol#codi!oeditorial; select nombre,titulo rom libros as l ri!ht 4oin editoriales as e on e#codi!ol#codi!oeditorial;
9a primera busca alores de Gcodi!oG de la tabla GeditorialesG (tabla de la i6;uierda) coincidentes con los alores de Gcodi!oeditorialG de la tabla GlibrosG (tabla de la derecha). 9a se!unda busca alores de la tabla de la derecha coincidentes con los alores de la tabla de la i6;uierda.
- 1" -
%% - arias tablas (cross 8oin) Gcross 8oinG retorna todos los re!istros de todas las tablas implicadas en la unión? deuele el producto cartesiano. Ho es muy utili6ado. Fn pe;ueQo restaurante tiene almacenados los nombres y precios de sus comidas en una tabla llamada GcomidasG y en una tabla denominada GpostresG los mismos datos de sus postres. >l restaurante ;uiere combinar los re!istros de ambas tablas para mostrar los distintos men:es ;ue o*rece. Bodemos usar Gcross 8oinGA select c#2, rom comidas as c cross 4oin &ostres as &;
es i!ual a un simple G8oinG sin parte GonGA select c#2, rom comidas as c 4oin &ostres as &;
Bodemos or!ani6ar la salida del Gcross 8oinG para obtener el nombre del plato principal? del postre y el precio total de cada combinación (men:)A select c#nombre,nombre, c#&recioF&recio as total rom comidas as c cross 4oin &ostres as &;
Bara reali6ar un G8oinG no es necesario utili6ar 2 tablas? podemos combinar los re!istros de una misma tabla. Bara ello debemos utili6ar 2 alias para la tabla. =i los datos de las tablas anteriores (GcomidasG y GpostresG) estuieran en una sola tabla con la si!uiente estructuraA create table comidas( codi!o tin"int unsi!ned autoincrement, nombre varchar(30), rubro varchar(70),L2&lato &rinci&al " &ostre2L &recio decimal (<,7) unsi!ned, &rimar" e"(codi!o) );
Bodemos obtener la combinación de platos principales con postres empleando un Gcross 8oinG con una sola tablaA select c1#nombre,c1#&recio,c7#nombre,c7#&recio rom comidas as c1 cross 4oin comidas as c7 where c1#rubro.&lato &rinci&al. and c7#rubro.&ostre.;
- 1& -
=e empleó un GwhereG para combinar Gplato principalG con GpostreG. =i ;ueremos el monto total de cada combinaciónA select c1#nombre,c7#nombre, c1#&recioFc7#&recio as total rom comidas as c1 cross 4oin comidas as c7 where c1#rubro.&lato &rinci&al. and c7#rubro.&ostre.;
- 11 -
%' - arias tablas (natural 8oin) Gnatural 8oinG se usa cuando los campos por los cuales se enla6an las tablas tienen el mismo nombre. #enemos las tablas GlibrosG y GeditorialesG de una librer$a. 9as tablas tienen las si!uientes estructurasA - libros: codi!o (clave &rimaria), titulo, autor, codi!oeditorial, &recio# - editoriales: codi!oeditorial(clave &rimaria), nombre#
Como en ambas tablas? el códi!o de la editorial se denomina Gcodi!oeditorialG? podemos omitir la parte GonG ;ue indica los nombres de los campos por el cual se enla6an las tablas? empleando Gnatural 8oinG? se unir%n por el campo ;ue tienen en com:nA select titulo,nombre rom libros as l natural 4oin editoriales as e;
9a si!uiente sentencia tiene la misma salida anteriorA select titulo,nombre rom libros as l 4oin editoriales as e on l#codi!oeditoriale#codi!oeditorial;
#ambin se puede usar GnaturalG con Gle*t 8oinG y Gri!ht 8oinGA select nombre,titulo rom editoriales as e natural let 4oin libros as l;
;ue tiene la misma salida ;ueA select nombre,titulo rom editoriales as e let 4oin libros as l on e#codi!oeditoriall#codi!oeditorial;
>s decir? con Gnatural 8oinG no se coloca la parte GonG ;ue especi*ica los campos por los cuales se enla6an las tablas? por;ue 0y=@9 busca los campos con i!ual nombre y enla6a las tablas por ese campo. ay ;ue tener cuidado con este tipo de G8oinG por;ue si ambas tablas tiene m%s de un campo con i!ual nombre? 0y=@9 no sabr% por cual debe reali6ar la unión. Bor e8emplo? si el campo GtituloG de la tabla GlibrosG se llamara GnombreG? las tablas tendr$an 2 campos con i!ual nombre (Gcodi!oeditorialG y GnombreG). +tro problema ;ue puede sur!ir es el si!uiente. #enemos la tabla GlibrosG con los si!uientes camposA codi!o (del libro)? titulo? autor y codi!oeditorial? y la tabla GeditorialesG con estos camposA codi!o (de la editorial) y nombre. =i usamos Gnatural 8oinG? unir% las tablas por el campo Gcodi!oG? ;ue es el - 111 -
campo ;ue tienen i!ual nombre? pero el campo Gcodi!oG de GlibrosG no hace re*erencia al códi!o de la editorial sino al del libro? as$ ;ue la salida ser% errónea.
- 112 -
% - arias tablas (inner 8oin - straiht 8oin) >isten otros tipos de G8oinG adem%s del simple G8oinG? Gle*t 8oinG? Gri!ht 8oinG? Gcross 8oinG y Gnatural 8oinG. e%moslos. Ginner 8oinG es i!ual ;ue G8oinG. Con Ginner 8oinG? todos los re!istros no coincidentes son descartados? sólo los coincidentes se muestran en el resultadoA select nombre,titulo rom editoriales as e inner 4oin libros as l on e#codi!ol#codi!oeditorial;
#iene la misma salida ;ue un simple G8oinGA select nombre,titulo rom editoriales as e 4oin libros as l on e#codi!ol#codi!oeditorial;
Gstrai!ht 8oinG es i!ual a G8oinG? sólo ;ue la tabla de la i6;uierda es le$da siempre antes ;ue la de la derecha.
- 113 -
% - 8oin? roup by y unciones de arupamiento. Bodemos usar G!roup byG y las *unciones de a!rupamiento con G8oinG. Bara er todas las editoriales? a!rupadas por nombre? con una columna llamada GCantidad de librosG en la ;ue aparece la cantidad calculada con Gcount()G de todos los libros de cada editorial tipeamosA select e#nombre,count(l#codi!oeditorial) as .Cantidad de libros. rom editoriales as e let 4oin libros as l on l#codi!oeditoriale#codi!o !rou& b" e#nombre;
=i usamos Gle*t 8oinG la consulta mostrar% todas las editoriales? y para cual;uier editorial ;ue no encontrara coincidencia en la tabla GlibrosG colocar% GG en GCantidad de librosG. =i usamos G8oinG en lu!ar de Gle*t 8oinGA select e#nombre,count(l#codi!oeditorial) as .Cantidad de libros. rom editoriales as e 4oin libros as l on l#codi!oeditoriale#codi!o !rou& b" e#nombre;
solamente mostrar% las editoriales para las cuales encuentra alores coincidentes para el códi!o de la editorial en la tabla GlibrosG. Bara conocer el mayor precio de los libros de cada editorial usamos la *unción Gma()G? hacemos una unión y a!rupamos por nombre de la editorialA select e#nombre, ma(l#&recio) as ./a"or &recio. rom editoriales as e let 4oin libros as l on l#codi!oeditoriale#codi!o !rou& b" e#nombre;
>n la sentencia anterior? mostrar%? para la editorial de la cual no haya libros? el alor GnullG en la columna calculadaD si reali6amos un simple G8oinGA select e#nombre, ma(l#&recio) as ./a"or &recio. rom editoriales as e 4oin libros as l on l#codi!oeditoriale#codi!o !rou& b" e#nombre;
sólo mostrar% las editoriales para las cuales encuentra correspondencia en la tabla de la derecha.
- 114 -
- 115 -
'0 - 8oin con m$s de dos tablas. Bodemos hacer un G8oinG con m%s de dos tablas. Fna biblioteca re!istra la in*ormación de sus libros en una tabla llamada GlibrosG? los datos de sus socios en GsociosG y los prstamos en una tabla GprestamosG. >n la tabla GprestamosG haremos re*erencia al libro y al socio ;ue lo solicita colocando un códi!o ;ue los identi*i;ue. eamosA create table libros( codi!o int unsi!ned autoincrement, titulo varchar(G0) not null, autor varchar(70) deault .Desconocido., &rimar" e" (codi!o) ); create socios( documento char(H) not null, nombre varchar(30), domicilio varchar(30), &rimar" e" (numero) ); create table &restamos( documento char(H) not null, codi!olibro int unsi!ned, echa&restamo date not null, echadevolucion date, &rimar" e" (codi!olibro,echa&restamo) );
l recuperar los datos de los prestamosA select 2 rom &restamos;
aparece el códi!o del libro pero no sabemos el nombre y tampoco el nombre del socio sino su documento. Bara obtener los datos completos de cada prstamo? incluyendo esos datos? necesitamos consultar las tres tablas. acemos un G8oinG (unión)A select nombre,titulo,echa&restamo rom &restamos as & 4oin socios as s on s#documentodocumento 4oin libros as l on codi!olibrocodi!o;
nalicemos la consulta anterior. Indicamos el nombre de la tabla lue!o del G*romG (GprestamosG)? unimos esa tabla con la tabla GsociosG especi*icando con GonG el campo por el cual se combinar%nA el - 11 -
campo GdocumentoG de ambas tablasD lue!o debemos hacer coincidir los alores para la unión con la tabla GlibrosG enla6%ndolas por los campos Gcodi!olibroG y Gcodi!oG de GlibrosG. Ftili6amos alias para una sentencia m%s sencilla y comprensible. Hote ;ue especi*icamos a ;u tabla pertenece el campos GdocumentoG por;ue a ese nombre de campo lo tienen las tablas GprestamosG y GsociosG? esto es necesario para eitar con*usiones y ambi!uedades al momento de re*erenciar un campo. >n este e8emplo? si omitimos la re*erencia a las tablas al nombrar el campo GdocumentoG aparece un mensa8e de error indicando ;ue GdocumentoG es ambi!uo. Bara er todos los prestamos? incluso los ;ue no encuentran coincidencia en las otras tablas? usamosA select nombre,titulo,echa&restamo rom &restamos as & let 4oin socios as s on documentos#documento let 4oin libros as l on l#codi!ocodi!olibro;
Bodemos er a;uellos prestamos con alor coincidente para GlibrosG pero para GsocioG con y sin coincidenciaA select nombre,titulo,echa&restamo rom &restamos as & let 4oin socios as s on documentos#documento 4oin libros as l on codi!olibrol#codi!o;
- 11 -
'1 - 7unción de control i con varias tablas. Bodemos emplear Gi*G y GcaseG en la misma sentencia ;ue usamos un G8oinG. Bor e8emplo? tenemos las tablas GlibrosG y GeditorialesG y ;ueremos saber si hay libros de cada una de las editorialesA select e#nombre, i (count(l#codi!oeditorial)60,.+i.,.'o.) as ha" rom editoriales as e let 4oin libros as l on e#codi!ol#codi!oeditorial !rou& b" e#nombre;
Bodemos obtener una salida similar usando GcaseG en lu!ar de Gi*GA select e#nombre, case count(l#codi!oeditorial) when 0 then .'o. else .+i. end as .?a". rom editoriales as e let 4oin libros as l on e#codi!ol#codi!oeditorial !rou& b" e#nombre;
- 11" -
'2 - ariables de usuario. Cuando buscamos un alor con las *unciones de a!rupamiento? por e8emplo Gma()G? la consulta nos deuele el m%imo alor de un campo de una tabla? pero no nos muestra los alores de otros campos del mismo re!istro. Bor e8emplo? ;ueremos saber todos los datos del libro con mayor precio de la tabla GlibrosG de una librer$a? tipeamosA select ma(&recio) rom libros;
Bara obtener todos los datos del libro podemos emplear una ariable para almacenar el precio m%s altoA select Vma"or&recio:ma(&recio) rom libros;
y lue!o mostrar todos los datos de dicho libro empleando la ariable anteriorA select 2 rom libros where &recioVma"or&recio;
>s decir? !uardamos en la ariable el precio m%s alto y lue!o? en otra sentencia? mostramos los datos de todos los libros cuyo precio es i!ual al alor de la ariable. 9as ariables nos permiten almacenar un alor y recuperarlo m%s adelante? de este modo se pueden usar alores en otras sentencias. 9as ariables de usuario son espec$*icas de cada coneión? es decir? una ariable de*inida por un cliente no puede ser ista ni usada por otros clientes y son liberadas autom%ticamente al abandonar la coneión. 9as ariables de usuario comien6an con G]G (arroba) se!uido del nombre (sin espacios)? dicho nombre puede contener cual;uier caracter. Bara almacenar un alor en una ariable se coloca GA,G (operador de asi!nación) entre la ariable y el alor a asi!nar. >n el e8emplo? mostramos todos los datos del libro com precio m%s alto? pero? si adem%s? necesitamos el nombre de la editorial podemos emplear un G8oinGA select l#titulo,l#autor,e#nombre rom libros as l 4oin editoriales as e on l#codi!oeditoriale#codi!o where l#&recio Vma"or&recio;
9a utilidad de las ariables consiste en ;ue almacenan alores para utili6arlos en otras consultas. Bor e8emplo? ;ueremos er todos los libros de la editorial ;ue ten!a el libro m%s caro. Jebemos buscar el precio m%s alto y almacenarlo en una ariable? lue!o buscar el nombre de la editorial del libro con el
- 11& -
precio i!ual al alor de la ariable y !uardarlo en otra ariable? *inalmente buscar todos los libros de esa editorialA select Vma"or&recio:ma(&recio) rom libros; select Veditorial:e#nombre rom libros as l 4oin editoriales as e on l#codi!oeditoriale#codi!o where &recioVma"or&recio; select l#titulo,l#autor,e#nombre rom libros as l 4oin editoriales as e on l#codi!oeditoriale#codi!o where e#nombreVeditorial;
- 12 -
'3 - Crear tabla a partir de otra (create insert) #enemos la tabla GlibrosG de una librer$a y ;ueremos crear una tabla llamada GeditorialesG ;ue conten!a los nombres de las editoriales. 9a tabla GlibrosG tiene esta estructuraA -codi!o: int unsi!ned autoincrement, -titulo: varchar(G0) not null, -autor: varchar(30), -editorial: varchar(70) not null, -&recio: decimal(<,7) unsi!ned, -clave &rimaria: codi!o#
9a tabla GeditorialesG? ;ue no eiste? debe tener la si!uiente estructuraA -nombre: nombre de la editorial#
9a tabla libros contiene arios re!istros. Bara !uardar en GeditorialesG los nombres de las editoriales? podemos hacerlo en 3 pasosA 1^ pasoA crear la tabla GeditorialesGA create table editoriales( nombre varchar(70) );
2^ pasoA reali6ar la consulta en la tabla GlibrosG para obtener los nombres de las distintas editorialesA select distinct editorial as nombre rom libros;
obteniendo una salida como la si!uienteA
editorial *mece aidos laneta
3^ pasoA insertar los re!istros necesarios en la tabla GeditorialesGA insert into editoriales (nombre) values(.*mece.); insert into editoriales (nombre) values(.aidos.); insert into editoriales (nombre) values(.laneta.);
Bero eiste otra manera simpli*icando los pasos. Bodemos crear la tabla GeditorialesG con los campos necesarios consultando la tabla GlibrosG y en el mismo momento insertar la in*ormaciónA create table editoriales select distinct editorial as nombre rom libros;
- 121 -
9a tabla GeditorialesG se ha creado con el campo llamado GnombreG seleccionado del campo GeditorialG de GlibrosG. >ntonces? se reali6a una consulta de la tabla GlibrosG y anteponiendo Gcreate table ...G se in!resa el resultado de dicha consulta en la tabla GeditorialesG al momento de crearla. =i seleccionamos todos los re!istros de la tabla GeditorialesG aparece lo si!uienteA nombre *mece aidos laneta
=i isuali6amos la estructura de GeditorialesG con Gdescribe editorialesG emos ;ue el campo GnombreG se creó con el mismo tipo y lon!itud del campo GeditorialG de GlibrosG. #ambin podemos crear una tabla a partir de una consulta car!ando los campos con los alores de otra tabla y una columna calculada. eamos un e8emplo. #enemos la misma tabla GlibrosG y ;ueremos crear una tabla llamada GlibrosporeditorialG ;ue conten!a la cantidad de libros de cada editorial. 9a tabla GcantidadporeditorialG? ;ue no est% creada? debe tener la si!uiente estructuraA -nombre: nombre de la editorial, -cantidad: cantidad de libros#
Bodemos lo!rarlo en 3 pasosA 1^ pasoA crear la tabla GcantidadporeditorialGA create table editoriales( nombre varchar(70), cantidad smallint );
2^ pasoA reali6ar la consulta en la tabla GlibrosG para obtener la cantidad de libros de cada editorial a!rupando por GeditorialG y calculando la cantidad con Gcount()GA select editorial,count(2) rom libros !rou& b" editorial;
obteniendo una salida como la si!uienteA
nombre cantidad *mece 3 aidos G laneta 7
3^ pasoA insertar los re!istros necesarios en la tabla GeditorialesGA insert into cantidad&oreditorial values(.*mece.,3); insert into cantidad&oreditorial values(.aidos.,G); insert into cantidad&oreditorial values(.laneta.,7);
- 122 -
Bero eiste otra manera simpli*icando los pasos. Bodemos crear la tabla GcantidadporeditorialG con los campos necesarios consultando la tabla GlibrosG y en el mismo momento insertar la in*ormaciónA create table cantidad&oreditorial select editorial as nombre,count(2) as cantidad rom libros !rou& b" editorial;
9a tabla GcantidadporeditorialG se ha creado con el campo llamado GnombreG seleccionado del campo GeditorialG de GlibrosG y con el campo GcantidadG con el alor calculado con count() de la tabla GlibrosG. >ntonces? se reali6a una consulta de la tabla GlibrosG y anteponiendo Gcreate table ...G se in!resa el resultado de dicha consulta en la tabla GcantidadporeditorialG al momento de crearla. =i seleccionamos todos los re!istros de la tabla GcantidadporeditorialG aparece lo si!uienteA nombre cantidad *mece 3 aidos G laneta 7
=i isuali6amos la estructura de GcantidadporeditorialG con Gdescribe cantidadporeditorialG? emos ;ue el campo GnombreG se creó con el mismo tipo y lon!itud del campo GeditorialG de GlibrosG y el campo GcantidadG se creó como Gbi!intG.
- 123 -
'4 - Crear tabla a partir de otras (create insert - 8oin) #enemos las tablas GlibrosG y GeditorialesG y ;ueremos crear una tabla llamada GcantidadporeditorialG ;ue conten!a la cantidad de libros de cada editorial. 9a tabla GlibrosG tiene la si!uiente estructuraA -codi!o: int unsi!ned autoincrement, -titulo: varchar(G0) not null, -autor: varchar(30), -codi!oeditorial: tin"int unsi!ned, -&recio: decimal(<,7) unsi!ned, -clave &rimaria: codi!o#
9a tabla GeditorialesG tiene esta estructuraA -codi!o: tin"int unsi!ned autoincrement, -nombre: varchar(70), clave &rimaria: codi!o#
9as tablas GlibrosG y GeditorialesG contienen arios re!istros. 9a tabla GcantidadporeditorialG? ;ue no eiste? debe tener la si!uiente estructuraA -nombre: nombre de la editorial, -cantidad: cantidad de libros#
Bodemos !uardar en la tabla GcantidadporeditorialG la cantidad de libros de cada editorial en 3 pasosA 1^ pasoA crear la tabla GcantidadporeditorialGA create table cantidad&oreditorial( nombre varchar(70), cantidad smallint );
2^ pasoA reali6ar la consulta en la tabla GlibrosG y GeditorialesG? con un G8oinG para obtener la cantidad de libros de cada editorial a!rupando por el nombre de la editorial y calculando la cantidad con Gcount()GA select e#nombre,count(2) rom libros as l 4oin editoriales as e on l#codi!oeditoriale#codi!o !rou& b" e#nombre;
obteniendo una salida como la si!uienteA
nombre cantidad *mece 3 aidos G laneta 7
- 124 -
3^ pasoA insertar los re!istros necesarios en la tabla GeditorialesGA insert into editoriales values(.*mece.,3); insert into editoriales values(.aidos.,G); insert into editoriales values(.laneta.,7);
Bero eiste otra manera simpli*icando los pasos. Bodemos crear la tabla GcantidadporeditorialG con los campos necesarios consultando la tabla GlibrosG y GeditorialesG y en el mismo momento insertar la in*ormaciónA create table cantidad&oreditorial select e#nombre,count(2) as cantidad rom libros as l 4oin editoriales as e on l#codi!oeditoriale#codi!o !rou& b" e#nombre;
9a tabla GcantidadporeditorialG se ha creado con el campo llamado GnombreG seleccionado del campo GnombreG de GeditorialesG y con el campo GcantidadG con el alor calculado con count() de la tabla GlibrosG. >ntonces? se reali6a una consulta de la tabla GlibrosG y GeditorialesG (con un G8oinG) anteponiendo Gcreate table ...G se in!resa el resultado de dicha consulta en la tabla GcantidadporeditorialG al momento de crearla. =i seleccionamos todos los re!istros de la tabla GcantidadporeditorialG aparece lo si!uienteA nombre cantidad *mece 3 aidos G laneta 7
=i isuali6amos la estructura de GcantidadporeditorialG? emos ;ue el campo GnombreG se creó con el mismo tipo y lon!itud del campo GnombreG de GeditorialesG y el campo GcantidadG se creó como Gbi!intG.
- 125 -
'! - Insertar datos en una tabla buscando un valor en otra (insert - select) #raba8amos con las tablas GlibrosG y GeditorialesG de una librer$a. 9a tabla GlibrosG tiene la si!uiente estructuraA -codi!o: int unsi!ned autoincrement, -titulo: varchar(G0) not null, -autor: varchar(30), -codi!oeditorial: tin"int unsi!ned, -&recio: decimal(<,7) unsi!ned, -clave &rimaria: codi!o#
9a tabla GeditorialesG tiene la si!uiente estructuraA -codi!o: tin"int unsi!ned autoincrement, -nombre: varchar(70), -domicilio: varchar(30), -clave &rimaria: codi!o#
mbas tablas contienen re!istros. 9a tabla GeditorialesG contiene los si!uientes re!istrosA 1,laneta,+an /artin 777, 7,*mece,+an /artin
@ueremos in!resar en GlibrosG? el si!uiente libroA arry Botter y la piedra *iloso*al? S.O. 'owlin!? >mece? 45.&. pero no recordamos el códi!o de la editorial G>meceG. Bodemos lo!rarlo en 2 pasosA 1^ pasoA consultar en la tabla GeditorialesG el códi!o de la editorial G>meceGA select codi!o rom editoriales where nombre.*mece.;
nos deuele el alor G2G. 2^ pasoA in!resar el re!istro en GlibrosGA insert into libros (titulo,autor,codi!oeditorial,&recio) values(.?arr" otter " la &iedra ilosoal.,.>#A#9owlin!.,7,G<#W0);
+ podemos reali6ar la consulta del códi!o de la editorial al momento de la inserciónA insert into libros (titulo,autor,codi!oeditorial,&recio) select .?arr" otter " la camara secreta.,.>#A#9owlin!.,codi!o,G<#W0 rom editoriales where nombre.*mece.;
- 12 -
>ntonces? para reali6ar una inserción y al mismo tiempo consultar un alor en otra tabla? colocamos Ginsert intoG 8unto al nombre de la tabla (GlibrosG) y los campos a insertar y lue!o un GselectG en el cual disponemos todos los alores? ecepto el alor ;ue desconocemos? en su lu!ar colocamos el nombre del campo a consultar (Gcodi!oG)? lue!o se contin:a con la consulta indicando la tabla de la cual etraemos el códi!o (GeditorialesG) y la condición? en la cual damos el GnombreG de la editorial para ;ue localice el códi!o correspondiente. >l re!istro se car!ar% con el alor de códi!o de la editorial G>meceG. =i la consulta no deuele nin!:n alor? por;ue buscamos el códi!o de una editorial ;ue no eiste en la tabla GeditorialesG? aparece un mensa8e indicando ;ue no se in!resó nin!:n re!istro. Bor e8emploA insert into libros (titulo,autor,codi!oeditorial,&recio) select .Cervantes " el qui4ote.,.Bor!es.,codi!o,3< rom editoriales where nombre.laa X >anes.;
ay ;ue tener cuidado al establecer la condición en la consulta? el GinsertG in!resar% tantos re!istros como *ilas retorne la consulta. =i la consulta deuele 2 *ilas? se insertar%n 2 *ilas en el GinsertG. Bor ello? el alor de la condición (o condiciones)? por el cual se busca? debe retornar un sólo re!istro. eamos un e8emplo. @ueremos in!resar el si!uiente re!istroA ?arr" otter " la camara secreta, >#A# 9owlin!,
pero no recordamos el códi!o de la editorial ni su nombre? sólo sabemos ;ue su domicilio es en calle G=an 0artinG. =i con un GselectG locali6amos el códi!o de todas las editoriales ;ue ten!an sede en G=an 0artinG? el resultado retorna 2 *ilas? por;ue hay 2 editoriales en esa dirección (GBlanetaG y G>meceG). #ipeeemos la sentenciaA insert into libros (titulo,autor,codi!oeditorial,&recio) select .?arr" otter " la camara secreta.,.>#A# 9owlin!.,codi!o,
=e in!resar%n 2 re!istros con los mismos datos? ecepto el códi!o de la editorial. 'ecuerde entonces? el alor de la condición (condiciones)? por el cual se busca el dato desconocido en la consulta debe retornar un sólo re!istro. #ambin se pueden consultar alores de arias tablas incluyendo en el GselectG un G8oinG. eremos e8emplos en G>8ercicios propuestosG.
- 12 -
'% - Insertar reistros con valores de otra tabla (insert - select) #enemos las tabla GlibrosG y GeditorialesG creadas. 9a tabla GlibrosG contiene re!istrosD GeditorialesG? no. 9a tabla GlibrosG tiene la si!uiente estructuraA -codi!o: int unsi!ned autoincrement, -titulo: varchar(30), -autor: varchar(30), -editorial: varchar(70), -&recio: decimal(<,7) unsi!ned, -clave &rimaria: codi!o#
9a tabla GeditorialesG tiene la si!uiente estructuraA -nombre: varchar(70)#
@ueremos insertar re!istros en la tabla GeditorialesG? los nombres de las distintas editoriales de las cuales tenemos libros. Bodemos lo!rarlo en 2 pasos? con arias sentenciasA 1^ pasoA consultar los nombres de las distintas editoriales de GlibrosGA select distinct editorial rom libros;
obteniendo una salida como la si!uienteA
editorial *mece aidos laneta
2^ pasoA insertar los re!istros uno a uno en la tabla GeditorialesGA insert into editoriales (nombre) values(.*mece.); insert into editoriales (nombre) values(.aidos.); insert into editoriales (nombre) values(.laneta.);
+ podemos lo!rarlo en un solo paso? reali6ando el GinsertG y el GselectG en una misma sentenciaA insert into editoriales (nombre) select distinct editorial rom libros;
>ntonces? se puede insertar re!istros en una tabla con la salida deuelta por una consultaD para ello escribimos la consulta y le anteponemos Ginsert intoG? el nombre de la tabla en la cual in!resaremos los re!istros y los campos ;ue se car!ar%n. #ambin podemos crear una tabla llamada GcantidadporeditorialGA create table cantidad&oreditorial(
- 12" -
nombre varchar(70), cantidad smallint unsi!ned );
e in!resar re!istros a partir de una consulta a la tabla GlibrosGA insert into cantidad&oreditorial (nombre,cantidad) select editorial,count(2) as cantidad rom libros !rou& b" editorial;
=i los campos presentados entre parntesis son menos (o m%s) ;ue las columnas deueltas por la consulta? aparece un mensa8e de error y la sentencia no se e8ecuta.
- 12& -
'' - Insertar reistros con valores de otra tabla (insert - select - 8oin) #enemos las tabla GlibrosG y GeditorialesG? ;ue contienen re!istros? y la tabla GcantidadporeditorialG? ;ue no contiene re!istros. 9a tabla GlibrosG tiene la si!uiente estructuraA -codi!o: int unsi!ned autoincrement, -titulo: varchar(30), -autor: varchar(30), -codi!oeditorial: tin"int unsi!ned, -&recio: decimal(<,7) unsi!ned, -clave &rimaria: codi!o#
9a tabla GeditorialesGA -codi!o: tin"int unsi!ned autoincrement, -nombre: varchar(70), -clave &rimaria: codi!o#
9a tabla GcantidadporeditorialGA -nombre: varchar(70), -cantidad: smallint unsi!ned#
@ueremos insertar re!istros en la tabla GcantidadporeditorialG? los nombres de las distintas editoriales de las cuales tenemos libros y la cantidad de libros de cada una de ellas. Bodemos lo!rarlo en 2 pasosA 1^ pasoA consultar con un G8oinG los nombres de las distintas editoriales de GlibrosG y la cantidadA select e#nombre,count(l#codi!oeditorial) rom editoriales as e let 4oin libros as l on e#codi!ol#codi!oeditorial !rou& b" e#nombre;
obteniendo una salida como la si!uienteA editorial cantidad *mece 3 aidos 1 laneta 1 laa X >anes 0
2^ pasoA insertar los re!istros uno a uno en la tabla GcantidadporeditorialGA insert into cantidad&oreditorial values(.*mece.,3); insert into cantidad&oreditorial values(.aidos.,1); insert into cantidad&oreditorial values(.laneta.,1);
- 13 -
insert into cantidad&oreditorial values(.laa X >anes.,0);
+ podemos lo!rarlo en un solo paso? reali6ando el GinsertG y el GselectG en una misma sentenciaA insert into cantidad&oreditorial select e#nombre,count(l#codi!oeditorial) rom editoriales as e let 4oin libros as l on e#codi!ol#codi!oeditorial !rou& b" e#nombre;
>ntonces? se puede insertar re!istros en una tabla con la salida deuelta por una consulta ;ue incluya un G8oinG o un Gle*t 8oinGD para ello escribimos la consulta y le anteponemos Ginsert intoG? el nombre de la tabla en la cual in!resaremos los re!istros y los campos ;ue se car!ar%n (si se in!resan todos los campos no es necesario listarlos). 'ecuerde ;ue la cantidad de columnas deueltas en la consulta debe ser la misma ;ue la cantidad de campos a car!ar en el GinsertG.
- 131 -
' - 5ctuali6ar datos con valores de otra tabla (update) #enemos la tabla GlibrosG en la cual almacenamos los datos de los libros de nuestra biblioteca y la tabla GeditorialesG ;ue almacena el nombre de las distintas editoriales y sus códi!os. 9a tabla GlibrosG tiene la si!uiente estructuraA -codi!o: int unsi!ned autoincrement, -titulo: varchar(30), -autor: varchar(30), -codi!oeditorial: tin"int unsi!ned, -clave &rimaria: codi!o#
9a tabla GeditorialesG tiene esta estructuraA -codi!o: tin"int unsi!ned autoincrement, -nombre: varchar(70), -clave &rimaria: codi!o#
mbas tablas contienen re!istros. @ueremos unir los datos de ambas tablas en una solaA GlibrosG? es decir? alterar la tabla GlibrosG para ;ue almacene el nombre de la editorial y eliminar la tabla GeditorialesG. >n primer lu!ar debemos alterar la tabla GlibrosG? amos a a!re!arle un campo llamado GeditorialG en el cual !uardaremos el nombre de la editorial. alter table libros add editorial varchar(70);
9a tabla GlibrosG contiene un nueo campo GeditorialG con todos los re!istros con alor GnullG. hora debemos actuali6ar los alores para ese campo. Bodemos hacerlo en 2 pasosA 1^ pasoA consultamos los códi!os de las editorialesA select codi!o,nombre rom editoriales;
obtenemos una salida similar a la si!uienteA
codi!o nombre 1 laneta 7 *mece 3 aidos
2^ pasoA comen6amos a actuali6ar el campo GeditorialG de los re!istros de GlibrosG uno a unoA u&date libros set editorial.laneta. where codi!oeditorial1;
- 132 -
u&date libros set editorial.*mece. where codi!oeditorial7; u&date libros set editorial.aidos. where codi!oeditorial3; ### con cada editorial###
9ue!o? eliminamos el campo Gcodi!oeditorialG de GlibrosG y la tabla GeditorialesG. Bero podemos simpli*icar la tarea actuali6ando el campo GeditorialG de todos los re!istros de la tabla GlibrosG al mismo tiempo ;ue reali6amos el G8oinG (paso 1 y 2 en una sola sentencia)A u&date libros 4oin editoriales on libros#codi!oeditorialeditoriales#codi!o set libros#editorialeditoriales#nombre;
9ue!o? eliminamos el campo Gcodi!oeditorialG de GlibrosG con Galter tableG y la tabla GeditorialesG con Gdrop tableG. >ntonces? se puede actuali6ar una tabla con alores de otra tabla. =e coloca GupdateG 8unto al nombre de la tabla a actuali6ar? lue!o se reali6a el G8oinG y el campo por el cual se enla6an las tablas y *inalmente se especi*ica con GsetG el campo a actuali6ar y su nueo alor? ;ue es el campo de la otra tabla con la cual se enla6ó.
- 133 -
' - 5ctuali6ación en cascada (update - 8oin) #enemos la tabla GlibrosG en la cual almacenamos los datos de los libros de nuestra biblioteca y la tabla GeditorialesG ;ue almacena el nombre de las distintas editoriales y sus códi!os. 9as tablas tienen las si!uientes estructurasA create table libros( codi!o int unsi!ned autoincrement, titulo varchar(30), autor varchar(30), codi!oeditorial tin"int unsi!ned, &recio decimal(<,7) unsi!ned, &rimar" e"(codi!o) ); create table editoriales( codi!o tin"int unsi!ned autoincrement, nombre varchar(70), &rimar" e"(codi!o) );
mbas tablas contienen re!istros. @ueremos modi*icar el códi!o de la editorial G>meceG a G&G y tambin todos los Gcodi!oeditorialG de los libros de dicha editorial. Bodemos hacerlo en 3 pasosA 1) buscar el códi!o de la editorial G>meceGA select 2 rom editoriales where nombre.*mece.;
recordamos el alor deuelto (alor 2) o lo almacenamos en una ariableD 2) actuali6ar el códi!o en la tabla GeditorialesGA u&date editoriales set codi!oW where nombre.*mece.;
3) y *inalmente actuali6ar todos los libros de dicha editorialA u&date libros set codi!oeditorialW where codi!oeditorial7;
+ podemos hacerlo en una sola sentenciaA u&date libros as l 4oin editoriales as e on l#codi!oeditoriale#codi!o set l#codi!oeditorialW, e#codi!oW where e#nombre.*mece.;
- 134 -
>l cambio se reali6ó en ambas tablas. =i modi*icamos al!:n dato de un re!istro ;ue se encuentra en re!istros de otras tablas (!eneralmente campos ;ue son clae a8ena) debemos modi*icar tambin los re!istros de otras tablas en los cuales se encuentre ese dato (!eneralmente clae primaria). Bodemos reali6ar la actuali6ación en cascada (es decir? en todos los re!istros de todas las tablas ;ue conten!an el dato modi*icado) en una sola sentencia? combinando GupdateG con G8oinG y seteando los campos inolucrados de todas las tablas.
- 135 -
0 - /orrar reistros consultando otras tablas (delete - 8oin) #enemos la tabla GlibrosG en la cual almacenamos los datos de los libros de nuestra biblioteca y la tabla GeditorialesG ;ue almacena el nombre de las distintas editoriales y sus códi!os. 9a tabla GlibrosG tiene la si!uiente estructuraA -codi!o: int unsi!ned autoincrement, -titulo: varchar(30), -autor: varchar(30), -codi!oeditorial: tin"int unsi!ned, -clave &rimaria: codi!o#
9a tabla GeditorialesG tiene esta estructuraA -codi!o: tin"int unsi!ned autoincrement, -nombre: varchar(70), -clave &rimaria: codi!o#
mbas tablas contienen re!istros. @ueremos eliminar todos los libros de la editorial G>meceG pero no recordamos el códi!o de dicha editorial. Bodemos hacerlo en 2 pasosA 1^ pasoA consultamos el códi!o de la editorial G>meceGA select codi!o rom editoriales where nombre.*mece.;
recordamos el alor deuelto (alor 2) o lo almacenamos en una ariable. 2^ pasoA borramos todos los libros con códi!o de editorial G2GA delete libros where codi!oeditorial7;
+ podemos reali6ar todo en un solo pasoA delete libros rom libros 4oin editoriales on libros#codi!oeditorialeditoriales#codi!o where editoriales#nombre.*mece.;
>s decir? usamos GdeleteG 8unto al nombre de la tabla de la cual ;ueremos eliminar re!istros? lue!o reali6amos el G8oinG correspondiente nombrando las tablas inolucradas y a!re!amos la condición GwhereG.
- 13 -
- 13 -
1 - /orrar reistros buscando coincidencias en otras tablas (delete - 8oin) #enemos la tabla GlibrosG en la cual almacenamos los datos de los libros de nuestra biblioteca y la tabla GeditorialesG ;ue almacena el nombre de las distintas editoriales y sus códi!os. 9a tabla GlibrosG tiene la si!uiente estructuraA -codi!o: int unsi!ned autoincrement, -titulo: varchar(30), -autor: varchar(30), -codi!oeditorial: tin"int unsi!ned, -clave &rimaria: codi!o#
9a tabla GeditorialesG tiene esta estructuraA -codi!o: tin"int unsi!ned autoincrement, -nombre: varchar(70), -clave &rimaria: codi!o#
mbas tablas contienen re!istros. @ueremos eliminar todos los libros cuyo códi!o de editorial no eista en la tabla GeditorialesG. Bodemos hacerlo en 2 pasosA 1^ pasoA reali6amos un le*t 8oin para er ;u Gcodi!oeditorialG en GlibrosG no eiste en GeditorialesGA select l#2 rom libros as l let 4oin editoriales as e on l#codi!oeditoriale#codi!o where e#codi!o is null;
recordamos el alor de los códi!os de libro deueltos (alor 5) o lo almacenamos en una ariable. 2^ pasoA borramos todos los libros mostrados en la consulta anterior (uno solo? con códi!o 5)A delete libros where codi!o<;
+ podemos reali6ar la eliminción en el mismo momento ;ue reali6amos el Gle*t 8oinGA delete libros $9/ libros let 4oin editoriales on libros#codi!oeditorialeditoriales#codi!o where editoriales#codi!o is null;
>s decir? usamos GdeleteG 8unto al nombre de la tabla de la cual ;ueremos eliminar re!istros? lue!o reali6amos el Gle*t 8oinG correspondiente nombrando las tablas inolucradas y a!re!amos la condición GwhereG para ;ue seleccione solamente los libros cuyo códi!o de editorial no se encuentre en GeditorialesG. - 13" -
hora ;ueremos eliminar todas las editoriales de las cuales no haya librosA delete editoriales rom editoriales let 4oin libros on libros#codi!oeditorialeditoriales#codi!o where libros#codi!o is null;
- 13& -
2 - /orrar reistros en cascada (delete - 8oin) #enemos la tabla GlibrosG en la cual almacenamos los datos de los libros de nuestra biblioteca y la tabla GeditorialesG ;ue almacena el nombre de las distintas editoriales y sus códi!os. 9a tabla GlibrosG tiene la si!uiente estructuraA -codi!o: int unsi!ned autoincrement, -titulo: varchar(30), -autor: varchar(30), -codi!oeditorial: tin"int unsi!ned, -clave &rimaria: codi!o#
9a tabla GeditorialesG tiene esta estructuraA -codi!o: tin"int unsi!ned autoincrement, -nombre: varchar(70), -clave &rimaria: codi!o#
mbas tablas contienen re!istros. 9a librer$a ya no traba8a con la editorial G>meceG? entonces ;uiere eliminar dicha editorial de la tabla GeditorialesG y todos los libros de GlibrosG de esta editorial. Bodemos hacerlo en 2 pasosA 1^ pasoA buscar el códi!o de la editorial G>meceG y almacenarlo en una ariableA select Vvalor: codi!o rom editoriales where nombre.*mece.;
2^ pasoA eliminar dicha editorial de la tabla GeditorialesGA delete editoriales where codi!oVvalor;
3^ pasoA eliminar todos los libros cuyo códi!o de editorial sea i!ual a la ariableA delete libros where codi!oeditorial,]alorD + podemos hacerlo en una sola consultaA delete libros,editoriales rom libros 4oin editoriales on libros#codi!oeditorialeditoriales#codi!o where editoriales#nombre.*mece.;
9a sentencia anterior elimina de la tabla GeditorialesG la editorial G>meceG y de la tabla GlibrosG todos los re!istros con códi!o de editorial correspondiente a G>meceG. >s decir? podemos reali6ar la eliminación de re!istros de arias tablas (en cascada) empleando GdeleteG 8unto al nombre de las tablas de las cuales ;ueremos eliminar re!istros y lue!o del correspondiente G8oinG colocar la condición GwhereG ;ue a*ecte a los re!istros a eliminar.
- 14 -
- 141 -
3 - Che;uear y reparar tablas (chec< repair) Bara che;uear el estado de una tabla usamos Gchec< tableGA chec table libros;
Gchec< tableG che;uea si una o m%s tablas tienen errores. >sta sentencia deuele la si!uiente in*ormaciónA en la columna G#ableG muestra el nombre de la tablaD en G+pG muestra siempre Gchecisten distintas opciones de che;ueo de una tabla? si no se especi*ica? por de*ecto es GmediumG. 9os tipos de che;ueo sonA - ;uic
Bara reparar una tabla corrupta usamos Grepair tableGA re&air table libros;
Grepair tableG puede recuperar los datos de una tabla. Jeuele la si!uiente in*ormaciónA en la columna G#ableG nuestra el nombre de la tablaD en G+pG siempre muestra GrepairGD en G0s!NtypeG muestra GstatusG? GerrorG? Gin*oG o Gwarnin!G y en G0s!NtetG muestra un mensa8e ;ue !enealmente es G+OG.
- 142 -