Anda di halaman 1dari 78

Aplicaciones de Base de Datos

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. 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:
1
Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

% 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 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 NO se 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)

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

Si queremos crear una base datos, podremos hacerlo con el comando "create database" seguido del nombre de la nueva base de datos.
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 servidor, simplemente escribimos "quit" o \q desde el prompt de MySQL:
mysql> quit

CREACIN DE TABLAS Una tabla es utilizada para organizar y presentar informacin. Las tablas se componen de filas y columnas de celdas que se pueden rellenar con informacin, las tablas se componen de dos estructuras:
3
Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

Registro: se la podra definir como una fila que contiene datos de los mismos tipos que las dems filas. Ejemplo: en una tabla que tiene columnas como nombres y direcciones, cada fila contendr un nombre y una direccin. Campo: es cada una de las columnas que forman la tabla. Contienen datos de tipo diferente a los de otros campos. En el ejemplo anterior, un campo contendr un tipo de datos nico, como una direccin, o un nmero de telfono, un nombre, etc.

Cada tabla creada debe tener un nombre nico en la cada Base de Datos, hacindola accesible mediante su nombre o su seudnimo (Alias). Las tablas son los objetos principales de bases de datos que se utilizan para guardar gran cantidad de datos. 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 o columna 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. 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 (enteros). 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 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 est comprendido entre 0 y 12 y que el da est comprendido entre 0 y 31.
4
Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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 2 Formato AoMesDiaHoraMinutoSegundo aaaammddhhmmss AoMesDiaHoraMinutoSegundo aammddhhmmss oMesDia aaaammdd AoMesDia aammdd AoMes aamm 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.
5
Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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. 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' 5 bytes Almace namiento 1 byte 3 bytes

La sintaxis general para crear una tabla es:


CREATE TABLE nombre_tabla (nombre_campo1 TIPO_COLUMNA(), nombre_campo1 TIPO_COLUMNA(), nombre_campo1 TIPO_COLUMNA(), .. );

Supongamos que se desea crear 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 nombre que es de tipo cadena de caracteres de como mximo 60 caracteres y un campo sexo que es de tipo cadena de caracteres:
CREATE TABLE prueba( id int NOT NULL AUTO_INCREMENT, nombre VARCHAR(60) default NULL, sexo VARCHAR(1), PRIMARY KEY (id) ) TYPE=INNODB;

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

es para especificar el tipo de motor de base de datos que utilizar para crear la tabla, tambin se puede crear una tabla utilizando el motor que se encuentra ejecutando por defecto con el siguiente formato:
TYPE=INNODB 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 );

Asumiendo que se le olvid crear un campo fecha de registro a la tabla usuario usted tendra que utilizar el comando ALTER TABLE, por ejemplo:
ALTER TABLE usuario ADD Fecha_Registro DATE; DESCRIBE usuario;

Para aadir un campo 'email' como un ndice del tipo nico (no puede haber dos iguales).
ALTER TABLE usuario ADD email varchar(50); ALTER TABLE usuario ADD UNIQUE(email); DESCRIBE usuario;

Para modifica el tamao de la columna como email, se puede utilizar:


ALTER TABLE usuario MODIFY email varchar(150); DESCRIBE usuario;

Cambia el nombre de la columna 'ciudad' al nuevo nombre ' accesos_permitidos' que incluye la definicin del tipo de dato:
ALTER TABLE usuario CHANGE ciudad accesos_permitidos int(4); DESCRIBE usuario;

Para cambia solo el tipo de datos de la columna 'edad' y especifica que no admite nulos:
ALTER TABLE usuario MODIFY edad FLOAT(6,2) NOT NULL;

En la tabla 'usuario' 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.
1. 2. 3. ALTER TABLE usuario AUTO_INCREMENT=1000; INSERT INTO usuario(nombre,direccion,accesos_permitidos,edad,Fecha_Registro,email) VALUES (Carlos,portoviejo,20,16,2013-09-26,jcmontero1254@utm.edu.ec); SELECT * FROM usuario;

Al aplicar la sentencia nmero 3 SELECT, notar que el primer registro ya no empezar por el ndice 1 sino que comenzar por el 1000. Para eliminar la columna 'edad' de la tabla 'usuario', usted tendra que realizar lo siguiente:
ALTER TABLE usuario DROP COLUMN edad; DESCRIBE usuario;

Para eliminar varias columnas se utilizar el siguiente formato:


ALTER TABLE Nombre_Tabla DROP COLUMN campo1, DROP COLUMN campo2;

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

Para ejemplificar la creacin de una base de datos con sus respectivas tablas, tomaremos como referencia el almacenamiento de registros datos para una unidad educativa, para el siguiente anlisis considere que un alumno puede ser con el tiempo ser un padre de familia, o un docente de la misma institucin:
DROP DATABASE IF EXISTS Unidad; Create Database if not exists Unidad; use Unidad;

create table if not exists personas( IdPersona int primary key auto_increment, ApellidoPaterno Varchar(50) not null, ApellidoMaterno Varchar(50) not null, Nombres Varchar(50) not null, Direccion Varchar(150), telefono Varchar(15), sexo enum('M','F'), FechaNacimiento date, EstadoCivil enum('S','C','D','V','U') ); create table if not exists profesores( IdPersona int, cargo Varchar(50) not null, Titulacion Varchar(50), Fechaingreso date, index(Idpersona), foreign key(IdPersona) references personas(Idpersona) );

create table if not exists padres( IdPersona int, cargasfamiliares int(2), TelefonoTrabajo varchar(15), DireccionTrabajo varchar(100), ocupacion varchar(80), index(Idpersona), foreign key(IdPersona) references personas(Idpersona) ); create table if not exists Estudiante( IdPersona int not null, IdPersonaPapa int not null, IdPersonaMama int not null, Procedencia varchar(80), index(Idpersona), foreign key(IdPersona) references personas(Idpersona), foreign key(IdPersonaPapa) references personas(Idpersona), foreign key(IdPersonaMama) references personas(Idpersona) );

PARA INGRESAR DATOS EN LAS TABLAS CREADAS:


Insert Into personas(ApellidoPaterno,ApellidoMaterno,Nombres,Direccion,telefono,sexo,FechaNacimiento,EstadoCivil) Values ('Demera', 'Ureta', 'Gabriel', 'Cdla. Parque Forestal', '052123456','M','1974-03-18','C'); Insert Into personas(ApellidoPaterno,ApellidoMaterno,Nombres,Direccion,telefono,sexo,FechaNacimiento,EstadoCivil) Values ('Montero', 'Zambrano','Paola', 'Cdla. Parque Forestal', '052123456','F','1979-04-23','C'); Insert Into personas(ApellidoPaterno,ApellidoMaterno,Nombres,Direccion,telefono,sexo,FechaNacimiento,EstadoCivil)

Values ('Espinoza','Alcvar', 'Elsa Argentina','Mejia', '052636111','F','1978/10/20','C'); Existe otra posibilidad de ingresar datos un poco ms cmoda: 8

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

Insert Into personas(ApellidoPaterno,ApellidoMaterno,Nombres,Direccion,telefono,sexo,FechaNacimiento,EstadoCivil)

Values ('Hidalgo', 'Villamar','Luis Ernesto','Limn', '052580113','M','1977/08/25','C'), ('Aveiga', 'Zambrano','Enma', 'Montecristi', '052636222','F','1974/06/18','C'), ('Zambrano','Franco', 'Luis Felipe','Garca Moreno y sucre','052632333','M','1976/04/10','C'), ('Lpez', 'Intriago','Blanca', 'Primero de Mayo', '052636444','F','1972/02/16','C'), ('Zedeo', 'Franco', 'Nora Alice', 'Morales y Rocafuerte', '052630555','F','1970/05/18','C'), ('Panta', 'Chica', 'Jos Vicente','Pedro Gual y morales','052580666','M','1972/10/12','C'), ('Ronquillo','Delgado','Ramn ','Av.Manab,los Mangos ','052636777','M','1974/12/30','C'), ('Vaca', 'Arteaga', 'Vctor Hugo','Av. Ajuela y morales', '052580888','M','1976/10/10','C'), ('Salazar', 'Montesinos','Claudia', 'Parroq. San Pablo', '052580999','F','1979/09/08','C'), ('Moncayo', 'Hidalgo', 'Flora', 'Cdla. Los tamarindos', '052636505','F','1979/07/28','C'), ('Garcs', 'Jorge', 'Humberto', 'Cdla. Los Bosques', '052580123','M','1980/02/20','C'); Los datos registrados pueden ser extrados de la tabla mediante el uso de la instruccin SELECT , por ejemplo, si se necesita el listado se todas las personas con todos sus datos podramos hacerlo de la siguiente forma:
SELECT IdPersona, ApellidoPaterno, ApellidoMaterno, Nombres, Direccion, telefono, sexo, FechaNacimiento, EstadoCivil FROM personas;

Cuando se desea omitir el listado de todos los campos y obtener el mismo resultado usted puede hacer uso del asterisco (*), por ejemplo:
SELECT * FROM personas;

Cuando se desea datos especficos usted puede utilizar de la lista de campos los que desee, por ejemplo, listar los apellidos, nombres, direcciones y fechas de nacimiento de todos los ingresados:
SELECT ApellidoPaterno, ApellidoMaterno, Nombres, Direccion, FechaNacimiento FROM personas;

S lo solicitado incluye la condicin de que solo sea para los de sexo femenino, se debe incluir la clausula WHERE que permite agregar condiciones de clasificacin de datos, por ejemplo:
SELECT ApellidoPaterno, ApellidoMaterno, Nombres, Direccion, FechaNacimiento FROM personas WHERE sexo=f; Si necesitamos mostrar la lista con varones casados, quedara as: SELECT ApellidoPaterno, ApellidoMaterno, Nombres, Direccion, FechaNacimiento FROM personas WHERE sexo=m and EstadoCivil=c;

Si necesitamos la lista de personas mayores de 30 aos de edad, se tendra que conocer la fecha de hoy asumamos que es 18 de agosto de 2013, si resto 30 aos quedara 1983/09/18 (este es el formato de MySQL), as que la instruccin quedara:
SELECT ApellidoPaterno, ApellidoMaterno, Nombres, telefono, sexo, FechaNacimiento FROM personas WHERE FechaNacimiento <1983/09/18;

Podemos cambiar los formatos de salida que se utilizan en MySQL, por ejemplo, mostraremos unidos los apellidos y el nombre, fecha de nacimiento con el formato da mes y ao, y sexo mostrar masculino o femenino:
SELECT concat(personas.ApellidoPaterno, ' ',personas.ApellidoMaterno ,' ',personas.Nombres) As Estudiante, if(sexo='F','Femenino','Masculino') As Sexo, date_format(FechaNacimiento,%d/%m/%Y) FROM personas;

S se necesita ver las edades de todas las personas utilizaremos la funcin TIMESTAMPDIFF que devuelve la diferencia en aos entre dos fechas, la clusula CURRENT_DATE devuelve la fecha actual que registra el computador:
SELECT concat(personas.ApellidoPaterno, ' ',personas.ApellidoMaterno ,' ',personas.Nombres) As Nombre, TIMESTAMPDIFF(YEAR,fechanacimiento,CURRENT_DATE) as edad FROM personas;

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

S necesitamos la lista ordenada por apellido paterno de forma ascendente o descendente se utilizara:
SELECT ApellidoPaterno, ApellidoMaterno, Nombres, telefono, sexo, FechaNacimiento FROM personas ORDER BY ApellidoPaterno; SELECT ApellidoPaterno, ApellidoMaterno, Nombres, telefono, sexo, FechaNacimiento FROM personas ORDER BY ApellidoPaterno DESC;

Por defecto ordena ascendentemente o si prefiere puede utilizar la instruccin ASC, tambin puede incluir sub rdenes agregando una lista separado por comas, por ejemplo:
SELECT ApellidoPaterno, ApellidoMaterno, Nombres, telefono, sexo, FechaNacimiento FROM personas ORDER BY ApellidoPaterno ASC, ApellidoMaterno DESC;

Asumiendo que necesitamos las tres personas que tengan ms edad podramos utilizar:
SELECT ApellidoPaterno, ApellidoMaterno, Nombres, sexo, FechaNacimiento FROM personas ORDER BY FechaNacimiento ASC LIMIT 3;

Para obtener un listado de aos de nacimiento sin que se repitan tendramos que realizar lo siguiente:
SELECT DISTINCT YEAR(FechaNacimiento) AS anio FROM personas ORDER BY anio;

A menudo tenemos columnas que son cadenas de caracteres, y queremos buscar las cadenas que contienen cierta palabra. Esto se realiza a travs de un nuevo tipo de condicin: Nombre_de_columna LIKE cadena_de_caracteres. Con LIKE puede usar los siguientes dos caracteres comodines en el patrn: Carcter Descricin
% _

Coincidencia de cualquier nmero de caracteres, incluso cero caracteres Coincide exactamente un carcter

Listar todas las personas cuyo nombre empieza con la letra E


SELECT ApellidoPaterno, ApellidoMaterno, Nombres, sexo, FechaNacimiento FROM personas WHERE Nombres LIKE E%;

Listar todas las personas cuya segunda letra del apellido paterno es E
SELECT ApellidoPaterno, ApellidoMaterno, Nombres, sexo, FechaNacimiento FROM personas WHERE ApellidoPaterno LIKE _E%;

Listar todas las personas cuyo apellido paterno o materno es Zambrano


SELECT ApellidoPaterno, ApellidoMaterno, Nombres FROM personas WHERE concat(ApellidoPaterno, ' ', ApellidoMaterno ,' ', Nombres) LIKE %Zambrano%;

Otra posibilidad de obtener el mismo resultado es:


(SELECT ApellidoPaterno, ApellidoMaterno, Nombres FROM personas WHERE ApellidoPaterno= Zambrano) UNION ALL (SELECT ApellidoPaterno, ApellidoMaterno, Nombres FROM personas WHERE ApellidoMaterno= Zambrano);

Si se necesita listar todos las personas cuyo apellido paterno no empiece con Z entonces quedara as:
SELECT ApellidoPaterno, ApellidoMaterno, Nombres, sexo, FechaNacimiento FROM personas WHERE ApellidoPaterno NOT LIKE Z%;

10

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

Para testear instancias literales de un carcter comodn, preceda el carcter con el carcter de escape. Si no especifica el carcter ESCAPE , se asume '\' . Cadena Descricin
\% \_

Coincide un carcter '%'

Coincide un carcter '_' Si desea filtrar registros utilizando una lista de valores o palabras puede hacer uso de la clusula IN, por ejemplo asumamos que queremos ver la lista de personas cuyo apellido paterno es VACA, PANTA y SALAZAR tendramos que hacer lo siguiente:
SELECT ApellidoPaterno, ApellidoMaterno, Nombres, sexo, direccion FROM personas WHERE ApellidoPaterno IN (Vaca, Panta , Salazar); SELECT ApellidoPaterno, ApellidoMaterno, Nombres, sexo, direccion FROM personas WHERE ApellidoPaterno=Vaca OR ApellidoPaterno=Panta OR ApellidoPaterno=Salazar;

Tambin puede mostrar todos excepto los anteriores


SELECT ApellidoPaterno, ApellidoMaterno, Nombres, sexo, direccion FROM personas WHERE ApellidoPaterno NOT IN (Vaca, Panta , Salazar);

En algn momento necesitaremos consultas que nos devuelva totales (1 solo registro), para ello se utilizar unas funciones estandarizadas de clculo de registros COUNT(), SUM(), AVG(), MAX(), NIM(), entre otros. S deseamos conocer cuntas personas tiene registrada la tabla persona:
SELECT count(ApellidoPaterno) As Total_de_Personas FROM personas;

Tambin podemos ver el promedio de edades de todas las personas registradas


SELECT AVG(TIMESTAMPDIFF(YEAR,fechanacimiento,CURRENT_DATE)) AS Promedio_Edades FROM personas;

Existe la posibilidad de utilizar agrupamientos para que puedan existir varios totales dependiendo de las necesidades de agrupar, para esto se utiliza la clusula GROUP BY Para conocer cuntas personas nacieron por ao de las que se encuentran registradas en nuestra tabla podramos realizar lo siguiente:
SELECT YEAR(FechaNacimiento), COUNT(YEAR(FechaNacimiento)) AS N_Personas_Nacidas FROM Personas GROUP BY YEAR(FechaNacimiento) ORDER BY COUNT(YEAR(FechaNacimiento)) ;

Si se necesita conocer el nmero de persona clasificados por sexo:


SELECT IF(Sexo='F','FEMENINO','MASCULINO') As Sexo, count(*) As Total_de_Personas FROM personas GROUP BY Sexo;

11

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

LAS SUBCONSULTAS Una subconsulta, es una sentencia SELECT que aparece dentro de otra sentencia SELECT que llamaremos consulta principal. Se puede encontrar en la lista de seleccin, en la clusula WHERE o en la clusula HAVING de la consulta principal. Una subconsulta tiene la misma sintaxis que una sentencia SELECT normal exceptuando que aparece encerrada entre parntesis, no puede contener la clusula ORDER BY, ni puede ser la UNION de varias sentencias SELECT, adems tiene algunas restricciones en cuanto a nmero de columnas segn el lugar donde aparece en la consulta principal. Cuando se ejecuta una consulta que contiene una subconsulta, la subconsulta se ejecuta por cada fila de la consulta principal. Se aconseja no utilizar campos calculados en las subconsultas, ralentizan la consulta. Las consultas que utilizan subconsultas suelen ser ms fciles de interpretar por el usuario. Para realizar las siguientes prcticas agregaremos ms registros a las tablas Personas y Profesores:
INSERT INTO Personas (ApellidoPaterno,ApellidoMaterno,Nombres,Direccion,telefono,sexo,FechaNacimiento,EstadoCivil) VALUES ('Falcones','Canchingre','ngela', 'Cdla. Los tamarindos', '052636456','F','1982/06/18','C'), ('Mora', 'Hidalgo', 'Octavio', 'Cdla. Ceibos del Norte','052360789','M','1970/05/08','C'), ('Delgado', 'Ramirez', 'Maricela', 'Cdla. Ceibos del Norte','054511133','F','1996/08/12','C'), ('Zambrano','Delgado', 'Javier', 'Cdla. Los Bosques', '052456123','M','1984-05-28','D'), ('Cardenas','Flores', 'Ana Mara', 'Eloy Alfaro y Plaza', '052100456','F','1991-03-18','D'), ('Basurto', 'Cedeo', 'Dolores', 'Cdla. Los Mangos', '052390987','F','1971/04/01','C'), ('Zambrano','Lpez', 'Jos', 'parroq. San Placido', '052111654','M','1973/03/30','C'), ('Montesdeoca','Ureta','Elena ', 'Cdla. Forestal', '052222321','F','1974/01/25','C'), ('Faras', 'Salazar', 'Joel', 'Cdla. Terra Nostra', '052333254','M','1979/08/13','C'), ('Delgado', 'Manuel', 'Benedicto', 'Cdla. Los Bosques', '052444157','M','1979/09/23','C'), ('Navarrete','Ormaza', 'Yolanda', 'Cdla. Los tamarindos', '052534876','F','1981/01/10','C'), ('Giler', 'Meja', 'Scrates', 'Cdla. Ceibos del Norte','052778654','M','1985/03/18','C'), ('Mendieta','Vera', 'Juan Carlos','No Registrada', '052580505','M','1974/05/18','C'), ('Brines', 'Zambrano','Gema', '25 de Diciembre', '052654987','F','1980/04/14','S'), ('Moya', 'Loor', 'Fernando', 'Morales', '052654987','M','1982/09/28','S'), ('Arias', 'De la Cruz','Ivan', 'Ramos y Duarte', '321654987','M','1990/08/25','V'), ('Andrade', 'Castro', 'Viviana ', 'San Placido', '052222233','F','2000/03/01','S'), ('Benitez', 'Sabando', 'Carmen', 'Calderon', '053333233','F','2001/06/30','S'), ('Burbano', 'Vera', 'Jos ', 'Rio Chico', '054444233','M','1995/02/17','S'), ('Zambrano','Cardenas', 'Mara Jos','Cdla. Bosques', '054561233','F','1999/06/10','S'), ('Zambrano','Cardenas','Eduardo', 'Rio Chico', '051111233','M','1995/03/01','S'), ('Zambrano','Falcones','Paola', 'Los tamarindos', '054871233','F','2000/03/18','S'), ('Demera', 'Montero', 'Alejandro', ' Cdla Parque Forestal', '055551233','M','2001/01/20','S'), ('Mora', 'Delgado', 'Miguel ngel','18 de octubre', '056666233','M','2002/03/15','S'), ('Zambrano','Bazurto', 'Leonardo', 'Los Mangos', '057771233','M','2000/08/11','S'), ('Zambrano','Bazurto', 'Enrique ', 'Los Tamarindos', '058888233','M','2002/11/11','S'), ('Faras', 'Montesdeoca','Francisco','Los Bosques', '059999233','M','1996/03/19','S'), ('Delgado','Navarrete','Carlos Luis','San Placido', '050001233','M','2001/12/31','S'), ('Giler', 'Briones', 'LilY Anabel', 'Cdla Forestal', '051112222','F','1990/03/21','S'), ('Mendieta','Andrade', 'Marcos', 'Cdla Primero de Mayo', '051114444','M','1993/10/10','S'), ('Moya', 'Aveiga', 'Antonio', 'Parroquia Calderon', '051115555','M','2000/05/25','S'), ('Arias', 'Benitez', 'John Jairo', 'Va a Rio Chico', '051116666','M','2002/07/30','S'), ('Burbano', 'Moncayo', 'Pedro Andrs','Floron 1', '051117777','M','1998/01/17','S'), ('Demera', 'Montero','Mara Gabriela',' Cdla Parque Forestal','051118888','F','1995/05/09','S'), ('Mora', 'Delgado', 'Virginia Yessenia','Parr. Rio Chico','051119999','F','2001/06/04','S'),

12

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

('Zambrano','Falcones','Jos Daniel','San Alejo', '051111000','M','1992/07/15','S'), ('Moya', 'Aveiga', 'David Fabian','18 de octubre', '051111545','M','2000/09/21','S'), ('Giler', 'Briones', 'Fabricio', 'San Placido', '051111129','M','1994/11/12','S'), ('Mendieta','Andrade','Lourdes', 'Km1 va a rocafuerte', '051119876','F','2002/11/03','S'), ('Faras', 'Montesdeoca', 'Junior Jos','Los Angeles', '051115433','M','1998/12/18','S'); INSERT INTO Profesores (IdPersona, cargo, Titulacion, Fechaingreso) VALUES (1, 'Profesor', 'Ingeniero en Sistemas', '2005-10-23'), (2, 'Inspector', 'Ldca en Educacin bsica', '2005-10-23'), (3, 'Profesor', 'Lcda. En Literatura', '2002/01/10'), (4, 'Profesor', 'Ingeniero Industrial', '2002/05/15'), (5, 'Profesor', 'Lcda. En Cultura Fsica', '2000/05/20'), (6, 'Profesor', 'Lcdo. En Historia y Geografa','2000/04/10'), (7, 'Profesor', 'Economista', '2001/09/08'), (8, 'Profesor', 'Lcda. Ciencias Matemticas', '2001/04/18'), (9, 'Profesor', 'Lcdo. En Idiomas', '2003/08/29'), (10,'Profesor', 'Lcdo. En Psicologa Clnica', '2000/05/29'), (11,'Profesor', 'Lcdo. En Laboratorio Qumico', '2003/04/10'), (12,'Rector', 'Lcda. En Ciencias Matemticas','1999/03/10'), (13,'Profesor', 'Lcda. En Educacin Bsica', '1999/10/15'), (14,'Vicerector','ingeniero Civil', '1999/07/25'); INSERT INTO padres(IdPersona,cargasfamiliares,TelefonoTrabajo,DireccionTrabajo,ocupacion) VALUES (1, 2,'052000111','Av. Urbina y Che Guevara','Profesor'), (2, 1,'052345678','Alajuela y Quito', 'Profesora'), (16,2,'052176892','Manta', 'Abogado'), (17,3,'052987654','Av. Manab y America', 'Comerciante'), (18,2,'052670158','Charapot', 'Agricultor'), (19,4,'052182637','Km 1 Via a Manta', 'Secretaria'), (6, 2,'052123123','Alajuela y Quito', 'Profesor'), (15,2,'052123321','Morales y Rocafuerte', 'Diseadora de carteles'), (20,3,'052987654','Amrica y Urbina', 'Foto Copiador'), (21,3,'052987654','Amrica y Urbina', 'Foto Copiador'), (22,4,'', 'Cdla. Parque Forestal', 'Ama de Casa'), (23,4,'', 'Los Almendros', 'Jardinero'), (24,2,'052111999','Km1 via a crucita', 'Maquinista'), (25,2,'052222333','Km1 via a crucita', 'Policia'), (26,3,'052098765','Coop. Portoviejo', 'Chofer'), (28,3,'052654876','Via a Crucita altura de gasolinera Univ.','Comerciante'), (27,2,'', 'Manta', 'Capitan de Barco'), (31,2,'052564876','San Placido', 'Ama de Casa'), (29,1,'', 'Ciudad de Portoviejo', 'Taxista'), (5, 1,'052345678','Alajuela y Quito', 'Profesora'), (30,3,'052630123','Av. Universitaria y Che Guevara','Ingeniero Civil'), (32,3,'052987396','18 de Octubre y Pedro Gual','Recepcionista'), (33,2,'052198823','Amrica y Urbina N1432', 'Electricista'), (13,2,'052345678','Alajuela y Quito', 'Profesora'); INSERT INTO Estudiante(IdPersona,IdPersonaPapa,IdPersonaMama,Procedencia) VALUES (37,1,2,'Escuela 12 de Marzo'), (50,6,15,'Unidad Educativa Arco Iris'), (36,6,15,'Unidad Educativa Arco Iris'), (49,16,17,'Escuela 12 de Marzo'), (38,16,17,'Escuela 12 de Marzo'), (35,18,19,'Unidad Edutativa Manta'), (34,18,19,'Unidad Edutativa Manta'), (39,21,20,'Escuela Naval'), (40,21,20,'Escuela Naval'), (41,23,22,'Unidad Educativa Arco Iris'), (54,23,22,'Unidad Educativa Arco Iris'),

13

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

(42,24,25,'Escuela Reales Tamarindos'), (43,26,28,'Escuela 12 de Marzo'), (52,26,28,'Escuela 12 de Marzo'), (53,27,31,'Escuela Naval'), (44,27,31,'Escuela Naval'), (45,29,5,'Unidad Edutativa Manta'), (51,29,5,'Unidad Edutativa Manta'), (46,30,32,'Escuela Reales Tamarindos'), (47,33,13,'Escuela Reales Tamarindos'), (48,1,2,'Escuela 12 de Marzo');

Para mostrar el listado de personas que son autoridades en la institucin se lo realizara as:
SELECT ApellidoPaterno, ApellidoMaterno, Nombres FROM personas WHERE IdPersona IN (SELECT IdPersona FROM Profesores WHERE cargo <>Profesor);

Para mostrar el nombre y apellidos del Rector de la institucin se lo realizara as:


SELECT ApellidoPaterno, ApellidoMaterno, Nombres FROM personas WHERE IdPersona = (SELECT IdPersona FROM Profesores WHERE cargo=Rector);

Para mostrar lo nombres y apellidos de los profesores que son padres de familia en la institucin se lo realizara as:
SELECT ApellidoPaterno, ApellidoMaterno, Nombres FROM personas WHERE IdPersona IN (SELECT IdPersona FROM Padres WHERE ocupacion like Profe%);

Si necesita mostrar la lista de estudiantes cuyas madres sean profesoras de la institucin quedara as:
SELECT ApellidoPaterno, ApellidoMaterno, Nombres FROM personas WHERE IdPersona IN (SELECT IdPersona FROM Estudiante WHERE IdPersonaMama IN (SELECT idpersona FROM Profesores)) ORDER BY ApellidoPaterno;

Las subconsultas permiten comparar, desde la consulta principal con datos extrados desde la misma u otras tablas, pero no se pueden mostrar los campos de las subconsulta con los campos de la consulta principal. CONSULTAS MULTI-TABLAS Hasta ahora todas las consultas que hemos usado se refieren a mostrar datos de slo una tabla, pero tambin es posible hacer consultas usando varias tablas en la misma sentencia SELECT. Este proceso permite realizar dos operaciones de lgebra relacional: el producto cartesiano y la composicin.
Producto cartesiano.- Este es un operador binario, se aplica a dos relaciones y el resultado es otra relacin. El resultado es una relacin que contendr todas las combinaciones de las tuplas de los dos operandos.

Esto es: si partimos de dos relaciones, R y S, cuyos grados son n y m, y cuyas cardinalidades a y b, la relacin producto tendr todos los atributos presentes en ambas relaciones, por lo tanto, el grado ser n+m. Adems la cardinalidad ser el producto de a y b. Para ver un ejemplo usaremos dos tablas inventadas al efecto:

14

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

tabla1(id, nombre, apellido) tabla2(id, nmero) tabla1 id nombre apellido 15 Fulginio Liepez 26 Cascanio Suanchiez tabla2 id nmero 15 12345678 26 21222112 15 66525425

El resultado del producto cartesiano de tabla1 y tabla2: tabla1 x tabla2 es:


tabla1 x tabla2 id nombre apellido 15 Fulginio Liepez 26 Cascanio Suanchiez 15 Fulginio Liepez 26 Cascanio Suanchiez 15 Fulginio Liepez 26 Cascanio Suanchiez id 15 15 26 26 15 15 nmero 12345678 12345678 21222112 21222112 66525425 66525425

Podemos ver que el grado resultante es 3+2=5, y la cardinalidad 2*3 = 6.


Composicin (Join).- Una composicin (Join en ingls) es una restriccin del producto cartesiano, en la relacin de salida slo se incluyen las tuplas que cumplan una determinada condicin.

La condicin que se usa ms frecuentemente es la igualdad entre dos atributos, uno de cada tabla.
<relacin1>[<condicin>]<relacin2>

Veamos un ejemplo. Partimos de dos relaciones:


tabla1(id, nombre, apellido) tabla2(id, nmero) tabla1 id nombre apellido 15 Fulginio Liepez 26 Cascanio Suanchiez tabla2 id nmero 15 12345678 26 21222112 15 66525425

La composicin de estas dos tablas, para una condicin en que 'id' sea igual en ambas sera:
tabla1[tabla1.id = tabla2.id]tabla2 id nombre apellido t2.id nmero 15 Fulginio Liepez 15 12345678 26 Cascanio Suanchiez 26 21222112 15 Fulginio Liepez 15 66525425

Para aplicar el producto cartesiano en consultas multi-tablas crearemos otras entidades a nuestra base de datos UNIDAD:

15

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

CREATE TABLE if not exists PeriodosLectivos( IdPeriodoLectivo int primary key auto_increment, FechaInicio date, FechaFinal date, Nombre varchar(30) ); CREATE TABLE if not exists Especialidades( IdEspecialidad int primary key auto_increment, NombreEspecialidad varchar(50) ); CREATE TABLE if not exists Cursos( IdCurso int primary key auto_increment, Curso varchar(30) ); CREATE TABLE if not exists Paralelos( IdParalelo int primary key auto_increment, Paralelo varchar(30) ); CREATE TABLE if not exists Matriculas( IdMatricula int primary key auto_increment, IdPersonaEstudiante int not null, IdPeriodoLectivo int not null, IdEspecialidad int not null, IdCurso int not null, IdParalelo int not null, IdPersonaRepresentante int not null, Folder varchar(80), index(IdPersonaEstudiante), foreign key(IdPersonaEstudiante) references personas(Idpersona), foreign key(IdPeriodoLectivo) references periodosLectivos(IdperiodoLectivo), foreign key(IdEspecialidad) references Especialidades(IdEspecialidad), foreign key(IdCurso) references Cursos(IdCurso), foreign key(IdParalelo) references paralelos(Idparalelo), foreign key(IdPersonaRepresentante) references personas(IdPersona) ); INSERT INTO PeriodosLectivos(FechaInicio,FechaFinal,Nombre) VALUES ('2012-03-15','2013-02-15','PERIODO 2012 - 2013'), ('2013-03-15','2014-02-15','PERIODO 2013 - 2014'); INSERT INTO Especialidades(NombreEspecialidad) VALUES ('Educacion Bsica'), ('Bachillerato en Ciencias'), ('Bachillerato tcnico'); INSERT INTO Cursos(Curso) VALUES ('Primero'), ('Segundo'), ('Tercero'), ('Cuarto'), ('Quinto'), ('Sexto'), ('Septimo');

16

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

INSERT INTO Paralelos(Paralelo) VALUES ('A'), ('B'), ('C'), ('D'); INSERT INTO Matriculas(IdPersonaEstudiante,IdPeriodoLectivo,IdEspecialidad,IdCurso,IdParalelo,IdPersonaRepresentante,Folder) VALUES (46,2,1,7,1,30,'Archivador A 25'), (47,2,1,7,1,33,'Archivador A 26'), (42,2,1,7,1,24,'Archivador A 25'), (37,2,1,7,1,1, 'Archivador A 26'), (48,2,1,6,1,2 ,'Archivador A 27'), (41,2,1,7,1,22,'Archivador A 27'), (54,2,1,6,1,23,'Archivador A 28'), (43,2,1,7,1,26,'Archivador A 28'), (52,2,1,6,1,26,'Archivador A 29'), (44,2,1,7,1,27,'Archivador A 29'), (53,2,1,6,1,27,'Archivador A 30'), (38,2,1,7,1,16,'Archivador A 30'), (49,2,1,7,1,16,'Archivador A 31'), (45,2,1,6,1,29,'Archivador A 31'), (51,2,1,6,1,29,'Archivador A 32'), (35,2,1,6,1,19,'Archivador A 32'), (40,2,1,6,1,20,'Archivador A 33'), (39,2,1,7,1,20,'Archivador A 33'), (36,2,1,6,1,15,'Archivador A 34'), (34,2,1,7,1,19,'Archivador A 34');

EJEMPLOS CON PRODUCTO CARTESIANO S Aplicamos producto cartesiano a las tablas cursos y paralelos de nuestra base de datos la
instruccin sera: SELECT * FROM Cursos, paralelos;

El resultado sera, que por cada registro de la tabla cursos se combinan con todos los registros de la tabla paralelos, para el ejemplo anterior resultara si necesitramos todas las combinaciones posibles entre dos tablas pero es necesario utilizar condiciones para ciertas necesidades de filtracin. (Aplicando producto cartesiano con dos tablas) Si se necesita conocer la lista de profesores con sus datos personales tendramos que hacer lo siguiente:
SELECT concat(ApellidoPaterno, , ApellidoMaterno, ,Nombres) AS Personas, cargo, titulacion FROM Personas, Profesores WHERE Personas.IdPersona=Profesores.IdPersona;

(Aplicando producto cartesiano con tres tablas) S necesitamos el listado de estudiantes matriculados con sus respectivos representantes, tendramos:
SELECT concat(personas.ApellidoPaterno, , personas.ApellidoMaterno, , personas.Nombres) As Estudiantes, Matriculas.IdMatricula As Matricula, concat(personas_1.ApellidoPaterno, , personas_1.ApellidoMaterno, , personas_1.Nombres) As Representante FROM Personas AS personas_1, Personas, Matriculas WHERE personas.IdPersona = matriculas.IdPersonaEstudiante AND personas_1.IdPersona = matriculas.IdPersonaRepresentante;

Cuando se utiliza dos veces la misma tabla, en este caso es obligatorio definir al menos un alias de tabla.
17
Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

(Aplicando producto cartesiano con cuatro tablas) S necesitamos el listado de estudiantes matriculados de sexto ao de bsica con sus respectivos representantes, tendramos:

SELECT concat(personas.ApellidoPaterno, , personas.ApellidoMaterno, , personas.Nombres) As Estudiantes, Matriculas.IdMatricula As Matricula, concat(personas_1.ApellidoPaterno, , personas_1.ApellidoMaterno, , personas_1.Nombres) As Representante FROM Personas AS personas_1, Personas, Matriculas, Cursos WHERE personas.IdPersona = matriculas.IdPersonaEstudiante AND personas_1.IdPersona = matriculas.IdPersonaRepresentante AND Cursos.IdCurso = matriculas.IdCurso AND Cursos.Curso='Sexto';

El INNER JOIN es otro tipo de composicin de tablas, permite emparejar filas de distintas tablas de forma ms eficiente que con el producto cartesiano cuando una de las columnas de emparejamiento est indexada. Ya que en vez de hacer el producto cartesiano completo y luego seleccionar la filas que cumplen la condicin de emparejamiento, para cada fila de una de las tablas busca directamente en la otra tabla las filas que cumplen la condicin, con lo cual se emparejan slo las filas que luego aparecen en el resultado. La sintaxis es la siguiente:

tabla1 y tabla2 son especificaciones de tabla (nombre de tabla con alias o no, nombre de consulta guardada), de las tablas cuyos registros se van a combinar. col1, col2 son las columnas de emparejamiento. Observar que dentro de la clusula ON los nombres de columna deben ser nombres cualificados (llevan delante el nombre de la tabla y un punto). Las columnas de emparejamiento deben contener la misma clase de datos, las dos de tipo texto, de tipo fecha etc... los campos numricos deben ser de tipos similares. Por ejemplo, se puede combinar campos AutoNumrico y Long puesto que son tipos similares, sin embargo, no se puede combinar campos de tipo Simple y Doble. Adems las columnas no pueden ser de tipo Memo ni OLE. comp representa cualquier operador de comparacin ( =, <, >, <=, >=, o <> ) y se utiliza para establecer la condicin de emparejamiento. Se pueden definir varias condiciones de emparejamiento unidas por los operadores AND y OR poniendo cada condicin entre parntesis.

18

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

Ejemplo: Si necesitamos ver el listado de profesores, tendramos:


SELECT personas.ApellidoPaterno, personas.ApellidoMaterno, personas.Nombres, profesores.cargo, profesores.Titulacion FROM personas INNER JOIN profesores ON personas.IdPersona = profesores.IdPersona;

Se pueden combinar ms de dos tablas, en este caso hay que sustituir en la sintaxis una tabla por un INNER JOIN completo. Por ejemplo, s necesitamos el listado de todos los estudiantes matriculados con sus respectivos representantes, tendramos:
SELECT personas.ApellidoPaterno, personas.ApellidoMaterno, personas.Nombres, matriculas.IdMatricula, personas_1.ApellidoPaterno, personas_1.ApellidoMaterno, personas_1.Nombres, personas_1.Nombres FROM personas AS personas_1 INNER JOIN (personas INNER JOIN matriculas ON personas.IdPersona = matriculas.IdPersonaEstudiante) ON personas_1.IdPersona = matriculas.IdPersonaRepresentante;

Considerando el ejemplo desarrollado con producto cartesiano, s necesitamos el listado de estudiantes matriculados de sexto ao de bsica con sus respectivos representantes, tendramos:
SELECT personas.ApellidoPaterno, personas.ApellidoMaterno, personas.Nombres, matriculas.IdMatricula, personas_1.ApellidoPaterno, personas_1.ApellidoMaterno, personas_1.Nombres, personas_1.Nombres, cursos.Curso FROM cursos INNER JOIN (personas AS personas_1 INNER JOIN (personas INNER JOIN matriculas ON personas.IdPersona = matriculas.IdPersonaEstudiante) ON personas_1.IdPersona = matriculas.IdPersonaRepresentante) ON cursos.IdCurso = matriculas.IdCurso WHERE cursos.Curso='Sexto';

VISTAS EN MySQL Las vistas tienen la misma estructura que una tabla: filas y columnas. La nica diferencia es que slo se almacena de ellas la definicin, no los datos. Los datos que se recuperan mediante una consulta a una vista se presentarn igual que los de una tabla. De hecho, si no se sabe que se est trabajando con una vista, nada hace suponer que es as. Al igual que sucede con una tabla, se pueden insertar, actualizar, borrar y seleccionar datos en una vista. Aunque siempre es posible seleccionar datos de una vista, en algunas condiciones existen restricciones para realizar el resto de las operaciones sobre vistas. Una vista se especifica a travs de una expresin de consulta (una sentencia SELECT) que la calcula y que puede realizarse sobre una o ms tablas. Sobre un conjunto de tablas relacionales se puede trabajar con un nmero cualquiera de vistas. La mayora de los SGBD soportan la creacin y manipulacin de vistas. Las vistas se crean cuando se necesitan hacer varias sentencias para devolver una tabla final. CREANDO UNA VISTA: Se emplea la sentencia CREATE VIEW, que incluye una subconsulta (subquery) para determinar los datos a ser mostrados a travs de la vista. Sintaxis: CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW <vista> [(<alias>[, <alias>] )] AS <subconsulta> [WITH CHECK OPTION [CONSTRAINT <restriccin>]] [WITH READ ONLY [CONSTRAINT <restriccin>]];

19

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

Dnde: OR REPLACE Se utiliza por si la vista ya estuviera creada anteriormente. En ese caso, la sustituye por la nueva definicin. Por ejemplo si necesitamos crear una vista que muestra el listado de profesores:
CREATE VIEW V_Lista_Profesores AS SELECT ApellidoPaterno, ApellidoMaterno,Nombres, Titulacion FROM profesores INNER JOIN personas ON profesores.IdPersona = personas.IdPersona WHERE profesores.cargo Like 'prof%' ORDER BY ApellidoPaterno;

Si necesita chequear la creacin de la vista, utilice el comando (SHOW TABLES;), para verificar el contenido de la vista utilice (DESCRIBE V_lista_Profesores;), para observar la codificacin de la vista se utiliza (SHOW CREATE VIEW V_lista_Profesores;), para ver la vista ejecutada utilice el comando (SELECT * FROM v_lista_profesores;), asumiendo que la vista tiene fallas, lo ms recomendable es volver a ejecutar la vista utilizando la sintaxis OR REPLACE, por ejemplo:
CREATE OR REPLACE VIEW V_Lista_Profesores AS SELECT ApellidoPaterno, ApellidoMaterno,Nombres, Titulacion FROM profesores, personas WHERE profesores.IdPersona = personas.IdPersona AND profesores.cargo Like 'prof%' ORDER BY ApellidoPaterno;

Observe la codificacin de la vista y verificar los cambios. VISUALIZAR LA ESTRUCTURA DE UNA VISTA: DESCRIBE <vista>; Dnde: <vista> Es el nombre de la vista. Listar las vistas existentes: SELECT * FROM USER_VIEWS; Indicaciones y restricciones de uso: - La subconsulta puede contener una sentencia SELECT de sintaxis compleja, incluyendo combinaciones (JOIN), agrupamientos (GROUP BY), y subconsultas internas. - Pero no puede incluir una clusula ORDER BY. Si se desea ordenar, esto deber hacerse mediante una consulta posterior que utilice la vista (ver ejemplo en apartado 4). ELIMINANDO UNA VISTA Cuando ya no se va a emplear ms, una vista puede ser eliminada del esquema de la base de datos mediante la siguiente orden: DROP VIEW <vista>; Dnde: <vista> Es el nombre de la vista. Ejemplo: DROP VIEW EmpDepVentas; Una vez desarrollada la vista, se la define como una tabla temporal, s usted utiliza el comando SHOW TABLES; podr observarla como si se tratara de una tabla adicional, de hecho se puede aplicar condiciones y relaciones sobre ellas, por ejemplo si necesitara clasificar la lista de estudiantes por cursos y paralelos, tendramos: #Vista que muestra el listado de estudiantes
CREATE VIEW V_Lista_Estudiantes AS SELECT ApellidoPaterno, ApellidoMaterno, Nombres, Curso, Paralelo FROM personas INNER JOIN (paralelos INNER JOIN (cursos INNER JOIN matriculas ON cursos.IdCurso = matriculas.IdCurso) ON paralelos.IdParalelo = matriculas.IdParalelo) ON personas.IdPersona = matriculas.IdPersonaEstudiante ORDER BY ApellidoPaterno, ApellidoMaterno;

20

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

Para aplicar una condicin a la vista como si se tratara de una tabla se lo realiza de la siguiente manera:
SELECT * FROM V_lista_Estudiantes WHERE curso='septimo' AND paralelo=A;

Es importante entender que los campos a utilizar en la comparacin deben estar en el listado de la vista. El siguiente ejemplo se creara 2 vistas para ser utilizadas en una relacin, el resultado consiste en mostrar la lista de estudiantes cuyos padres sean profesores:
CREATE VIEW V_DatosEstudiantes AS SELECT idpersonapapa, concat(apellidopaterno,' ',apellidomaterno,' ',nombres) AS Estudiante FROM Estudiante, Personas WHERE Personas.idpersona=Estudiante.idpersona; CREATE VIEW V_DatosProfesores AS SELECT personas.IdPersona, concat(ApellidoPaterno, , ApellidoMaterno, ,Nombres) AS Profesor FROM profesores, personas WHERE profesores.IdPersona = personas.IdPersona AND profesores.cargo Like 'prof%'; CREATE VIEW V_ProfesoresHijos AS SELECT profesor, estudiante FROM V_DatosProfesores,V_DatosEstudiantes WHERE idpersona=idpersonapapa; SELECT * FROM V_profesoreshijos;

21

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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 usuario 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 procedimietos consistentes en varias consultas SQL. 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.

22

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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 | +-----------+ | prueba | +-----------+ 1 row in set (0.01 sec)

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


+----------------------+ | Tables_in_prueba | +----------------------+ | gente | 23
Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

+----------------------+ 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. 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)]] ...
24
Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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

25

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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

26

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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 ;

Este Procedimiento Almacenado lo podras crear interactivamente mediante la versin para MySQL 5.0. Si quisieras Procedimiento Almacenado tendras que aplicar el siguiente formato:

27

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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 OUT que indica que el contenido de la variable es retornado desde el procedimiento al lugar donde fue llamado, o INOUT que 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 ; CALL mysp();

28

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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() . 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.
29
Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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");

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

30

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

[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 comando CASE mostrado aqu para uso dentro de procedimientos almacenados difiere ligeramente de la expresin CASE 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] 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
31
Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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

Sentencia REPEAT [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//
+------+ |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;

32

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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: Drop procedure if exists sp_name;

FUNCIONES EN MYSQL
El format de una function es:
CREATE FUNCTION sp_name ([parameter[,...]]) RETURNS type [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.

33

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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:
CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50) RETURN CONCAT('Hello, ',s,'!'); mysql> SELECT hello('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 ;

34

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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

CREATE PROCEDURE ... BEGIN -- Declaro el handler que al darse una condicion -- continue su ejecucion, pero registre un flag

35

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos SET flag=0; DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET flag = 1; INSERT INTO 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. Sentencia OPEN 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 --

36

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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 ;

37

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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 que estamos 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); Insert into animal(nombre, edad, raza, precio) values (Titn,1,Doverman,800);
38
Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

Este comando es para seleccionar solo los nombres de la tabla animal y nos muestra todos los nombres que tiene esa tabla. SELECT Nombre FROM animal; 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) describe vacunas;

39

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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 de los 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 | +------------+--------------------+

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:
40
Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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>

S la base de datos no esta creada se la 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; 41
Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

y escribir la siguiente orden:


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

42

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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 Server version: 5.1.36-community-log MySQL Community Server (GPL)
43
Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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.

mysql> SELECT * FROM animal; +------------+-------------+-------+------------+--------+


44
Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

| 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) 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'
45
Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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 octavo usted 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) 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@% | +-------------------------------------------------------------------------------------------------------+
46
Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

| 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; 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)

47

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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)

48

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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 de la siguiente forma: mysql> call Lista_Animales();
+----------+----------+------+----------------+--------+ | 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 |

49

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

| 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 FROM animal; 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 | +----------+----------+------+----------------+--------+ 5 rows in set (0.01 sec)

S se desea agregar otro registro tendramos:


50
Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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 DECLARE Total 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;

En el siguiente ejemplo se utilice un procedimiento almacenado que devuelve un resultado mediante una variable: DELIMITER // CREATE PROCEDURE Busca_Amimal(IN letra CHAR(2), OUT Total INT) BEGIN SELECT * FROM animal WHERE nombre LIKE letra; SELECT COUNT(*) INTO Total FROM animal WHERE nombre LIKE letra;
51
Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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 | |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;

52

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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 | +------------+--------+-----------------------+----------------------------+

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);

53

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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 | | 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 //

54

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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; 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;

55

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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 ;

56

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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

Tipo de Campo TINYINT SMALLINT

Tamao de Almacenamiento 1 byte 2 bytes


Ing. Gabriel Demera Ureta MgSc.

57

Aplicaciones de Base de Datos

MEDIUMINT INT INTEGER BIGINT FLOAT(X) FLOAT DOUBLE DOUBLE PRECISION REAL DECIMAL(M,D NUMERIC(M,D)

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 2 Formato AoMesDiaHoraMinutoSegundo aaaammddhhmmss AoMesDiaHoraMinutoSegundo aammddhhmmss oMesDia aaaammdd AoMesDia aammdd AoMes aamm 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.
58
Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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. 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',...) 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

59

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

SET('value1','value2',...)

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

60

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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 Aadir columna Cambia el tipo de dato de la columna Cambiar el nombre de la columna Comando alter table nombretabla ADD nombrecolumna tipodato; alter table nombretabla change nombrecolumna nombrecolumna nuevotipodato; alter table nombretabla change nombrecolumnaviejo nombrecolumnanuevo tipodato;
61
Ing. Gabriel Demera Ureta MgSc.

Comando mysql mysql -u usuario -p \q \help o \h

Comando create database basededatos ; drop database basededatos ; show databases ; use basededatos ;

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... ; -

Aplicaciones de Base de Datos

Eliminar columna Aadir ndice a columna 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

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;

Borrar todos los datos de una tabla (conserva la tabla con sus campos) Actualizar un dato del campo1 Contar registros que cumplen un criterio Operaciones con ndices Operacin Crear ndice Elimina ndice Mostrar claves

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; 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;

62

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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.

63

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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' (iso-8859-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. 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)
64
Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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'.

65

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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 TRUNCATE 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 Elimina decimales

66

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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 SUBSTRING o MID SUBSTRING_INDEX TRIM UCASE o UPPER UNCOMPRESS UNCOMPRESSED_LENGTH UNHEX 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 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
67
Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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 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 SUBDATE SUBTIME 68 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 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 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
Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

TIME TIMEDIFF TIMESTAMP TIMESTAMPADD TIMESTAMPDIFF TIME_FORMAT TIME_TO_SEC TO_DAYS UNIX_TIMESTAMP UTC_DATE UTC_TIME UTC_TIMESTAMP WEEK WEEKDAY WEEKOFYEAR YEAR YEARWEEK

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 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

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

69

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

DE GRUPOS Funciones de grupos:


AVG BIT_AND BIT_OR BIT_XOR COUNT Devuelve el valor medio Devuelve la operacin de bits AND para todos los bits de una 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 COUNT DISTINCT Devuelve el nmero de valores diferentes, distintos de NULL GROUP_CONCAT Devuelve una cadena con la concatenacin de los valores de un grupo MIN Devuelve el valor mnimo de una expresin MAX Devuelve el valor mximo de una expresin STD o STDDEV Devuelve la desviacin estndar de una expresin SUM Devuelve la suma de una expresin VARIANCE Devuelve la varianza estndar de una expresin

70

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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

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

71

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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"

72

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

73

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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 INSERT DELAYEDcant be used with table %s because it is locked withLOCK TABLES Subquery returns more than 1 row
74
Ing. Gabriel Demera Ureta MgSc.

1104

42000

1106 1114 1150 1165 1242

42000 HY000 HY000 HY000 21000

Aplicaciones de Base de Datos

1263 1264 1265 1312 1317 1319 1325 1329 1336 1337 1338 1339 1348 1357 1358 1362 1363

22004 22003 1000 0A000 70100 42000 24000 2000 42000 42000 42000 20000 HY000 HY000 HY000 HY000 HY000

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

75

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

ANEXO VII
Posibilidades de utilizar los permisos de usuarios en MySQL
Permiso Significado

ALL [PRIVILEGES] Da todos los permisos simples excepto GRANT OPTION ALTER ALTER ROUTINE CREATE CREATE ROUTINE

Permite el uso de ALTER TABLE Modifica o borra rutinas almacenadas Permite el uso de CREATE TABLE Crea rutinas almacenadas

CREATE TEMPORARY Permite el uso de CREATE TEMPORARY TABLE TABLES

CREATE USER

Permite el uso de CREATE USER, DROP USER, RENAME USER, y REVOKE ALL PRIVILEGES. 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 Permite el uso de FLUSH Permite al usuario preguntar dnde estn los servidores maestro o esclavo

CREATE VIEW DELETE DROP EXECUTE FILE INDEX INSERT LOCK TABLES PROCESS REFERENCES RELOAD REPLICATION CLIENT

76

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

REPLICATION SLAVE SELECT SHOW DATABASES SHOW VIEW SHUTDOWN

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

Permite el uso de SHOW CREATE VIEW Permite el uso de mysqladmin shutdown Permite el uso de comandos CHANGE MASTER, KILL, PURGE MASTER LOGS, and SET GLOBAL , el comando mysqladmin debug le permite conectar (una vez) incluso si se llega a max_connections Permite el uso de UPDATE Sinnimo de no privileges Permite dar permisos

SUPER

UPDATE USAGE GRANT OPTION

77

Ing. Gabriel Demera Ureta MgSc.

Aplicaciones de Base de Datos

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;

78

Ing. Gabriel Demera Ureta MgSc.

Anda mungkin juga menyukai