Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Curso MySQL PDF
Curso MySQL PDF
Pagina1/52
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
SolucionJava.com
(MySQL Versin 5)
Ing.CedricSimonTel:22680974Cel:88882387Email: c e d r i c @ s o l u c i o n j a v a . c o m Web:www.solucionjava.com
Curso de
programacin
en MySQL
CursodeprogramacinenMySQL
Pagina2/52
1ndice
1 ndice...........................................................................................................................................................................2
2 Introduccin al curso.................................................................................................................................................5
2.1 Objetivo de este curso........................................................................................................................................5
2.2 Manual del alumno............................................................................................................................................5
2.3 Ejercicios prcticos............................................................................................................................................5
2.4 Requisitos para atender a este curso................................................................................................................5
2.5 Soporte despues del curso..................................................................................................................................5
3 Genralidades de MySQL.............................................................................................................................................6
3.1 Historia de MySQL............................................................................................................................................6
3.2 Las principales caractersticas de MySQL......................................................................................................6
3.2.1 Interioridades y portabilidad .......................................................................................................................6
3.2.2 Tipos de columnas .......................................................................................................................................7
3.2.3 Seguridad .....................................................................................................................................................7
3.2.4 Escalabilidad y lmites .................................................................................................................................7
3.2.5 Conectividad ................................................................................................................................................7
3.2.6 Localizacin ................................................................................................................................................7
3.2.7 Clientes y herramientas ...............................................................................................................................8
3.2.8 Estabilidad de MySQL.................................................................................................................................8
3.2.9 Replicatin (Estable) ...................................................................................................................................8
3.2.10 InnoDB tablas (Estable) ............................................................................................................................8
3.2.11 BDB tablas (Estable) .................................................................................................................................8
3.2.12 Bsquedas Full-text (Estable) ...................................................................................................................9
3.2.13 MyODBC 3.51 (Estable) ...........................................................................................................................9
3.2.14 Dimensiones mximas de las tablas MySQL.............................................................................................9
4 Instalacin a base de datos.......................................................................................................................................10
4.1 Instalacin de MySQL.....................................................................................................................................10
4.1.1 Bajo Linux..................................................................................................................................................10
4.1.2 Bajo Windows............................................................................................................................................10
4.2 Instalacin herramienta de desarrollo...........................................................................................................10
5 Motores de base de datos..........................................................................................................................................11
5.1 MyISAM............................................................................................................................................................11
5.2 InnoDB..............................................................................................................................................................11
5.3 Memory (HEAP)..............................................................................................................................................11
5.4 Otros..................................................................................................................................................................11
6 Tipos de columas.......................................................................................................................................................12
6.1 Tipos numricos...............................................................................................................................................12
6.2 Fechas y horas..................................................................................................................................................13
6.3 Cadenas de caracteres......................................................................................................................................14
6.4 Requisitos de almacenamiento segn el tipo de columna.............................................................................15
7 Funciones y operadores............................................................................................................................................18
7.1 Precedencias de los operadores.......................................................................................................................18
7.2 12.1.2. Parntesis..............................................................................................................................................18
7.3 Funciones y operadores de comparacin.......................................................................................................18
7.4 Operadores lgicos...........................................................................................................................................19
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina3/52
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
CopyrightCdricSimon,2007
Pagina4/52
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina5/52
2Introduccinalcurso
2.1Objetivodeestecurso
Enestecursovamosaaprendercomoprogramardisparadores,procedimientos,yfuncionesen
MySQLversin5.0.27.
2.2Manualdelalumno
Estemanualdelalumnoesunaayudaparaelalumno,paratengaunrecuerdodelcurso.Este
manualcontieneunresumendelasmateriasquesevanaestudiarduranteelcurso,peroelalumno
deberadetomarnotaspersonalesparacompletasestemanual.
EnelCDdelcursovieneladocumentacindeMySQLenespaol,quecompletaestemanual.La
mayoriadelospuntosdeestemanualestnexplicadodemaneramscompletaenladocumantacin
deMySQLenelCD.
2.3Ejerciciosprcticos
Paracaptarmejorlateora,seharnmuchosejerciciosconlosalumnos,paraprobarlateoray
verificarlaintegracindelamateria.
Tambin,elalumnopodrcopiarsuscdigosenundisquetealfindelcursoparallevarse,confinde
seguirlaprcticaensuhogar.
2.4Requisitosparaatenderaestecurso
SerequiereunconocimientodebasedellenguajeSQL.
Sielalumnotienedificultadesenunuotrocapitulo,eldebesentirselibredepedirexplicaciones
adicionalesalprofesor.
2.5Soportedespuesdelcurso
Sitienespreguntassobrelamateriadelcursoentusejerciciosprcticos,puedesescribirtus
preguntasacedric@solucionjava.com.
Parainformacionessobreotroscursos,visitaelsitiowebwww.solucionjava.com.
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina6/52
3GenralidadesdeMySQL
3.1HistoriadeMySQL
EmpezamosconlaintencindeusarmSQLparaconectaranuestrastablasutilizandonuestras
propiasrutinasrpidasdebajonivel(ISAM).Sinembargoytrasalgunaspruebas,llegamosala
conclusinquemSQLnoeralosuficientementerpidooflexibleparanuestrasnecesidades.Esto
provoclacreacindeunanuevainterfcieSQLparanuestrabasededatosperocasiconlamisma
interfcieAPIquemSQL.EstaAPIfuediseadaparapermitircdigodeterceraspartesquefue
escritoparapoderusarseconmSQLparaserfcilmenteportadoparaelusoconMySQL.
LaderivacindelnombreMySQLnoestclara.Nuestrodirectoriobaseyungrannmerode
nuestrasbibliotecasyherramientashantenidoelprefijo"my"pormsde10aos.Sinembargo,la
hijadelcofundadorMontyWideniustambinsellamaMy.CuldelosdosdisunombreaMySQL
todavaesunmisterio,inclusoparanosotros.
ElnombredeldelfndeMySQL(nuestrologo)es"Sakila",quefuelegidoporlosfundadoresde
MySQLABdeunagranlistadenombressugeridaporlosusuariosenelconcurso"Namethe
Dolphin"(ponlenombrealdelfn).ElnombreganadorfueenviadoporAmbroseTwebaze,un
desarrolladordesoftwareOpenSourcedeSwaziland,frica.SegnAmbrose,elnombrefemeninode
SakilatienesusracesenSiSwate,elidiomalocaldeSwaziland.Sakilatambineselnombredeuna
ciudadenArusha,Tanzania,cercadelpasdeorigendeAmbrose,Uganda.
3.2LasprincipalescaractersticasdeMySQL
Lasiguientelistadescribealgunasdelascaractersticasmsimportantesdelsoftwaredebasede
datosMySQL.
3.2.1Interioridadesyportabilidad
EscritoenCyenC++
Probadoconunampliorangodecompiladoresdiferentes
Funcionaendiferentesplataformas.
UsaGNUAutomake,Autoconf,yLibtoolparaportabilidad.
APIsdisponiblesparaC,C++,Eiffel,Java,Perl,PHP,Python,Ruby,yTcl.
Usocompletodemultithreadedmediantethreadsdelkernel.Puedenusarsefcilmente
multipleCPUssiestndisponibles.
Proporcionasistemasdealmacenamientotransaccionalesynotransaccionales.
UsatablasendiscoBtree(MyISAM)muyrpidasconcompresindendice.
Relativamentesencillodeaadirotrosistemadealmacenamiento.Estoestilsidesea
aadirunainterfcieSQLparaunabasededatospropia.
Unsistemadereservadememoriamuyrpidobasadoenthreads.
Joinsmuyrpidosusandounmultijoindeunpasooptimizado.
Tablashashenmemoria,quesonusadascomotablastemporales.
LasfuncionesSQLestnimplementadasusandounalibreraaltamenteoptimizadaydeben
sertanrpidascomoseaposible.Normalmentenohayreservadememoriatrastodala
inicializacinparaconsultas.
ElcdigoMySQLsepruebaconPurify(undetectordememoriaperdidacomercial)ascomo
conValgrind,unaherramientaGPL(http://developer.kde.org/~sewardj/).
Elservidorestdisponiblecomounprogramaseparadoparausarenunentornodered
cliente/servidor.Tambinestdisponiblecomobibliotecaypuedeserincrustado(linkado)en
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina7/52
aplicacionesautnomas.Dichasaplicacionespuedenusarseporsmismasoenentornos
dondenohayreddisponible..
3.2.2Tiposdecolumnas
Diversostiposdecolumnas:enteroscon/sinsignode1,2,3,4,y8bytesdelongitud,FLOAT,
DOUBLE,CHAR,VARCHAR,TEXT,BLOB,DATE,TIME,DATETIME,TIMESTAMP,YEAR,SET,
ENUM,ytiposespacialesOpenGIS.
3.2.3Seguridad
Unsistemadeprivilegiosycontraseasqueesmuyflexibleyseguro,yquepermiteverficacin
basadaenelhost.Lascontraseassonsegurasporquetodoeltrficodecontraseasestencriptado
cuandoseconectaconunservidor.
3.2.4Escalabilidadylmites
Soporteagrandesbasesdedatos.UsamosMySQLServerconbasesdedatosquecontienen50
millonesderegistros.TambinconocemosusuariosqueusanMySQLServercon60.000tablasy
acercade5.000.000deregistros.
Sepermitenhasta64ndicesportabla(32antesdeMySQL4.1.2).Cadandicepuedeconsistirdesde
1hasta16columnasopartesdecolumnas.Elmximoanchodelmiteson1000bytes(500antesde
MySQL4.1.2).UnndicepuedeusarprefijosdeunacolumnaparalostiposdecolumnaCHAR,
VARCHAR,BLOB,oTEXT.
3.2.5Conectividad
LosclientespuedenconectarconelservidorMySQLusandosocketsTCP/IPencualquierplataforma.
EnsistemasWindowsdelafamiliaNT(NT,2000,XP,o2003),losclientespuedenusarnamedpipes
paralaconexin.EnsistemasUnix,losclientespuedenconectarusandoficherossocketUnix.
EnMySQL5.0,losservidoresWindowssoportanconexionesconmemoriacompartidasiseinicializan
conlaopcinsharedmemory.Losclientespuedenconectaratravsdememoriacompartidausando
laopcinprotocol=memory.
LainterfazparaelconectorODBC(MyODBC)proporcionaaMySQLsoporteparaprogramasclientes
queusenconexionesODBC(OpenDatabaseConnectivity).Porejemplo,puedeusarMSAccesspara
conectaralservidorMySQL.LosclientespuedenejecutarseenWindowsoUnix.Elcdigofuentede
MyODBCestdisponible.TodaslasfuncionesparaODBC2.5estnsoportadas,ascomomuchas
otras.
LainterfazparaelconectorJMySQLproporcionasoporteparaclientesJavaqueusenconexiones
JDBC.EstosclientespuedenejecutarseenWindowsoUnix.ElcdigofuenteparaelconectorJest
disponible.
3.2.6Localizacin
Elservidorpuedeproporcionarmensajesdeerroralosclientesenmuchosidomas.
Soportecompletoparadistintosconjuntosdecarcteres,incluyendolatin1(ISO88591),german,
big5,ujis,yms.Porejemplo,loscarcteresescandinavos'',''y''estnpermitidosennombresde
tablasycolumnas.ElsoporteparaUnicodeestdisponible.
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina8/52
Todoslosdatosseguardanenelconjuntodecarctereselegido.Todaslascomparacionespara
columnasnormalesdecadenasdecarcteressoncaseinsensitive.
Laordenacinserealizaacordealconjuntodecarctereselegido(usandocolacinSuecapordefecto).
3.2.7Clientesyherramientas
MySQLservertienesoporteparacomandosSQLparachequear,optimizar,yreparartablas.Estos
comandosestndisponiblesatravsdelalneadecomandosyelclientemysqlcheck.MySQL
tambinincluyemyisamchk,unautilidaddelneadecomandosmuyrpidaparaefectuarestas
operacionesentablasMyISAM.
TodoslosprogramasMySQLpuedeninvocarseconlasopcioneshelpo?paraobtenerasistenciaen
lnea.
3.2.8EstabilidaddeMySQL
Estaseccintratalaspreguntas"QuestabilidadtieneMySQLServer?"y,"Puedofiarmede
MySQLServerparaesteproyecto?"Intentaremosclarificarestascuestionesyresponderalgunas
preguntasimportantesquepreocupanamuchosusuariospotenciales.Lainformacinenestaseccin
sebasaendatosrecopiladosdelaslistasdecorreo,quesonmuyactivasparaidentificarproblemas
ascomoparareportartiposdeusos.
Elcdigooriginalseremontaalosprinciposdelosaos80.EnTcX,lapredecesoradeMySQLAB,el
cdigoMySQLhafuncionadoenproyectosdesdemediadosde1996sinningnproblema.Cuandoel
softwaredebasededatosMySQLfuedistribudoentreunpblicomsamplio,nuestrosnuevos
usuariosrpidamenteencontrarontrozosdecdigonoprobados.Cadanuevaversindesdeentonces
hatenidopocosproblemasdeportabilidadinclusoconsiderandoquecadanuevaversinhatenido
muchasnuevasfuncionalidades.
CadaversindeMySQLServerhasidousable.Losproblemashanocurridonicamentecuandolos
usuarioshanprobadocdigodelas"zonasgrises".Naturalmente,losnuevosusuariosnoconocen
culessonestaszonas;estaseccin,porlotanto,tratadedocumentardichasreasconocidasadade
hoy.Lasdescripcionesmayormentesecorrespondenconlaversin3.23,4.0y4.1deMySQLServer.
Todoslosbugsreportadosyconocidossearreglanenlaltimaversin,conlasexcepcioneslistadas
enlasseccionesdebugsyqueestnrelacionadosconproblemasdediseo.
3.2.9ModulosdeMySQL
EldiseodeMySQLServeresmulticapa,conmdulosindependientes.Algunosdelosltimos
mdulosselistanacontinuacinconunaindicacindelobientesteadosqueestn:
1.1.1.1
Replicatin(Estable)
Haygrandesgruposdeservidoresusandoreplicacinenproduccin,conbuenosresultados.Se
trabajaparamejorarcaractersticasdereplicacinenMySQL5.x.
1.1.1.2
InnoDBtablas(Estable)
ElmotordealmacenamientotransaccionalInnoDBesestableyusadoengrandessistemasde
produccinconaltacargadetrabajo.
1.1.1.3
BDBtablas(Estable)
ElcdigoBerkeleyDBesmuyestable,perotodavaloestamosmejorandoconelinterfazdelmotorde
almacenamientotransaccionalBDBenMySQLServer.
1.1.1.4
BsquedasFulltext(Estable)
BsquedasFulltextesmpliamenteusada.
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
1.1.1.5
Pagina9/52
MyODBC3.51(Estable)
MyODBC3.51usaODBCSDK3.51yesusadoensistemasdeproduccinmpliamente.Algunas
cuestionessurgidasparecensercuestindelasaplicacionesquelousaneindependientesdel
controladorODBColabasededatossubyacente.
3.2.10DimensionesmximasdelastablasMySQL
EnMySQL5.0,usandoelmotordealmacenamientoMyISAM,elmximotamaodelastablasesde
65536terabytes(256^71bytes).Porlotanto,eltamaoefectivomximoparalasbasesdedatos
enMySQLusualmentelosdeterminanloslmitesdetamaodeficherosdelsistemaoperativo,yno
porlmitesinternosdeMySQL.
ElmotordealmacenamientoInnoDBmantienelastablasenunespacioquepuedesercreadoapartir
devariosficheros.Estopermitequeunatablasupereeltamaomximoindividualdeunfichero.
Esteespaciopuedeincluirparticionesdedisco,loquepermitetablasextremadamentegrandes.El
tamaomximodelespaciodetablases64TB.
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina10/52
4Instalacinabasededatos
4.1InstalacindeMySQL
EnestecursovamosautilizarlabasededatosMySQL,ensuversin5.0.27.Poresolavamosa
instalarya.
4.1.1BajoLinux
ParainstalarMySQLvamosprimeroaentrarcomoelusuarioRoot(ousarsu).
Luegoabrimosunaventanadeconsola,introducemoselCDdelcurso,yvamosainstalarlaversion
deMySQLqueestaenelCDlanzandodesdeelCDlainstruccin:
rpm -iv MySQL-server-5.0.27-0.glibc23.i386.rpm parainstalarelsevidor
rpm -iv MySQL-client-5.0.27-0.glibc23.i386.rpm parainstalarelcliente
EsoinstalloMySQLbajo/usr/bin.
Vamosacrearunacarpeta/mysqlconteniendolosatajoshaciaprogramasdeMySQL.
. createMySQLlinks.sh
Vamosahoraacambiarlaclavedelusuarioroot.Paracambiarlaclave,entraen/mysqlyejecuta:
/usr/bin/mysqladmin -u root password 'SolPHP'.Lanuevaclavesera'SolPHP'.
ParaverificarqueMySQLestabieninstaladoyseinicia,ejecuta'rcmysql
restart'comoRoot.
Yahoravamosacrearlabasededatosdelcurso:
cd /media/CD
/mysql/mysql -u root -pSolJava
create database curso;
exit;
/mysql/mysql -u root -pSolJava curso < curso.sql
4.1.2BajoWindows
BajoWindowssolosecorreelarchivomysql5.0.27win32.execonunusuarioconderechode
administrador.
SerequiereunsistemaoperativoWindowsde32bits,talcomo9x,Me,NT,2000,XP,oWindows
Server2003.
SerecomiendafuertementeelusodeunsistemaoperativoWindowsbasadoenNT(NT,2000,XP,
2003)puestoquestospermitenejecutarelservidorMySQLcomounservicio
4.2Instalacinherramientadedesarrollo
ComoherramientadedesarrollovamosautilizarlaversingratisdeEMSMySQLManagerLite,
quecorrebajoWindows.HastaahoranoheencontradoherramientagratisbajoLinuxquepermite
gestionarcomodamentelasprincipalesnuevasfuncionesdeMySQL5quesonlostriggers,
procedimientos,funciones,yvistas.
ExistenmuchasherramientaslibresparaMySQ,funccionandobajoLinuxcomoWindows.Lasmas
conocidassonphpMyAdminyMySQLGUItoolsdeMySQLAB.Peroningunodeestasherramientas
permitemanejardemaneracomodalasvistas,lostriggers,olosprocedimientos/funciones.
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina11/52
5Motoresdebasededatos
5.1MyISAM
EselprimermotordeMySQL.PordefectosecreanlastablasusandoelmotorMyISAM.
Estemotorcrealastablascomoarchivosdetexto.Unarchivoportabla.
ElmotorMyISAMesmuyveloz,especialmenteenlectura,peronosoporta(todavia)lasclaves
primariasysecundarias,nilastransacciones(commit/rollback).
5.2InnoDB
Eselmotorparabasesdedatostransacionalesy/oconclavesprimariaysecundaria.Eselmotorque
vamosautilizarenestecurso.Sepuededefinircomomotorpordefectoaniveldelabasededatosy/o
aniveldelservidor.
5.3Memory(HEAP)
Estemotorcreatablastemporalesenlamemoria.Elacesoesentoncesmuyrpido,peroconsume
memoriasisealmacenamuchasdatos.
5.4Otros
MySQLtraevariosotrostiposdemotoresdebasesdedatos,consusespecificidades.Entreotros
BDB,CSV,...VerladocumentacindeMySQLparamasdetalles.
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina12/52
6Tiposdecolumas
6.1Tiposnumricos
Acontinuacinhayunresumendelostiposdecolumnasnumricos.
Mindicalaanchuramximaparamostrar.Laanchuramximaes255.
SiespecificaZEROFILLparacolumnasnumricas,,MySQLaadeautomticamenteelatributo
UNSIGNEDenlacolumna.
SERIALesunaliasparaBIGINT UNSIGNED NOT NULL AUTO_INCREMENT.
SERIAL DEFAULT VALUEenladefinicindeunacolumnadetipoenteroesunaliasparaNOT NULL
AUTO_INCREMENT UNIQUE.
Tipo
Bytes ValorMnimo
TINYINT
SMALLINT
1
2
MEDIUMINT 3
4
INT
BIGINT
ValorMximo
(Consigno/Sinsigno)
(Consigno/Sinsigno)
-128
127
255
-32768
32767
65535
-8388608
8388607
16777215
-2147483648
2147483647
4294967295
-9223372036854775808 9223372036854775807
0
18446744073709551615
BIT[(M)]
Enuntipodedatosbit.Mindicaelnmerodebitsporvalor,de1a64.Elvalorpordefectoes
1siseomiteM.
TINYINT[(M)] [UNSIGNED] [ZEROFILL]
Unenteromuypequeo.Elrangoconsignoesde-128a127.Elrangosinsignoesde0a
255.
BOOL,BOOLEAN
SonsinnimosparaTINYINT(1).Unvalordeceroseconsiderafalso.Valoresdistintosacero
seconsideranciertos.
Enelfuturo,seintroducirtratamientocompletodetiposbooleanossegnelestndardSQL.
SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
Unenteropequeo.Elrangoconsignoesde-32768a32767.Elrangosinsignoesde0a
65535.
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
Enterodetamaomedio.Elrangoconsignoesde-8388608a8388607.Elrangosinsingo
esde0a16777215.
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina13/52
Unenterodetamaonormal.Elrangoconsignoesde-2147483648a2147483647.El
rangosinsignoesde0a4294967295.
INTEGER[(M)] [UNSIGNED] [ZEROFILL]
EsunsinnimodeINT.
BIGINT[(M)] [UNSIGNED] [ZEROFILL]
Unenterogrande.Elrangoconsignoesde-9223372036854775808a
9223372036854775807.Elrangosinsignoesde0a18446744073709551615.
AlgunosaspectosaconsiderarconrespectoalascolumnasBIGINT:
FLOAT(p) [UNSIGNED] [ZEROFILL]
Nmeroconcomaflotante.prepresentalaprecisin.Puedeirde0a24paranmerosde
comaflotantedeprecisinsencillayde25a53paranmerosdecomaflotantecondoble
precisin.
EstasintaxisseproprocionaparacompatibilidadconODBC.
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
Unnmerodecomaflotantepequeo(deprecisinsimple).Losvalorespermitidossonde
-3.402823466E+38a-1.175494351E-38,0,yde1.175494351E-38a
3.402823466E+38.FLOATsinargumentosoFLOAT(p)(dondepestenelrangode0a24)
esunnmerodecomaflotanteconprecisinsimple.
DOUBLE[(M,B)] [UNSIGNED] [ZEROFILL]
Nmerodecomaflotantedetamaonormal(precisindoble).Losvalorespermitidossonde1.7976931348623157E+308a-2.2250738585072014E-308,0,yde
2.2250738585072014E-308a1.7976931348623157E+308.Unnmerodecomaflotante
conprecisionsencillatieneunaprecisinde7decimalesaproximadamente;unnmerocon
comaflotantededobleprecisintieneunaprecisinaproximadade15decimales.
DOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL],REAL[(M,D)] [UNSIGNED]
[ZEROFILL]
DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]
ApartirdeMySQL5.0.3:
Nmerodepuntofijoexactoyempaquetado.MeselnmerototaldedgitosyDeselnmero
dedecimales.Elpuntodecimaly(paranmerosnegativos)elsigno'-'nosetieneencuenta
enM.SiDes0,losvaloresnotienenpuntodecimalopartefraccional.
SiseomiteD,elvalorpordefectoes0.SiseomiteM,elvalorpordefectoes10.
Todoslosclculosbsicos(+, -, *, /)concolumnasDECIMALsehacenconprecisinde64
dgitosdecimales.
DEC[(M[,D])] [UNSIGNED] [ZEROFILL],NUMERIC[(M[,D])] [UNSIGNED]
[ZEROFILL],FIXED[(M[,D])] [UNSIGNED] [ZEROFILL]
SonsinnimosparaDECIMAL.ElsinnimoFIXEDestdisponibleporcompatibilidadconotros
TodalaaritmticasehaceusandovaloresBIGINToDOUBLE,asquenodebeusarenterossinsignos
mayoresque9223372036854775807(63bits)exceptconfuncionesbit!Silohace,algunosdelos
ltimosdgitosenelresultadopuedensererrneosporculpadeerroresderedondeoalconvertir
valoresBIGINTaDOUBLE.
Paradarlesunaidea,unINTunsignedpermitealmacenarunnumeroporsegundodurante135aos.
unBIGINTunsigned,1.000.000denumerosporsegundodurantemasde500.000aos...
6.2Fechasyhoras
Unresumendelostiposdecolumnastemporalessemuestraacontinuacin.
DATE
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina14/52
Unafecha.Elrangosoportadoesde'1000-01-01'a'9999-12-31'.MySQLmuestra
valoresDATEenformato'YYYY-MM-DD',peropermiteasignarvaloresacolumnasDATE
usandocadenasdecarcteresonmeros.
DATETIME
Combinacindefechayhora.Elrangosoportadoesde'1000-01-01 00:00:00'a'999912-31 23:59:59'.MySQLmuestravaloresDATETIMEenformato'YYYY-MM-DD
HH:MM:SS',peropermiteasignarvaloresalascolumnasDATETIMEusandocadenasde
carcteresonmeros.
TIMESTAMP[(M)]
Unamarcatemporal.Elrangoesde'1970-01-01 00:00:00'hastaelao2037.
UnacolumnaTIMESTAMPestilpararegistrarlafechayhoradeunaoperacinINSERTo
UPDATE.LaprimeracolumnaTIMESTAMPenunatablaserellenaautomticamenteconla
fechayhoradelaoperacinmsrecientesinoleasignaunvalor.Puedeasignaracualquier
columnaTIMESTAMPlafechayhoraactualasignndoleunvalorNULL.
EnMySQL5.0,TIMESTAMPseretornacomounacadenadecarcteresenelformato'YYYYMM-DD HH:MM:SS'cuyaanchurademuestrason19carcteres.Siquiereobtenerelvalor
comounnmero,debeaadir+0alacolumatimestamp.
TIME
Unahora.Elrangoesde'-838:59:59'a'838:59:59'.MySQLmuestralosvaloresTIME
enformato'HH:MM:SS',peropermiteasingarvaloresacolumnasTIMEusandonmeroso
cadenasdecarcteres.
YEAR[(2|4)]
Unaoenformatodedosocuatrodgitos.Elvalorpordefectoestenformatodecuatro
dgitos.Enformatodecuatrodgitos,losvalorespermitidossonde1901a2155,y0000.En
formatodedosdgitos,losvalorespermitidossonde70a69,representandolosaosde1970
a2069.MySQLmuestralosvaloresYEARenformatoYYYYperopermiteasignarvaloresa
columnasYEARusandocadenasdecarctere
TipodeColumna CeroValor
DATETIME
'0000-00-00 00:00:00'
DATE
'0000-00-00'
TIMESTAMP
00000000000000
TIME
'00:00:00'
YEAR
0000
6.3Cadenasdecaracteres
Unresumendelostiposdecolumnasdecadenasdecarcteressemuestraacontinuacin.
Enalgunoscasos,MySQLpuedecambiarunacolumnadecadenadecarcteresauntipodiferente
parauncomandoCREATE TABLEoALTER TABLE.
LostiposdecadenasdecarcteresMySQL5.0incluyenalgunascaractersticasquepuedequeno
hayaencontradotrabajandoconversionesanterioresdeMySQLanterioresala4.1:
CHAR
EsunsinnimodeCHAR(1).
BINARY(M)
EltipoBINARYessimilaraltipoCHAR,peroalmacenacadenasdedatosbinariosenlugarde
cadenasdecarcteresnobinarias.
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina15/52
VARBINARY(M)
EltipoVARBINARYessimilaraltipoVARCHAR,peroalmacenacadenasdecarcteresbinarias
enlugardecadenasdecarcteresnobinarias.
TINYBLOB
UnacolumnaBLOBconunalongitudmximade255(2^81)bytes.
TINYTEXT
UnacolumnaTEXTconlongitudmximade255(2^81)carcteres.
BLOB[(M)]
UnacolumnaBLOBconlongitudmximade65,535(2^161)bytes.
TEXT[(M)]
UnacolumnaTEXTconlongitudmximade65,535(2^161)carcteres.
MEDIUMBLOB
UnacolumnaBLOBconlongitudde16,777,215(2^241)bytes.
MEDIUMTEXT
UnacolumnaTEXTconlongitudmximade16,777,215(2^241)carcteres.
LONGBLOB
UnacolumnaBLOBconlongitudmximade4,294,967,295o4GB(2^321)bytes.Lalongitud
mximaefectiva(permitida)delascolumnasLONGBLOBdependedeltamaomximo
configuradoparalospaquetesenelprotocolocliente/servidorylamemoriadisponible.
LONGTEXT
UnacolumnaTEXTconlongitudmximade4,294,967,295or4GB(2^321)carcteres.La
longitudmximaefectiva(permitida)decolumnasLONGTEXTdependedeltamaomximode
paqueteconfiguradoenelprotocolocliente/servidorylamemoriadisponible.
ENUM('value1','value2',...)
Unaenumeracin.Unobjetodecadenadecarcteresqueslopuedetenerunvalor,elegido
deunalistadevalores'value1','value2',...,NULLoelvalordeerrorespecial''.Una
columnaENUMpuedetenerunmximode65,535valoresdistintos.LosvaloresENUMse
representaninternamentecomoenteros.
SET('value1','value2',...)
Unconjunto.Unobjetodecadenadecarcteresquepuedetenerceroomsvaloresquedeben
pertenceralalistadevalores'value1','value2',...UnacolumnaSETpuedetenerun
mximode64miembros.LosvaloresSETserepresentaninternamentecomoenteros.
Los tipos CHAR y VARCHAR son similares, pero difieren en cmo se almacenan y
recuperan. Desde MySQL 5.0.3, tambin difieren en la longitud mxima y en cmo
se tratan los espacios finales.
LostiposCHARyVARCHARsedeclaranconunalongitudqueindicaelmximonmerodecarcteres
quequierealmacenar.Porejemplo,CHAR(30)puedealmacenarhasta30carcteres.
LalongituddeunacolumnaCHARsefijaalalongitudquesedeclaraalcrearlatabla.Lalongitud
puedesercualquiervalorde0a255.CuandolosvaloresCHARsealmacenan,seaadenespaciosala
derechahastalaslongitudespecfica.CuandolosvaloresCHARserecuperan,estosespaciosseborran.
LosvaloresencolumnasVARCHARsoncadenasdecarcteresdelongitudvariable.EnMySQL5.0,la
longitudpuedeespecficarsede0a255antesdeMySQL5.0.3,yde0a65,535en5.0.3yversiones
posteriores.(LamximalongitudefectivadeunVARCHARenMySQL5.0sedeterminaporeltamao
deregistromximoyelconjuntodecarcteresusados.Lalongitudmximatotalesde65,532bytes.)
EncontrasteconCHAR,VARCHARalmacenalosvaloresusandosloloscarcteresnecesarios,msun
byteadicionalparalalongitud(dosbytesparacolumnasquesedeclaranconunalongitudsuperiora
255).
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina16/52
6.4Requisitosdealmacenamientosegneltipode
columna
Losrequerimientosdealmacenamientoparacadaunodelostiposdecolumnassoportadospor
MySQLselistanporcategora.
ElmximotamaodeunregistroenunatablaMyISAMes65,534bytes.CadacolumnaBLOByTEXT
cuentaslodecincoanuevebytesmsalladesutamao.
SiunatablaMyISAMincluyecualquiertipodecolumnadetamaovariable,elformatoderebistro
tambintienelongitudvariable.Cuandosecreaunatabla.MySQLpuede,bajociertascondiciones,
cambiarunacolumnadetamaovariableafijooviceversa.
.
Requerimientosdealmacenamientoparatiposnumricos
Tipodecolumna
Almacenamientorequerido
TINYINT
1byte
SMALLINT
2bytes
MEDIUMINT
3bytes
INT,INTEGER
4bytes
BIGINT
8bytes
FLOAT(p)
4bytessi0<=p<=24,8bytessi25<=p<=53
FLOAT
4bytes
Vara;consultelasiguienteexplicacin
BIT(M)
aproximadamente(M+7)/8bytes
Requerimientosdealmacenamientoparatiposdefechayhora
Tipodecolumna Almacenamientorequerido
DATE
3bytes
DATETIME
8bytes
TIMESTAMP
4bytes
TIME
3bytes
YEAR
1byte
Requerimientosdealmacenamientoparatiposdecadenasdecarcteres
Tipodecolumna
Almacenamientorequerido
CHAR(M)
Mbytes,0<= M <=255
VARCHAR(M)
BINARY(M)
Mbytes,0<= M <=255
VARBINARY(M)
TINYBLOB,TINYTEXT
L+1byte,dondeL<2^8
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
BLOB,TEXT
Pagina17/52
L+2bytes,dondeL<2^16
MEDIUMBLOB,MEDIUMTEXT L+3bytes,dondeL<2^24
LONGBLOB,LONGTEXT
L+4bytes,dondeL<2^32
ENUM('value1','value2' 1o2bytes,dependiendodelnmerodevaloresdelaenumeracin
(65,535valorescomomximo)
,...)
SET('value1','value2', 1,2,3,4,o8bytes,dependiendodelnmerodemiembrosdelconjunto
(64miembroscomomximo)
...)
LostiposVARCHARyBLOByTEXTsondelongitudvariable.Paracadauno,losrequerimientosde
almacenamientodependedelalongituddelosvaloresdela(representadosporLenlatabla
precedente),enlugarqueeltamaomximodeltipo.Porejemplo,unacolumnaVARCHAR(10)puede
tratarunacadenaconunalengitudmximade10.Elalmacenamientorequeridorealeslalongitud
delacadena(L),ms1bytepararegistrarlalongituddelacadena.Paralacadena'abcd',Les4y
elrequerimientodealmacenamientoson5.
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina18/52
7Funcionesyoperadores
7.1Precedenciasdelosoperadores
Laprecedenciadeoperadoressemuestraenlasiguientelista,demenoramayorprecedencia.Los
operadoresquesemuestranjuntosenunalneatienenlamismaprecedencia.
:=
||, OR, XOR
&&, AND
NOT
BETWEEN, CASE, WHEN, THEN, ELSE
=, <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN
|
&
<<, >>
-, +
*, /, DIV, %, MOD
^
- (resta unaria), ~ (inversin de bit unaria)
!
BINARY, COLLATE
7.212.1.2.Parntesis
( ... )
Useparntesisparaforzarelordendeevaluacinenunaexpresin.Porejemplo:
mysql> SELECT 1+2*3;
-> 7
mysql> SELECT (1+2)*3;
-> 9
7.3Funcionesyoperadoresdecomparacin
Lasoperacionesdecomparacindanunvalorde1(CIERTO),0(FALSO),oNULL.Estasoperaciones
funcionantantoparanmeroscomoparacadenasdecaracteres.Lascadenasdecaracteresse
conviertenautomticamenteennmerosylosnmerosencadenascuandoesnecesario.
Algunasdelasfuncionesdeestaseccin(talescomoLEAST()yGREATEST())retornanvalores
distintosa1(CIERTO),0(FALSO),oNULL.Sinembargo,elvalorqueretornansebasaen
operacionesdecomparacinrealizadascomodescribenlassiguientesreglas.
MySQLcomparavaloresusandolassiguientesreglas:
SiunooambosargumentossonNULL,elresultadodelacomparacinesNULL,exceptoparael
operadordecomparacinNULLsafe<=>.
Siambosargumentosenunaoperacindecomparacinsoncadenas,secomparancomo
cadenas.
Siambosargumentossonenteros,secomparancomoenteros.
Losvaloreshexadecimalessetratancomocadenasbinariassinosecomparanconunnmero.
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina19/52
SiunodelosargumentosesunacolumnaTIMESTAMPoDATETIMEyelotroargumentoesuna
constante,laconstanteseconvierteentimestampantesderealizarlacomparacin.Estose
haceparaacercarsealcomportamientodeODBC.EstonosehaceparaargumentosenIN()!
Paraestarseguro,siempreusecadenascompletasdefechas/horasalhacercomparaciones.
Entodoslosotroscasos,losargumentossecomparancomonmerosconpuntoflotante
(reales).
Pordefecto,lacomparacindecadenasnoessensibleamaysculasyusaelconjuntodecarcteres
actual(ISO88591Latin1pordefecto,quesiemprefuncionabienparaingls).
Parconvertirunvalorauntipoespecficoparaunacomparacin,puedeusarlafuncinCAST().Los
valoresdecadenasdecaracterespuedenconvertirseaunconjuntodecaracteresdistintousando
CONVERT().
7.4Operadoreslgicos
EnSQL,todoslosoperadoreslgicosseevalanaTRUE,FALSE,oNULL(UNKNOWN).EnMySQL,se
implementancomo1(TRUE),0(FALSE),yNULL.Lamayoradeestoescomnendiferentesservidores
debasesdedatosSQLaunquealgunosservidorespuedenretornarcualquiervalordistintoacero
paraTRUE.
NOT,!
NOTlgica.Seevalaa1sieloperandoes0,a0sieloperandoesdiferenteacero,yNOT
NULLretornaNULL.
AND,&&
ANDlgica.Seevalaa1sitodoslosoperandossondistintosaceroynoNULL,a0siunoo
msoperandosson0,deotromodoretornaNULL.
OR,||
ORlgica.CuandoambosooperandossonnoNULL,elresultadoes1sialgnoperandoes
diferenteacero,y0deotromodo.ConunoperandoNULLelresultadoes1sielotrooperando
noescero,yNULLdeotromodo.SiambosoperandossonNULL,elresultadoesNULL.
XOR
XORlgica.RetornaNULLsialgnoperandoesNULL.ParaoperandosnoNULL,evalaa1si
unnmeropardeoperandosesdistintoacero,sinoretorna0.
7.5Funcionesdecontroldeflujo
result ...] [ELSE result] END,CASE WHEN [condition] THEN result [WHEN
[condition] THEN result ...] [ELSE result] END
Laprimeraversinretornaresultdondevalue=comparevalue.Lasegundaversinretornael
resultadoparalaprimeracondicinqueescierta.Sinohayningnresultadocoincidente,el
resultadotrasELSEseretorna,oNULLsinohayparteELSE.
mysql>SELECTCASE1WHEN1THEN'one'
>WHEN2THEN'two'ELSE'more'END;
>'one'
IF(expr1,expr2,expr3)
Siexpr1esTRUE(expr1 <> 0andexpr1 <> NULL)entoncesIF()retornaexpr2;deotro
modoretornaexpr3.IF()retornaunvalornumricoocadenadecarcteres,enfuncindel
contextoenqueseusa.
mysql>SELECTIF(1>2,2,3);
>3
IFNULL(expr1,expr2)
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina20/52
Siexpr1noesNULL,IFNULL()retornaexpr1,deotromodoretornaexpr2.IFNULL()
retornaunvalornumricoodecadenadecarcteres,enfuncindelcontextoenqueseusa.
mysql>SELECTIFNULL(1,0);
>1
mysql>SELECTIFNULL(NULL,10);
>10
NULLIF(expr1,expr2)
RetornaNULLsiexpr1 = expr2escierto,deotromodoretornaexpr1.EslomismoqueCASE
WHEN expr1 = expr2 THEN NULL ELSE expr1 END.
mysql>SELECTNULLIF(1,1);
>NULL
mysql>SELECTNULLIF(1,2);
>1
7.6Funcionesdecomparacindecadenasdecaracteres
LasfuncionesdecadenasdecarcteresretornanNULLsilalongituddelresultadoesmayorqueel
valordelavariabledesistemamax_allowed_packet.
Parafuncionesqueoperanenposicionesdecadenasdecarcteres,laprimeraposicinesla1.
ASCII(str)
Retornaelvalornumricodelcarctermsalaizquierdadelacadenadecarcteresstr.
Retorna0sistreslacadenavaca.RetornaNULLsistresNULL.ASCII()funcionapara
carcteresconvaloresnumricosde0a255.
mysql>SELECTASCII('2');
>50
CONCAT(str1,str2,...)
Retornalacadenaresultadodeconcatenarlosargumentos.RetornaNULLsialgna
argumentoesNULL.Puedetenerunoomsargumentos.Sitodoslosargumentossoncadenas
nobinarias,elresultadoesunacadenanobinaria.Silosargumentosincluyencualquier
cadenabinaria,elresultadoesunacadenabinaria.Unargumentonumricoseconvierteasu
formadecadenabinariaequivalente;siquiereevitarlopuedeusarconversindetipos
explcita,comoenesteejemplo:SELECT CONCAT(CAST(int_col AS CHAR), char_col)
mysql>SELECTCONCAT('My','S','QL');
>'MySQL'
mysql>SELECTCONCAT('My',NULL,'QL');
>NULL
mysql>SELECTCONCAT(14.3);
>'14.3'
CONCAT_WS(separator,str1,str2,...)
CONCAT_WS()significaCONCATWithSeparator(CONCATconseparador)yesunaforma
especialdeCONCAT().Elprimerargumentoeselseparadorparaelrestodeargumentos.El
separadorseaadeentrelascadenasaconcatenar.Elseparadorpuedeserunacadenacomo
elrestodeargumentos.SielseparadoresNULL,elresultadoesNULL.Lafuncinevita
valoresNULLtraselargumentoseparador.
mysql>SELECTCONCAT_WS(',','Firstname','Secondname','LastName');
>'Firstname,Secondname,LastName'
mysql>SELECTCONCAT_WS(',','Firstname',NULL,'LastName');
>'Firstname,LastName'
EnMySQL5.0,CONCAT_WS()noevitacadenasvacas.(Sinembargo,evitaNULLs.)
INSTR(str,substr)
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina21/52
Retornalaposicindelaprimeraocurrenciadelasubcadenasubstrenlacadenastr.Eslo
mismoquelaformadedosargumentosdeLOCATE(),exceptoqueelordendelosargumentos
esinverso.
mysql>SELECTINSTR('foobarbar','bar');
>4
mysql>SELECTINSTR('xbar','foobar');
>0
Estafuncinpuedetrabajarconmltiplesbytes.EnMySQL5.0,sloessensiblea
maysculassiunodelosargumentosesunacadenabinaria.
LENGTH(str)
Retornalalongituddelacadenastr,medidaenbytes.Uncarctermultibytecuentacomo
mltiplesbytes.Estosignificaqueparacadenasquecontengancincocarcteresdedosbytes,
LENGTH()retorna10,mientrasqueCHAR_LENGTH()retorna5.
mysql>SELECTLENGTH('text');
>4
REPLACE(str,from_str,to_str)
Retornalacadenastrcontodaslasocurrenciasdelacadenafrom_strreemplazadasconla
cadenato_str.
mysql>SELECTREPLACE('www.mysql.com','w','Ww');
>'WwWwWw.mysql.com'
Estafuncintrabajaconmltiplesbytes.
SUBSTRING(str,pos),SUBSTRING(str FROM pos),SUBSTRING(str,pos,len),
SUBSTRING(str FROM pos FOR len)
Lasformassinelarguemntolenretornanunasubcadenadelacadenastrcomenzandoenla
posicinpos.Lasformasconelargumentolenretornanunasubcadenadelongitudlena
partirdelacadenastr,comenzandoenlaposicinpos.LasformasqueusanFROMson
sintaxisSQLestndard.EnMySQL5.0,esposibleusarvaloresnegativosparapos.Eneste
caso,eliniciodelasubcadenasonposcarcteresapartirdelfinaldelacadena,enlugardel
principio.Unvalornegativopuedeusarseparaposencualquierdelasformasdeesta
funcin.
mysql>SELECTSUBSTRING('Quadratically',5);
>'ratically'
mysql>SELECTSUBSTRING('foobarbar'FROM4);
>'barbar'
mysql>SELECTSUBSTRING('Quadratically',5,6);
>'ratica'
mysql>SELECTSUBSTRING('Sakila',3);
>'ila'
mysql>SELECTSUBSTRING('Sakila',5,3);
>'aki'
mysql>SELECTSUBSTRING('Sakila'FROM4FOR2);
>'ki'
Estafuncintrabajaconmltiplesbytes.
Tengaencuentaquesiusaunvalormenora1paralen,elresultadosiempreesunacadena
vaca.
SUBSTR()essinnimodeSUBSTRING().
SUBSTRING_INDEX(str,delim,count)
Retornalasubcadenadelacadenastrantesdecountocurrenciasdeldelimitadordelim.Si
countespositivo,todoalaizquierdadeldelimitadorfinal(contandodesdelaizquierda)se
retorna.Sicountesnegativo,todoaladerechadeldelimitadorfinal(contandodesdela
derecha)seretorna.
mysql>SELECTSUBSTRING_INDEX('www.mysql.com','.',2);
>'www.mysql'
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina22/52
mysql>SELECTSUBSTRING_INDEX('www.mysql.com','.',2);
>'mysql.com'
Estafuncintrabajaconmltiplesbytes.
TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str),TRIM(remstr FROM]
str)
Retornalacadenastrcontodoslosprefijosy/osufijosremstreliminados.Siningunodelos
especificadoresBOTH,LEADING,osedaTRAILING,BOTHseasumen.Siremstresopcionaly
noseespecifica,losespaciosseeliminan.
mysql>SELECTTRIM('bar');
>'bar'
mysql>SELECTTRIM(LEADING'x'FROM'xxxbarxxx');
>'barxxx'
mysql>SELECTTRIM(BOTH'x'FROM'xxxbarxxx');
>'bar'
mysql>SELECTTRIM(TRAILING'xyz'FROM'barxxyz');
>'barx'
Estafuncintrabajaconmltiplesbytes.
7.7Funcionesdecomparacindecadenasdecaracteres
MySQLconvierteautomticamentenmerosacadenassegnesnecesarioyviceversa.
mysql>SELECT1+'1';
>2
mysql>SELECTCONCAT(2,'test');
>'2test'
Siquiereconvertirunnmeroacadenaexplcitamente,uselafuncinCAST():
mysql>SELECT38.8,CAST(38.8ASCHAR);
>38.8,'38.8'
Siunafuncindecadenasdaunacadenabinariacomoargumento,lacadenaresultantetambines
binaria.Unnmeroconvertidoacadenasetratacomocadenabinaria(estoes,essensiblea
maysculasencomparaciones).Estoafectasloacomparaciones.
Normalmente,siunaexpresinenunacomparacindecadenasessensibleamaysculas,la
comparacinserealizaconsensibilidadamaysculas.
expr LIKE pat [ESCAPE 'escapechar']
CoincidenciadepatronesusandocomparacinmedianteexpresionesregularesSQL.Retorna
1(TRUE)o0(FALSE).SiexpropatesNULL,elresultadoesNULL.
Elpatrnnopuedeserunacadenaliteral.Porejemplo,puedeespecificarsecomoexpresinde
cadenaocolumna.
ConLIKEpuedeusarlossiguientesdoscarcterescomodnenelpatrn:
Carcter
Descricin
Coincidenciadecualquiernmerodecarcteres,inclusocerocarcteres
Coincideexactementeuncarcter
mysql>SELECT'David!'LIKE'David_';
>1
mysql>SELECT'David!'LIKE'%D%v%';
>1
expr NOT LIKE pat [ESCAPE 'escapechar']
EslomismoqueNOT (expr LIKE pat [ESCAPE 'escapechar']).
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina23/52
7.8Operadoresaritmticos
Losoperadoresaritmticosusualesestndisponibles.Tengaencuentaqueenelcasode-,+,y*,el
resultadosecalculaconprecisinBIGINT(64bit)siambosargumentossonenteros.Siunodelos
argumentosesunenterosinsigno,ylosotrosargumentossontambinenteros,elresultadoesun
enterosinsigno.
+
Suma:
mysql>SELECT3+5;
>8
-
Resta:
mysql>SELECT35;
>2
-
Menosunario.Cambiaelsignodelargumento.
mysql>SELECT2;
>2
Nota:SiesteoperadorseusaconBIGINT,elvalorderetornoestambinBIGINT.Esto
significaquedebeeliminarusar-conenterosquepuedenserigualesomenoresa2^63.
*
Multiplicacin:
mysql>SELECT3*5;
>15
mysql>SELECT18014398509481984*18014398509481984.0;
>324518553658426726783156020576256.0
mysql>SELECT18014398509481984*18014398509481984;
>0
Elresultadodelaltimaexpresinesincorrectoyaqueelresultadodelamultiplicacin
enteraexcedeelrangode64bitdeclculosBIGINT.
/
Divisin:
mysql>SELECT3/5;
>0.60
DivisinporceroproduceunresultadoNULL:
mysql>SELECT102/(11);
>NULL
UnadivisinsecalculaconaritmticaBIGINTsloenuncontextodondeelresultadose
convierteaentero.
DIV
Divisinentera.SimilaraFLOOR()perofuncionaconvaloresBIGINT.
mysql>SELECT5DIV2;
>2
7.9Funcionesmatemticas
TodaslasfuncionesmatemticasretornanNULLencasodeerror.
CEILING(X),CEIL(X)
RetornaelenteromspequeonomenoraX.
mysql>SELECTCEILING(1.23);
>2
mysql>SELECTCEIL(1.23);
>1
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina24/52
Estasdosfuncionessonsinnimos.Tengaencuentaqueelvalorretornadoseconviertea
BIGINT.
FLOOR(X)
RetornaelvalorenteromsgrandeperonomayoraX.
mysql>SELECTFLOOR(1.23);
>1
mysql>SELECTFLOOR(1.23);
>2
TengaencuentaqueelvalordevueltoseconvierteaBIGINT.
MOD(N,M),N % M,N MOD M
Operacindemdulo.RetornaelrestodeNdivididoporM.
mysql>SELECTMOD(234,10);
>4
mysql>SELECT253%7;
>1
mysql>SELECTMOD(29,9);
>2
mysql>SELECT29MOD9;
>2
EstafuncinpuedeusarvaloresBIGINT.
MOD()tambinfuncionaconvaloresconunapartefraccionalyretornaelrestoexactotrasla
divisin:
mysql>SELECTMOD(34.5,3);
>1.5
POW(X,Y),POWER(X,Y)
RetornaelvalordeXalapotenciadeY.
mysql>SELECTPOW(2,2);
>4
mysql>SELECTPOW(2,2);
>0.25
RAND(),RAND(N)
Retornaunvaloraleatorioencomaflotantedelrangode0a1.0.Siseespecificaun
argumentoenteroN,esusacomosemilla,queproduceunasecuenciarepetible.
mysql>SELECTRAND();
>0.9233482386203
mysql>SELECTRAND(20);
>0.15888261251047
mysql>SELECTRAND();
>0.63553050033332
mysql>SELECTRAND();
>0.70100469486881
mysql>SELECTRAND(20);
>0.15888261251047
Puedeusarestafuncinpararecibirregistrosdeformaaleatoriacomosemuestraaqu:
mysql>SELECT*FROMtbl_nameORDERBYRAND();
ORDER BY RAND()combinadoconLIMITestilparaseleccionarunamuestraaleatoriade
unaconjuntoderegistros:
mysql>SELECT*FROMtable1,table2WHEREa=bANDc<d
>ORDERBYRAND()LIMIT1000;
TengaencuentaqueRAND()enunaclusulaWHEREsereevalacadavezqueseejecutael
WHERE.
RAND()nopretendeserungeneradordenmerosaleatoriosperfecto,peroesunaforma
rpidadegenerarnmerosaleatoriosadhocportableentreplataformasparalamisma
versindeMySQL.
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina25/52
ROUND(X),ROUND(X,D)
RetornaelargumentoX,redondeadoalenteromscercano.Condosargumentos,retornaX
redondeadoaDdecimales.DpuedesernegativopararedondearDdgitosalaizquierdadel
puntodecimaldelvalorX.
mysql>SELECTROUND(1.23);
>1
mysql>SELECTROUND(1.58);
>2
mysql>SELECTROUND(1.58);
>2
mysql>SELECTROUND(1.298,1);
>1.3
mysql>SELECTROUND(1.298,0);
>1
mysql>SELECTROUND(23.298,1);
>20
Eltipoderetornoeselmismotipoqueeldelprimerargumento(asumiendoqueseaun
entero,dobleodecimal).Estosignificaqueparaunargumentoentero,elresultadoesun
entero(sindecimales).
7.10Funcionesdefechayhora
Estaseccindescribelasfuncionesquepuedenusarseparamanipularvalorestemporales.
Aquhayunejemploqueusafuncionesdefecha.Lasiguienteconsultaseleccionatodoslosregistros
conunvalordate_coldentrodelosltimos30das:
mysql>SELECTsomethingFROMtbl_name
>WHEREDATE_SUB(CURDATE(),INTERVAL30DAY)<=date_col;
Tengaencuentaquelaconsultatambinseleccionaregistrosconfechasfuturas.
Lasfuncionesqueesperanvaloresdefechausualmenteaceptanvaloresdefechayhoraeignoranla
partedehora.Lasfuncionesqueesperanvaloresdehorausualmenteaceptanvaloresdefechayhora
eignoranlapartedefecha.
Lasfuncionesqueretornanlafechauhoraactualesseevalanslounavezporconsultaalprincipio
delaejecucindeconsulta.Estosignificaquelasreferenciasmltiplesaunafuncintalescomo
NOW()enunamismaconsultasiempreproducenelmismoresultado.Esteprincipiotambinseaplica
aCURDATE(),CURTIME(),UTC_DATE(),UTC_TIME(),UTC_TIMESTAMP(),yacualquieradesus
sinnimos.
DATE(expr)
Extraelapartedefechadelaexpresindefechaofechayhoraexpr.
mysql>SELECTDATE('2003123101:02:03');
>'20031231'
DATEDIFF(expr,expr2)
DATEDIFF()retornaelnmerodedasentrelafechainicialexprylafechafinalexpr2.expr
yexpr2sonexpresionesdefechaodefechayhora.Slolaspartesdefechadelosvaloresse
usanenlosclculos.
mysql>SELECTDATEDIFF('1997123123:59:59','19971230');
>1
mysql>SELECTDATEDIFF('1997113023:59:59','19971231');
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina26/52
>31
DATE_ADD(date,INTERVAL expr type),DATE_SUB(date,INTERVAL expr type)
Estasfuncionesrealizanoperacionesaritmticasdefechas.dateesunvalorDATETIMEo
DATEespecificandolafechadeinicio.expresunaexpresinqueespecificaelintervaloa
aadiroborrardelafechadeinicio.expresunacadena;puedecomenzarconun'-'para
intervalosnegativos.typeesunapalabraclavequeindicacmodebeinterpretarsela
expresin.
LapalabraclaveINTERVALyelespecificadortypenosonsensiblesamaysculas.
Lasiguientetablamuestracmoserelacionanlosargumentostypeyexpr:
typeValue
ExpectedexprFormat
MICROSECOND
MICROSECONDS
SECOND
SECONDS
MINUTE
MINUTES
HOUR
HOURS
DAY
DAYS
WEEK
WEEKS
MONTH
MONTHS
QUARTER
QUARTERS
YEAR
YEARS
SECOND_MICROSECOND 'SECONDS.MICROSECONDS'
MINUTE_MICROSECOND 'MINUTES.MICROSECONDS'
MINUTE_SECOND
'MINUTES:SECONDS'
HOUR_MICROSECOND
'HOURS.MICROSECONDS'
HOUR_SECOND
'HOURS:MINUTES:SECONDS'
HOUR_MINUTE
'HOURS:MINUTES'
DAY_MICROSECOND
'DAYS.MICROSECONDS'
DAY_SECOND
'DAYS HOURS:MINUTES:SECONDS'
DAY_MINUTE
'DAYS HOURS:MINUTES'
DAY_HOUR
'DAYS HOURS'
YEAR_MONTH
'YEARS-MONTHS'
DATE_FORMAT(date,format)
Formateaelvalordatesegnlacadenaformat.Lossiguientesespecificadorespueden
usarseenlacadenaformat:
Especificador Descripcin
%a
Dadesemanaabreviado(Sun..Sat)
%b
Mesabreviado(Jan..Dec)
%c
Mes,numrico(0..12)
%D
Dadelmesconsufijoingls(0th,1st,2nd,3rd,...)
%d
Dadelmesnumrico(00..31)
%e
Dadelmesnumrico(0..31)
%f
Microsegundos(000000..999999)
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina27/52
%H
Hora(00..23)
%h
Hora(01..12)
%I
Hora(01..12)
%i
Minutos,numrico(00..59)
%j
Dadelao(001..366)
%k
Hora(0..23)
%l
Hora(1..12)
%M
Nombremes(January..December)
%m
Mes,numrico(00..12)
%p
AMoPM
%r
Hora,12horas(hh:mm:ssseguidodeAMoPM)
%S
Segundos(00..59)
%s
Segundos(00..59)
%T
Hora,24horas(hh:mm:ss)
%U
Semana(00..53),dondedomingoeselprimerdadelasemana
%u
Semana(00..53),dondeluneseselprimerdadelasemana
%V
Semana(01..53),dondedomingoeselprimerdadelasemana;usadocon
%X
%v
Semana(01..53),dondeluneseselprimerdadelasemana;usadocon%x
%W
Nombredasemana(Sunday..Saturday)
%w
Dadelasemana(0=Sunday..6=Saturday)
%X
Aoparalasemanadondedomingoeselprimerdadelasemana,
numrico,cuatrodgitos;usadocon%V
%x
Aoparalasemana,dondeluneseselprimerdadelasemana,numrico,
cuatrodgitos;usadocon%v
%Y
Ao,numrico,cuatrodgitos
%y
Ao,numrico(dosdgitos)
%%
Carcter'%'literal
Todoslosotroscarcteressecopianalresultadosininterpretacin.
Tengaencuentaqueelcarcter'%'senecesitaantesdecarcteresespecificadoresdeformato.
LosrangosparalosespecificadoresdemesydacomienzanencerodebidoaqueMySQL
permitealmacenarfechasincompletastalescomo'2004-00-00'.
mysql>SELECTDATE_FORMAT('1997100422:23:00','%W%M%Y');
>'SaturdayOctober1997'
mysql>SELECTDATE_FORMAT('1997100422:23:00','%H:%i:%s');
>'22:23:00'
mysql>SELECTDATE_FORMAT('1997100422:23:00',
'%D%y%a%d%m%b%j');
>'4th97Sat0410Oct277'
mysql>SELECTDATE_FORMAT('1997100422:23:00',
'%H%k%I%r%T%S%w');
>'22221010:23:00PM22:23:00006'
mysql>SELECTDATE_FORMAT('19990101','%X%V');
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina28/52
>'199852'
LAST_DAY(date)
Tomaunafechaofecha/horayretornaelvalorcorrespondienteparaelltimodadelmes.
RetornaNULLsielargumentoesinvlido.
mysql>SELECTLAST_DAY('20030205');
>'20030228'
mysql>SELECTLAST_DAY('20040205');
>'20040229'
mysql>SELECTLAST_DAY('2004010101:01:01');
>'20040131'
mysql>SELECTLAST_DAY('20030332');
>NULL
NOW()
Retornalafechayhoraactualcomovalorenformato'YYYY-MM-DD HH:MM:SS'o
YYYYMMDDHHMMSS,dependiendodesilafuncinseusaencontextonumricoodecadenade
carcteres.
mysql>SELECTNOW();
>'1997121523:50:26'
mysql>SELECTNOW()+0;
>19971215235026
STR_TO_DATE(str,format)
EstaeslainversadelafuncinDATE_FORMAT().Tomalacadenastrylacadenadeformato
format.STR_TO_DATE()retornaunvalorDATETIMEsilacadenadeformatocontieneparte
defechayhora,ounvalorDATEoTIMEsilacadenacontieneslopartedefechaohora.
Losvaloresfecha,horaofecha/horacontenidosenstrdebenserdadosenelformatoindicado
porformat.Paralosespecificadoresquepuedenusarseenformat,consultelatablaenla
descripcindelafuncinDATE_FORMAT().Todoslosotroscarcteresnoseinterpretan.Si
strcontieneunvalorfecha,horaofecha/horailegal,STR_TO_DATE()retornaNULL.Apartir
deMySQL5.0.3,unvalorilegaltambinproduceunaadvertencia.
mysql>SELECTSTR_TO_DATE('03.10.200309.20','%d.%m.%Y%H.%i');
>'2003100309:20:00'
mysql>SELECTSTR_TO_DATE('10arp','%carp');
>'0000100000:00:00'
mysql>SELECTSTR_TO_DATE('2003151000:00:00','%Y%m%d%H:%i:%s');
>NULL
7.11Funcionesdeencriptacin
Lasfuncionesenestaseccinencriptanydesencriptanvalores.Siquierealmacenarresultadosde
unafuncindeencriptacinquepuedecontanervaloresarbitrariosdebytes,useunacolumnaBLOB
enlugardeCHARoVARCHARparaevitarproblemaspotencialesconeliminacindeespaciosfinales
quepuedencambiarlosvaloresdedatos.
DECODE(crypt_str,pass_str)
Desencriptalacadenaencriptadacrypt_strusandopass_strcomocontrasea.crypt_str
debeserunacadenaretornadadeENCODE().
ENCODE(str,pass_str)
Encriptastrusandopass_strcomocontrasea.Paradesencriptarelresultado,use
DECODE().
Elresultadoesunacadenabinariadelamismalongitudquestr.Siquiereguardarloenuna
columna,useunacolumnadetipoBLOB.
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina29/52
7.12Funcionesdeinformacin
COLLATION(str)
Retornalacolacinparaelconjuntodecarcteresdelacadenadada.
mysql>SELECTCOLLATION('abc');
>'latin1_swedish_ci'
CURRENT_USER()
Retornalacombinacindenombredeusuarioydeequipoquetienelasesinactual.
DATABASE()
Retornaelnombredebasededatospordefecto(actual).EnMySQL5.0,lacadenatieneel
conjuntodecarcteresutf8.
LAST_INSERT_ID(),LAST_INSERT_ID(expr)
Retornaelltimovalorgeneradoautomticamentequeseinsertenunacolumna
AUTO_INCREMENT.
mysql>SELECTLAST_INSERT_ID();
>195
ElltimoIDgeneradosemantieneenelservidorparacadaconexin.Estosignificaqueel
valordelafuncinretornaacadaclienteelvalorAUTO_INCREMENTmsrecientegenerado
poresecliente.Estevalornopuedeserafectadoporotrosclientes,inclusosigeneranvalores
AUTO_INCREMENTellosmismos.EstecomportamientoaseguraquerecibasuspropiosIDssin
tenerencuentalaactividaddeotrosclientesysinlanecesidaddebloqueosotransacciones.
ElvalordeLAST_INSERT_ID()nocambiasiactualizalacolumnaAUTO_INCREMENTdeun
registroconunvalornomgico(estoes,unvalorquenoesNULLni0).
SiinsertavariosregistrosalavezconuncomandodeinsercinLAST_INSERT_ID()retorna
elvalordelprimerregistroinsertado.Laraznparaestoeshacerposiblereproducir
fcilmenteelmismocomandoINSERTcontraotroservidor.
ROW_COUNT()
ROW_COUNT()retornaelnmeroderegistrosactualizados,insertadosoborradosporel
comandoprecedente.Estoeslomismoqueelnmeroderegistrosquemuestraelcliente
mysqlyelvalordelafuncindelaAPICmysql_affected_rows().
mysql>INSERTINTOtVALUES(1),(2),(3);
QueryOK,3rowsaffected(0.00sec)
Records:3Duplicates:0Warnings:0
mysql>SELECTROW_COUNT();
++
|ROW_COUNT()|
++
|3|
++
1rowinset(0.00sec)
VERSION()
RetornaunacadenaqueindicalaversindelservidorMySQL.Lacadenausaelconjuntode
carcteresutf8.
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina30/52
8Procedimientos y funciones
8.1Uso
Los procedimientos son cdigos que se ejecutan directamente en el servidor.
Un procedimiento se invoca usando un comando CALL , y slo puede pasar valores
usando variables de salida. Una funcin puede llamarse desde desde dentro de
un comando como cualquier otra funcin (esto es, invocando el nombre de la
funcin), y puede retornar un valor escalar. Las rutinas almacenadas pueden
llamar otras rutinas almacenadas.
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina31/52
Lalistadeparmetrosentreparntesisdebeestarsiemprepresente.Sinohayparmetros,sedebe
usarunalistadeparmetrosvaca().
CadaparmetroesunparmetroINpordefecto.Paraespecificarotrotipodeparmetro,usela
palabraclaveOUToINOUTantesdelnombredelparmetro.EspecificandoIN,OUT,oINOUTsloes
validoparaunaPROCEDURE.
Unmarcoparaprocedimientosalmacenadosexternosseintroducirenelfuturo.Estopermitira
escribirprocedimientosalmacenadosenlenguajesdistintosaSQL.Unodelosprimeroslenguajesa
soportarserPHPyaqueelmotorcentraldePHPespequeo,conflujossegurosypuedeempotrarse
fcilmente.Comoelmarcoespblico,seesperasoportarmuchosotroslenguajes.
Unprocedimientoofuncinseconsidera"determinista"sisiempreproduceelmismoresultadopara
losmismosparmetrosdeentrada,y"nodeterminista"encualquierotrocaso.Sinosedani
DETERMINISTICniNOT DETERMINISTICpordefectoesNOT DETERMINISTIC.
Variascaractersticasproporcionaninformacinsobrelanaturalezadelosdatosusadosporlarutina.
CONTAINS SQLindicaquelarutinanocontienecomandosqueleenoescribendatos.NO SQLindica
quelarutinanocontienecomandosSQL.READS SQL DATAindicaquelarutinacontienecomandos
queleendatos,peronocomandosqueescribendatos.MODIFIES SQL DATAindicaquelarutina
contienecomandosquepuedenescribirdatos.CONTAINS SQLeselvalorpordefectosinosedan
explcitamenteningunadeestascaractersticas.
LacaractersticaSQL SECURITYpuedeusarseparaespecificarsilarutinadebeserejecutadausando
lospermisosdelusuarioquecrealarutinaoelusuarioquelainvoca.Elvalorpordefectoes
DEFINER.EstacaractersticaesnuevaenSQL:2003.Elcreadoroelinvocadordebentenerpermisos
paraaccederalabasededatosconlaquelarutinaestasociada.
MySQLalmacenalavariabledesistemasql_modequeestenefectocuandosecrealarutina,y
siempreejecutalarutinaconestainicializacin.
LaclusulaCOMMENTesunaextensindeMySQL,ypuedeusarseparadescribirelprocedimiento
almacenado.EstainformacinsemuestraconloscomandosSHOW CREATE PROCEDUREySHOW
CREATE FUNCTION.
MySQLpermitealasrutinasquecontengancomandosDDL(talescomoCREATEyDROP)ycomandos
detransaccinSQL(comoCOMMIT).Estonolorequiereelestndar,yporlotanto,esespecficodela
implementacin.
LosprocedimientosalmacenadosnopuedenusarLOAD DATA INFILE.
Nota:Actualmente,losprocedimientosalmacenadoscreadosconCREATE FUNCTIONnopuedentener
referenciasatablas.(EstopuedeincluiralgunoscomandosSETquepuedencontenerreferenciasa
tablas,porejemploSET a:= (SELECT MAX(id) FROM t),yporotrapartenopuedencontener
comandosSELECT,porejemploSELECT 'Hello world!' INTO var1.)Estalimitacinse
elminarenbreve.
Loscomandosqueretornanunconjuntoderesultadosnopuedenusarsedesdeunafuncin
almacenada.EstoincluyecomandosSELECTquenousanINTOparatratarvaloresdecolumnasen
variables,comandosSHOWyotroscomandoscomoEXPLAIN.Paracomandosquepuedendeterminarse
aldefinirlafuncinparaqueretornenunconjuntoderesultados,apareceunmensajedeerrorNot
allowed to return a result set from a function(ER_SP_NO_RETSET_IN_FUNC).Para
comandosquepuededeterminarsesloentiempodeejecucinsiretornanunconjuntoderesultados,
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina32/52
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina33/52
8.3Lasentencia
CALL
CALLsp_name([parameter[,...]])
ElcomandoCALLinvocaunprocedimientodefinidoprviamenteconCREATE PROCEDURE.
CALLpuedepasarvaloresalllamadorusandoparmetrosdeclaradoscomoOUToINOUT.Tambin
"retorna"elnmeroderegistrosafectados,queconunprogramaclientepuedeobtenerseanivelSQL
llamandolafuncinROW_COUNT()ydesdeCllamandolafuncindelaAPIC
mysql_affected_rows().
8.4Sentenciacompuesta
BEGIN
... END
[begin_label:]BEGIN
[statement_list]
END[end_label]
Losprocedimientosalmacenadospuedencontenervarioscomandos,usnadouncomandocompuesto
BEGIN ... END.
Uncomandocompuestopuedeetiquetarse.end_labelnopuededarseanoserquetambinest
presentebegin_label,ysiambosloestn,debenserelmismo.
Tengaencuentaquelaclusulaopcional[NOT] ATOMICnoestsoportada.Estosignificaquenohay
unpuntotransaccionalaliniciodelbloquedeinstruccionesylaclusulaBEGINusadaeneste
contextonotieneefectoenlatransaccinactual.
Usarmltiplescomandosrequierequeelclienteseacapazdeenviarcadenasdeconsultasconel
delimitadordecomando;.Estosetrataenelclientedelneadecomandosmysqlconelcomando
delimiter.Cambiareldelimitadordefinaldeconsulta;endofquery(porejemplo,a//)permite
usar;enelcuerpodelarutina.
8.5Sentencia
DECLARE
ElcomandoDECLAREseusaparadefinirvariosiconoslocalesdeunarutina:lasvariableslocales,
condicionesyhandlersycursores.LoscomandosSIGNALyRESIGNALnosesoportanenla
actualidad.
DECLAREpuedeusarseslodentrodecomandoscompuestosBEGIN ... ENDydebensersuinicio,
antesdecualquierotrocomando.
Loscursoresdebendeclararseantesdedeclararloshandlers,ylasvariablesycondicionesdeben
declararseantesdedeclararloscursoresohandlers.
DECLARE
DECLAREvar_name[,...]type[DEFAULTvalue]
Estecomandoseusaparadeclararvariableslocales.Paraproporcionarunvalorpordefectoparala
variable,incluyaunaclusulaDEFAULT.Elvalorpuedeespecificarsecomoexpresin,nonecesitaser
unaconstante.SilaclusulaDEFAULTnoestpresente,elvalorinicialesNULL.
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina34/52
8.6.2Sentencia
SET
paravariables
SETvar_name=expr[,var_name=expr]...
ElcomandoSETenprocedimientosalmacenadosesunaversinextendidadelcomandogeneralSET.
Lasvariablesreferenciadaspuedenserlasdeclaradasdentrodeunarutina,ovariablesdeservidor
globales.
ElcomandoSETenprocedimientosalmacenadosseimplementacomopartedelasintaxisSETpre
existente.EstopermiteunasintaxisextendidadeSET a=x, b=y, ...dondedistintostiposde
variables(variablesdeclaradaslocalyglobalmenteyvariablesdesesindelservidor)pueden
mezclarse.Estopermitecombinacionesdevariableslocalesyalgunasopcionesquetienensentido
sloparavariablesdesistema;entalcaso,lasopcionessereconocenperoseignoran.
8.6.3Lasentencia
SELECT
... INTO
SELECTcol_name[,...]INTOvar_name[,...]table_expr
EstasintaxisSELECTalmacenacolumnasseleccionadasdirectamenteenvariables.Porlotanto,slo
unregistropuederetornarse.
SELECTid,dataINTOx,yFROMtest.t1LIMIT1;
8.6.4ConditionsandHandlers
Ciertascondicionespuedenrequeriruntratamientoespecfico.Estascondicionespuedenestar
relacionadasconerrores,ascomocontroldeflujogeneraldentrodeunarutina.
8.6.5Condiciones
DECLARE
DECLAREcondition_nameCONDITIONFORcondition_value
condition_value:
SQLSTATE[VALUE]sqlstate_value
|mysql_error_code
Estecomandoespecificacondicionesquenecesitantratamientoespecfico.Asociaunnombreconuna
condicindeerrorespecfica.ElnombrepuedeusarsesubsecuentementeenuncomandoDECLARE
HANDLER.
AdemsdevaloresSQLSTATE,loscdigosdeerrorMySQLsesoportan.
8.6.6DECLAREhandlers
DECLAREhandler_typeHANDLERFORcondition_value[,...]sp_statement
handler_type:
CONTINUE
|EXIT
|UNDO
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina35/52
condition_value:
SQLSTATE[VALUE]sqlstate_value
|condition_name
|SQLWARNING
|NOTFOUND
|SQLEXCEPTION
|mysql_error_code
Estecomandoespecificahandlersquepuedentratarunaovariascondiciones.Siunadeestas
condicionesocurren,elcomandoespecificadoseejecuta.
ParaunhandlerCONTINUE,continalarutinaactualtraslaejecucindelcomandodelhandler.
ParaunhandlerEXIT,terminalaejecucindelcomandocompuestoBEGIN...ENDactual.El
handlerdetipoUNDOtodavanosesoporta.
SQLWARNINGesunaabreviacinparatodosloscdigosSQLSTATEquecomienzancon01.
NOT FOUNDesunaabreviacinparatodosloscdigosSQLSTATEquecomienzancon02.
SQLEXCEPTIONesunaabreviacinparatodosloscdigosSQLSTATEnotratadospor
SQLWARNINGoNOT FOUND.
AdemsdelosvaloresSQLSTATE,loscdigosdeerrorMySQLsesoportan.
Porejemplo:
mysql>CREATETABLEtest.t(s1int,primarykey(s1));
QueryOK,0rowsaffected(0.00sec)
mysql>delimiter//
mysql>CREATEPROCEDUREhandlerdemo()
>BEGIN
>DECLARECONTINUEHANDLERFORSQLSTATE'23000'SET@x2=1;
>SET@x=1;
>INSERTINTOtest.tVALUES(1);
>SET@x=2;
>INSERTINTOtest.tVALUES(1);
>SET@x=3;
>END;
>//
QueryOK,0rowsaffected(0.00sec)
mysql>CALLhandlerdemo()//
QueryOK,0rowsaffected(0.00sec)
mysql>SELECT@x//
++
|@x|
++
|3|
++
1rowinset(0.00sec)
Tengaencuentaque@xes3,loquemuestraqueMySQLsehaejecutadoalfinaldelprocedimiento.
SilalneaDECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1;noest
presente,MySQLhabratomadolarutapordefecto(EXIT)traselsegundoINSERTfallidodebidoala
restriccinPRIMARY KEY,ySELECT @xhabraretornado2.
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina36/52
8.7Cursores
Sesoportancursoressimplesdentrodeprocedimientosyfuncionesalmacenadas.Lasintaxiseslade
SQLempotrado.Loscursoresnosonsensibles,sondeslolectura,ynopermitenscrolling.No
sensiblesignificaqueelservidorpuedeonohacerunacopiadesutabladeresultados.
Loscursoresdebendeclararseantesdedeclararloshandlers,ylasvariablesycondicionesdeben
declararseantesdedeclararcursoresohandlers.
Porejemplo:
CREATEPROCEDUREcurdemo()
BEGIN
DECLAREdoneINTDEFAULT0;
DECLAREaCHAR(16);
DECLAREb,cINT;
DECLAREcur1CURSORFORSELECTid,dataFROMtest.t1;
DECLAREcur2CURSORFORSELECTiFROMtest.t2;
DECLARECONTINUEHANDLERFORSQLSTATE'02000'SETdone=1;
OPENcur1;
OPENcur2;
REPEAT
FETCHcur1INTOa,b;
FETCHcur2INTOc;
IFNOTdoneTHEN
IFb<cTHEN
INSERTINTOtest.t3VALUES(a,b);
ELSE
INSERTINTOtest.t3VALUES(a,c);
ENDIF;
ENDIF;
UNTILdoneENDREPEAT;
CLOSEcur1;
CLOSEcur2;
END
8.7.1Declararcursores
DECLAREcursor_nameCURSORFORselect_statement
Estecomandodeclarauncursor.Puedendefinirsevarioscursoresenunarutina,perocadacursoren
unbloquedebetenerunnombrenico.
ElcomandoSELECTnopuedetenerunaclusulaINTO.
8.7.2Sentencia
OPEN
delcursor
OPENcursor_name
Estecomandoabreuncursordeclaradoprviamente.
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina37/52
8.7.3Sentenciadecursor
FETCH
FETCHcursor_nameINTOvar_name[,var_name]...
Estecomandotrataelsiguienteregistro(siexiste)usandoelcursorabiertoespecificado,yavanzael
punterodelcursro.
8.7.4Sentenciadecursor
CLOSE
CLOSEcursor_name
Estecomandocierrauncursorabiertoprviamente.
Sinosecierraexplcitamente,uncursorsecierraalfinaldelcomandocompuestoenquesedeclara.
8.8Constructoresdecontroldeflujo
LosconstructoresIF,CASE,LOOP,WHILE,ITERATE,yLEAVEestncompletamenteimplementados.
Estosconstructorespuedenconteneruncomandosimple,ounbloquedecomandosusandoel
comandocompuestoBEGIN ... END.Losconstructorespuedenestaranidados.
LosbuclesFORnoestnsoportados.
8.8.1Sentencia
IF
IFsearch_conditionTHENstatement_list
[ELSEIFsearch_conditionTHENstatement_list]...
[ELSEstatement_list]
ENDIF
IFimplementaunconstructorcondicionalbsico.Sisearch_conditionseevalaacierto,elcomando
SQLcorrespondientelistadoseejectua.Sinocoincideningunasearch_conditionseejecutael
comandolistadoenlaclusulaELSE.statement_listpuedeconsistirenvarioscomandos.
TengaencuentaquetambinhayunafuncinIF(),quedifieredelcommandoIFdescritoaqu.
8.8.2Lasentencia
CASE
CASEcase_value
WHENwhen_valueTHENstatement_list
[WHENwhen_valueTHENstatement_list]...
[ELSEstatement_list]
ENDCASE
O:
CASE
WHENsearch_conditionTHENstatement_list
[WHENsearch_conditionTHENstatement_list]...
[ELSEstatement_list]
ENDCASE
ElcomandoCASEparaprocedimientosalmacenadosimplementaunconstructorcondicionalcomplejo.
Siunasearch_conditionseevalaacierto,elcomandoSQLcorrespondienteseejecuta.Sino
coincideningunacondicindebsqueda,elcomandoenlaclusulaELSEseejecuta.
Nota:LasitaxisdeuncomandoCASEmostradoaquparausodentrodeprocedimientosalmacenados
difiereligeramentedelaexpresinCASESQLdescritaenlaSeccin"Funcionesdecontroldeflujo".
ElcomandoCASEnopuedetenerunaclusulaELSE NULLyterminaconEND CASEenlugardeEND.
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina38/52
8.8.3Sentencia
LOOP
[begin_label:]LOOP
statement_list
ENDLOOP[end_label]
LOOPimplementaunconstructordebuclesimplequepermiteejecucinrepetidadecomandos
particulares.Elcomandodentrodelbucleserepitehastaqueacabaelbucle,usualmenteconun
comandoLEAVE.
UncomandoLOOPpuedeetiquetarse.end_labelnopuededarsehastaqueestpresentebegin_label
,ysiambosloestn,debenserelmismo.
8.8.4Sentencia
LEAVE
LEAVElabel
Estecomandoseusaparaabandonarcualquiercontroldeflujoetiquetado.Puedeusarsecon
BEGIN ... ENDobucles.
8.8.5Lasetencia
ITERATE
ITERATElabel
ITERATEslopuedeaparecerencomandosLOOP,REPEAT,yWHILE.ITERATEsignifica"vuelvea
hacerelbucle."
Porejemplo:
CREATEPROCEDUREdoiterate(p1INT)
BEGIN
label1:LOOP
SETp1=p1+1;
IFp1<10THENITERATElabel1;ENDIF;
LEAVElabel1;
ENDLOOPlabel1;
SET@x=p1;
END
8.8.6Sentencia
REPEAT
[begin_label:]REPEAT
statement_list
UNTILsearch_condition
ENDREPEAT[end_label]
Elcomando/sdentrodeuncomandoREPEATserepitehastaquelacondicinsearch_conditiones
cierta.
UncomandoREPEATpuedeetiquetarse.end_labelnopuededarseanoserquebegin_labelest
presente,ysiloestn,debenserelmismo.
Porejemplo:
mysql>delimiter//
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina39/52
mysql>CREATEPROCEDUREdorepeat(p1INT)
>BEGIN
>SET@x=0;
>REPEATSET@x=@x+1;UNTIL@x>p1ENDREPEAT;
>END
>//
QueryOK,0rowsaffected(0.00sec)
mysql>CALLdorepeat(1000)//
QueryOK,0rowsaffected(0.00sec)
mysql>SELECT@x//
++
|@x|
++
|1001|
++
1rowinset(0.00sec)
8.8.7Sentencia
WHILE
[begin_label:]WHILEsearch_conditionDO
statement_list
ENDWHILE[end_label]
Elcomado/sdentrodeuncomandoWHILEserepitemientraslacondicinsearch_conditiones
cierta.
UncomandoWHILEpuedeetiquetarse.end_labelnopuededarseanoserquebegin_labeltambin
estpresente,ysiloestn,debenserelmismo.
Porejemplo:
CREATEPROCEDUREdowhile()
BEGIN
DECLAREv1INTDEFAULT5;
WHILEv1>0DO
...
SETv1=v11;
ENDWHILE;
END
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina40/52
9Disparadores
Undisparadoresunobjetoconnombredentrodeunabasededatoselcualseasociaconunatablay
seactivacuandoocurreenstauneventoenparticular.Porejemplo,lassiguientessentenciascrean
unatablayundisparadorparasentenciasINSERTdentrodelatabla.Eldisparadorsumalosvalores
insertadosenunadelascolumnasdelatabla:
mysql>CREATETABLEaccount(acct_numINT,amountDECIMAL(10,2));
mysql>CREATETRIGGERins_sumBEFOREINSERTONaccount
>FOREACHROWSET@sum=@sum+NEW.amount;
Estecaptulodescribelasintaxisparacrearyeliminardisparadores,ymuestraalgunosejemplosde
cmoutilizarlos.
9.1Sintaxisde
CREATE
TRIGGER
CREATETRIGGERnombre_dispmomento_dispevento_disp
ONnombre_tablaFOREACHROWsentencia_disp
Undisparadoresunobjetoconnombreenunabasededatosqueseasociaconunatabla,yseactiva
cuandoocurreuneventoenparticularparaesatabla.
Eldisparadorquedaasociadoalatablanombre_tabla.Estadebeserunatablapermanente,no
puedeserunatablaTEMPORARYniunavista.
momento_dispeselmomentoenqueeldisparadorentraenaccin.PuedeserBEFORE(antes)o
AFTER(despues),paraindicarqueeldisparadorseejecuteantesodespusquelasentenciaquelo
activa.
evento_dispindicalaclasedesentenciaqueactivaaldisparador.PuedeserINSERT,UPDATE,o
DELETE.Porejemplo,undisparadorBEFOREparasentenciasINSERTpodrautilizarseparavalidar
losvaloresainsertar.
Nopuedehaberdosdisparadoresenunamismatablaquecorrespondanalmismomomentoy
sentencia.Porejemplo,nosepuedentenerdosdisparadoresBEFORE UPDATE.Perosesposible
tenerlosdisparadoresBEFORE UPDATEyBEFORE INSERToBEFORE UPDATEyAFTER UPDATE.
sentencia_dispeslasentenciaqueseejecutacuandoseactivaeldisparador.Sisedeseanejecutar
mltiplessentencias,debencolocarseentreBEGIN ... END,elconstructordesentencias
compuestas.
Estoademsposibilitaemplearlasmismassentenciaspermitidasenrutinasalmacenadas.
LascolumnasdelatablaasociadaconeldisparadorpuedenreferenciarseempleandolosaliasOLDy
NEW.OLD.nombre_colhacereferenciaaunacolumnadeunafilaexistente,antesdeseractualizada
oborrada.NEW.nombre_colhacereferenciaaunacolumnaenunanuevafilaapuntodeser
insertada,oenunafilaexistenteluegodequefueactualizada.
ElusodeSET NEW.nombre_col = valornecesitaquesetengaelprivilegioUPDATEsobrela
columna.ElusodeSET nombre_var = NEW.nombre_colnecesitaelprivilegioSELECTsobrela
columna.
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina41/52
Nota:Actualmente,losdisparadoresnosonactivadosporaccionesllevadasacaboencascadaporlas
restriccionesdeclavesextranjeras.Estalimitacinsesubsanartanprontocomoseaposible.
9.2Sintaxisde
DROP
TRIGGER
DROPTRIGGER[nombre_esquema.]nombre_disp
Eliminaundisparador.Elnombredeesquemaesopcional.Sielesquemaseomite,eldisparadorse
eliminaenelesquemaactual.
9.3Utilizacindedisparadores
ElsoporteparadisparadoresseincluyapartirdeMySQL5.0.2.Actualmente,elsoportepara
disparadoresesbsico,porlotantohayciertaslimitacionesenloquepuedehacerseconellos.Esta
seccintratasobreelusodelosdisparadoresylaslimitacionesvigentes.
Undisparadoresunobjetodebasededatosconnombrequeseasociaaunatabla,yseactivacuando
ocurreuneventoenparticularparalatabla.Algunosusosparalosdisparadoresesverificarvalores
aserinsertadosollevaracaboclculossobrevaloresinvolucradosenunaactualizacin.
Undisparadorseasociaconunatablaysedefineparaqueseactivealocurrirunasentencia
INSERT,DELETE,oUPDATEsobredichatabla.Puedetambinestablecersequeseactiveanteso
despuesdelasentenciaencuestin.Porejemplo,sepuedetenerundisparadorqueseactiveantesde
queunregistroseaborrado,odespusdequeseaactualizado.
Esteesunejemplosencilloqueasociaundisparadorconunatablaparacuandorecibasentencias
INSERT.Actacomounacumuladorquesumalosvaloresinsertadosenunadelascolumnasdela
tabla.
Lasiguientesentenciacrealatablayundisparadorasociadoaella:
mysql>CREATETABLEaccount(acct_numINT,amountDECIMAL(10,2));
mysql>CREATETRIGGERins_sumBEFOREINSERTONaccount
>FOREACHROWSET@sum=@sum+NEW.amount;
LasentenciaCREATE TRIGGERcreaundisparadorllamadoins_sumqueseasociaconlatabla
account.Tambinseincluyenclusulasqueespecificanelmomentodeactivacin,elevento
activador,yquhacerluegodelaactivacin:
LapalabraclaveBEFOREindicaelmomentodeaccindeldisparador.Enestecaso,el
disparadordeberaactivarseantesdequecadaregistroseinserteenlatabla.Laotrapalabra
claveposibleaquiesAFTER.
LaplabraclaveINSERTindicaeleventoqueactivaraldisparador.Enelejemplo,la
sentenciaINSERTcausarlaactivacin.Tambinpuedencrearsedisparadorespara
sentenciasDELETEyUPDATE.
Lassentenciasiguiente,FOR EACH ROW,defineloqueseejecutarcadavezqueel
disparadorseactive,locualocurreunavezporcadafilaafectadaporlasentenciaactivadora.
Enelejemplo,lasentenciaactivadaesunsencilloSETqueacumulalosvaloresinsertadosen
lacolumnaamount.LasentenciaserefierealacolumnacomoNEW.amount,loquesignifica
"elvalordelacolumnaamountqueserinsertadoenelnuevoregistro."
Parautilizareldisparador,sedebeestablecerelvalordelavariableacumuladoracero,ejecutaruna
sentenciaINSERT,yverquvalorpresentaluegolavariable.
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina42/52
mysql>SET@sum=0;
mysql>INSERTINTOaccountVALUES(137,14.98),(141,1937.50),(97,100.00);
mysql>SELECT@sumAS'Totalamountinserted';
++
|Totalamountinserted|
++
|1852.48|
++
Enestecaso,elvalorde@sumluegodehaberejecutadolasentenciaINSERTes14.98 + 1937.50
- 100,o1852.48.
Paraeliminareldisparador,seempleaunasentenciaDROP TRIGGER.Elnombredeldisparador
debeincluirelnombredelatabla:
mysql>DROPTRIGGERaccount.ins_sum;
Debidoaqueundisparadorestasociadoconunatablaenparticular,nosepuedentenermltiples
disparadoresconelmismonombredentrodeunatabla.Tambinsedeberatenerencuentaqueel
espaciodenombresdelosdisparadorespuedecambiarenelfuturodeunniveldetablaaunnivelde
basededatos,esdecir,losnombresdedisparadoresyanoslodeberansernicosparacadatabla
sinoparatodalabasededatos.Paraunamejorcompatibilidadcondesarrollosfuturos,sedebe
intentaremplearnombresdedisparadoresquenoserepitandentrodelabasededatos.
Adicionalmentealrequisitodenombresnicosdedisparadorencadatabla,hayotraslimitacionesen
lostiposdedisparadoresquepuedencrearse.Enparticular,nosepuedentenerdosdisparadores
paraunamismatablaqueseanactivadosenelmismomomentoyporelmismoevento.Porejemplo,
nosepuedendefinirdosBEFORE INSERTodosAFTER UPDATEenunamismatabla.Esimprobable
queestaseaunagranlimitacin,porqueesposibledefinirundisparadorqueejecutemltiples
sentenciasempleandoelconstructordesentenciascompuestasBEGIN ... ENDluegodeFOR EACH
ROW.(Msadelanteenestaseccinpuedeverseunejemplo).
Tambinhaylimitacionessobreloquepuedeaparecerdentrodelasentenciaqueeldisparador
ejecutaralactivarse:
Eldisparadornopuedereferirseatablasdirectamenteporsunombre,incluyendolamisma
tablaalaqueestasociado.Sinembargo,sepuedenemplearlaspalabrasclaveOLDyNEW.
OLDserefiereaunregistroexistentequevaaborrarseoquevaaactualizarseantesdeque
estoocurra.NEWserefiereaunregistronuevoqueseinsertaroaunregistromodificado
luegodequeocurrelamodificacin.
EldisparadornopuedeinvocarprocedimientosalmacenadosutilizandolasentenciaCALL.
(Estosignifica,porejemplo,quenosepuedeutilizarunprocedimientoalmacenadopara
eludirlaprohibicindereferirseatablasporsunombre).
Eldisparadornopuedeutilizarsentenciasqueinicienofinalicenunatransaccin,talcomo
START TRANSACTION,COMMIT,oROLLBACK.
LaspalabrasclaveOLDyNEWpermitenaccederacolumnasenlosregistrosafectadosporun
disparador.(OLDyNEWnosonsensiblesamaysculas).EnundisparadorparaINSERT,solamente
puedeutilizarseNEW.nom_col;yaquenohayunaversinanteriordelregistro.Enundisparador
paraDELETEslopuedeemplearseOLD.nom_col,porquenohayunnuevoregistro.Enun
disparadorparaUPDATEsepuedeemplearOLD.nom_colparareferirsealascolumnasdeun
registroantesdequeseaactualizado,yNEW.nom_colparareferirsealascolumnasdelregistroluego
deactualizarlo.
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina43/52
UnacolumnaprecedidaporOLDesdeslolectura.Esposiblehacerreferenciaaellaperono
modificarla.UnacolumnaprecedidaporNEWpuedeserreferenciadasisetieneelprivilegioSELECT
sobreella.EnundisparadorBEFORE,tambinesposiblecambiarsuvalorconSET
NEW.nombre_col = valorsisetieneelprivilegiodeUPDATEsobreella.Estosignificaqueun
disparadorpuedeusarseparamodificarlosvaloresantesqueseinsertenenunnuevoregistroose
empleenparaactualizarunoexistente.
EnundisparadorBEFORE,elvalordeNEWparaunacolumnaAUTO_INCREMENTes0,noelnmero
secuencialquesegenerarenformaautomticacuandoelregistrosearealmenteinsertado.
OLDyNEWsonextensionesdeMySQLparalosdisparadores.
EmpleandoelconstructorBEGIN ... END,sepuededefinirundisparadorqueejecutesentencias
mltiples.DentrodelbloqueBEGIN,tambinpuedenutilizarseotrassintaxispermitidasenrutinas
almacenadas,talescomocondicionalesybucles.Comosucedeconlasrutinasalmacenadas,cuandose
creaundisparadorqueejecutasentenciasmltiples,sehacenecesarioredefinireldelimitadorde
sentenciassiseingresareldisparadoratravsdelprogramamysql,deformaquesepuedautilizar
elcaracter';'dentrodeladefinicindeldisparador.Elsiguienteejemploilustraestosaspectos.Enl
secreaundisparadorparaUPDATE,queverificalosvaloresutilizadosparaactualizarcadacolumna,
ymodificaelvalorparaqueseencuentreenunrangode0a100.Estodebehacerseenundisparador
BEFOREporquelosvaloresdebenverificarseantesdeemplearseparaactualizarelregistro:
mysql>delimiter//
mysql>CREATETRIGGERupd_checkBEFOREUPDATEONaccount
>FOREACHROW
>BEGIN
>IFNEW.amount<0THEN
>SETNEW.amount=0;
>ELSEIFNEW.amount>100THEN
>SETNEW.amount=100;
>ENDIF;
>END;//
mysql>delimiter;
Podraparecermsfcildefinirunarutinaalmacenadaeinvocarladesdeeldisparadorutilizando
unasimplesentenciaCALL.Estoseraventajosotambinsisedesearainvocarlamismarutinadesde
distintosdisparadores.Sinembargo,unalimitacindelosdisparadoresesquenopuedenutilizar
CALL.SedebeescribirlasentenciacompuestaencadaCREATE TRIGGERdondeseladeseeemplear.
MySQLgestionaloserroresocurridosdurantelaejecucindedisparadoresdeestamanera:
SiloquefallaesundisparadorBEFORE,noseejecutalaoperacinenelcorrespondiente
registro.
UndisparadorAFTERseejecutasolamentesieldisparadorBEFORE(deexistir)ylaoperacin
seejecutaronexitosamente.
UnerrordurantelaejecucindeundisparadorBEFOREoAFTERderivaenlafalladetodala
sentenciaqueprovoclainvocacindeldisparador.
Entablastransaccionales,lafalladeundisparador(yporlotantodetodalasentencia)
deberacausarlacancelacin(rollback)detodosloscambiosrealizadosporesasentencia.En
tablasnotransaccionales,cualquiercambioreal
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina44/52
10Vistas
Lasvistas(incluyendovistasactualizables)fueronintroducidasenlaversin5.0delservidordebase
dedatosMySQL
Enestecaptulosetratanlossiguientestemas:
CreacinomodificacindevistasconCREATE VIEWoALTER VIEW
EliminacindevistasconDROP VIEW
Obtencindeinformacindedefinicindeunavista(metadatos)conSHOW CREATE VIEW
10.1Sintaxisde
ALTER
VIEW
ALTER[ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]
VIEWnombre_vista[(columnas)]
ASsentencia_select
[WITH[CASCADED|LOCAL]CHECKOPTION]
Estasentenciamodificaladefinicindeunavistaexistente.Lasintaxisessemejantealaempleada
enCREATE VIEW.SerequierequeposealospermisosCREATE VIEWyDELETEparalavista,yalgn
privilegioencadacolumnaseleccionadaporlasentenciaSELECT.
10.2Sintaxisde
CREATE
VIEW
CREATE[ORREPLACE][ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]
VIEWnombre_vista[(columnas)]
ASsentencia_select
[WITH[CASCADED|LOCAL]CHECKOPTION]
EstasentenciacreaunavistanuevaoreemplazaunaexistentesiseincluyelaclusulaOR
REPLACE.Lasentencia_selectesunasentenciaSELECTqueproporcionaladefinicindelavista.
Puedeestardirigidaatablasdelabaseoaotrasvistas.
SerequierequeposeaelpermisoCREATE VIEWparalavista,yalgnprivilegioencadacolumna
seleccionadaporlasentenciaSELECT.ParacolumnasincluidasenotrapartedelasentenciaSELECT
debeposeerelprivilegioSELECT.SiestpresentelaclusulaOR REPLACE,tambindebertenerse
elprivilegioDELETEparalavista.
Todavistaperteneceaunabasededatos.Pordefecto,lasvistassecreanenlabasededatosactual.
Peracrearunavistaenunabasededatosespecfica,indquelaconbase_de_datos.nombre_vista
almomentodecrearla.
mysql>CREATEVIEWtest.vASSELECT*FROMt;
Lastablasylasvistascompartenelmismoespaciodenombresenlabasededatos,poreso,unabase
dedatosnopuedecontenerunatablayunavistaconelmismonombre.
Aligualquelastablas,lasvistasnopuedentenernombresdecolumnasduplicados.Pordefecto,los
nombresdelascolumnasdevueltosporlasentenciaSELECTseusanparalascolumnasdelavista.
Paradarexplcitamenteunnombrealascolumnasdelavistautilicelaclsulacolumnaspara
indicarunalistadenombresseparadosconcomas.Lacantidaddenombresindicadosencolumnas
debeserigualalacantidaddecolumnasdevueltasporlasentenciaSELECT.
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina45/52
LascolumnasdevueltasporlasentenciaSELECTpuedensersimplesreferenciasacolumnasdela
tabla,perotambienpuedenserexpresionesconteniendofunciones,constantes,operadores,etc.
LosnombresdetablasovistassincalificarenlasentenciaSELECTseinterpretancomo
pertenecientesalabasededatosactual.Unavistapuedehacerreferenciaatablasovistasenotras
basesdedatosprecediendoelnombredelatablaovistaconelnombredelabasededatosapropiada.
LasvistaspuedencrearseapartirdevariostiposdesentenciasSELECT.Puedenhacerreferenciaa
tablasoaotrasvistas.Puedenusarcombinaciones,UNION,ysubconsultas.ElSELECTinclusiveno
necesitahacerreferenciaaotrastablas.Enelsiguienteejemplosedefineunavistaqueselecciona
doscolumnasdeotratabla,ascomounaexpresincalculadaapartirdeellas:
mysql>CREATETABLEt(qtyINT,priceINT);
mysql>INSERTINTOtVALUES(3,50);
mysql>CREATEVIEWvASSELECTqty,price,qty*priceASvalueFROMt;
mysql>SELECT*FROMv;
++++
|qty|price|value|
++++
|3|50|150|
++++
Ladefinicindeunavistaestsujetaalassiguienteslimitaciones:
LasentenciaSELECTnopuedecontenerunasubconsultaensuclusulaFROM.
LasentenciaSELECTnopuedehacerreferenciaavariablesdelsistemaodelusuario.
LasentenciaSELECTnopuedehacerreferenciaaparmetrosdesentenciapreparados.
Dentrodeunarutinaalmacenada,ladefinicinnopuedehacerreferenciaaparmetrosdela
rutinaoavariableslocales.
Cualquiertablaovistareferenciadaporladefinicindebeexistir.Sinembargo,esposible
quedespusdecrearunavista,seeliminealgunatablaovistaalaquesehacereferencia.
Paracomprobarladefinicindeunavistaenbuscadeproblemasdeestetipo,utilicela
sentenciaCHECK TABLE.
LadefinicinnopuedehacerreferenciaaunatablaTEMPORARY,ytampocosepuedecrear
unavistaTEMPORARY.
Lastablasmencionadasenladefinicindelavistadebenexistirsiempre.
Nosepuedeasociarundisparadorconunavista.
EnladefinicindeunavistaestpermitidoORDER BY,peroesignoradosiseseleccionancolumnas
deunavistaquetienesupropioORDER BY.
Conrespectoaotrasopcionesoclusulasincluidasenladefinicin,lasmismasseagreganalas
opcionesoclusulasdecualquiersentenciaquehagareferenciaalavistacreada,peroelefectoes
indefinido.Porejemplo,siladefinicindeunavistaincluyeunaclusulaLIMIT,ysehaceuna
seleccindesdelavistautilizandounasentenciaquetienesupropiaclusulaLIMIT,noestdefinido
culseaplicar.ElmismoprincipioseextiendeaotrasopcionescomoALL,DISTINCT,o
SQL_SMALL_RESULTqueseubicanacontinuacindelapalabrareservadaSELECT,yaclusulas
comoINTO,FOR UPDATE,LOCK IN SHARE MODE,yPROCEDURE.
Sisecreaunavistayluegosemodificaelentornodeprocesodelaconsultaatravesdela
modificacindevariablesdelsistema,puedeafectarlosresultadosdevueltosporlavista:
mysql>CREATEVIEWvASSELECTCHARSET(CHAR(65)),COLLATION(CHAR(65));
QueryOK,0rowsaffected(0.00sec)
mysql>SETNAMES'latin1';
QueryOK,0rowsaffected(0.00sec)
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina46/52
mysql>SELECT*FROMv;
+++
|CHARSET(CHAR(65))|COLLATION(CHAR(65))|
+++
|latin1|latin1_swedish_ci|
+++
1rowinset(0.00sec)
mysql>SETNAMES'utf8';
QueryOK,0rowsaffected(0.00sec)
mysql>SELECT*FROMv;
+++
|CHARSET(CHAR(65))|COLLATION(CHAR(65))|
+++
|utf8|utf8_general_ci|
+++
1rowinset(0.00sec)
LaclusulaopcionalALGORITHMesunaextensindeMySQLalSQLestndar.ALGORITHMpuede
tomartresvalores:MERGE,TEMPTABLE,oUNDEFINED.ElalgoritmopordefectoesUNDEFINEDsino
seencuentrapresentelaclusulaALGORITHM.ElalgoritmoafectalamaneraenqueMySQLprocesa
lavista.
ParaMERGE,eltextodeunasentenciaquehagareferenciaalavistayladefinicindelavistason
mezcladosdeformaquepartedeladefinicindelavistareemplazalaspartescorrespondientesdela
consulta.
ParaTEMPTABLE,losresultadosdevueltosporlavistasoncolocadosenunatablatemporal,lacuales
luegoutilizadaparaejecutarlasentencia.
ParaUNDEFINED,MySQLdeterminaelalgoritmoqueutilizar.EnesecasoseprefiereMERGEpor
sobreTEMPTABLEsiesposible,yaqueMERGEporlogeneralesmseficienteyporquelavistano
puedeseractualizablesiseempleaunatablatemporal.
UnaraznparaelegirexplcitamenteTEMPTABLEesquelosbloqueosentablassubyacentespueden
serliberadosdespuesquelatablatemporalfuecreada,yantesdequeseausadaparaterminarel
procesamientodelasentencia.Estopodraresultarenunaliberacindelbloqueomsrpidaqueen
elalgoritmoMERGE,demodoqueotrosclientesqueutilicenlavistanoestarnbloqueadosmucho
tiempo.
ElalgoritmodeunavistapuedeserUNDEFINEDentressituaciones:
NoseencuentrapresenteunaclusulaALGORITHMenlasentenciaCREATE VIEW.
LasentenciaCREATE VIEWtieneexplcitamenteunaclusulaALGORITHM = UNDEFINED.
SeespecificALGORITHM = MERGEparaunavistaquesolamentepuedeserprocesada
usandounatablatemporal.Enestecaso,MySQLemiteunaadvertenciayestableceel
algoritmoenUNDEFINED.
Comosedijoanteriormente,MERGEprovocaquelaspartescorrespondientesdeladefinicindela
vistasecombinendentrodelasentenciaquehacereferenciaalavista.Elsiguienteejemplomuestra
brevementecmofuncionaelalgoritmoMERGE.Elejemploasumequehayunavistav_mergecon
estadefinicin:
CREATEALGORITHM=MERGEVIEWv_merge(vc1,vc2)AS
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina47/52
SELECTc1,c2FROMtWHEREc3>100;
Ejemplo1:Suponiendoqueseutiliceestasentencia:
SELECT*FROMv_merge;
MySQLlagestionadelsiguientemodo:
v_mergeseconvierteent
*seconvierteenvc1, vc2,quecorrespondenac1, c2
SeagregalaclusulaWHEREdelavista
Lasentenciaejecutadaresultaser:
SELECTc1,c2FROMtWHEREc3>100;
Ejemplo2:Suponiendoqueseutiliceestasentencia:
SELECT*FROMv_mergeWHEREvc1<100;
Estasentenciasegestionaenformasimilaralaanterior,aexcepcindequevc1 < 100seconvierte
enc1 < 100ylaclusulaWHEREdelavistaseagregaalaclusulaWHEREdelasentencia
empleandounconectorAND(yseagreganparntesisparaasegurarsequelaspartesdelaclusulase
ejecutarnenelordendeprecedenciacorrecto).Lasentenciaejecutadaresultaser:
SELECTc1,c2FROMtWHERE(c3>100)AND(c1<100);
Necesariamente,lasentenciaaejecutartieneunaclusulaWHEREconestaforma:
WHERE(WHEREdelasentencia)AND(WHEREdelavista)
ElalgoritmoMERGEnecesitaunarelacinunoaunoentrelosregistrosdelavistaylosregistrosde
latablasubyacente.Siestarelacinnosesostiene,debeemplearunatablatemporalensulugar.No
setendrunarelacinunoaunosilavistacontienecualquieradeestoselementos:
Funcionesagregadas(SUM(),MIN(),MAX(),COUNT(),etctera)
DISTINCT
GROUP BY
HAVING
UNIONoUNION ALL
Hacereferenciasolamenteavaloresliterales(entalcaso,nohayunatablasubyacente)
Algunasvistassonactualizables.Estosignificaqueselaspuedeemplearensentenciascomo
UPDATE,DELETE,oINSERTparaactualizarelcontenidodelatablasubyacente.Paraqueunavista
seaactualizable,debehaberunarelacinunoaunoentrelosregistrosdelavistaylosregistrosdela
tablasubyacente.Hayotroselementosqueimpidenqueunavistaseaactualizable.Ms
especficamente,unavistanoseractualizablesicontiene:
Funcionesagregadas(SUM(),MIN(),MAX(),COUNT(),etctera)
DISTINCT
GROUP BY
HAVING
UNIONoUNION ALL
UnasubconsultaenlalistadecolumnasdelSELECT
Join
UnavistanoactualizableenlaclusulaFROM
UnasubconsultaenlaclusulaWHEREquehacereferenciaaunatablaenlaclusulaFROM
Hacereferenciasolamenteavaloresliterales(entalcasonohayuna)tablasubyacentapara
actualizar.
ALGORITHM = TEMPTABLE(utilizarunatablatemporalsiempreresultaenunavistano
actualizable)
ConrespectoalaposibilidaddeagregarregistrosmediantesentenciasINSERT,esnecesarioquelas
columnasdelavistaactualizabletambincumplanlossiguientesrequisitosadicionales:
Nodebehabernombresduplicadosentrelascolumnasdelavista.
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina48/52
Lavistadebecontemplartodaslascolumnasdelatablaenlabasededatosquenotengan
indicadounvalorpordefecto.
Lascolumnasdelavistadebenserreferenciasacolumnassimplesynocolumnasderivadas.
Unacolumnaderivadaesunaquederivadeunaexpresin.Estossonalgunosejemplosde
columnasderivadas:
3.14159
col1+3
UPPER(col2)
col3/col4
(subquery)
Nopuedeinsertarregistrosenunavistaconteniendounacombinacindecolumnassimplesy
derivadas,peropuedeactualizarlasiactualizanicamentelascolumnasnoderivadas.Considere
estavista:
CREATEVIEWvASSELECTcol1,1AScol2FROMt;
Enestavistanopuedenagregarseregistrosporquecol2esderivadadeunaexpresin.Peroser
actualizablesinointentaactualizarcol2.Estaactualizacinesposible:
UPDATEvSETcol1=0;
Estaactualizacinnoesposibleporqueseintentarealizarsobreunacolumnaderivada:
UPDATEvSETcol2=0;
Aveces,esposiblequeunavistacompuestapormltiplestablasseaactualizable,asumiendoquees
procesadaconelalgoritmoMERGE.Paraqueestofuncione,lavistadebeusarinnerjoin(noouterjoin
oUNION).Adems,solamentepuedeactualizarseunatabladeladefinicindelavista,deformaque
laclusulaSETdebecontenercolumnasdeslounatabladelavista.LasvistasqueutilizanUNION
ALLnosepuedenactualizaraunquetericamentefueseposiblehacerlo,debidoaqueenla
implementacinseempleantablastemporalesparaprocesarlas.
Envistascompuestaspormltiplestablas,INSERTfuncionarsiseaplicasobreunanicatabla.
DELETEnoestsoportado.
LaclusulaWITH CHECK OPTIONpuedeutilizarseenunavistaactualizableparaevitarinserciones
oactualizacionesexceptoenlosregistrosenquelaclusulaWHEREdelasentencia_selectseevale
comotrue.
EnlaclusulaWITH CHECK OPTIONdeunavistaactualizable,laspalabrasreservadasLOCALy
CASCADEDdeterminanelalcancedelaverificacincuandolavistaestdefinidaentrminosdeotras
vistas.LOCALrestringeelCHECK OPTIONsloalavistaqueestsiendodefinida.CASCADEDprovoca
quelasvistassubyacentestambinseanverificadas.Sinoseindica,elvalorpordefectoes
CASCADED.Considerelassiguientesdefinicionesdetablayvistas:
mysql>CREATETABLEt1(aINT);
mysql>CREATEVIEWv1ASSELECT*FROMt1WHEREa<2
>WITHCHECKOPTION;
mysql>CREATEVIEWv2ASSELECT*FROMv1WHEREa>0
>WITHLOCALCHECKOPTION;
mysql>CREATEVIEWv3ASSELECT*FROMv1WHEREa>0
>WITHCASCADEDCHECKOPTION;
Lasvistasv2yv3estandefinidasentrminosdeotravista,v1.v2empleacheckoptionLOCAL,por
loquelasinsercionessloatraviesanlaverificacindev2.v3empleacheckoptionCASCADEDde
modoquelasinsercionesnosolamenteatraviesansupropiaverificacinsinotambienlasdelas
vistassubyacentes.Lassiguientessentenciasdemuestranlasdiferencias:
ql>INSERTINTOv2VALUES(2);
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina49/52
QueryOK,1rowaffected(0.00sec)
mysql>INSERTINTOv3VALUES(2);
ERROR1369(HY000):CHECKOPTIONfailed'test.v3'
Laposibilidaddeactualizacindelasvistaspuedeverseafectadaporelvalordelavariabledel
sistemaupdatable_views_with_limit.
LasentenciaCREATE VIEWfueintroducidaenMySQL5.0.1.LaclusulaWITH CHECK OPTIONfue
implementadaenMySQL5.0.2.
INFORMATION_SCHEMAcontieneunatablaVIEWSdelacualpuedeobtenerseinformacinsobrelos
objetosdelasvistas.
10.2.1Sintaxisde
DROP
VIEW
DROPVIEW[IFEXISTS]
nombre_vista[,nombre_vista]...
[RESTRICT|CASCADE]
DROP VIEWeliminaunaomsvistasdelabasededatos.SedebeposeerelprivilegioDROPencada
vistaaeliminar.
LaclusulaIF EXISTSseempleaparaevitarqueocurraunerrorporintentareliminarunavista
inexistente.Cuandoseutilizaestaclusula,segeneraunaNOTEporcadavistainexistente.
RESTRICTyCASCADEsonignoradas.
10.2.2Sintaxisde
SHOW
CREATE VIEW
SHOWCREATEVIEWnombre_vista
MuestralasentenciaCREATE VIEWqueseutilizparacrearlavista.
mysql>SHOWCREATEVIEWv;
+++
|Table|CreateTable|
+++
|v|CREATEVIEW`test`.`v`ASselect1AS`a`,2AS`b`|
+++
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina50/52
11Copia de seguridad
11.1El programa de copia de seguridad de base de
datos mysqldump
Elclientemysqldumppuedeutilizarseparavolcarunabasededatosocoleccindebasesdedatos
paracopiadeseguridadoparatransferirdatosaotroservidorSQL(nonecesariamenteunservidor
MySQL).ELvolcadocontienecomandosSQLparacrearlatablay/orellenarla.
Siesthaciendounacopiadeseguridaddelservidor,ylastablassontodasMyISAM,puede
considerarusarmysqlhotcopyyaquehacecopiasdeseguridadmsrpidasyrestauracionesms
rpidas,quepuedenrealizarseconelsegundoprograma.
Haytresformasdeinvocarmysqldump:
shell>mysqldump[opciones]nombre_de_base_de_datos[tablas]
shell>mysqldump[opciones]databasesDB1[DB2DB3...]
shell>mysqldump[opciones]alldatabases
Sinosenombraningunatablaoseutilizalaopcin--databaseso--all-databases,sevuelca
basesdedatosenteras.
Paraobtenerunalistadelasopcionesquesoportasuversindemysqldump,ejecutemysqldump
help.
Pararespaldarlabasededatosexistente:
shell> mysqldump -uussuario -pclave -R nombre_base_de_datos >
nombre_del_archivo_de_respaldo
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina51/52
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida
CursodeprogramacinenMySQL
Pagina52/52
12Ejercicios
1. Crearunatablaconcolumnasdelosdiferentetiposnumericos,yprobardeinsertarfilascon
valoresdentroyluegofueradelosrangosminimoymaximodecadatipo.
2. Crearunatablaconcolumnasdelosdiferentetiposdefechas,yprobardeinsertarfilascon
valoresdentroyluegofueradelosrangosminimoymaximodecadatipo.
3. Crearunatablaconcolumnasdelosdiferentetiposdecaracteres,yprobardeinsertarfilascon
valoresparacadatipo.
4. Probarlasprecedenciadeoperadores
5. Probarlasfuncionesdecomparaciondedatosconenteros.
6. Probarlosoperdoreslogicos
7. Probarlasfuncionesdeflujo
8. Probarlasfuncionesdecomparaciondedatosconcaracteres.
9. Probarlasfuncionesdematematica
10.Probarlasfuncionesdefechas.
11.Probarlasfuncionesdeencriptacion.
12.Probarlasfuncionesdeinformacin
13.Crearunprocedimientoparacrearunusuario
14.Crearunprocedimientoqueregresaelnumeroderegistrosquetienelatablalab_prescription
15.Crearunprocedimientoparacrearunpaciente,yqueregresaelno_patientgenerado,oun
numeronegativosielno_lnaissoelno_citynoexisteenlatablacity.
16.Crearunprocedimientoquevaausaruncursoryponerinactivotodoslosusuariosquetienenel
campobad_try>1
17.Crearunafuncionqueregresaelnombreyapellidocompletodelpacientecualno_patientfue
pasadocomoparametro.
18.Crearunafuncionquevaaregresarlaedadunpaciente.
19.Crearunafuncionqueregresaelnumerodelab_prescriptionligadasaunpaciente
20.Crearunafuncionqueregresaelnumerodepruebas(lab_test)deunciertotipo(lab_test_type)
ligadasaunpaciente
21.Crearunafuncionquedevuelveunnumerounicoyquesevaincrementando(comouna
secuencia).
22.Crearuntriggerquevaaponerelmayusculaslosnombresyapellidosdelpacientealinsertaro
modificarelpaciente.
23.Crearuntriggerquevaacrearunusuarioalinsertarunpaciente,conelmismonombre/apellido.
24.Crearunavistaquecontienelosdatosdelpacienteasiquelosnombredecuidadesdenacimiento
yresidencia.
25.Crearunavistaquelistalospacientesporregionycuidad,ydaeltotaldepacientesporcadauno.
26.Crearunacopiadesubasededatosusandorespaldo/restauraciondesubasededatos.
CopyrightCdricSimon,2007
Versin1.0
Reproduccinprohibida