Вы находитесь на странице: 1из 64

Base de Datos II ADMINISTRACIN DE MYSQL MEDIANTE CONSOLA

MySQL tiene un programa, que se llama con el mismo nombre de la base de datos (mysql) que sirve para gestionar la base datos por lnea de comandos. El directorio puede variar, por ejemplo, puede estar localizado en la raz del disco C:, o en cualquier otro lugar donde podamos haber instalado MySQL. Para acceder a la consola de MySQL en Windows tendremos que estar situados dentro de ese directorio. Para el efecto utilizaremos el Wamp Server 2.0 el cual al ser instalado se ubica en: C:\wamp\bin\mysql\mysql5.1.36\bin>_ O seleccionar:

o En Linux, por supuesto, tambin se puede acceder a MySQL por lnea de comandos. Posiblemente desde cualquier directorio podamos acceder a la consola de MySQL, sin necesidad de situarse en el directorio donde est instalado. CONFLICTOS ENTRE SERVIDORES DEL MISMO TIPO Se presentan cuando se instala 2 o ms veces el MySQL con diferentes gestores o proveedores, lo recomendable es que Ud. pueda parar el servicio y dejar slo a uno de ellos: 1. Escoger Inicio, Panel de control, Herramientas Administrativas y por ltimo Servicios

En la grfica se est ejecutando un servicio de SQL y est en conflicto con:

Base de Datos II

2. Utilice los botones stop y play para detener y ejecutar servicios CONECTAR CON EL SERVIDOR MYSQL Lo primero que tendremos que hacer es conectar con el sistema gestor de MySQL. Para ello, simplemente tenemos que escribir el comando "mysql" e indicarle unas opciones de conexin. % mysql Con el "%" expresamos el principio de la lnea de comandos. Ese principio es el prompt que tengamos en nuestra consola de Linux o MsDOS, que puede ser algo como (C:\wamp\bin\mysql\mysql5.1.36\bin>). El carcter "%", por tanto, no tenemos que escribirlo. Con esa sentencia se conecta uno con la base de datos con los parmetros por defecto. Es decir, al servidor local, con usuario y password igual a cadenas vacas. Lo ms normal es que tengamos que indicar algn otro dato para conectar con la base de datos, como el usuario, la clave o la direccin del servidor con el que queremos conectar. La sintaxis sera la siguiente: % mysql -h nombre_servidor -u nombre_usuario -p Si deseamos conectarnos a la base de datos en local y con nombre de usuario root tendramos que escribir: % mysql -h localhost -u root -p Lo primero que nos preguntar ser el password para el usuario root. Una vez introducida la clave, ya estaremos dentro de la lnea de comandos de MySQL. Con ello el prompt cambiar a algo como esto: mysql> Podramos haber indicado la contrasea directamente en la lnea de comandos para iniciar

Base de Datos II
la sesin con MySQL, pero esto se desaconseja por razones de seguridad. De todos modos, la sintaxis hubiera sido: % mysql -h localhost -u root -pmi_clave Nos fijamos que entre -h y el nombre del host hay un espacio en blanco, igual que entre -u y el nombre de usuario. Sin embargo, entre -p y la clave no debemos poner ningn espacio. DENTRO DE LA CONSOLA DE MYSQL Una vez dentro, tendremos a nuestra disposicin todas las sentencias de MySQL para el trabajo con la base de datos y el lenguaje SQL. Lo ms normal es que necesites conectarte con una base de datos en concreto, de entre todas las que puedes tener creadas en tu servidor MySQL. Eso se hace con el comando use, seguido del nombre de la base de datos que deseas conectar. mysql> use mibasedatos; Esto nos conectara con la base de datos llamada "mibasedatos". ATENCIN:Hay que fijarse que todas las sentencias dentro de la lnea de comandos de MySQL acaban en ";". Si no colocamos el punto y coma, lo ms seguro es que NOse ejecute el comando y nos vuelva a salir el prompt para que sigamos introduciendo el comando. Si lo que queramos era ejecutar la sentencia que habamos escrito antes, con simplemente entrar el ";" ser suficiente. Es decir, no debemos escribir de nuevo la sentencia entera, slo el ";" y volver a apretar "enter". Si queremos ver una lista de las bases de datos alojadas en nuestro servidor podemos escribir el comando show databases. As: mysql>show databases; Con esto nos mostrara una lista de las bases de datos de nuestro servidor. Algo como esto: mysql> show databases -> ;

5 rows in set (0.02 sec) Si queremos crear una base datos, podremos hacerlo con el comando "create database" seguido del nombre de la nueva base de datos.

Base de Datos II
mysql> create database miprueba; mysql>create database IF NOT EXISTS miprueba; Eso nos crear una base de datos que se llama "miprueba".Si ya existe una base de datos con ese nombre, MySQL devolver un error. Si queremos crear una base de datos solo cuando no exista ya (y por lo tanto no obtener este error) podemos aadir el texto IF NOT EXISTS que evita el error en caso de existir Si queremos luego usar esa base de datos escribiramos: mysql> use miprueba; Lgicamente, esta base de datos recin creada estar vaca, pero si estuviramos usando una base de datos ya creada y queremos ver las tablas que tiene escribiramos el comando "show tables". mysql> show tables; Si no hay tablas, nos dir algo como "Empty set", pero si tenemos varias tablas dadas de alta en la base de datos que estamos usando, nos saldr una lista de ellas: mysql> show tables;

2 rows in set (0.00 sec) Ahora, si deseamos obtener informacin sobre una tabla, para saber qu campos tiene y de qu tipo, podremos utilizar el comando describe seguido del nombre de la tabla. mysql> describe administrador;

4 rows in set (0.11 sec) En este apartado se resumen las principales sentencias SQL que pueden ser utilizadas en el gestor de base de datos MySQL, por ejemplo tambin se puede utilizar SHOW FULL COLUMNS FROM tabla; para mostrar la estructura de una tabla. PARA SALIR DE LA LNEA DE COMANDOS DE MYSQL Una vez hemos terminado de trabajar con MySQL, si queremos cerrar la conexin con el

Base de Datos II
servidor, simplemente escribimos "quit" o \q desde el prompt de MySQL: mysql> quit CREAR UNA TABLA La sintaxis general es: CREATE TABLE nombre_tabla (nombre_campo1 TIPO_COLUMNA(), nombre_campo1 TIPO_COLUMNA(), nombre_campo1 TIPO_COLUMNA(), ... );

En este caso estamos creando una tabla de nombre PRUEBA cuya clave primaria es id (campo que identifica unvocamente a la tabla) que va incrementando su valor automticamente cada vez que insertamos un nuevo valor en la tabla,un campo cmp que es de tipo cadena de caracteres de como mximo 60 caracteres y un campo cmp2 que es de tipo cadena de caracteres:
CREATE TABLE prueba( id int NOT NULL AUTO_INCREMENT, cmp VARCHAR(60) default NULL, cmp2 VARCHAR(1), PRIMARY KEY (id) ) TYPE=INNODB;

Tambin se puede utilizar el siguiente formato:


CREATE TABLE usuario ( id_usuario INT PRIMARY KEY AUTO_INCREMENT, nombre VARCHAR(50) NOT NULL, direccion VARCHAR(50) NOT NULL, ciudad VARCHAR(20) NOT NULL, edad TINYINT NOT NULL );

Base de Datos II

REALIZAR EJERCICIO DE LA PRACTICA N 1 USUARIOS Y PRIVILEGIOS


Hasta ahora hemos usado slo el usuario 'root', que es el administrador, y que dispone de todos los privilegios disponibles en MySQL. Sin embargo, normalmente no ser una buena prctica dejar que todos los usuarios con acceso al servidor tengan todos los privilegios. Para conservar la integridad de los datos y de las estructuras ser conveniente que slo algunos usuarios puedan realizar determinadas tareas, y que otras, que requieren mayor conocimiento sobre las estructuras de bases de datos y tablas, slo puedan realizarse por un nmero limitado y controlado de usuarios. Los conceptos de usuarios y privilegios estn ntimamente relacionados. No se pueden crear usuarios sin asignarle al mismo tiempo privilegios. De hecho, la necesidad de crear usuarios est ligada a la necesidad de limitar las acciones que tales usuarios pueden llevar a cabo. MySQL permite definir diferentes usuarios, y adems, asignar a cada uno determinados privilegios en distintos niveles o categoras de ellos.

NIVELES 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. Estos permisos se almacenan en la tabla mysql.user. GRANT ALL ON *.* y REVOKE ALL ON *.* otorgan y quitan slo permisos globales. De base de datos: se refieren a bases de datos individuales, y por extensin, a todos los objetos que contiene cada base de datos. Estos permisos se almacenan en las tablas mysql.db y mysql.host. GRANT ALL ON db_name.* y REVOKE ALL ON db_name.* otorgan y quitan slo permisos de bases de datos. De tabla: se aplican a tablas individuales, y por lo tanto, a todas las columnas de esas tabla. Estos permisos se almacenan en la tabla mysql.tables_priv. GRANT ALL ON db_name.tbl_name y REVOKE ALL ON db_name.tbl_name otorgan y quian permisos slo de tabla. De columna: se aplican a una columna en una tabla concreta. Estos permisos se almacenan en la tabla mysql.columns_priv . Usando REVOKE, debe especificar las mismas columnas que se otorgaron los permisos. 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.

Base de Datos II
CREAR USUARIOS Aunque en la versin 5.0.2 de MySQL existe una sentencia para crear usuarios, CREATE USER, en versiones anteriores se usa exclusivamente la sentencia GRANT para crearlos. En general es preferible usar GRANT, ya que si se crea un usuario mediante CREATE USER, posteriormente hay que usar una sentencia GRANT para concederle privilegios. Usando GRANT podemos crear un usuario y al mismo tiempo concederle tambin los privilegios que tendr. La sintaxis simplificada que usaremos para GRANT, es: GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ... ON TO user [IDENTIFIED BY [PASSWORD] 'password'] [, user [IDENTIFIED BY [PASSWORD] 'password']] ... La primera parte priv_type [(column_list)] permite definir el tipo de privilegio concedido para determinadas columnas. La segunda ON{tbl_name | * | *.* | db_name.*}, permite conceder privilegios en niveles globales, de base de datos o de tablas. Para crear un usuario sin privilegios usaremos la sentencia: mysql> GRANT USAGE ON *.* TO anonimo IDENTIFIED BY 'clave'; Hay que tener en cuenta que la contrasea se debe introducir entre comillas de forma obligatoria. Un usuario 'anonimo' podr abrir una sesin MySQL mediante una orden: C:\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. CONCEDER 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. mysql> GRANT SELECT ON prueba.gente TO anonimo; Esta sentencia concede al usuario 'anonimo' el privilegio de ejecutar sentencias SELECT sobre la tabla 'gente' de la base de datos 'prueba'. Un usuario que abra una sesin y se identifique como 'anonimo' podr ejecutar estas sentencias: mysql> SHOW DATABASES;
+-----------+ | database |

Base de Datos II
+-----------+ | prueba | +-----------+ 1 row in set (0.01 sec)

mysql> USE prueba; Database changed mysql> SHOW TABLES;


+----------------------+ | Tables_in_prueba | +----------------------+ | gente | +----------------------+ 1 row in set (0.00 sec)

mysql> SELECT * FROM gente;


+------------+---------------+ | nombre | fecha | +------------+---------------+ | Fulano | 1985-04-12 | | Mengano | 1978-06-15 | | Tulano | 2001-12-02 | | Pegano | 1993-02-10 | | Pimplano | 1978-06-15 | | Frutano | 1985-04-12 | +------------+---------------+ 6 rows in set (0.05 sec)

Como se ve, para este usuario slo existe la base de datos 'prueba' y dentro de esta, la tabla 'gente'. Adems, podr hacer consultas sobre esa tabla, pero no podr aadir ni modificar datos, ni por supuesto, crear o destruir tablas ni bases de datos. 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)]. Otros privilegios que se pueden conceder son: ALL: para conceder todos los privilegios. CREATE: permite crear nuevas tablas. DELETE: permite usar la sentencia DELETE. DROP: permite borrar tablas. INSERT: permite insertar datos en tablas. UPDATE: permite usar la sentencia UPDATE.

Base de Datos II
Para ver una lista de todos los privilegios existentes consultar la sintaxis de la sentencia GRANT. Se pueden conceder varios privilegios en una nica sentencia. Por ejemplo: mysql> GRANT SELECT, UPDATE ON prueba.gente TO anonimo IDENTIFIED BY 'clave'; Un detalle importante es que para crear usuarios se debe tener el privilegio GRANT OPTION, y que slo se pueden conceder privilegios que se posean. REVOCAR PRIVILEGIOS Para revocar privilegios se usa la sentencia REVOKE. REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ... ON FROM user [, user] ... La sintaxis es similar a la de GRANT, por ejemplo, para revocar el privilegio SELECT de nuestro usuario 'anonimo', usaremos la sentencia: mysql> REVOKE SELECT ON prueba.gente FROM anonimo; MOSTRAR LOS PRIVILEGIOS DE UN USUARIO 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. Por ejemplo: mysql> SHOW GRANTS FOR anonimo;
+------------------------------------------------------------------------------------------------------+ | Grants for anonimo@% | +------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'anonimo'@'%' IDENTIFIED BY PASSWORD '*5...' | | GRANT SELECT ON `prueba`.`gente` TO 'anonimo'@'%' | +------------------------------------------------------------------------------------------------------+ 2 rows in set (0.00 sec)

NOMBRES DE USUARIOS Y CONTRASEAS 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 ordenador local, o cualquier otro nombre, o bien una ip. La parte de la mquina es opcional, y si como en nuestro caso, no se pone, el usuario podr conectarse desde cualquier mquina. La salida de SHOW GRANTS lo indica usando el comodn '%' para el nombre de la mquina.

Base de Datos II
Si creamos un usuario para una mquina o conjunto de mquinas determinado, ese usuario no se podr conectar desde otras mquinas. Por ejemplo: mysql> GRANT USAGE ON * TO anonimo@localhost IDENTIFIED BY 'clave'; Un usuario que se identifique como 'anonimo' slo podr entrar desde el mismo ordenador donde se est ejecutando el servidor. En este otro ejemplo: mysql> GRANT USAGE ON * TO anonimo@10.28.56.15 IDENTIFIED BY 'clave'; El usuario 'anonimo' slo puede conectarse desde un ordenador cuyo IP sea '10.28.56.15'. Aunque asignar una contrasea es opcional, por motivos de seguridad es recomendable asignar siempre una. La contrasea se puede escribir entre comillas simples cuando se crea un usuario, o se puede usar la salida de la funcin PASSWORD() de forma literal, para evitar enviar la clave en texto legible. Si al aadir privilegios se usa una clave diferente en la clusula IDENTIFIED BY, sencillamente se sustituye la contrasea por la nueva. BORRAR USUARIOS Para eliminar usuarios se usa la sentencia DROP USER. No se puede eliminar un usuario que tenga privilegios, por ejemplo: mysql> DROP USER anonimo; ERROR 1268 (HY000): Can't drop one or more of the requested users 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 `prueba`.`gente` 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)

REALIZAR EJERCICIO DE LA PRACTICA N 2

10

Base de Datos II

PROCEDIMIENTOS ALMACENADOS
Los procedimientos almacenados (stored procedure en ingls) 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. 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. 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. Los Procedimientos Almacenados se guardan en la propia Base de Datos aunque se pueden crear de forma interactiva desde la propia Base de Datos o desde un gestor de aplicaciones. Por ejemplo, el siguiente cdigo es un Procedimiento Almacenado que inserta un registro con un valor en funcin del parmetro recibido.
Delimiter // CREATE PROCEDURE procedure1 (IN parameter1 INTEGER) BEGIN DECLARE variable1 CHAR(10); IF parameter1 = 17 THEN SET variable1 = 'birds'; ELSE SET variable1 = 'beasts'; END IF; INSERT INTO table1 VALUES (variable1); END// Delimiter ;

11

Base de Datos II
Este Procedimiento Almacenado lo podras crear interactivamente mediante la versin para MySQL 5.0. Si quisieras Procedimiento Almacenado tendras que aplicar el siguiente formato:
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

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 IN por defecto, que indica que el contenido de la variable solo es de entrada. Para especificar otro tipo de parmetro, use la palabra clave OUTque indica que el contenido de la variable es retornado desde el procedimiento al lugar donde fue llamado, o INOUTque indica que su contenido en de ingreso y salida al mismo tiempo, estos indicadores se describen antes del nombre del parmetro. Especificando IN, OUT, o INOUT slo son validos para una PROCEDURE.El procedimiento almacenado debe de tener un cuerpo y un final para eso usamos las etiquetas BEGIN y END Se tiene que cambiar el delimitador (;) en la consola,ya que los procedimientos almacenados lo utilizan para especificar el final de una instruccin, para ejemplo se utilizar //, esto se logra mediante el comando DELIMITER //, este proceso se debe repetir para dejarlo como estaba, para ello se utiliza el comando DELIMITER ;
DELIMITER // CREATE PROCEDURE mysp () BEGIN Proceso que desee realizar END// DELIMITER ;

12

Base de Datos II
CALL mysp();

El nombre del store procedure (Procedimiento Almacenado) puede ser en maysculas o minsculas pues no son case sensitive. Ahora la forma de ejecutarlo es muy diferente a los manejadores como SQL Server o Sybase donde se hacen mediante la sentencia exec, aqu se usa la sentencia call y colocando al final los parntesis. Sobre las sentencias que no se pueden usar dentro de un procedimiento almacenado son: CREATE PROCEDURE, ALTER PROCEDURE, DROP PROCEDURE, CREATE FUNCTION, DROP FUNCTION, CREATE TRIGGER, DROP TRIGGER. Tambin el uso de USE database no es permitido, ya que MySQL asume que la base de datos por default es donde se encuentra creado el procedimiento. Sentencia DECLARE DECLARE var_name[,...] type [DEFAULT value] Este comando se usa para declarar variables locales. Para proporcionar un valor por defecto para la variable, incluye una clusula DEFAULT . El valor puede especificarse como expresin, no necesita ser una constante. Si la clusula DEFAULT no est presente, el valor inicial es NULL. La visibilidad de una variable local es dentro del bloque BEGIN ... END donde est declarado. DECLARE var1 INT DEFAULT 0; #variables enteras DECLARE var2 VARCHAR(15); #variables varchar tambin le podemos decir strings Sentencia SET para variables SET var_nombre = expr [, var_nombre = expr] ... El comando SET en procedimientos almacenados es una versin extendida del comando general SET. El comando SET en procedimientos almacenados se implementa como parte de la sintaxis SET pre-existente. Esto permite una sintaxis extendida de SET a=x, b=y, ... donde distintos tipos de variables pueden mezclarse. SET vat1 = "hola"; La sentencia CALL CALL sp_nombre([parameter[,...]]) El comando CALL invoca un procedimiento definido previamente con CREATE PROCEDURE. CALL puede pasar valores al llamador usando parmetros declarados como OUT o INOUT . Tambin retorna el nmero de registros afectados, que con un programa cliente puede obtenerse a nivel SQL llamando la funcin ROW_COUNT() y desde C llamando la funcin de la API C mysql_affected_rows() .

13

Base de Datos II
La sentencia 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;

Sentencia IF
IF expresin THEN -- que hacer en caso correcto ELSE -- que hacer en caso contrario END IF; -- necesario para cerrar el bloque

IF en una sola lnea:


SET valor = IF (5<5,1,0); SELECT valor;

IF implementa un constructor condicional bsico. Si (condicin de bsqueda) se evala a cierto, el comando SQL correspondiente listado se ejectua. Si no coincide ninguna (condicin de bsqueda) se ejecuta el comando listado en la clusula ELSE. lista_de_instrucciones puede consistir en varios comandos. El siguiente ejemplo de procedimiento almacenado en MySQL, guarda datos de vehculos en la tabla familiares si su velocidad es menor que 120 Km/h o en la tabla deportivos en el caso contrario:
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;

Otro ejemplo de utilizacin de la instruccin de control:


delimiter // CREATE procedure compara(IN cadena varchar(25), IN cadena2 varchar(25)) begin IF strcmp(cadena, cadena2) = 0 then SELECT "son iguales!"; else SELECT "son diferentes!!"; end IF; end; // delimiter ; call compara("hola","Hola");

14

Base de Datos II
La sentencia CASE
CASE case_value WHEN Coincidencia_Valor THEN lista_de_instrucciones [WHEN Coincidencia_Valor THEN lista_de_instrucciones] ... [ELSE lista_de_instrucciones] END CASE

O:
CASE WHEN condicin_de_bsqueda THEN lista_de_instrucciones [WHEN condicin_de_bsqueda THEN lista_de_instrucciones] ... [ELSE lista_de_instrucciones] END CASE

El comando CASE para procedimientos almacenados implementa un constructor condicional complejo. Si una condicin_de_bsqueda 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. Nota: La sitaxis de un comandoCASE mostrado aqu para uso dentro de procedimientos almacenados difiere ligeramente de la expresinCASE SQL. El comando CASE no puede tener una clusula ELSE NULL y termina con END CASE en lugar de END. Ejemplo:
mysql> SELECT CASE 1 WHEN 1 THEN 'one' -> WHEN 2 THEN 'two' ELSE 'more' END; -> 'one' mysql> SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END; -> 'true' mysql> SELECT CASE BINARY 'B' -> WHEN 'a' THEN 1 WHEN 'b' THEN 2 END; -> NULL

Un ejemplo de procedimiento almacenado que aplique la instruccin es:


delimiter // CREATE procedure miProc (IN p1 int) begin declare var int ; SET var = p1 +2 ; case var when 2 then INSERT INTO lista VALUES (66666); when 3 then INSERT INTO lista VALUES (4545665); else INSERT INTO lista VALUES (77777777); end case; end; //

Sentencia LOOP [begin_label:] LOOP


lista_de_instrucciones

END LOOP [end_label]

15

Base de Datos II
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. Sentencia LEAVE LEAVE label Este comando se usa para abandonar cualquier control de flujo etiquetado. Puede usarse con BEGIN ... END o bucles. La setencia ITERATE ITERATE label ITERATE slo puede aparecer en comandos LOOP, REPEAT, y WHILE . ITERATE 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

SentenciaREPEAT [begin_label:] REPEAT


lista_de_instrucciones UNTIL condicin_de_bsqueda

END REPEAT [end_label] El comando/s dentro de un comando REPEAT se repite hasta que la condicin search_condition es cierta. Un comando REPEAT puede etiquetarse. end_label no puede darse a no ser que begin_label est presente, y si lo estn, deben ser el mismo. Por ejemplo:
delimiter // CREATE PROCEDURE dorepeat(p1 INT) BEGIN SET x = 0; REPEAT SET x = x + 1; UNTIL x > p1 END REPEAT; END // CALL dorepeat(1000)// SELECT x//

16

Base de Datos II
+------+ |x | +------+ | 1001 | +------+ 1 row in set (0.00 sec)

Otro ejemplo de aplicacin del REPEAT


delimiter // CREATE procedure p15() BEGIN declare v int; SET v = 20; REPEAT INSERT INTO lista VALUES(v); SET v = v + 1; UNTIL v >= 1 END REPEAT; END; //

Sentencia WHILE [begin_label:] WHILE condicin_de_bsqueda DO


lista_de_instrucciones

END WHILE [end_label] El comado/s dentro de un comando WHILE se repite mientras la condicin search_condition es cierta. Un comando WHILE puede etiquetarse. end_label 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

Ejemplo de aplicacin:
delimiter // CREATE procedure p14() BEGIN declare v int; SET v = 0; while v < 5 do INSERT INTO lista VALUES (v); SET v = v +1 ; end while; END; //

Para eliminar procedimientos almacenados se utiliza la instruccin DROP PROCEDURE, se puede utilizar el complemento IF EXISTS para evitar errores en caso de no existir en la base de datos:

17

Base de Datos II
Drop procedure if exists sp_name;

FUNCIONES EN MYSQL
El format de una function es:
CREATEFUNCTIONsp_name ([parameter[,...]]) RETURNStype [characteristic ...] routine_body

La clusula RETURNS puede especificarse slo con FUNCTION, donde es obligatorio. Se usa para indicar el tipo de retorno de la funcin, y el cuerpo de la funcin debe contener un comando RETURN value. 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 IN por defecto. 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 DETERMINISTIC ni NOT DETERMINISTIC por defecto es NOT DETERMINISTIC. Un ejemplo de uso de funciones es:
CREATEFUNCTIONhello (s CHAR(20)) RETURNSCHAR(50) RETURNCONCAT('Hello, ',s,'!'); mysql> SELECThello('mundo');

Si al crear la funcin se muestra el siguiente error:


ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQ L DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

Para solucionar este problema, utilice la siguiente instruccin para su solucin: mysql> set Global log_bin_trust_function_creators=1;

Para mostrar la lista de funciones creadas se utiliza la instruccin: SHOW FUNCTION STATUS Si se desea hacer una funcin que devuelva la fecha con el formato dia/mes/ao, se podra realizar lo siguiente:
DELIMITER // CREATE FUNCTION fecha_db(fech DATETIME) RETURNS char(14) BEGIN RETURN date_format(fech,%d/%m/%Y); END // DELIMITER ;

18

Base de Datos II CURSORES EN MYSQL(anexo vi)


En el lenguaje SQL existen unos tipos de controles llamados cursores que son tiles para recorrer los registros que devuelve una consulta. Este tipo de estructuras slo deben utilizarse cuando no haya otra forma de manipular conjuntos de datos en una sola instruccin. Los cursores no son sensibles (No sensible significa que el servidor puede o no hacer una copia de su tabla de resultados), son de slo lectura, y no permiten scrolling.
DELIMITER // DROP PROCEDURE IF EXISTS micursor// CREATE PROCEDURE micursor() BEGIN DECLARE done BOOLEAN DEFAULT FALSE; DECLARE uid integer; DECLARE newdate integer; DECLARE c1 cursor for SELECT id,timestamp from employers ORDER BY id ASC; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = TRUE; open c1; c1_loop: LOOP fetch c1 into uid, newdate; IF done THEN LEAVE c1_loop; END IF; UPDATE calendar SET timestamp=newdate WHERE id=uid; END LOOP c1_loop; close c1; END //

Los cursores deben declararse antes de declarar los handlers, y las variables y condiciones deben declararse antes de declarar cursores o handlers. Un handler (manejadores) en MySQL es invocado cuando se da un evento o condicin definida con anterioridad. Este evento est siempre asociado con una condicin de error, pero puedes tener tres formas de definir el error:

Como cdigo de error de MySQL Como cdigo SQLSTATE ANSI-standard Como nombre de condicin, ejemplo: SQLEXCEPTION,SQLWARNING y NOT FOUND.

MySQL tiene sus propios cdigos de error que son nicos para MySQL Server. Por ejemplo:
DECLARE CONTINUE HANDLER FOR 1062 SET duplicate_key=1;

Un cdigo de error SQLSTATE es definido por ANSI standard y son independientes de la base de datos, lo que significa que deberas tener el mismo valor de error para cualquier base de datos ANSI compatible. Por ejemplo:
DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET duplicate_key=1;

As, Oracle, SQL Server, DB2, y MySQL reportarn el mismo SQLSTATEvalue (23000) cuando hay un error de primary key duplicada..

19

Base de Datos II
CREATE PROCEDURE ... BEGIN -- Declaro el handler que al darse una condicion -- continue su ejecucion, pero registre un flag SET flag=0; DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET flag = 1; INSERTINTO TABLA........; -- Si flag=1 es porque se dio la condicion SQLSTATE '23000' -- (23000, en realidad, engloba muchos errores de violacion) -- Como no se ejecuto el INSERT entonces probamos con UPDATE. IF flag = 1 THEN UPDATE TABLA...........; END IF; END

Sentencia CLOSE CLOSE nombre_de_cursor Cierra el cursor, el cual deber estar abierto. Un cursor abierto es cerrado automticamente cuando el bloque BEGIN dentro del cual est termina. Sentencia FETCH FETCH [[NEXT] FROM] nombre_de_cursor INTO variable [, variable2,] Obtiene el siguiente rengln para el cursor actual y almacena cada una de sus columnas en las variables mencionadas. El cursor debe estar abierto. Si no est disponible ningn rengln, un error con un valor de SQLSTATE igual a 02000 ocurre. SentenciaOPEN OPEN nombre_de_cursor Abre el cursor para que pueda ser utilizado con la instruccin FETCH. Comentarios En las rutinas de MySQL, los comentarios pueden hacerse de tres maneras: Empezando una lnea con "#": # Este es un comentario Encerrando un texto entre "/*" y "*/": /* Este es un comentario de una lnea */ /* Este es un comentario que abarca varias lneas */ Anteponiendo a una lnea dos guiones y un espacio: --- Este es un comentario --

20

Base de Datos II TRIGGERS (Disparadores)


El soporte para TRIGGERS en MySQL se realiz a partir de la versin 5.0.2. Un trigger puede ser definido para activarse en un INSERT, DELETE o UPDATE en una tabla y puede configurarse para activarse ya sea antes o despus de que se haya procesado cada rengln por el query. Los TRIGGERS en MySQL tienen la misma limitante que las funciones. No pueden referirse a una tabla en general. Pueden solamente referirse a un valor del rengln que est siendo modificado por el query que se est ejecutando. Las caractersticas ms importantes de los TRIGGERS son:

Puede examinar el contenido actual de un rengln antes de que sea borrado o actualizado Puede examinar un nuevo valor para ser insertado o para actualizar un rengln de una tabla Un BEFORE TRIGGER, puede cambiar el nuevo valor antes de que sea almacenado en la base de datos, lo que permite realizar un filtrado de la informacin.

Los triggers tienen dos palabras clave, OLD y NEW que se refieren a los valores que tienen las columnas antes y despus de la modificacin. Los INSERT permiten NEW, los DELETE slo OLD y los UPDATE ambas. El siguiente ejemplo muestra un BEFORE TRIGGER para un SELECT de una tabla:
CREATE TABLE tEjemplo (i INT, dt DATETIME); delimiter // CREATE TRIGGER t_ins BEFORE INSERT ON tEjemplo FOR EACH ROW BEGIN SET NEW.dt = CURRENT_TIMESTAMP; IF NEW.i< 0 THEN SET NEW.i = 0; END IF; END// delimiter ;

21

Base de Datos II PRCTICA N 1


La Facultad de Ciencias Veterinarias necesita una base de datos que permita registrar los datos de los animales (canes) y las vacunas aplicadas a los mismos: Asumiendo que el usuario root no tiene clave de acceso mysql -h localhost -u root Asumiendo que el usuario root tiene clave de acceso mysql -h localhost -u root pSuClave , si no desea escribir la clave por seguridad puede utilizar mysql -h localhost -u root p Si se desea ingresar y activar la base de datos directamente, puede utilizar la siguiente instruccin: mysql -h localhost -u root NombreBaseDatos -p Crea la base de datos granja create database granja; Comando para poder seleccionar y usar la base datos. use granja; Muestra el nombre de las tablas que tengamos creadas en nuestra base de datos queestamos utilizando en este caso no muestra nada porque no hemos creado tablas. ShowTables; Forma de crear tablas y definiendo de una vez la llame primaria. CREATE TABLE animal( IdAnimal int(6) NOT NULL auto_increment, Nombre text(20) not null, Edad int(2), Raza varchar(20) , Precio int(7), primary key(IdAnimal) ) TYPE=INNODB; De sta forma queda creada la tabla llamada animal con sus atributos y su llave primaria. describe animal; El siguiente comando es para seleccionar la tabla de la base de datos animal y nos muestra los registros la tabla animal. (El * quiere decir todas las columnas). Select * From animal; S se requiere especificar los atributos que queremos ver, como nombre y la edad de la tabla animal, este podra ser una de las formas: Select nombre, edad From animal; Para insertar datos en la tabla animal, se lo realiza de la siguiente manera. Insert into animal(nombre, edad, raza, precio) values (pepe,2,pincher,2000); Insert into animal(nombre, edad, raza, precio) values (Chiqui,3,Bulldoc,4000); Insert into animal(nombre, edad, raza, precio) values (Mechn,5,Haspappi,2500);

22

Base de Datos II
Insert into animal(nombre, edad, raza, precio) values (Titn,1,Doverman,800); Este comando es para seleccionar solo los nombres de la tabla animal y nos muestra todos los nombres que tiene esa tabla. SELECT Nombre FROManimal; Este comando nos muestra solo los animales donde la edad sea mayor a 2 SELECT * FROM animal WHERE edad > 2; Este comando actualiza de la tabla animal el nombre animalito donde el id sea igual a 1 UPDATE animal SET nombre = animalito WHERE IdAnimal = 1; PARA PONER CLAVE AL USUARIO ROOT Se puede utilizar el UPDATE para cambiar la clave de acceso mediante el usuario root, para ello se debe activar la base de datos de MySQL y proceder a definir la clave:
mysql>use mysql; mysql>UPDATE user SET Password = PASSWORD('contrasea') WHERE User = 'root'; mysql> flush privileges;

De la tabla animal borra la tupla que tenga el id numero 2 DELETE FROM animal where IdAnimal = 2; COMANDOS DE ELIMNACIN (No aplicarlos hasta finalizar la prctica) Comando para eliminar todos los registros de la tabla animal. DELETE FROM animal;o tambin TRUNCATE usuario; Para eliminar la tabla tanto los datos como su estructura. Drop table animal;o tambin Drop table IF EXISTS animal; El comando que permite borrar toda la base de datos que se llama granja Drop database granja; Como todos ya saben significa salir y se cierra la consola. Quit; CREAR RELACIONES Y CLAVES FORANEAS Se crear la tabla vacunas la cual se relacionar con la tabla animal, las tablas que se van a relacionar tienen que ser tipo InnoDb (InnoDB es el primer tipo de tabla que permite definir restricciones de claves forneas para garantizar la integridad de los datos). Se necesita usar la sintaxis: FOREIGN KEY (campo_fk) REFERENCES nombre_tabla(nombre_campo) Adems se debe crear un ndice en el campo que ha sido declarado como clave fornea CREATE TABLE vacunas ( IdVacuna int(9) not null auto_increment, Nombre text(20) not null, PRIMARY KEY (IdVacuna), Id_Animal int(6), index(Id_Animal), FOREIGN KEY (Id_Animal) REFERENCES animal(IdAnimal) ) TYPE=INNODB; En el ejemplo, se puede ver el diccionario de datos en cada uno de los atributos, de que tipo son, cuales permiten nulos, cuales no, la llave primaria, etc. (el comando que muestra la estructura de la tabla)

23

Base de Datos II
describe vacunas; Para insertar datos en la tabla animal, se lo realiza de la siguiente manera. Insert into Vacunas(Nombre, Id_Animal) values (Antiparasitaria,1); Insert into Vacunas(Nombre, Id_Animal) values (AntimoquilloA,3); Insert into Vacunas(Nombre, Id_Animal) values (AntiMoquilloB,1); Insert into Vacunas(Nombre, Id_Animal) values (Anti rabia,4);

Este comando nos muestra los nombres de animales y sus vacunas aplicadas SELECT animal.Nombre, vacunas.Nombre FROM animal, vacunas WHERE animal.IdAnimal=vacunas.Id_Animal; Este comando nos muestra lo mismo pero ordenado por el nombre delos animales SELECT animal.Nombre, vacunas.Nombre FROM animal, vacunas WHERE animal.IdAnimal=vacunas.Id_Animal ORDER BY animal.Nombre; Este comando nos muestra los nombres de animales en mayscula y sus vacunas aplicadas en minsculas: SELECT UPPER(animal.Nombre),LOWER(vacunas.Nombre) FROM animal, vacunas WHERE animal.IdAnimal=vacunas.Id_Animal; Si se desea aplicar relacin sin utilizar producto cartesiano: SELECT animal.nombre, vacunas.nombre FROM animal LEFT JOIN vacunas ON animal.idAnimal=vacunas.id_Animal;
+---------------+-----------------------+ | nombre | nombre | +---------------+-----------------------+ | Yoyito | Antiparasitaria | | Yoyito | AntiMoquilloB | | Mechn | AntimoquilloA | | Titn | Anti rabia | | Sombra | NULL | | Chiquita | NULL | | Chilito | NULL | | Chocolate | NULL | +---------------+-----------------------+

Considere que los datos no relacionados entra la tabla animal y vacunas muestran NULL en la tabla vacunas. A diferencia del ejercicio anterior, la siguiente instruccin muestra solo los datos relacionados: SELECT animal.nombre, vacunas.nombre FROM animal JOIN vacunas ON animal.idAnimal=vacunas.id_Animal;
+------------+---------------------+ | nombre | nombre | +------------+---------------------+ | Yoyito | Antiparasitaria | | Mechn | AntimoquilloA | | Yoyito | AntiMoquilloB | | Titn | Anti rabia | +------------+--------------------+

24

Base de Datos II
S de desea utilizar condiciones para conseguir resultados personalizados usted podra aplicar la siguiente instruccin: SELECT Nombre, IF(edad <= 2, 'Joven', 'Adulto') as Tipo FROM animal ORDER BY edad; Si se desea agregar un campo a la tabla vacunas, que registre la fecha cuando se aplic la vacuna, sera del siguiente modo: ALTER TABLE vacunas ADD fecha DATE; (anexo IV para ver ms ejemplos) ALTER TABLE tabla ADD COLUMN valor INT; Para eliminar la columna agregada: ALTER TABLE tabla DROP COLUMN valor; S se desea cambiar el nombre de una tabla, podra aplicar: ALTER TABLE animal RENAME TO animales; mysql> show tables;
+-------------------------+ | Tables_in_granja | +-------------------------+ | animales | | vacunas | +-------------------------+

2 rows in set (0.00 sec) Dejemoslo como estaba: ALTER TABLE animales RENAME TO animal; Select * From vacunas;o tambin aplicar describe vacunas; Si se desea agregar fechas (Considere que el formato de las fechas en MYSQL de ao/mes/da)se tendra que realizar lo siguiente: UPDATE vacunas SET fecha = 2012/01/01 WHERE IdVacuna = 1; UPDATE vacunas SET fecha = 2012/02/01 WHERE IdVacuna = 2; UPDATE vacunas SET fecha = 2012/03/25 WHERE IdVacuna = 3; UPDATE vacunas SET fecha = 2012/04/10 WHERE IdVacuna = 4; Para ver el resultado de las actualizaciones select * from vacunas; Crear un archivo con el listado de registros que contiene la tabla animal: SELECT * FROM animal INTO OUTFILE RegAnimal.txt; El archivo se crea en la carpeta de la base de datos, esta se encuentra en el directorio DATA Para respaldar (exportar) la base de datos granja MYSQLDUMP --opt --user=root granja > backup.sql PARA IMPORTAR O RESTAURAR UN RESPALDO Usted debe pegar una copia del archivo de respaldo.sql a la carpeta
C:\wamp\bin\mysql\mysql5.1.36\bin>

25

Base de Datos II
S la base de datos no est creada sela debe crear, para ello Ud. Debe ingresar a la consola y crearla:
C:\wamp\bin\mysql\mysql5.1.36\bin>mysql -u root Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.1.36-community-log MySQL Community Server (GPL) Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> create database granja;

Una vez creada la base de datos Ud. debe salir de la consola


mysql> quit;

y escribir la siguiente orden:


C:\wamp\bin\mysql\mysql5.1.36\bin>mysql --user=root p granja < backup.sql

26

Base de Datos II PRCTICA N 2


La Facultad de Ciencias Veterinarias necesita una base de datos que permita registrar los datos de los animales (canes) y las vacunas aplicadas a los mismos, necesita generar usuarios con limitaciones para evitar problemas de seguridad: mysql -h localhost -u root mysql> SHOW GRANTS; Para crear un usuario sin privilegios usaremos la sentencia: mysql> GRANT USAGE ON *.* TO octavo IDENTIFIED BY '123'; Para verificar los privilegios del usuario octavo C:\wamp\bin\mysql\mysql5.1.36\bin>mysql -u octavo -p123 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.1.36-community-log MySQL Community Server (GPL) Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +-------------------------+ | Database | +-------------------------+ | information_schema | +-------------------------+ 1 row in set (0.00 sec) Usted puede notar que no muestra el contenido real de las bases de datos, s intenta trabajar con una base de datos, MySQL le mostrar: mysql> use granja; ERROR 1044 (42000): Access denied for user 'octavo'@'%' to database 'granja' MySQL le negar acceder a una base de datos, y si intenta cambiar los privilegios le mostrar el siguiente mensaje: mysql> GRANT SELECT ON granja.animal TO octavo; ERROR 1142 (42000): SELECT,GRANT command denied to user 'octavo'@'localhost' for table 'animal' Para hacer uso de la administracin de usuarios es necesario entrar con el usuario que tiene todos los privilegios: mysql> quit; C:\wamp\bin\mysql\mysql5.1.36\bin>mysql -u root Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3

27

Base de Datos II
Server version: 5.1.36-community-log MySQL Community Server (GPL) Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>_ Para crear privilegios de vistas sobre la base de datos granja y la tabla animal al usuario octavo se debe realizar lo siguiente: mysql> GRANT SELECT ON granja.animal TO octavo; Volvemos a salir del usuario root, para entrar con el usuario octavo mysql>\q; C:\wamp\bin\mysql\mysql5.1.36\bin>mysql -u octavo -p123 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.1.36-community-log MySQL Community Server (GPL) Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------------+ | Database | +--------------------------+ | information_schema | | granja | +-------------------------+ 2 rows in set (0.00 sec) Le muestra solo la base de datos que puede observar Comando para poder seleccionar y usar la base datos. mysql>use granja; Muestra el nombre de la o las tablas que tengamos acceso. mysql> show tables; +---------------------+ | Tables_in_granja | +---------------------+ | animal | +---------------------+ 1 row in set (0.00 sec) Solo le muestra las tablas a las cuales se le dio privilegios de vistas.

28

Base de Datos II
mysql> SELECT * FROM animal; +------------+-------------+-------+------------+--------+ | IdAnimal | Nombre | Edad | Raza | Precio | +------------+-------------+-------+------------+--------+ | 1 | animalito | 2 | pincher | 2000 | | 3 | Mechn | 5 | Haspappi | 2500 | | 4 | Titn | 1|Doverman | 800 | +------------+------------+--------+-------------+--------+ 3 rows in set (0.11 sec) Si usted intenta ver el contenido de una tabla que no tiene permisos se mostrar el siguiente mensaje: mysql> SELECT * FROM vacunas; ERROR 1142 (42000): SELECT command denied to user 'octavo'@'localhost' for table 'vacunas' Para que el usuario octavo pueda ver el contenido de la tabla vacunas debe ejecutar el siguiente comando: mysql> GRANT SELECT ON granja.*TO octavo; mysql>\q; Al aplicar los comandos antes descritos como usuario octavo C:\wamp\bin\mysql\mysql5.1.36\bin>mysql -u octavo -p123 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 6 Server version: 5.1.36-community-log MySQL Community Server (GPL) Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> use granja; Database changed mysql> show tables; +----------------------+ | Tables_in_granja | +----------------------+ | animal | | vacunas | +----------------------+ 2 rows in set (0.03 sec) mysql> select * from vacunas; +------------+-----------------+--------------+--------------+ | IdVacuna | Nombre | Id_Animal | fecha | +------------+-----------------+--------------+--------------+ | 1 | Antiparasitaria | 1 | 2012-01-01 | | 2 | AntimoquilloA| 3 | 2012-02-01 | | 3 | AntiMoquilloB | 1 | 2012-03-25 | | 4 | Anti rabia | 4 | 2012-04-10 | +-----------+--------------------+------------+--------------+ 4 rows in set (0.02 sec)

29

Base de Datos II
Si intentamos agregar un registro con el privilegio antes ejecutado, el mensaje es el siguiente: mysql>Insert into animal(nombre, edad, raza, precio) values (Sombra,2,Criollo,70); ERROR 1142 (42000): INSERT command denied to user 'octavo'@'localhost' for table 'animal' Para permitir que el usuario octavo pueda realizar procesos de actualizacin incluido el agregado de nuevos registros se puede realizar lo siguiente (Considere que el usuario debe ser root): mysql> GRANT SELECT, UPDATE, INSERT ON granja.* TO octavo IDENTIFIED BY '123'; Query OK, 0 rows affected (0.00 sec) Una vez ingresado como usuario octavousted no tendr impedimento para realizar lo siguiente: mysql> use granja; Database changed mysql> Insert into animal(nombre, edad, raza, precio) values ('Sombra','2','Criollo','70'); Query OK, 1 row affected (0.09 sec) mysql> UPDATE animal SET nombre=Yoyito, edad=1 WHERE IdAnimal=1; mysql> UPDATE animal SET Nombre='Yoyito', Edad='1' WHERE IdAnimal='1'; Query OK, 1 row affected (0.06 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> SELECT IdAnimal, animal.Nombre, vacunas.Nombre, Edad FROM animal, vacunas WHERE animal.IdAnimal=vacunas.Id_Animal ORDER BY animal.Nombre; +-------------+----------+---------------------+-------+ | IdAnimal | Nombre | Nombre | Edad | +------------+-----------+---------------------+-------+ | 3 | Mechn | AntimoquilloA | 5 | | 4 | Titn | Anti rabia | 1 | | 1 | Yoyito | Antiparasitaria | 1 | | 1 | Yoyito | AntiMoquilloB | 1 | +------------+-----------+---------------------+-------+ 4 rows in set (0.00 sec) Tambin se puede quitar los privilegios del usuario octavo, para controlar su administracin (es necesario ingresar como usuario root para poder modificar los permisos del usuario): mysql>\q; C:\wamp\bin\mysql\mysql5.1.36\bin>mysql -u root Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.1.36-community-log MySQL Community Server (GPL)

30

Base de Datos II
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>REVOKE SELECT ON granja.* FROM octavo; Query OK, 0 rows affected (0.00 sec) Para mostrar los privilegios o permisos se ejecuta la siguiente orden: mysql> SHOW GRANTS FOR octavo; +-------------------------------------------------------------------------------------------------------+ | Grants for octavo@% | +-------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'octavo'@'%' IDENTIFIED BY PASSWORD '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257' | | GRANT INSERT, UPDATE ON `granja`.* TO 'octavo'@'%' | | GRANT SELECT ON `granja`.`animal` TO 'octavo'@'%' | +-------------------------------------------------------------------------------------------------------+ 3 rows in set (0.00 sec) mysql> REVOKE SELECT ON granja.animal FROM octavo; Query OK, 0 rows affected (0.03 sec) Para mostrar los privilegios o permisos se ejecuta la siguiente orden: mysql> SHOW GRANTS FOR octavo; +-------------------------------------------------------------------------------------------------------+ | Grants for octavo@% | +-------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'octavo'@'%' IDENTIFIED BY PASSWORD '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257' | | GRANT INSERT, UPDATE ON `granja`.* TO 'octavo'@'%' | +-------------------------------------------------------------------------------------------------------+ 2 rows in set (0.00 sec) mysql>\q; C:\wamp\bin\mysql\mysql5.1.36\bin>mysql -u octavo -p123 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 6 Server version: 5.1.36-community-log MySQL Community Server (GPL) Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> use granja; Database changed mysql> SELECT IdAnimal, animal.Nombre, vacunas.Nombre, Edad FROM animal, vacunas WHERE animal.IdAnimal=vacunas.Id_Animal ORDER BY animal.Nombre; ERROR 1142 (42000): SELECT command denied to user 'octavo'@'localhost' for table 'vacunas' Para finalizar la prctica se eliminar al usuario octavo, es importante que antes de eliminar a un usuario, se debe eliminar primero sus privilegios, para realizar este proceso se debe ingresar a la consola como root: mysql>\q;

31

Base de Datos II
C:\wamp\bin\mysql\mysql5.1.36\bin>mysql -u root Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.1.36-community-log MySQL Community Server (GPL) Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> REVOKE UPDATE, INSERT ON granja.* FROM octavo; Query OK, 0 rows affected (0.02 sec) mysql> DROP USER anonimo; Query OK, 0 rows affected (0.00 sec) Ha.! Si desea que el usuario octavo tenga todos los privilegios se tendra que realizar lo siguiente: mysql> GRANT all ON granja.* to octavo identified by '123' with GRANT OPTION; Query OK, 0 rows affected (0.00 sec)

32

Base de Datos II PRCTICA N 3


Una store procedure (Procedimiento Almacenado) es un pequeo programa que se encuentra almacenado en la base de datos, tiene muchas ventajas su uso ya que pueden realizarse cambios de cdigo sin necesidad de afectar a la aplicacin, tambin nos ayuda a minimizar el trfico en la red ya que en lugar de mandar una sentencia larga, solo se manda a ejecutar el nombre corto del store procedure, por lo que su ejecucin se vuelve mucho ms rpida. Para poder hacer uso de los store procedures debemos contar con la versin 5.0 de MySQL. Hagamos una pequea demostracin de ellos a continuacin: Antes que nada debemos revisar que contamos con la versin 5.0 de MySQL como mnimo, podemos usar cualquiera de las siguientes dos formas. mysql> show variables like '%version%';
+-------------------------+------------------------------+ | Variable_name | Value | +-------------------------+------------------------------+ | protocol_version | 10 | | version | 5.1.36-community-log | | version_comment | MySQL Community Server (GPL) | | version_compile_machine | ia32 | | version_compile_os | Win32 | +-------------------------+------------------------------+ 5 rows in set (0.05 sec)

mysql> select version();


+----------------------+ | version() | +----------------------+ | 5.1.36-community-log | +----------------------+ 1 row in set (0.02 sec)

Ahora creemos nuestro primer store procedure. Activamos la base de datos con la cual hemos estado trabajando: mysql> use granja; Database changed Si se desea crear un procedimiento almacenado que muestre la lista de animales registrados se lo hara de la siguiente forma: mysql> CREATE PROCEDURE Lista_Animales() SELECT * FROM animal; Query OK, 0 rows affected (0.00 sec) Para ejecutar el procedimiento almacenado se lo realizara dela siguienteforma: mysql> call Lista_Animales();
+----------+----------+------+----------------+--------+ | IdAnimal | Nombre | Edad | Raza | Precio | +----------+----------+------+----------------+--------+ | 1 | Yoyito | 1 | pincher | 2000 | | 3 | Mechn | 5 | Haspappi | 2500 |

33

Base de Datos II
| 4 | Titn | 1 | Doverman | 800 | | 5 | Sombra | 2 | Criollo | 70 | | 6 | Chiquita | 2 | Lova Siveriana | 800 | +----------+----------+------+----------------+--------+ 5 rows in set (0.00 sec) Query OK, 0 rows affected (0.03 sec)

S deseamos crear un procedimiento almacenado que devuelva el total de registros almacenados en la tabla animal, se lo realizara de la siguiente forma: mysql> CREATE PROCEDURE Total_Animales()SELECT COUNT(*) as Total_Animales FROManimal; Query OK, 0 rows affected (0.00 sec) Observe que el ejemplo aplica alias (AS) para especificar un nombre al resultado. Al ejecutar el procedimiento almacenado se obtiene: mysql> call Total_Animales();
+-------+ | Total | +-------+ | 5 | +-------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec)

El siguiente ejemplo, crea un procedimiento almacenado que guarda un registro en la tabla animal, para ello se pasan 4 parmetros p_nombre, p_edad, p_raza, p_precio, no se antepone la referencia IN ya que su aplicacin es por defecto. Delimiter es utilizado para evitar problemas por el uso del punto y coma (;) en el procedimiento almacenado. mysql> delimiter // mysql> CREATE PROCEDURE Agrega_Animal (p_nombre tinytext, p_edad int(2), p_raza varchar(20), p_precio int(7)) BEGIN Insert into animal(Nombre,Edad,Raza,Precio)values(p_nombre, p_edad, p_raza, p_precio); END //
Query OK, 0 rows affected (0.08 sec)

mysql> delimiter; Al llamar al procedimiento se lo aplicara de la siguiente forma: mysql> call Agrega_Animal('Chiquita','2','Lova Siveriana','800');
Query OK, 1 row affected (0.13 sec)

Para comprobar el resultado de aplicar el procedimiento almacenado se lo hara as: mysql> select * from animal;
+----------+----------+------+----------------+--------+ | IdAnimal | Nombre | Edad | Raza | Precio | +----------+----------+------+----------------+--------+ | 1 | Yoyito | 1 | pincher | 2000 | | 3 | Mechn | 5 | Haspappi | 2500 | | 4 | Titn | 1 | Doverman | 800 | | 5 | Sombra | 2 | Criollo | 70 | | 6 | Chiquita | 2 | Lova Siveriana | 800 | +----------+----------+------+----------------+--------+

34

Base de Datos II
5 rows in set (0.01 sec)

S se desea agregar otro registro tendramos: mysql> call Agrega_Animal('Chilito','3','Chiguagua','500'); Query OK, 1 row affected (0.13 sec) Tambin se puede aplicar un procedimiento almacenado que mezcle varias instrucciones sql y obtener varios resultados, como por ejemplo agregar un registro y mostrar un resultado: mysql> delimiter // mysql> CREATE PROCEDURE Agrega_Animal_contador (p_nombre tinytext, p_edad int(2),p_raza varchar(20), p_precio int(7)) BEGIN DECLARETotal INT; Insert into animal(Nombre,Edad,Raza,Precio)values(p_nombre,p_edad,p_raza,p_precio); SELECT COUNT(*) as Total_Ingresados FROM Animal INTO Total; SELECT Total; END // Query OK, 0 rows affected (0.00 sec) mysql> delimiter; S observa la primera instruccin SELECT, notar que al final,incluye el resultado a la variable Total, el resultado es mostrado por una segunda instruccin Select. Para observar el resultado de aplicar el procedimiento almacenado se debe escribir: mysql> call Agrega_Animal_Contador('Chocolate','3','Chiguagua','500');
+-------+ | Total | +-------+ | 7 | +-------+ 1 row in set (0.03 sec) Query OK, 0 rows affected (0.05 sec)

Para observar el resultado en la tabla aplicaramos: mysql> select * from animal;


+----------+-----------+------+----------------+--------+ | IdAnimal | Nombre | Edad | Raza | Precio | +----------+-----------+------+----------------+--------+ | 1 | Yoyito | 1 | pincher | 2000 | | 3 | Mechn | 5 | Haspappi | 2500 | | 4 | Titn | 1 | Doverman | 800 | | 5 | Sombra | 2 | Criollo | 70 | | 6 | Chiquita | 2 | Lova Siveriana | 800 | | 7 | Chilito | 3 | Chiguagua | 500 | | 8 | Chocolate | 3 | Chiguagua | 500 | +----------+-----------+------+----------------+--------+ 7 rows in set (0.00 sec)

Si se desea eliminar un procedimiento almacenado se puede utilizar:


mysql> DROP PROCEDURE IF EXISTS Total_Animales;

35

Base de Datos II
En el siguiente ejemplo se utilice un procedimiento almacenado que devuelve un resultado mediante una variable: DELIMITER // CREATEPROCEDURE Busca_Amimal(INletra CHAR(2), OUTTotal INT) BEGIN SELECT * FROM animal WHERE nombre LIKEletra; SELECT COUNT(*) INTOTotalFROM animal WHERE nombre LIKEletra; END // DELIMITER ; En la aplicacin de este procedimiento almacenado, busca todos los animales cuyo nombre empieza con la letra c, adems se utiliza la variable @candidad para extraer el total de nombres que empiezan con C CALL Busca_Amimal('c%', @cantidad);
+----------+-----------+------+----------------+--------+ | IdAnimal | Nombre | Edad | Raza | Precio | +----------+-----------+------+----------------+--------+ | 6 | Chiquita | 2 | Lova Siveriana | 800 | | 7 | Chilito | 3 | Chiguagua | 500 | | 8 | Chocolate | 3 | Chiguagua | 500 | +----------+-----------+------+----------------+--------+ 3 rows in set (0.03 sec) Query OK, 0 rows affected (0.03 sec)

Para evitar escribir el character % al momento de llamar al procedimiento almacenado, se podra utilizar la concatenacin:
SELECT * FROM animal WHERE nombre LIKE concat(letra,%);

Para mostrar el contenido de la variable @cantidad se lo realiza de la siguiente forma: mysql> select @cantidad;
+-----------+ | @cantidad | +-----------+ | 3 | +-----------+ 1 row in set (0.00 sec)

Para mostrar la lista de procedimientos almacenados se podra aplicar lo siguiente: Desde la base de datos principal de MySQL:
mysql>use mysql; mysql>SELECT specific_name from proc;o tambin SELECT specific_name from proc where type=procedure;

Desde la base de datos en la que se est trabajando:


mysql>SHOW PROCEDURE STATUS;
+------+----------------------+---------+--------------+-----------+-----------+------------+----------------------------+--------------------+------------------+ |Db | Name |Type |Definer |Modified |Created |Security_type|Comment|character_set_client|collation_connection|Database Collation| +------+----------------------+---------+--------------+-----------+-----------+------------+----------------------------+--------------------+------------------+ |granja|Agrega_Animal |PROCEDURE|root@localhost|2006-12-21 |2006-12-21 |DEFINER | | latin1 |latin1_swedish_ci |latin1_swedish_ci | |granja|Agrega_Animal_contador|PROCEDURE|root@localhost|2006-12-21 |2006-12-21 |DEFINER | | latin1 |latin1_swedish_ci |latin1_swedish_ci |

36

Base de Datos II
|granja|Busca_Amimal |PROCEDURE|root@localhost|2006-12-21 |2006-12-21 |DEFINER | | latin1 |latin1_swedish_ci |latin1_swedish_ci | |granja|Lista_Animales |PROCEDURE|root@localhost|2006-12-21 |2006-12-21 |DEFINER | | latin1 |latin1_swedish_ci |latin1_swedish_ci | |granja|Total_Animales |PROCEDURE|root@localhost|2006-12-21 |2006-12-21 |DEFINER | | latin1 |latin1_swedish_ci |latin1_swedish_ci | +------+----------------------+---------+--------------+-----------+-----------+------------+-------+--------------------+--------------------+------------------+ 5 rows in set (0.16 sec)

Para mostrar el contenido de un procedimiento almacenado se aplica: Desde la base de datos principal de MySQL:
mysql> use mysql; mysql> Select specific_name, body from proc where specific_name='agrega_animal';

Desde la base de datos en la que se est trabajando:


mysql> SHOW CREATE PROCEDURE Agrega_Animal;
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------+----------------------+--------------------+ | Procedure | sql_mode | Create Procedure | character_set_client | collation_connection | Database Collation | +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------+----------------------+--------------------+ | Agrega_Animal | | CREATE DEFINER=`root`@`localhost` PROCEDURE `Agrega_Animal`(p_nombre tinytext, p_edad int(2),p_raza varchar(20), p_precio int(7)) BEGIN Insert into animal(Nombre, Edad, Raza, Precio) values (p_nombre,p_edad,p_raza,p_precio); END | latin1 | latin1_swedish_ci | latin1_swedish_ci | +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------+----------------------+--------------------+

1 row in set (0.05 sec)

APLICACIN DE FUNCIONES: Suponiendo que usted desea mostrar la lista de animales y las fechas de las vacunas aplicadas con el formato dia/mes/ao: Primero se crear la funcin:
delimiter // CREATE FUNCTION fecha_db(fech DATETIME) RETURNS char(14) BEGIN RETURN date_format(fech,%d/%m/%Y); END // delimiter ;

Despus aplica la instruccin SQL utilizando la funcin:


SELECT IdAnimal, animal.Nombre, vacunas.Nombre As Vacuna, fecha_db(vacunas.fecha) FROM animal, vacunas WHERE animal.IdAnimal=vacunas.Id_Animal ORDER BY animal.Nombre; +------------+----------+-------------------+-------------------------------+ | IdAnimal | Nombre | Vacuna | fecha_db(vacunas.fecha) | +------------+----------+-------------------+------------------------------+ | 9 | KuKy | retroviral | 12/05/2012 | | 3 | Mechn | AntimoquilloA | 01/02/2012 | | 5 | Sombra | retroviral | 12/05/2012 | | 5 | Sombra | Antirabica | 12/05/2012 | | 4 | Titn | Anti rabia | 10/04/2012 | | 4 | Titn | Antirabica | 12/05/2012 | | 1 | Yoyito | Antiparasitaria| 01/01/2012 | | 1 | Yoyito | AntiMoquilloB | 25/03/2012 | +------------+--------+-----------------------+----------------------------+

37

Base de Datos II
S se desea realizar algo ms especializado, con detalles como nombre del mes y nombres de das de semana, entonces podramos realizar algo as:
DELIMITER // CREATE FUNCTION Fechadetalle(fecha DATETIME) RETURNS varchar(150) BEGIN DECLARE dia INT; DECLARE mes INT; DECLARE dia_s VARCHAR(20); DECLARE mes_s VARCHAR(20); DECLARE fecha_f VARCHAR(150); SET dia = DAYOFWEEK(fecha); SET mes = MONTH(fecha); CASE dia WHEN 1 THEN SET dia_s = Domingo; WHEN 2 THEN SET dia_s = Lunes; WHEN 3 THEN SET dia_s = Martes; WHEN 4 THEN SET dia_s = Miercoles; WHEN 5 THEN SET dia_s = Jueves; WHEN 6 THEN SET dia_s = Viernes; WHEN 7 THEN SET dia_s = Sabado; END CASE; CASE mes WHEN 1 THEN SET mes_s = Enero; WHEN 2 THEN SET mes_s = Febrero; WHEN 3 THEN SET mes_s = Marzo; WHEN 4 THEN SET mes_s = Abril; WHEN 5 THEN SET mes_s = Mayo; WHEN 6 THEN SET mes_s = Junio; WHEN 7 THEN SET mes_s = Julio; WHEN 8 THEN SET mes_s = Agosto; WHEN 9 THEN SET mes_s = Septiembre; WHEN 10 THEN SET mes_s = Octubre; WHEN 11 THEN SET mes_s = Noviembre; WHEN 12 THEN SET mes_s = Diciembre; END CASE; SET fecha_f = CONCAT(dia_s, ,DAY(fecha), ,mes_s, ,YEAR(fecha)); RETURN fecha_f; END // DELIMITER ;

Al realizar la misma consulta pero utilizando la nueva funcin tendramos:


SELECT IdAnimal, animal.Nombre, vacunas.Nombre As Vacuna, fechadetalle(fecha) FROM animal, vacunas WHERE animal.IdAnimal=vacunas.Id_Animal ORDER BY animal.Nombre; +-------------+------------+--------------------+------------------------------------+ | IdAnimal | Nombre | Vacuna | fechadetalle(vacunas.fecha) | +-------------+------------+--------------------+------------------------------------+ | 9 | KuKy | retroviral | Sabado 12 Mayo 2012 | | 3 | Mechn | AntimoquilloA | Miercoles 1 Febrero 2012 | | 5 | Sombra | retroviral | Sabado 12 Mayo 2012 | | 5 | Sombra | Antirabica | Sabado 12 Mayo 2012 |

38

Base de Datos II
| 4 | Titn | Anti rabia | Martes 10 Abril 2012 | | 4 | Titn | Antirabica | Sabado 12 Mayo 2012 | | 1 | Yoyito | Antiparasitaria | Domingo 1 Enero 2012 | | 1 | Yoyito | AntiMoquilloB | Domingo 25 Marzo 2012 | +-------------+-----------+---------------------+-----------------------------------+ 8 rows in set (0.02 sec)

Tambin se puede realizar funciones de carcter matemtico:


delimiter// create function Factorial(n int) returns int begin Declare fa int default 1; Declare num int default 1; while num<=n do Set fa=fa*num; Set num=num+1; end while; return fa; end // delimiter;

Para respaldar la base de datos granja incluido los procedimientos almacenados MYSQLDUMP -u root -p granja --routines > backup_con_procedures.sql Ejemplo N1 de uso de cursores en mysql, se trata de un procedimiento almacenado que almacena los datos de la tabla VACUNAS aplicados a los canes registrados en la tabla ANIMAL, para eso se pasa el nombre del animal y se busca su IdAnimal en la tabla ANIMAL para almacenarlo en la tabla VACUNAS, este cursor utiliza SQLSTATE para controlar el recorrido del cursor:
delimiter // CREATE PROCEDURE RegistraVacuna(pNombreAnimal tinytext, pNombreVacuna tinytext, pfecha date) BEGIN DECLARE done BOOLEAN DEFAULT FALSE; DECLARE id integer; DECLARE nomb tinytext; DECLARE c1 cursor for SELECT idanimal, nombre from animal ORDER BY idanimal ASC; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = TRUE; open c1; c1_loop: LOOP FETCH c1 INTO id, nomb; IF done THEN LEAVE c1_loop; END IF; IF strcmp(nomb,pNombreAnimal)=0 THEN INSERT INTO vacunas (Nombre,Id_Animal,fecha) VALUES (pNombreVacuna, id, pfecha); END IF; END LOOP c1_loop; close c1; END // delimiter ;

Ejemplo N 2 de uso de cursores en mysql, se trata de un procedimiento almacenado que almacena los datos de la tabla VACUNAS aplicados a los canes registrados en la tabla ANIMAL, para eso se pasa el nombre del animal y se busca su IdAnimal en la tabla ANIMAL para almacenarlo en la tabla VACUNAS, este cursor utiliza FOR NOT FOUND para controlar el recorrido del cursor:
delimiter // CREATE PROCEDURE RegistraVacuna2(pNombreAnimal tinytext, pNombreVacuna tinytext, pfecha date) BEGIN DECLARE done BOOLEAN DEFAULT FALSE;

39

Base de Datos II
DECLARE id integer; DECLARE nomb tinytext; DECLARE c1 cursor for SELECT idanimal, nombre From animal ORDER BY idanimal ASC; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; open c1; c1_loop: LOOP FETCH c1 INTO id,nomb; IF done THEN LEAVE c1_loop; END IF; if strcmp(nomb,pNombreAnimal)=0 then INSERT INTO vacunas (Nombre,Id_Animal,fecha) VALUES (pNombreVacuna, id, pfecha); end if; END LOOP c1_loop; close c1; END // delimiter;

Ejemplo N 3
delimiter // CREATE PROCEDURE RegistraVacuna3(pNombreAnimal tinytext, pNombreVacuna tinytext, pfecha date) BEGIN DECLARE done BOOLEAN DEFAULT FALSE; DECLARE id integer; DECLARE nomb tinytext; DECLARE c1 cursor for SELECT idanimal, nombre from animal ORDER BY idanimal ASC; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; open c1; REPEAT FETCH c1 INTO id,nomb; if strcmp(nomb,pNombreAnimal)=0 then INSERT INTO vacunas (Nombre,Id_Animal,fecha) VALUES (pNombreVacuna, id, pfecha); end if; UNTIL done END REPEAT; close c1; END // delimiter ;

40

Base de Datos II

ANEXO I
TIPOS DE DATOS DE MYSQL
LISTADO Y DESCRIPCIN DE LOS DISTINTOS TIPOS DE DATOS DE MYSQL. Despus de la fase de diseo de una base de datos, en necesario crear las tablas correspondientes dentro de la base de datos. Para cada campo de cada una de las tablas, es necesario determinar el tipo de datos que contiene, para de esa forma ajustar el diseo de la base de datos, y conseguir un almacenamiento ptimo con la menor utilizacin de espacio. El presente artculo describe cada uno de los tipos de datos que puede tener un campo en Mysql. Los tipos de datos que puede haber en un campo, se pueden agrupar en tres grandes grupos: 1.- TIPOS NUMRICOS: Existen tipos de datos numricos, que se pueden dividir en dos grandes grupos, los que estn en coma flotante (con decimales) y los que no. TinyInt: es un nmero entero con o sin signo. Con signo el rango de valores vlidos va desde -128 a 127. Sin signo, el rango de valores es de 0 a 255 Bit Bool: un nmero entero que puede ser 0 1 SmallInt: nmero entero con o sin signo. Con signo el rango de valores va desde -32768 a 32767. Sin signo, el rango de valores es de 0 a 65535. MediumInt: nmero entero con o sin signo. Con signo el rango de valores va desde 8.388.608 a 8.388.607. Sin signo el rango va desde 0 a16777215. Integer, Int: nmero entero con o sin signo. Con signo el rango de valores va desde 2147483648 a 2147483647. Sin signo el rango va desde 0 a 429.4967.295 BigInt: nmero entero con o sin signo. Con signo el rango de valores va desde 9.223.372.036.854.775.808 a 9.223.372.036.854.775.807. Sin signo el rango va desde 0 a 18.446.744.073.709.551.615. Float: nmero pequeo en coma flotante de precisin simple. Los valores vlidos van desde -3.402823466E+38 a -1.175494351E-38, 0 y desde 1.175494351E-38 a 3.402823466E+38. xReal, Double: nmero en coma flotante de precisin doble. Los valores permitidos van desde -1.7976931348623157E+308 a -2.2250738585072014E-308, 0 y desde 2.2250738585072014E-308 a 1.7976931348623157E+308 Decimal, Dec, Numeric: Nmero en coma flotante desempaquetado. El nmero se almacena como una cadena

41

Base de Datos II

Tipo de Campo TINYINT SMALLINT MEDIUMINT INT INTEGER BIGINT FLOAT(X) FLOAT DOUBLE DOUBLE PRECISION REAL DECIMAL(M,D NUMERIC(M,D)

Tamao de Almacenamiento 1 byte 2 bytes 3 bytes 4 bytes 4 bytes 8 bytes 4 8 bytes 4 bytes 8 bytes 8 bytes 8 bytes M+2 bytes s D > 0, M+1 bytes s D = 0 M+2 bytes if D > 0, M+1 bytes if D = 0

2.- TIPOS FECHA: A la hora de almacenar fechas, hay que tener en cuenta que Mysql no comprueba de una manera estricta si una fecha es vlida o no. Simplemente comprueba que el mes esta comprendido entre 0 y 12 y que el da esta comprendido entre 0 y 31. Date: tipo fecha, almacena una fecha. El rango de valores va desde el 1 de enero del 1001 al 31 de diciembre de 9999. El formato de almacenamiento es de ao-mes-dia DateTime: Combinacin de fecha y hora. El rango de valores va desde el 1 de enero del 1001 a las 0 horas, 0 minutos y 0 segundos al 31 de diciembre del 9999 a las 23 horas, 59 minutos y 59 segundos. El formato de almacenamiento es de ao-mes-dia horas:minutos:segundos TimeStamp: Combinacin de fecha y hora. El rango va desde el 1 de enero de 1970 al ao 2037. El formato de almacenamiento depende del tamao del campo:
Tamao 14 12 8 6 4 Formato AoMesDiaHoraMinutoSegundo aaaammddhhmmss AoMesDiaHoraMinutoSegundo aammddhhmmss oMesDia aaaammdd AoMesDia aammdd AoMes aamm

42

Base de Datos II
2 Ao aa

Time: almacena una hora. El rango de horas va desde -838 horas, 59 minutos y 59 segundos a 838, 59 minutos y 59 segundos. El formato de almacenamiento es de 'HH:MM:SS' Year: almacena un ao. El rango de valores permitidos va desde el ao 1901 al ao 2155. El campo puede tener tamao dos o tamao 4 dependiendo de si queremos almacenar el ao con dos o cuatro dgitos.
Tipo de Campo DATE DATETIME TIMESTAMP TIME YEAR Tamao de Almacenamiento 3 bytes 8 bytes 4 bytes 3 bytes 1 byte

3.- TIPOS DE CADENA: Char(n): almacena una cadena de longitud fija. La cadena podr contener desde 0 a 255 caracteres. VarChar(n): almacena una cadena de longitud variable. La cadena podr contener desde 0 a 255 caracteres. Dentro de los tipos de cadena se pueden distinguir otros dos subtipos, los tipo Test y los tipo BLOB (Binary large Object) La diferencia entre un tipo y otro es el tratamiento que reciben a la hora de realizar ordenamientos y comparaciones. Mientras que el tipo test se ordena sin tener en cuenta las Maysculas y las minsculas, el tipo BLOB se ordena tenindolas en cuenta. Los tipos BLOB se utilizan para almacenar datos binarios como pueden ser ficheros. TinyText y TinyBlob: Columna con una longitud mxima de 255 caracteres. Blob y Text: un texto con un mximo de 65535 caracteres. MediumBlob y MediumText: un texto con un mximo de 16.777.215 caracteres. LongBlob y LongText: un texto con un mximo de caracteres 4.294.967.295. Hay que tener en cuenta que debido a los protocolos de comunicacin los paquetes pueden tener un mximo de 16 Mb.

43

Base de Datos II
Enum: campo que puede tener un nico valor de una lista que se especifica. El tipo Enum acepta hasta 65535 valores distintos Set: un campo que puede contener ninguno, uno varios valores de una lista. La lista puede tener un mximo de 64 valores.
Tipo de campo CHAR(n) VARCHAR(n) TINYBLOB, TINYTEXT BLOB, TEXT MEDIUMBLOB, MEDIUMTEXT LONGBLOB, LONGTEXT ENUM('value1','value2',...) SET('value1','value2',...) Tamao de Almacenamiento n bytes n +1 bytes Longitud+1 bytes Longitud +2 bytes Longitud +3 bytes Longitud +4 bytes 1 dos bytes dependiendo del nmero de valores 1, 2, 3, 4 8 bytes, dependiendo del nmero de valores

Diferencia de almacenamiento entre los tipos Char y VarChar

Valor '' 'ab' 'abcd' 'abcdefgh'

CHAR(4) '' 'ab ' 'abcd' 'abcd'

Almace namiento 4 bytes 4 bytes 4 bytes 4 bytes

VARCHAR(4) " 'ab' 'abcd' 'abcd'

Almace namiento 1 byte 3 bytes 5 bytes

44

Base de Datos II

ANEXO II
DESDE LA CONSOLA MYSQL Operaciones bsicas Operacin Entrar a la consola de MySQL Entrar a la consola de MySQL como el usuario usuario Salir de la consola de MySQL Ayuda de la consola (hay que estar en ella) Operaciones con Bases de datos Operacin Crear base de datos Eliminar base de datos Mostrar las bases de datos disponibles Trabajar sobre con una base de datos Operaciones con Tablas Operacin Mostrar tablas de la BD Muestra los campos de la tabla Crear tabla Crear tabla temporal Crear tabla verificando que no existe Eliminar tabla Editar tabla Cambiar nombre a tabla Bloquea tabla Desbloquea tabla Operaciones con Columnas Operacin Comando Aadir columna alter table nombretabla ADD nombrecolumna tipodato; Cambia el tipo de dato de la alter table nombretabla change nombrecolumna Comando show tables from basededatos ; show columns from tabla ; o describe tabla ; create table nombretabla (columna1 tipodato, columna2 tipodato...) ; create temporary table nombretabla (columna1 tipodato); create table inf not exists nombretabla (columna1 tipodato, columna2 tipodato...) ; drop table nombretabla ; alter table nombretabla operacion ; alter table nombretablaviejo rename nombretablanuevo; lock nombretabla1, nombretabla2... ; unlock nombretabla1 READ|WRITE, nombretabla2 READ|WRITE... ; Comando create database basededatos ; drop database basededatos ; show databases ; use basededatos ; Comando mysql mysql -u usuario -p \q \help o \h

45

Base de Datos II
columna Cambiar el nombre de la columna Eliminar columna Aadir ndice a columna nombrecolumna nuevotipodato; alter table nombretabla change nombrecolumnaviejo nombrecolumnanuevo tipodato; alter table nombretabla drop nombrecolumna; create index nombrendice on nombretabla (nombrecolumna1,...); alter table nombretabla add index (nombrecolumna); create primary key on nombretabla (nombrecolumna1,...); alter table nombretabla add primary key (nombrecolumna); alter table nombretabla drop primary key;

Aadir campo clave (key) Eliminar campo clave (key) Operaciones con Datos Operacin Insertar nuevo dato en tabla

Importar archivo de datos a tabla Seleccionar datos de una tabla Borrar todos los datos de una tabla (conserva la tabla con sus campos) Actualizar un dato del campo1

Comando insert into nombretabla values (valorcampo1,'valorcampo2',valorcampo3...); load data infile 'archivo.txt' into table nombretabla; select nombrecampo1, nombrecampo2... from nombretabla where condicin delete from nombretabla;

Contar registros que cumplen un criterio Operaciones con ndices Operacin Crear ndice Elimina ndice Mostrar claves

update nombretabla SET nombrecampo1='nuevovalorcampo' WHERE nombrecampo2='valorcampo2'; select count(campos) from nombretabla;

Comando create index nombreindice on nombretabla(listanombrescolumnas); drop index indexname on tablename; o alter table nombretabla drop index nombreindice; show keys from nombretabla ; o show index from nombretabla;

46

Base de Datos II

ANEXO III
INSTALAR MYSQL EN EL DSN DEL SISTEMA (MYODBC) CMO INSTALAR MYSQL EN EL DSN DE SISTEMA

Podemos instalar MySQL como origen de datos de sistema ODBC para, por ejemplo, conectar a las bases de datos de manera remota. Para ello necesitamos aadir esa base de datos al DSN del sistema.

Los pasos para hacer esto son: o Instalar controladores ODBC para MySQL: MyODBC. o Aadir la base de datos que queramos a la lista de DSN de sistema

El ejemplo siguiente es aplicable a plataformas Microsoft Windows 2000.

INSTALAR CONTROLADORES ODBC PARA MYSQL: MYODBC


Descargamos los controladores MyODBC de Internet. Descomprimimos el archivo y ejecutamos SETUP.EXE Seguimos las instrucciones en pantalla hasta concluir la instalacin.

AADIR LA BASE DE DATOS MYSQL AL DSN DE SISTEMA


Vamos a Inicio\Configuracin\Panel de control\Herramientas administrativas\Orgenes de datos (ODBC). Se abre la ventana 'Administrador de orgenes de datos ODBC'. Pulsamos la pestaa 'DNS de sistema'. Pulsamos 'Agregar'. Como controlador para el origen de los datos elegimos 'MySQL' y pulsamos finalizar. Se abre la ventana 'TDX MySQL driver default configuration'. o En 'Windows DSN name' ponemos el nombre que queremos dar a esa conexin. Ej: Musica2002. o En 'MySQL database name' ponemos el nombre de la base de datos MySQL que queremos aadir al DSN (la base de datos debe existir previamente). Ej: Musica2002. o En principio, los dems campos pueden dejarse en blanco. Pulsamos 'OK'. La base de datos debe aparecer entonces en la lista de DSN de sistema.

47

Base de Datos II

48

Base de Datos II

ANEXO IV
REFERENCIA DE USO DE 'ALTER TABLE' EN MYSQL
SOBRE LA TABLA ALTER TABLE ejemplo ENGINE = InnoDB Cambiar el tipo de motor (engine) de la tabla 'ejemplo' ALTER TABLE personas RENAME usuarios Cambia el nomnbre de la tabla 'personas' a 'usuarios' ALTER TABLE ejemplo AUTO_INCREMENT=1000 En la tabla 'ejemplo' cualquiera que sea la columna que tenga 'AUTO_INCREMENT' en sus propiedades (solo puede haber una), los nuevos registros comenzarn a partir de '1000' o cualquier nmero indicado, no es posible utilizar un valor ya existente. ALTER TABLE ejemplo CONVERT TO CHARACTER SET latin1 La tabla 'ejemplo' ahora almacenar sus valores en base al juego de caracteres 'latin1' (iso8859-1). OPERACIONES CON DROP ALTER TABLE ejemplo DROP COLUMN nombre Elimina la columna 'nombre' de la tabla 'ejemplo'. ALTER TABLE ejemplo DROP COLUMN nombre, DROP COLUMN paterno Elimina ms de una columna. ALTER TABLE ejemplo DROP COLUMN nombre, DROP COLUMN paterno Elimina ms de una columna. ALTER TABLE ejemplo DROP INDEX usuario Elimina el ndice 'usuario'. ALTER TABLE ejemplo DROP PRIMARY KEY Elimina la llave primaria de la tabla 'ejemplo' ALTER TABLE ejemplo DROP FOREIGN KEY id_usuario Elimina de la tabala 'ejemplo' la llave foranea 'id_usuario'. OPERACIONES CON CHANGE Y MODIFY ALTER TABLE ejemplo CHANGE monto cantidad FLOAT(8,2) Cambia el nombre de la columna 'monto' al nuevo nombre 'cantidad' con la definicin del tipo de datos. ALTER TABLE ejemplo CHANGE cantidad cantidad FLOAT(10,2) Cambia solo el tipo de datos de la columna, conservando el mismo nombre.

49

Base de Datos II
ALTER TABLE ejemplo MODIFY cantidad FLOAT(10,2) Cambia solo el tipo de datos de la columna, conservando el mismo nombre. (Igual que el anterior) ALTER TABLE ejemplo MODIFY cantidad FLOAT(6,2) NOT NULL Cambia el tipo de datos de la columna 'cantidad' y especifica que no admite nulos. ALTER TABLE ejemplo MODIFY paterno VARCHAR(30) Modifica el tamao de la columna 'paterno'. ALTER TABLE ejemplo MODIFY correo CONVERT TO CHARACTER SET utf8 Es posible convertir solo una columna, en este caso 'correo' a un juego de caracteres distinto al de todo el resto de la tabla. OPERACIONES CON ADD ALTER TABLE ejemplo ADD fecha DATE Aade una columna llamada 'fecha' del tipo 'DATE' al final de todas las dems existentes. ALTER TABLE ejemplo ADD INDEX(categoria) Aade un ndice a la columna 'categoria'. ALTER TABLE ejemplo ADD INDEX(categoria), ADD PRIMARY KEY(clave) Aade un ndice a la columna 'categoria' y adems crea la llave primaria en la columna 'clave'. ALTER TABLE ejemplo ADD UNIQUE(email) Aade a la columna 'email' un ndice del tipo nico, no puede haber dos iguales. ALTER TABLE ejemplo ADD consecutivo BIGINT AUTO_INCREMENT, ADD INDEX(consecutivo) Aade la columna 'consecutivo' con la caracterstica de auto incremento y adems genera un ndice sobre la misma. ALTER TABLE ejemplo ADD materno VARCHAR(20) AFTER paterno Aade la columna 'materno' despus de la columna 'paterno'. ALTER TABLE ejemplo ADD id INT FIRST Aade la columna 'id' en primer lugar con respecto a las existentes. ALTER TABLE usuarios ADD FOREIGN KEY(id) REFERENCES entradas(id_user) Aade un 'Foreign key' en la columna 'id' de la tabla 'usuarios' que apunta a la columna 'id_user' de la tabla 'entradas'.

50

Base de Datos II

ANEXO IV FUNCIONES
Si consideramos que MySQL es rico en lo que respecta a operadores, en lo que se refiere a funciones, podemos considerarlo millonario. MySQL dispone de multitud de funciones. Pero no las explicaremos aqu, ya que este curso incluye una referencia completa. Tan slo las agruparemos por tipos, e incluiremos los enlaces correspondientes a la documentacin de cada una. FUNCIONES DE CONTROL DE FLUJO Las funciones de esta categora son: IF Eleccin en funcin de una expresin booleana IFNULL Eleccin en funcin de si el valor de una expresin es NULL NULLIF Devuelve NULL en funcin del valor de una expresin FUNCIONES MATEMTICAS Las funciones de la categora de matemticas son: ABS ACOS ASIN ATAN y ATAN2 CEILING y CEIL COS COT CRC32 DEGREES EXP FLOOR LN LOG LOG10 LOG2 MOD o % PI POW o POWER RADIANS RAND ROUND SIGN SIN SQRT TAN Devuelve el valor absoluto Devuelve el arcocoseno Devuelve el arcoseno Devuelven el arcotangente Redondeo hacia arriba Coseno de un ngulo Cotangente de un ngulo Clculo de comprobacin de redundancia cclica Conversin de grados a radianes Clculo de potencias de e Redondeo hacia abajo Logaritmo natural Logaritmo en base arbitraria Logaritmo en base 10 Logaritmo en base dos Resto de una divisin entera Valor del nmero Valor de potencias Conversin de radianes a grados Valores aleatorios Clculo de redondeos Devuelve el signo Clculo del seno de un ngulo Clculo de la raz cuadrada Clculo de la tangente de un ngulo

51

Base de Datos II
TRUNCATE Elimina decimales

FUNCIONES DE CADENAS Las funciones para tratamiento de cadenas de caracteres son: ASCII BIN BIT_LENGTH CHAR CHAR_LENGTH o CHARACTER_LENGTH COMPRESS CONCAT CONCAT_WS CONV ELT EXPORT_SET FIELD FIND_IN_SET HEX INSERT INSTR LEFT LENGTH u OCTET_LENGTH LOAD_FILE LOCATE o POSITION LOWER o LCASE LPAD LTRIM MAKE_SET OCT ORD QUOTE REPEAT REPLACE REVERSE RIGHT RPAD RTRIM SOUNDEX SOUNDS LIKE SPACE Valor de cdigo ASCII de un carcter Converin a binario Clculo de longitud de cadena en bits Convierte de ASCII a carcter Clculo de longitud de cadena en caracteres Comprime una cadena de caracteres Concatena dos cadenas de caracteres Concatena cadenas con separadores Convierte nmeros entre distintas bases Eleccin entre varias cadenas Expresiones binarias como conjuntos Busca el ndice en listas de cadenas Bsqueda en listas de cadenas Conversin de nmeros a hexadecimal Inserta una cadena en otra Busca una cadena en otra Extraer parte izquierda de una cadena Calcula la longitud de una cadena en bytes Lee un fichero en una cadena Encontrar la posicin de una cadena dentro de otra Convierte una cadena a minsculas Aade caracteres a la izquierda de una cadena Elimina espacios a la izquierda de una cadena Crea un conjunto a partir de una expresin binaria Convierte un nmero a octal Obtiene el cdigo ASCII, incluso con caracteres multibyte Entrecomilla una cadena Construye una cadena como una repeticin de otra Busca una secuencia en una cadena y la sustituye por otra Invierte el orden de los caracteres de una cadena Devuelve la parte derecha de una cadena Inserta caracteres al final de una cadena Elimina caracteres blancos a la derecha de una cadena Devuelve la cadena "soundex" para una cadena concreta Compara cadenas segn su pronunciacin Devuelve cadenas consistentes en espacios

52

Base de Datos II
SUBSTRING o MID SUBSTRING_INDEX TRIM UCASE o UPPER UNCOMPRESS UNCOMPRESSED_LENGTH UNHEX Extraer subcadenas de una cadena Extraer subcadenas en funcin de delimitadores Elimina sufijos y/o prefijos de una cadena. Convierte una cadena a maysculas Descomprime una cadena comprimida mediante COMPRESS Calcula la longitud original de una cadena comprimida Convierte una cadena que representa un nmero hexadecimal a cadena de caracteres

FUNCIONES DE COMPARACIN DE CADENAS Adems de los operadores que vimos para la comparacin de cadenas, existe una funcin: STRCMP Compara cadenas FUNCIONES DE FECHA Funciones para trabajar con fechas:
ADDDATE ADDTIME CONVERT_TZ CURDATE o CURRENTDATE CURTIME o CURRENT_TIME DATE DATEDIFF DATE_ADD DATE_SUB DATE_FORMAT DAY o DAYOFMONTH DAYNAME DAYOFWEEK DAYOFYEAR EXTRACT FROM_DAYS FROM_UNIXTIME GET_FORMAT HOUR Suma un intervalo de tiempo a una fecha Suma tiempos Convierte tiempos entre distintas zonas horarias Obtener la fecha actual Obtener la hora actual Extraer la parte correspondiente a la fecha Calcula la diferencia en das entre dos fechas Aritmtica de fechas, suma un intervalo de tiempo Aritmtica de fechas, resta un intervalo de tiempo Formatea el valor de una fecha Obtiene el da del mes a partir de una fecha Devuelve el nombre del da de la semana Devuelve el ndice del da de la semana Devuelve el da del ao para una fecha Extrae parte de una fecha Obtener una fecha a partir de un nmero de das Representacin de fechas UNIX en formato de cadena Devuelve una cadena de formato Extrae la hora de un valor time

53

Base de Datos II
LAST_DAY MAKEDATE MAKETIME MICROSECOND MINUTE MONTH MONTHNAME NOW o CURRENT_TIMESTAMP o LOCALTIME o LOCALTIMESTAMP o SYSDATE PERIOD_ADD PERIOD_DIFF QUARTER SECOND SEC_TO_TIME STR_TO_DATE Devuelve la fecha para el ltimo da del mes de una fecha Calcula una fecha a partir de un ao y un da del ao Calcula un valor de tiempo a partir de una hora, minuto y segundo Extrae los microsegundos de una expresin de fecha/hora o de hora Extrae el valor de minutos de una expresin time Devuelve el mes de una fecha Devuelve el nombre de un mes para una fecha Devuelve la fecha y hora actual

SUBDATE SUBTIME TIME TIMEDIFF TIMESTAMP TIMESTAMPADD TIMESTAMPDIFF TIME_FORMAT TIME_TO_SEC TO_DAYS UNIX_TIMESTAMP

Aade meses a un periodo (ao/mes) Calcula la diferencia de meses entre dos periodos (ao/mes) Devuelve el cuarto del ao para una fecha Extrae el valor de segundos de una expresin time Convierte una cantidad de segundos a horas, minutos y segundos Obtiene un valor DATETIME a partir de una cadena con una fecha y una cadena de formato Resta un intervalo de tiempo de una fecha Resta dos expresiones time Extrae la parte de la hora de una expresin fecha/hora Devuelve en tiempo entre dos expresiones de tiempo Convierte una expresin de fecha en fecha/hora o suma un tiempo a una fecha Suma un intervalo de tiempo a una expresin de fecha/hora Devuelve la diferencia entre dos expresiones de fecha/hora Formatea un tiempo Convierte un tiempo a segundos Calcula el nmero de das desde el ao cero Devuelve un timestamp o una fecha en

54

Base de Datos II
formato UNIX, segundos desde 1070 Devuelve la fecha UTC actual Devuelve la hora UTC actual Devuelve la fecha y hora UTC actual Calcula el nmero de semana para una fecha Devuelve el nmero de da de la semana para una fecha Devuelve el nmero de la semana del ao para una fecha Extrae el ao de una fecha Devuelve el ao y semana de una fecha

UTC_DATE UTC_TIME UTC_TIMESTAMP WEEK WEEKDAY WEEKOFYEAR YEAR YEARWEEK

DE BSQUEDA DE TEXTO Funcin de bsqueda de texto:


MATCH

FUNCIONES DE CASTING (CONVERSIN DE TIPOS)


CAST o CONVERT Conversin de tipos explcita

MISCELANEA Funciones generales:


DEFAULT FORMAT GET_LOCK INET_ATON Devuelve el valor por defecto para una columna Formatea el nmero segn la plantilla '#,###,###.## Intenta obtener un bloqueo con el nombre dado Obtiene el entero equivalente a la direccin de red dada en formato de cuarteto con puntos INET_NTOA Obtiene la direccin en formato de cuarteto con puntos dado un entero IS_FREE_LOCK Verifica si un nombre de bloqueo est libre IS_USED_LOCK Verifica si un nombre de bloqueo est en uso MASTER_POS_WAIT Espera hasta que el esclavo alcanza la posicin especificada en el diario maestro RELEASE_LOCK Libera un bloqueo UUID Devuelve un identificador nico universal

DE GRUPOS Funciones de grupos:


AVG BIT_AND Devuelve el valor medio Devuelve la operacin de bits AND para todos los bits de una

55

Base de Datos II
expresin Devuelve la operacin de bits OR para todos los bits de una expresin Devuelve la operacin de bits XOR para todos los bits de una expresin Devuelve el nmero de valores distintos de NULL en las filas recuperadas por una sentencia SELECT Devuelve el nmero de valores diferentes, distintos de NULL Devuelve una cadena con la concatenacin de los valores de un grupo Devuelve el valor mnimo de una expresin Devuelve el valor mximo de una expresin Devuelve la desviacin estndar de una expresin Devuelve la suma de una expresin Devuelve la varianza estndar de una expresin

BIT_OR BIT_XOR COUNT COUNT DISTINCT GROUP_CONCAT MIN MAX STD o STDDEV SUM VARIANCE

56

Base de Datos II

ANEXO V
EJEMPLOS DE USO DE mysqldump
Respaldo de una sola base de datos completa
mysqldump clientes > clientes.sql

Respaldo de una sola base de datos con dos tablas


mysqldump clientes saldos facturas > clientes.sql

Respaldo completo de base de datos clientes y ventas


mysqldump --databases clientes ventas > respaldo_cli_ven_sep_2011.sql

Respaldamos la base de datos clientes pero ignoramos las tablas 'temporal' y 'basura' (Obligatorio indicar base.tabla)
mysqldump clientes --ignore-table=clientes.temporal --ignore-table=clientes.basura > respaldo_clientes_2011.sql

Respaldo completo de todas las bases de datos


mysqldump --all-databases > respaldo_full_sep_2011.sql

Si se tiene contrasea (como debe ser) se indica usuario y que pregunte por el password
mysqldump -u root -p --all-databases > respaldo_full_sep_2011.sql

No muy buena idea, pero se puede indicar el password directamente, adems nos aseguramos que se indiquen las opciones por defecto ms comunes
mysqldump -u root -psecreto --all-databases --opt > respaldo_full_sep_2011.sql

Respaldo de una base de datos transaccional tipo InnoDB o BDB asegurando su consistencia
mysqldump -u root -p --single-transaction --quick ventas > respaldo_ventas_2011.sql

Todas las bases de datos del host 192.168.0.100 y agregamos los procedemientos almacenados que sean respaldados tambin.
mysqldump -h 192.168.1.100 -u root -p --routines --all-databases > respaldo_ventas_2011.sql

Respaldo completo de un servidor MySQL maestro en replicacin, indicando en el respaldo la posicin para sincronizacin con servidores esclavos, adems aadimos insertar completos que incluyen los nombres de columnas en sentencias INSERT
mysqldump -u root --password=secreto --all-databases --master-data --complete-insert > respaldo_2011.sql

Respaldamos solo el esquema de clientes sin registros


mysqldump --no-data clientes > respaldo_esquema_clientes_2011.sql

Se produce una salida compatible para restaurar la base de datos en Oracle


mysqldump --compatible=oracle --databases clientes > respaldo_clientes_oracle_2011.sql MYSQLDUMP

CON GZIP

Al mismo tiempo que realizamos el respaldo podemos comprimirlo para ahorrar espacio en nuestros respaldos.
mysqldump -u root -p --all-databases | gzip > respaldo_2011.sql.gz

Para descomprimir lo anterior y dejar el archivo listo para la restauracin en si utiliza gunzip
gunzip respaldo_2011.sql.gz

57

Base de Datos II
RESTAURANDO EL RESPALDO
Hay varias maneras de lograr la restauracin del respaldo. Con el comando mysql:
mysql -u root -p < respaldo.sql

Si se utiliz gzip para comprimir el respaldo, se puede descomprimir y restaurar en una sola lnea:
gunzip < respaldo.sql.gz | mysql -u root -p

Si el respaldo contiene una sola base de datos y no contiene sentencias 'drop database' y 'create database', se puede entonces indicar la base de datos donde se debe realizar la restauracin:
mysql -u root -p clientes < respaldo_clientes.sql

Lo anterior (cuando ya existe la base de datos) tambin se puede lograr con el comando
mysqlimport mysqlimport -u root -p clientes respaldo_clientes.sql

Es posible tambin utilizar la opcin "-e" (execute) de mysql, que permite ejecutar un archivo con sentencias SQL, y un respaldo es exactamente eso, un largo script con sentencias SQL para recrear esquema y datos:
mysql -u root -p -e "source /ruta/a/respaldo.sql"

58

Base de Datos II

59

Base de Datos II

Anexo VI
SQLSTATE vs cdigos de error MySQL En teora es mejor utilizar codigos SQLSTATE porque son independientes de la plataforma y hacen a nuestro cdigo ms portable. Sin embargo, hay algunas razones para utilizar el cdigo de error de MySQL, especficamente en la escritura de Stored Procedures.

El lenguaje para la escritura de procedimientos almacenados en Oracle y SQL Server es totalmente incompatible con el de MySQL. El de DB2, es algo ms compatible (ambos basados en SQL:2003 standard). No todos los cdigos de error MySQL tienen su equivalente en cdigo SQLSTATE. Cada error de Mysql est relacionado con un cdigo de error SQLState, pero no siempre esta relacin es uno a uno. HY000 es un cdigo de error SQLSTATE para propsitos generales que devuelve MySQL cuando su cdigo de error no tiene asociado un cdigo SQLSTATE.

Errores comumes MySQL y cdigos SQLSTATE Cdigo de error MySQL 1011 1021 1022 1027 1036 1048 1062 1099 1100 Cdigo SQLSTATE HY000 HY000 23000 HY000 HY000 23000 23000 HY000 HY000

Mensaje de error Error on delete of %s (errno: %d) Disk full (%s); waiting for someone to free some space ... Cant write; duplicate key in table %s %s is locked against change Table %s is read only Column %s cannot be null Duplicate entry %s for key %d Table %s was locked with a READ lock and cant be updated Table %s was not locked with LOCK TABLES The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay Incorrect parameters to procedure %s The table %s is full Delayed insert thread couldnt get requested lock for table %s

1104

42000

1106 1114 1150

42000 HY000 HY000

60

Base de Datos II
1165 1242 1263 1264 1265 1312 1317 1319 1325 1329 1336 1337 1338 1339 1348 1357 1358 1362 1363 HY000 21000 22004 22003 1000 0A000 70100 42000 24000 2000 42000 42000 42000 20000 HY000 HY000 HY000 HY000 HY000 INSERT DELAYEDcant be used with table %s because it is locked withLOCK TABLES Subquery returns more than 1 row Column set to default value; NULL supplied to NOT NULL column %s at row %ld Out of range value adjusted for column %s at row %ld Data truncated for column %s at row %ld SELECTin a stored program must haveINTO Query execution was interrupted Undefined CONDITION: %s Cursor is already open No data to FETCH USEis not allowed in a stored program Variable or condition declaration after cursor or handler declaration Cursor declaration after handler declaration Case not found for CASE statement Column %s is not updatable Cant drop a %s from within another stored routine GOTOis not allowed in a stored program handler Updating of %s row is not allowed in %s trigger There is no %s row in %s trigger

61

Base de Datos II

ANEXO VII
Posibilidades de utilizar los permisos de usuarios en MySQL
Permiso
ALL [PRIVILEGES] ALTER ALTER ROUTINE CREATE CREATE ROUTINE CREATE TEMPORARY TABLES

Significado Da todos los permisos simples excepto GRANT OPTION Permite el uso de ALTER TABLE Modifica o borra rutinas almacenadas Permite el uso de CREATE TABLE Crea rutinas almacenadas

Permite el uso de CREATE TEMPORARY TABLE

CREATE USER

Permite el uso de CREATE USER, DROP USER, RENAME USER, y REVOKE


ALL PRIVILEGES.

CREATE VIEW DELETE DROP EXECUTE FILE INDEX INSERT

Permite el uso de CREATE VIEW Permite el uso de DELETE Permite el uso de DROP TABLE Permite al usuario ejecutar rutinas almacenadas Permite el uso de SELECT ... INTO OUTFILE y LOAD DATA INFILE Permite el uso de CREATE INDEX y DROP INDEX Permite el uso de INSERT Permite el uso de LOCK TABLES en tablas para las que tenga el permiso SELECT Permite el uso de SHOW FULL PROCESSLIST No implementado

LOCK TABLES

PROCESS REFERENCES

62

Base de Datos II
RELOAD REPLICATION CLIENT

Permite el uso de FLUSH Permite al usuario preguntar dnde estn los servidores maestro o esclavo Necesario para los esclavos de replicacin (para leer eventos del log binario desde el maestro) Permite el uso de SELECT
SHOW DATABASES muestra todas las bases de datos

REPLICATION SLAVE SELECT SHOW DATABASES SHOW VIEW SHUTDOWN

Permite el uso de SHOW CREATE VIEW Permite el uso de mysqladmin shutdown Permite el uso de comandos CHANGE MASTER, KILL, PURGE MASTER

SUPER

LOGS, and SET GLOBAL , el comando mysqladmin debug le permite

conectar (una vez) incluso si se llega a max_connections


UPDATE USAGE GRANT OPTION

Permite el uso de UPDATE Sinnimo de no privileges Permite dar permisos

63

Base de Datos II
Para vaciar datos desde un terminal cliente al servidor LOAD DATA LOCAL INFILE " RegAnimal.txt" INTO TABLE Animal; Desde el mismo servidor y en la carpeta de la base de datos LOAD DATA INFILE "RegAnimal.txt" INTO TABLE Animal;
Es recomendable renombrar la cuenta del administrador de MySQL (root). De esta forma estaremos disminuyendo la posibilidad de xito de un ataque de fuerza bruta contra la contrasea del administrador. Para ello deberemos ejecutar: UPDATE user SET user = "nuevonombre" WHERE user = "root"; flush privileges;

64

Вам также может понравиться