Tutorial Completo MySql

Share Embed Donate


Short Description

Mysql tutorial...

Description

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 - Clae primaria...................................................................................................................................1 12 - Campo entero con autoincremento...................................................................................................1" 13 - Comando truncate table....................................................................................................................2 14 - alores null.......................................................................................................................................21 15 - alores alores numricos numricos sin si!no (unsi!ned)............................................................. (unsi!ned)............................................................. .................... ............ ................. ..........23 .23 15 - alores alores numricos numricos sin si!no (unsi!ned)............................................................. (unsi!ned)............................................................. .................... ............ ................. ..........24 .24 1 - #ipos de datos...................................................................................................................................25 1 - #ipos de datos (teto)........................................................................................................................2 1" - #ipos de datos (numricos)...............................................................................................................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 (listo sucede por;ue los campos de*inidos como clae 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 clae primaria. Cual;uier campo (de cual;uier tipo) puede ser clae primaria? debe cumplir como re;uisito? ;ue sus alores no se repitan. l establecer una clae primaria estamos indeando 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 etra 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 nueo re!istro ;ue se inserta. =ólo puede haber un campo GautoNincrementG y debe ser clae primaria (o estar indeado). Bara establecer ;ue un campo autoincremente sus alores autom%ticamente? ste debe ser entero (inte!er) y debe ser clae primariaA  create table libros( codi!o int autoincrement, titulo varchar(70), autor varchar(30), editorial varchar(1ste 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 positios. 0%s adelante eplicaremos cómo de*inir un campo con sólo alores positios. >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 ms 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 deinido &ara ace&tar s@lo valores &ositivos), lo in!resa#

Bara ;ue este atributo *uncione correctamente? el campo debe contener solamente alores positiosD 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. #ambin 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 uele 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 uele 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 GGD si en cambio? aciamos la tabla con Gtruncate tableG? al in!resar un nueo re!istro sin alor para el códi!o? iniciar% la secuencia en 1 nueamente.

- 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" Deault *tra       codi!o int(11)  b## ' 9 autoincrement titulo varchar(70) 11 b## *+ ('E88) autor varchar(30) 11 b## *+ ('E88) editorial varchar(1=G? esto si!ni*ica ;ue el primer campo no acepta alores nulos (por;ue es clae primaria) y los otros si los permiten. 9a tercera columna GOeyG? muestra los campos ;ue son clae primariaD en el campo Gcodi!oG aparece GB'IG (es clae primaria) y los otros est%n ac$os? por;ue no son clae 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? ecepto para el ;ue es clae primaria? el alor por de*ecto es GnullG. 9a ;uinta columna G>traG? muestra al!unos atributos etra de los camposD el campo Gcodi!oG es GautoNincrementG. amos a eplicar los alores nulos. GnullL si!ni*ica Gdato desconocidoG o Galor ineistenteG. Ho es lo mismo ;ue un alor ? una cadena ac$a o una cadena literal GnullG.  eces? puede desconocerse o no eistir 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 clae 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 clae primaria no aceptan alores nulos. Huestro campo clae 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 autoincrement, titulo varchar(70) not null autor varchar(30), editorial varchar(1ntonces? 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 &recio0;

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 numricos sin sino (unsined) emos isto al!unos atributos etra 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 numrico es Gunsi!nedG. >l atributo Gunsi!nedG (sin si!no) permite sólo alores positios. =i necesitamos almacenar edades? por e8emplo? nunca !uardaremos alores ne!atios? 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!atio. 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 positios? 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) tambin aceptan el atributo Gunsi!nedG? pero el alor del l$mite superior del ran!o se mantiene.

- 24 -

1! - alores numricos sin sino (unsined) emos isto al!unos atributos etra 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 numrico es Gunsi!nedG. >l atributo Gunsi!nedG (sin si!no) permite sólo alores positios. =i necesitamos almacenar edades? por e8emplo? nunca !uardaremos alores ne!atios? 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!atio. 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 positios? 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) tambin aceptan el atributo Gunsi!nedG? pero el alor del l$mite superior del ran!o se mantiene.

- 25 -

1% - "ipos de datos Ka eplicamos ;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 numrico almacenar% solamente alores enteros positios 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 teto 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 tet. /) HF0>'+=A >iste ariedad de tipos numricos para representar enteros? ne!atios? 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 respectiamente. 9o eremos m%s adelante. >) +tro alor ;ue podemos almacenar es el alor GnullG. >l alor LnullL si!ni*ica Ralor desconocidoR o Gdato ineistenteG? ya lo estudiamos. Ho es lo mismo ;ue  o una cadena ac$a.

- 2 -

1' - "ipos de datos (teto) Ka eplicamos ;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 GG ;ue a entre parntesis. =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 inariable? es coneniente utili6ar el tipo charD caso contrario? el tipo archar. +cupa tantos bytes como se de*inen con el ar!umento GG. =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 GtetG. =i omite el ar!umento? coloca 1 por de*ecto. 3) blob o tetA 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? coniene 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 (numricos) asta ahora hemos isto 2 tipos de datos para almacenar alores numricosA inte!er (con y sin si!no) y *loat (con y sin si!no). >iste ariedad de tipos numricos para representar enteros? ne!atios? 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? tambin 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 positios y duplica el ran!o. 9os tipos de coma *lotante tambin 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 numrico almacenar% alores positios menores a 1? el tipo GintG no es el m%s adecuado? por;ue su ran!o a de -2 a 2 apro.? coniene 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 d0 " dF7 si t5d

- 3 -

- 31 -

20 - alores por deecto. 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 (ecepto 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 numricos el alor por de*ecto es D en caso de ser GautoNincrementG es el alor mayor eistenteT1 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? ecepto GblobG? GtetG y GautoNincrementG se pueden eplicitar 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 Garchar 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 numricos ;ue no admiten alores nulos. %i&o Ialor &or deecto Clusula JdeaultJ     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 autoincrement si!uiente de la sec#, em&iea 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 numricoA si en un campo de*inido de tipo caracter in!resamos un alor numrico? lo conierte 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 numricosA -cadenasA si en un campo numrico 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 numrico 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 eistente? aparece un mensa8e de error indicando ;ue el alor ya eiste. 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)? conierte el alor en ceros (se!:n el tipo y *ormato). Bor e8emplo? si intentamos !uardar L2UU2L en un campo de*inido de tipo GdateG? se almacena L--L. =i intentamos !uardar L2UU2 15A3L en un campo de*inido de tipo GdatetimeG? se almacena L- AAL. =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 invlido 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 ms cercano numMrico not null null error numMrico decimal nullL not null ms decimales que los deinidos redondea al ms cercano num# autoincr# cLsi!no nullLnot null 0 si!uiente de la secuencia num# autoincr# sLsi!no nullLnot null todos los menores a 1 si!uiente de la secuencia num# autoincr# cLs si!no null null si!uiente de la secuencia num# autoincr# cLs si!no nullLnot null valor eistente error echa uera de ran!o 0000-00-00 echa .70-0-700=. (otro orden) 0000-00-00

- 34 -

hora lKmite ms cercano echa " hora not null error

uera de ran!o null

- 35 -

22 - 5tributo deault 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.,7ava en 10 minutos.,.aidos.,7ava en 10 minutos.,.>uan ere"ra.,aidos.,18emploA  select re&eat(.hola.,3);

retorna GholaholaholaG. -reerse(cadena)A deuele la cadena inirtiendo el order de los caracteres. >8emploA  select reverse(.?ola.);

retorna GaloG. -insert(cadena?posicion?lon!itud?nueacadena)A retorna la cadena con la nuea 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 GGbtardesG. -lcase(cadena) y lower(cadena)A retornan la cadena con todos los caracteres en min:sculas. >8emploA  select lower(.?8N *+%EDNnte.);

retorna Ghola estudianteG.

- 44 -

 select lcase(.?8N *+%EDNnte.);

retorna Ghola estudianteG. -ucase(cadena) y upper(cadena)A retornan la cadena con todos los caracteres en may:sculas. >8emploA  select u&&er(.?8N *+%EDNnte.);

retorna G+9 >=#FJIH#>G.  select ucase(.?8N *+%EDNnte.);

retorna G+9 >=#FJIH#>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 aritmticos son GTG?G-G?GMG y GUG. #odas las operaciones matem%ticas retornan GnullG en caso de error. >8emploA  select ;ue H+ debe haber espacios entre un nombre de *unción y los parntesis 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 GG. >8emploA  select abs(-70);

retorna 2. -ceilin!()A redondea hacia arriba el ar!umento GG. >8emploA  select ceilin!(17#3G),

retorna 13. -*loor()A redondea hacia aba8o el ar!umento GG. >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 aritmticoGD retorna el resto de GnG diidido 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 GG eleado 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 GG redondeado al entero m%s cercano. >8emplosA  select round(17#3G);

retorna 12.  select round(17#=G);

retorna 13. -sr;t()A deuele la rai6 cuadrada del alor eniado como ar!umento. -truncate(?d)A retorna el n:mero GG? truncado a GdG decimales. =i GdG es ? el resultado no tendr% parte *raccionaria. >8emplosA  select truncate(173#Gstas *unciones se denominan G*unciones de a!rupamientoG por;ue operan sobre con8untos de re!istros? no con datos indiiduales. #en!a en cuenta ;ue no debe haber espacio entre el nombre de la *unción y el parntesis? 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 reistros (havin) s$ como la cl%usula GwhereG permite seleccionar (o recha6ar) re!istros indiidualesD la cl%usula Ghain!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 deuelan 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 Ghain!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)67n al!unos casos es posible con*undir las cl%usulas GwhereG y Ghain!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 deuelen 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 Ghain!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 Ghain!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 Ghain!G. eneralmente se usa la cl%usula Ghain!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 3A  select editorial, ma(&recio) rom libros !rou& b" editorial havin! ma(&recio)630;

>sta misma sentencia puede usarse empleando un GaliasG? para hacer re*erencia a la columna de la epresiónA  select editorial, ma(&recio) as .ma"or. rom libros !rou& b" editorial havin! ma"or630;

- 3 -

3' - &eistros duplicados (distinct) Con la cl%usula GdistinctG se especi*ica ;ue los re!istros con ciertos datos duplicados sean obiadas 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;

#ambin 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.;

#ambin 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 epresió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 lie .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 lie .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 clae GasG es opcional en al!unos casos? pero es coneniente 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? Ghain!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 BB

-  -

3 - Clave primaria compuesta. 9as claes primarias pueden ser simples? *ormadas por un solo campo o compuestas? m%s de un campo. 'ecordemos ;ue una clae primaria identi*ica 1 solo re!istro en una tabla. Bara un alor del campo clae eiste 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 GehiculosG con los si!uientes camposA     -

&atente char(=) not null, ti&o char (G), horalle!ada time not null, horasalida time,

Hecesitamos de*inir una clae 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 siren los otros campos. Como nin!:n campo? por si solo cumple con la condición para ser clae? es decir? debe identi*icar un solo re!istro? el alor no puede repetirse? debemos usar 2 campos. Je*inimos una clae compuesta cuando nin!:n campo por si solo cumple con la condición para ser clae. >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 clae? 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 clae primaria usamos la si!uiente sintaisA  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 clae separados por comas. =i emos la estructura de la tabla con GdescribeG emos ;ue en la columna G8emploA  dro& inde ieditorial on libros;  dro& inde itituloeditorial on libros;

=e elimina el $ndice con Gdrop indeG se!uido de su nombre y GonG se!uido del nombre de la tabla a la cual pertenece. Bodemos eliminar los $ndices creados con GindeG y con Guni;ueG pero no el ;ue se crea al de*inir una clae primaria. Fn $ndice B'I0'K se elimina autom%ticamente al eliminar la clae primaria (tema ;ue eremos m%s adelante).

- 5 -

4! - Creación de #ndices a tablas eistentes (create inde) Bodemos a!re!ar un $ndice a una tabla eistente. Bara a!re!ar un $ndice com:n a la tabla GlibrosG tipeamosA  create inde ieditorial on libros (editorial);

>ntonces? para a!re!ar un $ndice com:n a una tabla eistente usamos Gcreate indeG? indicamos el nombre? sobre ;u tabla y el o los campos por los cuales se indear%? entre parntesis. Bara a!re!ar un $ndice :nico a la tabla GlibrosG tipeamosA  create unique inde itituloeditorial on libros (titulo,editorial);

Bara a!re!ar un $ndice :nico a una tabla eistente usamos Gcreate uni;ue indeG? indicamos el nombre? sobre ;u tabla y entre parntesis? el o los campos por los cuales se indear%. Fn $ndice B'I0'K no puede a!re!arse? se crea autom%ticamente al de*inir una clae 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 numricos enteros positiosD 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 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 ecepto ;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 sintaisA create table &ostulantes(  numero int unsi!ned autoincrement,  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(.77ntonces? la sintais 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  let 4oin libros  on editoriales#codi!olibros#codi!oeditorial; select 2 rom libros let 4oin editoriales on editoriales#codi!olibros#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 inersoA 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 let 4oin libros as l on e#codi!ol#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). #ambin podemos mostrar las editoriales ;ue no est%n presentes en GlibrosGA  select e#nombre,l#titulo rom editoriales as e let 4oin libros as l on e#codi!ol#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 (riht 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 inerso? es decir? los roles de las tablas se inierten? 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 etra (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 deuelen el mismo resultadoA  select nombre,titulo rom editoriales as e let 4oin libros as l on e#codi!ol#codi!oeditorial;  select nombre,titulo rom libros as l ri!ht 4oin editoriales as e on e#codi!ol#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? deuele 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) estuieran en una sola tabla con la si!uiente estructuraA  create table comidas( codi!o tin"int unsi!ned autoincrement, nombre varchar(30), rubro varchar(70),L2&lato &rinci&al " &ostre2L &recio decimal (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 autoincrement, titulo varchar(G0) not null, autor varchar(70) deault .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 prstamo? 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#documento&#documento 4oin libros as l on codi!olibrocodi!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 eitar 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 & let 4oin socios as s on &#documentos#documento let 4oin libros as l on l#codi!o&#codi!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 & let 4oin socios as s on &#documentos#documento 4oin libros as l on &#codi!olibrol#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 let 4oin libros as l on e#codi!ol#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 let 4oin libros as l on e#codi!ol#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 deuele 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 &recioVma"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 coneió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 coneió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!oeditoriale#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!oeditoriale#codi!o where &recioVma"or&recio;  select l#titulo,l#autor,e#nombre rom libros as l 4oin editoriales as e on l#codi!oeditoriale#codi!o where e#nombreVeditorial;

- 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 autoincrement,  -titulo: varchar(G0) not null,  -autor: varchar(30),  -editorial: varchar(70) not null,  -&recio: decimal(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. #ambin 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 eiste 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 autoincrement,  -titulo: varchar(G0) not null,  -autor: varchar(30),  -codi!oeditorial: tin"int unsi!ned,  -&recio: decimal(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 deuele 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!,meceG). #ipeeemos la sentenciaA  insert into libros (titulo,autor,codi!oeditorial,&recio) select .?arr" otter " la camara secreta.,.>#A# 9owlin!.,codi!o,ntonces? se puede insertar re!istros en una tabla con la salida deuelta 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 deueltas 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 autoincrement,  -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 autoincrement,  -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 nueo 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!oeditorial1;

- 132 -

 u&date libros set editorial.*mece. where codi!oeditorial7;  u&date libros set editorial.aidos. where codi!oeditorial3; ### 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!oeditorialeditoriales#codi!o set libros#editorialeditoriales#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 nueo 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 autoincrement, titulo varchar(30), autor varchar(30), codi!oeditorial tin"int unsi!ned, &recio decimal(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!oVvalor;

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!oeditorialeditoriales#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 deuele la si!uiente in*ormaciónA en la columna G#ableG muestra el nombre de la tablaD en G+pG muestra siempre Gchecisten 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
View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF