Sei sulla pagina 1di 84

ITSP-ISC

INSTITUTO TECNOLGICO SUPERIOR


DE PNUCO







ANTOLOGIA DE LA MATERIA DE
TALLER DE BASE DE DATOS


MSC. JULIA PATRICIA MELO MORIN



Taller de Base de Datos

INSTITUTO TECNOLGICO SUPERIOR
DE PNUCO
ANTOLOGIA DE LA MATERIA DE
TALLER DE BASE DE DATOS






MSC. JULIA PATRICIA MELO MORIN

Clave: SCS -0432
Pgina 1
INSTITUTO TECNOLGICO SUPERIOR

Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 2

Contenido
Unidad I. Introduccin al Sistema Manejador de Base de Datos (DBMS) ........................................ 4
1.1 Conceptos. ........................................................................................................................................ 4
Bases de datos ................................................................................................................................... 4
Sistema de Gestin de Bases de Datos (SGBD/DBMS) .............................................................. 4
1.2 Caractersticas del DBMS .............................................................................................................. 4
a) Caractersticas ............................................................................................................................ 4
b) Funcionalidades de un SGBD .................................................................................................. 5
c) Ventajasde un SGBD ................................................................................................................. 5
d) Componentes de un Sistema Gestor de Base de Datos ...................................................... 6
Inconvenientes del enfoque BD ....................................................................................................... 6
Cuando un SGBD puede no ser necesario: ................................................................................... 7
Caractersticas del DBMS MySQL ................................................................................................... 7
Unidad 2. Lenguaje de Definicin de Datos DDL ........................................................................................... 9
2.1 Creacin de Base de Datos .................................................................................................................. 9
a) Creacin de una BD ....................................................................................................................... 9
b) Visualizar BD existentes .............................................................................................................. 10
c) Seleccionar la base de datos: ...................................................................................................... 10
d) Eliminar una base de datos. ........................................................................................................ 10
2.2 Creacin de Tablas ............................................................................................................................ 10
Tipos de datos ..................................................................................................................................... 10
Creacin de tablas ............................................................................................................................... 13
b) Mostrar las tablas existentes en la base de datos: ..................................................................... 13
c) Muestra la estructura de la tabla: ............................................................................................... 13
d) Eliminacin de tablas. .................................................................................................................. 13
e) Modificar tablas. .......................................................................................................................... 14
Definicin de restricciones bsicas. .................................................................................................... 14
2.3 Creacin de ndices............................................................................................................................ 21
Unidad 3. Consultas y Lenguaje de Manipulacin de Datos (DML) ............................................................ 27
3.1 Instrucciones INSERT, UPDATE y DELETE .......................................................................................... 27
Insercin de datos ............................................................................................................................... 27
Actualizacin de datos......................................................................................................................... 28
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 3

Eliminacin de datos ........................................................................................................................... 29
3.2 Consultas bsicas SELECT, WHERE y funciones a nivel de registro ................................................... 30
3.3 Consultas sobre mltiples tablas. ...................................................................................................... 36
3.4 Agregacin GROUP BY, HAVING ........................................................................................................ 41
3.5 Funciones de conjunto de registros COUNT, SUM, AVG, MAX, MIN ................................................ 43
Unidad 4. Control de Transacciones............................................................................................................ 45
4.1 Propiedades de la Transaccin .......................................................................................................... 45
Transacciones en MySQL .......................................................................................................................... 47
4.2 Grados de Consistencia .................................................................................................................... 52
4.3 Niveles de Aislamiento ...................................................................................................................... 57
4.4 Instrucciones COMMIT y ROLLBACK ................................................................................................. 62
Unidad 5. Vistas ........................................................................................................................................... 63
5.1 Definicin y Objetivo de las Vistas .................................................................................................... 63
5.2 Instrucciones para la Administracin de Vistas ................................................................................. 63
Unidad 6. Seguridad .................................................................................................................................... 65
6.1 Esquemas de Autorizacin ................................................................................................................ 65
6.2 Instrucciones GRANT Y REVOKE ........................................................................................................ 66
Unidad 7. Introduccin al SQL Procedural .................................................................................................. 70
7.1 Procedimientos Almacenados ........................................................................................................... 70
7.2 Disparadores (Triggers) ..................................................................................................................... 79







Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 4

Unidad I. Introduccin al Sistema Manejador de Base de
Datos (DBMS)

1.1 Conceptos.
Bases de datos
Datos: hechos conocidos que pueden ser almacenados, tienen un significado
implcito

Base de Datos (BD)
Coleccin de datos interrelacionados

Sistema de Gestin de Bases de Datos (SGBD/DBMS)
Software que facilita la creacin y el mantenimiento de Base de Datos

Existen SGBD comerciales: DB2, Oracle, SQLServer o de libre distribucin tales
como: MySQL, Postgres.



1.2 Caractersticas del DBMS

a) Caractersticas
Descripcin natural del sistema de base de datos: un SGBD almacena la
descripcin de la base de datos (meta-datos)
Independencia Datos-Programa: permite cambiar estructuras de datos y
operaciones sin tener que cambiar los programas de acceso del SGBD
Abstraccin de Datos: un modelo de datos es usado para ocultar detalles de
almacenamiento y presentar a los usuarios una vista conceptual de la base de
datos.
Si no estn relacionados
son de poca utilidad
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 5

Soporte de vistas mltiples de datos: cada usuario puede ver una vista diferente
de la base de datos, que solo describe los datos de inters del usuario
Capacidad de compartir datos y procesar transacciones multiusuario: permite
que un conjunto de usuarios concurrentes recuperen y actualicen la base de
datos

b) Funcionalidades de un SGBD
Definir la base de datos: tipos de datos, estructuras y restricciones.

Construir o cargar la base de datos en un medio de almacenamiento.

Manipulacin de la base de datos: consultas, generacin de reportes, insercin,
eliminacin y modificacin de su contenido.

Procesamiento concurrente de un conjunto de usuarios y programas,
conservando los datos validos y consistentes.

Proteccin y medidas de seguridad para prevenir accesos no autorizados.

Presentacin y visualizacin de los datos

c) Ventajas de un SGBD

Control de la redundancia en los datos almacenados
Posibilidad de compartir datos entre mltiples usuarios/aplicaciones
Restriccin de accesos no autorizados a la base
Suministro de almacenamiento persistente para objetos del programa (en ciertos
sistemas)
Suministro de estructuras de almacenamiento para el procesamiento eficiente de
consultas
Suministro de servicios de respaldo y de recuperacin
Suministro de interfaces mltiples para diferentes clases de usuarios
Representacin de relaciones complejas entre datos
Cumplimiento de restricciones de integridad en la base de datos
Modelado de inferencias y acciones usando reglas


Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 6

d) Componentes de un Sistema Gestor de Base de Datos





Usan Escriben Usan Usa











----------------------------------------------------------------------------------------------------------







Inconvenientes del enfoque BD
Principales inhibidores (costos) de uso de un SGBD:
Administrador de
la Base de Datos
Usuarios
sofisticados
(Analistas)
Usuarios finales
(usuarios web,
capturistas)
Programadores
Herramientas
de
administracin
Motor de
evaluacin de
consultas
Compilador
de consultas
Consultas
(DML)
Compilador y
ligador
Cdigo objeto de los
programas de
aplicacin
Herramienta
de consulta
Programa
Aplicacin
Interfaz de
aplicacin
Interpretes de
comando de
definicin
Procesador
de consulta
ndices
Diccionario de
Datos Datos
Gestor
transaccional
Gestor de
autorizaciones
y seguridad
Gestor de
archivos
Gestor de
Almacenamien
to en disco
Gestor de
almacenamiento
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 7

Inversin inicial alta y la posibilidad de necesitar hardware adicional
Overhead (gastos) para proporcionar funciones de seguridad, control de
concurrencia, recuperacin e integridad

Cuando un SGBD puede no ser suficiente:

cuando no es capaz de manejar la complejidad de los datos
Cuando se necesitan operaciones especiales que no son soportadas por
el SGBD.
Cuando un SGBD puede no ser necesario:
Si la base de datos y las aplicaciones son simples, bien definidas y no se espera
que cambien.
Si hay requerimientos rigurosos en tiempo real que no puedan ser cubiertos por el
SGBD.
Si no se requiere acceso a los datos de mltiples usuarios
Caractersticas del DBMS MySQL
Las principales caractersticas de este gestor de bases de datos son las siguientes:
Aprovecha la potencia de sistemas multiprocesador, gracias a su
implementacin multihilo.
Soporta gran cantidad de tipos de datos para las columnas.
Dispone de API's en gran cantidad de lenguajes (C, C++, Eiffel, Java, Perl, PHP,
Python, Ruby, y Tcl).
Gran portabilidad entre sistemas.
Soporta hasta 32 ndices por tabla.
Gestin de usuarios y passwords, manteniendo un muy buen nivel de seguridad
en los datos.
Escrito en C y en C++
Probado con un amplio rango de compiladores diferentes
Funciona en diferentes plataformas.
Usa GNU Automake, Autoconf, y Libtool para portabilidad.
Uso completo de multi-threaded mediante threads del kernel. Pueden usarse
fcilmente multiple CPUs si estn disponibles.
Proporciona sistemas de almacenamiento transaccionales y no transaccionales.
Usa tablas en disco B-tree (MyISAM) muy rpidas con compresin de ndice.
Relativamente sencillo de aadir otro sistema de almacenamiento. Esto es til si
desea aadir una interfaz SQL para una base de datos propia.
Un sistema de reserva de memoria muy rpido basado en threads.
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 8

Joins muy rpidos usando un multi-join de un paso optimizado.
Tablas hash en memoria, que son usadas como tablas temporales.
Las funciones SQL estn implementadas usando una librera altamente
optimizada y deben ser tan rpidas como sea posible.
El servidor est disponible como un programa separado para usar en un entorno
de red cliente/servidor. Tambin est disponible como biblioteca y puede ser
incrustado (linkeado) en aplicaciones autnomas. Dichas aplicaciones pueden
usarse por s mismas o en entornos donde no hay red disponible.

















Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 9

Unidad 2. Lenguaje de Definicin de Datos DDL
2.1 Creacin de Base de Datos
Structured Query Language (SQL).- Lenguaje asociado al modelo relacional que permite:
La definicin de esquemas relacionales
La manipulacin de tablas

SQL se divide en dos sublenguajes:
a) DDL (Data Definition Language) - Lenguaje de Definicin de Datos
b) DML (Data Manipulation Language) Lenguaje de Manipulacin de Datos

El DDL contiene instrucciones que permite crear las estructuras de la base de datos y cada uno de sus
elementos.
El DML lo forman instrucciones que permiten tener acceso a las estructuras para suprimir, modificar e
insertar datos.

a) Creacin de una BD
Para iniciar el manejo de base de datos se tiene que crear el archivo que almacenar cada uno de los
elementos de la misma. La instruccin SQL para crear una BD es CREATE DATABASE.
Sintaxis:
Create database <<nombre_bd>>;

Ejemplo:
Create database tienda;
Create database ejercicio;
Create database biblioteca;



Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 10

b) Visualizar BD existentes
Si se desea visualizar todas las bd creadas en el servidor se utiliza el comando SHOW. La sintaxis es:
Show databases;

c) Seleccionar la base de datos:
Use nombre_bd;

d) Eliminar una base de datos.
Para eliminar una base de datos con todos sus elementos se utiliza el comando DROP.
DROP DATABASE <<nombre_BD>>;
Ejemplo: DROP DATABASE tienda;
Al ejecutar el comando DROP se eliminaran todos los componentes de la base de datos.

2.2 Creacin de Tablas
Tipos de datos
En MySQL existen muchos tipos diferentes disponibles y se agruparan por categoras: de caracteres,
enteros, de coma flotante, tiempos, bloques, enumerados y conjuntos.

Tipos de datos de cadenas de caracteres
a) CHAR. Es un sinnimo de CHAR(1), y puede contener un nico carcter.
CHAR(N). Contiene una cadena de longitud constante. Para mantener la longitud de la cadena,
se rellena a la derecha con espacios. Estos espacios se eliminan al recuperar el valor. Los valores
vlidos para N son de 0 a 255.
CHAR es un alias para CHARACTER.
b) VARCHAR(N). Contiene una cadena de longitud variable. Los valores vlidos para N son de 0 a
255. Los espacios al final se eliminan.
VARCHAR es un alias para CHARACTER VARYING.

Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 11

Tipos de datos enteros
a) TINYINT. Contiene un valor entero muy pequeo. El rango con signo es entre -128 y 127. El
rango sin singo, de 0 a 255.
b) BIT, BOOL, BOOLEAN. Todos son sinnimos de TINYINT(1).
c) SMALLINT. Contiene un entero corto. El rango con signo es de -32768 a 32767. El rango sin
singo, de 0 a 65535.
d) MEDIUMINT. Contiene un entero de tamao medio, el rango con signo est entre -8388608 y
8388607. El rango sin signo, entre 0 y 16777215.
e) INT. Contiene un entero de tamao normal. El rango con signo est entre -2147483648 y
2147483647. El rango sin singo, entre 0 y 4294967295.
f) INTEGER. Es sinnimo de INT.
g) BIGINT. Contiene un entero grande. El rango con signo es de -9223372036854775808 a
9223372036854775807. El rango sin signo, de 0 a 18446744073709551615.

Tipos de datos en coma flotante
a) FLOAT. Contiene un nmero en coma flotante. precisin puede ser menor o igual que 24 para
nmeros de precisin sencilla y entre 25 y 53 para nmeros en coma flotante de doble
precisin.
b) FLOAT(M,D). Contiene un nmero en coma flotante pequeo (de precisin sencilla). Los valores
permitidos son entre -3.402823466E+38 y -1.175494351E-38, 0, y entre 1.175494351E-38 y
3.402823466E+38. Si se especifica el modificador UNSIGNED, los valores negativos no se
permiten.
El valor M es la anchura a mostrar y D es el nmero de decimales. Si se usa sin argumentos o si
se usa FLOAT(X), donde X sea menor o igual que 24, se sigue definiendo un valor en coma
flotante de precisin sencilla.
c) DOUBLE(M,D). Contiene un nmero en coma flotante de tamao normal (precisin doble). Los
valores permitidos estn entre -1.7976931348623157E+308 y -2.2250738585072014E-308, 0, y
entre 2.2250738585072014E-308 y 1.7976931348623157E+308. Si se especifica el modificador
UNSIGNED, no se permiten los valores negativos. El valor M es la anchura a mostrar y D es el
nmero de decimales.
d) DOUBLE PRECISION o REAL. Ambos son sinnimos de DOUBLE.
e) DECIMAL. Contiene un nmero en coma flotante sin empaquetar. Se comporta igual que una
columna CHAR: "sin empaquetar" significa que se almacena como una cadena, usando un
carcter para cada dgito del valor. El punto decimal y el signo '-' para valores negativos, no se
cuentan en M (pero el espacio para estos se reserva). Si D es 0, los valores no tendrn punto
decimal ni decimales.
El rango de los valores DECIMAL es el mismo que para DOUBLE, pero el rango actual para una
columna DECIMAL dada est restringido por la eleccin de los valores M y D.
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 12

f) DEC, NUMERIC, FIXED. Todos ellos son sinnimos de DECIMAL.

Tipos de datos para tiempos
a) DATE. Contiene una fecha. El rango soportado est entre '1000-01-01' y '9999-12-31'. MySQL
muestra los valores DATE con el formato 'AAAA-MM-DD', pero es posible asignar valores a
columnas de este tipo usando tanto nmeros como cadenas.
b) DATETIME. Contiene una combinacin de fecha y hora. El rango soportado est entre '1000-01-
01 00:00:00' y '9999-12-31 23:59:59'. MySQL muestra los valores DATETIME con el formato
'AAAA-MM-DD HH:MM:SS', pero es posible asignar valores a columnas de este tipo usando
tanto cadenas como nmeros.
c) TIMESTAMP. Contiene un valor del tipo timestamp. El rango est entre '1970-01-01 00:00:00' y
algn momento del ao 2037. Desde MySQL 4.1, TIMESTAMP se devuelve como una cadena con
el formato 'AAAA-MM-DD HH:MM:SS'. Para convertir este valor a un nmero, bastar con
sumar el valor 0. Ya no se soportan distintas longitudes para estas columnas.
TIMESTAMP(M), cuando M es 8 14 se devuelven como nmeros, mientras que para el resto
de valores se devuelven como cadenas.
d) TIME. Una hora. El rango est entre '-838:59:59' y '838:59:59'. MySQL muestra los valores TIME
en el formato 'HH:MM:SS', pero permite asignar valores a columnas TIME usando tanto cadenas
como nmeros.
e) YEAR[(2|4)]. Contiene un ao en formato de 2 4 dgitos (por defecto es 4). Los valores vlidos
son entre 1901 y 2155, y 0000 en el formato de 4 dgitos. Y entre 1970-2069 si se usa el formato
de 3 dgitos (70-69). MySQL muestra los valores YEAR usando el formato AAAA, pero permite
asignar valores a una columna YEAR usando tanto cadenas como nmeros.

Tipos de datos para datos sin tipo o grandes bloques de datos
a) TINYBLOB, TINYTEXT. Contiene una columna BLOB o TEXT con una longitud mxima de 255
caracteres.
b) BLOB, TEXT. Contiene una columna BLOB o TEXT con una longitud mxima de 65535 caracteres.
c) MEDIUMBLOB, MEDIUMTEXT. Contiene una columna BLOB o TEXT con una longitud mxima de
16777215 caracteres.
d) LONGBLOB, LONGTEXT. Contiene una columna BLOB o TEXT con una longitud mxima de
4294967298 caracteres.

Tipos enumerados y conjuntos
a) ENUM('valor1','valor2',...). Contiene un enumerado. Un objeto de tipo cadena que puede tener
un nico valor, entre una lista de valores 'valor1', 'valor2', ..., NULL o el valor especial de error
"". Un ENUM puede tener un mximo de 65535 valores diferentes.
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 13

b) SET('valor1','valor2',...). Contiene un conjunto. Un objeto de tipo cadena que puede tener cero o
ms valores, cada uno de los cuales debe estar entre una lista de valores 'valor1', 'valor2', ... Un
conjunto puede tener un mximo de 64 miembros.

Creacin de tablas

a) CREATE TABLE: Especifica una nueva tabla indicando sus atributos y sus tipos de datos










b) Mostrar las tablas existentes en la base de datos:
Show tables;

c) Muestra la estructura de la tabla:
Describe nombe_tabla;

d) Eliminacin de tablas.
Para eliminar una tabla se utiliza el comando DROP TABLE. Ejemplo:
DROP TABLE articulo;



CREATE TABLE nombre (
atributo_1 tipo_1,
atributo_2 tipo_2,
.
atributo_n tipo_n
);
CREATE TABLE ARTICULO (
Numero CHAR (15),
Descripcin VARCHAR (50),
Precio NUMERIC (4,2)
);
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 14

e) Modificar tablas.
Para modificar la estructura de una tabla se utiliza el comando ALTER TABLE.

ALTER TABLE permite modificar la estructura de una tabla existente. Por ejemplo, se pueden aadir o
eliminar columnas, crear y destruir ndices, cambiar el tipo de una columna existente o renombrar
columnas o la propia tabla. Tambin es posible modificar el comentario y el tipo de la tabla.Se puede:
i. Agregar campos.
alter table <<Nombre_Tabla>> add column <<Nombre_campo><<tipo_dato y
restricciones>>;
Ejemplo:
Alter table cliente add column telfono varchar(30);

ii. Eliminar campos
ALTER TABLE cliente DROP COLUMN c;

iii. Cambiar el nombre de un campo
ALTER TABLE tabla CHANGE COLUMN campo_viejo campo_nuevo;

iv. Cambiar las caractersticas de un campo con definiciones diferentes.
ALTER TABLE mascotas CHANGE prop propietario VARCHAR(20);

v. Cambiar las caractersticas de la columna sin renombrarla
ALTER TABLE mascotas MODIFY nombre BIGINT NOT NULL;

Definicin de restricciones bsicas.
En el CREATE TABLE se puede especificar para cada atributo las restricciones a las que estar sujeto
Llave primaria: PRIMARY KEY
Valor nico: UNIQUE
valor nulo: NULL / NOT NULL
Llave fornea: REFERENCES


Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 15

Forma general de las restricciones:






Ejemplo de la creacin de una tabla con restricciones:





a) Restriccin de llave primaria

Una tabla puede tener un campo o varios como llave primaria.
Llave: conjunto de atributos que identifican unvocamente a cada tupla de una tabla.











CREATE TABLE nombre (
atributo_1 tipo_1 restricciones_1,
atributo_2 tipo_2 restricciones_2,
.
atributo_n tipo_n restricciones_3,
<otras restricciones>
);
CREATE TABLE ARTICULO (
Numero CHAR (15) PRIMARY KEY,
Descripcin VARCHAR (50) NOT NULL,
Precio NUMERIC (4,2) NOT NULL
);


1500
2500
.

Juan Prez
Edgard Bentez

JUPE700312-GN4
BEGE680312-AA5
CLIENTE RFC Nombre Crdito RFC
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 16

Si una relacin tiene muchas llaves (candidatas), una se elige como llave primaria
Ningn par de tuplas debe tener la misma combinacin de valores en los atributos que forman la llave
primaria.

La forma de crear una llave primaria es agregndole al campo la palabra PRIMARY KEY
Si una tabla tiene ms de un campo como llave primaria se establece al final de la creacin de la tabla.
Ejemplo:





b) Restriccin de Valor nico.

Bajo esta restriccin, un atributo solo puede tomar valores diferentes. Ejemplo: el email de un cliente.

Una llave primaria por definicin debe satisfacer esta restriccin
Un atributo es nico agregndole la palabra UNIQUE en su definicin.





c) Restriccin de valor Nulo.

Bajo esta restriccin, un atributo no debe tomar nulo como valor (Las relaciones deben estar diseadas
de tal forma que sus tuplas tengan el menor nmero de nulos posible).


Una llave primaria por definicin debe satisfacer esta restriccin



CREATE TABLE ARTICULO (
Numero CHAR (15) NOT NULL,
Descripcin VARCHAR (50) NOT NULL,
Precio NUMERIC (4,2) NOT NULL,
Primary key(numero, descripcin)
);
CREATE TABLE CLIENTE (
Numero CHAR (15) PRIMARY KEY,
Email VARCHAR (50) unique NOT NULL,
);

Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 17

Razones para el valor nulo:
atributo no aplicable o invalido
valor del atributo desconocido (puede existir)
valor de existencia conocida, pero indisponible

Los atributos que son nulos frecuentemente pueden ser colocados en relaciones separadas







d) Restriccin de llave Fornea

Una clave fornea es un campo comn y corriente que tiene la particularidad de corresponderse con la
clave primaria de otra tabla.

Estas claves estn muy estrechamente ligadas al concepto de integridad referencial, debido a que si una
clave fornea contiene un valor, ese valor se refiere a un registro existente en la tabla relacionada,
MySQL soporta claves forneas nicamente en las tablas tipo innodb.

Si intentamos crear estas claves en otro tipo de tablas no recibiremos errores ni advertencias, pero
tampoco obtendremos ningn efecto: las tablas se comportaran como si no hubiramos creado las
claves forneas.

Cuando se crean las tablas con claves forneas, MySQL no crea de manera automtica ndices en las
claves forneas ni en las claves referenciales. Si queremos crear estos ndices debemos hacerlo
explcitamente.


CREATE TABLE sales (
(
year INT NOT NULL,
country VARCHAR (20) NOT NULL,
product VARCHAR (32) NOT NULL,
profit INT
);

Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 18

INTEGRIDAD REFERENCIAL
La integridd referencial implica que cuando un registro haga referencia a otro, ese otro debe
necesariamente existir. Supongamos el siguiente caso:
Tabla Autor
Cod_autor Nombre_autor Cod_nacionalidad
1 Ernesto Sabato 1
2 Jorge Luis Borges 1
3 Mario Vargas Llosa 5
4 Jorge Amado 2
5 Octavio Paz 3
6 Carlos Fuentes 3

Tabla Nacionalidades
Cod_nacionalidad Desc_nacionalidad
1 Argentina
2 Brasil
3 Mejico
4 Espaa
5 Peru
6 Chile





Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 19


Volviendo al ejemplo de autores y nacionalidades, una forma de resolver el problema planteado sera la
siguiente:









Tambin es posible modificar una tabla existente agregndole una clave fornea, de la siguiente
manera:








No es recomendable aplicar sentencias ALTER TABLE O CREATE INDEX sobre tablas que estn siendo
referenciadas, por posibles problemas internos de MySQL. Lo que conviene hacer aqu es eliminar la
tabla en cuestin y volverla a crear actualizada.


CREATE TABLE nacionalidad (
Cod_nacionalidad INT,
Desc_nacionalidad VARCHAR(50),
PRIMARY KEY (cod_nacionalidad)
) TYPE = INNODB;

CREATE TABLE autor (
Cod_autor INT,
Nombre_autor VARCHAR (50),
Cod_nacionalidad INT NOT NULL DEFAULT 0,
PRIMARY KEY (cod_autor),
FOREIGN KEY (cod_nacionalidad) REFERENCES nacionalidad (Cod_nacionalidad)
) TYPE = INNODB;
CREATE TABLE autor (
Cod_autor INT,
Nombre_autor VARCHAR(50),
Cod_nacionalidad INT NOT NULL,
PRIMARY KEY (cod_autor)
) TYPE = INNODB;

ALTER TABLE autor ADD FOREIGN KEY (cod_nacionalidad) REFERENCES nacionalidad
(cod_nacionalidad);
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 20

Que ocurre cuando se borra algn registro que tiene a su vez registros asociados (en el caso de nuestro
ejemplo la pregunta sera que pasa si eliminamos algn registro de la tabla nacionalidad y esa
nacionalidad aparece en la tabla autor)? Lo que pasa podemos manejarlo nosotros a travs de las
siguientes opciones:
ON DELETE RESTRICT: es la accin por defecto, y directamente no permite la eliminacin.
Muestra un mensaje de error.
ON DELETE NO ACTION: Hace exactamente lo mismo que la opcin anterior
ON DELETE SET DEFAULT: Todava no est implementada pero lo que debera hacerse es
reemplazar las claves eliminadas por el valor que se dio por defecto (DEFAULT) al momento de
crear la tabla. En el ejemplo de autores y nacionalidades reemplazara el valor eliminado por 0.
ON DELETE CASCADE: elimina tambin las filas de la tabla hija. En nuestro ejemplo si
eliminamos el registro Mjico de nacionalidad, tambin borraramos a todos los escritores
mejicanos.
ON DELETE SET NULL: Pone a NULL los campos de la tabla hija que perdieron a su padre. En
nuestro ejemplo, si eliminamos el registro Mjico de nacionalidad, pondramos el campo
cod_nacionalidad igual a NULL para todos los escritores mejicanos.

Para implementar alguna de estas opciones hacemos lo siguiente:



Al trabajar con referencias entre tablas, debe crearse primero la tabla referenciada y luego la que hace
referencia a ella (esto vale tambin para cuando cargamos la base desde un archivo .SQL). en nuestro
ejemplo, como la tabla autor hace referencia a la tabla nacionalidad, debe crearse la tabla nacionalidad
antes que la tabla autor.
Si no queremos tener complicaciones con el orden de creacin, podemos crear todas las tablas sin
especificar cules son claves forneas (como en el CREATE TABLE del ltimo ejemplo) y al final ejecutar
los ALTER TABLE necesarios para especificar las claves forneas.
Cuando deseemos borrar una tabla, debemos asegurarnos de que no est referenciada por ninguna otra
(esto vale tambin para cuando cargamos la base de datos desde un archivo .SQL).
En nuestro ejemplo, como la tabla autor hace referencia a la tabla nacionalidad, debe eliminar la tabla
autor antes que la tabla nacionalidad.

ALTER TABLE tablaPadre ADD FOREIGN KEY (nombre_campo)
REFERENCES tablaHija (nombre_campo) ON DELETE CASCADE;
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 21

Cuando se crea una clave fornea, MySQL le asigna internamente un identificador. Para eliminar una
restriccin (solo la restriccin, no el campo) de clave fornea necesitamos conocer esa clave. Para
conocer esa clave podemos ejecutar la instruccin:


Que nos devolver algo como lo que sigue:







La clave que necesitamos, entre comillas e inmediatamente despus de la palabra CONSTRAINT. Una
vez que tomamos conocimiento de esto, debemos ejecutar la instruccin para eliminar la restriccin:



2.3 Creacin de ndices

Un ndice es una estructura de datos en donde se almacena informacin extra acerca de una columna
(una columna indexada). Cuando MySQL encuentra un ndice en una columna, lo usara en vez de
recorrer todas las posiciones de la columna.
MySQL utiliza ndices para encontrar filas con valores especficos en alguna de sus columnas de manera
ms rpida.
Existen en MySQL cuatro tipos de ndices distintos: de clave primaria, nicos, fulltext e ndices
normales.

SHOW CREATE TABLE nombre_tabla;
CREATE TABLE autor (
cod_autor int (11) NOT NULL default 0 ,
nombre_autor varchar(50) default NULL,
cod_nacionalidad int (11) NOT NULL default 0 ,
PRIMARY KEY (cod_autor),
CONSTRAINT autor_ibfk_1 FOREIGN KEY (cod_nacionalidad)
REFERENCES nacionalidad (cod_nacionalidad)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
ALTER TABLE autor DROP FOREIGN KEY autor_ibfk_1;
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 22

a) NDICES DE CLAVE PRIMARIA
Estos ndices se crean, justamente, al momento de definir como clave primaria (Primary Key).

b) NDICES NORMALES
A menos que haya sido definido como unique (nico), un ndice normal admite valores duplicados, a
diferencia de lo que sucede con los ndices de clave primaria. Existen varias maneras en MySQL de crear
ndices normales, veamos algunas:
Index nombre_ndice (columna1[,columna2]) Se agrega esta instruccin en la creacin de la tabla
(create table)

Por ejemplo:





create ndex nombre_indice on tabla (columna1 [, columna2,])


La ltima es a travs de un ALTER TABLE:


c) NDICES FULLTEXT
MySQL puede indexar cualquier tipo de dato: estos tipos de ndices pueden contener campos de tipo
CHAR, VARCHAR Y TEXT. Los ndices de este tipo estn diseados para facilitar y optimizar la bsqueda
de palabras clave en tablas que tienen grandes cantidades de informacin en campos de texto. Se crean
las siguientes maneras:
A travs de la sintaxis CREATE FULLTEXT INDEX, similar a CREATE INDEX.
CREATE FULLTEXT INDEX nombre_indice ON tabla (columna1[, columna2,]);
CREATE TABLE tabla (
Campo1 INT NOT NULL,
Campo2 CHAR (30) NOT NULL,
PRIMARY KEY (Campo1),
INDEX ndice1 (Campo2)
);
CREATE INDEX indice1 ON tabla (Campo2);
ALTER TABLE tabla ADD INDEX indice1 (Campo2);
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 23

Por ejemplo:


O al momento de crear la tabla, como por ejemplo:





Otra opcin sera hacer un ALTER TABLE sobre una tabla ya existente:


En las columnas CHAR y VARCHAR podemos definir que no se use la extensin completa del campo sino
slo una parte.
Para crear un ndice como parte de un campo, solo se tiene que especificar el tamao entre parntesis
despus del nombre de la columna:






En este ltimo caso se indexaran solo los primeros 10 caracteres del Campo2.
d) INDICES UNICOS
Aqu los valores duplicados no son permitidos. Hay varias formas de crear esta clase de ndices muy
similares a las expuestas anteriormente y son las siguientes:

CREATE FULLTEXT INDEX indice1 ON tabla (Campo2);
CREATE TABLE tabla (
Campo1 INT NOT NULL,
Campo2 CHAR (30) NOT NULL,
PRIMARY KEY (Campo1),
FULLTEXT indice1 (Campo2)
);
ALTER TABLE tabla ADD FULLTEXT indice1 (Campo1);
CREATE TABLE tabla (
Campo1 INT NOT NULL,
Campo2 CHAR (30) NOT NULL,
PRIMARY KEY (Campo1),
FULLTEXT indice1 (Campo2 (10))
);
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 24










Como en las anteriores exposiciones, un ndice puede abarcar ms de una columna ndices compuestos,
hay que separarlas por comas (,).

Eliminacin de un ndice.
Existen dos maneras de eliminar un ndice. Usar una u otra depender del tipo de ndice que queramos
eliminar. Veamos el primer caso que nos servir para eliminar ndices de tipo clave primaria, y cuya
sintaxis es la siguiente:

ALTER TABLE tabla DROP PRIMARY KEY;
Notemos que no indicamos el nombre de ningn campo: esto es porque solo puede haber una clave
primaria por tabla y con dar el nombre de esta es suficiente.
Para eliminar el resto de los ndices, la sintaxis para usar es la siguiente:

ALTER TABLE tabla DROP INDEX nombre_ndice;
Tengamos en cuenta que en las ltimas instrucciones nunca eliminamos el campo, sino la restriccin que
tiene efecto sobre l: el campo seguir existiendo pero ya no tendr las caractersticas de un ndice.


CREATE UNIQUE INDEX indice1 ON tabla (Campo2);
CREATE TABLE tabla (
Campo1 INT NOT NULL,
Campo2 CHAR (30) NOT NULL,
PRIMARY KEY (Campo1),
UNIQUE indice1 (Campo2)
);
ALTER TABLE tabla ADD UNIQUE indice1 (Campo1);
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 25

Para ver los ndices de una tabla podemos utilizar cualquiera de las siguientes instrucciones:
SHOW KEYS FROM tabla;

O bien.
DESCRIBE tabla;

Hay otro comando que utilizado de determinada manera se convierte en un sinnimo de DESCRIBE. Este
comando se llama EXPLAIN y su sintaxis es la siguiente:
EXPLAIN tabla;

Las tres ltimas instrucciones devolvern la estructura de la tabla y algunas caractersticas ms entre
ellas, algunas referidas a los ndices implementados.

Cuando creamos un ndice sobre una columna, MySQL crea internamente una estructura de datos
aparte, ms accesible y compacta que la tabla original. Cuando MySQL encuentre que hay un ndice en
una columna, usara esta estructura en vez de hacer un escaneo completo de la tabla. El uso de ndices
no es indispensable para que nuestras instrucciones SQL funcionen ni para que nuestra base de datos
trabaje normalmente, los ndices influyen ms que nada en el desempeo, en la velocidad de respuesta
de la base de datos.

En MySQL el nmero mximo de ndices por tabla vara segn el tipo utilizado, pero todos ellos admiten
un mnimo de 16. En caso de no utilizar ndices, MySQL recorrer secuencialmente la tabla en cuestin
desde el primer registro hasta el ltimo, lo que produce eventualmente inconvenientes con respecto a
la velocidad de resolucin de instrucciones SQL, y una sobrecarga de los recursos del sistema al tener
este un mayor trabajo tanto de entrada/salida como de utilizacin de CPU y memoria. Aun en tablas no
tan grandes, el uso de ndices mejora la velocidad de accin de una base de datos.
Y despus de esto nos surge una pregunta, por qu no indexar todas las columnas de todas las tablas?
La respuesta es que cada vez que nosotros implementamos un INSERT, UPDATE, REPLACE, o DELETE
sobre una tabla, MySQL tiene que actualizar el ndice correspondiente para reflejar los cambios en los
datos, lo que evidentemente redunda en ms trabajo para el servidor.

Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 26

No hay un indicio especial y concreto que nos permita saber cundo crea un ndice o cundo no de
todas maneras, siempre podemos trabajar sobre la base de prueba y error, pero si hay algunos aspectos
que debemos tener en cuenta: que tipo de consultamos ejecutamos y con que frecuencia lo hacemos.

Lo del tipo de consulta se relaciona con la funcionalidad de que MySQL puede usar un ndice para una
columna en particular, nicamente, si dicha columna aparece en la columna WHERE en una consulta.

Y lo de la frecuencia es porque hay que determinar si se justifica crear un ndice ante una determinada
reiteracin de uso: puede ocurrir que la columna indexada aparezca en las consultas pero en la cantidad
de veces necesarias para superar el gasto de mantenimiento que precisa el ndice.















Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 27

Unidad 3. Consultas y Lenguaje de Manipulacin de Datos (DML)
3.1 Instrucciones INSERT, UPDATE y DELETE
Operaciones de manipulacin de datos de la base de datos:
a. Insercin de datos
b. Actualizacin de datos
c. Borrado de datos

Insercin de datos
INSERT: agrega una tupla a una tabla. La forma ms simple de esta sentencia se debe indicar la
tabla a la que se desea aadir filas y los valores de cada columna.
Las columnas de tipo cadena o fechas deben estar entre comillas sencillas o dobles.
Sintaxis de la instruccin INSERT:




Ejemplo



Visualizar registros insertados:
Select * from tabla;
Ejemplo: select * from articulo.
Insert multi-row, es equivalente a un conjunto de inserts individuales, pero es ms eficiente porque el servidor
puede procesar todos los renglones a la vez, en lugar de hacerlo por separado. La forma general es separar los
conjuntos de valores de cada registro separado por comas.




INSERT INTO <table>
VALUES (<valor_1>, <valor_2>,, <valor_n>)
INSERT INTO articulo
VALUES (DVDP125, Lector de DVD, 90.00);
INSERT INTO articulo VALUES
(TEL01,Televisor de Plasma, 120.00),
(DVD180, Lector de DVD Portatil, 100.00),
(TEL02, Televisor de 21 pulgadas, 150.00);
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 28

Existe otra forma de insertar registros y consiste en indicar el valor para cada columna. Ejemplo:



Cuando no se especifica el nombre de las columnas indica que se tienen que establecer los valores a cada una de
ellas, en el orden en que se encuentren en la tabla. Si se desea no utilizar todas las columnas o cambiar el orden, se
tiene que indicar el nombre de las mismas, despus del nombre de la tabla. Ejemplo:






Actualizacin de datos
UPDATE: permite modificar el valor de los atributos de tuplas seleccionadas
Forma general:






Ejemplo:





INSERT INTO articulo VALUES Set clave =TEL03,
nombre = Televisor de Plasma, precio = 120.00;
Create table Agenda (
Id tinyint auto_increment primary key,
Nombre varchar(40) not null,
Email varchar(50) null
);
Insert into Agenda (nombre) values (Juan
Perez);

Insert into Agenda (email, nombre) values
(LPerez@hotmail.com, Luis Perez);
UPDATE tabla SET
atributo_1=valor_1,
.,
atributo_n = valor_n
[WHERE condicin]
UPDATE articulo SET
precio = 15.00
WHERE numero=DVDP125
UPDATE articulo SET
precio = precio * 1.10, nombre =DVD Portatil
WHERE numero=DVDP125
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 29

Cuando no se indica la clausula where el cambio indicado se realizara todos los registros existentes en la tabla. La
clausula where permite establecer una condicin y solo las filas que cumplan esa condicin sern actualizadas.
Otra forma de limitar el nmero de filas afectadas es utilizar la clausula LIMIT, esta permite especificar el nmero
de filas a modificar.


La clausula LIMIT se puede combinar con la clausula WHERE de tal forma que solo las n filas que cumplan la
determinada condicin se van a actualizar. Hay que considerar que el orden de las filas ser en forma arbitraria y
en ocasiones por la llave primaria, pero no siempre es as.
Tambin es posible combinar la sentencia UPDATE con la clausula ORDER BY. Ejemplo si se desea modificar el
precio del producto cuyo precio sea el ms bajo.



Eliminacin de datos
DELETE: permite borrar tuplas de una tabla
Forma general:



Ejemplo




Tambin se puede utilizar las clausulas LIMIT y ORDER BY del mismo modo que en la sentencia UPDATE. Ejemplo
eliminar 2 los productos con mayor precio.




UPDATE articulo SET precio = 15.00 LIMIT 2;

DELETE FROM tabla
[WHERE <condicion>]
DELETE FROM articulo
WHERE numero=DVDP125;
DELETE FROM articulo ORDER BY precio desc LIMIT 2;
UPDATE articulo SET precio = precio * 1.10 ORDER BY precio LIMIT 1;

Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 30

Para eliminar todas las filas de una tabla se puede utilizar la sentencia DELETE sin condiciones. Sin embargo existe
la instruccin TRUNCATE que realiza la misma tarea de una forma mucho ms rpida. La diferencia es que delete
hace un borrado secuencial de la tabla, fila por fila. Truncate borra la tabla y la vuelve a crear vaca, lo que es
mucho ms eficiente.



3.2 Consultas bsicas SELECT, WHERE y funciones a nivel de registro

Las consultas de datos pueden ser:
Consultas simples de recuperacin, filtrado y ordenamiento de datos
Consultas involucrando ms de una tabla
Agrupamiento de datos y funciones de agregacin

Consultas simples
Consulta bsica en SQL: recuperacin de las tuplas de una o ms tablas que satisfacen una condicin dada
Bloque SELECT-FROM-WHERE




Es posible utilizar * para sealar que en el resultado se requieren todos los atributos del esquema de la
tabla, Se utiliza como comodn. Ejemplos de consultas simples
Obtener todos los datos de los clientes


Recuperar el nombre y el crdito de todos los clientes. Operacin del algebra relacional Proyeccin, que
consiste en seleccionar determinados atributos.





DELETE FROM articulo;
TRUNCATE TABLE articulo;
SELECT <lista atributos>


FROM <lista tablas>
[WHERE <condicin>]
SELECT * FROM CLIENTE;



SELECT Nombre, crdito
FROM CLIENTE;
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 31

Obtener el nombre y el RFC de los clientes que tengan un crdito mayor a 2000.





Calificacin de atributos y alias
Es posible calificar un atributo con el nombre de la tabla de la cual proviene
Cliente.Nombre
Pedido.Folio

Un alias puede ser utilizado para referirse a una tabla




Ordenamiento de datos
Una tabla es un conjunto de tuplas, por lo que no hay un orden pre-establecido
En la realidad se requiere imponer un orden segn el valor de uno o ms atributos. SQL ofrece la clausula:
ORDER BY <lista de atributos> [ASC | DESC]

Orden Orden
Ascendente descendente
(Por omisin)
Ejemplo
Recuperar los nombres y las direcciones de los clientes ordenados por su nombre de forma ascendente




SELECT Nombre, RFC
FROM CLIENTE
WHERE Credito > 2000;

SELECT C.Nombre, C.credito
FROM CLIENTE C
SELECT Nombre, Credito
FROM CLIENTE
ORDER BY crdito ASC;
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 32


Es posible escribir expresiones con ayuda del comando SELECT y no necesariamente nombres de
columnas asociadas a una tabla.


La salida de la consulta ser:

Se puede utilizar la clausula SELECT para
Regresar valores de expresiones (2+2, 1/0) pero es ms utilizado para regresar informacin de
tablas.
El comando DESCRIBE permite mostrar la estructura de la tabla, SELECT el contenido de la tabla.



NULL indica ausencia de valor, cuando se realiza una operacin numrica con NULL el resultado
siempre ser NULL.
MySQL regresa un conjunto de resulset, el cual se refiere al conjunto de renglones resultado
de un enunciado SELECT.
Si una tabla est vaca, el resultado tambin ser vacio.
Es posible renombrar las columnas que son devueltas al agregarle un alias: AS alias.



Tambin se puede aplicar funciones sobre columnas de una tabla y usar esas columnas en
expresiones para generar nuevas columnas.




Se puede utilizar la clausula DISTINCT para indicar que solo se muestre una vez el dato cuando
varios registros tengan el mismo valor.



La operacin del algebra relacional Seleccin, consiste en seleccionar filas de una tablas que
cumplan determinadas condiciones. Esta operacin se realiza en el SELECT agregndole la
clausula WHERE.
SELECT SIN(3.1416/2), 2 + 2, REPEAT(X,5), DATE_ADD(2010-09-09,
INTERVAL 7 DAY), 1/0, NULL = NULL, NULL is NULL;
0.9999999999325 | 4 | XXXXX | 2010 -09 -16 | NULL | NULL | 1
DESCRIBE articulo;
SELECT 4*3 AS doce, ap_materno + + ap_paterno AS apellidos from
CLIENTES;
SELECT nombre, fecha, DATEDIFF (CURRENT_DATE() , fecha) /365 AS
edad FROM gente;
SELECT DISTINCT fecha FROM gente;
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 33

Se puede agregar al select la clausula LIMIT para limitar el nmero de filas devueltas. Si se
especifica un solo nmero indica cuantas filas devolver.



Si se especifica dos parmetros con la clausula LIMIT indica el numero de la primera fila a
recuperar y el segundo el numero de filas a recuperar. Por ejemplo se desea recuperar desde el
registro 2, 3 registros, es decir el registro 2, 3 y 4 se establece la sentencia:




Operadores validados en las consultas utilizadas en la clausula Where

Operadores Lgicos
Se puede aplicar en la clausula where la lgica booleana para crear expresiones complejas. Se
dispone de los operadores AND, OR, XOR y NOT.

En el algebra booleana solo existen dos valores posibles para los operandos y los resultados:
verdadero y falso. MySQL tiene dos constantes para esos valores: TRUE y FALSE,
respectivamente. Aade un tercer valor: desconocido. Esto es para que sea posible trabajar con
valores NULL.

El valor verdadero se implementa como 1 o TRUE, el falso como 0 o FALSE y el desconocido
como NULL.

a) Operador Y
En MySQL se puede usar tanto la forma AND como &&, es decir, ambas formas se refieren al
mismo operador: Y lgico.

Se trata de un operador binario, es decir requiere de dos operandos. El resultado es
verdadero solo si ambos operandos son verdaderos, y falso si cualquier operando es falso.
La tabla de verdad es:
A B A AND B
falso falso Falso (0)
falso verdadero Falso
verdadero falso Falso
verdadero verdadero Verdadero (1)
falso NULL Falso
NULL falso falso
verdadero NULL NULL
NULL verdadero NULL
SELECT fecha FROM gente LIMIT 3;
SELECT fecha FROM gente LIMIT 2, 3;
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 34

Se puede asociar el operador Y para crear expresiones como A AND B AND C. Las operaciones se realizan
tomando los operandos de dos en dos y estas expresiones se evalan de izquierda a derecha. Primero se
evala A AND B y el resultado R se usa como primer operando de la siguiente operacin R AND C.
b) Operador O
En Mysql este operador tiene dos formas equivalentes OR y ||

El operador O tambin es binario. La tabla de verdad se representa:
A B A OR B
falso falso Falso (0)
falso verdadero Verdadero (1)
verdadero falso Verdadero
verdadero verdadero Verdadero
falso NULL NULL
NULL falso NULL
verdadero NULL Verdadero
NULL verdadero verdadero

c) Operador O exclusivo
XOR tambin es un operador binario, que devuelve NULL si cualquiera de los operandos es
NULL. Si ninguno de los operandos es NULL devolver un valor verdadero. La tabla de
verdad se refleja as:
A B A XOR B
falso falso Falso (0)
falso verdadero Verdadero (1)
verdadero falso Verdadero
verdadero verdadero falso
falso NULL NULL
NULL falso NULL
verdadero NULL NULL
NULL verdadero NULL

d) Operador de negacin
El operador NOT tambin se puede escribir como !, es un operador unario, es decir solo
afecta a un operando. Si el operando es verdadero devuelve falso y viceversa. Si el operando
es NULL el valor devuelto tambin es NULL.
A NOT A
falso verdadero
verdadero falso
NULL NULL



Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 35

Operadores especiales
Mysql permite utilizar ciertos operadores en el uso de condiciones.
a) Between. Permite definir rangos.
Ejemplo:
Select nombre, rfc
from clientes
where salario between 5000 and 6000;

b) Exists. Permite verificar si existe o no un registro. Permite definir subconsultas.
Ejemplo:
Select nombre, rfc
From clientes
Where exists (select rfc from pedidos);
c) Like. Permite realizar condiciones en datos de tipo cadenas utilizando comodines. Los
comodines son:
% Cualquier carcter y cualquier numero de caracteres (cero o varios)
_ Cualquier carcter (uno) obligatorio.
Carcter de escape utilizando la clausula ESCAPE
Patron Encuentra No encuentra
%SONI_1 SONIC1, ULTRASONI21 SONICS1, SONI315
_IME TIME, LIME IME,CRIME
\%SONI_1ESCAPE \ %SONIC1,%SONI91 SONIC1,ULTRASONIC1
%ME\_ _ _LE ESCAPE\ CRIME_FILE, TIME_POLE CRIMESPILE, CRIME_ALE

d) ANY, SOME, ALL. Usadas para comparar con valores de una lista o subconsulta. Siempre
deben estar precedidas por (=, !=, <, >, <=, >=).
Select nombre, from empleados
Where departamento_id <= ANY (10,15,20,25);
Uso del Distinct
o Permite eliminar duplicados. Si una consulta regresa renglones duplicados, pueden ser
eliminados para producir un conjunto de resultados nico.
o Distinct se debe colocar despus del comando SELECT y antes del despliegue de las
columnas.

o Select distinct apellido_paterno from clientes;

o Si el tipo de dato es binario Torres, TORRES y torres sern consideradas diferentes.

Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 36

3.3 Consultas sobre mltiples tablas.
SQL permite combinar varias tablas declarativamente
Forma general del bloque S-F-W (Select From Where)
SELECT <lista atributos> Atributos requeridos en el resultado
FROM <lista tablas> Lista de tablas a combinar
WHERE <condicin> Conjuncin de condiciones simples
de igualdad entre llaves primarias y forneas.
Ejemplo de consulta combinando datos de dos tablas
Recuperar, par cada pedido, el cdigo y la cantidad de los artculos solicitados.





Relacin de tablas con joins.
La sintaxis ANSI ( American National Standards Institute)
La sintaxis ANSI de relacin de tablas permite utilizar los joins. Los joins simples pueden tener la
siguiente forma:
<<nombre de la tabla>> NATURAL [INNER] JOIN <<nombre de la tabla>>
<<nombre de la tabla>> [INNER] JOIN <<nombre de la tabla>> USING (<<columnas>>)
<<nombre de la tabla>> [INNER] JOIN <<nombre de la tabla>> ON <<condicin>>

a) NATURAL JOIN
Utilizado cuando el join se basa en TODAS las columnas con el mismo NOMBRE en
ambas tablas.

Cuando se especifica un NATURAL JOIN, las columnas con el mismo nombre en las tablas
DEBEN tener el MISMO TIPO de DATOS.
Ejemplo:
SELECT p.folio, a.numero, pa.cantidad
FROM pedido p, pedido_articulo pa, articulo a
WHERE p.folio = pa.folio and
a.numero = pa.numero;
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 37

Considerando las siguientes tablas:


Realizando el NATURAL JOIN se obtendr lo siguiente:


JOIN..USING
Se utiliza si existen muchas columnas que tienen el MISMO nombre en las tablas a las
que se est realizando el JOIN y estas no tienen el MISMO TIPO de DATOS, o si se
QUIERE ESPECIFICAR las columnas que participan el EQUIJOIN

Clausula USING.- Especfica los nombres de las columnas que deben ser utilizadas en el
JOIN.



Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 38

Se puede agregar la clausula WHERE para limitar el nmero de filas y la clausula ORDER
BY para ordenar las filas regresadas en cualquier tipo de JOIN.


JOIN.. ON
Utilizado cuando no se tiene nombres de columnas en comn entre tablas o cuando se
quiere especificar condiciones de join arbitrarias.

Esta sintaxis define la condicin del join utilizando los nombres de las columnas. Si el
nombre de la columna es comn a mltiples tablas de la consulta, esos nombres de las
columnas DEBEN SER CALIFICADAS.






JOINS CARTESIANOS

Ocurre cuando los datos son seleccionadas de 2 o ms tablas y NO existe una relacin
en comn especificada en el WHERE.

Si no se especifica la condicin de join de las tablas listadas en el FROM se une cada fila
de la primera tabla con cada fila de la segunda tabla.

Si un join cartesiano es realizado entre una tabla que tiene m filas y otra que tiene n
filas, el resultado de la consulta ser de m * n filas.
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 39



Un join cartesiano en la sintaxis ANSI es conocido como CROSS JOIN.



a) INNER JOINS.- JOINS que regresa sola las filas que tienen correspondencia (math) en
ambas tablas.

b) CROSS JOINS.- JOINS que regresan la combinacin de ambas tablas.

c) OUTER JOINS.- JOINS que regresan resultados basados en la condicin de join
(math), as como las filas que no tienen correspondencia (unmatch) de una tabla o
ambas tablas.
LEFT OUTER JOINS. Es un join entre dos tablas que devuelve las filas basadas
en la condicin de correspondencia (matching) y las filas que no tienen
correspondencia (unmatch) de la tabla izquierda de la clausula JOIN.
La palabra OUTER entre LEFT y JOIN es opcional


Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 40






RIGHT OUTER JOINS. Es un join entre dos tablas que devuelve las filas
basadas en la condicin (matching) y las filas que no tienen correspondencia
(unmatch) de la tabla de la derecha de la clausula JOIN.
La palabra OUTER entre RIGHT y JOIN es opcional

Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 41



SELF-JOINS
Realiza un join sobre s mismo. El nombre de la tabla aparece dos veces en el FROM,
con diferentes alias. Los dos alias son tratados como dos tablas diferentes y son
unidas como cualquier join con otra tabla, usando una o ms columnas relacionadas.


3.4 Agregacin GROUP BY, HAVING
En ocasiones se requiere
Un resumen de los datos, no el detalle de ellos
Resmenes por grupos de datos, no del total de ellos
SQL ofrece para ello
Funciones de agregacin
Agrupamientos




Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 42

Agrupamientos
Formacin de subgrupos de tuplas para aplicar una funcin de agregacin
Cada subgrupo de tuplas contiene las tuplas con un mismo valor para el (los) atributo(s) de agrupamiento
Ejemplo: Mostrar el total de estudiantes por carrera del Tecnolgico





Seleccin de grupos
La clausula HAVING permite especificar una condicin de seleccin sobre grupos.
Ejemplos: Calcular, para los pedidos con ms de cinco productos, el total de productos y su precio
total







NOTA:
El uso de DISTINCT es equivalente a GROUP BY, se considera un conjunto de valores con el mismo valor.
La diferencia radica en que no ocurre un ordenamiento s se utiliza DISTINCT, en cambio si cuando se
utiliza group by.
Select distinct apellido_paterno from clientes;
Select apellido_paterno FROM clientes GUOUP BY apellido_paterno;
Se puede utilizar COUNT para determinar el total de valores distintos, a excepcin de aquellos que
tengan valores nulos, puesto que son ignorados.

SELECT c.nombre, COUNT(*)
FROM carreras c, alumnos a
WHERE c.id = a.id
GROUP BY c.id;

SELECT p.folio, COUNT(*), SUM(a.precio)
FROM pedido p, pedido_articulo pa, articulo a
WHERE p.folio = pa.folio and
pa.numero = pa.numero
GROUP BY p.folio
HAVING COUNT ( * ) > 5
SELECT id, COUNT(*)
FROM carreras
GROUP BY c.id;


Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 43

3.5 Funciones de conjunto de registros COUNT, SUM, AVG, MAX, MIN
Funciones de agregacin
Consolidan los valores de un atributo de una tabla en un valor nico.

Se utilizan cuando el objetivo es obtener un resumen en lugar de datos.

Funciones tradicionales
SUM(): se aplica sobre un atributo numrico y produce como resultado la suma de los valores del
atributo
AVG(): se aplica sobre un atributo numrico y produce como resultado el promedio de los valores
del atributo
MIN() y MAX(): aplicados a un atributo numrico, regresan como resultado el valor mnimo y el
valor mximo que toma el atributo
COUNT(): aplicado a cualquier atributo de una tabla, regresa como resultado el nmero de tuplas
de la tabla, incluyendo duplicados.
STD(): retorna la desviacin estndar del conjunto de registros.
VARIANCE(): retorna la varianza del conjunto de registros indicados.
GROUP_CONCAT(): concatena un conjunto de cadenas para producir una sola cadena.


Ejemplos de uso de las funciones de agregacin
Encontrar el precio mximo, el precio mnimo y el precio promedio de todos los artculos por fabricante






Encontrar el precio mximo, el precio mnimo y el precio promedio de los artculos comprados a la fbrica
de nombre Soup





SELECT MAX (Precio), MIN (Precio), AVG(Precio)
FROM articulo a, fabrica f, articulo_fabrica af
WHERE a.numero = af.numero AND
f.numfabrica = af.numfabrica;
SELECT MAX (Precio), MIN (Precio), AVG(Precio)
FROM articulo a, fabrica f, articulo_fabrica af
WHERE a.numero = af.numero AND
f.numfabrica = af.numfabrica AND
f.Nombre = Soup ;
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 44


Reglas en las funciones:
MIN y MAX son aplicables a cadenas, nmeros y fechas.
o MIN: 1, Amelia, 01/01/2009
o MAX: 211, Vanessa, 12/12/2009
SUM() y AVG() ignoran valores nulos.
COUNT(*) Cuenta el total de renglones.
COUNT(col) cuenta el total de valores en esa columna (ignora los NULL)
COUNT(DISTINCT col) Cuenta el total de valores distintos en esa columna (ignora los NULL).
GROUP_CONCAT. Concatena valores de una columna en una sola cadena
o Select GROUP_CONCAT(nombre) from pases; //Salida Mxico, Canad, Suecia, Italia.
o Por default el separador es la coma (,).
Select GROUP_CONCAT(nombre -) from pases; // Mxico-Canad-Suecia-Italia
o Tambin permite ordenar los valores obtenidos:
Select group_concat(nombre order by nombre desc) from pases;
Select group_concat (distinct nombre) from paises;















Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 45

Unidad 4. Control de Transacciones
4.1 Propiedades de la Transaccin
El concepto de Bases de Datos Transaccionales es un sinnimo de fiabilidad superior a las Bases de
Datos comunes.
Las Transacciones son ampliamente utilizadas en Sistemas Bancarios por mencionar solo un ejemplo.
Una Base de Datos Transaccional alberga la idea de o todo mejor nada. A grandes rasgos, la idea
es que al momento de que estamos ejecutando por ejemplo una sentencia UPDATE, esta sentencia no
tenga ningn efecto hasta que nosotros lo indiquemos con COMMIT. Por ejemplo;
UPDATE bd SET campo=valor WHERE id=1;
Normalmente, al ejecutar la sentencia anterior inmediatamente los cambios se reflejaran. Pues bien,
el concepto de transaccin va enfocado a que al ejecutar dicha sentencia no pase nada!! Y los cambios
sean realizados hasta que escribamos la sentencia COMMIT.
UPDATE bd SET campo=valor WHERE id=1;


COMMIT; //Cundo ejecutemos COMMIT es cundo hasta ese momento todas las sentencias que le
preceden tendrn efecto! antes no.
Esto es especialmente til en muchos casos cuando debemos ejecutar varias sentencias SQL pero
sabemos que si alguna de ellas falla por X razn entonces todo estar mal, entonces, es cuando
podemos pensar en usar Transacciones, si en alguna sentencia ocurre un error, se ejecuta ROLLBACK y
con esto NADA se modifica, todo vuelve a su estado original, y en cambio, si todo sali bien, se ejecuta
COMMIT y los cambios se realizan.
Ahora bien, este ejercicio consiste en usar transacciones, modificar el campo Telefono de la persona
que tiene el id=57. Como se sabe, los cambios no surtirn efecto hasta que nosotros lo indiquemos con
la sentencia COMMIT. En una ventana, ejecutamos lo que muestra la siguiente figura:
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 46


Observamos que la persona con el id=57 tiene un valor de 1234567 en el campo Telefono. Ahora
bien, en la otra ventana que tenemos disponible es donde iniciaremos la transaccin:

Al teclear las sentencias mostradas en la anterior figura, nuevamente nos cambiamos a la otra ventana
y ejecutamos por segunda vez la consulta SELECT * FROM contacts;
Al ejecutar tal consulta NO observarn el cambio de telfono. Notarn que sigue teniendo el valor de
1234567. Esto pasa debido a que como ya comentamos, se trata de una transaccin y an no aceptamos
(commit) o rechazamos (rollback) los cambios. Ahora, si nuevamente volvemos a la ventana en donde
se inicio la transaccin y tecleamos el COMMIT, los cambios ya tendrn un efecto:
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 47


Transacciones en MySQL
El servidor de bases de datos MySQL soporta distintos tipos de tablas, tales como ISAM, MyISAM,
InnoDB y BDB (Berkeley Database). De stos, InnoDB es el tipo de tabla ms importante (despus
del tipo predeterminado, MyISAM).
Es importante aclarar que para trabajar con Transacciones, las tablas deben de ser de tipo InnoDB y no
MyISAM, si son de este ltimo tipo NO funcionar as que antes de continuar deben asegurarse que
usarn una tabla InnoDB.

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 son que permite trabajar con
transacciones, y definir reglas de integridad referencial.

Las transacciones aportan una fiabilidad superior a las bases de datos. Si disponemos de una serie de
consultas SQL que deben ejecutarse en conjunto, con el uso de transacciones podemos tener la certeza
de que nunca nos quedaremos a medio camino de su ejecucin. De hecho, podramos decir que las
transacciones aportan una caracterstica de "deshacer" a las aplicaciones de bases de datos.
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 48

Para este fin, las tablas que soportan transacciones, como es 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. Por otra parte, las transacciones pueden hacer que las consultas tarden ms tiempo en
ejecutarse.

Para asegurarnos que tenemos soporte para el tipo de tablas InnoDB podemos ejecutar la siguiente
sentencia:

mysql>SHOW VARIABLES LIKE '%innodb%';
+---------------------------------+------------+
| Variable_name | Value |
+---------------------------------+------------+
| have_innodb | YES |
| innodb_additional_mem_pool_size | 1048576 |
..
+---------------------------------+------------+
20 rows in set (0.00 sec)

La variable ms importante es have_innodb que tiene el valor YES.
Modificar el tipo de motor de la base de datos.
ALTER TABLE `addressbook`.`contacts` ENGINE = InnoDB;

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.



Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 49

Los pasos para usar transacciones en MySQL son:
a) Iniciar una transaccin con el uso de la sentencia BEGIN.
b) Actualizar, insertar o eliminar registros en la base de datos.
c) 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
sentencias sern permanentes.
d) 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.

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.





















mysql> CREATE TABLE innotest (campo INT NOT NULL PRIMARY KEY) TYPE = InnoDB;
Query OK, 0 rows affected (0.10 sec)

mysql> INSERT INTO innotest VALUES(1);
Query OK, 1 row affected (0.08 sec)

mysql> INSERT INTO innotest VALUES(2);
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO innotest VALUES(3);
Query OK, 1 row affected (0.04 sec)
mysql> SELECT * FROM innotest;
+---------+
| campo |
+---------+
| 1 |
| 2 |
| 3 |
+---------+
3 rows in set (0.00 sec)
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 50

Ahora veamos como usar transacciones.












Si en este momento ejecutamos un ROLLBACK, la transaccin no ser completada, y los cambios
realizados sobre la tabla no tendrn efecto.














mysql> BEGIN;
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO innotest VALUES(4);
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM innotest;
+---------+
| campo |
+---------+
| 1 |
| 2 |
| 3 |
| 4 |
+---------+
4 rows in set (0.00 sec)

mysql> ROLLBACK;
Query OK, 0 rows affected (0.06 sec)

mysql> SELECT * FROM innotest;
+---------+
| campo |
+---------+
| 1 |
| 2 |
| 3 |
+---------+
3 rows in set (0.00 sec)
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 51


Ahora vamos a ver qu sucede si perdemos la conexin al servidor antes de que la transaccin sea
completada.













Cuando obtengamos de nuevo la conexin, podemos verificar que el registro no se insert, ya que la
transaccin no fue completada.













mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO innotest VALUES(4);
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM innotest;
+---------+
| campo |
+---------+
| 1 |
| 2 |
| 3 |
| 4 |
+---------+
4 rows in set (0.00 sec)

mysql> EXIT;
Bye
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 449 to server version: 4.0.13

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


mysql> SELECT * FROM innotest;
+---------+
| campo |
+---------+
| 1 |
| 2 |
| 3 |
+---------+
3 rows in set (0.00 sec)
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 52

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.









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.












4.2 Grados de Consistencia

Por default, las tablas InnoDB ejecutan un lectura consistente (consistent read). Esto significa que
cuando una sentencia SELECT es ejecutada, MySQL regresa los valores presentes en la base de datos
hasta la transaccin ms reciente que ha sido completada. Si alguna transaccin est en progreso, los
cambios hechos por alguna sentencia INSERT o UPDATE no sern reflejados. Sin embargo, existe una
excepcin: las transacciones abiertas si pueden ver sus propios cambios. Para demostrar esto,
necesitamos establecer dos conexiones al servidor MySQL.

Primero agregaremos un registro dentro de una transaccin con la primera conexin:



mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO innotest VALUES(4);
Query OK, 1 row affected (0.00 sec)

mysql> COMMIT;
Query OK, 0 rows affected (0.02 sec)

mysql> EXIT;
Bye
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 450 to server version: 4.0.13

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

mysql> SELECT * FROM innotest;
+---------+
| campo |
+---------+
| 1 |
| 2 |
| 3 |
| 4 |
+---------+
4 rows in set (0.00 sec)
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 53









Ahora, desde la segunda conexin consultamos los datos de nuestra tabla.












Como se puede observar, el registro que hemos insertado desde la 1ra. conexin no es regresado
puesto que forma parte de una transaccin que no ha sido completada. Ahora, desde la 1ra. conexin
ejecutamos la misma consulta SELECT.








Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 524 to server version: 4.0.13

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

mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO innotest VALUES(5);
Query OK, 1 row affected (0.00 sec)

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 525 to server version: 4.0.13

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

mysql> SELECT * FROM innotest;
+---------+
| campo |
+---------+
| 1 |
| 2 |
| 3 |
| 4 |
+---------+
4 rows in set (0.00 sec)

mysql> SELECT * FROM innotest;
+---------+
| campo |
+---------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+---------+
5 rows in set (0.00 sec)
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 54

Despus de completar la transaccin con una sentencia COMMIT en la 1ra. conexin podremos verificar
que desde la 2da. conexin los cambios ya son visibles.









Ejemplo 2

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.







Insertamos un registro.










mysql> SELECT * FROM innotest;
+-------+
|campo|
+-------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+-------+
5 rows in set (0.00 sec)
mysql> CREATE TABLE ventas(
-> id INT NOT NULL PRIMARY KEY
AUTO_INCREMENT,
-> producto VARCHAR(30) NOT NULL,
-> cantidad TINYINT NOT NULL) TYPE =
InnoDB;
Query OK, 0 rows affected (0.96 sec)
mysql> INSERT INTO ventas VALUES(0,'Gansito marinela',3);
Query OK, 1 row affected (0.16 sec)

mysql> SELECT * FROM ventas;
+----+---------------------+-----------------+
| id | producto | cantidad |
+----+--------------------------+------------+
| 1 | Gansito marinela | 3 |
+----+---------------------+-----------------+
1 row in set (0.01 sec)
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 55

Ahora vamos a iniciar una transaccin con la sentencia BEGIN.




Actualizamos el registro.




Verificamos que los cambios han sucedido.







Si queremos deshacer los cambios, entonces ejecutamos un ROLLBACK.



Verificamos que se deshicieron los cambios.







mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> UPDATE ventas SET cantidad=4 WHERE id=1;
Query OK, 1 row affected (0.07 sec)
Lneas correspondientes: 1 Cambiadas: 1 Avisos: 0
mysql> SELECT * FROM ventas;
+----+---------------------+-----------------+
| id | producto | cantidad |
+----+--------------------------+------------+
| 1 | Gansito marinela | 4 |
+----+---------------------+-----------------+
1 row in set (0.00 sec)

mysql> ROLLBACK;
Query OK, 0 rows affected (0.06 sec)

mysql> SELECT * FROM ventas;
+----+---------------------+-----------------+
| id | producto | cantidad |
+----+--------------------------+------------+
| 1 | Gansito marinela | 3 |
+----+---------------------+-----------------+
1 row in set (0.00 sec)

Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 56

Vamos a actualizar el registro usando otra transaccin.










Vamos a confirmar que deseamos los cambios.




En este momento los cambios son permanentes y definitivos.













mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)

mysql> UPDATE ventas SET cantidad=2 WHERE
id=1;
Query OK, 1 row affected (0.00 sec)
Lneas correspondientes: 1 Cambiadas: 1 Avisos: 0

mysql> SELECT * FROM ventas;
+----+---------------------+-----------------+
| id | producto | cantidad |
+----+--------------------------+------------+
| 1 | Gansito marinela | 2 |
+----+---------------------+-----------------+
1 row in set (0.00 sec)
mysql> COMMIT;
Query OK, 0 rows affected (0.05 sec)
mysql> SELECT * FROM ventas;
+----+---------------------+-------------+
| id | producto | cantidad |
+----+----------------------+------------+
| 1 | Gansito marinela | 2 |
+----+----------------------+------------+
1 row in set (0.00 sec)
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 57

4.3 Niveles de Aislamiento
Las transacciones especifican un nivel de aislamiento que define el grado en que se debe aislar una
transaccin de las modificaciones de recursos o datos realizadas por otras transacciones. Los niveles de
aislamiento se describen en funcin de los efectos secundarios de la simultaneidad que se permiten,
como las lecturas de datos sucios o las lecturas fantasmas.
Los niveles de aislamiento de las transacciones controlan lo siguiente:


Si se realizan bloqueos cuando se leen los datos y qu tipos de bloqueos se solicitan.


Duracin de los bloqueos de lectura.


Si una operacin de lectura que hace referencia a filas modificadas por otra transaccin:
1.
Se bloquea hasta que se libera el bloqueo exclusivo de la fila.
2.
Recupera la versin confirmada de la fila que exista en el momento en el que se inici la
instruccin o la transaccin.
3.
Lee la modificacin de los datos no confirmada.
La seleccin de un nivel de aislamiento de transaccin no afecta a los bloqueos adquiridos para proteger
las modificaciones de datos. Siempre se obtiene un bloqueo exclusivo en los datos modificados de una
transaccin, bloqueo que se mantiene hasta que se completa la transaccin, independientemente del
nivel de aislamiento seleccionado para la misma. En el caso de las operaciones de lectura, los niveles de
aislamiento de transaccin definen bsicamente el nivel de proteccin contra los efectos de las
modificaciones que realizan otras transacciones.
Un nivel de aislamiento menor significa que los usuarios tienen un mayor acceso a los datos
simultneamente, con lo que aumentan los efectos de la simultaneidad que pueden experimentar,
como las lecturas de datos sucios o la prdida de actualizaciones. Por el contrario, un nivel de
aislamiento mayor reduce los tipos de efectos de simultaneidad, pero requiere ms recursos del sistema
y aumenta las posibilidades de que una transaccin bloquee a otra. El nivel de aislamiento apropiado
depende del equilibrio entre los requisitos de integridad de los datos de la aplicacin y la sobrecarga de
cada nivel de aislamiento. El nivel de aislamiento superior, que es serializable, garantiza que una
transaccin recuperar exactamente los mismos datos cada vez que repita una operacin de lectura,
aunque para ello aplicar un nivel de bloqueo que puede afectar a los dems usuarios en los sistemas
multiusuario. El nivel de aislamiento menor, de lectura sin confirmar, puede recuperar datos que otras
transacciones han modificado pero no confirmado. En este nivel se pueden producir todos los efectos
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 58

secundarios de simultaneidad, pero no hay bloqueos ni versiones de lectura, por lo que la sobrecarga se
reduce.
En la tabla siguiente se muestran los efectos secundarios de la simultaneidad que permiten los distintos
niveles de aislamiento.
Nivel de aislamiento Lectura de datos sucios Lectura no repetible Fantasma
Lectura no confirmada S S S
Lectura confirmada No S S
Lectura repetible No No S
Instantnea No No No
Serializable No No No
Las transacciones se deben ejecutar en un nivel de aislamiento de lectura repetible, al menos, para
evitar las prdidas de actualizaciones que pueden producirse cuando dos transacciones recuperan la
misma fila, y a continuacin la actualizan segn los valores recuperados originalmente. Si las dos
transacciones actualizan las filas con una nica instruccin UPDATE y no basan la actualizacin en los
valores recuperados previamente, la prdida de las actualizaciones no puede producirse en el nivel de
aislamiento predeterminado de lectura confirmada.
La tabla de bloqueo en InnoDB se almacena en forma tan eficiente que no se necesitan bloqueos
escalables: generalmente varios usuarios estn habilitados a bloquear cada fila de la base de datos, o
cualquier subconjunto de filas, sin que InnoDB incurra en falta de memoria.
En los trminos de los niveles de aislamiento de transacciones SQL:1992, el nivel predeterminado en
InnoDB es REPEATABLE READ. En MySQL 5.0, InnoDB ofrece los cuatro niveles de aislamiento de
transacciones descriptos por el estndar SQL. Se puede establecer el nivel predeterminado de
aislamiento por todas las conexiones mediante el uso de la opcin --transaction-isolation en la lnea de
comandos o en ficheros de opciones. Por ejemplo, se puede establecer la opcin en la seccin [mysqld]
de my.cnf de este modo:

Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 59

[mysqld]
transaction-isolation = {READ-UNCOMMITTED | READ-COMMITTED
| REPEATABLE-READ | SERIALIZABLE}
Un usuario puede cambiar el nivel de aislamiento de una sesin individual o de todas las nuevas
conexiones con la sentencia SET TRANSACTION. Su sintaxis es la siguiente:
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL
{READ UNCOMMITTED | READ COMMITTED
| REPEATABLE READ | SERIALIZABLE}
Ntese que se usan guiones en los nombres de niveles de la opcin --transaction-isolation, pero no en la
sentencia SET TRANSACTION.
El comportamiento predeterminado es establecer el nivel de aislamiento a partir de la prxima
transaccin que se inicie. Si se emplea la palabra clave GLOBAL, la sentencia establece el nivel
predeterminado de la transaccin globalmente para todas las nuevas conexiones creadas a partir de ese
punto (pero no en las existentes). Se necesita el privilegio SUPER para hacer esto. Utilizando la palabra
clave SESSION se establece el nivel de transaccin para todas las futuras transacciones ejecutadas en la
actual conexin.
Cualquier cliente es libre de cambiar el nivel de aislamiento de la sesin (incluso en medio de una
transaccin), o el nivel de aislamiento para la prxima transaccin.
Los niveles de aislamiento de transacciones globales y de sesin pueden consultarse con estas
sentencias:
SELECT @@global.tx_isolation;
SELECT @@tx_isolation;

InnoDB y AUTOCOMMIT
En InnoDB, toda la actividad del usuario se produce dentro de una transaccin. Si el modo de ejecucin
automtica (autocommit) est activado, cada sentencia SQL conforma una transaccin individual por s
misma. MySQL siempre comienza una nueva conexin con la ejecucin automtica habilitada.
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 60

Si el modo de ejecucin automtica se deshabilit con SET AUTOCOMMIT = 0, entonces puede
considerarse que un usuario siempre tiene una transaccin abierta. Una sentencia SQL COMMIT o
ROLLBACK termina la transaccin vigente y comienza una nueva. Ambas sentencias liberan todos los
bloqueos InnoDB que se establecieron durante la transaccin vigente. Un COMMIT significa que los
cambios hechos en la transaccin actual se convierten en permanentes y se vuelven visibles para los
otros usuarios. Por otra parte, una sentencia ROLLBACK, cancela todas las modificaciones producidas en
la transaccin actual.
Si la conexin tiene la ejecucin automtica habilitada, el usuario puede igualmente llevar a cabo una
transaccin con varias sentencias si la comienza explcitamente con START TRANSACTION o BEGIN y la
termina con COMMIT o ROLLBACK.
Un ejemplo de lectura consistente en InnoDB
Suponiendo que se est ejecutando en el nivel de aislamiento predeterminado REPEATABLE READ,
cuando se realiza una lectura consistente -esto es, una sentencia SELECT ordinaria-, InnoDB le otorga a
la transaccin un punto en el tiempo (timepoint) del momento en que se realiz la consulta. Si otra
transaccin elimina una fila y confirma la accin en un momento posterior a dicho punto, no se ver la
fila como borrada. Las inserciones y actualizaciones se tratan del mismo modo.
Se puede obtener un timepoint ms reciente confirmando la transaccin actual y emitiendo un nuevo
SELECT. Esto se llama control de concurrencia multiversin.
Usuario A Usuario B
SET AUTOCOMMIT=0; SET AUTOCOMMIT=0;
tiempo
| SELECT * FROM t;
| empty set
| INSERT INTO t VALUES (1, 2);
|
v SELECT * FROM t;
empty set
COMMIT;

SELECT * FROM t;
empty set

COMMIT;

SELECT * FROM t;
---------------------
| 1 | 2 |
---------------------
1 row in set
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 61

En este ejemplo, el usuario A podr ver la fila insertada por B solamente cuando B haya confirmado la
insercin y A haya confirmado tambin, de modo que su timepoint avance e incluya la insercin
confirmada por B.
Si se desea ver el ms reciente estado de la base de datos, se debera emplear ya sea el nivel de
aislamiento READ COMMITTED o bien una lectura con bloqueo:
SELECT * FROM t LOCK IN SHARE MODE;

MySQL comienza cada conexin de cliente con el modo de ejecucin automtica (autocommit)
habilitado por defecto. Cuando la ejecucin automtica est habilitada, MySQL realiza la confirmacin
luego de cada sentencia SQL, si dicha sentencia no devuelve un error.
Si se tiene desactivado el modo de ejecucin automtica y se cierra una conexin sin hacer una
confirmacin explcita de una transaccin, MySQL cancelar dicha transaccin.
Si una sentencia SQL devuelve un error, la confirmacin o cancelacin dependen del error.
Las siguientes sentencias SQL (y sus sinnimos) provocan en MySQL una confirmacin implcita de la
transaccin en curso:


ALTER TABLE, BEGIN, CREATE INDEX, DROP DATABASE, DROP INDEX, DROP TABLE, LOAD
MASTER DATA, LOCK TABLES, RENAME TABLE, SET AUTOCOMMIT=1, START TRANSACTION,
TRUNCATE, UNLOCK TABLES.


Antes de MySQL 5.0.8, CREATE TABLE provocaba la confirmacin si se empleaba el registro
binario (binary logging). A partir de MySQL 5.0.8, las sentencias CREATE TABLE, TRUNCATE
TABLE, DROP DATABASE, y CREATE DATABASE provocan una confirmacin implcita.


La sentencia CREATE TABLE en InnoDB se procesa como una transaccin individual. Esto
significa que un ROLLBACK emitido por el usuario no cancelar las sentencias CREATE TABLE
hechas durante una transaccin.






Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 62

4.4 Instrucciones COMMIT y ROLLBACK

Por defecto, MySQL se ejecuta en modo autocommit. Esto significa que tan pronto como se ejecuta una
sentencia se actualiza (modifica) la tabla, MySQL almacenar la actualizacin en disco.
Si se estn usando tablas de transaccin segura (como InnoDB o BDB), se puede poner MySQL en modo
no-autocommit con el comando siguiente:
SET AUTOCOMMIT=0
Despus de desconectar el modo autocommit asignando cero a la variable AUTOCOMMIT, se debe usar
COMMIT para almecenar los cambios en disco o ROLLBACK si se quieren ignorar los cambios hechos
desde el principio de la transaccin.
Si se quiere desactivar el modo autocommit para una serire de sentencias, se puede usar una sentencia
START TRANSACTION:






Se puede usar BEGIN y BEGIN WORK en lugar de START TRANSACTION para iniciar unatransaccin.
START TRANSACTION fue aadido en MySQL 4.0.11; es la sintaxis SQL-99 y es el modo recomendado
para empezar una transaccin. BEGIN y BEGIN WORK estn disponibles desde MySQL 3.23.17 y 3.23.19,
respectivamente.
Si no se estn usando tablas de transaccin segura, cualquier cambio ser almacenado inmediatamente,
independientemente del estado del modo autocommit.
Si se usa una sentencia ROLLBACK despus de actualizar una tabla no transaccional, se obtendr un
error (ER_WARNING_NOT_COMPLETE_ROLLBACK) como un aviso. Todas las tablas de transaccin
segura sern restauradas, pero cualquier tabla de transaccin no segura no cambiar.



START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1
WHERE type=1;
UPDATE table2 SET summmary=@A WHERE
type=1;
COMMIT;
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 63

Unidad 5. Vistas
5.1 Definicin y Objetivo de las Vistas

Una vista o tabla virtual es un objeto de la base de datos que est definida en trminos de SELECT
(regresa los datos deseados para producir la vista).
Sintaxis:





Las vistas y tablas comparten el mismo namespace de tal forma que MySQL enviar un error en caso
de que ya exista una tabla o vista con el mismo nombre.
El comando REPLACE solo es aplicable para vistas y no para tablas.
Beneficios de una vista:
Acceso simplificado a los datos

Despliega diferentes datos para usuarios diferentes

Puede preservar la estructura de la tabla original en la cual estaba basada y minimizar el
impacto en las aplicaciones

5.2 Instrucciones para la Administracin de Vistas
Para crear una vista se utiliza el comando CREATE VIEW
Para modificar la consulta select de una vista se utiliza la clausula ALTER VIEW.




CREATE [or REPLACE] VIEW view_name
[(column_list)] AS
Select statement;
ALTER VIEW ejemplo AS
SELECT id, nombre
FROM producto

Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 64

La eliminacin de una vista se realiza con el comando DROP VIEW.



Sintaxis y Ejemplo:


















DROP VIEW ejemplo;
DROP VIEW IF EXISTS ejemplo;
CREATE VIEW ejemplo AS
SELECT producto.nombre, proveedor.nombre
FROM producto, proveedor, provee
WHERE provee.RFC= proveedor.RFC AND
provee.idproducto= producto.id;

CREATE VIEW ejemplo (productonombre, proveedornombre) AS
SELECT producto.nombre, proveedor.nombre
FROM producto, proveedor, provee
WHERE provee.RFC= proveedor.RFC AND
provee.idproducto= producto.id;

Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 65

Unidad 6. Seguridad
6.1 Esquemas de Autorizacin
Los permisos pueden darse en varios niveles:


Nivel global
Los permisos globales se aplican a todas las bases de datos de un servidor dado. Estos permisos
se almacenan en la tabla mysql.user. GRANT ALL ON *.* y REVOKE ALL ON *.* otorgan y quitan
slo permisos globales.


Nivel de base de datos
Los permisos de base de datos se aplican a todos los objetos en una base de datos dada. Estos
permisos se almacenan en las tablas mysql.db y mysql.host . GRANT ALL ON db_name.* y
REVOKE ALL ON db_name.* otorgan y quitan slo permisos de bases de datos.


Nivel de tabla
Los permisos de tabla se aplican a todas las columnas en una tabla dada. Estos permisos se
almacenan en la tabla mysql.tables_priv. GRANT ALL ON db_name.tbl_name y REVOKE ALL
ON db_name.tbl_name otorgan y quitan permisos slo de tabla.


Nivel de columna
Los permisos de columna se aplican a columnas en una tabla dada. Estos permisos se almacenan
en la tabla mysql.columns_priv. Usando REVOKE, debe especificar las mismas columnas que se
otorgaron los permisos.


Nivel de rutina
Los permisos CREATE ROUTINE, ALTER ROUTINE, EXECUTE, y GRANT se aplican a rutinas
almacenadas. Pueden darse a nivel global y de base de datos. Adems, excepto para CREATE
ROUTINE, estos permisos pueden darse en nivel de rutinas para rutinas individuales y se
almacenan en la tabla mysql.procs_priv.




Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 66

6.2 Instrucciones GRANT Y REVOKE
Creacin de Usuarios. Comando CREATE USER
CREATE USER user [IDENTIFIED BY [PASSWORD] 'password']
[, user [IDENTIFIED BY [PASSWORD] 'password']] ...
Este comando crea nuevas cuentas MySQL. Para cada cuenta, CREATE USER crea un nuevo
registro en la tabla mysql.user que no tiene permisos. Un error ocurre si la cuenta ya existe.
La cuenta puede tener una contrasea con la clusula opcional IDENTIFIED BY. En particular,
para especificar la contrasea en texto plano, omita la palabra clave PASSWORD. Para
especificar la contrasea como el valor hasheado retornado por la funcin PASSWORD() ,
incluya la palabra clave PASSWORD.
Eliminacin de usuarios. Comando DROP USER
Sintaxis:
DROP USER user [, user] ...
El comando DROP USER borra una o ms cuentas MySQL.
DROP USER como est en MySQL 5.0.0 borra slo cuentas que no tienen permisos. En MySQL
5.0.2, se modific para eliminar permisos de cuenta tambin. Esto significa que el
procedimiento para borrar una cuenta depende en su versin de MySQL.
Asignacin de permisos. Se utiliza el comando GRANT.
GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...
ON [object_type] {tbl_name | * | *.* | db_name.*}
TO user [IDENTIFIED BY [PASSWORD] 'password']
Visualizar permisos. Comando SHOW GRANTS para determinar los permisos que tiene la
cuenta.
Eliminar permisos. Se utiliza REVOKE para revocar los permisos mostrados por SHOW GRANTS.


Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 67


Sintaxis de REVOKE
REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ...
ON [object_type] {tbl_name | * | *.* | db_name.*}
FROM user [, user] ...

REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...

Ejercicio 1:
I. Realizar el siguiente modelo relacional en mysql.
Crear la base de datos usuarios.
Crear las tablas docentes y alumnos.
Considerando los siguientes atributos:


II. Realiza cada una de las instrucciones indicadas a continuacin, desde el cliente MySQL:
1.- Creacin de usuarios
a) grant usage on *.* to Docente IDENTIFIED BY docente;
b) grant usage on *.* to alumno identified by alumno;
c) grant usage on * to anonimo@localhost identified by clave;

2. - Asignacin de privilegios
a) grant select on usuarios.docentes To docente;
b) grant select on usuarios.alumnos to alumno;
c) grant select, insert usuarios.alumnos to alumno;
Docentes
Clave
Nombre
Direccin
Telfono

Alumnos
No_control
Nombre
Edad
Semestre
Carrera

Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 68

3.- Visualizacin de privilegios y usuarios
a) show grants for alumno;
b) show grants;
c) show grants for current_user;
d) show privileges \g

4. - Visualizacin de usuario actual
a) select user();
5.- Eliminacin de usuarios y privilegios
a) drop user alumno;
b) revoke select on usuarios.alumnos from alumno;
c) revoke insert on usuarios.alumnos from alumno;
d) drop user alumno;


Ejercicio 2:
Realiza cada una de las instrucciones indicadas a continuacin, desde el administrador de MySQL.
1.- crea un nuevo usuario denominado Responsable, establece nombre, host y password, as como
privilegios globales.


Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 69

2.-Asigna privilegios al usuario Responsable.

3.- Inicia una ventana de MS-DOS y cambia al directorio de MySQL.
program files\mysql\mysql Server 5.0\bin

4.- Ejecuta el cliente indicando el usuario con el que se conectara:
mysql -h host -u usuario -p
Ejemplo:
mysql -h localhost -u Responsable -p

5.- Establece la contrasea correspondiente.
6.- Ejecuta las siguientes sentencias.
a) use usuarios;
b) select user();
c) show tables;
d) select * from alumnos;
e) delete * from alumnos;
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 70

f) select * from docentes;

7.- Finaliza la sesin del cliente.
8.- En el administrador desconecta de la Base de datos (Disconnect from database).
9.- Selecciona Database Registration Info. Establece el usuario Responsable.
10.- Conctate a la Base de datos.










Unidad 7. Introduccin al SQL Procedural
7.1 Procedimientos Almacenados
Un procedimiento almacenado es un elemento de base de datos reutilizable almacenado que realiza
alguna operacin en la base de datos. Un procedimiento almacenado contiene cdigo SQL que puede,
entre otras cosas, insertar, actualizar o eliminar registros. Los procedimientos almacenados tambin
pueden alterar la estructura de la base de datos. Por ejemplo, puede utilizar un procedimiento
almacenado para aadir una columna de tabla o incluir borrar una tabla.

Un procedimiento almacenado tambin puede llamar a otro procedimiento almacenado, as como
aceptar entradas y devolver mltiples valores al procedimiento llamado en forma de parmetros de
salida.

Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 71

Un procedimiento almacenado es reutilizable en el sentido de que se puede reutilizar una versin
compilada del procedimiento para ejecutar una operacin de base de datos varias veces. Si sabe que
una tarea de base de datos se va a ejecutar muchas veces o que distintas aplicaciones van a ejecutar la
misma tarea, el uso de un procedimiento almacenado para ejecutar dicha tarea puede agilizar las
operaciones de base de datos.

Un Procedimiento Almacenado es un programa autocontrolado escrito en lenguaje del DBMS, son
almacenados como parte de la Base de Datos y sus metadatos.
Una vez creado un procedimiento almacenado, se puede invocar directamente desde una aplicacin, o
sustituir el nombre de una tabla o vista, por el nombre de procedimiento en clusulas SELECT. Los
procedimientos almacenados pueden recibir parmetros de entrada y retornar valores a la aplicacin.
Las ventajas de usar los procedimientos almacenados incluyen:
Diseo modular.
Aplicaciones que acceden la misma Base de Datos pueden compartir los procedimientos
almacenados, eliminando el cdigo doble y reduciendo el tamao de las aplicaciones.
El fcil mantenimiento.
Cuando un procedimiento se actualiza, los cambios se reflejan automticamente en todas las
aplicaciones, sin la necesidad de recompilar y relinkear. Las aplicaciones son compiladas slo
una vez para cada cliente.
Los procedimientos almacenados son ejecutados por el servidor, no por el cliente lo que reduce
el trfico en la red y mejora el performance o desempeo, especialmente para el acceso del
cliente remoto.
Estn almacenados en los servidores y asegurados por las medidas tomadas en la instalacin, lo
que impide que los usuarios normales puedan modificarlos e incluso desconocen su existencia.
Este es un elemento de gran valor en lo que a seguridad respecta.

Declaracion de un procedimiento:
CREATE PROCEDURE <nombre> (<parmetros>)
<declaraciones locales>
<cuerpo del procedimiento>;

Eliminar un procedimiento:

Llamada a un procedimiento:
CALL <nombre procedimiento> (<argumentos>);

Modos de un procedimiento:
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 72




Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 73





Seleccin de tuplas utilizando cursores

Un cursor es un apuntador a una tupla con el resultado de una consulta
Un cursor debe ser:

* Declarado para ser usado:
DECLARE CURSOR <nombre> FOR <consulta>
* Abierto para recuperar las tuplas resultado de la consulta y posicionarlo antes de la primera
OPEN <nombre cursor>
* Cerrado para indicar que se termino el procesamiento
CLOSE <nombre cursor>
* El cursor avanza de tupla en tupla usando el comando FETCH

Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 74





Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 75




Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 76



Pasos para crear un procedimiento almacenado desde el administrador de MySQl.
1. Seleccionar Procedures
2. Seleccionar New Procedure o CTR+N
3. Editar el procedimiento:
a. Establecer el nombre del procedimiento.
b. Establecer una descripcin del procedimiento.
c. Establecer parmetros de entrada o de salida.
4. Compilar el procedimiento
5. Ejecutar el procedimiento y establecer los datos de los parmetros de entrada.
6. Visualizar el DDL.


Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 77



Ejemplos:

1. - CREATE DEFINER = 'root'@'localhost' PROCEDURE `sp_update_editorial`(IN pid_editorial BIGINT,
IN pnombre varcHAR(30), IN pdireccion varcHAR(30))
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
update editorial set nombre = pnombre, direccion = pdireccion
where id_editorial = pid_editorial;
END;

2. - CREATE DEFINER = 'root'@'localhost' PROCEDURE `sp_delete_autor`(IN id BIGINT)
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT 'Comentario establecido'
BEGIN
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 78

delete from autores where id_autor = id;
END;

3. - CREATE DEFINER = 'root'@'localhost' PROCEDURE `sp_Insert_autor`(IN nom varCHAR(30), IN ap
varcHAR(30))
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
insert into libros(nombre, apellidos) values (nom,ap);
END;

4. - CREATE DEFINER = 'root'@'localhost' PROCEDURE `sp_select_autor`()
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
select * from autores;
END;
Ejemplo con un parmetro de
salida (out).


Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 79


CREATE PROCEDURE employee count (OUT emp_count INTEGER)

BEGIN
SELECT COUNT (*) INTO emp_count FROM Employee;
END;


7.2 Disparadores (Triggers)
Es un objeto que est alojado dentro de un SGBD cuyo propsito es realizar una tarea determinada por
el usuario.
Su nombre Trigger (Disparador) significa que se va a ejecutar al momento de ocurrir un evento y
condicin determinada, y no por invocacin manual hecha por el usuario.
Cada Trigger es la base de datos deber tener un nombre diferente.
Los triggers monitorean una base de datos y toman una accin cuando ocurre una condicin dada.

Un Triggers o disparador es una rutina autnoma asociada con una tabla o vista que automticamente
realiza una accin cuando una fila en la tabla o la vista se inserta (INSERT), se actualiza (UPDATE), o
borra (DELETE).
Un Trigger nunca se llama directamente. En cambio, cuando una aplicacin o usuario intenta insertar,
actualizar, o anular una fila en una tabla, la accin definida en el disparador se ejecuta
automticamente (se dispara).
Componentes:
Evento
Condicin
Accin



Las ventajas de usar los Triggers son:
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 80

La entrada en vigor automtica de restricciones de los datos, hace que los usuarios entren slo
valores vlidos.
El mantenimiento de la aplicacin se reduce, los cambios a un triggers se refleja
automticamente en todas las aplicaciones que tienen que ver con la tabla sin la necesidad de
recompilar o relinquear.
Logs automticos de cambios a las tablas. Una aplicacin puede guardar un registro corriente
de cambios, creando un trigger que se dispare siempre que una tabla se modifique.
La notificacin automtica de cambios a la Base de Datos con alertas de evento en los triggers.


Los eventos pueden ser las sentencias INSERT, DELETE, UPDATE que modifican los datos de una tabla.
Los triggers se pueden ejecutar antes (BEFORE) y/o despus (AFTER) de que sean modificados los
datos.

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.


Un ejemplo de trigger seria uno asociado a la sentencia DELETE en una tabla de clientes, para impedir
que se elimine uno que tenga un saldo distinto de cero. Otro trigger seria guardar los datos que se
modifican de un cliente en otra base de datos que servira de auditora.

Ejemplo: trigger que elimina el valor del porcentaje en caso de que sea menor a 0 o mayor que 1 antes
de insertar un registro.





Estructura de un Trigger
1.- Timing (Momento)
Para una tabla: BEFORE, AFTER
CREATE TRIGGER test_before_insert
BEFORE INSERT ON test
FOR EACH ROW
BEGIN
IF NEW.percent < 0.0 OR
NEW.percent > 1.0 THEN
SET NEW.percent = NULL;
END IF;
END;

Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 81

2.- Event: INSERT, UPDATE o DELETE
Tabla: ON table
3.- Type: (cuantas veces se ejecutar).
ROW varios MySQL solo utiliza Stament solo una vez por instruccin.

Usos de Triggers
Caractersticas Mejoras con Triggers
Seguridad Permite acceso a tablas de acuerdo a los valores de los
datos.

Auditoria Rastrea valores para operaciones de datos sobre tablas.

Integridad de datos Implementa complejas reglas de integridad.
Integridad referencial Implementan funcionalidad no estndar.
Replicacin de tabla Copia tablas en sincrona sobre replicas. Copias a otros
servidores.

Datos derivados Calcula valores derivados de datos automticamente:
Obtener valores de atributos calculados
Reglas de negocios

Eventos de conexin Registra eventos transparentemente.

Trigger Event Trigger Body


Trigger Event

Define el EVENTO que activar al Trigger
Afecta a las columnas deseadas:
UPDATE ON table_name
DELETE ON table_name
INSERT ON table_name

FOR EACH ROW

Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 82



Trigger Body

Ejemplo:







Tablas Mutantes
Son aquellas tablas que se encuentran en un proceso de cambio (INSERT, UPDATE, DELETE).
Dado que los datos en las tablas tienen cambios pendientes, el Trigger de tipo ROW que es disparado
por dichos cambios, NO PUEDE realizar una consulta a la misma tabla.



Utilizando OLD y NEW
Con un Trigger ROW, es posible hacer referencia a los valores de una columna antes y despus del
cambio de los datos.
Operacin Valor Anterior Valor Nuevo
INSERT NULL Valor agregado
UPDATE Valor antes de actualizar Valor despus de actualizar
DELETE Valor antes de borrar NULL
Define la ACCIN que debe realizar el
trigger.
BEGIN
END
CREATE TRIGGER trigger_name
{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE } ON
Table_name
FOR EACH ROW
Triggered_statement
CREATE TRIGGER Capital_bi
BEFORE INSERT ON Capital
FOR EACH ROW
SET NEW.Population =
IF (NEW. Population < 0, 0, TRUNCATE (NEW.Population, -3));

NO es posible realizar consultas (SELECT) a
la misma tabla que ser actualizada.
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 83


Todos los Trigger de una tabla son eliminados cuando la tabla es borrada.
Para crear Triggers se deben tener SUPER privilegios.
Para asignar un valor a una columna (SET NEW.column=value) se tiene que poseer el privilegio
UPDATE para la columna.
Para usar NEW.column en una expresin para hacer referencia a una nueva columna, se tiene
que poseer el privilegio SELECT para la columna.
Ejemplo:







Triggers vs Procedimientos
Trigger Procedimiento
Usa CREATE TRIGGER

Usa CREATE PROCEDURE
Invocado implcitamente

Invocado explcitamente
No se permite CALL, iniciar TRANSACCIONES,
o asociar a una VISTA o TABLA TEMPORAL

Se invoca mediante CALL

Una tabla no puede tener dos triggers para la misma combinacin de Timing and Event.
Puede existir un trigger de tipo AFTER INSERT y BEFORE INSERT, pero no puede existir dos
triggers para AFTER INSERT.

Ejemplo general
CREATE TRIGGER Capital_bu
BEFORE UPDATE ON Capital
FOR EACH ROW
BEGIN
SET @country = OLD.Country;
SET @capital_old = OLD.Capital;
SET @capital_new = NEW.Capital;
END;
DROP TRIGGER trigger_name;
Taller de Base de Datos
Clave: SCS -0432

ITSP-ISC Pgina 84

Crearemos la tabla de clientes y le ponemos algunos registros:

CREATE TABLE clientes(
id int not null auto_increment,
nombre varchar(100),
seccion varchar(10),
PRIMARY KEY(id),
KEY(nombre)
);

INSERT INTO clientes (nombre, seccion) VALUES
('Miguel','informatica'),
('Rosa','comida'),
('Maria','ropa'),
('Albert','informatica'),
('Jordi','comida');

Y una tabla que ser la que guardar los datos de la "auditoria"

CREATE TABLE auditoria_clientes
(
id int not null auto_increment,
nombre varchar(100),
anterior_seccion varchar(10),
usuario varchar(40),
modificado datetime,
primary key(id)
);

y finalmente un trigger que se disparar cada vez que alguien modifique un dato de la tabla clientes y
lo guardar en una tabla junto al nombre del usuario y la fecha.

CREATE TRIGGER trigger_auditoria_clientes AFTER UPDATE ON clientes
FOR EACH ROW
INSERT INTO auditoria_clientes(name, anterior_seccion, usuario, modificado )
VALUES (OLD.nombre, OLD.seccion, CURRENT_USER(), NOW() );

Potrebbero piacerti anche