Beruflich Dokumente
Kultur Dokumente
BASE DE DATOS
UNIVERSIDAD TCNICA DE MANAB
DEPARTAMENTO DE INFORMTICA Y ELECTRNICA
Ing. Gabriel Demera Ureta MgSc.
Josu 1:9
9
TABLA DE CONTENIDO
PRESENTACION ..................................................................................................................................................... 4
ADMINISTRACIN DE MYSQL MEDIANTE CONSOLA ............................................................................................ 5
CONECCIN CON EL SERVIDOR MYSQL MEDIANTE CONSOLA ............................................................................. 6
COMANDOS A UTILIZAR DENTRO DE LA CONSOLA DE MYSQL............................................................................. 6
CREACIN DE TABLAS ........................................................................................................................................... 8
TIPOS DE DATOS DE MYSQL .................................................................................................................................. 8
ACTUALIZACIN DE LA ESTRUCTURA DE UNA TABLA ........................................................................................12
ACTIVIDADES DE DESARROLLO ...........................................................................................................................13
RELACIONES E INGRESOS DE DATOS...................................................................................................................13
PROCESOS DE INGRESOS DE DATOS EN LAS TABLAS CREADAS: .........................................................................14
PROCESOS DE EXTRACCIN DE DATOS EN LAS TABLAS CREADAS: ...................................................................15
CREACIN DE SUBCONSULTAS ...........................................................................................................................18
CREACIN DE CONSULTAS MULTI-TABLAS .........................................................................................................21
EJEMPLOS CON PRODUCTO CARTESIANO ..........................................................................................................25
VISTAS EN MySQL ...............................................................................................................................................28
USUARIOS Y PRIVILEGIOS....................................................................................................................................31
NIVELES DE PRIVILEGIOS .................................................................................................................................31
CREAR USUARIOS ................................................................................................................................................31
MOSTRAR LOS PRIVILEGIOS DE UN USUARIO.................................................................................................32
PARA CONCEDER PRIVILEGIOS ........................................................................................................................32
VARIACIONES PARA ACCESOS REMOTOS AL SERVIDOR DE BASE DE DATOS ..................................................35
PARA REVOCAR PRIVILEGIOS .........................................................................................................................35
PARA BORRAR USUARIOS ...............................................................................................................................36
PROCEDIMIENTOS ALMACENADOS ....................................................................................................................37
SENTENCIA DECLARE...................................................................................................................................39
SENTENCIA SET PARA VARIABLES ...............................................................................................................39
LA SENTENCIA CALL.....................................................................................................................................39
LA SENTENCIA SELECT ... INTO ....................................................................................................................39
SENTENCIA IF...............................................................................................................................................40
LA SENTENCIA CASE ....................................................................................................................................41
SENTENCIA LOOP ........................................................................................................................................42
SENTENCIA LEAVE .......................................................................................................................................43
LA SETENCIA ITERATE ..................................................................................................................................43
SENTENCIA REPEAT ....................................................................................................................................43
1
SENTENCIA WHILE.......................................................................................................................................44
FORMAS DE MOSTRAR EL LISTADO DE PROCEDIMIENTOS ALMACENADOS ..............................................45
FUNCIONES EN MYSQL .......................................................................................................................................49
COMO AGREGAR COMENTARIOS .......................................................................................................................52
CURSORES EN MYSQL .........................................................................................................................................53
TRANSACCIONES.....................................................................................................................................................58
OTRO EJEMPLO ...............................................................................................................................................60
TRIGGERS (Disparadores)....................................................................................................................................62
GESTIN EN LA ADMINISTRACIN DE MYSQL ....................................................................................................64
EXPORTACIN E IMPORTACION DE DATOS. .......................................................................................................64
ADMINISTRACIN DE CLAVES .............................................................................................................................67
CHEQUEAR EL ESTADO DEL SERVIDOR ...............................................................................................................68
USO DE ENCRIPTACIONES ...................................................................................................................................69
PARA ADMINISTRAR LOS RESPALDOS.................................................................................................................70
PARA IMPORTAR O RESTAURAR UN RESPALDO .................................................................................................70
REPLICACIONES ...................................................................................................................................................71
PARA ADMINISTRAR EL ESTADO DE LAS TABLAS ................................................................................................76
PERROR ...............................................................................................................................................................77
CHECK TABLE ...............................................................................................................................................77
REPAIR TABLE ..................................................................................................................................................78
PARA ADMINISTRAR EL ESTADO DE LAS BASE DE DATOS ..................................................................................79
ARCHIVOS DE BASE DE DATOS.......................................................................................................................81
ADMINISTRACIN DE LA EFICIENCIA DE UNA SENTENCIA SELECT .....................................................................82
EXPLAIN ......................................................................................................................................................82
PARTICIONES DE TABLAS ....................................................................................................................................84
CREAR PARTICIONES .......................................................................................................................................86
BORRAR PARTICIONES ....................................................................................................................................87
AADIR PARTICIONES .....................................................................................................................................87
CONSULTAR PARTICIONES ..............................................................................................................................87
ANEXO I (RESUMEN DE COMANDOS MYSQL) ....................................................................................................90
ANEXO II (OTROS EJEMPLOS DE USO DE 'ALTER TABLE' EN MYSQL) .................................................................92
ANEXO III (FUNCIONES DEL LENGUAJE DE MySQL) ...........................................................................................94
FUNCIONES DE CONTROL DE FLUJO ...............................................................................................................94
FUNCIONES MATEMTICAS ............................................................................................................................94
FUNCIONES DE CADENAS................................................................................................................................94
2
PRESENTACION
Este material acadmico de la ctedra de Aplicacin de Base de Datos, explica los conceptos y
prcticas fundamentados en el modelo conceptual Entidad-Relacin, utiliza en primera instancia a
MySQL, que es un Sistema Gestor de Bases de Datos (SGBD) relacional, multihilo y multiusuario,
aplica herramientas relacionadas con ese modelo, como la normalizacin y sus diferentes utilizades
prcticas en la gestin de los datos.
El presente documento es un compendio de muchas fuentes tomadas del Internet, incluyendo
pginas y sitios especializados, opiniones y conclusiones de miembros de la comunidad de MySQL,
as como aportanciones propias del docente autor de este material.
Esta domumentacin tiene el propsito de introducir al estudiante o el interesado, a la
administracin de MySQL y los diferentes recursos adicionales que ofrece esta bse de datos, El
contenido de este compendio, esta clasificado por reas de estudio, conceptualiza y muestra con
ejemplos la gestin de los datos, tablas, usuarios, codificacin almacenada y la propia base de
datos, incluye elementos administrativos que permiten analizar y tomar deciciones que permiten
gestionar, mantener y asegurar la base de datos, proporciona archivos de apoyo en formato de
texto, que le permitirn realizar las prcticas en cualquier computador que tenga instalado un
servidor de base de datos MySQL.
o
En Linux, por supuesto, tambin se puede acceder a MySQL por lnea de comandos. Posiblemente
desde cualquier carpeta podamos acceder a la consola de MySQL, sin necesidad de situarse en la
carpeta donde se instal.
Ahora, si desea obtener informacin sobre una tabla, para saber qu campos tiene y de qu tipos
de datos, se puede utilizar el comando describe seguido del nombre de la tabla, por ejemplo:
mysql> describe administrador;
utilizacin de espacio. Los tipos de datos que puede haber en un campo, se pueden agrupar en tres
grandes grupos que numeramos a continuacin:
1.- TIPOS DE DATOS NUMRICOS:
Existen tipos de datos numricos, que se pueden dividir en dos sub 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 DE DATOS PARA 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.
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
10
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
1, 2, 3, 4 8 bytes, dependiendo del
nmero de valores
SET('value1','value2',...)
CHAR(4)
''
'ab'
'abcd'
'abcdefgh'
''
'ab '
'abcd'
'abcd'
ALMACE
VARCHAR(4)
ALMACE
NAMIENTO
NAMIENTO
4 bytes
"
1 byte
4 bytes
'ab'
3 bytes
4 bytes
'abcd'
4 bytes
'abcd'
5 bytes
TYPE=INNODB es para especificar el tipo de ingeniera de base de datos que utilizar para crear la
tabla, s desea crear una tabla utilizando el motor que se encuentra ejecutando por defecto, lo hara
como el siguiente ejemplo:
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
);
ACTUALIZACIN DE LA ESTRUCTURA DE UNA TABLA
Durante el desarrollo de creacin y puesta en marcha de una base de datos, tendr que realizar
algunos ajustes para optimizar el recurso de almacenamiento, esta documentacin propone algunos
ejemplos:
Asumiendo que se le olvid crear un campo fecha de registro a la tabla usuario, usted tendra
que utilizar el comando ALTER TABLE para modificar su diseo de la siguiente forma:
ALTER TABLE usuario ADD Fecha_Registro DATE;
DESCRIBE usuario;
Para aadir un campo 'email' como un ndice del tipo nico (restriccin que valida la NO
existencia de contenidos iguales), se tendra que hacer:
ALTER TABLE usuario ADD email varchar(50);
ALTER TABLE usuario ADD UNIQUE(email);
DESCRIBE usuario;
Para modifica el tamao de la columna email, se puede utilizar:
ALTER TABLE usuario MODIFY email varchar(150);
DESCRIBE usuario;
Para cambia el nombre de la columna 'ciudad' al nuevo nombre ' accesos_permitidos' que
incluye la definicin hasta del tipo de datos, se tendra que realizar:
ALTER TABLE usuario CHANGE ciudad accesos_permitidos int(4);
DESCRIBE usuario;
Para cambia solo el tipo de datos de la columna 'edad' y especificarle que no admita datos
vacos (nulos), entonces tendra que realizar:
ALTER TABLE usuario MODIFY edad FLOAT(6,2) NOT NULL;
En la tabla ejemplo, cualquier campo que tenga en su definicin la propiedad
'AUTO_INCREMENT' (en una tabla solo un campo podr incluirla), podr cambiarse el valor
inicial, asumiendo que los registros comenzarn a partir de '1000' o cualquier nmero indicado,
12
TAREA 3: Elabore la creacin de una tabla que permita registrar los datos de vehculos en una
cooperativa de transporte inter cantonal, asumiendo que necesita modificarla aplique 5 comandos
ALTER TABLE para justificar los cambios, puede utilizar los modelos ejemplificados en este
documento pero es recomendable que investigue y aplique nuevos modelos.
ACTIVIDADES DE DESARROLLO
La presente documentacin utilizar el diseo y creacin de una base de datos llamada UNIDAD,
que le permite gestionar datos e informacin de una unidad educativa ficticia, este material se
respalda en archivos de texto que le permitir utilizar de forma comprimida los ejemplos aqu
descritos.
RELACIONES E INGRESOS DE DATOS
CREAR RELACIONES Y CLAVES FORANEAS
El fundamento bsico del modelo entidad relacin, que propone los sistemas de gestin de base de
datos, de basa en la posibilidad de crear relaciones entre tablas, la definicin propuesta por MySQL
en general utiliza la sintaxis:
FOREIGN KEY (campo_fk) REFERENCES nombre_tabla(nombre_campo)
Es recomendable crear un ndice en el campo que ha sido declarado como clave fornea, para
mejorar los tiempos de bsqueda.
Para ejemplificar la creacin de una base de datos con sus respectivas tablas relacionadas, se
tomar como referencia el almacenamiento de registros datos para una unidad educativa, para el
siguiente anlisis, considere que un estudiante puede ser con el pasar del tiempo un padre de
familia, o un docente de la misma institucin:
13
La posibilidad de ingresar datos de forma colectiva un poco ms cmoda y aplica el mismo principio:
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');
TAREA 4: Elabore el diseo de una base de datos que permita registrar solo la venta de productos
informticos, considere que se puede vender un disco duro de forma independiente as como parte
de un computador de escritorio, adems, una promocin puede incluir la computadora de escritorio
y una impresora, entre otros, la presentacin de la tarea debe incluir el diseo, la base de datos
fsica y los datos a ingresar de forma similar al ingreso colectivo.
PROCESOS DE EXTRACCIN DE DATOS EN LAS TABLAS CREADAS:
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;
Otra forma de mostrar el listado de todos los campos y obtener el mismo resultado es mediante el
uso del asterisco (*), por ejemplo:
SELECT * FROM personas;
Cuando se desean datos especficos, usted puede utilizar los que desee de la lista de campos, 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 una condicin, por ejemplo, que solo sea para los de sexo femenino, se debe
incluir la clusula WHERE que permite agregar condiciones de clasificacin de datos, por ejemplo:
SELECT ApellidoPaterno, ApellidoMaterno, Nombres, Direccion, FechaNacimiento
FROM personas
WHERE sexo=f;
Se puede utilizar condiciones complejas, por ejemplo, s se necesita la lista de personas mayores de
30 aos de edad, entonces debera utilizar como referencia la fecha de hoy, asumamos que hoy es
18 de agosto de 2014; para resolver esta necesidad aplicaremos aritmtica, es decir restamos 30
aos a 2014 y nos quedara 1984/09/18 (El formato natural de la fecha en MySQL es ao/mes/da),
as que la instruccin quedara:
SELECT ApellidoPaterno, ApellidoMaterno, Nombres, telefono, sexo, FechaNacimiento
FROM personas
WHERE FechaNacimiento <1984/09/18;
Podemos cambiar los formatos de salida que se utilizan para fecha 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 servidor:
SELECT concat(personas.ApellidoPaterno,' ',personas.ApellidoMaterno,' ',personas.Nombres) As
Nombre, TIMESTAMPDIFF(YEAR,fechanacimiento,CURRENT_DATE) as edad FROM personas;
Por defecto ordena ascendentemente, o si prefiere puede utilizar la instruccin ASC; tambin
puede incluir sub rdenes agregando una lista separada 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 el diseo de las tablas incluye columnas que tienen tipos de datos de cadenas de
caracteres, y se necesita buscar datos que cumplan ciertos modelos de palabras. 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 o modelamiento:
16
CARCTER DESCRICIN
%
Coincidencia de cualquier nmero de caracteres, incluso cero caracteres
_
Coincide exactamente un carcter
Para aplicar modelos de cmo utilizar esta herramienta, considere los siguientes ejemplos:
Para listar todas las personas cuyo nombre empieza con la letra E
SELECT ApellidoPaterno, ApellidoMaterno, Nombres, sexo, FechaNacimiento
FROM personas
WHERE Nombres LIKE E%;
Para listar todas las personas cuya segunda letra del apellido paterno es E
SELECT ApellidoPaterno, ApellidoMaterno, Nombres, sexo, FechaNacimiento
FROM personas
WHERE ApellidoPaterno LIKE _E%;
Para 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 anterior y aplicar la unin de varios select, 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%;
Para testear instancias literales en que la palabra incluya un carcter comodn, anteponga 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 asuma que se desea ver la lista de personas cuyo apellido paterno es VACA, PANTA y
SALAZAR, se tendr que hacer cualquiera de las siguientes posibilidades:
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;
17
Considerando que desea hacer lo contrario, es decir que desea mostrar todas las personas, excepto
los descritos en el ejercicio anterior, se tendra que hacer:
SELECT ApellidoPaterno, ApellidoMaterno, Nombres, sexo, direccion
FROM personas
WHERE ApellidoPaterno NOT IN (Vaca, Panta , Salazar);
El estndar SQL incluye funciones que permiten obtener resultado de un grupo de registros o de su
totalidad de registros, las funciones principales de clculo de registros son: COUNT(), SUM(), AVG(),
MAX(), NIM(), entre otros; es importante destacar que cuando se aplica estas funciones, el
resultado en un solo registro.
Para aplicar su utilizacin, ejemplificamos los siguientes ejercicios:
S se desea conocer cuntas personas tiene registrada la tabla personas se aplica lo siguiente.
SELECT count(ApellidoPaterno) As Total_de_Personas
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)) ;
18
Cuando se ejecuta una consulta que contiene una sub consulta, la sub consulta se ejecuta por cada
fila de la consulta principal. Se aconseja no utilizar campos calculados en las sub consultas, ya que
al ejecutarse fila a fila en la consulta principal produce retardo en la consulta.
Las consultas principales complejas que utilizan sub consultas suelen ser ms fciles de interpretar
por parte del usuario. Para realizar las siguientes prcticas, debe agregar ms registros a las tablas
Personas y la tabla 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','Ma Gabriela','Cdla Parque Forestal','051118888','F','1995/05/09','S'),
('Mora', 'Delgado', 'Virginia Yessenia','Parr. Rio Chico','051119999','F','2001/06/04','S'),
('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', 'Lcda. en Educacin bsica', '2005-10-23'),
19
(52,26,28,'Escuela 12 de Marzo'),
(53,27,31,'Escuela Naval'),
(44,27,31,'Escuela Naval'),
(45,29,5,'Unidad Educativa Manta'),
(51,29,5,'Unidad Educativa Manta'),
(46,30,32,'Escuela Reales Tamarindos'),
(47,33,13,'Escuela Reales Tamarindos'),
(48,1,2,'Escuela 12 de Marzo');
Para probar el uso de sub consultas, se desarrollaran ejercicios modelos que le permitirn conocer
las diferentes posibilidades de uso:
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 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%);
Las sub consultas permiten comparar, desde la consulta principal los datos extrados desde la
misma u otras tablas, pero no se pueden mostrar los campos de las sub consulta con los campos de
la consulta principal.
21
El uso de varias tablas en una misma consulta, es un proceso que permite ejecutar dos tipos de
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 los registros
de los dos operandos.
Para entender esto analicemos lo siguiente: si partimos de dos relaciones, R y S, cuyos grados
(Numero de columnas) son n y m, y cuyas cardinalidades (nmero de registros) 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 ejemplificar el anlisis, se usar dos tablas inventadas para el efecto:
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
apellido id nmero
Liepez 15 12345678
Suanchiez 15 12345678
Liepez 26 21222112
Suanchiez 26 21222112
Liepez 15 66525425
Suanchiez 15 66525425
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
24
El resultado sera, por cada registro de la tabla cursos se combinan con todos los registros de la
tabla paralelos, el ejemplo resultara si se necesitara todas las combinaciones posibles entre dos
tablas, pero es necesario utilizar condiciones para ciertas necesidades de filtracin. Si se necesitara
conocer la lista de profesores con sus datos personales, se aplicara:
SELECT concat(ApellidoPaterno, , ApellidoMaterno, ,Nombres) AS Personas, cargo, titulacion
FROM Personas, Profesores
WHERE Personas.IdPersona=Profesores.IdPersona;
Aplicando producto cartesiano con tres tablas, se mostrar el listado de estudiantes matriculados
con sus respectivos representantes:
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 una consulta, es obligatorio definir al menos un alias
para diferenciarlas entre s.
Para aplicar producto cartesiano con cuatro tablas, mostraremos el listado de estudiantes
matriculados de sexto ao de bsica con sus respectivos representantes:
25
El INNER JOIN es una de varias opciones 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 tablas o entidades de la base de datos, esto incluye tablas
con alias y vistas, que contienen relacin entre s. Col1 y col2 son las columnas o campos de
emparejamiento.
Observe que dentro de la clusula ON los nombres de las columnas deben ser nombres cualificados
lo que significa que si tienen el mismo nombre se le debe anteponer el nombre de la tabla y un
punto de separacin.
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.
Por 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 de la segunda
tabla por un INNER JOIN completo.
26
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;
TAREA 7: disee una base de datos que registre el arrendamiento y pago mensual del arriendo,
para un edificio que alquila cuartos y apartamentos, a estudiantes universitarios, una vez diseada
la base de datos, proponga 5 consultas aplicando producto cartesiano y su similar en composicin,
justifique cada propuesta.
27
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 poseen son los que se recuperan
mediante la ejecucin de una consulta, una vista se representa igual que una tabla, de hecho, si no
se sabe que se est trabajando con una vista, nada le hara suponer lo contrario. Al igual que
sucede con una tabla, se pueden insertar, actualizar, borrar y seleccionar datos en una vista.
Aunque su utilizacin en siempre la de seleccionar datos de una consulta, 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.
Para crear una vista se emplea la sentencia CREATE VIEW, que incluye una sub consulta
(subquery) para determinar los datos a ser mostrados a travs de la vista la sintaxis es:
CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW <vista>
[(<alias>[, <alias>] )]
AS <subconsulta>
[WITH CHECK OPTION [CONSTRAINT <restriccin>]]
[WITH READ ONLY [CONSTRAINT <restriccin>]];
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:
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;
Tcnicamente una vista es definida 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.
Para entrar en detalle, el siguiente ejemplo crea una vista que muestra la lista de estudiantes por
cursos y paralelos:
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;
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
consulta interna de la vista.
El siguiente ejemplo crear 2 vistas para ser utilizadas en una relacin, el resultado consiste en
mostrar la lista de estudiantes cuyos padres sean profesores:
1. Se crear una vista para extraer el identificador del pap, los apellidos y nombres del
estudiante:
CREATE VIEW V_DatosEstudiantes AS
SELECT idpersonapapa, concat(apellidopaterno,' ',apellidomaterno,' ',nombres) AS Estudiante
FROM Estudiante, Personas
WHERE Personas.idpersona=Estudiante.idpersona;
2. sta otra vista extraer el identificador del profesor, as como sus apellidos y nombres
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%';
29
3. La siguiente vista relacionar las dos vistas anteriores mediante el uso del identificador del
pap del estudiante y el identificador del profesor
CREATE VIEW V_ProfesoresHijos AS
SELECT profesor, estudiante
FROM V_DatosProfesores,V_DatosEstudiantes
WHERE idpersona=idpersonapapa;
Para probar el resultado se ejecuta un SELECT con la ltima vista de la siguiente forma:
SET @numero=0;
SELECT @numero:=@numero+1 AS Numero, V_profesoreshijos .* FROM V_profesoreshijos;
TAREA 8: disee una base de datos que registre el alquiler de motos y cuadrones para una pista de
carrera a campo traviesa, los valores de alquiler dependern del tipo de vehculo y del tiempo
separado en horas, considere que existen clientes con preferencia de crdito, y que existen
vehculos que estn en mantenimiento, considerando la base de datos proponga 5 vistas que
incluyan consultas con producto cartesiano o composicin, justifique cada propuesta.
30
USUARIOS Y PRIVILEGIOS
Hasta ahora slo se ha accedido mediante el usuario 'root', que es considerado como el sper
usuario o el administrador, y que dispone de todos los privilegios disponibles en MySQL.
Sin embargo, normalmente no ser una buena prctica dejar que todos los usuarios con acceso al
servidor tengan todos los privilegios. Para conservar la integridad de los datos y de las estructuras
ser conveniente que slo algunos usuarios puedan realizar determinadas tareas, y que otras, que
requieren mayor conocimiento sobre las estructuras de bases de datos y tablas, slo puedan
realizarse por un nmero limitado y controlado de usuarios.
Los conceptos de usuarios y privilegios estn ntimamente relacionados. No se pueden crear
usuarios sin asignarle al mismo tiempo privilegios, de hecho, la necesidad de crear usuarios est
ligada a la necesidad de limitar las acciones que tales usuarios pueden llevar a cabo.
MySQL permite definir diferentes usuarios, y adems, asignar a cada uno determinados privilegios
en distintos niveles o categoras de ellos.
NIVELES DE PRIVILEGIOS
En MySQL existen cinco niveles distintos de privilegios:
Globales: se aplican al conjunto de todas las bases de datos en un servidor, es el nivel ms alto de
privilegio, en el sentido de que su mbito es el ms general.
Estos permisos se almacenan en la tabla mysql.user. GRANT ALL ON *.* y REVOKE ALL ON *.*
otorgan y quitan slo permisos globales.
De base de datos: se refieren a bases de datos individuales, y por extensin, a todos los objetos que
contiene cada base de datos.
Estos permisos se almacenan en las tablas mysql.db y mysql.host. GRANT ALL ON nombre_bd.* y
REVOKE ALL ON nombre_bd.* 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 nombre_bd.nombre_tbl
y REVOKE ALL ON nombre_bd.nombre_tbl otorgan y quitan permisos slo de tabla.
De columna: se aplican a una columna en una tabla concreta.
Estos permisos se almacenan en la tabla mysql.columns_priv . Usando REVOKE, debe especificar las
mismas columnas que se otorgaron los permisos.
De rutina: se aplican a los procedimientos almacenados. An no hemos visto nada sobre este tema,
pero en MySQL se pueden almacenar procedimientos consistentes en varias consultas SQL.
CREAR USUARIOS
Aunque en la versin 5.0.2 de MySQL existe una sentencia para crear usuarios llamada CREATE
USER, en versiones anteriores, se usa exclusivamente la sentencia GRANT para crearlos, pero en
general es preferible usar GRANT, ya que si se crea un usuario mediante CREATE USER,
posteriormente hay que usar una sentencia GRANT para concederle privilegios, usando GRANT
podemos crear un usuario y al mismo tiempo concederle tambin los privilegios que tendr, la
sintaxis simplificada que se usa para GRANT, es:
31
Hay que tener en cuenta que la contrasea clave se debe introducir entre comillas de forma
obligatoria, el usuario 'anonimo' podr abrir una sesin MySQL, pero estar limitado al no poder ver
y explorar o gestionar los datos o su estructura, ya que no tiene privilegios, como ejemplo para
acceder al servidor utilizando ste usuario, se realiza lo siguiente:
%mysql -h localhost -u anonimo p
Esta sentencia concede al usuario 'anonimo' el privilegio de ejecutar sentencias SELECT sobre la
tabla 'Personas' de la base de datos 'Unidad', observe que no se agreg la clave de acceso, ya que
se cre la contrasea al crear el usuario sin privilegios, no hace falta ponerla, con poner los
privilegios basta.
Para practicar y verificar los privilegios asignados al usuario annimo, abra una nueva sesin e
identifquese como 'anonimo', una vez que accedi podr ejecutar estas sentencias:
mysql> SHOW DATABASES;
mysql> USE Unidad;
mysql> SHOW TABLES;
mysql> SELECT * FROM personas;
Como se ve, para este usuario slo existe la base de datos 'Unidad' y dentro de esta, la tabla
'Personas'. Adems, podr hacer consultas solo sobre esa tabla, pero no podr aadir ni modificar
datos, ni por supuesto, crear o destruir tablas ni bases de datos.
32
Para conceder privilegios globales se usan comodines de la siguiente forma: ON *.*, esto indicar
que los privilegios se conceden en todas las tablas de todas las bases de datos.
Para conceder privilegios en bases de datos especficas se usa ON nombre_bd.*, indicando que los
privilegios se conceden sobre todas las tablas de la base de datos 'nombre_bd'.
Usando ON nombre_bd.nombre_tabla, concedemos privilegios de nivel de tablas para la tabla y
base de datos especificada.
En cuanto a los privilegios de columnas o campos, para concederlos se usa la sintaxis tipo_privilegio
(lista_de_columnas), [tipo_privilegio (lista_de_columnas)], para mayor detalle, considere la
siguiente forma:
GRANT privilegios(lista_de_columnas) ON nombre_bd.nombre_tabla TO 'usuario'@'localhost/ip'
IDENTIFIED BY 'clave';
El usuario anonimo" utilizado para ejemplificar ste captulo, ya cuenta con privilegios asignados
para extraer datos desde la tabla Personas, ahora para el siguiente ejemplo se le permitir extraer
solo los nombres de los periodos lectivos, ms no los otros datos de la misma tabla, para realizar
sta prctica, los privilegios deben ser otorgados por el usuario administrador de la siguiente forma:
GRANT SELECT(nombre) ON Unidad.PeriodosLectivos TO a33nonimo;
Para probar los privilegios asignados se acceder al servidor con el usuario anonimo desde otra
ventana o sesin, para la prctica escriba los siguientes comandos:
mysql>SHOW DATABASES;
mysql>USE Unidad;
mysql>SHOW TABLES;
mysql>DESCRIBE PeriodosLectivos;
mysql>SELECT nombre FROM PeriodosLectivos;
Al aplicar los comandos notar que solo se le mostrar las tablas PERSONAS y PERIODOSLECTIVOS,
ya que sobre ellas se le han asignado privilegios, al aplicar el comando DESCRIBE PeriodosLectivos;
notar que solo le muestra el campo o columna Nombre, el resto le es oculto, s usted intentara
utilizar el comando SELECT * FROM PeriodosLectivos; le mostrar un error porque ha intentado
evadir privilegios.
Aplicando otro ejemplo, en la sesin del administrador, ejecute la siguiente instruccin:
mysql>GRANT UPDATE(IdPersona, Direccion) ON Unidad.Personas TO 33anonimo;
Para probar el privilegio asignado, en la otra ventana o sesin, debe recordar que antes se le debe
asignar privilegio SELECT, de lo contrario no funcionar, escriba los siguientes comandos:
mysql>UPDATE Personas SET Direccion=Edif. Santa Clara WHERE idpersona=1;
mysql>SELECT * FROM Personas WHERE idpersona=1;;
Como administrador tambin se puede cambiar el nombre del usuario mediante el comando
RENAME, esto no afectar los privilegios asignados, ejemplo:
RENAME USER anonimo TO anoni;
Los privilegios que se pueden conceder son: ALL que permite conceder todos los privilegios y los
detallados en el siguiente cuadro que se aplican de forma especfica:
33
PRIVILEGIO
CREATE
DROP
GRANT OPTION
COLUMNA
Create_priv
Drop_priv
Grant_priv
CONTEXTO
bases de datos, tablas, o ndices
bases de datos o tablas
bases de datos, tablas, o procedimientos
almacenados
References_priv
bases de datos o tables
Alter_priv
tablas
Delete_priv
tablas
Index_priv
tablas
Insert_priv
tablas
Select_priv
tablas
Update_priv
tablas
Create_view_priv
vistas
Show_view_priv
vistas
Alter_routine_priv
procedimientos almacenados
Create_routine_priv
procedimientos almacenados
Execute_priv
procedimientos almacenados
File_priv
acceso a archivos en la mquina del servidor
Create_tmp_table_priv administracin del servidor
REFERENCES
ALTER
DELETE
INDEX
INSERT
SELECT
UPDATE
CREATE VIEW
SHOW VIEW
ALTER ROUTINE
CREATE ROUTINE
EXECUTE
FILE
CREATE TEMPORARY
TABLES
LOCK TABLES
CREATE USER
PROCESS
RELOAD
REPLICATION CLIENT
REPLICATION SLAVE
SHOW DATABASES
SHUTDOWN
SUPER
Lock_tables_priv
Create_user_priv
Process_priv
Reload_priv
Repl_client_priv
Repl_slave_priv
Show_db_priv
Shutdown_priv
Super_priv
Para crear un usuario administrador, entre todos los privilegios debe tener el privilegio GRANT
OPTION, un ejemplo de cmo crearlo sera:
mysql > GRANT ALL PRIVILEGES ON *.* TO DBA2 IDENTIFIED BY '123' WITH GRANT OPTION;
Es importante que considere que este tipo de privilegio, solo es aconsejable para los
administradores, y no para un usuario sin responsabilidad administrativa.
Los usuarios creados hasta el momento, poseen privilegios implcitos de acceso local y remota, un
usuario de acceso local explicito sera:
mysql>GRANT ALL PRIVILEGES ON *.* TO 'usuario'@'localhost' IDENTIFIED BY '123' WITH GRANT
OPTION;
A veces es necesario utilizar el comando (FLUSH PRIVILEGES) para asegurarse de actualizar los
privilegios asignados en la base de datos administrativa de MySQL, su uso se simplifica de la
siguiente forma:
mysql> FLUSH PRIVILEGES;
34
Aunque no es una prctica recomendable desde el punto de vista de la seguridad del servidor, Si se
desea que el usuario "cajero1" pueda acceder a la base de datos desde cualquier host, utilice:
mysql>GRANT ALL ON unidad.* TO 'cajero1'@'%' IDENTIFIED BY 'cajero1234';
Podra utilizar el formato (cajero1@'192.168.1.%') para que el acceso al servidor solo sea desde la
Red que tienen la misma IP del servidor. Tambin puede hacer uso de (cajero1@'%.midominio.org')
para permitir el acceso desde un servidor WEB.
PARA REVOCAR PRIVILEGIOS
La revocacin de privilegios no significa eliminacin de usuario, para revocar privilegios se usa la
sentencia REVOKE, su sintaxis es la siguiente:
REVOKE tipo_privilegio [(lista_columnas)] [, tipo_privilegio [(lista_columna)]] ...
ON
FROM usuario [, usuario] ...
La sintaxis es similar a la de GRANT, por ejemplo, para revocar el privilegio SELECT del usuario
'anonimo', usaremos la sentencia:
mysql> REVOKE SELECT ON unidad.personas FROM anonimo;
mysql> SHOW GRANTS FOR anonimo;
Ahora se realizar una prctica que involucre la aplicabilidad de privilegios y su revoque parcial y
total de los mismos:
Se creara un usuario llamado orion, se le conceder los siguientes privilegios:
mysql> GRANT select, insert, update, delete, index, alter, create, drop ON unidad.* TO orion
IDENTIFIED BY '123';
mysql> SHOW GRANTS FOR orion;
Como una ejemplificacin extrema, considere que el usuario orion ha incurrido en violar las
normas de restricciones y por lo tanto se le quitar algunos privilegios:
mysql> REVOKE alter, create, drop ON unidad.* FROM orion;
mysql> SHOW GRANTS FOR orion;
Si al final nos comunica el usuario orionque no quiere ms ser usuario de nuestra base de datos,
entonces se pondr revocar todos los privilegios:
mysql > REVOKE ALL ON unidad.* FROM orion;
mysql> SHOW GRANTS FOR orion;
Es importante recordar que la contrasea es opcional, si se la crear se puede escribir entre comillas
simples, o se puede usar la salida de la funcin PASSWORD() de forma literal para crearla y
encriptarla y evitar enviar la clave en texto legible.
Si al aadir privilegios se usa una clave diferente en la clusula IDENTIFIED BY, sencillamente se
sustituye la contrasea por la nueva.
PARA 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;
mysql> DROP USER anonimo;
TAREA 9: Considerando la base de datos ejemplo unidad, planifique y cree usuarios con
privilegios para: docentes, estudiantes, secretarias, autoridades y padres de familia, asuma que
estos privilegios servirn para acceder a la base de datos mediante software aplicativo de escritorio
y WEB, justifique los privilegios y restricciones.
36
PROCEDIMIENTOS ALMACENADOS
Los procedimientos almacenados (stored procedure en ingls) y las funciones, son herramientas
disponibles desde la versin de MySQL 5.0; un procedimiento almacenado es un conjunto de
comandos SQL con propsito lgico, que pueden contenerse en el servidor de base de datos, esto le
permitir reducir lneas de codificacin en la interfaces de desarrollo de las aplicaciones que utilicen
la base de datos, reduciendo la transferencia de los comandos individuales SQL, a solo ejecutar
procedimientos almacenados.
Algunas situaciones en que los procedimientos almacenados pueden ser particularmente tiles es:
Cuando mltiples aplicaciones clientes se escriben en distintos lenguajes o funcionan en
distintas plataformas o sobre distintas tecnologas, pero necesitan realizar la misma
operacin sobre 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 o accede
apropiadamente. En tal entorno, las aplicaciones y los usuarios no obtendran ningn acceso
directo a las tablas de la base de datos, slo pueden ejecutar algunos procedimientos
almacenados.
37
PROCEDURE
Solo con CALL
Llamada
Retorno
Parmetros
Instrucciones permmitidas
Llamadas a otras funciones o
procedimientos
FUNCTION
Posible en todas las instrucciones
SQL (SELECT, UPDATE, )
Retorna un valor nico de un tipo
determinado.
Permite por valor y por
referencia(IN, OUT, INOUT)
Con limitaciones
Solo puede llamar otras funciones
El formato indica que la lista de parmetros entre parntesis debe estar siempre presente. En caso
de no existir 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 ubican antes del nombre
del parmetro.
Especificando IN, OUT, o INOUT slo son vlidos para una PROCEDURE. El procedimiento
almacenado debe de tener un cuerpo y un final, para esto se utiliza las etiquetas BEGIN y END.
Todas las instrucciones dentro del cuerpo terminan en (;), esto obliga a cambiar el delimitador (;) en
la consola, ya que los comandos del Shell lo utilizan para especificar el final de una instruccin, este
documento utilizar // como delimitador, para cambiar el delimitador natural se usa el comando
(DELIMITER //), este proceso se debe repetir cada vez que se desarrolla una procedimiento o
funcin almacenada, para restablecerlo se utiliza el comando (DELIMITER ;), por ejemplo:
DELIMITER //
CREATE PROCEDURE mi_procedimiento_almacenado ()
BEGIN
Proceso que desee realizar
END //
DELIMITER ;
CALL mi_procedimiento_almacenado ();
El nombre del procedimiento almacenado (store procedure) puede ser escrito en maysculas o
minsculas, pues la consola no es sensible.
A la hora de ejecutar el procedimiento, es diferente a los gestores como SQL Server o Sybase donde
se hacen mediante la sentencia exec, aqu se usa la sentencia CALL y colocando al final del nombre
del procedimiento los parntesis.
Los procedimientos almacenados no pueden usar dentro de cuerpo de desarrollo: CREATE
PROCEDURE, ALTER PROCEDURE, DROP PROCEDURE, CREATE FUNCTION, DROP FUNCTION, CREATE
TRIGGER, DROP TRIGGER. As el uso de USE database no es permitido, ya que MySQL asume que
la base de datos por default es donde se cre el procedimiento.
38
Este comando se usa para declarar variables locales, para proporcionar un valor por defecto para la
variable, se 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 o
reconocimiento de una variable local, se da 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
El comando SET en los procedimientos almacenados es una versin extendida del comando general
SET. Esto permite una sintaxis extendida de SET a=x, b=y, ... donde distintos tipos de variables
pueden mezclarse, por ejemplo:
SET vat1 = "hola";
SET comision = comision +(suma*0.15);
LA SENTENCIA CALL
CALL nombre_pa([parametro[,...]])
Esta sintaxis permite que el resultado de un SELECT pueda almacenar desde las columnas
seleccionadas directamente a las variables; por lo tanto, slo un registro del SELECT puede
retornarse, por ejemplo:
SELECT id,data INTO x,y FROM base.tabla LIMIT 1;
SELECT 2*7 INTO var
SELECT COUNT(*) FROM tabla WHERE condicion INTO var
SELECT Especialidad, Horas FROM medicos WHERE IdDoctor=3 INTO VarEspe, varHorasAsig
39
SENTENCIA IF
La sentencia IF en MySQL al igual que la mayora de los lenguajes de programacin se genera en
tres bloques, el primero es la condicin en s, el segundo es la operacin a llevar se cabo si la
evaluacin resulta cierta, y el tercero es la operacin a efectuarse si la evaluacin resulta falsa, los
bloques de verdadero o falso tambin pueden incluir otros bloques IF, considere la siguiente
sintaxis formal:
IF expresin THEN
-- que hacer en caso correcto
ELSE
-- que hacer en caso contrario
END IF; -- necesario para cerrar el bloque
En versiones actuales de MySQL, tambin es posible crear IF anidados con una sola finalizacin, para
estos se utiliza ELSEIF en vez de ELSE, considere la siguiente sintaxis:
IF (Num = 1) THEN
-- ..
ELSEIF (Num = 2) THEN
-- ..
ELSEIF (Num = 3) THEN
-- ..
ELSE
-- ..
END IF;
Toda condicin IF debe indicar su fin, para esto se utiliza la instruccin (END IF). Tambin se puede
hacer uso de una funcin IF() que se ejecuta en una sola lnea y que acepta 3 argumentos, su
sintaxis es:
IF(condicin, respuesta_x_Verdadero, respuesta_x_falso)
Por ejemplo:
SET valor = IF (5<5,1,0);
SELECT valor;
SELECT nombres, IF(edad <= 20, Joven, Adulto) FROM personas ORDER BY edad;
LA SENTENCIA CASE
Esta es una herramienta condicional que nos permite evaluar el valor de una variable con varias
posibilidades. Es una forma de abreviar un montn de IF anidados. En este caso el ELSE nos permite
definir un valor por defecto (como el default en un switch/case de C, Java o PHP), la sintaxis a
aplicar pueden ser cualquiera de las siguientes:
CASE case_value
WHEN Coincidencia_Valor THEN lista_de_instrucciones
[WHEN Coincidencia_Valor THEN lista_de_instrucciones] ...
[ELSE lista_de_instrucciones]
END CASE
O:
CASE
WHEN condicin_de_bsqueda THEN lista_de_instrucciones
[WHEN condicin_de_bsqueda THEN lista_de_instrucciones] ...
[ELSE lista_de_instrucciones]
END CASE
Para el segundo ejemplo el comando CASE implementa un constructor condicional complejo. Si una
condicin_de_bsqueda se evala a cierto, la lista_de_instrucciones correspondiente se ejecuta. Si
no coincide ninguna condicin_de_bsqueda, la lista_de_instrucciones en la clusula ELSE se
ejecuta.
Es importante indicar que la sintaxis de un comando CASE mostrado aqu para uso en un
procedimientos almacenados difiere ligeramente de la expresin CASE utilizado en Query SQL. El
comando CASE no puede tener una clusula ELSE NULL y termina con END CASE en lugar de END.
Por ejemplo:
mysql>SET @x=1;
mysql> SELECT CASE @x WHEN 1 THEN 'Uno' WHEN 2 THEN 'Dos' ELSE 'Es Ms' END;
-> 'one'
mysql> SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END;
-> 'true'
mysql>SELECT ApellidoPaterno, ApellidoMaterno, nombres,
CASE EstadoCivil
WHEN "C" THEN "Casado(a)"
WHEN "S" THEN "Soltero(a)"
WHEN "V" THEN "Viudo(a)"
41
42
Un comando LOOP puede o no ser etiquetado. Etiqueta_finalizacin no puede darse hasta que est
presente Etiqueta_Inicio, y si ambos lo estn, deben ser la misma etiqueta.
SENTENCIA LEAVE
Este comando es utilizado para abandonar cualquier control de flujo etiquetado. Puede usarse en
un bloque BEGIN ... END o en bucles, su sintaxis es:
LEAVE etiqueta;
LA SETENCIA ITERATE
ITERATE slo puede aparecer en comandos LOOP, REPEAT, y WHILE . ITERATE significa vuelve a
hacer el bucle., su sintaxis es:
ITERATE etiqueta;
SENTENCIA REPEAT
[Etiqueta_Inicio:] REPEAT
lista_de_instrucciones
UNTIL condicin_de_bsqueda
END REPEAT [Etiqueta_Finalizacin]
43
En el ejemplo note que el delimitador no se lo cambia al normal (;), Considerando el ejemplo que
muestra 10 veces el nombre Gabriel, al utilizar REPEAT sera:
Delimiter //
CREATE PROCEDURE ejemplo2()
BEGIN
declare x int default 1;
REPEAT
select "Gabriel" As nombre,x As Contador;
set x=x+1;
UNTIL x>10 END REPEAT;
END//
Delimiter ;
SENTENCIA WHILE
[Etiqueta_Inicio:] WHILE condicin_de_bsqueda DO
lista_de_instrucciones
END WHILE [Etiqueta_Finalizacin]
Considerando el ejemplo que muestra 10 veces el nombre Gabriel, al utilizar WHILE sera:
Delimiter //
CREATE PROCEDURE ejemplo3()
BEGIN
declare x int default 1;
WHILE x<=10 DO
select "Gabriel" As nombre,x As Contador;
set x=x+1;
END WHILE;
END//
Delimiter ;
44
o tambin:
mysql>SELECT specific_name FROM proc WHERE type=procedure;
ste procedimiento almacenado no utiliza BEGIN.. END ya que solo tiene una sola instruccin Insert
Into, utiliza o 8 parmetros de la estructura de la tabla. Para utilizar la tabla aplique el siguiente
ejemplo:
CALL AgregaDatosPersonales ('Faras','Pincay','Marcos Javier','Playa Prieta, Calle Principal',
'0997123456', 'M', '1998-11-20','U');
45
El ejemplo aplica la asignacin mediante SELECT INTO cuando se cumple la condicin WHERE, la
asignacin es dada a la variable IdBuscar que esta definida como de salida (OUT).
El siguiente ejemplo crea un procedimiento almacenado que permite ingresar datos sobre las tablas
Personas y Profesores, oculta el diseo original de ambas tablas, ya que el programador o quin
tenga la necesidad de utilizarla, solo tendr que emplear el nombre del procedimiento y pasar sus
argumentos y no podr identificar el diseo de ambas tablas, de hecho no tendr idea, que se trata
de 2 tablas:
DROP PROCEDURE IF EXISTS AgregaProfesores;
DELIMITER //
CREATE PROCEDURE AgregaProfesores (ApPat varchar(50),ApMat varchar(50),Nomb
varchar(50),Direc varchar(150),fono varchar(15),sex varchar(1), FechaN Date, EstCivil
varchar(1),cargo Varchar(50), Titulacion Varchar(50), Fechaingreso date)
BEGIN
DECLARE Id INTEGER;
CALL AgregaDatosPersonales(ApPat,ApMat,Nomb,Direc,fono,sex,FechaN,EstCivil);
SELECT MAX(IdPersona) INTO Id FROM Personas;
INSERT INTO Profesores(IdPersona, cargo, Titulacion, Fechaingreso) VALUES (Id, cargo, Titulacion,
Fechaingreso);
END//
DELIMITER ;
Los argumentos utilizados en este ejemplo, son los mismos empleados en el procedimiento
AgregaDatosPersonales ms los datos de la tabla Profesores, aqu se aplica el llamado al
procedimiento AgregaDatosPersonales, que permiten registrar los datos personales del profesor,
posterior a esto, se obtiene el mayor de todos los identificadores y lo asigna a la variable Id, ste
mtodo de obtencin de identificador no es recomendable, s existen multiples usuarios conectados
a la base de datos, lo recomendable es utilizar el procedimiento BuscaId, pero es bueno observar
otras perspectivas. Para aplicar el uso de este procedimiento almacenado, utilice la siguiente
instruccin:
CALL AgregaProfesores ('Mero','Casanova','Boris Mareano','Calderon,
'097654321','M','1999-06-11','C','Profesor','Ingeniero Civil','2009-01-05');
46
diagonal
al
colegio',
El siguiente procedimiento almacenado es ms extenso que los anteriores ya que para agregar
datos de un estudiante, se necesita los apellidos y nombres de sus padres, utiliza los mismos
argumentos de la tabla Personas ms los datos de la tabla Estudiante, el ejemplo aplica los
procedimientos almacenados desarrollados anteriormente y aplica los mismos criterios de lgica:
DROP PROCEDURE IF EXISTS AgregaEstudiantes;
Delimiter //
CREATE PROCEDURE AgregaEstudiantes (ApPat varchar(50),ApMat varchar(50),Nomb
varchar(50),Direc varchar(150),fono varchar(15),sex varchar(1),FechaN Date, EstCivil varchar(1),
ApPatPP varchar(50),ApMatPP varchar(50),NombPP varchar(50),
ApPatMM varchar(50),ApMatMM varchar(50),NombMM varchar(50), Proce varchar(80))
BEGIN
DECLARE IdEst INTEGER;
DECLARE IdPapa INTEGER;
DECLARE IdMama INTEGER;
CALL BuscaId(IdPapa,ApPatPP,ApMatPP,NombPP);
CALL BuscaId(IdMama,ApPatMM,ApMatMM,NombMM);
CALL AgregaDatosPersonales(ApPat,ApMat,Nomb,Direc,fono,sex,FechaN,EstCivil);
CALL BuscaId(IdEst,ApPat,ApMat,Nomb);
INSERT INTO Estudiante(IdPersona, IdPersonaPapa, IdPersonaMama, Procedencia)
VALUES (IdEst, IdPapa, IdMama, Proce);
END//
Delimiter ;
Para ver el listado de procedimientos almacenados que se han creado, aplique el siguiente
comando:
SHOW PROCEDURE STATUS;
EJERCICIOS PROPUESTOS
Se necesita crear varios procedimientos almacenados que complementen la matriculacin, para
esto se necesita los siguientes procesos:
1. Un procedimiento almacenado para obtener el IdEspecialidad, para esto se utiliza como
argumento el identificador a devolver y el nombre de la especialidad.
2. Un procedimiento almacenado para obtener el Idcurso, para esto se utiliza como argumento
el identificador a devolver y el nombre del curso.
3. Un procedimiento almacenado para obtener el Idparalelo, para esto se utiliza como
argumento el identificador a devolver y la letra del paralelo
4. Crear un procedimiento almacenado que permita registra la matriculacin de un estudiante.
TAREA 10: Desarrolle el diseo de una base de datos para un consultorio mdico, el doctor
necesita registrar los datos personales del paciente, sus visitas mdicas, en caso de existir tambin
necesita registrar los datos de intervenciones quirrgicas de sus paciente, es importante destacar
que algunos pacientes de limitados recursos econmicos tienen crdito que pueden ser pagados
poco a poco; se necesita justificar el diseo de su propuesta y los procedimientos necesarios para
lograr cumplir con los objetivos del consultorio.
48
FUNCIONES EN MYSQL
Considerando lo expuesto en el capitulo de procedimientos almacenados, las funciones poseen el
siguiente formato:
CREATE FUNCTION nombre_funcin ([parametro[,...]]) RETURNS tipo_de_dato_a_devolver
[Caracterstica ...] cuerpo_de_desarrollo
La clusula RETURNS puede especificarse slo con FUNCTION, donde su definicin es obligatoria. Se
usa para indicar el tipo de retorno de la funcin, y el cuerpo de la funcin debe contener un
comando RETURN valor. La lista de parmetros entre parntesis debe estar siempre presente. Si
no hay parmetros, se debe usar una lista de parmetros vaca (). Cada parmetro es un parmetro
IN por defecto.
Un procedimiento o funcin se considera determinista si siempre produce el mismo resultado
para los mismos parmetros de entrada, y no determinista en cualquier otro caso. S no se da ni
DETERMINISTIC ni NOT DETERMINISTIC por defecto es NOT DETERMINISTIC. Un ejemplo de uso de
funciones es la siguiente:
CREATE FUNCTION hola (s CHAR(20)) RETURNS CHAR(50)
RETURN CONCAT('Hola, ',s,'!');
mysql> SELECT hola('Gabriel');
Si se desea hacer una funcin que devuelva la fecha con el formato dia de semana numero de mes
y ao, se podra realizar lo siguiente:
DROP FUNCTION IF EXISTS FechaLarga;
DELIMITER //
CREATE FUNCTION FechaLarga(fech DATETIME) RETURNS char(50)
BEGIN
RETURN date_format(fech,%W %d de %M de %Y);
END //
DELIMITER ;
Al ejecutar la lnea anterior notar que se muestra el formato en ingles, una alternativa a esta
situacin es la creacin de la siguiente funcin:
DROP FUNCTION IF EXISTS Fechacompleta;
DELIMITER //
CREATE FUNCTION Fechacompleta(fecha DATETIME) RETURNS varchar(150)
BEGIN
49
El siguiente ejemplo crea una funcin que acepta como argumento un dividendo y un divisor y
realiza una divisin sin usar el operador de divisin:
delimiter //
CREATE FUNCTION divide(dividendo int,divisor int) returns int
Begin
declare aux int;
declare contador int;
declare resto int;
set contador = 0;
set aux = 0;
while (aux + divisor) <= dividendo do
set aux = aux + divisor ;
set contador = contador + 1;
end while;
set resto = dividendo - aux ;
return contador;
END; //
delimiter ;
Para probarlo:
SELECT cadena_mas_larga('Hola Mundo','Hola Universidad Tcnica de Manab');
51
Para ejecutarlo:
SELECT cuenta_caracter('Todo nos es lisito pero no todo nos conviene','o');
Asumiendo que se necesita una funcin que devuelva el total de varones o de mujeres registrados
en la tabla Personas, se tendra que realizar lo siguiente:
DELIMITER //
CREATE FUNCTION Total(sex char(2)) RETURNS INT
BEGIN
DECLARE total INT;
SELECT COUNT(*) INTO total FROM personas WHERE sexo=sex;
RETURN total;
END //
DELIMITER ;
EJERCICIOS PROPUESTOS
Se necesita crear varios procedimientos almacenados que complementen la matriculacin, para
esto se necesita los siguientes procesos:
1. Elabore una funcin que permita calcular la factorial de un nmero.
2. Elabore una funcin que devuelva el nmero de hijos que tiene registrados en la base de
datos, utilice como argumento el identificador del padre.
TAREA 11: Desarrolle una funcin que permita transformar un valor a su correspondencia en
letras, la funcin debe recibir como argumento una catidad entera positiva, justifique su propuesta
lgica, no es requerido, pero si utiliza un argumento son 2 decimales y devuelve su equivalencia en
letras, se le asignar puntos extras que sustituir a una tarea no presentada.
52
CURSORES EN MYSQL
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:
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;
53
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
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.
Para realizar ejercicios que sirvan de ejemplo en la utilizacin de cursores, se agragarn 3 nuevas
tablas, La tabla TiposAsignaturas permitir registrar catrgoras como: Area, comisin, matria y
encargos que pueden ocupar tiempo asignado a los docentes, la tabla Materia registrar de forma
nica los nombres de las diferentes materias como: Ciencias Naturales, Lengua, Matemticas, entre
otras, La Tabla MatriasProfesores registrar que materias tendr a su cargo cada docente,
especialidad, curso, paralelo, periodo lectivo y el nmero de hora que tiene la materia.
Para ilustrar lo esplicado considere la siguiente imagen que muestra las tablas involucradas y su
respectiva relacin, asi tambin las correspondientes instrucciones SQL que crean de las tres tablas:
54
Asumamos que se necesita un procedimiento almacenado que utilizando cursores, permita agregar
profesores a la Comisin Social de la institucin, las autoridades han dispuesto que los profesores
que tienen asignado materias como la de Ingles, cultura fsica y dibujo se les asigne 2 horas a la
semana en su carga horaria.
Para chequear la distribucin horaria se aplica la siguiente consulta:
SELECT ApellidoPaterno, ApellidoMaterno, Nombres, materias.NombreMateria, materiasprofesores.NumeroHoras
FROM Personas, materias, materiasprofesores
WHERE materias.IdMateria = materiasprofesores.IdMateria
AND personas.IdPersona = materiasprofesores.IdPersonaProfesor;
Delimiter //
CREATE PROCEDURE AsignaComisionSocial()
BEGIN
DECLARE Limite BOOLEAN DEFAULT FALSE;
DECLARE v_IdPeriodoActual INTEGER;
DECLARE v_IdMateria INTEGER;
DECLARE v_IdProfesor INTEGER;
DECLARE v_IdEspecialidad INTEGER;
DECLARE v_IdCurso INTEGER;
DECLARE v_IdParalelo INTEGER;
#Llenado del cursor mediante la consulta
DECLARE Lista cursor for SELECT IdPersonaProfesor, IdEspecialidad, IdCurso, iDParalelo FROM materias,
materiasprofesores WHERE materias.IdMateria = materiasprofesores.IdMateria AND
materias.NombreMateria IN ('DIBUJO','CULTURA FISICA','INGLES') GROUP BY idpersonaprofesor;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Limite = TRUE;
#Para obtener el identificador del periodo lectivo actual
SELECT Max(IdPeriodoLectivo) INTO v_IdPeriodoActual FROM PeriodosLectivos;
#Para Obtener el identificador de Comisin Social
SELECT IdMateria INTO v_IdMateria FROM Materias WHERE NombreMateria=COMISION SOCIAL;
OPEN Lista;
c1_loop: LOOP
FETCH Lista INTO v_IdProfesor, v_IdEspecialidad, v_IdCurso, v_IdParalelo;
IF Limite THEN LEAVE c1_loop; END IF;
#Agrega al profesor a su carga la Comisin Social
INSERT INTO materiasprofesores ( IdPersonaProfesor, IdMateria, IdPeriodoLectivo,
IdEspecialidad, IdCurso, iDParalelo, NumeroHoras) VALUES (v_IdProfesor, v_IdMateria ,
v_IdPeriodoActual ,v_IdEspecialidad, v_IdCurso, v_IdParalelo,2);
END LOOP c1_loop;
CLOSE Lista;
END //
delimiter ;
EJERCICIO PROPUESTO:
Modofique el procedimiento almacenado que asigna profesores de dibujo, ingles y cultura fsica a la
comisin social, de manera que se le pueda pasar como argumento el nombre de la materia, el
nombre de la comisin a ser asignado y el nmero de horas.
TAREA 12: Desarrolle un procedimiento almacenado con cursores que permita mostrar la lista de
profesores indicando el nmero de horas asignados en materias, el nmero de horas asignadas en
otras actividades.
57
TRANSACCIONES
Como ya se ha expresado en contenidos anteriores, el servidor de bases de datos MySQL soporta
distintos tipos de ingeniera para la gestin de tablas, entre estos ISAM, MyISAM, InnoDB y BDB
(Berkeley Database), entre otros. De stos, InnoDB es el tipo de tabla ms importante (despus del
tipo predeterminado, MyISAM).
La diferencia radica en que las tablas del tipo InnoDB estn estructuradas de forma distinta que
MyISAM, ya que se almacenan en un slo archivo en lugar de tres, y sus principales caractersticas
permite el trabajo con transacciones, adems de definir reglas de integridad referencial.
Las transacciones aportan una fiabilidad superior a las bases de datos, ya que si se dispone de una
serie de consultas SQL que deben ejecutarse en conjunto, con el uso de transacciones se puede
tener la certeza de que nunca se quedar a medio camino de su ejecucin. De hecho, se podra
decir que las transacciones aportan una caracterstica de "deshacer" a las aplicaciones de bases de
datos.
Las tablas que soportan transacciones, como el caso de InnoDB, son mucho ms seguras y fciles de
recuperar si se produce algn fallo en el servidor, ya que las consultas se ejecutan o no en su
totalidad. Como una desventaja, es importante destacar que las transacciones pueden hacer que las
consultas tarden ms tiempo en ejecutarse.
En efecto, una de las principales caractersticas de las tablas del tipo InnoDB es que pueden trabajar
con transacciones, o sentencias SQL que son agrupadas como una sola. Un ejemplo tpico de esto es
una transaccin bancaria. Por ejemplo, si una cantidad de dinero es transferida de la cuenta de una
persona a otra, se requerirn por lo menos dos consultas:
UPDATE cuentas SET balance = balance - cantidad_transferida WHERE cliente = persona1;
UPDATE cuentas SET balance = balance + cantidad_transferida WHERE cliente = persona2;
Estas dos consultas deben trabajar bien, pero que sucede si ocurre algn imprevisto y "se cae" el
sistema despus de que se ejecuta la primer consulta, pero la segunda an no se ha completado?.
La persona1 tendr una cantidad de dinero removida de su cuenta, y creer que ha realizado su
pago, sin embargo, la persona2 estar enfadada puesto que pensar que no se le ha depositado el
dinero que le deben. En este ejemplo tan sencillo se ilustra la necesidad de que las consultas sean
ejecutadas de manera conjunta, o en su caso, que no se ejecute ninguna de ellas. Es aqu donde las
transacciones toman un papel muy importante.
Los pasos para usar transacciones en MySQL son:
Iniciar una transaccin con el uso de la sentencia BEGIN.
Actualizar, insertar o eliminar registros en la base de datos.
Si se quieren los cambios a la base de datos, completar la transaccin con el uso de la
sentencia COMMIT. nicamente cuando se procesa un COMMIT los cambios hechos por las
consultas sern permanentes.
Si sucede algn problema, podemos hacer uso de la sentencia ROLLBACK para cancelar los
cambios que han sido realizados por las consultas que han sido ejecutadas hasta el
momento.
Vamos a ejecutar algunas consultas para ver como trabajan las transacciones. Lo primero que
tenemos que hacer es crear una tabla del tipo InnoDB e insertar algunos datos.
58
Para crear una tabla InnoDB, procedemos con el cdigo SQL estndar CREATE TABLE, pero debemos
especificar que se trata de una tabla del tipo InnoDB (TYPE= InnoDB). Esto es aplicable a cualquier
tipo de tabla, pero cuando no se especifica nada, MySQL supone que se trata de una tabla MyISAM.
CREATE TABLE ejemplo (campo INT NOT NULL PRIMARY KEY) TYPE = InnoDB;
INSERT INTO ejemplo VALUES(1);
INSERT INTO ejemplo VALUES(2);
INSERT INTO ejemplo VALUES(3);
Ahora vamos a ver que sucede si perdemos la conexin al servidor antes de que la transaccin sea
completada.
mysql> BEGIN;
mysql> INSERT INTO ejemplo VALUES(4);
mysql> SELECT * FROM ejemplo;
+-------+
| campo |
+-------+
| 1|
| 2|
| 3|
59
| 4|
+-------+
4 rows in set (0.00 sec)
mysql> EXIT;
Bye
Cuando obtengamos de nuevo la conexin, podemos verificar que el registro no se insert, ya que
la transaccin no fue completada.
mysql> SELECT * FROM ejemplo;
+-------+
| campo |
+-------+
| 1|
| 2|
| 3|
+-------+
3 rows in set (0.00 sec)
Ahora vamos a repetir la sentencia INSERT ejecutada anteriormente, pero haremos un COMMIT
antes de perder la conexin al servidor al salir del monitor de MySQL.
mysql> BEGIN;
mysql> INSERT INTO innotest VALUES(4);
mysql> COMMIT;
mysql> EXIT;
Bye
Una vez que hacemos un COMMIT, la transaccin es completada, y todas las sentencias SQL que
han sido ejecutadas previamente afectan de manera permanente a las tablas de la base de datos.
mysql> SELECT * FROM ejemplo;
+-------+
| campo |
+-------+
| 1|
| 2|
| 3|
| 4|
+-------+
4 rows in set (0.00 sec)
OTRO EJEMPLO
En el ejemplo anterior hemos usado nicamente sentencias INSERT, sin embargo, sucede lo mismo
con sentencias UPDATE o DELETE.
Vamos a crear una sencilla tabla llamada ventas que sea del tipo InnoDB.
CREATE TABLE ventas(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
producto VARCHAR(30) NOT NULL,
cantidad TINYINT NOT NULL) TYPE = InnoDB;
Insertamos un registro.
INSERT INTO ventas VALUES(0,'Gansito marinela',3);
mysql> SELECT * FROM ventas;
+----+------------------+----------+
| id | producto
| cantidad |
+----+------------------+----------+
| 1 | Gansito marinela | 3
|
+----+------------------+----------+
1 row in set (0.01 sec)
mysql> BEGIN;
Actualizamos el registro.
UPDATE ventas SET cantidad=4 WHERE id=1;
TAREA 13: Investigue como transformar tablas de con ingeniera MyISAM a InnoDB, utilice como
experimento una copia de la base de datos Unidad; desarrolle 3 ejercicios con instrucciones SQL
que permitan el uso de transacciones, justifique las propuestas.
61
TRIGGERS (Disparadores)
El soporte para TRIGGERS en MySQL se realiz a partir de la versin 5.0.2. Un trigger puede ser
definido para que se ejecute antes o despus de un INSERT, DELETE o UPDATE en una tabla, lo hace
de forma automtica por cada registro del query.
Los TRIGGERS en MySQL tienen la misma limitante que las funciones. No pueden acceder a una
tabla en general. Pueden solamente acceder a un valor del registro que est siendo modificado por
el query, es decir 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 ejemplo de TRIGGER que valida datos antes de ser guardados en la
tabla Personas:
DROP TRIGGER IF EXISTS valida_personas;
Delimiter //
CREATE TRIGGER valida_personas BEFORE INSERT ON Personas FOR EACH ROW
BEGIN
IF LENGTH(TRIM(NEW.apellidoPaterno))>0 THEN
SET NEW.ApellidoPaterno= UPPER(NEW.ApellidoPaterno);
ELSE
SET NEW.ApellidoPaterno="No Registrado";
END IF;
IF LENGTH(TRIM(NEW.apellidoMaterno))>0 THEN
SET NEW.ApellidoMaterno= UPPER(NEW.ApellidoMaterno);
ELSE
SET NEW.ApellidoMaterno="No Registrado";
END IF;
IF LENGTH(TRIM(NEW.Nombres))>0 THEN
SET NEW.Nombres= UPPER(NEW.Nombres);
ELSE
SET NEW.Nombres="No Registrado";
END IF;
IF LENGTH(TRIM(NEW.Direccion))>0 THEN
SET NEW.Direccion= UPPER(NEW.Direccion);
ELSE
SET NEW.Direccion="No Registrado";
END IF;
IF LENGTH(TRIM(NEW.Telefono))=0 THEN
SET NEW.Telefono="No Registrado";
END IF;
IF NEW.sexo<>'M' Or NEW.Sexo<>'F' THEN
SET NEW.sexo='M';
END IF;
62
El siguiente ejemplo agrega a la base de datos Unidad el proceso de monitorear a todos los
usuarios que acceden a ella, para esto se agregar la tabla AuditoriaUsuarios, sta registrar cada
proceso que realice el usuario sobre la base de datos, como agregar nuevos registros, actualizarlos o
eliminarlos:
DROP TABLE IF EXISTS AuditoriaUsuarios;
CREATE TABLE AuditoriaUsuarios(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Fecha datetime,
-- fecha del proceso
Usuario varchar(40),
-- usuario implicado
Proceso varchar(10),
-- agregado, editado, eliminado
Datos varchar(255) NOT NULL
-- observacion del proceso
);
El siguiente ejemplo de TRIGGER se ejecuta despus de guardar datos sobre la tabla personas, esto
se lo puede aplicar a las otras tablas con las respectivas modificaciones:
DROP TRIGGER IF EXISTS MonitoreoPersonas;
Delimiter //
CREATE TRIGGER MonitoreoPersonas AFTER INSERT ON Personas FOR EACH ROW
BEGIN
DECLARE contenido Varchar(200);
SET contenido=CONCAT(NEW.IdPersona,' ',NEW.ApellidoPaterno,' ',NEW.ApellidoMaterno,'
',NEW.Nombres);
INSERT INTO AuditoriaUsuarios(Fecha,Usuario,Proceso,Datos)
VALUES (NOW(),USER(),'Agregado',contenido);
END //
Delimiter ;
TAREA 14: Considerando la base de datos que se utiliza en ste documento como ejemplo,
investigue y elabore un trigger que no permita, que un docente tenga ms de 20 horas clase en el
periodo lectivo actual, justifique su propuesta.
63
file_name es el nombre del fichero de salida, este nombre de fichero no debe existir en la ruta de
salida, ya que s existe la sentencia fallar.
En cuanto a las opciones de exportacin (export_options) son las que se utilizan en las clusulas
FIELDS y LINES de LOAD DATA. Su sintaxis es:
[FIELDS
[TERMINATED BY '\t']
[[OPTIONALLY] ENCLOSED BY '']
[ESCAPED BY '\\' ]
]
[LINES
[STARTING BY '']
[TERMINATED BY '\n']
]
Por ejemplo, para obtener un archivo de texto a partir de la tabla ' Personas ', con las columnas
delimitadas por ';', encerrado las columnas de texto con '"' y separando cada fila por la secuencia
'\r\n', usaremos la siguiente instruccin:
SELECT * FROM Personas INTO OUTFILE "ListaPersonas.txt" FIELDS TERMINATED BY ';' OPTIONALLY
ENCLOSED BY '\"' LINES TERMINATED BY '\n\r';
Por supuesto, el proceso contrario tambin es posible de realizar. Podemos leer el contenido de un
archivo de texto y vaciarlo a una tabla. El archivo origen puede haber sido creado mediante una
sentencia SELECT ... INTO OUTFILE, o mediante cualquier otro medio. Para hacerlo disponemos de
la sentencia LOAD DATA, cuya sintaxis ms simple es:
LOAD DATA [LOCAL] INFILE 'Nombre_Archivo.txt'
[REPLACE | IGNORE]
INTO TABLE Nombre_Tabla
[FIELDS
[TERMINATED BY '\t']
[[OPTIONALLY] ENCLOSED BY '']
[ESCAPED BY '\\' ]
] [LINES
[STARTING BY '']
[TERMINATED BY '\n']
] [IGNORE number LINES]
[(Nombre_Campo,...)]
La clusula LOCAL indica, si aparece, que el archivo est en el ordenador del cliente. Si no se
especifica el archivo de texto se buscar en el servidor, concretamente en el mismo directorio
donde est la base de datos. Esto nos permite importar datos desde nuestro ordenador en un
sistema en que el servidor de MySQL se encuentra en otra mquina.
Las clusulas REPLACE e IGNORE afectan al modo en que se tratan los registros ledos que
contengan el mismo valor para cada clave principal o nica para cada registro existente en la tabla.
Si se especifica la clusula REPLACE, este sustituir el registro actual por el registro ledo en el
archivo de texto. Si se especifica IGNORE el valor ledo ser ignorado y se registrar. La parte INTO
TABLA Nombre_Tabla indica en qu tabla se insertarn los valores ledos.
Las clusulas FIELDS y LINES, su significado es el mismo que vimos para la sentencia SELECT ... INTO
OUTFILE. Estas sentencias nos permiten interpretar correctamente cada registro y cada campo,
adaptndonos al formato del archivo de texto de entrada.
La misma utilidad tiene la clusula IGNORE nmero LINES, que nos permite que las primeras
nmero de lneas no se interpreten como datos a importar. Es frecuente que los ficheros de texto
que usaremos como fuente de datos contengan algunas cabeceras que expliquen el contenido del
fichero, o que contengan los nombres de cada campo. Usando esta clusula podemos ignorarlas.
65
La ltima parte nos permite indicar el campo a la que ser asignada cada una de las columnas
ledas, esto ser til si el orden de los campos en la tabla no es el mismo que en el fichero de texto,
o si el nmero de columnas es diferente en ambos.
Por ejemplo, supongamos que queremos aadir el contenido de este archivo a la tabla "Personas":
,Ureta,Parraga,Juan Jos,Cdla. Sur,052223256,M,1991-03-18,S
,Montenegro,Zambrano,Pascual,Cdla. Forestal,051123156,M,1999-04-23,S
,Espin,Almeida,Elva Mara,Rocafuerte,052636111,F,2001-10-20,S
,Intriago,Villa,Luis Francisco,Limn,052580113,M,1999-08-25,S
,Avila,Zamora,Eva Mara,Montecristi,052336232,F,2000-06-18,S
Como vemos, hay 9 columnas de datos, separados por 8 comas, en la tabla existen 9 campos, note
que cada fila empieza con una coma, esto se debe a que la tabla contiene como primer campo un
auto incrementable, por lo que quedar vaco, se lo hace, ya que el orden de las columnas es
importante.
La sentencia adecuada para leer los datos es
LOAD DATA INFILE "P-ListaPersonas.txt" INTO TABLE Personas FIELDS TERMINATED BY ',' LINES
TERMINATED BY '\n\r';
Qu pasara si el contenido del archivo utiliza datos encerrados con apostrofes, para importar estos
datos usted debera utilizar el siguiente comando:
,'Vera','Paez','Juan Jos','Cdla. Norte','052553256','M','1989-03-18','V'
,'Mogro','Mera','Oscar','Cdla. Forestal','051166156','M','2000-04-23','D'
,'Pin','Almeida','Mara Jos','Meja','052776111','F','2001-10-20','S'
,'Velez','Cano','Luis Francisco','Crucita','052880113','M','1989-08-25','C'
,'Pico','Pico','Eva Mara','Montecristi','052399232','F','1990-06-18','C'
LOAD DATA INFILE "P-ListaPersonas2.txt" INTO TABLE Personas FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '\' LINES TERMINATED BY '\n\r';
Suponiendo que el archivo de datos contiene ttulos de cada columna, usted podra utilizar:
IdPersona, ApellidoPaterno, ApellidoMaterno, Nombres,
FechaNacimiento, EstadoCivil
,Zuas,Parraga,Juan Jos,Cdla. Sur,052223256,M,1991-03-18,S
,Carbo,Zambrano,Pascual,Cdla. Norte,051123156,M,2000-04-23,S
,Vera,Almeida,Elva Mara,Manta,052636111,F,2001-10-20,S
,Macias,Villa,Luis Fercho,Jipijapa,052580113,M,1999-08-25,S
,Arauz,Zamora,Eva Mara,Santa Ana,052336232,F,2000-06-18,S
Direccion,
telefono,
sexo,
LOAD DATA INFILE "P-ListaPersonas3.txt" INTO TABLE Personas FIELDS TERMINATED BY ',' LINES
TERMINATED BY '\n\r'
IGNORE 0 LINES (IdPersona, ApellidoPaterno, ApellidoMaterno, Nombres, Direccion, telefono, sexo,
FechaNacimiento, EstadoCivil);
ADMINISTRACIN DE CLAVES
Los Usuarios y permisos se guardan dentro de la base de datos principal del gestor de MYSQL, la
base de datos de llama mysql y las tablas utilizadas para registrarlos son USER y GRANT.
Se puede utilizar la instruccin UPDATE para cambiar la clave de acceso mediante el usuario root,
para ello se debe ingresar a 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';
S usted desea quitar la clave simplemente contrasea debe estar vaca
Una vez cambiada la clave es necesario indicar al servidor que vuelva a cargar las tablas de
privilegios:
mysql> FLUSH PRIVILEGES;
Usted puede ver las diferentes posibilidades de privilegios que pueden ser asignados a los
diferentes usuarios utilizando la orden:
SHOW PRIVILEGES;
TAREA 16: Investigue como desarrollar un control que permita registrar los usuarios con su
respectivo historial de claves utilizadas, Justifique su propuesta.
67
Los servidores de base de datos de MySQL utilizan el espacio de memoria RAM disponible, para
establecer la cantidad de conexiones activas, para ver el nmero mximo de conexiones
simultaneas que su servidor soporta, se debe ejecutar la siguiente instruccin:
mysql> SHOW STATUS like %connections%;
Ejecutando este comando, nos muestra el estado actual, uptime (tiempo encendido), threads (hilos
de procesos), y queries (cantidad de consultas).
MYSQLADMIN -u root -p status
68
Si se necesita matar varios procesos, entonces le pasamos los ID's separados por comas.
MYSQLADMIN -u root -p kill 5,10
Para ejecutar varios comandos en una sola lnea, se deberan verse de la siguiente manera.
MYSQLADMIN -u root -p processlist status version
Para ejecutar un comando en un servidor remoto, se utiliza la ip del servidor, por ejemplo para ver
el estado del servidor, usted puede utilizar.
MYSQLADMIN -h 172.16.25.126 -u root -p status
S usted necesita Iniciar/parar replica en un servidor remoto, utilizamos los siguientes comandos.
MYSQLADMIN -u root -p start-slave
MYSQLADMIN -u root -p stop-slave
TAREA 17: Investigue almenos 2 utilidades prcticas que no se trataron en clase, que permita
evidenciar el uso de la herramienta, justifique lo investigado.
USO DE ENCRIPTACIONES
En algn momento usted necesitar proteger informacin clave como nmeros de cuentas,
nmeros de tarjetas de crdito, entre otros. Existen varias funciones que ofrecen diversos niveles
de seguridad, Estas funciones permiten el cifrado y descifrado de datos, usando algoritmos de
encriptacin.
AES (Advanced Encryption Standard), conocido anteriormente como "Rijndael." Usa un cifrado con
una clave de 128-bit, pero puede ampliarlo hasta 256 bits modificando las fuentes; utilizaremos la
siguiente tabla para realizar pruebas de funcionamiento:
CREATE TABLE prueba(
ID int NOT NULL AUTO_INCREMENT,
NOMBRE VARCHAR(60) default NULL,
TAR_CREDITO VARCHAR(100),
PRIMARY KEY (id)
);
INSERT INTO prueba VALUES (1,'Gabriel Demera',AES_ENCRYPT('111-222-333-444-555','secret'));
INSERT INTO prueba VALUES (2,'Javier Moreno',AES_ENCRYPT('666-777-888-999-000','secret'));
69
S por algn motivo se le olvida la llave, los datos no podrn volverlos a recuperar, por ejemplo:
SELECT id, nombre, AES_DECRYPT(TAR_CREDITO,'otro') FROM prueba;
TAREA 18: Desarrolle una propuesta de base de datos, que permita utilizar la encriptacin, realice
un ejemplo practico de su utilizacin, justifique la propuestas.
PARA ADMINISTRAR LOS RESPALDOS
Los procesos de respaldo son necesarios para salvaguardar la informacin almacenada en la base de
datos, existen muchas tcnicas de respaldo o aseguramiento de que en caso de fallas del servidor o
del equipo se puede contar con la informacin hasta el momento de su respaldo.
Para guardar (exportar) la base de datos ejemplo Unidad se utiliza el comando MYSQLDUMP que
se encuentra en la carpeta de ejecucin del servidor de MYSQL, para el caso de WAMP es:
C:\wamp\bin\mysql\mysql5.1.36\bin>
El siguiente ejemplo respalda la informacin contenida en la base de datos Unidad y genera un
archivo llamado backup.sql:
MYSQLDUMP --opt --user=root Unidad > backup.sql
Normalmente, una base de datos no solo contiene vistas, tablas y sus registros, sino que contiene
procedimientos almacenados y otras codificaciones necesarias para la gestin de los datos, para
incluirlos en el respaldo usted debe aplicar la instruccin de la siguiente forma:
MYSQLDUMP -u root -p Unidad --routines > backup_con_procedures.sql
Ahora s usted solo necesita los procedimientos almacenados, funciones y triggers, y no los datos,
entonces puede hacer uso de:
MYSQLDUMP -u root --routines --no-create-info --no-data --no-create-db --skip-opt Unidad >
OtroRespaldo.sql
70
Una vez creada la base de datos Ud. debe salir de la consola mysql> quit; y escribir la siguiente
orden:
C:\wamp\bin\mysql\mysql5.1.36\bin>mysql --user=root p Unidad < backup.sql
Otra posibilidad es desde la consola de mysql mediante la orden SOURCE, que utiliza un formato
como mysql> SOURCE /ruta/archivo.sql, por ejemplo:
mysql> SOURCE backup.sql;
TAREA 19: Desarrolle una practica de respaldo y restauracin de una base de datos, considere el
caso de que se han borrado registros de la base de datos original, restaure y describa su experiencia
al realizar la prctica, investigue y proponga sus normas o polticas de respaldo y aseguramiento de
la informacin.
REPLICACIONES
Los sistemas de gestin de las bases de datos, ofrece la capacidad de acceder a la informacin
desde cualquier punto geogrfico, siempre que los sistemas de comunicacin y de seguridad asi lo
permitan, bsicamente gestionan mediante el modelo cliente-servidor. Esta posibilidad obliga a que
la gestin y la estructura de la base de datos tengan gran importancia de manera que los servicios
que ofrecen funciones de manera continua.
La replicacin es una herramienta que permite distribuir datos en servidores separados, con el
objetivo de trabajar con los mismos datos pero en recursos fsicos diferentes, esto permite reducir
la dependencia de un sistema de base de datos centralizado.
Para garantizar que una aplicacin distribuida este confiadamente disponible, se deben instanciar
mltiples rplicas de sta, en distintos ordenadores. Se debe conseguir que cada uno de los
ordenadores que mantenga una rplica de la base de datos sea independiente de los dems, esto
por la probabilidad de la ocurrencia de fallos.
El objetivo principal para la distribucin de datos es proveer un acceso sencillo a la informacin por
parte de los usuarios de mltiples localidades o nodos de trabajo de una red de computadoras. Es
decir que una de las fortalezas de la herramienta radica en aumentar la disponibilidad de la
informacin aumentando el paralelismo en las consultas, ya que la misma informacin esta
almacenada en ms de una localidad de la red y mejorar la disponibilidad de los datos ante
eventuales cadas de servidores de la red.
Para demostrar la funcionalidad de la replicacin se explicar el proceso de configuracin entre dos
equipos (HOST), uno de ellos se denominar PC-MASTER, es considerado como el equipo principal
de la replicacin, la funcionalidad de ste servidor radica en receptar los procesos de agregado,
actualizado y eliminado de los datos, para que el equipo PC-ESCLAVO lo replique de forma
automtica, convirtindose prcticamente en un espejo del principal, convirtiendo al PC-ESCLAVO
en el servidor que atender los procesos de consulta, liberando a PC-MASTER de dicha carga de
trabajo, la prctica de configuracin del software se lo desarrollar en paquete de desarrollo
WAMP, asumiendo que su equipo dispone de una mquina virtual instalada para simular el uso de
otro equipo:
71
4. Utilice las siguiente direccin IP para configurar el PC-ESCLAVO (La Mquina Virtual)
5. Verifique si las dos mquinas estn conectadas, esto mediante el protocolo ICMP haciendo
ping de una maquina a otra.
De la PC-Master a la PC-Esclavo
72
De la PC-Esclavo a la PC-Master
6. MySQL posee un archivo de configuracin llamado My.ini que define el comportamiento del
servidor, usted necesita editarlo y despus verificar que no estn comentadas (es decir no
estn precedidas por el signo numeral #) las siguientes lneas, Para PC-MASTER:
log-bin=mysql-bin
server-id=1
Observe la siguiente grfica:
7. Reinicie el servicio wampmysqld en cada una de las PC, para esto seleccione:
Panel de Control\Herramientas Administrativas\Servicios, busque el servicio wampmysqld,
seleccinelo y haga clic en la opcin Reiniciar el servicio.
Considere la siguiente grfica:
73
d. El gestor de base de datos genera un archivo de conexin (log bin) con el servidor
principal, es necesario conocer el nombre del mismo para que el servidor a replicar
establezca conexin, para mostrar el nombre y su nmero de posicin se utiliza el
comando (MASTER STATUS;)
10. Nuevamente se debe entrar a la terminal de MySQL y aplicar el desbloqueo con el comando:
UNLOCK TABLES;
Para el ejemplo, es todo lo que hay que realizar en el servidor de PC-MASTER, los siguientes pasos
son para configurar la consola MySQL de la PC-ESCLAVO
11. Lo siguiente es ingresar a la consola de PC-ESCLAVO y crear una nueva base de datos con el
mismo nombre de la base de datos que tiene el PC-MAESTRO a la cual se le est trabajando
la rplica:
CREATE DATABASE Unidad;
12. Salga de la terminal (\q) y proceda a restaurar las tablas que respaldamos en el PC_MASTER
con el siguiente comando:
MYSQL u root p Unidad < replicaUnidad.sql
13. Se debe entrar nuevamente a la terminal de MySQL y parar los servicios del esclavo con el
siguiente comando:
STOP SLAVE;
14. Configure la conexin con el PC-MASTER con el siguiente comando:
CHANGE MASTER TO master_host=192.168.1.2,
master_user=esclavo,
master_password=123,
master_log_file=mysql-bin.000014,
master_log_pos=545;
15. Una vez configurado el servidor, inicie los servicios del esclavo con el comando:
START SLAVE;
74
16. Para comprobar que hay replica escribimos el siguiente comando que nos dir si est o no
funcionando:
SHOW SLAVE STATUS \G;
Para ver el funcionamiento de los servidores replicados, es necesario que agregue o actualice un
registro en la base de datos del PC_MASTER y pueda observar su cambio en PC-ESCLAVO.
TAREA 20: Desarrolle una prctica con almenos 3 estudiantes incluyndose, sobre replicacin de
una base de datos con almenos 2 servidores esclavos y un servidor master, desarrolle un ensayo
sobre la realizacin de la misma, (Adjuntar evidencia de que trabajaron los integrantes).
75
OPTIMIZE TABLE
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
OPTIMIZE TABLE debe usarse si ha borrado una gran parte de la tabla o si ha hecho varios cambios
en una tabla con registros de longitud variable (tablas que tienen columnas VARCHAR, BLOB, o TEXT
). Los registros borrados se mantienen en una lista enlazada y operaciones INSERT posteriores
resan posiciones de antiguos registros. Puede utilizar OPTIMIZE TABLE para reclamar la
disponibilidad no usada y para desfragmentar el fichero de datos.
En la mayora de inicializaciones, no necesita ejecutar OPTIMIZE TABLE para nada. Incluso si hace
muchas actualizaciones a registros de longitud variables, no es probable que necesite hacerlo ms
de una vez a la semana o mes y slo en ciertas tablas.
Actualmente, OPTIMIZE TABLE funciona slo en tablas MyISAM, BDB y InnoDB .
Para tablas MyISAM , OPTIMIZE TABLE funciona como sigue:
1. Si la tabla ha borrado o dividido registros, repare la tabla.
2. Si las pginas de ndice no estn ordenadas, ordnelas.
3. Si las estadsticas no estn actualizadas (y la reparacin no puede hacerse ordenando el ndice),
actualcelas.
Para tablas InnoDB , se mapea con ALTER TABLE, que reconstruye la tabla. Reconstruye las
estadsticas actualizadas de ndice y libera espacio no usado en el ndice clusterizado.
Puede hacer que OPTIMIZE TABLE funcione con otros tipos de tabla arrancando mysqld con la
opcin --skip-new o --safe-mode ; en este caso OPTIMIZE TABLE se mapea con ALTER TABLE.
Tenga en cuenta que MySQL bloquea la tabla mientras se ejecuta OPTIMIZE TABLE.
76
PERROR
Cuando se trabajan con tablas se pueden presentar errores e ndices corruptos, los sntomas de
tablas corruptas incluyen consultas que abortan inesperadamente y errores observables como los
siguientes:
tbl_name.frm is locked against change
Can't find file tbl_name.MYI (Errcode: ###)
Unexpected end of file
Record file is crashed
Got error ### from table handler
Para obtener una descripcin acerca de los errores puede ejectuar PERROR ###, donde ### es el
nmero de error. El siguiente ejemplo muestra cmo usar PERROR para encontrar el significado de
la mayora de errores comunes que indican un problema con la tabla:
C:\wamp\bin\mysql\mysql5.1.36\bin>PERROR 126 127 132 134 135 136 141 144 145
MySQL error code 126: Index file is crashed
Win32 error code 126: No se puede encontrar el mdulo especificado.
MySQL error code 127: Record file is crashed
Win32 error code 127: No se encontr el proceso especificado.
MySQL error code 132: Old database file
Win32 error code 132: El puntero del archivo no puede establecerse en el dispositivo especificado.
MySQL error code 134: Record was already deleted (or record file crashed)
Win32 error code 134: Se ha intentado utilizar JOIN o SUBST en una unidad que ya se haba unido.
MySQL error code 135: No more room in record file
Win32 error code 135: Se ha intentado utilizar JOIN o SUBST en una unidad que se haba sustituido.
MySQL error code 136: No more room in index file
Win32 error code 136: El sistema ha intentado eliminar la unin de una unidad que no est unida.
MySQL error code 141: Duplicate unique key or constraint on write or update
Win32 error code 141: El sistema ha intentado sustituir una unidad por un directorio unidad.
MySQL error code 144: Table is crashed and last repair failed
Win32 error code 144: El directorio no es un subdirectorio del directorio raz.
MySQL error code 145: Table was marked as crashed and should be repaired
Win32 error code 145: El directorio no est vaco.
CHECK TABLE
CHECK TABLE tbl_name [, tbl_name] ... [option] ...
option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}
Chequea una o varias tablas para errores. CHECK TABLE funciona para tablas MyISAM y InnoDB . Para
tablas MyISAM , la estadstica de clave se actualiza.
Desde MySQL 5.0.2, CHECK TABLE puede comprobar las vistas en busca de problemas tales como
tablas que se referencian en la definicin de la vista que ya no existe.
El comando CHECK TABLE retorna un cuadro con las siguientes columnas:
77
TABLA
NOMBRE DE TABLA
Op
COLUMNA
Msg_type
Msg_text
Tenga en cuenta que el comando puede producir varios registros para informacin de cada tabla
chequeada. El ltimo registro tiene un valor Msg_type de status y Msg_text normalmente debe ser
OK. Si no obtiene OK, o Table is already up to date (significa que el motor de almacenamiento para
la tabla indicada no hay necesidad de chequear la tabla) debe realizar una reparacin de la tabla.
Se puede dar el caso de que algunos problemas reportados por CHECK TABLE no puedan corregirse
automticamente por ejemplo Found row where the auto_increment column has the value 0,
esto significa que tiene un registro en la tabla donde la columna AUTO_INCREMENT contiene un
valor de ndice 0. (Esto puede ser posible al utilizar un comando UPDATE errado), en s no es un
error por s mismo, pero puede causar problemas si decide volcar la tabla y restaurarla o realizar un
ALTER TABLE en la tabla. En este caso, la columna AUTO_INCREMENT cambia los valores segn las
reglas de las columnas AUTO_INCREMENT , que pueden causar problemas tales como errores de
clave duplicada. Para evitar las advertencias, simplemente ejecute un comando UPDATE para poner
en la columna un valor distinto a 0.
Se pueden presentar problemas como tablas no cerradas adecuadamente o ndices corruptos, por
ejemplo cuando ocurre de un apagn. Ahora para reparar la tabla se puede usar la siguiente
sentencia:
mysql> REPAIR TABLE Personas;
REPAIR TABLE
REPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE
tbl_name [, tbl_name] ... [QUICK] [EXTENDED] [USE_FRM]
REPAIR TABLE repara una tabla posiblemente corrupta. Por defecto, tiene el mismo efecto que
myisamchk --recover tbl_name. REPAIR TABLE funciona slo en tablas MyISAM.
Normalmente nunca debe ejecutar este comando. Sin embargo, si hay un desastre, REPAIR TABLE
puede recuperar todos los datos de una tabla MyISAM . Si sus tablas se corrompen a menudo, debe
intentar encontrar la razn de lo que lo causa, para eliminar la necesidad de usar REPAIR TABLE.
El comando retorna una tabla con las siguientes columnas:
COLUMNA
Tabla
Op
Msg_type
Msg_text
VALOR
Nombre de tabla
Siempre es repair
Es status, error, info, o
warning
Mensaje
El comando REPAIR TABLE puede producir muchos registros de informacin para cada tabla
reparada. El ltimo registro tiene un valor Msg_type de status y Msg_test normalmente debe ser
78
OK. Si no obtiene OK, debe intentar reparar la tabla con myisamchk --safe-recover, ya que REPAIR
TABLE no implementa todas las opciones de myisamchk.
PARA ADMINISTRAR EL ESTADO DE LAS BASE DE DATOS
MYSQLCHECK comprueba y repara tablas MyISAM. Tambin puede optimizar y analizar tablas.
MYSQLCHECK es similar a MYISAMCHK, pero funciona de forma distinta. La principal diferencia
operacional es que mysqlcheck debe usarse cuando el servidor mysqld est en ejecucin, mientras
que myisamchk debe usarse cuando no lo est. El beneficio de usar mysqlcheck es que no tiene que
parar el servidor para comprobar o reparar las tablas.
MYSQLCHECK usa los comandos SQL CHECK TABLE, REPAIR TABLE, ANALYZE TABLE, y OPTIMIZE
TABLE de forma conveniente para los usuarios. Determina los comandos a usar en funcin de la
operacin que quiera realizar, luego enva los comandos al servidor para ejecutarlos. Hay tres
modos generales de invocar mysqlcheck:
shell> mysqlcheck [opciones] nombre_de_base_de_datos [tablas]
shell> mysqlcheck [opciones] --databases DB1 [DB2 DB3...]
shell> mysqlcheck [opciones] --all-databases
Si no nombra ninguna tabla o usa las opciones --databases o --all-databases, se comprueban todas
las bases de datos.
MYSQLCHECK tiene una caracterstica especial comparada con otros clientes. El comportamiento
por defecto de comprobar tablas (--check). Si quiere tener una herramienta que repare las tablas
por defecto, debe hacer una copia de mysqlcheck llamada MYSQLREPAIR, o hacer un enlace
simblico a mysqlcheck llamado mysqlrepair. Si invoca mysqlrepair, repara tablas.
Los siguientes nombres pueden usarse para cambiar el comportamiento por defecto de
mysqlcheck:
MYSQLREPAIR
MYSQLANALYZE
MYSQLOPTIMIZE
Ejemplos:
C:\wamp\bin\mysql\mysql5.1.36\bin> mysqlcheck -u root repair Unidad
C:\wamp\bin\mysql\mysql5.1.36\bin> mysqlcheck -u root analyze Unidad
C:\wamp\bin\mysql\mysql5.1.36\bin>mysqlcheck -u root optimize Unidad
--check-only-changed, -C Chequea slo tablas que han cambiado desde la ltima comprobacin o que no se
han cerrado correctamente.
--compress Comprime toda la informacin enviada entre el cliente y el servidor si ambos soportan
compresin.
--databases, -B Procesa todas las tablas en la base de datos especificada. Con esta opcin, todos los
argumentos nombrados se tratan como nombres de bases de datos, no como nombres de tablas.
--debug[=opciones_de_depuracin], -# [opciones_de_depuracin] Escribe un log de depuracin. La cadena
de caracteres opciones_de_depuracin a menudo es 'd:t:o,nombre_de_fichero'.
--default-character-set=conjunto_de_caracteres Usa conjunto_de_caracteres como el conjunto de
caracteres por defecto.
--extended, -e Si usa esta opcin para comprobar tablas, se asegura que sean 100% consistentes pero tarda
bastante. Si usa esta opcin para reparar tablas, ejecuta una reparacin extendida que puede no slo tardar
bastante tiempo, sino que tambin puede producir un montn de registros basura!
--fast, -F Comprueba slo tablas que no se han cerrado correctamente.
--force, -f Contina incluso si se produce un error SQL.
--host=nombre_de_equipo, -h nombre_de_equipo Conecta con el servidor MySQL en el equipo dado.
--medium-check, -m Realiza un chequeo que es ms rpido que la operacin --extended. Esto encuentra
slo el 99.99% de todos los errores, lo cual debera ser suficiente en la mayora de casos.
--optimize, -o Optimiza las tablas.
--password[=contrasea], -p[contrasea] La contrasea a usar cuando se conecta con el servidor. Si usa la
opcin con su forma corta (-p), no puede haber un espacio entre la opcin y la contrasea. Si omite el valor
contrasea a continuacin de la opcin --password o -p en la lnea de comandos, aparece un prompt
pidindola.
--port=nmero_de_puerto, -P nmero_de_puerto El puerto TCP/IP para usar en la conexin.
--protocol={TCP | SOCKET | PIPE | MEMORY} Protocolo de conexin a usar.
--quick, -q Si usa esta opcin para comprobar tablas, evita que el chequeo escanee los registros para buscar
enlaces incorrectos; es el mtodo de chequeo ms rpido. Si se utiliza esta opcin para reparar tablas, el
programa intenta reparar slo el rbol del ndice. Este es el mtodo ms rpido de reparacin.
--repair, -r Hace una reparacin que puede arreglar prcticamente todo excepto claves nicas que no son
nicas.
--silent, -s Modo silencioso. Slo muestra mensajes de error.
--socket=ruta, -S ruta Fichero socket a usar en la conexin.
--tables Ms prioritaria que la opcin --databases o -B. Todos los argumentos que vienen despus de la
opcin se consideran nombres de tablas.
--user=nombre_de_usuario, -u nombre_de_usuario El nombre de usuario MySQL a usar cuando se conecta
al servidor.
--verbose, -v Modo explcito. Muestra informacin acerca de varios estados de las operaciones del
programa.
--version, -V Muestra informacin de la versin y sale.
Slo Reparar:
MYSQLCHECK -Ar
Slo Optimizar:
MYSQLCHECK Ao
80
MYISAMCHK
myisamchk C:\wamp\bin\mysql\mysql5.1.36\Data\BaseDatos\*.MYI
myisamchk C:\wamp\bin\mysql\mysql5.1.36\Data\BaseDatos\tabla.MYI
El programa myisamchk es una utilidad en lnea de comandos que se incluye con la distribucin de
MySQL y sirve para reparar tablas tipo MyISAM. Para utilizarlo con seguridad el servidor no debe
estar ejecutndose y se recomienda realizar un respaldo del directorio de datos antes de su
utilizacin.
Recibe como parmetro principal los archivos .MYI correspondientes a las tablas que hay que
revisar; es decir, myisamchk no conoce la ubicacin del directorio de datos por lo que el ejemplo
inicial lo describe, asumiendo que se lo utiliza bajo la plataforma de Windows.
Por otro lado, si el directorio de datos est ubicado bajo la plataforma de Linux en /val/lib/mysql,
las siguientes seran dos maneras de realizar una comprobacin de los archivos de la base de datos:
myisamchk /var/lib/mysql/BaseDatos/*.MYI
cd /var/lib/lib/mysql/BaseDatos
myisamchk *.MYI
Se pueden revisar todas las bases de datos utilizando * para denominar el directorio de la base de
datos:
myisamchk /var/lib/mysql/*/*.MYI
Para realizar una comprobacin rpida, el manual sugiere utilizar el siguiente comando:
SHELL> myisamchk --silent --fast *.MYI
Y para realizar la correccin de las tablas corruptas, el manual sugiere la sintaxis siguiente:
SHELL> myisamchk --silent --force --update-state -O key_buffer=64M \
-O sort_buffer=64M -O read_buffer=1M -O write_buffer=1M *.MYI
TAREA 21: Investigue 1 casos de rescate y recuperacin de base de datos que se haya presentado,
describa con su palabra que opina sobre el hecho presentado.
81
La sentencia EXPLAIN puede utilizarse como un sinnimo de DESCRIBE o tambin como una manera
para obtener informacin acerca de cmo MySQL ejecuta una sentencia SELECT:
EXPLAIN nombre_de_tabla es sinnimo de DESCRIBE nombre_de_tabla o SHOW COLUMNS
FROM nombre_de_tabla.
Cuando se precede una sentencia SELECT con la palabra EXPLAIN, MySQL muestra informacin
del optimizador sobre el plan de ejecucin de la sentencia. Es decir, MySQL explica cmo
procesara el SELECT, proporcionando tambin informacin acerca de cmo y en qu orden
estn unidas (join) las tablas.
EXPLAIN es una ayuda para decidir qu ndices agregar a las tablas, con el fin de que las sentencias
SELECT encuentren registros ms rpidamente. EXPLAIN puede utilizarse tambin para verificar si el
optimizador une (join) las tablas en el orden ptimo. Si no fuera as, se puede forzar al optimizador
a unir las tablas en el orden en el que se especifican en la sentencia SELECT empezando la sentencia
con SELECT STRAIGHT_JOIN en vez de simplemente SELECT.
Si un ndice no est siendo utilizado por las sentencias SELECT cuando debiera, debe ejecutarse el
comando ANALYZE TABLE, a fin de actualizar las estadsticas de la tabla como la cardinalidad de sus
claves, que pueden afectar a las decisiones que el optimizador toma.
EXPLAIN muestra una lnea de informacin para cada tabla utilizada en la sentencia SELECT. Las
tablas se muestran en el mismo orden en el que MySQL las leera al procesar la consulta. MySQL
resuelve todas las uniones (joins) usando un mtodo de single-sweep multi-join. Esto significa que
MySQL lee un registro de la primera tabla; encuentra su correspondiente en la segunda tabla, en la
tercera, y as sucesivamente. Cuando todas las tablas han sido procesadas, MySQL muestra las
columnas seleccionadas y recorre a la inversa la lista de tablas hasta que encuentra aqulla para la
que la sentencia devuelve ms registros. Se lee entonces el siguiente registro de esta tabla y el
proceso contina con la siguiente tabla.
Pero, Qu quieren decir estas columnas? Qu informacin nos dan?
1. Table: Nos informa de la tabla a la que nos estamos refiriendo.
2. Type: El tipo de unin que se est usando. Desde la mejor hasta la peor, los tipos de uniones son
system, const, eq_ref, ref, range, index, y ALL.
System: Tabla con una nica fila, por tanto, la respuesta es inmediata.
Const: En la tabla coincide una nica fila con los criterios indicados. Al slo haber una fila, el
optimizador toma este valor como constante, por este motivo este tipo de tablas son muy
rpidas.
Eq_ref: Una fila de la tabla 1 ser leda por cada combinacin de filas de la tabla 2. Este tipo
es usado cuando todas las partes de un ndice se usan en la consulta y el ndice es UNIQUE o
PRIMARY KEY.
82
Ref: Todas las filas con valores en el ndice que coincidan sern ledos desde esta tabla por
cada combinacin de filas de las tablas previas. Similar a eq_ref, pero usado cuando usa slo
un prefijo ms a la izquierda de la clave o si la clave no es UNIQUE o PRIMARY KEY. Si la clave
que es usada coincide slo con pocas filas, esta union es buena.
Range: Slo sern recuperadas las filas que estn en un rango dado, usando un ndice para
seleccionar las filas. La columna key indica cual ndice es usado, y el valor key_len contiene
la parte ms grande de la clave que fue usada. La columna ref ser NULL para este tipo.
Index: Escaneo completo de la tabla para cada combinacin de filas de las tablas previas,
revisando nicamente el ndice.
ALL: Escaneo completo de la tabla para cada combinacin de filas. Es el peor caso ya que
revisar todas las filas para cada combinacin.
3. Possible_keys: Posibles indices que utilizar la consulta.
4. Key: ndice utilizado para ejecutar la consulta. Si indica el valor NULL, no se ha escogido ningn
ndice.
5. Key_len: Cuanto ms pequeo sea este valor, ms rpida ser la consulta, pues nos indica la
longitud del ndice usado.
6. Ref: Las columnas del ndice que se est usando, o una constante si esta es posible.
7. Rows: Nmero de filas que MySQL debe analizar para devolver los datos solicitados.
8. Extra: Informacin complementaria sobre como MySQL ejecutar la consulta. Los posibles
valores en este campo pueden ser:
Distinct: MySQL ha encontrado una fila coincidente con los filtros indicados y no necesita
seguir analizando.
Not exists: MySQL fue capaz de hacer una optimizacin LEFT JOIN sobre la consulta y no
examinar ms filas en la tabla para la combinacin de filas previa despus de que
encuentre una fila que coincida con el criterio LEFT JOIN.
Range checked for each record: No se encontr un ndice vlido. Para cada combinacin de
filas se har un chequeo para determinar que indice utilizar y en caso de encontrar alguno
vlido, lo utilizar.
Using filesort: Este valor indica que MySQL necesita hacer un paso extra para encontrar la
forma de ordenar las filas. Este tipo de consultas debe ser optimizada.
Using index: Recupera la informacin solicitada utilizando nicamente la informacin del
ndice. Esto sucede cuando todas las columnas requeridas forman parte del ndice.
Using temporary: Para resolver esta consulta, MySQL crear una tabla temporal. Uno de los
casos tpicos en los que devuelve este valor es cuando usamos un ORDER BY sobre un
conjunto de columnas diferentes a las indicadas en la clausula GROUP BY. Este tipo de
consultas debe ser optimizada.
Where used: Se usar una clausula WHERE para determinar que filas sern comparadas con
otra tabla. Si no deseamos regresar todas las filas desde la tabla, y el join es del tipo ALL o
index, es muy probable que hayamos escrito algo mal en la consulta.
Una respuesta en este campo del tipo Using filesort o Using temporary es susceptible de
ser una consulta a optimizar.
Si analizamos la consulta ejecutada anteriormente, vemos que para la tabla con alias up est
utilizando el tipo de unin `ALL` debido a que no existe ningn filtro en la clusula WHERE (en este
caso, es normal ya que queremos devolver todos los valores). Se podra utilizar el ndice existente
83
`user_id_idx` pero al no haber ningn filtro, no es necesario usarlo. Para devolver esta consulta
MySQL analizar 13 filas.
La segunda fila hace referencia a la tabla con alias u. Utiliza un tipo de unin `eq_ref` ya que
devolver una fila para cada fila de la tabla `up` pudiendo usar y usando el ndice primario de la
tabla que tiene una longitud de 4 (muy pequeo). Se est utilizando la columna `user_id` del ndice
de la tabla `up` y de la base de datos `futbol` analizando una nica fila para cada fila de la tabla
contigua.
TAREA 22: Desarrolle una prctica en la que utilice una base de datos con registros sin el uso de
ndices de forma inicial, genere varios anlisis con una consulta multitabla que cumpla:
Uso de subconsulta
Uso de producto cartesiano
Uso de composicin
Agregue ndices a las tablas relacionadas y repita los anlisis.
PARTICIONES DE TABLAS
Cuando alguna de las tablas de su base de datos llega a crecer tanto, el rendimiento empieza a ser
un problema, esta situacin le indicar que es hora de empezar a leer algo sobre su optimizacin u
adems sobre ndices; el comando EXPLAIN sera una buena alternativa para realizar un anlisis.
Una caracterstica algo menos conocida, aunque se introdujo en la versin 5.1 de MySQL, son las
particiones.
Tomando como ejemplo una base de datos, que registra informacin hospitalaria, una de las
mayores tablas con la que hay que lidiar, es la que almacena todos y cada uno de los contratos de
todas las personas que laboran y/o han laborado que alguna vez en el hospital, considere que se
tienen datos desde que se fund en los aos 50. Esto supone que existen un par de cientos de miles
de registros, lo cual no debera dar muchos dolores de cabeza con una base de datos bien
optimizada, que aplique consultas razonables, y un hardware decente. Sin embargo, hay personas
que tienen que tratar con cantidades de datos realmente enormes, que multiplican estos nmeros
por 10 veces 10.
Una solucin que nos puede venir a la cabeza, sobre todo si la mayor parte de la informacin se
almacena a modo de histrico y no se accede a ella frecuentemente, es dividir la tabla en varias
porciones. Por ejemplo Podramos mantener una tabla para el ao en curso y otra para el resto de
aos; o una para cada uno de los aos; o una por lustro; o por dcada esto depender de cmo
usted desee organizar los datos.
El particionado es un concepto parecido a lo expuesto en los prrafos anteriores, aunque
automatizado, que puede ahorrarnos muchos dolores de cabeza. Consiste en dividir los datos en
particiones ms pequeas (hasta 1024), ya que slo hay que acceder a una particin a la hora de
buscar registros.
Se puede particionar una tabla de 5 maneras diferentes:
84
Por rango: para lograr particiones por rangos de utiliza lmites de valores. Por ejemplo,
podramos segmentar los datos en 12 particiones: una para los contratos de 1950 a 1960,
otra para los aos 60, los 70, 80, 90, la dcada del 2000 y la dcada actual:
mysql>ALTER TABLE contratos
PARTITION BY RANGE (YEAR(fechaInicio)) (
PARTITION partDecada50 VALUES LESS THAN (1960),
PARTITION partDecada60 VALUES LESS THAN (1970),
PARTITION partDecada70 VALUES LESS THAN (1980),
PARTITION partDecada80 VALUES LESS THAN (1990),
PARTITION partDecada90 VALUES LESS THAN (2000),
PARTITION partDecada00 VALUES LESS THAN (2010),
PARTITION partDecada10 VALUES LESS THAN MAXVALUE);
Por listas: para construir nuestras particiones especificamos listas de valores concretos.
Por hash: MySQL se encarga de distribuir los registros automticamente usando una
operacin de mdulo. Slo hay que pasarle una columna o expresin que resulte en un
entero (el hash) y el nmero de particiones que queramos crear.
ALTER TABLE contratos
PARTITION BY HASH(YEAR(fechaInicio))
PARTITIONS 7;
Por clave: similar a la particin por hash, pero en este caso no necesitamos pasarle un
entero; MySQL utilizar su propia funcin de hash para generarlo. Si no se indica ninguna
columna a partir de la que desea generar el hash, se utiliza la clave primaria por defecto.
ALTER TABLE contratos
PARTITION BY KEY()
PARTITIONS 7;
85
Y este el resultado de aadir las particiones (ntese la palabra clave PARTITIONS para que
nos muestre tambin la informacin relativa a las particiones)
EXPLAIN PARTITIONS SELECT COUNT(*)
FROM contratos
WHERE fechaInicio BETWEEN '1950-01-01' AND '1955-12-31'
select_type table
partitions
type key rows Extra
SIMPLE
contratos partDecada50 ALL
8640 Using where
Como puede ver, el nmero de registros que MySQL tiene que comprobar disminuy en 2 rdenes
de magnitud.
Particionar tablas en MySQL nos permite rotar la informacin de nuestras tablas en diferentes
particiones, consiguiendo as realizar consultas ms rpidas y recuperar espacio en disco al borrar
los registros. El uso ms comn de particionado es segn fecha (date).
Para ver si nuestra base de datos soporta particionado simplemente ejecutamos:
SHOW VARIABLES LIKE '%partition%';
A continuacin veremos un ejemplo de cmo particionar una tabla por mes y posteriormente borrar
o modificar su informacin.
CREAR PARTICIONES
1.- Creamos la tabla reportes:
CREATE TABLE reportes (
id int(10) NOT NULL AUTO_INCREMENT,
fecha datetime NOT NULL,
reporte TEXT,
PRIMARY KEY (id, fecha)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Como se puede ver hemos aadido como ndice de tabla el campo fecha, esto es necesario si luego
queremos particionar por fecha.
2.- Ahora que tenemos la tabla creada vamos a particionar por mes:
ALTER TABLE reportes PARTITION BY RANGE(TO_DAYS(fecha))(
PARTITION p201111 VALUES LESS THAN (TO_DAYS("2011-12-01")),
PARTITION p201112 VALUES LESS THAN (TO_DAYS("2012-01-01")),
PARTITION p201201 VALUES LESS THAN (TO_DAYS("2012-02-01")),
PARTITION p201202 VALUES LESS THAN (TO_DAYS("2012-03-01")),
PARTITION p201203 VALUES LESS THAN (TO_DAYS("2012-04-01")),
PARTITION p201204 VALUES LESS THAN (TO_DAYS("2012-05-01")),
PARTITION p201205 VALUES LESS THAN (TO_DAYS("2012-06-01")),
PARTITION pDefault VALUES LESS THAN MAXVALUE
);
La ltima particin (pDefault) tendr todos los registros que no entren en las particiones anteriores.
De esta manera nos aseguramos que la informacin nunca dejar de insertarse en la tabla.
86
BORRAR PARTICIONES
Lo bueno de trabajar con particiones es que podemos borrar rpidamente registros sin tener que
recorrer toda la tabla e inmediatamente recuperar el espacio en disco utilizado por la tabla.
Por ejemplo si queremos borrar la particin ms antigua simplemente ejecutamos:
ALTER TABLE reportes DROP PARTITION p201111;
AADIR PARTICIONES
En el ejemplo anterior las 2 ltimas particiones creadas han sido:
PARTITION p201205 VALUES LESS THAN (TO_DAYS("2012-06-01")),
PARTITION pDefault VALUES LESS THAN MAXVALUE
El problema es que todos los INSERTs que se hagan despus de mayo de 2012 se insertarn en
pDefault. La solucin sera aadir particiones nuevas para cubrir los prximos meses:
ALTER TABLE reportes REORGANIZE PARTITION pDefault INTO (
PARTITION p201206 VALUES LESS THAN (TO_DAYS("2012-07-01")),
PARTITION pDefault VALUES LESS THAN MAXVALUE);
En el caso que no tuviramos una particin del tipo pDefault simplemente ejecutamos:
ALTER TABLE reports ADD PARTITION (PARTITION p201206 VALUES LESS THAN (TO_DAYS("2012-07-01")));
CONSULTAR PARTICIONES
Para consultar informacin de particiones creadas en una tabla as como tambin los registros que
contiene cada una ejecutamos:
SELECT PARTITION_NAME, TABLE_ROWS FROM information_schema.PARTITIONS
WHERE TABLE_NAME='reportes';
87
88
TAREA 23: Investigue que formas adicionales de particin ofrecen otros gestores de bases de
datos, desarrolle un anlisis y justifique su criterio.
89
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)
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... ;
-
COMANDO
alter table nombretabla ADD nombrecolumna tipodato;
alter table nombretabla change nombrecolumna nombrecolumna
nuevotipodato;
alter table nombretabla change nombrecolumnaviejo
nombrecolumnanuevo tipodato;
alter table nombretabla drop nombrecolumna;
create index nombrendice on nombretabla (nombrecolumna1,...);
alter table nombretabla add index (nombrecolumna);
create primary key on nombretabla (nombrecolumna1,...);
alter table nombretabla add primary key (nombrecolumna);
alter table nombretabla drop primary key;
90
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;
91
92
93
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
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
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
TIME
TIMEDIFF
TIMESTAMP
TIMESTAMPADD
TIMESTAMPDIFF
TIME_FORMAT
TIME_TO_SEC
TO_DAYS
UNIX_TIMESTAMP
UTC_DATE
UTC_TIME
UTC_TIMESTAMP
96
WEEK
WEEKDAY
WEEKOFYEAR
YEAR
YEARWEEK
DE BSQUEDA DE TEXTO
Funcin de bsqueda de texto:
MATCH
FUNCIONES DE CASTING (CONVERSIN DE TIPOS)
CAST o CONVERT Conversin de tipos explcita
MISCELANEA
Funciones generales:
DEFAULT
FORMAT
GET_LOCK
INET_ATON
DE GRUPOS
Funciones de grupos:
AVG
BIT_AND
BIT_OR
BIT_XOR
COUNT
97
CDIGO
SQLSTATE
MENSAJE DE ERROR
HY000
HY000
23000
HY000
HY000
23000
23000
HY000
1100
1104
HY000
42000
1106
1114
1150
42000
HY000
HY000
1165
HY000
1242
1263
21000
22004
1264
1265
1312
1317
1319
1325
22003
1000
0A000
70100
42000
24000
1329
1336 1337
1338
1339
1348 1357
1358 1362
1363
2000
42000 42000
No data to FETCH
USEis not allowed in a stored program Variable or
condition declaration after cursor or handler declaration
42000
Cursor declaration after handler declaration
20000
Case not found for CASE statement
HY000 HY000 Column %s is not updatable Cant drop a %s from within
another stored routine
HY000 HY000 GOTOis not allowed in a stored program handler
HY000
Updating of %s row is not allowed in %s trigger There is no
%s row in %s trigger
99
UPDATE
USAGE
GRANT OPTION
SIGNIFICADO
Da todos los permisos simples excepto GRANT OPTION
Permite el uso de ALTER TABLE
Modifica o borra rutinas almacenadas
Permite el uso de CREATE TABLE
Crea rutinas almacenadas
Permite el uso de CREATE TEMPORARY TABLE
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
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
100
RESPUESTAS
EJERCICIOS PROPUESTOS EN PROCEDIMIENTOS
Se necesita crear varios procedimientos almacenados que complementen la matriculacin, para
esto se necesita los siguientes procesos:
1. Un procedimiento almacenado para obtener el IdEspecialidad, para esto se utiliza como
argumento el identificador a devolver y el nombre de la especialidad.
2. Un procedimiento almacenado para obtener el Idcurso, para esto se utiliza como argumento
el identificador a devolver y el nombre del curso.
3. Un procedimiento almacenado para obtener el Idparalelo, para esto se utiliza como
argumento el identificador a devolver y la letra del paralelo
4. Crear un procedimiento almacenado que permita registra la matriculacin de un estudiante.
CREATE PROCEDURE BuscaIdEsp(OUT IdBuscar integer, IN espec varchar(50))
SELECT IdEspecialidad INTO IdBuscar FROM Especialidades WHERE nombreEspecialidad= espec;
CREATE PROCEDURE BuscaIdCur(OUT IdBuscar integer, IN cur varchar(30))
SELECT IdCurso INTO IdBuscar FROM Cursos WHERE curso= cur;
CREATE PROCEDURE BuscaIdPara(OUT IdBuscar integer, IN Para varchar(30))
SELECT IdParalelo INTO IdBuscar FROM Paralelos WHERE Paralelo= Para;
Delimiter //
CREATE PROCEDURE AgregaMatricula1 (ApPat varchar(50),ApMat varchar(50),Nomb varchar(50),
ApPatR varchar(50),ApMatR varchar(50),NombR varchar(50), Cur varchar(20),Par varchar(1),Esp
varchar(30), Folder varchar(50))
BEGIN
DECLARE IdEst INTEGER;
DECLARE IdRep INTEGER;
DECLARE IdEsp INTEGER;
DECLARE IdCur INTEGER;
DECLARE IdPar INTEGER;
DECLARE IdPL INTEGER;
SELECT IdPersona INTO IdEst FROM Personas WHERE concat(ApellidoPaterno,' ',ApellidoMaterno,'
',Nombres)= concat(ApPat,' ',ApMat,' ',Nomb);
SELECT IdPersona INTO IdRep FROM Personas WHERE concat(ApellidoPaterno,' ',ApellidoMaterno,'
',Nombres)= concat(ApPatR,' ',ApMatR,' ',NombR);
SELECT IdEspecialidad INTO Idesp FROM Especialidades WHERE nombreEspecialidad= Esp;
SELECT IdCurso INTO IdCur FROM Cursos WHERE curso= cur;
SELECT IdParalelo INTO IdPar FROM Paralelos WHERE Paralelo= Par;
SELECT MAX(IdPeriodoLectivo) INTO IdPL FROM Periodoslectivos;
INSERT INTO Matriculas(IdPersonaEstudiante, IdPeriodolectivo, IdEspecialidad, IdCurso,
IdParalelo,IdPersonaRepresentante, folder) VALUES (IdEst, IdPL,IdEsp, IdCur, IdPar, IdRep,Folder);
END//
delimiter ;
101
Delimiter //
CREATE PROCEDURE AgregaMatricula2 (ApPat varchar(50),ApMat varchar(50),Nomb varchar(50),
ApPatR varchar(50),ApMatR varchar(50),NombR varchar(50), Cur varchar(20),Par varchar(1),Esp
varchar(30), Folder varchar(50))
BEGIN
DECLARE IdEst INTEGER;
DECLARE IdRep INTEGER;
DECLARE IdEsp INTEGER;
DECLARE IdCur INTEGER;
DECLARE IdPar INTEGER;
DECLARE IdPL INTEGER;
CALL BuscaId(IdEst,ApPat,ApMat,Nomb);
CALL BuscaId(IdRep,ApPatR,ApMatR,NombR);
CALL BuscaIdEsp(Idesp,Esp);
CALL BuscaIdCur(IdCur,Cur);
CALL BuscaIdPara(IdPar,Par);
SELECT MAX(IdPeriodoLectivo) INTO IdPL FROM Periodoslectivos;
INSERT INTO Matriculas(IdPersonaEstudiante, IdPeriodolectivo, IdEspecialidad, IdCurso,
IdParalelo,IdPersonaRepresentante, folder)
VALUES (IdEst, IdPL,IdEsp, IdCur, IdPar, IdRep,Folder);
END//
Delimiter ;
Para ejecutarlo:
SELECT factorial(6);
Delimiter //
CREATE FUNCTION Hijos(id int) RETURNS int
102
Begin
DECLARE total int Default 0;
SELECT Count(*) INTO total FROM Estudiante WHERE IdPersonaPapa=id;
RETURN total;
END //
DELIMITER ;
Para ejecutarlo:
SELECT DISTINCT personas.ApellidoPaterno, personas.ApellidoMaterno, personas.Nombres,
Hijos(personas.IdPersona) as num de hijos
FROM personas INNER JOIN estudiante ON personas.IdPersona = estudiante.IdPersonaPapa;
104