Tutorial Completo MySql
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 - 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 (listo 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(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 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=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(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 &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.,7ava en 10 minutos.,.aidos.,7ava en 10 minutos.,.>uan ere"ra.,aidos.,18emploA 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 ;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#Gstas *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)67n 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 G8emploA 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 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(.77ntonces? 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 (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(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(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!,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 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(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
View more...
Comments