Está en la página 1de 52

CursodeprogramacinenMySQL

Pagina1/52

Manual del alumno

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

7.5 Funciones de control de flujo..........................................................................................................................19


7.6 Funciones de comparacin de cadenas de caracteres...................................................................................20
7.7 Funciones de comparacin de cadenas de caracteres...................................................................................22
7.8 Operadores aritmticos....................................................................................................................................23
7.9 Funciones matemticas....................................................................................................................................23
7.10 Funciones de fecha y hora.............................................................................................................................25
7.11 Funciones de encriptacin.............................................................................................................................28
7.12 Funciones de informacin..............................................................................................................................28
8 Procedimientos y funciones......................................................................................................................................30
8.1 Uso.....................................................................................................................................................................30
8.2 CREATE PROCEDURE y CREATE FUNCTION......................................................................................30
8.3 La sentencia CALL..........................................................................................................................................33
8.4 Sentencia compuesta BEGIN ... END.............................................................................................................33
8.5 Sentencia DECLARE.......................................................................................................................................33
8.6 Variables en procedimientos almacenados....................................................................................................33
8.6.1 Declarar variables locales con DECLARE................................................................................................33
8.6.2 Sentencia SET para variables.....................................................................................................................34
8.6.3 La sentencia SELECT ... INTO..................................................................................................................34
8.6.4 Conditions and Handlers............................................................................................................................34
8.6.5 Condiciones DECLARE.............................................................................................................................34
8.6.6 DECLARE handlers...................................................................................................................................34
8.7 Cursores............................................................................................................................................................36
8.7.1 Declarar cursores........................................................................................................................................36
8.7.2 Sentencia OPEN del cursor........................................................................................................................36
8.7.3 Sentencia de cursor FETCH.......................................................................................................................37
8.7.4 Sentencia de cursor CLOSE.......................................................................................................................37
8.8 Constructores de control de flujo...................................................................................................................37
8.8.1 Sentencia IF................................................................................................................................................37
8.8.2 La sentencia CASE.....................................................................................................................................37
8.8.3 Sentencia LOOP.........................................................................................................................................38
8.8.4 Sentencia LEAVE......................................................................................................................................38
8.8.5 La setencia ITERATE................................................................................................................................38
8.8.6 Sentencia REPEAT....................................................................................................................................38
8.8.7 Sentencia WHILE.......................................................................................................................................39
9 Disparadores.............................................................................................................................................................40
9.1 Sintaxis de CREATE TRIGGER....................................................................................................................40
9.2 Sintaxis de DROP TRIGGER.........................................................................................................................41
9.3 Utilizacin de disparadores.............................................................................................................................41
10 Vistas.......................................................................................................................................................................44
10.1 Sintaxis de ALTER VIEW............................................................................................................................44
10.2 Sintaxis de CREATE VIEW.........................................................................................................................44
10.2.1 Sintaxis de DROP VIEW.........................................................................................................................49
10.2.2 Sintaxis de SHOW CREATE VIEW........................................................................................................49
11 Copia de seguridad.................................................................................................................................................50
11.1 El programa de copia de seguridad de base de datos mysqldump............................................................50
11.2 Mysqladmin para borrar y crear bases de datos........................................................................................50
11.3 Mysql para llenar una base de datos............................................................................................................51
12 Ejercicios.................................................................................................................................................................52
CopyrightCdricSimon,2007

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

INT[(M)] [UNSIGNED] [ZEROFILL]

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

DOUBLE [PRECISION],objetoREAL 8bytes


DECIMAL(M,D),NUMERIC(M,D)

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)

L+1bytes,dondeL <= My0<= M <=255

BINARY(M)

Mbytes,0<= M <=255

VARBINARY(M)

L+1bytes,dondeL <= My0<= M <=255

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

CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN

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.

8.2CREATE PROCEDURE y CREATE FUNCTION


CREATEPROCEDUREsp_name([parameter[,...]])
[characteristic...]routine_body
CREATEFUNCTIONsp_name([parameter[,...]])
RETURNStype
[characteristic...]routine_body
parameter:
[IN|OUT|INOUT]param_nametype
type:
AnyvalidMySQLdatatype
characteristic:
LANGUAGESQL
|[NOT]DETERMINISTIC
|{CONTAINSSQL|NOSQL|READSSQLDATA|MODIFIESSQLDATA}
|SQLSECURITY{DEFINER|INVOKER}
|COMMENT'string'
routine_body:
procedimientos almacenados o comandos SQL vlidos
Estoscomandoscreanunarutinaalmacenada.
Pordefecto,larutinaseasociaconlabasededatosactual.
Paraasociarlarutinaexplcitamenteconunabasededatos,especifiqueelnombrecomo
db_name.sp_namealcrearlo.
SielnombrederutinaeselmismoqueelnombredeunafuncindeSQL,necesitausarunespacio
entreelnombreyelsiguienteparntesisaldefinirlarutina,ohayunerrordesintaxis.Estotambin
esciertocuandoinvocalarutinaposteriormente.
LaclusulaRETURNSpuedeespecificarsesloconFUNCTION,dondeesobligatorio.Seusapara
indicareltipoderetornodelafuncin,yelcuerpodelafuncindebeconteneruncomandoRETURN
value.
CopyrightCdricSimon,2007

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

apareceelerrorPROCEDURE %s can't return a result set in the given context


(ER_SP_BADSELECT).
ElsiguienteesunejemplodeunprocedimientoalmacenadoqueuseunparmetroOUT.Elejemplo
usaelclientemysqlyelcomandodelimiterparacambiareldelimitadordelcomandode;a//
mientrassedefineelprocedimiento.Estopermitepasareldelimitador;usadoenelcuerpodel
procedimientoatravsdelservidorenlugardeserinterpretadoporelmismomysql.
mysql>delimiter//
mysql>CREATEPROCEDUREsimpleproc(OUTparam1INT)
>BEGIN
>SELECTCOUNT(*)INTOparam1FROMt;
>END
>//
QueryOK,0rowsaffected(0.00sec)
mysql>delimiter;
mysql>CALLsimpleproc(@a);
QueryOK,0rowsaffected(0.00sec)
mysql>SELECT@a;
++
|@a|
++
|3|
++
1rowinset(0.00sec)
Alusarelcomandodelimiter,debeevitarelusodelaantibarra('\')yaqueeselcarcterdeescape
deMySQL.
Elsiguienteesunejemplodefuncinquetomaunparmetro,realizaunaoperacinconunafuncin
SQL,yretornaelresultado:
mysql>delimiter//
mysql>CREATEFUNCTIONhello(sCHAR(20))RETURNSCHAR(50)
>RETURNCONCAT('Hello,',s,'!');
>//
QueryOK,0rowsaffected(0.00sec)
mysql>delimiter;
mysql>SELECThello('world');
++
|hello('world')|
++
|Hello,world!|
++
1rowinset(0.00sec)
SielcomandoRETURNenunprocedimientoalmacenadoretornaunvalorconuntipodistintoal
especificadoenlaclusulaRETURNSdelafuncin,elvalorderetornosecohercionaaltipoapropiado.
Porejemplo,siunafuncinretornaunvalorENUMoSET,peroelcomandoRETURNretornaunentero,
elvalorretornadoporlafuncineslacadenaparaelmienbrodeENUMcorrespondientedeun
comjuntodemiembrosSET.
CopyrightCdricSimon,2007

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.

8.6Variables en procedimientos almacenados


8.6.1Declararvariableslocalescon

DECLARE

DECLAREvar_name[,...]type[DEFAULTvalue]
Estecomandoseusaparadeclararvariableslocales.Paraproporcionarunvalorpordefectoparala
variable,incluyaunaclusulaDEFAULT.Elvalorpuedeespecificarsecomoexpresin,nonecesitaser
unaconstante.SilaclusulaDEFAULTnoestpresente,elvalorinicialesNULL.

CopyrightCdricSimon,2007

Versin1.0

Reproduccinprohibida

CursodeprogramacinenMySQL

Pagina34/52

LavisibilidaddeunavariablelocalesdentrodelbloqueBEGIN ... ENDdondeestdeclarado.


Puedeusarseenbloquesanidadosexceptoaqullosquedeclarenunavariableconelmismonombre.

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

11.2Mysqladmin para borrar y crear bases de


datos
mysqladmin es un cliente para realizar operaciones administrativas. Se puede
usar para comprobar la configuracin y el estado actual del servidor, crear y
borrar bases de datos, y con ms finalidades.
Invoquemysqladminas:
shell>mysqladmin[opciones]comando[opciones_de_comando]comando...
mysqladminsoportalossiguientescomandos:
create nombre_base_de_datos
Creaunanuevabasededatosllamadanombre_base_de_datos.
drop nombre_base_de_datos
Borralabasededatosllamadanombre_base_de_datosytodassus
Muchasmasopciones.VerladocumentacindeMySQLenelCDdelcurso.
Paraborrarlabasededatosexistente:
shell> mysqladmin -uussuario -pclave drop nombre_base_de_datos
Paracrearunabasededatosvacilla:
shell> mysqladmin -uussuario -pclave create nombre_base_de_datos
CopyrightCdricSimon,2007

Versin1.0

Reproduccinprohibida

CursodeprogramacinenMySQL

Pagina51/52

11.3Mysql para llenar una base de datos


mysql es un simple shell SQL (con capacidades GNU readline). Soporta uso
interactivo y no interactivo. Cuando se usa interactivamente, los resultados
de las consultas se muestran en formato de tabla ASCII. Cuando se usa no
interactivamente (por ejemplo, como filtro), el resultado se presenta en
formato separado por tabuladores. El formato de salida puede cambiarse usando
opciones de lnea de comandos.
Sitieneproblemasrelacionadosconmemoriainsuficienteparaconjuntosderesultadosgrandes,
utilicelaopcin--quick.Estofuerzamysqladevolverlosresultadosdesdeelservidorregistroa
registroenlugarderecibirtodoelconjuntoderesultadosyalmacenarloenmemoriaantesde
mostrarlo.Estosehaceusandomysql_use_result()enlugardemysql_store_result()para
recibirelconjuntoderesultados.
Usarmysqlesmuysencillo.Invquelodesdeelpromptdesuintrpretedecomandoscomose
muestraacontinuacin:
shell>mysqlnombre_base_de_datos
Para rellenar la base de datos con el archivo de respaldo ejectua:
shell> mysql -uussuario -pclave -f nombre_base_de_datos > archivo_de_respaldo

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

También podría gustarte