Sei sulla pagina 1di 139

MySQL para Desarrolladores

Euclides Figueroa
efigueroah@gmail.com.ve

Creado por Euclides Figueroa Usando OpenOffice.org 1


Temas que sern tratados

Dia I
Instalacin y configuracin de MySQL
Instalacin de MySQL en Linux

Opciones de configuracin
Engines de Bases de Datos
InnoDB
MyISAM
Otros

Ejecucin de MySQL
Inicio de MySQL
Detener a MySQL
Uso de mysqladmin
Uso del cliente mysql

Sistemas de administracin grficos y Web.


Programas Clientes para el Desarrollador
Clientes Grficos
mysql-administratormysql-browser mysql-workbench

Clientes Web
phpMyAdmin

Creado por Euclides Figueroa Usando OpenOffice.org


2
Temas que sern tratados

Dia II
Diseo de bases de datos
Usando el Workbench
Tipos de datos de MySQL
Valores NULL y DEFAULT
ndices
Creacin de bases de datos y tablas
Insercin de datos
Seleccin de datos
Uso de condicionales
Uso de LIKE y NOT LIKE
Uniones

Ordenacin de resultados de una consulta


Limitacin de los resultados de una consulta
Actualizacin de datos
Eliminacin de datos
Modificacin de tablas

Creado por Euclides Figueroa Usando OpenOffice.org


3
Temas que sern tratados

Dia III
Control de Usuarios

Base de Datos mysql


Tablas de Administracin
users
host
Sentencias Grant y Revoke

Gestin de Usuarios y Seguridad

Seguridad de Equipos
Seguridad Bases de Datos
Seguridad de Usuarios

Creado por Euclides Figueroa Usando OpenOffice.org


4
Temas que sern tratados

Dia III
Vistas (Views)

Sintaxis de ALTER VIEW


Sintaxis de CREATE VIEW
Sintaxis de DROP VIEW
Sintaxis de SHOW CREATE VIEW

Comandos transaccionales y de bloqueo de MySQL

Sintaxis de START TRANSACTION, COMMIT y ROLLBACK


Sentencias que no se pueden deshacer
Sentencias que causan una ejecucin (commit) implcita
Sintaxis de SAVEPOINT y ROLLBACK TO SAVEPOINT
Sintaxis de LOCK TABLES y UNLOCK TABLES
Sintaxis de SET TRANSACTION

Creado por Euclides Figueroa Usando OpenOffice.org


5
Temas que sern tratados

Dia IV
Procedimientos almacenados y funciones

Procedimientos almacenados y las tablas de permisos


Sintaxis de procedimientos almacenados
CREATE PROCEDURE y CREATE FUNCTION
ALTER PROCEDURE y ALTER FUNCTION
DROP PROCEDURE y DROP FUNCTION
SHOW CREATE PROCEDURE y SHOW CREATE FUNCTION
SHOW PROCEDURE STATUS y SHOW FUNCTION STATUS
La sentencia CALL
Sentencia compuesta BEGIN ... END
Sentencia DECLARE
Variables en procedimientos almacenados

Cursores
Constructores de control de flujo

Creado por Euclides Figueroa Usando OpenOffice.org


6
Temas que sern tratados

Dia IV
Disparadores (triggers)
Sintaxis de CREATE TRIGGER
Sintaxis de DROP TRIGGER
Utilizacin de disparadores

La cach de consultas de MySQL


Cmo opera la cach de consultas
Opciones de SELECT para la cach de consultas
Configuracin de la cach de consultas
Estado y mantenimiento de la cach de consultas

Creado por Euclides Figueroa Usando OpenOffice.org


7
Temas que sern tratados

Dia V
Optimizacin de rango
Index Merge Optimization

Cmo evitar lecturas completas de tablas


Velocidad de la sentencia INSERT
Velocidad de las sentencias UPDATE
Velocidad de sentencias DELETE

El MySQL-Administrator
Control del Servidor
ndices de Gestin
Administracin de Usuarios
Respaldos y Recuperacin de datos
Manejo de Logs

Seguridad de Datos de MySQL


Procesos de Respaldo
Recuperacin de Datos

Creado por Euclides Figueroa Usando OpenOffice.org


8
Qu es MySQL ?

Creado por Euclides Figueroa Usando OpenOffice.org 9


APIs de programacin

C y C++
Perl
Python
Java
PHP
Delphi
C#
Visual Basic
ASP C#

Creado por Euclides Figueroa Usando OpenOffice.org 10


Los Engines de Almacenamiento de MySQL

Los motores son:

BerkeleyDB o BDB: tablas de transaccin segura con bloqueo de pgina.

HEAP o MEMORY: tablas almacenadas en memoria.

ISAM: motor original de MySQL.

InnoDB: tablas de transaccin segura con bloqueo de fila y claves forneas.

MERGE o MRG_MyISAM: una coleccin de tablas MyISAM usadas como


una nica tabla.

MyISAM: el nuevo motor binario de almacenamiento portable que reemplaza


a ISAM.

Creado por Euclides Figueroa Usando OpenOffice.org 11


Hace el Engine de almacenamiento la diferencia?

MyISAM Inserts InnoDB Inserts Archive Inserts


Usuarios Por Second Por Second Por Second
1 3,203.00 2,670.00 3,576.00
4 9,123.00 5,280.00 11,038.00
8 9,361.00 5,044.00 13,202.00
16 8,957.00 4,424.00 13,066.00
32 8,470.00 3,934.00 12,921.00
64 8,382.00 3,541.00 12,571.00

Usando mysqlslap, y MySQL 5.1.23rc, el engine Archive tuvo


50% mas INSERT en comparacion con MyISAM, y 255%
mas que InnoDB
Creado por Euclides Figueroa Usando OpenOffice.org 12
Clientes grficos para MySQL

Navicat
EMS MySQL Manager
Squirrel SQL
ISQL Viewer
Database Manager Profesional
SQLyog
Aqua Data Studio
MyDB Studio
MySQL Front
SQLion
MySQL Maestro

MySQL Administrator
MySQL Query Browser

Creado por Euclides Figueroa Usando OpenOffice.org 13


Obtener MySQL para Linux

A travs de MySQL AB

Archivos binarios independientes de la distribucin de Linux.

Paquetes que utilizan el manejador de paquetes de RedHat.

Cdigo fuente que se tiene que compilar.

A travs de la distribucin de Linux

RedHat, Debian, SuSE, etc... etc...

Creado por Euclides Figueroa Usando OpenOffice.org 14


Conectarse a MySQL

Uso del monitor mysql

mysql es un programa que se ejecuta desde el prompt del


sistema, que permite conectarse a un servidor MySQL para
enviarle consultas y comandos, y ver los resultados.

Este comando permite:

Consultar informacin de las bases de datos y tablas


Crear bases de datos y tablas
Eliminar bases de datos y tablas.
Asignar y revocar privilegios.
Consultar, insertar, actualizar y eliminar registros de una tabla.

Creado por Euclides Figueroa Usando OpenOffice.org 15


Conectarse a MySQL - ejemplo

Sintaxis del comando mysql

$shell> mysql [-h hostname] [-u usuario] [-p] [base de datos]

Para una conexin a un host local como usuario root, las


siguientes lneas son equivalentes.

# mysql

# mysql -u root

# mysql -h localhost -u root

Creado por Euclides Figueroa Usando OpenOffice.org 16


Conectarse a MySQL

Si se puede establecer la conexin a MySQL, se obtiene un


mensaje de bienvenida, y se cambia el prompt, indicando que se
pueden enviar consultas al servidor.

# mysql

Welcome to the MySQL monitor. Commands end with ; or \g.


Your MySQL connection id is 25 to server version: 5.23.41

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>

Creado por Euclides Figueroa Usando OpenOffice.org 17


Conectarse a MySQL

La siguiente tabla muestra cada uno de los indicadores que podr ver
y sintetiza lo que dicen acerca del estado en que se encuentra mysql:

mysql> Listo para un nuevo comando.

-> Esperando la siguiente lnea en un comando de


mltiples lneas.

'> Esperando la siguiente lnea, se encuentra


abierta una cadena que comienza con apostrofo (''').

"> Esperando la siguiente lnea, se encuentra


abierta una cadena que comienza con comillas dobles
('"').

Creado por Euclides Figueroa Usando OpenOffice.org 18


Conectarse a MySQL

La siguiente tabla muestra cada uno de los indicadores que podr ver
y sintetiza lo que dicen acerca del estado en que se encuentra mysql:

`> Esperando la siguiente lnea, se encuentra abierta una


cadena que comienza con tilde ('`').

/*> Esperando la siguiente lnea, se encuentra abierto


un comentario que comienza con /*.

El prompt /*> fue introducido en la serie 5.0 a partir de


MySQL 5.0.6.

Creado por Euclides Figueroa Usando OpenOffice.org 19


el Comando SHOW

SHOW tiene varias formas que proporcionan informacin acerca


de bases de datos, tablas, columnas o informacin de estado
acerca del servidor

SHOW DATABASES [LIKE 'pattern']


SHOW CREATE DATABASE db_name

SHOW TABLES
SHOW CREATE TABLE tbl_name

SHOW ENGINE engine_name {LOGS | STATUS }

SHOW [STORAGE] ENGINES

Creado por Euclides Figueroa Usando OpenOffice.org 20


el Comando SHOW

SHOW tiene varias formas que proporcionan informacin acerca


de bases de datos, tablas, columnas o informacin de estado
acerca del servidor

SHOW ERRORS [LIMIT [offset,] row_count]

SHOW INNODB STATUS


SHOW [BDB] LOGS

SHOW GRANTS FOR user

SHOW INDEX FROM tbl_name [FROM db_name]

Creado por Euclides Figueroa Usando OpenOffice.org 21


el Comando SHOW

SHOW tiene varias formas que proporcionan informacin acerca


de bases de datos, tablas, columnas o informacin de estado
acerca del servidor

SHOW PRIVILEGES
SHOW [FULL] PROCESSLIST

SHOW [GLOBAL | SESSION] STATUS [LIKE 'pattern']

SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern']


SHOW [OPEN] TABLES [FROM db_name] [LIKE 'pattern']

SHOW [GLOBAL | SESSION] VARIABLES [LIKE 'pattern']


SHOW WARNINGS [LIMIT [offset,] row_count]

Creado por Euclides Figueroa Usando OpenOffice.org 22


Ver las bases de datos

El programa mysql permite ver las bases de datos existentes.

mysql> SHOW DATABASES ;

//Ejemplo

mysql> SHOW DATABASES;


+----------+
| Database |
+----------+
| mysql |
| test |
+----------+
2 rows in set (0.00 sec)

Creado por Euclides Figueroa Usando OpenOffice.org 23


Crear una base de datos

El programa mysql permite crear bases de datos

mysql> CREATE DATABASE nombreBaseDatos ;

//Ejemplo

mysql> CREATE DATABASE agendita;


Query OK, 1 row affected (0.00 sec)

Creado por Euclides Figueroa Usando OpenOffice.org 24


Usar una base de datos

Con el cliente mysql se puede seleccionar la base de datos sobre


la que se va a trabajar.

mysql> USE nombreBaseDatos ;

//Ejemplo

mysql> USE agendita;


Database changed

Creado por Euclides Figueroa Usando OpenOffice.org 25


Crear una tabla

Al seleccionar una base de datos, se pueden crear las tablas


necesarias.

Se utiliza la sentencia SQL CREATE TABLE.

//Ejemplo

mysql> CREATE TABLE contactos (


-> id INT NOT NULL AUTO_INCREMENT ,
-> nombre VARCHAR(50) NOT NULL ,
-> email VARCHAR(50) NOT NULL ,
-> telefono VARCHAR(20) NOT NUL ,
-> PRIMARY KEY (id) );
Query OK, 0 rows affected (0.02 sec)

Creado por Euclides Figueroa Usando OpenOffice.org 26


Ver las tablas de una base datos

El programa mysql permite ver las tablas de una base de datos.

mysql> SHOW TABLES ;

//Ejemplo

mysql> SHOW TABLES;


+--------------------+
| Tables_in_agendita |
+--------------------+
| contactos |
+--------------------+
1 row in set (0.00 sec)

Creado por Euclides Figueroa Usando OpenOffice.org 27


Ver las columnas de una tabla

Con el cliente mysql se puede examinar la estructura de una tabla.

mysql> DESC nombreTabla ;

//Ejemplo

mysql> DESC contactos;


+----------+-------------+------+-----+---------+
| Field | Type | Null | Key | Default |
+----------+-------------+------+-----+---------+
| id | int(11) | | PRI | NULL |
| nombre | varchar(50) | YES | | NULL |
| email | varchar(50) | YES | | NULL |
| telefono | varchar(50) | YES | | NULL |
+----------+-------------+------+-----+---------+
4 rows in set (0.00 sec)

Creado por Euclides Figueroa Usando OpenOffice.org 28


Insertar registros en una tabla

Uso de la sentencia INSERT

mysql> INSERT INTO contactos VALUES


-> (0, 'Juan Penas', 'juancho@linux.com', '5675 -7383' );

mysql> INSERT INTO contactos VALUES


-> (0, 'Bety la fea', 'bety@comedias.com', '6373 -3459' );

mysql> INSERT INTO contactos VALUES


-> (0, 'Pepe pecas', 'pepe@cuentos.com', '7282 -2728' );

mysql> INSERT INTO contactos VALUES


-> (0, 'Mary B.', 'mary@boquitas.com', '3459 -2339');

Creado por Euclides Figueroa Usando OpenOffice.org 29


Consultar registros

Uso de la sentencia SELECT

mysql> SELECT * FROM contactos;

mysql> SELECT nombre, email FROM contactos;

mysql> SELECT nombre, email, telefono FROM contactos


-> WHERE id = 3;

mysql> SELECT * FROM contactos WHERE nombre


-> LIKE 'Pepe%';

mysql> SELECT COUNT(*) AS num FROM contactos;

Creado por Euclides Figueroa Usando OpenOffice.org 30


Actualizar registros

Uso de la sentencia UPDATE

mysql> UPDATE contactos SET telefono='6373 -3459'


-> WHERE id = 1;

mysql> UPDATE contactos SET


-> nombre = 'Mary Boquitas' WHERE id = 2;

mysql> UPDATE contactos SET email='pepe@correo.com',


-> telefono = '7383 -3489' WHERE id = 3;

mysql> SELECT * FROM contactos;

Creado por Euclides Figueroa Usando OpenOffice.org 31


Eliminar registros

Uso de la sentencia DELETE

mysql> SELECT * FROM contactos WHERE


-> nombre LIKE 'Bety%';

mysql> DELETE FROM contactos WHERE


-> nombre LIKE 'Bety%';

mysql> SELECT * FROM contactos WHERE id >= 3;

mysql> DELETE FROM contactos WHERE id >= 3;

mysql> SELECT * FROM contactos;

Creado por Euclides Figueroa Usando OpenOffice.org 32


Administrar un servidor MySQL con mysqladmin

mysqladmin es un cliente para realizar operaciones


administrativas. Se puede usar para comprobar la
configuracin y el estado actual del servidor, crear y borrar
bases de datos, y con ms finalidades.

Invoque mysqladmin as:

shell> mysqladmin [opciones] comando


[opciones_de_comando] comando ...

Creado por Euclides Figueroa Usando OpenOffice.org 33


Administrar un servidor MySQL con mysqladmin

shell> mysqladmin [opciones]


comando[opciones_de_comando] comando ...

mysqladmin soporta los siguientes comandos:

create nombre_base_de_datos
Crea una nueva base de datos llamada nombre_base_de_datos.
debug
Le dice al servidor que escriba informacin de depuracin en el
log de error.
drop nombre_base_de_datos
Borra la base de datos llamada nombre_base_de_datos y todas
sus tablas.
extended-status
Muestra las variables de estado del servidor y sus valores.

Creado por Euclides Figueroa Usando OpenOffice.org 34


Administrar un servidor MySQL con mysqladmin

shell> mysqladmin [opciones]


comando[opciones_de_comando] comando ...

flush-status
Limpia las variables de estado.

flush-tables
Muestra todas las tablas.

flush-threads
Muestra la cach de threads.

kill id,id,...
Mata los threads (procesos activos) del servidor.

Creado por Euclides Figueroa Usando OpenOffice.org 35


Administrar un servidor MySQL con mysqladmin

shell> mysqladmin [opciones]


comando[opciones_de_comando] comando ...

flush-hosts
Muestra toda la informacin en la cach del equipo.

flush-logs
Muestra todos los logs.

flush-privileges
Recarga las tablas de permisos (lo mismo que reload).

Creado por Euclides Figueroa Usando OpenOffice.org 36


Administrar un servidor MySQL con mysqladmin

shell> mysqladmin [opciones]


comando[opciones_de_comando] comando ...

flush-hosts
Muestra toda la informacin en la cach del equipo.

flush-logs
Muestra todos los logs.

flush-privileges
Recarga las tablas de permisos (lo mismo que reload).

Creado por Euclides Figueroa Usando OpenOffice.org 37


Administrar un servidor MySQL con mysqladmin

shell> mysqladmin [opciones]


comando[opciones_de_comando] comando ...

processlist
Muestra una lista de los threads activos del servidor. Esto es
como la salida del comando SHOW PROCESSLIST. Si se da la
opcin --verbose, la salida es como la de SHOW FULL
PROCESSLIST.

reload
Recarga las tablas de permisos.

refresh
Muestra todas las tablas y cierra y abre los Archivos de logs.

Creado por Euclides Figueroa Usando OpenOffice.org 38


Administrar un servidor MySQL con mysqladmin

shell> mysqladmin [opciones]


comando[opciones_de_comando] comando ...

processlist
Muestra una lista de los threads activos del servidor. Esto es
como la salida del comando SHOW PROCESSLIST. Si se da la
opcin --verbose, la salida es como la de SHOW FULL
PROCESSLIST.

reload
Recarga las tablas de permisos.

refresh
Muestra todas las tablas y cierra y abre los Archivos de logs.

Creado por Euclides Figueroa Usando OpenOffice.org 39


Administrar un servidor MySQL con mysqladmin

shell> mysqladmin [opciones]


comando[opciones_de_comando] comando ...

ping
Comprueba si el servidor est vivo. El estado retornado por
mysqladmin es 0 si el servidor est en ejecucin, 1 si no lo
est.
A partir de MySQL 5.0, el estado es 0 incluso en caso de un
error tal como Access denied, ya que esto significa que el
servidor est en ejecucin pero no ha admitido la conexin,
lo que no es lo mismo que el servidor no est en ejecucin.

Creado por Euclides Figueroa Usando OpenOffice.org 40


Administrar un servidor MySQL con mysqladmin

shell> mysqladmin [opciones]


comando[opciones_de_comando] comando ...

shutdown
Detiene el servidor.

status
Muestra un mensaje de estado corto del servidor.

variables
Muestra las variables de sistema del servidor y sus valores.

version
Muestra informacin de la versin del servidor.

Creado por Euclides Figueroa Usando OpenOffice.org 41


mysqlcheck para mantener y reparar tablas

El cliente mysqlcheck comprueba y repara tablas MyISAM.


Tambin puede optimizar y analizar tablas.

mysqlcheck es similar a myisamchk, pero funciona de forma


distinta. La principal diferencia operacional es que
mysqlcheck debe usarse cuando el servidor mysqld est en
ejecucin, mientras que myisamchk debe usarse cuando no
lo est. El beneficio de usar mysqlcheck es que no tiene que
parar el servidor para comprobar o reparar las tablas.

mysqlcheck usa los comandos SQL CHECK TABLE, REPAIR


TABLE, ANALYZE TABLE, y OPTIMIZE TABLE de forma
conveniente para los usuarios. Determina los comandos a
usar en funcin de la operacin que quiera realizar, luego
enva los comandos al servidor para ejecutarlos.

Creado por Euclides Figueroa Usando OpenOffice.org 42


mysqlcheck para mantener y reparar tablas

El cliente mysqlcheck comprueba y repara tablas MyISAM.


Tambin puede optimizar y analizar tablas.

Hay tres modos generales de invocar mysqlcheck:

shell> mysqlcheck [opciones] nombre_de_base_de_datos


[tablas]
shell> mysqlcheck [opciones] --databases DB1 [DB2 DB3...]
shell> mysqlcheck [opciones] --all-databases

Si no nombra ninguna tabla o usa las opciones --databases o


--all-databases, se comprueban todas las bases de datos

Creado por Euclides Figueroa Usando OpenOffice.org 43


Sistema de privilegios

Asignacin del password al administrador de MySQL

# mysqladmin -u root password 'holahola'

A partir de asignar un password al administrador de MySQL


(el usuario root) se tiene que proporcionar dicho password cada
vez que se quiera realizar alguna operacin sobre las bases de
datos.

Para que MySQL pregunte por el password, se usa la opcin -p

# mysql -p
# mysqlshow -p
# mysqladmin -p

Creado por Euclides Figueroa Usando OpenOffice.org 44


SQL y MySQL Caracteristicas especiales

Los operadores "regexp" y "not regexp" busca patrones de modo


similar a "like" y "not like".

Para buscar libros que contengan la cadena "Ma" usamos:

select titulo from libros


where titulo regexp 'Ma';

Para buscar los autores que tienen al menos una "h" o una "k" o una
"w" tipeamos:

select autor from libros


where autor regexp '[hkw]';

Creado por Euclides Figueroa Usando OpenOffice.org 45


SQL y MySQL Caracteristicas especiales

Para buscar los autores que no tienen ni "h" o una "k" o una "w"
tipeamos:

select autor from libros


where autor not regexp '[hkw]';

Para buscar los autores que tienen por lo menos una de las letras de
la "a" hasta la "d", es decir, "a,b,c,d", usamos:

select autor from libros


where autor regexp '[a-d]';

Para ver los ttulos que comienzan con "A" tipeamos:

select titulo from libros


where titulo regexp '^A';

Creado por Euclides Figueroa Usando OpenOffice.org 46


SQL y MySQL Caracteristicas especiales
Para ver los ttulos que terminan en "HP" usamos:

select titulo from libros


where titulo regexp 'HP$';

Para buscar ttulos que contengan una "a" luego un caracter


cualquiera y luego una "e" utilizamos la siguiente sentencia:

select titulo from libros


where titulo regexp 'a.e';

El punto (.) identifica cualquier caracter.

Podemos mostrar los ttulos que contienen una "a" seguida de 2


caracteres y luego una "e":

select titulo from libros


where titulo regexp 'a..e';
Creado por Euclides Figueroa Usando OpenOffice.org 47
SQL y MySQL Caracteristicas especiales

Para buscar autores que tengan 6 caracteres exactamente usamos:

select autor from libros


where autor regexp '^......$';

Para buscar autores que tengan al menos 6 caracteres usamos:

select autor from libros


where autor regexp '......';

Para buscar ttulos que contengan 2 letras "a" usamos:

select titulo from libros


where titulo regexp 'a.*a';

El asterisco indica que busque el caracter inmediatamente anterior,


en este caso cualquiera porque hay un punto.
Creado por Euclides Figueroa Usando OpenOffice.org 48
SQL y MySQL Caracteristicas especiales

Trabaje con la tabla "agenda" que registra la informacin referente a


sus amigos.

1- Elimine la tabla si existe.

2- Cree la tabla con la siguiente estructura:


create table agenda(
apellido varchar(30),
nombre varchar(20) not null,
domicilio varchar(30),
telefono varchar(11),
mail varchar(30)
);

3- Ingrese los siguientes registros que le suministra el Instructor:

Creado por Euclides Figueroa Usando OpenOffice.org 49


SQL y MySQL Caracteristicas especiales

4- Busque todos los mails que contengan la cadena "gmail":


select *from agenda
where mail regexp ;

5- Busque los nombres que no tienen "z" ni "g":


select * from agenda
where nombre not regexp ;

6- Busque los apellidos que tienen por lo menos una de las letras de
la "v" hasta la "z" (v,w,x,y,z):
select * from agenda
where apellido regexp ;

7- Seleccione los apellidos que terminen en "ez":


select * from agenda
where apellido regexp ;

Creado por Euclides Figueroa Usando OpenOffice.org 50


SQL y MySQL Caracteristicas especiales

8- Seleccione los apellidos, nombres y domicilios de los amigos cuyos


apellidos contengan 2 letras "i":
select apellido,nombre,domicilio from agenda
where nombre regexp ;

9- Seleccione los telfonos que tengan 7 caracteres exactamente:


select * from agenda
where telefono regexp ;

10- Seleccione el nombre y mail de todos los amigos cuyos mails


tengan al menos 20 caracteres:
select nombre,mail from agenda
where mail regexp ;

Creado por Euclides Figueroa Usando OpenOffice.org 51


SQL y MySQL Caracteristicas especiales Funcion rand()

Una librera que tiene almacenados los datos de sus libros en una
tabla llamada "libros" quiere donar a una institucin 5 libros
tomados al azar.

Para recuperar de una tabla registros aleatorios se puede utilizar la


funcin "rand()" combinada con "order by" y "limit":

select * from libros


order by rand()
limit 5;

Nos devuelve 5 registros tomados al azar de la tabla "libros".

Podemos ejecutar la sentencia anterior varias veces seguidas y


veremos que los registros recuperados son diferentes en cada
ocasin.

Creado por Euclides Figueroa Usando OpenOffice.org 52


SQL y MySQL Caracteristicas especiales Funcion rand()

Problema:

Trabajamos con la tabla "alumnos" en el cual un instituto de


enseanza guarda los datos de sus alumnos.

Eliminamos la tabla "alumnos" si existe:


drop table if exists alumnos;

Creamos la tabla:
create table alumnos(
documento char(8) not null,
nombre varchar(30),
domicilio varchar(30),
ciudad varchar(20),
estado varchar(20),
primary key(documento)
);

Creado por Euclides Figueroa Usando OpenOffice.org 53


SQL y MySQL Caracteristicas especiales Funcion rand()

Problema:

El instituto quiere tomar 3 alumnos al azar para que representen al


instituto en una feria de ciencias. Para recuperar de una tabla
registros aleatorios use la funcin "rand()"
combinada con "order by" y "limit":

Creado por Euclides Figueroa Usando OpenOffice.org 54


SQL y MySQL Caracteristicas especiales Funcion IF

No nos interesa el precio exacto de cada libro, sino si el precio es


menor o mayor a $50. Podemos utilizar estas sentencias:

select titulo from libros


where precio<50;

select titulo from libros


where precio >=50;

En la primera sentencia mostramos los libros con precio menor a 50


y en la segunda los dems.

Tambin podemos usar la funcin "if".

Creado por Euclides Figueroa Usando OpenOffice.org 55


SQL y MySQL Caracteristicas especiales Funcion IF
"if" es una funcin a la cual se le envan 3 argumentos: el segundo y
tercer argumento corresponden a los valores que retornar en
caso que el primer argumento (una expresin de comparacin)
sea "verdadero" o "falso"; es decir, si el primer argumento es
verdadero, retorna el segundo argumento, sino retorna el tercero.

Veamos el ejemplo:

select titulo,
if (precio>50,'caro','economico')
from libros;

Si el precio del libro es mayor a 50 (primer argumento del "if"),


coloca "caro" (segundo argumento del "if"), en caso contrario
coloca "economico" (tercer argumento del "if").

Creado por Euclides Figueroa Usando OpenOffice.org 56


SQL y MySQL Caracteristicas especiales Funcion IF
Queremos mostrar los nombres de los autores y la cantidad de libros
de cada uno de ellos; para ello especificamos el nombre del
campo a mostrar ("autor"), contamos los libros con "autor"
conocido con la funcin "count()" y agrupamos por nombre de
autor:

select autor, count(*) from libros group by autor;

El resultado nos muestra cada autor y la cantidad de libros de cada


uno de ellos. Si solamente queremos mostrar los autores que
tienen ms de 1 libro, es decir, la cantidad mayor a 1, podemos
usar esta sentencia:

select autor, count(*) from libros group by autor having


count(*)>1;

Pero si no queremos la cantidad exacta sino solamente saber si cada


autor tiene ms de 1 libro, podemos usar "if":

Creado por Euclides Figueroa Usando OpenOffice.org 57


SQL y MySQL Caracteristicas especiales Funcion IF
Pero si no queremos la cantidad exacta sino solamente saber si cada
autor tiene ms de 1 libro, podemos usar "if":

select autor,
if (count(*)>1,'Ms de 1','1')
from libros
group by autor;

Creado por Euclides Figueroa Usando OpenOffice.org 58


SQL y MySQL Caracteristicas especiales Funcion CASE
La funcin "case" es similar a la funcin "if", slo que se pueden
establecer varias condiciones a cumplir.
Queremos saber si la cantidad de libros de cada editorial es menor o
mayor a 1, tipeamos:

select editorial, if (count(*)>1,'Mas de 2','1') as 'cantidad'


from libros group by editorial;

vemos los nombres de las editoriales y una columna "cantidad" que


especifica si hay ms o menos de uno. Podemos obtener la
misma salida usando un "case":

select editorial,
case count(*)
when 1 then 1
else 'mas de 1' end as 'cantidad'
from libros group by editorial;

Creado por Euclides Figueroa Usando OpenOffice.org 59


SQL y MySQL Caracteristicas especiales Funcion CASE
select editorial,
case count(*)
when 1 then 1
else 'mas de 1' end as 'cantidad'
from libros group by editorial;

Por cada valor hay un "when" y un "then"; si encuentra un valor


coincidente en algn "where" ejecuta el "then" correspondiente a
ese "where", si no encuentra ninguna coincidencia, se ejecuta el
"else", si no hay parte "else" retorna "null". Finalmente se coloca
"end" para indicar que el "case" ha finalizado.

Entonces, la sintaxis es:

case
when then
...
else end

Creado por Euclides Figueroa Usando OpenOffice.org 60


SQL y MySQL Caracteristicas especiales Funcion CASE
Con el "if" solamente podemos obtener dos salidas, cuando la
condicin resulta verdadera y cuando es falsa, si queremos ms
opciones podemos usar "case". Vamos a extender el "case"
anterior para mostrar distintos mensajes:

select editorial,
case count(*)
when 1 then 1
when 2 then 2
when 3 then 3
else 'Ms de 3' end as 'cantidad'
from libros group by editorial;

Creado por Euclides Figueroa Usando OpenOffice.org 61


SQL y MySQL Caracteristicas especiales Funcion CASE
Incluso podemos agregar una clusula "order by" y ordenar la salida
por la columna "cantidad":

select editorial,
case count(*)
when 1 then 1
when 2 then 2
when 3 then 3
else 'Ms de 3' end as 'cantidad'
from libros group by editorial order by cantidad;

Creado por Euclides Figueroa Usando OpenOffice.org 62


SQL y MySQL Caracteristicas especiales Funcion CASE
Incluso podemos agregar una clusula "order by" y ordenar la salida
por la columna "cantidad":

select editorial,
case count(*)
when 1 then 1
when 2 then 2
when 3 then 3
else 'Ms de 3' end as 'cantidad'
from libros group by editorial order by cantidad;

Creado por Euclides Figueroa Usando OpenOffice.org 63


SQL y MySQL INDICES La Clave Primaria
Tambin se puede definir una clave primaria sobre una columna,
usando la palabra clave KEY o PRIMARY KEY.

Slo puede existir una clave primaria en cada tabla, y la columna


sobre la que se define una clave primaria no puede tener valores
NULL.

Si esto no se especifica de forma explcita, MySQL lo har de forma


automtica.

CREATE TABLE ciudad3 (


nombre CHAR(20) NOT NULL PRIMARY KEY,
poblacion INT NULL DEFAULT 5000);

Creado por Euclides Figueroa Usando OpenOffice.org 64


SQL y MySQL INDICES La Clave Index
El segundo tipo de ndice permite definir ndices sobre una columna,
sobre varias, o sobre columnas.

Para definir estos ndices se usan indistintamente lasopciones KEY o


INDEX.

CREATE TABLE mitabla2 (


id INT,
nombre CHAR(19),
INDEX (nombre));

Creado por Euclides Figueroa Usando OpenOffice.org 65


SQL y MySQL INDICES La Clave Index
El tercero permite definir ndices con claves nicas, tambin sobre
una columna, sobre varias o sobre partes de columnas. Para
definir ndices con claves nicas se usa la opcin UNIQUE.

La diferencia entre un ndice nico y uno normal es que en los nicos


no se permite la insercin de filas con claves repetidas.

La excepcin es el valor NULL, que s se puede repetir.

CREATE TABLE mitabla5 (


id INT,
nombre CHAR(19),
UNIQUE (nombre));

Creado por Euclides Figueroa Usando OpenOffice.org 66


SQL y MySQL INDICES La Clave FullText
MySQL soporta indexacin y bsqueda full-text. Los ndices
FULLTEXT pueden usarse slo con tablas MyISAM; pueden ser
creados desde columnas CHAR, VARCHAR, o TEXT como parte de
un comando CREATE TABLE o aadidos posteriormente usando
ALTER TABLE o CREATE INDEX.

CREATE TABLE articulos (


-> id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
-> titulo VARCHAR(200),
-> cuerpo TEXT,
-> FULLTEXT (title,body)
-> );

Creado por Euclides Figueroa Usando OpenOffice.org 67


SQL y MySQL INDICES La Clave FullText
INSERT INTO articles (titulo,cuerpo) VALUES
-> ('Tutorial MySQL','Tutorial de bases de datos MySQL ...'),
-> ('Como usar bien a MySQL','Usemos bien a MySQL ...'),
-> ('Optimizando MySQL','Aprenda como optimizar a Mysql ...'),
-> ('1001 trucos con MySQL','1. Nunca use el usuario root. 2. ...'),
-> ('MySQL vs. TuSQL','En la comparacion de las bases de
datos ...'),
-> ('Seguridad con MySQL','Temas variados de Seguridad,
MySQL ...');

Creado por Euclides Figueroa Usando OpenOffice.org 68


SQL y MySQL INDICES La Clave FullText
SELECT * FROM articulos
WHERE MATCH (titulo,cuerpo) AGAINST ('MySQL');

La funcin MATCH() realiza una bsqueda de lenguaje natural para


cadenas contra una coleccin de textos.

Una coleccin es un conjunto de una o ms columnas includas en un


ndice FULLTEXT.

La cadena de bsqueda se da como argumento para AGAINST().

Para cada registro en la tabla MATCH() retorna un valor de


relevancia, esto es, una medida de similaridad entre la cadena de
bsqueda y el texto en el registro en las columnas mencionadas
en la lista MATCH()

Creado por Euclides Figueroa Usando OpenOffice.org 69


SQL y MySQL INDICES FORANEOS
En MySQL slo existe soporte para claves forneas en tablas de tipo
InnoDB. Sin embargo, esto no impide usarlas en otros tipos de
tablas.

La diferencia consiste en que en esas tablas no se verifica si una


clave fornea existe realmente en la tabla referenciada, y que no
se eliminan filas de una tabla con una definicin de clave fornea.
Para hacer esto hay que usar tablas InnoDB.

Creado por Euclides Figueroa Usando OpenOffice.org 70


SQL y MySQL VARIABLES DEL USUARIO
Cuando buscamos un valor con las funciones de agrupamiento, por
ejemplo "max()", la consulta nos devuelve el mximo valor de un
campo de una tabla, pero no nos muestra los valores de otros
campos del mismo registro.

select max(precio) from libros;

Para obtener todos los datos del libro podemos emplear una variable
para almacenar el precio ms alto:
select @mayorprecio:=max(precio) from libros;

y luego mostrar todos los datos de dicho libro empleando la variable


anterior:
select * from libros where precio=@mayorprecio;

Es decir, guardamos en la variable el precio ms alto y luego, en otra


sentencia, mostramos los datos de todos los libros cuyo precio es
igual al valor de la variable.

Creado por Euclides Figueroa Usando OpenOffice.org 71


SQL y MySQL VARIABLES DEL USUARIO
En el ejemplo, mostramos todos los datos del libro com precio ms
alto, pero, si adems, necesitamos el nombre de la editorial
podemos emplear un "join":

select l.titulo,l.autor,e.nombre
from libros as l
join editoriales as e
on l.codigoeditorial=e.codigo
where l.precio = @mayorprecio;

Creado por Euclides Figueroa Usando OpenOffice.org 72


SQL y MySQL VARIABLES DEL USUARIO
La utilidad de las variables consiste en que almacenan valores para
utilizarlos en otras consultas.

Por ejemplo, queremos ver todos los libros de la editorial que tenga el
libro ms caro. Debemos buscar el precio ms alto y almacenarlo
en una variable, luego buscar el nombre de la editorial del libro
con el precio igual al valor de la variable y guardarlo en otra
variable, finalmente buscar todos los libros de esa editorial:

select @mayorprecio:=max(precio) from libros;

select @editorial:=e.nombre from libros as l


join editoriales as e on l.codigoeditorial=e.codigo
where precio=@mayorprecio;

select l.titulo,l.autor,e.nombre from libros as l


join editoriales as e on l.codigoeditorial=e.codigo
where e.nombre=@editorial;

Creado por Euclides Figueroa Usando OpenOffice.org 73


SQL y MySQL VARIABLES DEL USUARIO
Las variables nos permiten almacenar un valor y recuperarlo ms
adelante, de este modo se pueden usar valores en otras
sentencias.

Las variables de usuario son especficas de cada conexin, es decir,


una variable definida por un cliente no puede ser vista ni usada
por otros clientes y son liberadas automticamente al abandonar
la conexin.

Las variables de usuario comienzan con "@" (arroba) seguido del


nombre (sin espacios), dicho nombre puede contener cualquier
caracter.

Para almacenar un valor en una variable se coloca ":=" (operador de


asignacin) entre la variable y el valor a asignar.

Creado por Euclides Figueroa Usando OpenOffice.org 74


SQL y MySQL Creando Tablas
Tenemos la tabla "libros" de una librera y queremos crear una tabla
llamada "editoriales" que contenga los nombres de las
editoriales.

La tabla "libros" tiene esta estructura:

-codigo: int unsigned auto_increment,


-titulo: varchar(40) not null,
-autor: varchar(30),
-editorial: varchar(20) not null,
-precio: decimal(5,2) unsigned,
-clave primaria: codigo.

La tabla "editoriales", que no existe, debe tener la siguiente


estructura:

-nombre: nombre de la editorial.

La tabla libros contiene varios registros.


Creado por Euclides Figueroa Usando OpenOffice.org 75
SQL y MySQL Creando Tablas
Podemos crear la tabla "editoriales" con los campos necesarios
consultando la tabla "libros" y en el mismo momento insertar la
informacin:

create table editoriales


select distinct editorial as nombre
from libros;

La tabla "editoriales" se ha creado con el campo llamado "nombre"


seleccionado del campo "editorial" de "libros".

Creado por Euclides Figueroa Usando OpenOffice.org 76


SQL y MySQL Creando Tablas
Tambin podemos crear una tabla a partir de una consulta cargando
los campos con los valores de otra tabla y una columna
calculada. Veamos un ejemplo.

Tenemos la misma tabla "libros" y queremos crear una tabla llamada


"librosporeditorial" que contenga la cantidad de libros de cada
editorial.

La tabla "cantidadporeditorial", que no est creada, debe tener la


siguiente estructura:

-nombre: nombre de la editorial,


-cantidad: cantidad de libros.

Creado por Euclides Figueroa Usando OpenOffice.org 77


SQL y MySQL Creando Tablas
Podemos crear la tabla "cantidadporeditorial" con los campos
necesarios consultando la tabla "libros" y en el mismo momento
insertar la informacin:

create table cantidadporeditorial


select editorial as nombre,count(*) as cantidad
from libros
group by editorial;

La tabla "cantidadporeditorial" se ha creado con el campo llamado


"nombre" seleccionado del campo "editorial" de "libros" y con el
campo "cantidad" con el valor calculado con count() de la tabla
"libros"

Creado por Euclides Figueroa Usando OpenOffice.org 78


SQL y MySQL Insertando Registros
La tabla "libros" tiene la siguiente estructura:

-codigo: int unsigned auto_increment,


-titulo: varchar(40) not null,
-autor: varchar(30),
-codigoeditorial: tinyint unsigned,
-precio: decimal(5,2) unsigned,
-clave primaria: codigo.

La tabla "editoriales" tiene la siguiente estructura:

-codigo: tinyint unsigned auto_increment,


-nombre: varchar(20),
-domicilio: varchar(30),
-clave primaria: codigo.

Creado por Euclides Figueroa Usando OpenOffice.org 79


SQL y MySQL Insertando Registros
Ambas tablas contienen registros. La tabla "editoriales" contiene los
siguientes registros:

1,Planeta,San Martin 222,


2,Emece,San Martin 590,
3,Paidos,Colon 245.

Queremos ingresar en "libros", el siguiente libro: Harry Potter y la


piedra filosofal, J.K. Rowling, Emece, 45.90.

Ahhh.... pero no recordamos el cdigo de la editorial "Emece".

Creado por Euclides Figueroa Usando OpenOffice.org 80


SQL y MySQL Insertando Registros
Podemos realizar la consulta del cdigo de la editorial al momento de
la insercin:

insert into libros (titulo,autor,codigoeditorial,precio)


select 'Harry Potter y la camara secreta','J.K.Rowling',codigo,45.90
from editoriales
where nombre='Emece';

Entonces, para realizar una insercin y al mismo tiempo consultar un


valor en otra tabla, colocamos "insert into" junto al nombre de la
tabla ("libros") y los campos a insertar y luego un "select" en el
cual disponemos todos los valores, excepto el valor que
desconocemos, en su lugar colocamos el nombre del campo a
consultar ("codigo"), luego se contina con la consulta indicando
la tabla de la cual extraemos el cdigo ("editoriales") y la
condicin, en la cual damos el "nombre" de la editorial para que
localice el cdigo correspondiente.

El registro se cargar con el valor de cdigo de la editorial "Emece"


Creado por Euclides Figueroa Usando OpenOffice.org 81
SQL y MySQL Insertando Registros
Si la consulta no devuelve ningn valor, porque buscamos el cdigo
de una editorial que no existe en la tabla "editoriales", aparece
un mensaje indicando que no se ingres ningn registro. Por
ejemplo:

insert into libros (titulo,autor,codigoeditorial,precio)


select 'Cervantes y el quijote','Borges',codigo,35
from editoriales
where nombre='Plaza & Janes';

Hay que tener cuidado al establecer la condicin en la consulta, el


"insert" ingresar tantos registros como filas retorne la consulta.
Si la consulta devuelve 2 filas, se insertarn 2 filas en el "insert".
Por ello, el valor de la condicin (o condiciones), por el cual se
busca, debe retornar un slo registro.

Creado por Euclides Figueroa Usando OpenOffice.org 82


SQL y MySQL Insertando Registros
Tenemos las tabla "libros" y "editoriales", que contienen registros, y
la tabla "cantidadporeditorial", que no contiene registros.

La tabla "cantidadporeditorial":

-nombre: varchar(20),
-cantidad: smallint unsigned.

Queremos insertar registros en la tabla "cantidadporeditorial", los


nombres de las distintas editoriales de las cuales tenemos libros
y la cantidad de libros de cada una de ellas.

Creado por Euclides Figueroa Usando OpenOffice.org 83


SQL y MySQL Insertando Registros
1 paso: consultar con un "join" los nombres de las distintas
editoriales de "libros" y la cantidad:

select e.nombre,count(l.codigoeditorial)
from editoriales as e
left join libros as l on e.codigo=l.codigoeditorial
group by e.nombre;

obteniendo una salida como la siguiente:

editorial cantidad
Emece 3
Paidos 1
Planeta 1
Plaza & Janes 0

2 paso: insertar los registros uno a uno en la tabla


"cantidadporeditorial"

Creado por Euclides Figueroa Usando OpenOffice.org 84


SQL y MySQL Insertando Registros
O podemos lograrlo en un solo paso, realizando el "insert" y el
"select" en una misma sentencia:

insert into cantidadporeditorial


select e.nombre,count(l.codigoeditorial)
from editoriales as e
left join libros as l
on e.codigo=l.codigoeditorial
group by e.nombre;

Entonces, se puede insertar registros en una tabla con la salida


devuelta por una consulta que incluya un "join" o un "left join";
para ello escribimos la consulta y le anteponemos "insert into", el
nombre de la tabla en la cual ingresaremos los registros y los
campos que se cargarn (si se ingresan todos los campos no es
necesario listarlos).

Creado por Euclides Figueroa Usando OpenOffice.org 85


SQL y MySQL Actualizando Registros
Tenemos la tabla "libros" en la cual almacenamos los datos de los
libros de nuestra biblioteca y la tabla "editoriales" que almacena
el nombre de las distintas editoriales y sus cdigos.

La tabla "libros" tiene la siguiente estructura:

-codigo: int unsigned auto_increment,


-titulo: varchar(30),
-autor: varchar(30),
-codigoeditorial: tinyint unsigned,
-clave primaria: codigo.

La tabla "editoriales" tiene esta estructura:

-codigo: tinyint unsigned auto_increment,


-nombre: varchar(20),
-clave primaria: codigo.

Creado por Euclides Figueroa Usando OpenOffice.org 86


SQL y MySQL Actualizando Registros
Queremos unir los datos de ambas tablas en una sola: "libros", es
decir, alterar la tabla "libros" para que almacene el nombre de la
editorial y eliminar la tabla "editoriales".

En primer lugar debemos alterar la tabla "libros", vamos a agregarle


un campo llamado "editorial" en el cual guardaremos el nombre
de la editorial.

alter table libros add editorial varchar(20);

La tabla "libros" contiene un nuevo campo "editorial" con todos los


registros con valor "null".

Ahora debemos actualizar los valores para ese campo.

Creado por Euclides Figueroa Usando OpenOffice.org 87


SQL y MySQL Actualizando Registros
Podemos hacerlo en 2 pasos:

1 paso: consultamos los cdigos de las editoriales:

select codigo,nombre from editoriales;

obtenemos una salida similar a la siguiente:

codigo nombre
1 Planeta
2 Emece
3 Paidos

2 paso: comenzamos a actualizar el campo "editorial" de los


registros de "libros" uno a uno:

update libros set editorial='Planeta' where codigoeditorial=1;

Creado por Euclides Figueroa Usando OpenOffice.org 88


SQL y MySQL Actualizando Registros
Podemos simplificar la tarea actualizando el campo "editorial" de
todos los registros de la tabla "libros" al mismo tiempo que
realizamos el "join" (paso 1 y 2 en una sola sentencia):

update libros
join editoriales
on libros.codigoeditorial=editoriales.codigo
set libros.editorial=editoriales.nombre;

Luego, eliminamos el campo "codigoeditorial" de "libros" con "alter


table" y la tabla "editoriales" con "drop table".

Entonces, se puede actualizar una tabla con valores de otra tabla. Se


coloca "update" junto al nombre de la tabla a actualizar, luego se
realiza el "join" y el campo por el cual se enlazan las tablas y
finalmente se especifica con "set" el campo a actualizar y su
nuevo valor, que es el campo de la otra tabla con la cual se
enlaz.

Creado por Euclides Figueroa Usando OpenOffice.org 89


SQL y MySQL Actualizando Registros
Tenemos la tabla "libros" en la cual almacenamos los datos de los
libros de nuestra biblioteca y la tabla "editoriales" que almacena
el nombre de las distintas editoriales y sus cdigos.

Queremos modificar el cdigo de la editorial "Emece" a "9" y tambin


todos los "codigoeditorial" de los libros de dicha editorial.

podemos hacerlo en una sola sentencia:

update libros as l
join editoriales as e
on l.codigoeditorial=e.codigo
set l.codigoeditorial=9, e.codigo=9
where e.nombre='Emece';

El cambio se realiz en ambas tablas.

Creado por Euclides Figueroa Usando OpenOffice.org 90


SQL y MySQL Eliminando Registros
Queremos eliminar todos los libros de la editorial "Emece" pero no
recordamos el cdigo de dicha editorial.

Podemos realizar todo en un solo paso:

delete libros
from libros
join editoriales
on libros.codigoeditorial=editoriales.codigo
where editoriales.nombre='Emece';

Es decir, usamos "delete" junto al nombre de la tabla de la cual


queremos eliminar registros, luego realizamos el "join"
correspondiente nombrando las tablas involucradas y agregamos
la condicin "where"

Creado por Euclides Figueroa Usando OpenOffice.org 91


SQL y MySQL Eliminando Registros
Queremos eliminar todos los libros cuyo cdigo de editorial no exista
en la tabla "editoriales".

Podemos realizar la elimincin en el mismo momento que realizamos


el "left join":

delete libros
FROM libros
left join editoriales
on libros.codigoeditorial=editoriales.codigo
where editoriales.codigo is null;

Es decir, usamos "delete" junto al nombre de la tabla de la cual


queremos eliminar registros, luego realizamos el "left join"
correspondiente nombrando las tablas involucradas y agregamos
la condicin "where" para que seleccione solamente los libros
cuyo cdigo de editorial no se encuentre en "editoriales".

Creado por Euclides Figueroa Usando OpenOffice.org 92


SQL y MySQL Eliminando Registros
Ahora queremos eliminar todas las editoriales de las cuales no haya
libros:

delete editoriales
from editoriales
left join libros
on libros.codigoeditorial=editoriales.codigo
where libros.codigo is null;

Creado por Euclides Figueroa Usando OpenOffice.org 93


SQL y MySQL Encriptacion de Datos Encode y Decode
Con "encode" se encripta una cadena. La funcin recibe 2
argumentos: el primero, la cadena a encriptar; el segundo, una
cadena usada como contrasea para luego desencriptar:

select encode('feliz','dia');

El resultado es una cadena binaria de la misma longitud que el


primer argumento.

Con "decode" desencriptamos una cadena encriptada con "encode".


Esta funcin recibe 2 argumentos: el primero, la cadena a
desencriptar; el segundo, la contrasea:

select decode('7','dia');

Si la cadena de contrasea es diferente a la ingresada al encriptar, el


resultado ser incorrecto.

Creado por Euclides Figueroa Usando OpenOffice.org 94


SQL y MySQL Encriptacion de Datos Encode y Decode
Podemos ingresar registros encriptando la clave:

insert into usuarios values ('Mario Perez',encode('Mariito','octubre'));

La forma ms segura es no transferir la contrasea a travs de la


conexin, para ello podemos almacenar la clave en una variable y
luego insertar la clave encriptada:

select @clave:=encode('Barcelona','ganador');
insert into usuarios values ('Maria Garcia',@clave);

Veamos los registros ingresados:

select * from usuarios;

Creado por Euclides Figueroa Usando OpenOffice.org 95


SQL y MySQL Encriptacion de Datos Encode y Decode
Desencriptamos la clave del usuario "MarioPerez":

select decode(clave,'octubre') from usuarios


where nombre='Mario Perez';

Desencriptamos la clave del usuario "MariaGarcia":

select decode(clave,'ganador') from usuarios


where nombre='Maria Garcia';

Creado por Euclides Figueroa Usando OpenOffice.org 96


Sistema de privilegios
En MySQL existen cinco niveles distintos de privilegios:

Globales: se aplican al conjunto de todas las bases de datos en un


servidor. Es el nivel ms alto de privilegio, en el sentido de que su
mbito es el ms general.

De base de datos: se refieren a bases de datos individuales, y por


extensin, a todos los objetos que contiene cada base de datos.

De tabla: se aplican a tablas individuales, y por lo tanto, a todas las


columnas de esa tabla.

De columna: se aplican a una columna en una tabla concreta.

De rutina: se aplican a los procedimientos almacenados. An no


hemos visto nada sobre este tema, pero en MySQL se pueden
almacenar procedimientos consistentes en varias consultas SQL.

Creado por Euclides Figueroa Usando OpenOffice.org 97


Sistema de privilegios
Para crear un usuario sin privilegios usaremos la sentencia:

GRANT USAGE ON *.* TO anonimo IDENTIFIED BY 'clave';

Hay que tener en cuenta que la constrasea se debe introducir entre


comillas de forma obligatoria.

Un usuario 'anonimo' podr abrir una sesin MySQL mediante una


orden:

mysql -h localhost -u anonimo -p

Pero no podr hacer mucho ms, ya que no tiene privilegios. No


tendr, por ejemplo, oportunidad de hacer selecciones de datos,
de crear bases de datos o tablas, insertar datos, etc.
Creado por Euclides Figueroa Usando OpenOffice.org 98
Sistema de privilegios
Para que un usuario pueda hacer algo ms que consultar algunas
variables del sistema debe tener algn privilegio. Lo ms simple
es conceder el privilegio para seleccionar datos de una tabla
concreta. Esto se hara as:

La misma sentencia GRANT se usa para aadir privilegios a un


usuario existente.

GRANT SELECT ON world.Country TO anonimo;

Concede al usuario 'anonimo' el privilegio de ejecutar sentencias


SELECT sobre la tabla 'Country' de la base de datos 'world'.

Creado por Euclides Figueroa Usando OpenOffice.org 99


Sistema de privilegios
Un usuario que abra una sesin y se identifique como 'anonimo'
podr ejecutar estas sentencias:

mysql> SHOW DATABASES;


+----------+
| Database |
+----------+
| world |
+----------+
1 row in set (0.01 sec)
mysql> USE prueba;
Database changed
mysql> SHOW TABLES;
+------------------+
| Tables_in_word |
+------------------+
| Country |
+------------------+
1 row in set (0.00 sec)

Creado por Euclides Figueroa Usando OpenOffice.org 100


Sistema de privilegios
Para conceder privilegios globales se usa ON *.*, para indicar que los
privilegios se conceden en todas las tablas de todas las bases de
datos.

Para conceder privilegios en bases de datos se usa ON nombre_db.*,


indicando que los privilegios se conceden sobre todas las tablas
de la base de datos 'nombre_db'.

Usando ON nombre_db.nombre_tabla, concedemos privilegios de


nivel de tabla para la tabla y base de datos especificada.

En cuanto a los privilegios de columna, para concederlos se usa la


sintaxis tipo_privilegio (lista_de_columnas), [tipo_privilegio
(lista_de_columnas)].

Creado por Euclides Figueroa Usando OpenOffice.org 101


Sistema de privilegios
Otros privilegios que se pueden conceder son:

l ALL: para conceder todos los privilegios.


l CREATE: permite crear nuevas tablas.
l DELETE: permite usar la sentencia DELETE.
l DROP: permite borrar tablas.
l INSERT: permite insertar datos en tablas.
l UPDATE: permite usar la sentencia UPDATE.

Podemos conceder varios privilegios en una nica sentencia. Por


ejemplo:

GRANT SELECT, UPDATE ON world.Country TO anonimo IDENTIFIED


BY 'clave';

Para ver una lista de todos los privilegios existentes consultar la


sintaxis de la sentencia GRANT.

Creado por Euclides Figueroa Usando OpenOffice.org 102


Sistema de privilegios
Podemos ver qu privilegios se han concedido a un usuario mediante
la sentencia SHOW GRANTS.

La salida de esta sentencia es una lista de sentencias GRANT que se


deben ejecutar para conceder los privilegios que tiene el usuario.

mysql> SHOW GRANTS FOR anonimo;


+--------------------------------------------------------+
| Grants for anonimo@% |
+--------------------------------------------------------+
| GRANT USAGE ON *.* TO 'anonimo'@'%' IDENTIFIED BY
PASSWORD '*5...' |
| GRANT SELECT ON `world`.`Country` TO 'anonimo'@'%' |
+--------------------------------------------------------+
2 rows in set (0.00 sec)
mysql>

Creado por Euclides Figueroa Usando OpenOffice.org 103


Sistema de privilegios
Como podemos ver por la salida de la sentencia SHOW GRANTS, el
nombre de usuario no se limita a un nombre simple, sino que
tiene dos partes. La primera consiste en un nombre de usuario,
en nuestro ejemplo 'anonimo'.

La segunda parte, que aparece separada de la primera por el


carcter '@' es un nombre de mquina (host).

Este nombre puede ser bien el de una mquina, por ejemplo,


'localhost' para referirse al computador local, o cualquier otro
nombre, o bien una ip.

| GRANT USAGE ON *.* TO 'anonimo'@'%' IDENTIFIED BY


PASSWORD '*5...' |
| GRANT SELECT ON `world`.`Country` TO 'anonimo'@'%' |

Creado por Euclides Figueroa Usando OpenOffice.org 104


Sistema de privilegios

Si creamos un usuario para una mquina o conjunto de mquinas


determinado, ese usuario no podr conectar desde otras
mquinas.

En el siguiente ejemplo, Un usuario que se identifique como


'anonimo' slo podr entrar desde el mismo computador donde
se est ejecutando el servidor.

mysql> GRANT USAGE ON * TO anonimo@localhost IDENTIFIED BY


'clave';
Query OK, 0 rows affected (0.00 sec)I

Creado por Euclides Figueroa Usando OpenOffice.org 105


Sistema de privilegios

Como norma debemos recodar que para eliminar el usuario primero


hay que revocar todos sus privilegios
mysql> SHOW GRANTS FOR anonimo;
+-------------------------------------------------------+
| Grants for anonimo@% |
+-------------------------------------------------------+
| GRANT USAGE ON *.* TO 'anonimo'@'%' IDENTIFIED BY
PASSWORD '*5...' |
| GRANT SELECT ON `world`.`Country` TO 'anonimo'@'%' |
+-------------------------------------------------------+
2 rows in set (0.00 sec)
mysql> REVOKE SELECT ON prueba.gente FROM anonimo;
Query OK, 0 rows affected (0.00 sec)
mysql> DROP USER anonimo;
Query OK, 0 rows affected (0.00 sec)
mysql>

Creado por Euclides Figueroa Usando OpenOffice.org 106


SQL y MySQL VISTAS
Esta sentencia crea una vista nueva o reemplaza una existente si se
incluye la clusula OR REPLACE. La sentencia_select es una
sentencia SELECT 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 CREATE VIEW para la vista, y algn


privilegio en cada columna seleccionada por la sentencia SELECT.
Para columnas incluidas en otra parte de la sentencia SELECT
debe poseer el privilegio SELECT. Si est presente la clusula OR
REPLACE, tambin deber tenerse el privilegio DELETE para la
vista.

mysql> CREATE VIEW MiVista AS SELECT * FROM Country;

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.

Creado por Euclides Figueroa Usando OpenOffice.org 107


SQL y MySQL VISTAS
Las columnas devueltas por la sentencia SELECT pueden ser
simples referencias a columnas de la tabla, pero tambien pueden
ser expresiones conteniendo funciones, constantes, operadores,
etc.

Las vistas pueden crearse a partir de varios tipos de sentencias


SELECT. Pueden hacer referencia a tablas o a otras vistas.
Pueden usar combinaciones, UNION, y subconsultas. El SELECT
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:

CREATE VIEW V_Country AS SELECT Name, Region, Population*1.20


AS Aumento FROM Country;
mysql> SELECT * FROM V_Country;

Creado por Euclides Figueroa Usando OpenOffice.org 108


SQL y MySQL VISTAS
La definicin de una vista est sujeta a las siguientes limitaciones:

La sentencia SELECT no puede contener una subconsulta en su


clusula FROM.
La sentencia SELECT no puede hacer referencia a variables del
sistema o del usuario.
La sentencia SELECT 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 CHECK TABLE.
La definicin no puede hacer referencia a una tabla TEMPORARY, y
tampoco se puede crear una vista TEMPORARY.
Las tablas mencionadas en la definicin de la vista deben existir
siempre.
Creado por Euclides Figueroa Usando OpenOffice.org 109
SQL y MySQL TRANSACCIONES
Por defecto, MySQL se ejecuta con el modo autocommit activado.
Esto significa que en cuanto ejecute un comando que actualice
(modifique) una tabla, MySQL almacena la actualizacin en disco.

Si usa tablas transaccionales (como InnoDB o BDB), puede desactivar


el modo autocommit con el siguiente comando:
SET AUTOCOMMIT=0;

Tras deshabilitar el modo autocommit poniendo la variable


AUTOCOMMIT a cero, debe usar COMMIT para almacenar los
cambios en disco o ROLLBACK si quiere ignorar los cambios
hechos desde el comienzo de la transaccin.

Creado por Euclides Figueroa Usando OpenOffice.org 110


SQL y MySQL TRANSACCIONES
Si quiere deshabilitar el modo autocommit para una serie nica de
comandos, puede usar el comando START TRANSACTION:

START TRANSACTION;

SELECT @A:=SUM(salario) FROM table1 WHERE tipo=1;


UPDATE table2 SET suma=@A WHERE tipo=1;

COMMIT;

Con START TRANSACTION, autocommit permanece deshabilitado


hasta el final de la transaccin con COMMIT o ROLLBACK. El modo
autocommit vuelve a su estado prvio.

Creado por Euclides Figueroa Usando OpenOffice.org 111


SQL y MySQL TRANSACCIONES
MySQL soporta los comandos SQL SAVEPOINT y ROLLBACK TO
SAVEPOINT.

El comando SAVEPOINT crea un punto dentro de una transaccin con


un nombre {identifier}. Si la transaccin actual tiene un punto
con el mismo nombre, el antiguo se borra y se crea el nuevo.

El comando ROLLBACK TO SAVEPOINT deshace una transaccin


hasta el punto nombrado. Las modificaciones que la transaccin
actual hace al registro tras el punto se deshacen en el rollback,
pero InnoDB no libera los bloqueos de registro que se
almacenaron en memoria tras el punto. Los puntos creados tras
el punto nombrado se borran.

(Tenga en cuenta que para un nuevo registro insertado, la


informacin de bloqueo se realiza a partir del ID de transaccin
almacenado en el registro; el bloqueo no se almacena
separadamente en memoria. En este caso, el bloqueo de registro
se libera al deshacerse todo.)
Creado por Euclides Figueroa Usando OpenOffice.org 112
SQL y MySQL TRANSACCIONES
Sintaxis

SAVEPOINT identifier
ROLLBACK TO SAVEPOINT identifier

Si un comando retorna el siguiente error, significa que no existe


ningn punto con el nombre especificado:

ERROR 1181: Got error 153 during ROLLBACK

Todos los puntos de la transaccin actual se borran si ejecuta un


COMMIT, o un ROLLBACK que no nombre ningn punto.

Creado por Euclides Figueroa Usando OpenOffice.org 113


SQL y MySQL LOCKS
La razn principal para usar LOCK TABLES es para emular
transacciones o para obtener ms velocidad al actualizar tablas.
Esto se explica con ms detalle posteriormente.

Si un flujo obtiene un bloqueo READ en una tabla, ese flujo (y todos


los otros) slo pueden leer de la tabla. Si un flujo obtiene un
bloqueo WRITE en una tabla, slo el flujo con el bloqueo puede
escribir a la tabla. El resto de flujos se bloquean hasta que se
libera el bloqueo.

La diferencia entre READ LOCAL y READ es que READ LOCAL permite


comandos INSERT no conflictivos (inserciones concurrentes) se
ejecuten mientras se mantiene el bloqueo. Sin embargo, esto no
puede usarse si va a manipular los ficheros de base de datos
fuera de MySQL mientras mantiene el bloqueo. Para tablas
InnoDB , READ LOCAL esencialmente no hace nada: No bloquea la
tabla. Para tablas InnoDB , el uso de READ LOCAL est obsoleto
ya que una SELECT consistente hace lo mismo, y no se necesitan
bloqueos.
Creado por Euclides Figueroa Usando OpenOffice.org 114
SQL y MySQL LOCKS
LOCK TABLES funciona como sigue:

1. Ordena todas las tablas a ser bloqueadas en un orden definido


internamente. Desde el punto de vista del usuario, este orden es
indefinido.

2. Si una tabla se bloquea con bloqueo de lectura y escritura, pone


el bloqueo de escritura antes del de lectura.

3. Bloquea una tabla a la vez hasta que la sesin obtiene todos los
bloqueos.

Creado por Euclides Figueroa Usando OpenOffice.org 115


SQL y MySQL LOCKS
Esta poltica asegura un bloqueo de tablas libre de deadlocks. Sin
embargo hay otros puntos que debe tener en cuenta respecto a
esta poltica:

Si est usando un bloqueo LOW_PRIORITY WRITE para una tabla, slo


significa que MySQL espera para este bloqueo hasta que no haya
flujos que quieren un bloqueo READ . Cuando el flujo ha obtenido
el bloqueo WRITE y est esperando para obtener un bloqueo para
la siguiente tabla en la lista, todos los otros flujos esperan hasta
que el bloqueo WRITE se libera. Si esto es un problema con su
aplicacin, debe considerar convertir algunas de sus tablas a
transaccionales.

Creado por Euclides Figueroa Usando OpenOffice.org 116


SQL y MySQL LOCKS
LOCK TABLES
tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}
[, tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}] ...
UNLOCK TABLES

LOCK TABLES bloquea tablas para el flujo actual. Si alguna de las


tablas la bloquea otro flujo, bloquea hasta que pueden adquirirse
todos los bloqueos. UNLOCK TABLES libera cualquier bloqueo
realizado por el flujo actual. Todas las tablas bloqueadas por el
flujo actual se liberan implcitamente cuando el flujo reliza otro
LOCK TABLES, o cuando la conexin con el servidor se cierra.

Un bloqueo de tabla protege slo contra lecturas inapropiadas o


escrituras de otros clientes. El cliente que tenga el bloqueo,
incluso un bloqueo de lectura, puede realizar operaciones a nivel
de tabla tales como DROP TABLE.

Creado por Euclides Figueroa Usando OpenOffice.org 117


SQL y MySQL LOCKS
Tenga en cuenta lo siguiente a pesar del uso de LOCK TABLES con
tablas transaccionales:

LOCK TABLES no es una operacin transaccional y hace un commit


implcito de cualquier transaccin activa antes de tratar de
bloquear las tablas.

Tambin, comenzar una transaccin (por ejemplo, con START


TRANSACTION) realiza un UNLOCK TABLES implcito.

No debe tener AUTOCOMMIT = 1, porque entonces InnoDB libera su


bloqueo de tabla inmediatamente tras la llamada de LOCK
TABLES, y los deadlocks pueden ocurrir fcilmente.

ROLLBACK no libera bloqueos de tablas no transaccionales de


MySQL.

Creado por Euclides Figueroa Usando OpenOffice.org 118


SQL y MySQL LOCKS
La forma correcta de usar LOCK TABLES con tablas
transaccionales,como InnoDB, es poner AUTOCOMMIT = 0 y no
llamar a UNLOCK TABLES hasta que hace un commit de la
transaccin explcitamente.

Cuando llama a LOCK TABLES, InnoDB internamente realiza su propio


bloqueo de tabla, y MySQL realiza su propio bloqueo de tabla.
InnoDB libera su bloqueo de tabla en el siguiente commit, pero
para que MySQL libere su bloqueo de tabla, debe llamar a
UNLOCK TABLES.

Creado por Euclides Figueroa Usando OpenOffice.org 119


SQL y PROCEDIMIENTOS
Los procedimientos almacenados y funciones son nuevas
funcionalidades de la versin de MySQL 5.0. Un procedimiento
almacenado es un conjunto de comandos SQL que pueden
almacenarse en el servidor. Una vez que se hace, los clientes no
necesitan relanzar los comandos individuales pero pueden en su
lugar referirse al procedimiento almacenado.

Algunas situaciones en que los procedimientos almacenados pueden


ser particularmente tiles:

* Cuando mltiples aplicaciones cliente se escriben en distintos


lenguajes o funcionan en distintas plataformas, pero necesitan
realizar la misma operacin en la base de datos.

Creado por Euclides Figueroa Usando OpenOffice.org 120


SQL y PROCEDIMIENTOS
Los procedimientos almacenados le permiten tener bibliotecas o
funciones en el servidor de base de datos. Esta caracterstica es
compartida por los lenguajes de programacin modernos que
permiten este diseo interno, por ejemplo, usando clases. Usando
estas caractersticas del lenguaje de programacin cliente es
beneficioso para el programador incluso fuera del entorno de la
base de datos.

MySQL sigue la sintaxis SQL:2003 para procedimientos almacenados,


que tambin usa IBM DB2.

La implementacin de MySQL de procedimientos almacenados est


en progreso.

Creado por Euclides Figueroa Usando OpenOffice.org 121


SQL y PROCEDIMIENTOS
CREATE PROCEDURE sp_name ([parameter[,...]])
[characteristic ...] routine_body

CREATE FUNCTION sp_name ([parameter[,...]])


RETURNS type
[characteristic ...] routine_body

parameter:
[ IN | OUT | INOUT ] param_name type

Creado por Euclides Figueroa Usando OpenOffice.org 122


SQL y PROCEDIMIENTOS
tipo:
Cualquier tipo de dato valido de MySQL

caracteristicas:
LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL
DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'

Cuerpo de la Rutina:
procedimientos almacenados o comandos SQL vlidos

Creado por Euclides Figueroa Usando OpenOffice.org 123


SQL y PROCEDIMIENTOS
caracteristicas:
LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL
DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'

CONTAINS SQL indica que la rutina no contiene comandos que leen o


escriben datos.
NO SQL indica que la rutina no contiene comandos SQL .
READS SQL DATA indica que la rutina contiene comandos que leen
datos, pero no comandos que escriben datos.
MODIFIES SQL DATA indica que la rutina contiene comandos que
pueden escribir datos.
CONTAINS SQL es el valor por defecto si no se dan explcitamente
ninguna de estas caractersticas.

Creado por Euclides Figueroa Usando OpenOffice.org 124


SQL y PROCEDIMIENTOS
caracteristicas:
LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL
DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'

SQL SECURITY 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 DEFINER. 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. Desde MySQL
5.0.3, es necesario tener el permiso EXECUTE para ser capaz de
ejecutar la rutina. El usuario que debe tener este permiso es el
definidor o el invocador, en funcin de cmo la caracterstica SQL
SECURITY .

Creado por Euclides Figueroa Usando OpenOffice.org 125


SQL y PROCEDIMIENTOS
DELIMITER |

CREATE PROCEDURE autos(IN velocidad int,IN marca varchar(50))


BEGIN

IF velocidad < 120 then


INSERT INTO familiares VALUES(velocidad,marca);
ELSE
INSERT INTO deportivos VALUES(velocidad,marca);
END IF;

END;

|
DELIMITER ;

Creado por Euclides Figueroa Usando OpenOffice.org 126


SQL y PROCEDIMIENTOS
* Cuando la seguridad es muy importante. Los bancos, por
ejemplo, usan procedimientos almacenados para todas las
operaciones comunes. Esto proporciona un entorno seguro y
consistente, y los procedimientos pueden asegurar que cada
operacin se loguea apropiadamente. En tal entorno, las
aplicaciones y los usuarios no obtendran ningn acceso directo a
las tablas de la base de datos, slo pueden ejectuar algunos
procedimientos almacenados.

Los procedimientos almacenados pueden mejorar el rendimiento ya


que se necesita enviar menos informacin entre el servidor y el
cliente. El intercambio que hay es que aumenta la carga del
servidor de la base de datos ya que la mayora del trabajo se
realiza en la parte del servidor y no en el cliente. Considere esto
si muchas mquinas cliente (como servidores Web) se sirven a
slo uno o pocos servidores de bases de datos.

Creado por Euclides Figueroa Usando OpenOffice.org 127


SQL y PROCEDIMIENTOS

Sentencia IF
IF evaluacion THEN Sentencias
[ELSEIF evaluacion THEN Sentencias] ...
[ELSE Sentencias]
END IF

IF implementa un constructor condicional bsico. Si evaluacion se


evala a cierto, el comando SQL correspondiente listado se
efectua. Si no coincide ninguna evaluacion se ejecuta el comando
listado en la clusula ELSE. Sentencias puede consistir en varios
comandos.

Creado por Euclides Figueroa Usando OpenOffice.org 128


SQL y PROCEDIMIENTOS

Sentencia CASE
CASE
WHEN Evaluacion THEN Sentencias
[WHEN Evaluacion THEN Sentencias] ...
[ELSE Sentencias]
END CASE

El comando CASE para procedimientos almacenados implementa un


constructor condicional complejo. Si una Evaluacion se evala a
cierto, el comando SQL correspondiente se ejecuta. Si no coincide
ninguna condicin de bsqueda, el comando en la clusula ELSE
se ejecuta.

Creado por Euclides Figueroa Usando OpenOffice.org 129


SQL y PROCEDIMIENTOS

Sentencia LOOP
[begin_label:] LOOP
Sentencias
END LOOP [end_label]

LOOP 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 LEAVE .

Un comando LOOP puede etiquetarse. end_label no puede darse


hasta que est presente begin_label , y si ambos lo estn, deben
ser el mismo.

Creado por Euclides Figueroa Usando OpenOffice.org 130


SQL y PROCEDIMIENTOS

Sentencia WHILE
[begin_label:] WHILE Evaluacion DO
Sentencias
END WHILE [end_label]

WHILE Evaluacion DO
Sentencias
END WHILE

El comando/s dentro de un comando WHILE se repite mientras la


condicin Evaluacion es cierta.

Creado por Euclides Figueroa Usando OpenOffice.org 131


SQL y PROCEDIMIENTOS

Sentencia SELECT...INTO
SELECT ... INTO

SELECT col_name[,...] INTO var_name[,...] table_expr

Esta sintaxis SELECT 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;

Creado por Euclides Figueroa Usando OpenOffice.org 132


SQL y PROCEDIMIENTOS

CURSORES
Mysql soporta 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.

Creado por Euclides Figueroa Usando OpenOffice.org 133


SQL y PROCEDIMIENTOS

CURSORES
OPEN cursor_name
Este comando abre un cursor declarado prviamente.

FETCH cursor_name INTO var_name [, var_name] ...


Este comando trata el siguiente registro (si existe) usando el cursor
abierto que se especifique, y avanza el puntero del cursor.
Si no existen ms registros disponibles, ocurrir una condicin de Sin
Datos con el valor SQLSTATE 02000. Puede configurar un
manejador (handler) para detectar esta condicin (o para una
condicin NOT FOUND)

CLOSE cursor_name
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.
Creado por Euclides Figueroa Usando OpenOffice.org 134
SQL y PROCEDIMIENTOS
CREATE PROCEDURE cursores()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE Var_a CHAR(16);
DECLARE Var_b,Var_c INT;
DECLARE cursor1 CURSOR FOR SELECT Name, Region FROM
world.Country;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

OPEN cursor1;

REPEAT
FETCH cursor1 INTO Var_a, Var_b;
IF NOT done THEN
INSERT INTO world.tablaresultado VALUES (Var_a,Var_b);
END IF;
UNTIL done END REPEAT;

CLOSE cursor1;
END
Creado por Euclides Figueroa Usando OpenOffice.org 135
SQL y PROCEDIMIENTOS

Disparadores (Triggers)
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 nombre_tabla. Esta debe ser


una tabla permanente, no puede ser una tabla TEMPORARY ni
una vista.

CREATE TRIGGER nombre_disp momento_disp evento_disp


ON nombre_tabla FOR EACH ROW sentencia_disp

Creado por Euclides Figueroa Usando OpenOffice.org 136


SQL y PROCEDIMIENTOS

Disparadores (Triggers)
momento_disp es el momento en que el disparador entra en accin.
Puede ser BEFORE (antes) o AFTER (despues), para indicar que el
disparador se ejecute antes o despus que la sentencia que lo
activa.

evento_disp indica la clase de sentencia que activa al disparador.


Puede ser INSERT, UPDATE, o DELETE. Por ejemplo, un disparador
BEFORE para sentencias INSERT 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 BEFORE UPDATE. Pero s es
posible tener los disparadores BEFORE UPDATE y BEFORE INSERT
o BEFORE UPDATE y AFTER UPDATE.

Creado por Euclides Figueroa Usando OpenOffice.org 137


SQL y PROCEDIMIENTOS

Disparadores (Triggers)
sentencia_disp es la sentencia que se ejecuta cuando se activa el
disparador.

Si se desean ejecutar mltiples sentencias, deben colocarse entre


BEGIN ... END, el constructor de sentencias compuestas.

Esto adems posibilita emplear las mismas sentencias permitidas en


rutinas almacenadas.

Creado por Euclides Figueroa Usando OpenOffice.org 138


SQL y PROCEDIMIENTOS

Disparadores (Triggers)
CREATE TRIGGER check_deposito BEFORE UPDATE ON cuentas
FOR EACH ROW
BEGIN
IF NEW.deposito < 0 THEN
SET NEW.deposito = 0;
ELSEIF NEW.deposito > 100000 THEN
SET NEW.deposito = 100000;
END IF;
END;

Creado por Euclides Figueroa Usando OpenOffice.org 139