Vous êtes sur la page 1sur 52

Curso de programacin en MySQL

Pagina 1 / 52



Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

SolucionJava.com

    

Ing. Cedric Simon Tel: 2268 0974 Cel: 8888 2387 Email: 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

Pagina 2 / 52

1 ndice






    





   




  







 




    




      












!
 
 " #$



%
$

 &
 " #$



%


 
   




    




 
 




     




!"   #  




$  % &




"  '

 



(
(    )*$



(
+,   &- .
(

/ 01- .



(
101- .
(

123 45 6- .



+
)701"!- .



+
0    86  )*$



+
   




 
!
( 
) " #$
*
 
19 $ 6


 
/
19 :  ;


 
/
( 
)+
     


 
*


 




 

"( ,


 

( -.


 

 "/!,01


 

  


 

"#
 $


 

%2
 3
 

 
%4+"+ 


 

%5   


 

%

 
 67
   


 

%& 
#


 '
 
80 
    


 
9
80 



 
9
84
"    
)


 
9
8 )6
 


 
:
Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 3 / 52

84
     ; 


 
:
8%4
  
)    


 
*
884
  
)    


 

89 
3
 


 

8:4
 



 

8*4
 ;+"+ 


 

84
 
 
)


 
9
84
 
; 
)


 
9
'(
$
) 



 
!
9< 


 
*
95,205-<"5,24<=52(=


 
*
9$ 
5,$$


 

9  
  .>(==-


 

9  
-5$,


 

9%?
 

  


 

(0 

#
    0"$<,


 

(   
#
 


 

($   $"=7


 

("    > 



 

(!"    0"$<,


 

(0"$<,' 



 

985 


 
%
(0 






 

(   7?= 




 

(    

4">


 

(    

"$7


 

995        ; 


 
8
((   4

 
(($   "<


 

((   $77?


 
(
((   $<@
(
 
((!$   ,<


 
(
((   ,?<


 
(
((   :>$


 
+
*+#



 
!
:
 @
 5,22(>>


 
*
:
 @
 -02(>>

 
:<

A
) 
 


 

!,


 

*
 @
 ,$2?(B


 

*
 @
 5,2?(B

 
/ 6  0,7?@:


 
+
/ 6  >7:",<@:


 
+
-#

.


 
!
 6  
 6
     " 


 
*
" 
 "   


 
*
"   


 

 /0
  


 

Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Copyright Cdric Simon, 2007

Pagina 4 / 52

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 5 / 52

2 Introduccin al curso
2.1 Objetivo de este curso
En este curso vamos a aprender como programar disparadores, procedimientos, y funciones en
MySQL versin 5.0.27.

2.2 Manual del alumno


Este manual del alumno es una ayuda para el alumno, para tenga un recuerdo del curso. Este
manual contiene un resumen de las materias que se van a estudiar durante el curso, pero el alumno
debera de tomar notas personales para completas este manual.
En el CD del curso viene la documentacin de MySQL en espaol, que completa este manual. La
mayoria de los puntos de este manual estn explicado de manera ms completa en la documantacin
de MySQL en el CD.

2.3 Ejercicios prcticos


Para captar mejor la teora, se harn muchos ejercicios con los alumnos, para probar la teora y
verificar la integracin de la materia.
Tambin, el alumno podr copiar sus cdigos en un disquete al fin del curso para llevarse, con fin de
seguir la prctica en su hogar.

2.4 Requisitos para atender a este curso


Se requiere un conocimiento de base del lenguaje SQL.
Si el alumno tiene dificultades en un u otro capitulo, el debe sentirse libre de pedir explicaciones
adicionales al profesor.

2.5 Soporte despues del curso


Si tienes preguntas sobre la materia del curso en tus ejercicios prcticos, puedes escribir tus
preguntas a cedric@solucionjava.com.
Para informaciones sobre otros cursos, visita el sitio web www.solucionjava.com.

Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 6 / 52

3 Genralidades de MySQL
3.1 Historia de MySQL
Empezamos con la intencin de usar mSQL para conectar a nuestras tablas utilizando nuestras
propias rutinas rpidas de bajo nivel (ISAM). Sin embargo y tras algunas pruebas, llegamos a la
conclusin que mSQL no era lo suficientemente rpido o flexible para nuestras necesidades. Esto
provoc la creacin de una nueva interfcie SQL para nuestra base de datos pero casi con la misma
interfcie API que mSQL. Esta API fue diseada para permitir cdigo de terceras partes que fue
escrito para poder usarse con mSQL para ser fcilmente portado para el uso con MySQL.
La derivacin del nombre MySQL no est clara. Nuestro directorio base y un gran nmero de
nuestras bibliotecas y herramientas han tenido el prefijo "my" por ms de 10 aos. Sin embargo, la
hija del co-fundador Monty Widenius tambin se llama My. Cul de los dos di su nombre a MySQL
todava es un misterio, incluso para nosotros.
El nombre del delfn de MySQL (nuestro logo) es "Sakila", que fu elegido por los fundadores de
MySQL AB de una gran lista de nombres sugerida por los usuarios en el concurso "Name the
Dolphin" (ponle nombre al delfn). El nombre ganador fue enviado por Ambrose Twebaze, un
desarrollador de software Open Source de Swaziland, frica. Segn Ambrose, el nombre femenino de
Sakila tiene sus races en SiSwate, el idioma local de Swaziland. Sakila tambin es el nombre de una
ciudad en Arusha, Tanzania, cerca del pas de origen de Ambrose, Uganda.

3.2 Las principales caractersticas de MySQL


La siguiente lista describe algunas de las caractersticas ms importantes del software de base de
datos MySQL.

3.2.1 Interioridades y portabilidad



















Escrito en C y en C++
Probado con un amplio rango de compiladores diferentes
Funciona en diferentes plataformas.
Usa GNU Automake, Autoconf, y Libtool para portabilidad.
APIs disponibles para C, C++, Eiffel, Java, Perl, PHP, Python, Ruby, y Tcl.
Uso completo de multi-threaded mediante threads del kernel. Pueden usarse fcilmente
multiple CPUs si estn disponibles.
Proporciona sistemas de almacenamiento transaccionales y no transaccionales.
Usa tablas en disco B-tree (MyISAM) muy rpidas con compresin de ndice.
Relativamente sencillo de aadir otro sistema de almacenamiento. Esto es til si desea
aadir una interfcie SQL para una base de datos propia.
Un sistema de reserva de memoria muy rpido basado en threads.
Joins muy rpidos usando un multi-join de un paso optimizado.
Tablas hash en memoria, que son usadas como tablas temporales.
Las funciones SQL estn implementadas usando una librera altamente optimizada y deben
ser tan rpidas como sea posible. Normalmente no hay reserva de memoria tras toda la
inicializacin para consultas.
El cdigo MySQL se prueba con Purify (un detector de memoria perdida comercial) as como
con Valgrind, una herramienta GPL (http://developer.kde.org/~sewardj/).
El servidor est disponible como un programa separado para usar en un entorno de red
cliente/servidor. Tambin est disponible como biblioteca y puede ser incrustado (linkado) en

Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 7 / 52

aplicaciones autnomas. Dichas aplicaciones pueden usarse por s mismas o en entornos


donde no hay red disponible..

3.2.2 Tipos de columnas


Diversos tipos de columnas: enteros con/sin signo de 1, 2, 3, 4, y 8 bytes de longitud, FLOAT,
DOUBLE, CHAR, VARCHAR, TEXT, BLOB, DATE, TIME, DATETIME, TIMESTAMP, YEAR, SET,
ENUM, y tipos espaciales OpenGIS.

3.2.3 Seguridad
Un sistema de privilegios y contraseas que es muy flexible y seguro, y que permite verficacin
basada en el host. Las contraseas son seguras porque todo el trfico de contraseas est encriptado
cuando se conecta con un servidor.

3.2.4 Escalabilidad y lmites


Soporte a grandes bases de datos. Usamos MySQL Server con bases de datos que contienen 50
millones de registros. Tambin conocemos usuarios que usan MySQL Server con 60.000 tablas y
acerca de 5.000.000 de registros.
Se permiten hasta 64 ndices por tabla (32 antes de MySQL 4.1.2). Cada ndice puede consistir desde
1 hasta 16 columnas o partes de columnas. El mximo ancho de lmite son 1000 bytes (500 antes de
MySQL 4.1.2).Un ndice puede usar prefijos de una columna para los tipos de columna CHAR,
VARCHAR, BLOB, o TEXT.

3.2.5 Conectividad
Los clientes pueden conectar con el servidor MySQL usando sockets TCP/IP en cualquier plataforma.
En sistemas Windows de la familia NT (NT,2000,XP, o 2003), los clientes pueden usar named pipes
para la conexin. En sistemas Unix, los clientes pueden conectar usando ficheros socket Unix.
En MySQL 5.0, los servidores Windows soportan conexiones con memoria compartida si se inicializan
con la opcin --shared-memory. Los clientes pueden conectar a travs de memoria compartida usando
la opcin --protocol=memory.
La interfaz para el conector ODBC (MyODBC) proporciona a MySQL soporte para programas clientes
que usen conexiones ODBC (Open Database Connectivity). Por ejemplo, puede usar MS Access para
conectar al servidor MySQL. Los clientes pueden ejecutarse en Windows o Unix. El cdigo fuente de
MyODBC est disponible. Todas las funciones para ODBC 2.5 estn soportadas, as como muchas
otras.
La interfaz para el conector J MySQL proporciona soporte para clientes Java que usen conexiones
JDBC. Estos clientes pueden ejecutarse en Windows o Unix. El cdigo fuente para el conector J est
disponible.

3.2.6 Localizacin
El servidor puede proporcionar mensajes de error a los clientes en muchos idomas.
Soporte completo para distintos conjuntos de carcteres, incluyendo latin1 (ISO-8859-1), german,
big5, ujis, y ms. Por ejemplo, los carcteres escandinavos '', '' y '' estn permitidos en nombres de
tablas y columnas. El soporte para Unicode est disponible.

Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 8 / 52

Todos los datos se guardan en el conjunto de carcteres elegido. Todas las comparaciones para
columnas normales de cadenas de carcteres son case-insensitive.
La ordenacin se realiza acorde al conjunto de carcteres elegido (usando colacin Sueca por defecto).

3.2.7 Clientes y herramientas


MySQL server tiene soporte para comandos SQL para chequear, optimizar, y reparar tablas. Estos
comandos estn disponibles a travs de la lnea de comandos y el cliente mysqlcheck. MySQL
tambin incluye myisamchk, una utilidad de lnea de comandos muy rpida para efectuar estas
operaciones en tablas MyISAM.
Todos los programas MySQL pueden invocarse con las opciones --help o -? para obtener asistencia en
lnea.

3.2.8 Estabilidad de MySQL


Esta seccin trata las preguntas "Qu estabilidad tiene MySQL Server?" y, "Puedo fiarme de
MySQL Server para este proyecto?" Intentaremos clarificar estas cuestiones y responder algunas
preguntas importantes que preocupan a muchos usuarios potenciales. La informacin en esta seccin
se basa en datos recopilados de las listas de correo, que son muy activas para identificar problemas
as como para reportar tipos de usos.
El cdigo original se remonta a los principos de los aos 80. En TcX, la predecesora de MySQL AB, el
cdigo MySQL ha funcionado en proyectos desde mediados de 1996 sin ningn problema. Cuando el
software de base de datos MySQL fue distribudo entre un pblico ms amplio, nuestros nuevos
usuarios rpidamente encontraron trozos de cdigo no probados. Cada nueva versin desde entonces
ha tenido pocos problemas de portabilidad incluso considerando que cada nueva versin ha tenido
muchas nuevas funcionalidades.
Cada versin de MySQL Server ha sido usable. Los problemas han ocurrido nicamente cuando los
usuarios han probado cdigo de las "zonas grises". Naturalmente, los nuevos usuarios no conocen
cules son estas zonas; esta seccin, por lo tanto, trata de documentar dichas reas conocidas a da de
hoy. Las descripciones mayormente se corresponden con la versin 3.23, 4.0 y 4.1 de MySQL Server.
Todos los bugs reportados y conocidos se arreglan en la ltima versin, con las excepciones listadas
en las secciones de bugs y que estn relacionados con problemas de diseo.

3.2.9 Modulos de MySQL


El diseo de MySQL Server es multi capa, con mdulos independientes. Algunos de los ltimos
mdulos se listan a continuacin con una indicacin de lo bien testeados que estn:
1.1.1.1

Replicatin (Estable)

Hay grandes grupos de servidores usando replicacin en produccin, con buenos resultados. Se
trabaja para mejorar caractersticas de replicacin en MySQL 5.x.
1.1.1.2

InnoDB tablas (Estable)

El motor de almacenamiento transaccional InnoDB es estable y usado en grandes sistemas de


produccin con alta carga de trabajo.
1.1.1.3

BDB tablas (Estable)

El cdigo Berkeley DB es muy estable, pero todava lo estamos mejorando con el interfaz del motor de
almacenamiento transaccional BDB en MySQL Server.
1.1.1.4

Bsquedas Full-text (Estable)

Bsquedas Full-text es mpliamente usada.


Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

1.1.1.5

Pagina 9 / 52

MyODBC 3.51 (Estable)

MyODBC 3.51 usa ODBC SDK 3.51 y es usado en sistemas de produccin mpliamente. Algunas
cuestiones surgidas parecen ser cuestin de las aplicaciones que lo usan e independientes del
controlador ODBC o la base de datos subyacente.

3.2.10 Dimensiones mximas de las tablas MySQL


En MySQL 5.0, usando el motor de almacenamiento MyISAM, el mximo tamao de las tablas es de
65536 terabytes (256 ^ 7 - 1 bytes). Por lo tanto, el tamao efectivo mximo para las bases de datos
en MySQL usualmente los determinan los lmites de tamao de ficheros del sistema operativo, y no
por lmites internos de MySQL.
El motor de almacenamiento InnoDB mantiene las tablas en un espacio que puede ser creado a partir
de varios ficheros. Esto permite que una tabla supere el tamao mximo individual de un fichero.
Este espacio puede incluir particiones de disco, lo que permite tablas extremadamente grandes. El
tamao mximo del espacio de tablas es 64TB.

Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 10 / 52

4 Instalacin a base de datos


4.1 Instalacin de MySQL
En este curso vamos a utilizar la base de datos MySQL, en su versin 5.0.27. Por eso la vamos a
instalar ya.

4.1.1 Bajo Linux


Para instalar MySQL vamos primero a entrar como el usuario Root (o usar su).
Luego abrimos una ventana de consola, introducemos el CD del curso, y vamos a instalar la version
de MySQL que estaen el CD lanzando desde el CD la instruccin:

 para instalar el sevidor

para instalar el cliente
Eso installo MySQL bajo /usr/bin.
Vamos a crear una carpeta /mysql conteniendo los atajos hacia programas de MySQL.
. createMySQLlinks.sh

Vamos ahora a cambiar la clave del usuario root. Para cambiar la clave, entra en /mysql y ejecuta :
/usr/bin/mysqladmin -u root password 'SolPHP' La nueva clave sera 'SolPHP'.
Para verificar que MySQL esta bien instalado y se inicia, ejecuta    como Root.
Y ahora vamos a crear la base de datos del curso:
cd /media/CD
/mysql/mysql -u root -pSolJava
create database curso;
exit;
/mysql/mysql -u root -pSolJava curso < curso.sql

4.1.2 Bajo Windows


Bajo Windows solo se corre el archivo mysql-5.0.27-win32.exe con un usuario con derecho de
administrador.
Se requiere un sistema operativo Windows de 32 bits, tal como 9x, Me, NT, 2000, XP, o Windows
Server 2003.
Se recomienda fuertemente el uso de un sistema operativo Windows basado en NT (NT, 2000, XP,
2003) puesto que stos permiten ejecutar el servidor MySQL como un servicio

4.2 Instalacin herramienta de desarrollo


Como herramienta de desarrollo vamos a utilizar la versin gratis de EMS MySQL Manager Lite,
que corre bajo Windows. Hasta ahora no he encontrado herramienta gratis bajo Linux que permite
gestionar comodamente las principales nuevas funciones de MySQL 5 que son los triggers,
procedimientos, funciones, y vistas.
Existen muchas herramientas libres para MySQ, funccionando bajo Linux como Windows. Las mas
conocidas son phpMyAdmin y MySQL GUI tools de MySQL AB. Pero ninguno de estas herramientas
permite manejar de manera comoda las vistas, los triggers, o los procedimientos/funciones.
Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 11 / 52

5 Motores de base de datos


5.1 MyISAM
Es el primer motor de MySQL. Por defecto se crean las tablas usando el motor MyISAM.
Este motor crea las tablas como archivos de texto. Un archivo por tabla.
El motor MyISAM es muy veloz, especialmente en lectura, pero no soporta (todavia) las claves
primarias y secundarias, ni las transacciones (commit/rollback).

5.2 InnoDB
Es el motor para bases de datos transacionales y/o con claves primaria y secundaria. Es el motor que
vamos a utilizar en este curso. Se puede definir como motor por defecto a nivel de la base de datos y/o
a nivel del servidor.

5.3 Memory (HEAP)


Este motor crea tablas temporales en la memoria. El aceso es entonces muy rpido, pero consume
memoria si se almacena muchas datos.

5.4 Otros
MySQL trae varios otros tipos de motores de bases de datos, con sus especificidades. Entre otros
BDB, CSV,... Ver la documentacin de MySQL para mas detalles.

Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 12 / 52

6 Tipos de columas
6.1 Tipos numricos
A continuacin hay un resumen de los tipos de columnas numricos.
M indica la anchura mxima para mostrar. La anchura mxima es 255.
Si especifica  para columnas numricas,, MySQL aade automticamente el atributo

  en la columna.

  es un alias para   


       .

     en la definicin de una columna de tipo entero es un alias para  
   .

Tipo

Bytes Valor Mnimo

  

  

   3

 

(Con signo/Sin signo)

(Con signo/Sin signo)



















   

   


  

Valor Mximo

! !!

!  ! 








!

 "#M$%

En un tipo de datos bit.  indica el nmero de bits por valor, de 1 a 64. El valor por defecto es
1 si se omite M .
  "#$%"
  %"%
Un entero muy pequeo. El rango con signo es de  a . El rango sin signo es de  a
.
, 
Son sinnimos para   #$. Un valor de cero se considera falso. Valores distintos a cero
se consideran ciertos.
En el futuro, se introducir tratamiento completo de tipos booleanos segn el estndard SQL.

  "#M$%"
  %"%
Un entero pequeo. El rango con signo es de  a . El rango sin signo es de  a
.
  "#M$%"
  %"%
Entero de tamao medio. El rango con signo es de  a . El rango sin singo
es de  a .

Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 13 / 52

  "#M$%"
  %"%







Un entero de tamao normal. El rango con signo es de     a    . El


rango sin signo es de  a ! !!.
  "#$%"
  %"%
Es un sinnimo de  .
  "#$%"
  %"%
Un entero grande. El rango con signo es de !  a
! . El rango sin signo es de  a   !.
Algunos aspectos a considerar con respecto a las columnas    :
 #&$"
  %"%
Nmero con coma flotante. p representa la precisin. Puede ir de 0 a 24 para nmeros de
coma flotante de precisin sencilla y de 25 a 53 para nmeros de coma flotante con doble
precisin.
Esta sintaxis se proprociona para compatibilidad con ODBC.
 "#M' $%"
  %"%
Un nmero de coma flotante pequeo (de precisin simple). Los valores permitidos son de
(  ) a ( ! , , y de ( !  a
(  ).   sin argumentos o  #p$ (donde & est en el rango de 0 a 24)
es un nmero de coma flotante con precisin simple.
"#M'$%"
  %"%
Nmero de coma flotante de tamao normal (precisin doble). Los valores permitidos son de 
(!! ) a ( , , y de
(  a (!! ). Un nmero de coma flotante
con precision sencilla tiene una precisin de 7 decimales aproximadamente; un nmero con
coma flotante de doble precisin tiene una precisin aproximada de 15 decimales.
*
 "#' $%"
  %"%,  "#'D$%"
  %
"%
 "#M"' %$%"
  %"%
A partir de MySQL 5.0.3:
Nmero de punto fijo exacto y empaquetado. M es el nmero total de dgitos y D es el nmero
de decimales. El punto decimal y (para nmeros negativos) el signo '' no se tiene en cuenta
en . Si es 0, los valores no tienen punto decimal o parte fraccional.
Si se omite D, el valor por defecto es 0. Si se omite , el valor por defecto es 10.
Todos los clculos bsicos ()''+',) con columnas   se hacen con precisin de 64
dgitos decimales.
"#"' %$%"
  %"%, "#"' %$%"
  %
"%, - "#M"'D%$%"
  %"%
Son sinnimos para  . El sinnimo - est disponible por compatibilidad con otros

Toda la aritmtica se hace usando valores    o , as que no debe usar enteros sin signos
mayores que !  (63 bits) except con funciones bit! Si lo hace, algunos de los
ltimos dgitos en el resultado pueden ser errneos por culpa de errores de redondeo al convertir
valores    a .
Para darles una idea, un INT unsigned permite almacenar un numero por segundo durante 135 aos.
un BIGINT unsigned, 1.000.000 de numeros por segundo durante mas de 500.000 aos...

6.2 Fechas y horas


Un resumen de los tipos de columnas temporales se muestra a continuacin.
 

Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 14 / 52

Una fecha. El rango soportado es de .. a .!!!!.. MySQL muestra


valores  en formato . ., pero permite asignar valores a columnas 
usando cadenas de carcteres o nmeros.

Combinacin de fecha y hora. El rango soportado es de .//. a .!!!!
/!/!.. MySQL muestra valores  en formato . 
00//

., pero permite asignar valores a las columnas  usando cadenas de


carcteres o nmeros.

 *"#$%
Una marca temporal. El rango es de .!//. hasta el ao .
Una columna 
 * es til para registrar la fecha y hora de una operacin 
 o
*  . La primera columna 
 * en una tabla se rellena automticamente con la
fecha y hora de la operacin ms reciente si no le asigna un valor. Puede asignar a cualquier
columna 
 * la fecha y hora actual asignndole un valor  .
En MySQL 5.0, 
 * se retorna como una cadena de carcteres en el formato .
 00//

. cuya anchura de muestra son 19 carcteres. Si quiere obtener el valor


como un nmero, debe aadir ) a la columa timestamp .

Una hora. El rango es de ./!/!. a ./!/!.. MySQL muestra los valores 
en formato .00//

., pero permite asingar valores a columnas  usando nmeros o


cadenas de carcteres.
 "#1 $%
Un ao en formato de dos o cuatro dgitos. El valor por defecto est en formato de cuatro
dgitos. En formato de cuatro dgitos, los valores permitidos son de ! a , y . En
formato de dos dgitos, los valores permitidos son de  a !, representando los aos de 1970
a 2069. MySQL muestra los valores   en formato  pero permite asignar valores a
columnas   usando cadenas de carctere
Tipo de Columna Cero Valor


.//.



..


 *





.//.

 



6.3 Cadenas de caracteres


Un resumen de los tipos de columnas de cadenas de carcteres se muestra a continuacin.
En algunos casos, MySQL puede cambiar una columna de cadena de carcteres a un tipo diferente
para un comando    o   .
Los tipos de cadenas de carcteres MySQL 5.0 incluyen algunas caractersticas que puede que no
haya encontrado trabajando con versiones anteriores de MySQL anteriores a la 4.1:
 0 
Es un sinnimo de 0 #$.
  #$
El tipo   es similar al tipo 0 , pero almacena cadenas de datos binarios en lugar de
cadenas de carcteres no binarias.
Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 15 / 52

   #$









El tipo    es similar al tipo  0 , pero almacena cadenas de carcteres binarias
en lugar de cadenas de carcteres no binarias.
 
Una columna  con una longitud mxima de 255 (2^8 - 1) bytes.
 -
Una columna - con longitud mxima de 255 (2^8 - 1) carcteres.
"#$%
Una columna  con longitud mxima de 65,535 (2^16 - 1) bytes.
-"#$%
Una columna - con longitud mxima de 65,535 (2^16 - 1) carcteres.
 
Una columna  con longitud de 16,777,215 (2^24 - 1) bytes.
 -
Una columna - con longitud mxima de 16,777,215 (2^24 - 1) carcteres.
 
Una columna  con longitud mxima de 4,294,967,295 o 4GB (2^32 - 1) bytes. La longitud
mxima efectiva (permitida) de las columnas   depende del tamao mximo
configurado para los paquetes en el protocolo cliente/servidor y la memoria disponible.
 -
Una columna - con longitud mxima de 4,294,967,295 or 4GB (2^32 - 1) carcteres. La
longitud mxima efectiva (permitida) de columnas  - depende del tamao mximo de
paquete configurado en el protocolo cliente/servidor y la memoria disponible.
 #.value1.'.23456.'((($
Una enumeracin. Un objeto de cadena de carcteres que slo puede tener un valor, elegido
de una lista de valores .value1., .23456., (((,  o el valor de error especial .. . Una
columna   puede tener un mximo de 65,535 valores distintos. Los valores   se
representan internamente como enteros.

#.value1.'.value2.'((($
Un conjunto. Un objeto de cadena de carcteres que puede tener cero o ms valores que deben
pertencer a la lista de valores .value1., .23456., ((( Una columna
 puede tener un
mximo de 64 miembros. Los valores
 se representan internamente como enteros.

789:&780 ; 0 87<8:=:43>68'&6>7?:@:6>6<6<AB=78634=3A6<3<;


>6A5&6>3<( 68?6;
(('93=D:E<?:@:6>6<6<4347<F:95?=GH:=3;6<AB=7
869>393<47868&3A:78@:<3468(
Los tipos 0  y  0  se declaran con una longitud que indica el mximo nmero de carcteres
que quiere almacenar. Por ejemplo, 0 #$ puede almacenar hasta 30 carcteres.
La longitud de una columna 0  se fija a la longitud que se declara al crear la tabla. La longitud
puede ser cualquier valor de 0 a 255. Cuando los valores 0  se almacenan, se aaden espacios a la
derecha hasta las longitud especfica. Cuando los valores 0  se recuperan, estos espacios se borran.
Los valores en columnas  0  son cadenas de carcteres de longitud variable. En MySQL 5.0, la
longitud puede especficarse de 0 a 255 antes de MySQL 5.0.3, y de 0 a 65,535 en 5.0.3 y versiones
posteriores. (La mxima longitud efectiva de un  0  en MySQL 5.0 se determina por el tamao
de registro mximo y el conjunto de carcteres usados. La longitud mxima total es de 65,532 bytes.)
En contraste con 0 ,  0  almacena los valores usando slo los carcteres necesarios, ms un
byte adicional para la longitud (dos bytes para columnas que se declaran con una longitud superior a
255).

Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 16 / 52

6.4 Requisitos de almacenamiento segn el tipo de


columna
Los requerimientos de almacenamiento para cada uno de los tipos de columnas soportados por
MySQL se listan por categora.
El mximo tamao de un registro en una tabla ;
 es 65,534 bytes. Cada columna  y -
cuenta slo de cinco a nueve bytes ms alla de su tamao.
Si una tabla ;
 incluye cualquier tipo de columna de tamao variable, el formato de rebistro
tambin tiene longitud variable. Cuando se crea una tabla. MySQL puede, bajo ciertas condiciones,
cambiar una columna de tamao variable a fijo o viceversa.
.
Requerimientos de almacenamiento para tipos numricos
Tipo de columna

Almacenamiento requerido

  

1 byte

  

2 bytes

  

3 bytes

 ,   

4 bytes

  

8 bytes

 #&$

4 bytes si 0 <= p <= 24, 8 bytes si 25 <= p <= 53

 

4 bytes

"*
 %, objeto   8 bytes
 #M' $, #' $

Vara; consulte la siguiente explicacin

#M$

aproximadamente (M+7)/8 bytes

Requerimientos de almacenamiento para tipos de fecha y hora


Tipo de columna Almacenamiento requerido


3 bytes



8 bytes


 *

4 bytes



3 bytes

 

1 byte

Requerimientos de almacenamiento para tipos de cadenas de carcteres


Tipo de columna

Almacenamiento requerido

0 #M$

 bytes, 0 IJIJ 255

 0 #M$

+1 bytes, donde LIJ y 0 IJIJ 255

 #$

 bytes, 0 IJMIJ 255

  #$

+1 bytes, donde LIJ y 0 IJIJ 255

 ,  -

+1 byte, donde L < 2^8

Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

, -

Pagina 17 / 52

+2 bytes, donde  < 2^16

 ,  - +3 bytes, donde  < 2^24


 ,  -

L+4 bytes, donde  < 2^32

 #.value1.'.23456. 1 o 2 bytes, dependiendo del nmero de valores de la enumeracin


(65,535 valores como mximo)
'((($

#.value1.'.23456.' 1, 2, 3, 4, o 8 bytes, dependiendo del nmero de miembros del conjunto


(64 miembros como mximo)
((($
Los tipos  0  y  y - son de longitud variable. Para cada uno, los requerimientos de
almacenamiento depende de la longitud de los valores de la (representados por L en la tabla
precedente), en lugar que el tamao mximo del tipo. Por ejemplo, una columna  0 #$ puede
tratar una cadena con una lengitud mxima de 10. El almacenamiento requerido real es la longitud
de la cadena (L), ms 1 byte para registrar la longitud de la cadena. Para la cadena .3DA?., L es 4 y
el requerimiento de almacenamiento son 5 .

Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 18 / 52

7 Funciones y operadores
7.1 Precedencias de los operadores
La precedencia de operadores se muestra en la siguiente lista, de menor a mayor precedencia. Los
operadores que se muestran juntos en una lnea tienen la misma precedencia.
 /J
 11''-
 KK'
 
 L '
'L0 '0 '

 J'IJM'MJ'M'IJ'I'IM'NJ'
'O' -*'
 1
 K
 II'MM
 ')
 +',' 'P'
 Q
 #>68935<3>:3$'R#:<26>8:B<?6D:95<3>:3$
 N
  ' 

7.2 12.1.2. Parntesis


 

Use parntesis para forzar el orden de evaluacin en una expresin. Por ejemplo:
=;8S4M
)+T
M
=;8S4M
#)$+T
M!

7.3 Funciones y operadores de comparacin


Las operaciones de comparacin dan un valor de  (CIERTO),  (FALSO), o . Estas operaciones
funcionan tanto para nmeros como para cadenas de caracteres. Las cadenas de caracteres se
convierten automticamente en nmeros y los nmeros en cadenas cuando es necesario.
Algunas de las funciones de esta seccin (tales como 
#$ y  
#$) retornan valores
distintos a  (CIERTO),  (FALSO), o . Sin embargo, el valor que retornan se basa en
operaciones de comparacin realizadas como describen las siguientes reglas.
MySQL compara valores usando las siguientes reglas:
 Si uno o ambos argumentos son , el resultado de la comparacin es , excepto para el
operador de comparacin -safe IJM .
 Si ambos argumentos en una operacin de comparacin son cadenas, se comparan como
cadenas.
 Si ambos argumentos son enteros, se comparan como enteros.
 Los valores hexadecimales se tratan como cadenas binarias si no se comparan con un nmero.
Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 19 / 52

 Si uno de los argumentos es una columna 


 * o  y el otro argumento es una

constante, la constante se convierte en timestamp antes de realizar la comparacin. Esto se


hace para acercarse al comportamiento de ODBC. Esto no se hace para argumentos en  #$!
Para estar seguro, siempre use cadenas completas de fechas/horas al hacer comparaciones.
 En todos los otros casos, los argumentos se comparan como nmeros con punto flotante
(reales).
Por defecto, la comparacin de cadenas no es sensible a maysculas y usa el conjunto de carcteres
actual (ISO-8859-1 Latin1 por defecto, que siempre funciona bien para ingls).
Par convertir un valor a un tipo especfico para una comparacin, puede usar la funcin 
#$ . Los
valores de cadenas de caracteres pueden convertirse a un conjunto de caracteres distinto usando
 #$.

7.4 Operadores lgicos


En SQL, todos los operadores lgicos se evalan a ,  
, o  ( O L ). En MySQL, se
implementan como 1 (), 0 ( 
), y . La mayora de esto es comn en diferentes servidores
de bases de datos SQL aunque algunos servidores pueden retornar cualquier valor distinto a cero
para .
 , N

NOT lgica. Se evala a  si el operando es , a  si el operando es diferente a cero, y 


 retorna .
 , KK
AND lgica. Se evala a  si todos los operandos son distintos a cero y no , a 0 si uno o
ms operandos son , de otro modo retorna .
 , 11
OR lgica. Cuando ambos ooperandos son no , el resultado es 1 si algn operando es
diferente a cero, y 0 de otro modo. Con un operando  el resultado es 1 si el otro operando
no es cero, y  de otro modo. Si ambos operandos son , el resultado es .
 -
XOR lgica. Retorna  si algn operando es . Para operandos no  , evala a 1 si
un nmero par de operandos es distinto a cero, sino retorna 0.

7.5 Funciones de control de flujo


 
23456L0 "A7=&3>623456%0 result"L0 "A7=&3>623456%0 

>68549(((%"
>68549% , 
L0 "condition%0 >68549"L0 
"condition%0 >68549(((%"
>68549%
La primera versin retorna result donde valueJcompare-value. La segunda versin retorna el
resultado para la primera condicin que es cierta. Si no hay ningn resultado coincidente, el
resultado tras 
 se retorna, o  si no hay parte 
.
mysql> SELECT CASE 1 WHEN 1 THEN 'one'
-> WHEN 2 THEN 'two' ELSE 'more' END;
-> 'one'
 #expr1'6H&>'6H&>$
Si 6H&> es TRUE (expr1IM and 6H&>IM ) entonces #$ retorna expr2; de otro
modo retorna 6H&>. #$ retorna un valor numrico o cadena de carcteres, en funcin del
contexto en que se usa.
mysql> SELECT IF(1>2,2,3);
-> 3
  #expr1'6H&>$
Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 20 / 52

Si expr1 no es ,  #$ retorna expr1, de otro modo retorna 6H&>.  #$
retorna un valor numrico o de cadena de carcteres, en funcin del contexto en que se usa.
mysql> SELECT IFNULL(1,0);
-> 1
mysql> SELECT IFNULL(NULL,10);
-> 10
 #expr1'expr2$
Retorna  si 6H&>J6H&> es cierto, de otro modo retorna expr1. Es lo mismo que 

L0 6H&>J6H&>0  
expr1 .
mysql> SELECT NULLIF(1,1);
-> NULL
mysql> SELECT NULLIF(1,2);
-> 1

7.6 Funciones de comparacin de cadenas de caracteres


Las funciones de cadenas de carcteres retornan  si la longitud del resultado es mayor que el
valor de la variable de sistema =3H3447U6?&3AV69 .
Para funciones que operan en posiciones de cadenas de carcteres, la primera posicin es la 1.

#89>$
Retorna el valor numrico del carcter ms a la izquierda de la cadena de carcteres 89>.
Retorna 0 si str es la cadena vaca. Retorna  si 89> es .
#$ funciona para
carcteres con valores numricos de 0 a 255.
mysql> SELECT ASCII('2');
-> 50
   #str1'str2'((($
Retorna la cadena resultado de concatenar los argumentos. Retorna  si algna
argumento es . Puede tener uno o ms argumentos. Si todos los argumentos son cadenas
no binarias, el resultado es una cadena no binaria. Si los argumentos incluyen cualquier
cadena binaria, el resultado es una cadena binaria. Un argumento numrico se convierte a su
forma de cadena binaria equivalente; si quiere evitarlo puede usar conversin de tipos
explcita, como en este ejemplo:
  #
#:<9A74
0 $'AW3>A74$
mysql> SELECT CONCAT('My', 'S', 'QL');
-> 'MySQL'
mysql> SELECT CONCAT('My', NULL, 'QL');
-> NULL
mysql> SELECT CONCAT(14.3);
-> '14.3'
   L
#86&3>397>'89>'89>'((($
  L
#$ significa CONCAT With Separator (CONCAT con separador) y es una forma
especial de   #$. El primer argumento es el separador para el resto de argumentos. El
separador se aade entre las cadenas a concatenar. El separador puede ser una cadena como
el resto de argumentos. Si el separador es , el resultado es . La funcin evita
valores  tras el argumento separador.
mysql> SELECT CONCAT_WS(',','First name','Second name','Last Name');
-> 'First name,Second name,Last Name'
mysql> SELECT CONCAT_WS(',','First name',NULL,'Last Name');
-> 'First name,Last Name'
En MySQL 5.0,   L
#$ no evita cadenas vacas. (Sin embargo, evita s.)
 
#89>'substr$

Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL




Pagina 21 / 52

Retorna la posicin de la primera ocurrencia de la subcadena substr en la cadena str. Es lo


mismo que la forma de dos argumentos de  #$, excepto que el orden de los argumentos
es inverso.
mysql> SELECT INSTR('foobarbar', 'bar');
-> 4
mysql> SELECT INSTR('xbar', 'foobar');
-> 0
Esta funcin puede trabajar con mltiples bytes. En MySQL 5.0, slo es sensible a
maysculas si uno de los argumentos es una cadena binaria.
 0#89>$
Retorna la longitud de la cadena 89>, medida en bytes.Un carcter multi-byte cuenta como
mltiples bytes. Esto significa que para cadenas que contengan cinco carcteres de dos bytes,
 0#$ retorna 10, mientras que 0  0#$ retorna 5.
mysql> SELECT LENGTH('text');
-> 4
* #89>'@>7=89>'9789>$
Retorna la cadena str con todas las ocurrencias de la cadena @>7=89> reemplazadas con la
cadena 9789>.
mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww');
-> 'WwWwWw.mysql.com'
Esta funcin trabaja con mltiples bytes.


 #str'pos$ ,

 #strpos$,

 #89>'&78'46<$ ,


 #89>poslen$
Las formas sin el arguemnto 46< retornan una subcadena de la cadena str comenzando en la
posicin &78. Las formas con el argumento 46< retornan una subcadena de longitud 46< a
partir de la cadena 89>, comenzando en la posicin pos.Las formas que usan  son
sintaxis SQL estndard. En MySQL 5.0, es posible usar valores negativos para pos. En este
caso, el inicio de la subcadena son &78 carcteres a partir del final de la cadena, en lugar del
principio. Un valor negativo puede usarse para &78 en cualquier de las formas de esta
funcin.
mysql> SELECT SUBSTRING('Quadratically',5);
-> 'ratically'
mysql> SELECT SUBSTRING('foobarbar' FROM 4);
-> 'barbar'
mysql> SELECT SUBSTRING('Quadratically',5,6);
-> 'ratica'
mysql> SELECT SUBSTRING('Sakila', -3);
-> 'ila'
mysql> SELECT SUBSTRING('Sakila', -5, 3);
-> 'aki'
mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2);
-> 'ki'
Esta funcin trabaja con mltiples bytes.
Tenga en cuenta que si usa un valor menor a 1 para len, el resultado siempre es una cadena
vaca.


#$ es sinnimo de

 #$.


  -#str'delim'A75<9$
Retorna la subcadena de la cadena 89> antes de A75<9 ocurrencias del delimitador ?64:=. Si
count es positivo, todo a la izquierda del delimitador final (contando desde la izquierda) se
retorna. Si A75<9 es negativo, todo a la derecha del delimitador final (contando desde la
derecha) se retorna.
mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2);
-> 'www.mysql'

Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 22 / 52

mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2);


-> 'mysql.com'
Esta funcin trabaja con mltiples bytes.
 #"X01  1  Y">6=89>%%89>$, #>6=89>%
89>$
Retorna la cadena 89> con todos los prefijos y/o sufijos >6=89> eliminados. Si ninguno de los
especificadores 0,   , o se da  , 0 se asumen. Si >6=89> es opcional y
no se especifica, los espacios se eliminan.
mysql> SELECT TRIM(' bar ');
-> 'bar'
mysql> SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');
-> 'barxxx'
mysql> SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');
-> 'bar'
mysql> SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');
-> 'barx'
Esta funcin trabaja con mltiples bytes.

7.7 Funciones de comparacin de cadenas de caracteres


MySQL convierte automticamente nmeros a cadenas segn es necesario y viceversa.
mysql> SELECT 1+'1';
-> 2
mysql> SELECT CONCAT(2,' test');
-> '2 test'
Si quiere convertir un nmero a cadena explcitamente, use la funcin 
#$ :
mysql> SELECT 38.8, CAST(38.8 AS CHAR);
-> 38.8, '38.8'
Si una funcin de cadenas da una cadena binaria como argumento, la cadena resultante tambin es
binaria. Un nmero convertido a cadena se trata como cadena binaria (esto es, es sensible a
maysculas en comparaciones). Esto afecta slo a comparaciones.
Normalmente, si una expresin en una comparacin de cadenas es sensible a maysculas, la
comparacin se realiza con sensibilidad a maysculas.
 exprOpat"
 *.escape-char.%
Coincidencia de patrones usando comparacin mediante expresiones regulares SQL. Retorna
1 () o 0 ( 
). Si 6H&> o pat es , el resultado es .
El patrn no puede ser una cadena literal. Por ejemplo, puede especificarse como expresin de
cadena o columna.
Con O puede usar los siguientes dos carcteres comodn en el patrn:
Carcter

Descricin

Coincidencia de cualquier nmero de carcteres, incluso cero carcteres

Coincide exactemente un carcter

mysql> SELECT 'David!' LIKE 'David_';


-> 1
mysql> SELECT 'David!' LIKE '%D%v%';
-> 1
 6H&> Opat"
 *.escape-char.%
Es lo mismo que #6H&>Opat"
 *.escape-char.%$.

Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 23 / 52

7.8 Operadores aritmticos


Los operadores aritmticos usuales estn disponibles. Tenga en cuenta que en el caso de , ), y +, el
resultado se calcula con precisin    (64-bit) si ambos argumentos son enteros. Si uno de los
argumentos es un entero sin signo, y los otros argumentos son tambin enteros, el resultado es un
entero sin signo.
 )
Suma:
mysql> SELECT 3+5;
-> 8
 
Resta:
mysql> SELECT 3-5;
-> -2
 
Menos unario. Cambia el signo del argumento.
mysql> SELECT - 2;
-> -2
Nota: Si este operador se usa con   , el valor de retorno es tambin   . Esto
significa que debe eliminar usar  con enteros que pueden ser iguales o menores a -2^63.
 +
Multiplicacin:
mysql> SELECT 3*5;
-> 15
mysql> SELECT 18014398509481984*18014398509481984.0;
-> 324518553658426726783156020576256.0
mysql> SELECT 18014398509481984*18014398509481984;
-> 0
El resultado de la ltima expresin es incorrecto ya que el resultado de la multiplicacin
entera excede el rango de 64-bit de clculos   .
 ,
Divisin:
mysql> SELECT 3/5;
-> 0.60
Divisin por cero produce un resultado :
mysql> SELECT 102/(1-1);
-> NULL
Una divisin se calcula con aritmtica    slo en un contexto donde el resultado se
convierte a entero.
 
Divisin entera. Similar a#$ pero funciona con valores   .
mysql> SELECT 5 DIV 2;
-> 2

7.9 Funciones matemticas


Todas las funciones matemticas retornan  en caso de error.
  #X$, #-$
Retorna el entero ms pequeo no menor a X.
mysql> SELECT CEILING(1.23);
-> 2
mysql> SELECT CEIL(-1.23);
-> -1
Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 24 / 52

Estas dos funciones son sinnimos. Tenga en cuenta que el valor retornado se convierte a
  .
#-$
Retorna el valor entero ms grande pero no mayor a -.
mysql> SELECT FLOOR(1.23);
-> 1
mysql> SELECT FLOOR(-1.23);
-> -2
Tenga en cuenta que el valor devuelto se convierte a   .
 #N'$ , P,  M
Operacin de mdulo. Retorna el resto de dividido por .
mysql> SELECT MOD(234, 10);
-> 4
mysql> SELECT 253 % 7;
-> 1
mysql> SELECT MOD(29,9);
-> 2
mysql> SELECT 29 MOD 9;
-> 2
Esta funcin puede usar valores   .
 #$ tambin funciona con valores con una parte fraccional y retorna el resto exacto tras la
divisin:
mysql> SELECT MOD(34.5,3);
-> 1.5
*L#X'$ , *L#-'Y$
Retorna el valor de X a la potencia de Y.
mysql> SELECT POW(2,2);
-> 4
mysql> SELECT POW(2,-2);
-> 0.25
 #$,  # $
Retorna un valor aleatorio en coma flotante del rango de 0 a 1.0. Si se especifica un
argumento entero , es usa como semilla, que produce una secuencia repetible.
mysql> SELECT RAND();
-> 0.9233482386203
mysql> SELECT RAND(20);
-> 0.15888261251047
mysql> SELECT RAND();
-> 0.63553050033332
mysql> SELECT RAND();
-> 0.70100469486881
mysql> SELECT RAND(20);
-> 0.15888261251047
Puede usar esta funcin para recibir registros de forma aleatoria como se muestra aqu:
mysql> SELECT * FROM tbl_name ORDER BY RAND();
  #$ combinado con  es til para seleccionar una muestra aleatoria de
una conjunto de registros:
mysql> SELECT * FROM table1, table2 WHERE a=b AND c<d
-> ORDER BY RAND() LIMIT 1000;
Tenga en cuenta que  #$ en una clusula L0 se re-evala cada vez que se ejecuta el
L0.
 #$ no pretende ser un generador de nmeros aleatorios perfecto, pero es una forma
rpida de generar nmeros aleatorios ad hoc portable entre plataformas para la misma
versin de MySQL.

Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 25 / 52

  #-$,  #-' $

Retorna el argumento -, redondeado al entero ms cercano. Con dos argumentos, retorna -


redondeado a D decimales. puede ser negativo para redondear D dgitos a la izquierda del
punto decimal del valor -.
mysql> SELECT ROUND(-1.23);
-> -1
mysql> SELECT ROUND(-1.58);
-> -2
mysql> SELECT ROUND(1.58);
-> 2
mysql> SELECT ROUND(1.298, 1);
-> 1.3
mysql> SELECT ROUND(1.298, 0);
-> 1
mysql> SELECT ROUND(23.298, -1);
-> 20
El tipo de retorno es el mismo tipo que el del primer argumento (asumiendo que sea un
entero, doble o decimal). Esto significa que para un argumento entero, el resultado es un
entero (sin decimales).

7.10 Funciones de fecha y hora


Esta seccin describe las funciones que pueden usarse para manipular valores temporales.
Aqu hay un ejemplo que usa funciones de fecha. La siguiente consulta selecciona todos los registros
con un valor ?396A74 dentro de los ltimos 30 das:
mysql> SELECT 87=69W:<F FROM 9D4<3=6
-> WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= ?396A74;
Tenga en cuenta que la consulta tambin selecciona registros con fechas futuras.
Las funciones que esperan valores de fecha usualmente aceptan valores de fecha y hora e ignoran la
parte de hora. Las funciones que esperan valores de hora usualmente aceptan valores de fecha y hora
e ignoran la parte de fecha.
Las funciones que retornan la fecha u hora actuales se evalan slo una vez por consulta al principio
de la ejecucin de consulta. Esto significa que las referencias mltiples a una funcin tales como
L#$ en una misma consulta siempre producen el mismo resultado. Este principio tambin se aplica
a  #$, #$,  #$, #$, 
 *#$, y a cualquiera de sus
sinnimos.
 #6H&>$

Extrae la parte de fecha de la expresin de fecha o fecha y hora 6H&>.


mysql> SELECT DATE('2003-12-31 01:02:03');
-> '2003-12-31'
  #expr'expr2$
 #$ retorna el nmero de das entre la fecha inicial 6H&> y la fecha final expr2. 6H&>
y expr2 son expresiones de fecha o de fecha y hora. Slo las partes de fecha de los valores se
usan en los clculos.
mysql> SELECT DATEDIFF('1997-12-31 23:59:59','1997-12-30');
-> 1
mysql> SELECT DATEDIFF('1997-11-30 23:59:59','1997-12-31');
Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 26 / 52

-> -31
  #?396'  expr9;&6$, 
#date'  expr9;&6$

Estas funciones realizan operaciones aritmticas de fechas. ?396 es un valor  o


 especificando la fecha de inicio. expr es una expresin que especifica el intervalo a
aadir o borrar de la fecha de inicio. expr es una cadena; puede comenzar con un '' para
intervalos negativos. type es una palabra clave que indica cmo debe interpretarse la
expresin.
La palabra clave    y el especificador 9;&6 no son sensibles a maysculas.
La siguiente tabla muestra cmo se relacionan los argumentos type y 6H&> :
9;&6 Value

Expected 6H&> Format











 

 

0

0

LO

LO

 0

 0

 

 

 

 

 
 .

(

.
 
 . 
(

.
 


. 
/

.

0


.0
(

.

0


.0
/ 
/

.

0 

.0
/ 
.




. 
(

.




. 
0
/ 
/

.

 

. 
0
/ 
.

0

. 
0
.

  0

. 
 0
.

  #?396'@7>=39$

Formatea el valor ?396 segn la cadena @7>=39 . Los siguientes especificadores pueden
usarse en la cadena @7>=39 :
Especificador Descripcin
P3

Da de semana abreviado (
5<..
39)

PD

Mes abreviado (Z3<.. 6A)

PA

Mes, numrico (..)

Da del mes con sufijo ingls (9W, 89, <?, >?, ...)

P?

Da del mes numrico (..)

P6

Da del mes numrico (..)

P@

Microsegundos (..!!!!!!)

Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 27 / 52

P0

Hora (..)

PW

Hora (..)

P

Hora (..)

P:

Minutos, numrico (..!)

P[

Da del ao (..)

PV

Hora (..)

P4

Hora (..)

P

Nombre mes (Z3<53>;.. 6A6=D6>)

P=

Mes, numrico (..)

P&

 o *

P>

Hora, 12 horas (WW/==/88 seguido de  o *)

Segundos (..!)

P8

Segundos (..!)

P

Hora, 24 horas (WW/==/88)

P

Semana (..), donde domingo es el primer da de la semana

P5

Semana (..), donde lunes es el primer da de la semana

P

Semana (..), donde domingo es el primer da de la semana; usado con


P-

P2

Semana (..), donde lunes es el primer da de la semana; usado con PH

PL

Nombre da semana (
5<?3;..
395>?3;)

PU

Da de la semana (=Sunday..=Saturday)

P-

Ao para la semana donde domingo es el primer da de la semana,


numrico, cuatro dgitos; usado con P

PH

Ao para la semana, donde lunes es el primer da de la semana, numrico,


cuatro dgitos; usado con P2

P

Ao, numrico, cuatro dgitos

P;

Ao, numrico (dos dgitos)

PP

Carcter 'P' literal

Todos los otros carcteres se copian al resultado sin interpretacin.


Tenga en cuenta que el carcter 'P' se necesita antes de carcteres especificadores de formato.
Los rangos para los especificadores de mes y da comienzan en cero debido a que MySQL
permite almacenar fechas incompletas tales como . ..
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');
-> 'Saturday October 1997'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');
-> '22:23:00'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',
'%D %y %a %d %m %b %j');
-> '4th 97 Sat 04 10 Oct 277'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',
'%H %k %I %r %T %S %w');
-> '22 22 10 10:23:00 PM 22:23:00 00 6'
mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V');
Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 28 / 52

-> '1998 52'


 
 #?396$

Toma una fecha o fecha/hora y retorna el valor correspondiente para el ltimo da del mes.
Retorna  si el argumento es invlido.
mysql> SELECT LAST_DAY('2003-02-05');
-> '2003-02-28'
mysql> SELECT LAST_DAY('2004-02-05');
-> '2004-02-29'
mysql> SELECT LAST_DAY('2004-01-01 01:01:01');
-> '2004-01-31'
mysql> SELECT LAST_DAY('2003-03-32');
-> NULL
 L#$
Retorna la fecha y hora actual como valor en formato . 00//

. o
 00

, dependiendo de si la funcin se usa en contexto numrico o de cadena de


carcteres.
mysql> SELECT NOW();
-> '1997-12-15 23:50:26'
mysql> SELECT NOW() + 0;
-> 19971215235026

 #str'@7>=39$
Esta es la inversa de la funcin  #$. Toma la cadena str y la cadena de formato
@7>=39.
 #$ retorna un valor  si la cadena de formato contiene parte
de fecha y hora, o un valor  o  si la cadena contiene slo parte de fecha o hora.
Los valores fecha, hora o fecha/hora contenidos en str deben ser dados en el formato indicado
por format. Para los especificadores que pueden usarse en @7>=39, consulte la tabla en la
descripcin de la funcin  #$ . Todos los otros carcteres no se interpretan. Si
str contiene un valor fecha, hora o fecha/hora ilegal,
 #$ retorna . A partir
de MySQL 5.0.3, un valor ilegal tambin produce una advertencia.
mysql> SELECT STR_TO_DATE('03.10.2003 09.20','%d.%m.%Y %H.%i');
-> '2003-10-03 09:20:00'
mysql> SELECT STR_TO_DATE('10arp', '%carp');
-> '0000-10-00 00:00:00'
mysql> SELECT STR_TO_DATE('2003-15-10 00:00:00','%Y-%m-%d %H:%i:%s');
-> NULL

7.11 Funciones de encriptacin


Las funciones en esta seccin encriptan y desencriptan valores. Si quiere almacenar resultados de
una funcin de encriptacin que puede contaner valores arbitrarios de bytes, use una columna 
en lugar de 0  o  0  para evitar problemas potenciales con eliminacin de espacios finales
que pueden cambiar los valores de datos.
  #crypt_str'&38889>$
Desencripta la cadena encriptada A>;&989> usando pass_str como contrasea. A>;&989>
debe ser una cadena retornada de   #$.
   #89>'&38889>$
Encripta 89> usando pass_str como contrasea. Para desencriptar el resultado, use
 #$.
El resultado es una cadena binaria de la misma longitud que str. Si quiere guardarlo en una
columna, use una columna de tipo  .

Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 29 / 52

7.12 Funciones de informacin


   #str$

Retorna la colacin para el conjunto de carcteres de la cadena dada.


mysql> SELECT COLLATION('abc');
-> 'latin1_swedish_ci'
  
#$
Retorna la combinacin de nombre de usuario y de equipo que tiene la sesin actual.
  
#$
Retorna el nombre de base de datos por defecto (actual). En MySQL 5.0, la cadena tiene el
conjunto de carcteres 59@ .
 

 #$, 

 #6H&>$
Retorna el ltimo valor generado automticamente que se insert en una columna
  .
mysql> SELECT LAST_INSERT_ID();
-> 195
El ltimo ID generado se mantiene en el servidor para cada conexin. Esto significa que el
valor de la funcin retorna a cada cliente el valor    ms reciente generado
por ese cliente. Este valor no puede ser afectado por otros clientes, incluso si generan valores
   ellos mismos. Este comportamiento asegura que reciba sus propios IDs sin
tener en cuenta la actividad de otros clientes y sin la necesidad de bloqueos o transacciones.
El valor de 

 #$ no cambia si actualiza la columna    de un
registro con un valor no mgico (esto es, un valor que no es  ni ).
Si inserta varios registros a la vez con un comando de insercin 

 #$ retorna
el valor del primer registro insertado. La razn para esto es hacer posible reproducir
fcilmente el mismo comando 
 contra otro servidor.
 L #$

L #$ retorna el nmero de registros actualizados, insertados o borrados por el


comando precedente. Esto es lo mismo que el nmero de registros que muestra el cliente
mysql y el valor de la funcin de la API C =;8S43@@6A96?>7U8#$ .
mysql> INSERT INTO t VALUES(1),(2),(3);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> SELECT ROW_COUNT();
+-------------+
| ROW_COUNT() |
+-------------+
|
3|
+-------------+
1 row in set (0.00 sec)
 
 #$

Retorna una cadena que indica la versin del servidor MySQL. La cadena usa el conjunto de
carcteres 59@ .

Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 30 / 52

8 
   
8.1 


78&>7A6?:=:6<97887<AB?:F78S56866[6A593<?:>6A93=6<966<6486>2:?7>(
<&>7A6?:=:6<9786:<27A3583<?75<A7=3<?7 ';8B47&56?6&383>2347>68
583<?723>:3D468?6834:?3(<3@5<A:B<&56?6443=3>86?68?6?68?6?6<9>7?6
5<A7=3<?7A7=7A534S5:6>79>3@5<A:B<#689768':<27A3<?764<7=D>6?643
@5<A:B<$';&56?6>697><3>5<2347>68A343>(38>59:<3834=3A6<3?38&56?6<
443=3>79>38>59:<3834=3A6<3?38(

8.2 
 
   
   


CREATE PROCEDURE sp_name ([&3>3=696>[,...]])
[AW3>3A96>:89:A ...] routine_body
CREATE FUNCTION 8&<3=6 ([&3>3=696>[,...]])
RETURNS type
[characteristic ...] >759:<6D7?;
&3>3=696>:
[ IN | OUT | INOUT ] param_name type
type:
Any valid MySQL data type
characteristic:
LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT '89>:<F'
>759:<6D7?;:
&>7A6?:=:6<97834=3A6<3?787A7=3<?78
2G4:?78
Estos comandos crean una rutina almacenada.
Por defecto, la rutina se asocia con la base de datos actual.
Para asociar la rutina explcitamente con una base de datos, especifique el nombre como
?D<3=6(8&<3=6 al crearlo.
Si el nombre de rutina es el mismo que el nombre de una funcin de SQL, necesita usar un espacio
entre el nombre y el siguiente parntesis al definir la rutina, o hay un error de sintaxis. Esto tambin
es cierto cuando invoca la rutina posteriormente.
La clusula 
puede especificarse slo con   , donde es obligatorio. Se usa para
indicar el tipo de retorno de la funcin, y el cuerpo de la funcin debe contener un comando  
23456.
Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 31 / 52

La lista de parmetros entre parntesis debe estar siempre presente. Si no hay parmetros, se debe
usar una lista de parmetros vaca #$ .
Cada parmetro es un parmetro  por defecto. Para especificar otro tipo de parmetro, use la
palabra clave  o   antes del nombre del parmetro. Especificando  , , o   slo es
valido para una * .
Un marco para procedimientos almacenados externos se introducir en el futuro. Esto permitira
escribir procedimientos almacenados en lenguajes distintos a SQL. Uno de los primeros lenguajes a
soportar ser PHP ya que el motor central de PHP es pequeo, con flujos seguros y puede empotrarse
fcilmente. Como el marco es pblico, se espera soportar muchos otros lenguajes.
Un procedimiento o funcin se considera "determinista" si siempre produce el mismo resultado para
los mismos parmetros de entrada, y "no determinista" en cualquier otro caso. Si no se da ni
 
 ni   
 por defecto es   
.
Varias caractersticas proporcionan informacin sobre la naturaleza de los datos usados por la rutina.
  

 indica que la rutina no contiene comandos que leen o escriben datos. 
 indica
que la rutina no contiene comandos SQL . 

  indica que la rutina contiene comandos
que leen datos, pero no comandos que escriben datos.  

  indica que la rutina
contiene comandos que pueden escribir datos.   

 es el valor por defecto si no se dan
explcitamente ninguna de estas caractersticas.
La caracterstica

 puede usarse para especificar si la rutina debe ser ejecutada usando
los permisos del usuario que crea la rutina o el usuario que la invoca. El valor por defecto es
 . Esta caracterstica es nueva en SQL:2003. El creador o el invocador deben tener permisos
para acceder a la base de datos con la que la rutina est asociada.
MySQL almacena la variable de sistema 8S4=7?6 que est en efecto cuando se crea la rutina, y
siempre ejecuta la rutina con esta inicializacin.
La clusula   es una extensin de MySQL, y puede usarse para describir el procedimiento
almacenado. Esta informacin se muestra con los comandos
0L *  y
0L
   .
MySQL permite a las rutinas que contengan comandos DDL (tales como   y *) y comandos
de transaccin SQL (como ). Esto no lo requiere el estndar, y por lo tanto, es especfico de la
implementacin.
Los procedimientos almacenados no pueden usar     .
Nota: Actualmente, los procedimientos almacenados creados con    no pueden tener
referencias a tablas. (Esto puede incluir algunos comandos
 que pueden contener referencias a
tablas, por ejemplo
3/J#
 -#:?$9$, y por otra parte no pueden contener
comandos
 , por ejemplo
.06447U7>4?N. 23>.) Esta limitacin se
elminar en breve.
Los comandos que retornan un conjunto de resultados no pueden usarse desde una funcin
almacenada. Esto incluye comandos
 que no usan   para tratar valores de columnas en
variables, comandos
0L y otros comandos como -*  . Para comandos que pueden determinarse
al definir la funcin para que retornen un conjunto de resultados, aparece un mensaje de error 79
3447U6?97>695><3>68549869@>7=3@5<A9:7< (
* 
  ). Para
comandos que puede determinarse slo en tiempo de ejecucin si retornan un conjunto de resultados,
Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 32 / 52

aparece el error * P8A3<.9>695><3>68549869:<9W6F:26<A7<96H9


(
*
).
El siguiente es un ejemplo de un procedimiento almacenado que use un parmetro  . El ejemplo
usa el cliente mysql y el comando ?64:=:96> para cambiar el delimitador del comando de T a ,,
mientras se define el procedimiento . Esto permite pasar el delimitador T usado en el cuerpo del
procedimiento a travs del servidor en lugar de ser interpretado por el mismo mysql.
mysql> delimiter //
mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)
-> BEGIN
-> SELECT COUNT(*) INTO param1 FROM t;
-> END
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> CALL simpleproc(@a);
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @a;
+------+
| @a |
+------+
|3 |
+------+
1 row in set (0.00 sec)
Al usar el comando ?64:=:96>, debe evitar el uso de la antibarra ('\') ya que es el carcter de escape
de MySQL.
El siguiente es un ejemplo de funcin que toma un parmetro, realiza una operacin con una funcin
SQL, y retorna el resultado:
mysql> delimiter //
mysql> CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50)
-> RETURN CONCAT('Hello, ',s,'!');
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> SELECT hello('world');
+----------------+
| hello('world') |
+----------------+
| Hello, world! |
+----------------+
1 row in set (0.00 sec)
Si el comando  en un procedimiento almacenado retorna un valor con un tipo distinto al
especificado en la clusula 
de la funcin, el valor de retorno se coherciona al tipo apropiado.
Por ejemplo, si una funcin retorna un valor   o
, pero el comando  retorna un entero,
el valor retornado por la funcin es la cadena para el mienbro de   correspondiente de un
comjunto de miembros
 .
Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 33 / 52

8.3 La sentencia 


CALL 8&<3=6([&3>3=696>[,...]])
El comando   invoca un procedimiento definido prviamente con  * .
  puede pasar valores al llamador usando parmetros declarados como  o   . Tambin
"retorna" el nmero de registros afectados, que con un programa cliente puede obtenerse a nivel SQL
llamando la funcin L #$ y desde C llamando la funcin de la API C
=;8S43@@6A96?>7U8#$ .

8.4 Sentencia compuesta 


[begin_label:] BEGIN
[statement_list]
END [6<?43D64]
Los procedimientos almacenados pueden contener varios comandos, usnado un comando compuesto
  ((( .
Un comando compuesto puede etiquetarse. end_label no puede darse a no ser que tambin est
presente begin_label , y si ambos lo estn, deben ser el mismo.
Tenga en cuenta que la clusula opcional " %  no est soportada. Esto significa que no hay
un punto transaccional al inicio del bloque de instrucciones y la clusula   usada en este
contexto no tiene efecto en la transaccin actual.
Usar mltiples comandos requiere que el cliente sea capaz de enviar cadenas de consultas con el
delimitador de comando T. Esto se trata en el cliente de lnea de comandos mysql con el comando
?64:=:96>. Cambiar el delimitador de final de consulta T end-of-query (por ejemplo, a ,,) permite
usar T en el cuerpo de la rutina.

8.5 Sentencia 


El comando   se usa para definir varios iconos locales de una rutina: las variables locales,
condiciones y handlers y cursores. Los comandos
  y 
  no se soportan en la
actualidad.
  puede usarse slo dentro de comandos compuestos   ((( y deben ser su inicio,
antes de cualquier otro comando.
Los cursores deben declararse antes de declarar los handlers, y las variables y condiciones deben
declararse antes de declarar los cursores o handlers.

8.6 
 ! 

8.6.1 Declarar variables locales con 
DECLARE 23><3=6[,...] type [DEFAULT value]
Este comando se usa para declarar variables locales. Para proporcionar un valor por defecto para la
variable, incluya una clusula   . El valor puede especificarse como expresin, no necesita ser
una constante. Si la clusula   no est presente, el valor inicial es .

Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 34 / 52

La visibilidad de una variable local es dentro del bloque   ((( donde est declarado.
Puede usarse en bloques anidados excepto aqullos que declaren una variable con el mismo nombre.

8.6.2 Sentencia  para variables


SET var_name = expr [, 23><3=6 = expr] ...
El comando
 en procedimientos almacenados es una versin extendida del comando general
.
Las variables referenciadas pueden ser las declaradas dentro de una rutina, o variables de servidor
globales.
El comando
 en procedimientos almacenados se implementa como parte de la sintaxis
 preexistente. Esto permite una sintaxis extendida de
3JH'DJ;'((( donde distintos tipos de
variables (variables declaradas local y globalmente y variables de sesin del servidor) pueden
mezclarse. Esto permite combinaciones de variables locales y algunas opciones que tienen sentido
slo para variables de sistema; en tal caso, las opciones se reconocen pero se ignoran.

8.6.3 La sentencia 


SELECT A74<3=6[,...] INTO var_name[,...] 93D466H&>
Esta sintaxis
 almacena columnas seleccionadas directamente en variables. Por lo tanto, slo
un registro puede retornarse.
SELECT id,data INTO x,y FROM test.t1 LIMIT 1;

8.6.4 Conditions and Handlers


Ciertas condiciones pueden requerir un tratamiento especfico. Estas condiciones pueden estar
relacionadas con errores, as como control de flujo general dentro de una rutina.

8.6.5 Condiciones 


DECLARE A7<?:9:7<<3=6 CONDITION FOR condition_value
condition_value:
SQLSTATE [VALUE] sqlstate_value
| =;8S46>>7>A7?6
Este comando especifica condiciones que necesitan tratamiento especfico. Asocia un nombre con una
condicin de error especfica. El nombre puede usarse subsecuentemente en un comando  
0  .
Adems de valores SQLSTATE , los cdigos de error MySQL se soportan.

8.6.6 

handlers

DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement
handler_type:
CONTINUE
| EXIT
| UNDO
Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 35 / 52

condition_value:
SQLSTATE [VALUE] 8S48939623456
| A7<?:9:7<<3=6
| SQLWARNING
| NOT FOUND
| SQLEXCEPTION
| mysql_error_code
Este comando especifica handlers que pueden tratar una o varias condiciones. Si una de estas
condiciones ocurren, el comando especificado se ejecuta.
Para un handler    , contina la rutina actual tras la ejecucin del comando del handler.
Para un handler - , termina la ejecucin del comando compuesto   ((( actual. El
handler de tipo   todava no se soporta.

L   es una abreviacin para todos los cdigos SQLSTATE que comienzan con .
  es una abreviacin para todos los cdigos SQLSTATE que comienzan con .

-* es una abreviacin para todos los cdigos SQLSTATE no tratados por

L   o  .
Adems de los valores SQLSTATE , los cdigos de error MySQL se soportan.
Por ejemplo:
mysql> CREATE TABLE test.t (s1 int,primary key (s1));
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter //
mysql> CREATE PROCEDURE handlerdemo ()
-> BEGIN
-> DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1;
-> SET @x = 1;
-> INSERT INTO test.t VALUES (1);
-> SET @x = 2;
-> INSERT INTO test.t VALUES (1);
-> SET @x = 3;
-> END;
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> CALL handlerdemo()//
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @x//
+------+
| @x |
+------+
|3 |
+------+
1 row in set (0.00 sec)
Tenga en cuenta que ]H es , lo que muestra que MySQL se ha ejecutado al final del procedimiento.
Si la lnea    0 

 ..
]HJT no est
presente, MySQL habra tomado la ruta por defecto (-) tras el segundo 
 fallido debido a la
restriccin * O , y
]H habra retornado .
Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 36 / 52

8.7 Cursores
Se soportan cursores simples dentro de procedimientos y funciones almacenadas. La sintaxis es la de
SQL empotrado. Los cursores no son sensibles, son de slo lectura, y no permiten scrolling. No
sensible significa que el servidor puede o no hacer una copia de su tabla de resultados.
Los cursores deben declararse antes de declarar los handlers, y las variables y condiciones deben
declararse antes de declarar cursores o handlers.
Por ejemplo:
CREATE PROCEDURE curdemo()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE a CHAR(16);
DECLARE b,c INT;
DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;
DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN cur1;
OPEN cur2;
REPEAT
FETCH cur1 INTO a, b;
FETCH cur2 INTO c;
IF NOT done THEN
IF b < c THEN
INSERT INTO test.t3 VALUES (a,b);
ELSE
INSERT INTO test.t3 VALUES (a,c);
END IF;
END IF;
UNTIL done END REPEAT;
CLOSE cur1;
CLOSE cur2;
END

8.7.1 Declarar cursores


DECLARE A5>87><3=6 CURSOR FOR 8646A989396=6<9
Este comando declara un cursor. Pueden definirse varios cursores en una rutina, pero cada cursor en
un bloque debe tener un nombre nico.
El comando
 no puede tener una clusula   .

8.7.2 Sentencia  del cursor


OPEN A5>87><3=6
Este comando abre un cursor declarado prviamente.

Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 37 / 52

8.7.3 Sentencia de cursor 


FETCH cursor_name INTO 23><3=6 [, 23><3=6] ...
Este comando trata el siguiente registro (si existe) usando el cursor abierto especificado, y avanza el
puntero del cursro.

8.7.4 Sentencia de cursor 


CLOSE A5>87><3=6
Este comando cierra un cursor abierto prviamente.
Si no se cierra explcitamente, un cursor se cierra al final del comando compuesto en que se declara.

8.8 Constructores de control de flujo


Los constructores , 
, *, L0,  , y   estn completamente implementados.
Estos constructores pueden contener un comando simple, o un bloque de comandos usando el
comando compuesto   ((( . Los constructores pueden estar anidados.
Los bucles  no estn soportados.

8.8.1 Sentencia 
IF search_condition THEN 89396=6<94:89
[ELSEIF 863>AWA7<?:9:7< THEN statement_list] ...
[ELSE statement_list]
END IF
 implementa un constructor condicional bsico. Si search_condition se evala a cierto, el comando
SQL correspondiente listado se ejectua. Si no coincide ninguna search_condition se ejecuta el
comando listado en la clusula 
. 89396=6<94:89 puede consistir en varios comandos.
Tenga en cuenta que tambin hay una funcin #$, que difiere del commando  descrito aqu.

8.8.2 La sentencia 


CASE case_value
WHEN UW6<23456 THEN statement_list
[WHEN when_value THEN 89396=6<94:89] ...
[ELSE statement_list]
END CASE
O:
CASE
WHEN 863>AWA7<?:9:7< THEN 89396=6<94:89
[WHEN search_condition THEN 89396=6<94:89] ...
[ELSE 89396=6<94:89]
END CASE
El comando 
 para procedimientos almacenados implementa un constructor condicional complejo.
Si una 863>AWA7<?:9:7< se evala a cierto, el comando SQL correspondiente se ejecuta. Si no
coincide ninguna condicin de bsqueda, el comando en la clusula 
 se ejecuta.
Nota: La sitaxis de un comando 
 mostrado aqu para uso dentro de procedimientos almacenados
difiere ligeramente de la expresin 
 SQL descrita en la Seccin "Funciones de control de flujo".
El comando 
 no puede tener una clusula 
  y termina con  
 en lugar de  .
Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 38 / 52

8.8.3 Sentencia 


[D6F:<43D64:] LOOP
statement_list
END LOOP [6<?43D64]
* implementa un constructor de bucle simple que permite ejecucin repetida de comandos
particulares. El comando dentro del bucle se repite hasta que acaba el bucle, usualmente con un
comando   .
Un comando * puede etiquetarse. 6<?43D64 no puede darse hasta que est presente begin_label
, y si ambos lo estn, deben ser el mismo.

8.8.4 Sentencia  


LEAVE label
Este comando se usa para abandonar cualquier control de flujo etiquetado. Puede usarse con
  ((( o bucles.

8.8.5 La setencia 


ITERATE label
  slo puede aparecer en comandos *, * , y L0 .   significa "vuelve a
hacer el bucle."
Por ejemplo:
CREATE PROCEDURE doiterate(p1 INT)
BEGIN
label1: LOOP
SET p1 = p1 + 1;
IF p1 < 10 THEN ITERATE label1; END IF;
LEAVE label1;
END LOOP label1;
SET @x = p1;
END

8.8.6 Sentencia 


[begin_label:] REPEAT
statement_list
UNTIL 863>AWA7<?:9:7<
END REPEAT [6<?43D64]
El comando/s dentro de un comando *  se repite hasta que la condicin 863>AWA7<?:9:7< es
cierta.
Un comando *  puede etiquetarse. 6<?43D64 no puede darse a no ser que begin_label est
presente, y si lo estn, deben ser el mismo.
Por ejemplo:
mysql> delimiter //

Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 39 / 52

mysql> CREATE PROCEDURE dorepeat(p1 INT)


-> BEGIN
-> SET @x = 0;
-> REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
-> END
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> CALL dorepeat(1000)//
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @x//
+------+
| @x |
+------+
| 1001 |
+------+
1 row in set (0.00 sec)

8.8.7 Sentencia !


[D6F:<43D64:] WHILE 863>AWA7<?:9:7< DO
statement_list
END WHILE [end_label]
El comado/s dentro de un comando L0 se repite mientras la condicin 863>AWA7<?:9:7< es
cierta.
Un comando L0 puede etiquetarse. 6<?43D64 no puede darse a no ser que begin_label tambin
est presente, y si lo estn, deben ser el mismo.
Por ejemplo:
CREATE PROCEDURE dowhile()
BEGIN
DECLARE v1 INT DEFAULT 5;
WHILE v1 > 0 DO
...
SET v1 = v1 - 1;
END WHILE;
END

Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 40 / 52

9 Disparadores
Un disparador es un objeto con nombre dentro de una base de datos el cual se asocia con una tabla y
se activa cuando ocurre en sta un evento en particular. Por ejemplo, las siguientes sentencias crean
una tabla y un disparador para sentencias 
 dentro de la tabla. El disparador suma los valores
insertados en una de las columnas de la tabla:
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
-> FOR EACH ROW SET @sum = @sum + NEW.amount;
Este captulo describe la sintaxis para crear y eliminar disparadores, y muestra algunos ejemplos de
cmo utilizarlos.

9.1 Sintaxis de   


CREATE TRIGGER <7=D>6?:8& momento_disp 626<97?:8&
ON nombre_tabla FOR EACH ROW sentencia_disp
Un disparador es un objeto con nombre en una base de datos que se asocia con una tabla, y se activa
cuando ocurre un evento en particular para esa tabla.
El disparador queda asociado a la tabla <7=D>693D43. Esta debe ser una tabla permanente, no
puede ser una tabla *  ni una vista.
=7=6<97?:8& es el momento en que el disparador entra en accin. Puede ser  (antes) o
 (despues), para indicar que el disparador se ejecute antes o despus que la sentencia que lo
activa.
626<97?:8& indica la clase de sentencia que activa al disparador. Puede ser 
, * , o
. Por ejemplo, un disparador  para sentencias 
 podra utilizarse para validar
los valores a insertar.
No puede haber dos disparadores en una misma tabla que correspondan al mismo momento y
sentencia. Por ejemplo, no se pueden tener dos disparadores * . Pero s es posible
tener los disparadores *  y 
 o *  y * .
sentencia_disp es la sentencia que se ejecuta cuando se activa el disparador. Si se desean ejecutar
mltiples sentencias, deben colocarse entre   ((( , el constructor de sentencias
compuestas.
Esto adems posibilita emplear las mismas sentencias permitidas en rutinas almacenadas.
Las columnas de la tabla asociada con el disparador pueden referenciarse empleando los alias  y
L.  (<7=D>6A74 hace referencia a una columna de una fila existente, antes de ser actualizada
o borrada. L(<7=D>6A74 hace referencia a una columna en una nueva fila a punto de ser
insertada, o en una fila existente luego de que fue actualizada.
El uso de
 L(nombre_colJ2347> necesita que se tenga el privilegio *  sobre la
columna. El uso de
<7=D>623>J L(<7=D>6A74 necesita el privilegio
 sobre la
columna.

Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 41 / 52

Nota: Actualmente, los disparadores no son activados por acciones llevadas a cabo en cascada por las
restricciones de claves extranjeras. Esta limitacin se subsanar tan pronto como sea posible.

9.2 Sintaxis de 
 
DROP TRIGGER [nombre_esquema.]<7=D>6?:8&
Elimina un disparador. El nombre de esquema es opcional. Si el esquema se omite, el disparador se
elimina en el esquema actual.

9.3 Utilizacin de disparadores


El soporte para disparadores se incluy a partir de MySQL 5.0.2. Actualmente, el soporte para
disparadores es bsico, por lo tanto hay ciertas limitaciones en lo que puede hacerse con ellos. Esta
seccin trata sobre el uso de los disparadores y las limitaciones vigentes.
Un disparador es un objeto de base de datos con nombre que se asocia a una tabla, y se activa cuando
ocurre un evento en particular para la tabla. Algunos usos para los disparadores es verificar valores
a ser insertados o llevar a cabo clculos sobre valores involucrados en una actualizacin.
Un disparador se asocia con una tabla y se define para que se active al ocurrir una sentencia

, , o *  sobre dicha tabla. Puede tambin establecerse que se active antes o
despues de la sentencia en cuestin. Por ejemplo, se puede tener un disparador que se active antes de
que un registro sea borrado, o despus de que sea actualizado.
Este es un ejemplo sencillo que asocia un disparador con una tabla para cuando reciba sentencias

. Acta como un acumulador que suma los valores insertados en una de las columnas de la
tabla.
La siguiente sentencia crea la tabla y un disparador asociado a ella:
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
-> FOR EACH ROW SET @sum = @sum + NEW.amount;
La sentencia    crea un disparador llamado :<885= que se asocia con la tabla
3AA75<9. Tambin se incluyen clusulas que especifican el momento de activacin, el evento
activador, y qu hacer luego de la activacin:
 La palabra clave  indica el momento de accin del disparador. En este caso, el
disparador debera activarse antes de que cada registro se inserte en la tabla. La otra palabra
clave posible aqui es .
 La plabra clave 
 indica el evento que activar al disparador. En el ejemplo, la
sentencia 
 causar la activacin. Tambin pueden crearse disparadores para
sentencias  y * .
 Las sentencia siguiente,  0L, define lo que se ejecutar cada vez que el
disparador se active, lo cual ocurre una vez por cada fila afectada por la sentencia activadora.
En el ejemplo, la sentencia activada es un sencillo
 que acumula los valores insertados en
la columna 3=75<9. La sentencia se refiere a la columna como L(3=75<9, lo que significa
"el valor de la columna 3=75<9 que ser insertado en el nuevo registro."
Para utilizar el disparador, se debe establecer el valor de la variable acumulador a cero, ejecutar una
sentencia 
, y ver qu valor presenta luego la variable.

Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 42 / 52

mysql> SET @sum = 0;


mysql> INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00);
mysql> SELECT @sum AS 'Total amount inserted';
+-----------------------+
| Total amount inserted |
+-----------------------+
| 1852.48
|
+-----------------------+
En este caso, el valor de ]85= luego de haber ejecutado la sentencia 
 es  (!)!(
, o ( .
Para eliminar el disparador, se emplea una sentencia * . El nombre del disparador
debe incluir el nombre de la tabla:
mysql> DROP TRIGGER account.ins_sum;
Debido a que un disparador est asociado con una tabla en particular, no se pueden tener mltiples
disparadores con el mismo nombre dentro de una tabla. Tambin se debera tener en cuenta que el
espacio de nombres de los disparadores puede cambiar en el futuro de un nivel de tabla a un nivel de
base de datos, es decir, los nombres de disparadores ya no slo deberan ser nicos para cada tabla
sino para toda la base de datos. Para una mejor compatibilidad con desarrollos futuros, se debe
intentar emplear nombres de disparadores que no se repitan dentro de la base de datos.
Adicionalmente al requisito de nombres nicos de disparador en cada tabla, hay otras limitaciones en
los tipos de disparadores que pueden crearse. En particular, no se pueden tener dos disparadores
para una misma tabla que sean activados en el mismo momento y por el mismo evento. Por ejemplo,
no se pueden definir dos 
 o dos *  en una misma tabla. Es improbable
que esta sea una gran limitacin, porque es posible definir un disparador que ejecute mltiples
sentencias empleando el constructor de sentencias compuestas   ((( luego de  0
L. (Ms adelante en esta seccin puede verse un ejemplo).
Tambin hay limitaciones sobre lo que puede aparecer dentro de la sentencia que el disparador
ejecutar al activarse:
 El disparador no puede referirse a tablas directamente por su nombre, incluyendo la misma
tabla a la que est asociado. Sin embargo, se pueden emplear las palabras clave  y L.
 se refiere a un registro existente que va a borrarse o que va a actualizarse antes de que
esto ocurra. L se refiere a un registro nuevo que se insertar o a un registro modificado
luego de que ocurre la modificacin.
 El disparador no puede invocar procedimientos almacenados utilizando la sentencia  .
(Esto significa, por ejemplo, que no se puede utilizar un procedimiento almacenado para
eludir la prohibicin de referirse a tablas por su nombre).
 El disparador no puede utilizar sentencias que inicien o finalicen una transaccin, tal como

 
 , , o  O.
Las palabras clave  y L permiten acceder a columnas en los registros afectados por un
disparador. ( y L no son sensibles a maysculas). En un disparador para 
, solamente
puede utilizarse L(<7=A74; ya que no hay una versin anterior del registro. En un disparador
para  slo puede emplearse  (<7=A74, porque no hay un nuevo registro. En un
disparador para *  se puede emplear  (<7=A74 para referirse a las columnas de un
registro antes de que sea actualizado, y L(nom_col para referirse a las columnas del registro luego
de actualizarlo.

Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 43 / 52

Una columna precedida por  es de slo lectura. Es posible hacer referencia a ella pero no
modificarla. Una columna precedida por L puede ser referenciada si se tiene el privilegio

sobre ella. En un disparador , tambin es posible cambiar su valor con

L(<7=D>6A74Jvalor si se tiene el privilegio de *  sobre ella. Esto significa que un
disparador puede usarse para modificar los valores antes que se inserten en un nuevo registro o se
empleen para actualizar uno existente.
En un disparador , el valor de L para una columna    es 0, no el nmero
secuencial que se generar en forma automtica cuando el registro sea realmente insertado.
 y L son extensiones de MySQL para los disparadores.
Empleando el constructor   ((( , se puede definir un disparador que ejecute sentencias
mltiples. Dentro del bloque   , tambin pueden utilizarse otras sintaxis permitidas en rutinas
almacenadas, tales como condicionales y bucles. Como sucede con las rutinas almacenadas, cuando se
crea un disparador que ejecuta sentencias mltiples, se hace necesario redefinir el delimitador de
sentencias si se ingresar el disparador a travs del programa mysql, de forma que se pueda utilizar
el caracter 'T' dentro de la definicin del disparador. El siguiente ejemplo ilustra estos aspectos. En l
se crea un disparador para * , que verifica los valores utilizados para actualizar cada columna,
y modifica el valor para que se encuentre en un rango de 0 a 100. Esto debe hacerse en un disparador
 porque los valores deben verificarse antes de emplearse para actualizar el registro:
mysql> delimiter //
mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account
-> FOR EACH ROW
-> BEGIN
-> IF NEW.amount < 0 THEN
->
SET NEW.amount = 0;
-> ELSEIF NEW.amount > 100 THEN
->
SET NEW.amount = 100;
-> END IF;
-> END;//
mysql> delimiter ;
Podra parecer ms fcil definir una rutina almacenada e invocarla desde el disparador utilizando
una simple sentencia  . Esto sera ventajoso tambin si se deseara invocar la misma rutina desde
distintos disparadores. Sin embargo, una limitacin de los disparadores es que no pueden utilizar
 . Se debe escribir la sentencia compuesta en cada    donde se la desee emplear.
MySQL gestiona los errores ocurridos durante la ejecucin de disparadores de esta manera:
 Si lo que falla es un disparador , no se ejecuta la operacin en el correspondiente
registro.
 Un disparador  se ejecuta solamente si el disparador  (de existir) y la operacin
se ejecutaron exitosamente.
 Un error durante la ejecucin de un disparador  o  deriva en la falla de toda la
sentencia que provoc la invocacin del disparador.
 En tablas transaccionales, la falla de un disparador (y por lo tanto de toda la sentencia)
debera causar la cancelacin (rollback) de todos los cambios realizados por esa sentencia. En
tablas no transaccionales, cualquier cambio real

Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 44 / 52

10 Vistas
Las vistas (incluyendo vistas actualizables) fueron introducidas en la versin 5.0 del servidor de base
de datos MySQL
En este captulo se tratan los siguientes temas:
 Creacin o modificacin de vistas con  L o L
 Eliminacin de vistas con *L
 Obtencin de informacin de definicin de una vista (metadatos) con
0L L

10.1 Sintaxis de  "


ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW nombre_vista [(A745=<38)]
AS sentencia_select
[WITH [CASCADED | LOCAL] CHECK OPTION]
Esta sentencia modifica la definicin de una vista existente. La sintaxis es semejante a la empleada
en  L. Se requiere que posea los permisos  L y  para la vista, y algn
privilegio en cada columna seleccionada por la sentencia
.

10.2 Sintaxis de  "


CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW <7=D>62:893 [(A745=<38)]
AS 86<96<A:38646A9
[WITH [CASCADED | LOCAL] CHECK OPTION]
Esta sentencia crea una vista nueva o reemplaza una existente si se incluye la clusula 
* . La 86<96<A:38646A9 es una sentencia
 que proporciona la definicin de la vista.
Puede estar dirigida a tablas de la base o a otras vistas.
Se requiere que posea el permiso  L para la vista, y algn privilegio en cada columna
seleccionada por la sentencia
. Para columnas incluidas en otra parte de la sentencia

debe poseer el privilegio
. Si est presente la clusula * , tambin deber tenerse
el privilegio  para la vista.
Toda vista pertenece a una base de datos. Por defecto, las vistas se crean en la base de datos actual.
Pera crear una vista en una base de datos especfica, indquela con D386?6?3978(<7=D>62:893
al momento de crearla.
mysql> CREATE VIEW test.v AS SELECT * FROM t;
Las tablas y las vistas comparten el mismo espacio de nombres en la base de datos, por eso, una base
de datos no puede contener una tabla y una vista con el mismo nombre.
Al igual que las tablas, las vistas no pueden tener nombres de columnas duplicados. Por defecto, los
nombres de las columnas devueltos por la sentencia
 se usan para las columnas de la vista .
Para dar explcitamente un nombre a las columnas de la vista utilice la clsula columnas para
indicar una lista de nombres separados con comas. La cantidad de nombres indicados en A745=<38
debe ser igual a la cantidad de columnas devueltas por la sentencia
.
Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 45 / 52

Las columnas devueltas por la sentencia


 pueden ser simples referencias a columnas de la
tabla, pero tambien pueden ser expresiones conteniendo funciones, constantes, operadores, etc.
Los nombres de tablas o vistas sin calificar en la sentencia
 se interpretan como
pertenecientes a la base de datos actual. Una vista puede hacer referencia a tablas o vistas en otras
bases de datos precediendo el nombre de la tabla o vista con el nombre de la base de datos apropiada.
Las vistas pueden crearse a partir de varios tipos de sentencias
. Pueden hacer referencia a
tablas o a otras vistas. Pueden usar combinaciones,   , y subconsultas. El
 inclusive no
necesita hacer referencia a otras tablas. En el siguiente ejemplo se define una vista que selecciona
dos columnas de otra tabla, as como una expresin calculada a partir de ellas:
mysql> CREATE TABLE t (qty INT, price INT);
mysql> INSERT INTO t VALUES(3, 50);
mysql> CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;
mysql> SELECT * FROM v;
+------+-------+-------+
| qty | price | value |
+------+-------+-------+
| 3 | 50 | 150 |
+------+-------+-------+
La definicin de una vista est sujeta a las siguientes limitaciones:
 La sentencia
 no puede contener una subconsulta en su clusula .
 La sentencia
 no puede hacer referencia a variables del sistema o del usuario.
 La sentencia
 no puede hacer referencia a parmetros de sentencia preparados.
 Dentro de una rutina almacenada, la definicin no puede hacer referencia a parmetros de la
rutina o a variables locales.
 Cualquier tabla o vista referenciada por la definicin debe existir. Sin embargo, es posible
que despus de crear una vista, se elimine alguna tabla o vista a la que se hace referencia.
Para comprobar la definicin de una vista en busca de problemas de este tipo, utilice la
sentencia 0O .
 La definicin no puede hacer referencia a una tabla * , y tampoco se puede crear
una vista * .
 Las tablas mencionadas en la definicin de la vista deben existir siempre.
 No se puede asociar un disparador con una vista.
En la definicin de una vista est permitido  , pero es ignorado si se seleccionan columnas
de una vista que tiene su propio  .
Con respecto a otras opciones o clusulas incluidas en la definicin, las mismas se agregan a las
opciones o clusulas de cualquier sentencia que haga referencia a la vista creada, pero el efecto es
indefinido. Por ejemplo, si la definicin de una vista incluye una clusula , y se hace una
seleccin desde la vista utilizando una sentencia que tiene su propia clusula , no est definido
cul se aplicar. El mismo principio se extiende a otras opciones como , 
 , o


 
 que se ubican a continuacin de la palabra reservada
, y a clusulas
como  , * , O 
0  , y * .
Si se crea una vista y luego se modifica el entorno de proceso de la consulta a traves de la
modificacin de variables del sistema, puede afectar los resultados devueltos por la vista:
mysql> CREATE VIEW v AS SELECT CHARSET(CHAR(65)), COLLATION(CHAR(65));
Query OK, 0 rows affected (0.00 sec)
mysql> SET NAMES 'latin1';
Query OK, 0 rows affected (0.00 sec)
Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 46 / 52

mysql> SELECT * FROM v;


+-------------------+---------------------+
| CHARSET(CHAR(65)) | COLLATION(CHAR(65)) |
+-------------------+---------------------+
| latin1
| latin1_swedish_ci |
+-------------------+---------------------+
1 row in set (0.00 sec)
mysql> SET NAMES 'utf8';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM v;
+-------------------+---------------------+
| CHARSET(CHAR(65)) | COLLATION(CHAR(65)) |
+-------------------+---------------------+
| utf8
| utf8_general_ci |
+-------------------+---------------------+
1 row in set (0.00 sec)
La clusula opcional  0 es una extensin de MySQL al SQL estndar.  0 puede
tomar tres valores:  , * , o    . El algoritmo por defecto es    si no
se encuentra presente la clusula  0. El algoritmo afecta la manera en que MySQL procesa
la vista.
Para  , el texto de una sentencia que haga referencia a la vista y la definicin de la vista son
mezclados de forma que parte de la definicin de la vista reemplaza las partes correspondientes de la
consulta.
Para * , los resultados devueltos por la vista son colocados en una tabla temporal, la cual es
luego utilizada para ejecutar la sentencia.
Para    , MySQL determina el algoritmo que utilizar. En ese caso se prefiere   por
sobre *  si es posible, ya que   por lo general es ms eficiente y porque la vista no
puede ser actualizable si se emplea una tabla temporal.
Una razn para elegir explcitamente *  es que los bloqueos en tablas subyacentes pueden
ser liberados despues que la tabla temporal fue creada, y antes de que sea usada para terminar el
procesamiento de la sentencia. Esto podra resultar en una liberacin del bloqueo ms rpida que en
el algoritmo  , de modo que otros clientes que utilicen la vista no estarn bloqueados mucho
tiempo.
El algoritmo de una vista puede ser    en tres situaciones:
 No se encuentra presente una clusula  0en la sentencia  L.
 La sentencia  L tiene explcitamente una clusula  0J   .
 Se especific  0J  para una vista que solamente puede ser procesada
usando una tabla temporal. En este caso, MySQL emite una advertencia y establece el
algoritmo en    .
Como se dijo anteriormente,   provoca que las partes correspondientes de la definicin de la
vista se combinen dentro de la sentencia que hace referencia a la vista. El siguiente ejemplo muestra
brevemente cmo funciona el algoritmo  . El ejemplo asume que hay una vista 2=6>F6 con
esta definicin:
CREATE ALGORITHM = MERGE VIEW v_merge (vc1, vc2) AS
Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 47 / 52

SELECT c1, c2 FROM t WHERE c3 > 100;


Ejemplo 1: Suponiendo que se utilice esta sentencia:
SELECT * FROM v_merge;
MySQL la gestiona del siguiente modo:
 2=6>F6 se convierte en 9
 + se convierte en 2A'2A, que corresponden a A'A
 Se agrega la clusula L0 de la vista
La sentencia ejecutada resulta ser:
SELECT c1, c2 FROM t WHERE c3 > 100;
Ejemplo 2: Suponiendo que se utilice esta sentencia:
SELECT * FROM v_merge WHERE vc1 < 100;
Esta sentencia se gestiona en forma similar a la anterior, a excepcin de que 2AI se convierte
en AI y la clusula L0 de la vista se agrega a la clusula L0 de la sentencia
empleando un conector (y se agregan parntesis para asegurarse que las partes de la clusula se
ejecutarn en el orden de precedencia correcto). La sentencia ejecutada resulta ser:
SELECT c1, c2 FROM t WHERE (c3 > 100) AND (c1 < 100);
Necesariamente, la sentencia a ejecutar tiene una clusula L0 con esta forma:
WHERE (WHERE de la sentencia) AND (WHERE de la vista)
El algoritmo   necesita una relacin uno-a-uno entre los registros de la vista y los registros de
la tabla subyacente. Si esta relacin no se sostiene, debe emplear una tabla temporal en su lugar. No
se tendr una relacin uno-a-uno si la vista contiene cualquiera de estos elementos:
 Funciones agregadas (
#$,  #$,  -#$,  #$, etctera)
 
 
 *
 0 
   o    
 Hace referencia solamente a valores literales (en tal caso, no hay una tabla subyacente)
Algunas vistas son actualizables. Esto significa que se las puede emplear en sentencias como
* , , o 
 para actualizar el contenido de la tabla subyacente. Para que una vista
sea actualizable, debe haber una relacin uno-a-uno entre los registros de la vista y los registros de la
tabla subyacente. Hay otros elementos que impiden que una vista sea actualizable. Ms
especficamente, una vista no ser actualizable si contiene:
 Funciones agregadas (
#$,  #$,  -#$,  #$, etctera)
 
 
 *
 0 
   o    
 Una subconsulta en la lista de columnas del SELECT
 Join
 Una vista no actualizable en la clusula 
 Una subconsulta en la clusula L0 que hace referencia a una tabla en la clusula 
 Hace referencia solamente a valores literales (en tal caso no hay una) tabla subyacenta para
actualizar.
  0J*  (utilizar una tabla temporal siempre resulta en una vista no
actualizable)
Con respecto a la posibilidad de agregar registros mediante sentencias 
, es necesario que las
columnas de la vista actualizable tambin cumplan los siguientes requisitos adicionales:
 No debe haber nombres duplicados entre las columnas de la vista.
Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 48 / 52

 La vista debe contemplar todas las columnas de la tabla en la base de datos que no tengan

indicado un valor por defecto.


 Las columnas de la vista deben ser referencias a columnas simples y no columnas derivadas.

Una columna derivada es una que deriva de una expresin. Estos son algunos ejemplos de
columnas derivadas:
3.14159
col1 + 3
UPPER(col2)
col3 / col4
(85DS56>;)
No puede insertar registros en una vista conteniendo una combinacin de columnas simples y
derivadas, pero puede actualizarla si actualiza nicamente las columnas no derivadas. Considere
esta vista:
CREATE VIEW v AS SELECT col1, 1 AS col2 FROM t;
En esta vista no pueden agregarse registros porque A74 es derivada de una expresin. Pero ser
actualizable si no intenta actualizar A74. Esta actualizacin es posible:
UPDATE v SET col1 = 0;
Esta actualizacin no es posible porque se intenta realizar sobre una columna derivada:
UPDATE v SET col2 = 0;
A veces, es posible que una vista compuesta por mltiples tablas sea actualizable, asumiendo que es
procesada con el algoritmo  . Para que esto funcione, la vista debe usar inner join (no outer join
o   ). Adems, solamente puede actualizarse una tabla de la definicin de la vista, de forma que
la clusula
 debe contener columnas de slo una tabla de la vista. Las vistas que utilizan   
 no se pueden actualizar aunque tericamente fuese posible hacerlo, debido a que en la
implementacin se emplean tablas temporales para procesarlas.
En vistas compuestas por mltiples tablas, 
 funcionar si se aplica sobre una nica tabla.
 no est soportado.
La clusula L00O* puede utilizarse en una vista actualizable para evitar inserciones
o actualizaciones excepto en los registros en que la clusula L0 de la sentencia_select se evale
como true.
En la clusula L00O* de una vista actualizable, las palabras reservadas   y

  determinan el alcance de la verificacin cuando la vista est definida en trminos de otras
vistas.   restringe el 0O* slo a la vista que est siendo definida. 
  provoca
que las vistas subyacentes tambin sean verificadas. Si no se indica, el valor por defecto es

  . Considere las siguientes definiciones de tabla y vistas:
mysql> CREATE TABLE t1 (a INT);
mysql> CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 2
-> WITH CHECK OPTION;
mysql> CREATE VIEW v2 AS SELECT * FROM v1 WHERE a > 0
-> WITH LOCAL CHECK OPTION;
mysql> CREATE VIEW v3 AS SELECT * FROM v1 WHERE a > 0
-> WITH CASCADED CHECK OPTION;
Las vistas 2 y 2 estan definidas en trminos de otra vista, 2. 2 emplea check option  , por
lo que las inserciones slo atraviesan la verificacin de 2 . 2 emplea check option 
  de
modo que las inserciones no solamente atraviesan su propia verificacin sino tambien las de las
vistas subyacentes. Las siguientes sentencias demuestran las diferencias:
ql> INSERT INTO v2 VALUES (2);
Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 49 / 52

Query OK, 1 row affected (0.00 sec)


mysql> INSERT INTO v3 VALUES (2);
ERROR 1369 (HY000): CHECK OPTION failed 'test.v3'
La posibilidad de actualizacin de las vistas puede verse afectada por el valor de la variable del
sistema 5&?393D462:6U8U:9W4:=:9.
La sentencia  L fue introducida en MySQL 5.0.1. La clusula L00O* fue
implementada en MySQL 5.0.2.
   
0 contiene una tabla L
de la cual puede obtenerse informacin sobre los
objetos de las vistas.

10.2.1 Sintaxis de  !


DROP VIEW [IF EXISTS]
nombre_vista [, <7=D>62:893] ...
[RESTRICT | CASCADE]
*L elimina una o ms vistas de la base de datos. Se debe poseer el privilegio * en cada
vista a eliminar.
La clusula -

se emplea para evitar que ocurra un error por intentar eliminar una vista
inexistente. Cuando se utiliza esta clusula, se genera una  por cada vista inexistente.

 y 
  son ignoradas.

10.2.2 Sintaxis de ! !


SHOW CREATE VIEW <7=D>62:893
Muestra la sentencia  L que se utiliz para crear la vista.
mysql> SHOW CREATE VIEW v;
+-------+----------------------------------------------------+
| Table | Create Table
|
+-------+----------------------------------------------------+
| v | CREATE VIEW `test`.`v` AS select 1 AS `a`,2 AS `b` |
+-------+----------------------------------------------------+

Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 50 / 52

11 " #
 $
#

11.1 
# #$


!
mysqldump


El cliente mysqldump puede utilizarse para volcar una base de datos o coleccin de bases de datos
para copia de seguridad o para transferir datos a otro servidor SQL (no necesariamente un servidor
MySQL). EL volcado contiene comandos SQL para crear la tabla y/o rellenarla.
Si est haciendo una copia de seguridad del servidor, y las tablas son todas ;
, puede
considerar usar mysqlhotcopy ya que hace copias de seguridad ms rpidas y restauraciones ms
rpidas, que pueden realizarse con el segundo programa.
Hay tres formas de invocar mysqldump:
shell> mysqldump [opciones] <7=D>6?6D386?6?3978 [93D438]
shell> mysqldump [opciones] --databases  [DB2 ...]
shell> mysqldump [opciones] all-databases
Si no se nombra ninguna tabla o se utiliza la opcin ?393D3868 o 344?393D3868, se vuelca
bases de datos enteras.
Para obtener una lista de las opciones que soporta su versin de mysqldump, ejecute mysqldump
help.
Para respaldar la base de datos existente:
8W644M=;8S4?5=&5&
<7=D>6D386?6?3978M
<7=D>6?643>AW:27?6>68&34?7

11.2 
% &  

!
mysqladmin685<A4:6<96&3>3>634:^3>7&6>3A:7<683?=:<:89>39:238(
6&56?6
583>&3>3A7=&>7D3>43A7<@:F5>3A:B<;646893?73A9534?6486>2:?7>'A>63>;
D7>>3>D3868?6?3978';A7<=G8@:<34:?3?68(
Invoque mysqladmin as:
shell> mysqladmin [7&A:7<68] comando [7&A:7<68?6A7=3<?7] comando ...
mysqladmin soporta los siguientes comandos:
 A>6396nombre_base_de_datos
Crea una nueva base de datos llamada nombre_base_de_datos.
 ?>7&nombre_base_de_datos
Borra la base de datos llamada <7=D>6D386?6?3978 y todas sus
 Muchas mas opciones. Ver la documentacin de MySQL en el CD del curso.
Para borrar la base de datos existente:
8W644M=;8S43?=:<5&
?>7&<7=D>6D386?6?3978
Para crear una base de datos vacilla:
8W644M=;8S43?=:<5&
A>6396<7=D>6D386?6?3978
Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 51 / 52

11.3 
% &$!

mysql685<8:=&468W644
#A7<A3&3A:?3?68 >63?4:<6$(
7&7>93587
:<96>3A9:27;<7:<96>3A9:27(53<?786583:<96>3A9:23=6<96'478>685493?78
?6438A7<85493886=5689>3<6<@7>=397?693D43
(53<?786583<7
:<96>3A9:23=6<96#&7>6[6=&47'A7=7@:49>7$'64>685493?786&>686<936<
@7>=39786&3>3?7&7>93D543?7>68(4@7>=397?6834:?3&56?6A3=D:3>86583<?7
7&A:7<68?64_<63?6A7=3<?78(
Si tiene problemas relacionados con memoria insuficiente para conjuntos de resultados grandes,
utilice la opcin S5:AV. Esto fuerza mysql a devolver los resultados desde el servidor registro a
registro en lugar de recibir todo el conjunto de resultados y almacenarlo en memoria antes de
mostrarlo. Esto se hace usando =;8S4586>68549#$ en lugar de =;8S4897>6>68549#$ para
recibir el conjunto de resultados.
Usar mysql es muy sencillo. Invquelo desde el prompt de su intrprete de comandos como se
muestra a continuacin:
shell> mysql <7=D>6D386?6?3978
*3>3>6446<3>43D386?6?3978A7<643>AW:27?6>68&34?76[6A953/
8W644M=;8S45&
@<7=D>6D386?6?3978M3>AW:27?6>68&34?7

Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Curso de programacin en MySQL

Pagina 52 / 52

12 Ejercicios
1. Crear una tabla con columnas de los diferente tipos numericos, y probar de insertar filas con
valores dentro y luego fuera de los rangos minimo y maximo de cada tipo.
2. Crear una tabla con columnas de los diferente tipos de fechas, y probar de insertar filas con
valores dentro y luego fuera de los rangos minimo y maximo de cada tipo.
3. Crear una tabla con columnas de los diferente tipos de caracteres, y probar de insertar filas con
valores para cada tipo.
4. Probar las precedencia de operadores
5. Probar las funciones de comparacion de datos con enteros.
6. Probar los operdores logicos
7. Probar las funciones de flujo
8. Probar las funciones de comparacion de datos con caracteres.
9. Probar las funciones de matematica
10.Probar las funciones de fechas.
11.Probar las funciones de encriptacion.
12.Probar las funciones de informacin
13.Crear un procedimiento para crear un usuario
14.Crear un procedimiento que regresa el numero de registros que tiene la tabla lab_prescription
15.Crear un procedimiento para crear un paciente, y que regresa el no_patient generado, o un
numero negativo si el no_lnaiss o el no_city no existe en la tabla city.
16.Crear un procedimiento que va a usar un cursor y poner inactivo todos los usuarios que tienen el
campo bad_try >1
17.Crear una funcion que regresa el nombre y apellido completo del paciente cual no_patient fue
pasado como parametro.
18.Crear una funcion que va a regresar la edad un paciente.
19.Crear una funcion que regresa el numero de lab_prescription ligadas a un paciente
20.Crear una funcion que regresa el numero de pruebas (lab_test) de un cierto tipo (lab_test_type)
ligadas a un paciente
21.Crear una funcion que devuelve un numero unico y que se va incrementando (como una
secuencia).
22.Crear un trigger que va a poner el mayusculas los nombres y apellidos del paciente al insertar o
modificar el paciente.
23.Crear un trigger que va a crear un usuario al insertar un paciente, con el mismo nombre/apellido.
24.Crear una vista que contiene los datos del paciente asi que los nombre de cuidades de nacimiento
y residencia.
25.Crear una vista que lista los pacientes por region y cuidad, y da el total de pacientes por cada uno.
26.Crear una copia de su base de datos usando respaldo/restauracion de su base de datos.

Copyright Cdric Simon, 2007

Versin 1.0

Reproduccin prohibida

Vous aimerez peut-être aussi