Está en la página 1de 83

TESCHI

Tecnolgico de
Estudios Superiores
de Chimalhuacn
Ingeniera en sistemas computacionales

Manual de Bases de Datos

Ingeniera en sistemas computacionales

TESCHI
NDICE
Contenido
NDICE.................................................................................................................................................. 1
Qu es una Base de datos? - Definicin de Base de datos................................................................ 3
Tipos de base de datos ........................................................................................................................ 3
UNIDAD 1 ............................................................................................................................................ 5
Sistema Gestor de Base de Datos ....................................................................................................... 5
Ejemplos de SGBD ............................................................................................................................... 5
MySQL ............................................................................................................................................. 5
Microsoft SQL Server....................................................................................................................... 6
PostgreSQL ...................................................................................................................................... 6
Ventajas de MySQL ............................................................................................................................. 7
REQUERIMIENTOS (en Windows) ....................................................................................................... 7
Instalando MySQL ............................................................................................................................... 8
Instalando MySQL en Linux (Ubuntu) ............................................................................................... 15
Unidad 2 ............................................................................................................................................ 18
Realice los diagramas que su profesor le indique. ............................................................................ 18
ENUNCIADO DEL EJERCICIO 1........................................................................................................ 18
ENUNCIADO DEL EJERCICIO 2........................................................................................................ 18
ENUNCIADO DEL EJERCICIO 3........................................................................................................ 19
ENUNCIADO DEL EJERCICIO 4........................................................................................................ 19
ENUNCIADO DEL EJERCICIO 5........................................................................................................ 20
ENUNCIADO DEL EJERCICIO 6........................................................................................................ 20
De las siguientes facturas, elabore los diagramas que le indique su profesor. ................................ 21
UNIDAD 3 .......................................................................................................................................... 24
Lenguaje de manipulacin de datos ................................................................................................. 24
Lenguaje SQL ..................................................................................................................................... 24
Crear bases de datos ......................................................................................................................... 25

Ingeniera en sistemas computacionales


1
UNIDAD 4 .......................................................................................................................................... 38
Seguridad........................................................................................................................................... 38
UNIDAD 5 .......................................................................................................................................... 48
Transacciones. ................................................................................................................................... 48
UNIDAD 6 .......................................................................................................................................... 55
SQL Procedural. ................................................................................................................................. 55
PROCEDIMIENTOS ALMACENADOS. ............................................................................................. 55
DISPARADORES (TRIGGERS) .......................................................................................................... 62
UNIDAD 7 .......................................................................................................................................... 66
Conectividad de Bases de Datos. ...................................................................................................... 66
ODBC ............................................................................................................................................. 66
Qu es el ODBC? .......................................................................................................................... 66
JDBC (Java DataBase Connectivity ................................................................................................ 67
ADO.NET ........................................................................................................................................... 69
CONEXIONES A LENGUAJE DE PROGRAMACIN ......................................................................... 69
CONEXIN A ACCESS DESDE JAVA ................................................................................................ 70
CONEXIN A ORACLE 10g DESDE JAVA ......................................................................................... 71
CONEXIN A MySQL DESDE JAVA ................................................................................................. 73
Apndice A ........................................................................................................................................ 75
Tipos De Datos En MySQL ................................................................................................................. 75
Tipos de Datos Numricos: ........................................................................................................... 75
Tipos de Datos Fecha y Hora: ........................................................................................................ 76
Tipos de datos String: .................................................................................................................... 77
Apndice B ........................................................................................................................................ 79
Atributos De Datos En MySQL ........................................................................................................... 79
Apndice C......................................................................................................................................... 81
Operadores En MySQL ...................................................................................................................... 81
Apndice D ........................................................................................................................................ 82
Funciones En MySQL ......................................................................................................................... 82

Ingeniera en sistemas computacionales


2
Qu es una Base de datos? - Definicin de
Base de datos
Una base de datos es una coleccin de informacin organizada de forma que un
programa de ordenador pueda seleccionar rpidamente los fragmentos de datos
que necesite. Una base de datos es un sistema de archivos electrnico.
Las bases de datos tradicionales se organizan por campos, registros y archivos.
Un campo es una pieza nica de informacin; un registro es un sistema completo
de campos; y un archivo es una coleccin de registros. Por ejemplo, una gua de
telfono es anloga a un archivo. Contiene una lista de registros, cada uno de los
cuales consiste en tres campos: nombre, direccin, y nmero de telfono.
A veces se utiliza DB, de database en ingls, para referirse a las bases de datos.

Tipos de base de datos


Se denomina base de datos a un conjunto de informacin sobre una temtica
determinada, la cual es almacenada de forma metdica con el propsito de ser
utilizada en la posteridad. Actualmente, las bases de datos son realizadas en
formato digital, lo que permite acumular una gran cantidad de informacin, en poco
espacio y acelerar su bsqueda.
Existen muchas formas de clasificar a las bases de datos. Una de ellas es segn
el contenido:
BASE DE DATOS BIBLIOGRFICA: esta clase de base de datos contiene
informacin acerca del autor de una produccin bibliogrfica, el ttulo, fecha
de publicacin, edicin, entre otras. Tambin suele contener una sinopsis
de la publicacin, pero nunca presentara el texto en su totalidad.

BASES DE DATOS DE TEXTO COMPLETO: contiene la totalidad de una


determinada fuente de carcter primario, incluyendo todo su contenido y
todas sus ediciones. Es decir que se constituyen por los propios
documentos con su respectivo texto. Suelen, adems, incluir un resumen o
descripcin con el propsito de acelerar la bsqueda.

Ingeniera en sistemas computacionales


3
Las bases de datos tambin pueden ser clasificas de acuerdo a la variabilidad de
los datos almacenados, de esta manera encontramos:
BASES DE DATOS ESTTICAS: con este trmino se hacen referencia
aquellas bases de datos de slo lectura. Su propsito esencial consiste en
el almacenamiento de informacin de carcter histrico, con el fin de que
luego sea usada para analizar la conducta de una serie de datos a lo largo
del tiempo. De esta manera, es posible efectuar proyecciones y actuar en
consecuencia.

BASES DE DATOS DINMICAS: reciben esta denominacin debido a que


los datos all acumulados son reformados con el correr del tiempo. De esta
manera se realizan acciones tales como actualizaciones, eliminaciones o
agregado de datos, ms all de las acciones bsicas de consulta.

Ingeniera en sistemas computacionales


4
UNIDAD 1
Sistema Gestor de Base de Datos

Un Sistema Gestor de Base de Datos (SGBD, en ingls DBMS: DataBase


Management System) es un sistema de software que permite la definicin de
bases de datos; as como la eleccin de las estructuras de datos necesarios para
el almacenamiento y bsqueda de los datos, ya sea de forma interactiva o a travs
de un lenguaje de programacin. Un SGBD relacional es un modelo de datos que
facilita a los usuarios describir los datos que sern almacenados en la base de
datos junto con un grupo de operaciones para manejar los datos.
Los SGBD relacionales son una herramienta efectiva que permite a varios
usuarios acceder a los datos al mismo tiempo. Brindan facilidades eficientes y un
grupo de funciones con el objetivo de garantizar la confidencialidad, la calidad, la
seguridad y la integridad de los datos que contienen, as como un acceso fcil y
eficiente a los mismos.

Ejemplos de SGBD
MySQL

MySQL es un sistema gestor de bases de datos relacionales rpido, slido y


flexible. Es idneo para la creacin de bases de datos con acceso desde pginas
web dinmicas, as como para la creacin de cualquier otra solucin que implique
el almacenamiento de datos, posibilitando realizar mltiples y rpidas consultas.
Est desarrollado en C y C++, facilitando su integracin en otras aplicaciones
desarrolladas tambin en esos lenguajes.
Es un sistema cliente/servidor, por lo que permite trabajar como servidor
multiusuario y de subprocesamiento mltiple, o sea, cada vez que se crea una
conexin con el servidor, el programa servidor establece un proceso para manejar
la solicitud del cliente, controlando as el acceso simultneo de un gran nmero de
usuarios a los datos y asegurando el acceso a usuarios autorizados solamente. Es
uno de los sistemas gestores de bases de datos ms utilizado en la actualidad,
utilizado por grandes corporaciones como Yahoo! Finance, Google, Motorola,
entre otras.

Ingeniera en sistemas computacionales


5
Microsoft SQL Server

SQL Server es un sistema gestor de base de datos relacionales producido por


Microsoft. Es un sistema cliente/servidor que funciona como una extensin natural
del sistema operativo Windows. Entre otras caractersticas proporciona integridad
de datos, optimizacin de consultas, control de concurrencia, backup y
recuperacin.
Es relativamente fcil de administrar a travs de la utilizacin de un entorno grfico
para casi todas las tareas de sistema y administracin de bases de datos. Utiliza
servicios del sistema operativo Windows para ofrecer nuevas capacidades o
ampliar la base de datos, tales como enviar y recibir mensajes y gestionar la
seguridad de la conexin. Es fcil de usar y proporciona funciones de
almacenamiento de datos que slo estaban disponibles en Oracle y otros sistemas
gestores de bases de datos ms caros.

PostgreSQL

PostgreSQL es un Sistema Gestor de Bases de Datos Relacionales Orientadas a


Objetos, derivado de Postgres, desarrollado en la Universidad de California, en el
Departamento de Ciencias de la Computacin de Berkeley. Es un gestor de bases
de datos de cdigo abierto, brinda un control de concurrencia multi-versin (MVCC
por sus siglas en ingls) que permite trabajar con grandes volmenes de datos;
soporta gran parte de la sintaxis SQL y cuenta con un extenso grupo de enlaces
con lenguajes de programacin.
Posee caractersticas significativas del motor de datos, entre las que se pueden
incluir las subconsultas, los valores por defecto, las restricciones a valores en los
campos (constraints) y los disparadores (triggers). Ofrece funcionalidades en lnea
con el estndar SQL92, incluyendo claves primarias, identificadores
entrecomillados, conversin de tipos y entrada de enteros binarios y
hexadecimales.
El cdigo fuente se encuentra disponible para todos sin costo alguno. Est
disponible para 34 plataformas con la ltima versin estable.Es totalmente
compatible con ACID (acrnimo de Atomicity, Consistency, Isolation and Durability;
en espaol: Atomicidad, Consistencia, Aislamiento y Durabilidad).
Posee una integridad referencial e interfaces nativas para lenguajes como ODBC,
JDBC, C, C++, PHP, PERL, TCL, ECPG; PYTHON y RUBY. Funciona en todos
los sistemas operativos Linux, UNIX (AIX, BSD, HP-UX, SGI IRIX, Mac OS X,
Solaris, Tru64), y Windows.

Ingeniera en sistemas computacionales


6
Debido a la liberacin de la licencia, PostgreSQL se puede usar, modificar y
distribuir de forma gratuita para cualquier fin, ya sea privado, comercial o
acadmico.

Ventajas de MySQL
MySQL software es Open Source
Velocidad al realizar las operaciones, lo que le hace uno de los gestores
con mejor rendimiento.
Bajo costo en requerimientos para la elaboracin de bases de datos, ya que
debido a su bajo consumo puede ser ejecutado en una mquina con
escasos recursos sin ningn problema.
Soporta gran variedad de Sistemas Operativos
Baja probabilidad de corromper datos, incluso si los errores no se producen
en el propio gestor, sino en el sistema en el que est.
Su conectividad, velocidad, y seguridad hacen de MySQL Server altamente
apropiado para acceder bases de datos en Internet
El software MySQL usa la licencia GPL
Debido a los anteriores puntos este manual se centrara en la utilizacin del SGBD
MySQL.

REQUERIMIENTOS (en Windows)


Para ejecutar MySQL para Windows, se necesita lo siguiente:
- Sistema Operativo: Windows de 32 bits, tal como 9x, Me, NT, 2000, XP, o
Windows Server 2003.
- Se recomienda fuertemente el uso de un sistema operativo Windows basado en
NT (NT, 2000, XP, 2003) puesto que stos permiten ejecutar el servidor MySQL
como un servicio.
- Soporte para protocolo TCP/IP.
- Suficiente espacio en disco rgido para descomprimir, instalar, y crear las bases
de datos de acuerdo a sus requisitos. Generalmente se recomienda un mnimo de
200 megabytes.

Ingeniera en sistemas computacionales


7
Instalando MySQL
Para instalar MySQL en su ordenador primero requiere entrar a la pgina oficial de
MySQL mediante la siguiente URL http://dev.mysql.com/downloads/mysql/ y
seleccionar la distribucin correspondiente al sistema operativo de su equipo de
cmputo (para este ejemplo Windows).

Ingeniera en sistemas computacionales


8
INSTALACIN

- Iniciamos el ejecutable, Hacemos clic en Next para continuar.

Pantalla de los trminos de licencia. Clic en Next

Nos pregunta por el tipo de instalacin. Elegimos completa.

Ingeniera en sistemas computacionales


9
Ya est listo para empezar el proceso de instalacin. Clic en Install.

Instalacin en proceso

La instalacin finaliz, algunas pantallas para leer. Clic en Next.

Ingeniera en sistemas computacionales


10
Instalacin finalizada. Proseguimos con la herramienta de configuracin

Se abre la ventana de la herramienta de configuracin. Clic en Next

Seleccionamos un tipo de configuracin. Es este caso se elige


la configuracin detallada.

Ingeniera en sistemas computacionales


11
Ya que la maquina donde se instala va a servir para desarrollo, elegimos
Developer Machine

Configuramos el soporte de MyISAM y/o InnoDB como tecnologa de


almacenamiento de datos.

Habilitamos la conexin TCP/IP y designamos un puerto para la gestin remota de


la base de datos.

Ingeniera en sistemas computacionales


12
Elegimos el nmero aproximado de conexiones concurrentes a la base de datos.

Elegimos el lugar de instalacin

Se elige el conjunto de caracteres que soportara por defecto la base de datos.

Ingeniera en sistemas computacionales


13
Seleccionamos para instalar MySQL como servicio (recomendado).

Colocamos una contrasea al root (administrador)

Pantalla antes de empezar la configuracin. Haga clic en Ejecute para ejecutar lo


previamente elegido.

Ingeniera en sistemas computacionales


14
La configuracin ha finalizado. Haga clic en Finish.

Instalando MySQL en Linux (Ubuntu)


Primero habr una terminal en su ordenador.

Teclee la siguiente lnea de comando: sudo apt-get install mysql-server


Despus teclee la contrasea de su equipo y vera una terminal parecida a la
siguiente.

Ingeniera en sistemas computacionales


15
Presione y para aceptar y a continuacin le pedir una contrasea para el
usuario root (administrador de la base de datos).

Hay que esperar unos momentos para que se instale (hay que estar conectado a
internet), despus de unos instantes podr acceder a mysql desde la misma
terminal tecleando el siguiente comando: Mysql u root p (enter) y el password
que agrego en el paso anterior, debera de mostrar una interfaz parecida a la
siguiente:

Nota: Se utiliz Ubuntu por ser uno de los sistemas Linux ms populares.
Una vez instalado (en Windows) se crea el siguiente rbol de directorios:

Ingeniera en sistemas computacionales


16
Directorio / Contenido
bin Programas cliente y el servidor mysqld

data Ficheros de registro (logs), bases de datos

Docs Documentacin

examples Programas y scripts de ejemplo

include Ficheros de inclusin

lib Bibliotecas

scripts Scripts de utilidades.

share Ficheros con mensajes de error

Y para Linux es el siguiente:

Directorio / Contenido
/usr/bin Programas cliente y scripts

/usr/sbin El servidor mysqld

/var/lib/mysql Ficheros de registro (logs), bases de datos

/usr/share/doc/packages Documentacin

/usr/include/mysql Ficheros de inclusin

/usr/lib/mysql Bibliotecas

/usr/share/mysql Ficheros con mensajes de error y conjuntos de


caracteres

/usr/share/sql-bench Pruebas de rendimiento

Ingeniera en sistemas computacionales


17
Unidad 2
Realice los diagramas que su profesor le
indique.
ENUNCIADO DEL EJERCICIO 1

Una empresa vende productos a varios clientes. Se necesita conocer los datos
personales de los clientes (nombre, apellidos, dni, direccin y fecha de
nacimiento). Cada producto tiene un nombre y un cdigo, as como un precio
unitario. Un cliente puede comprar varios productos a la empresa, y un mismo
producto puede ser comprado por varios clientes.
Los productos son suministrados por diferentes proveedores. Se debe tener en
cuenta que un producto slo puede ser suministrado por un proveedor, y que un
proveedor puede suministrar diferentes productos. De cada proveedor se desea
conocer el NIF, nombre y direccin

ENUNCIADO DEL EJERCICIO 2

Se desea informatizar la gestin de una empresa de transportes que reparte


paquetes por toda Espaa. Los encargados de llevar los paquetes son los
camioneros, de los que se quiere guardar el dni, nombre, telfono, direccin,
salario y poblacin en la que vive.
De los paquetes transportados interesa conocer el cdigo de paquete, descripcin,
destinatario y direccin del destinatario. Un camionero distribuye muchos
paquetes, y un paquete slo puede ser distribuido por un camionero.
De las provincias a las que llegan los paquetes interesa guardar el cdigo de
provincia y el nombre. Un paquete slo puede llegar a una provincia. Sin embargo,
a una provincia pueden llegar varios paquetes.
De los camiones que llevan los camioneros, interesa conocer la matrcula, modelo,
tipo y potencia. Un camionero puede conducir diferentes camiones en fechas
diferentes, y un camin puede ser conducido por varios camioneros

Ingeniera en sistemas computacionales


18
ENUNCIADO DEL EJERCICIO 3

Se desea disear la base de datos de un Instituto. En la base de datos se desea


guardar los datos de los profesores del Instituto (DNI, nombre, direccin y
telfono).
Los profesores imparten mdulos, y cada mdulo tiene un cdigo y un nombre.
Cada alumno est matriculado en uno o varios mdulos.
De cada alumno se desea guardar el n de expediente, nombre, apellidos y fecha
de nacimiento. Los profesores pueden impartir varios mdulos, pero un mdulo
slo puede ser impartido por un profesor.
Cada curso tiene un grupo de alumnos, uno de los cuales es el jefe del grupo

ENUNCIADO DEL EJERCICIO 4

Se desea disear una base de datos para almacenar y gestionar la informacin


empleada por una empresa dedicada a la venta de automviles, teniendo en
cuenta los siguientes aspectos:
La empresa dispone de una serie de coches para su venta. Se necesita conocer la
matrcula, marca y modelo, el color y el precio de venta de cada coche.
Los datos que interesa conocer de cada cliente son el NIF, nombre, direccin,
ciudad y nmero de telfono: adems, los clientes se diferencian por un cdigo
interno de la empresa que se incrementa automticamente cuando un cliente se
da de alta en ella. Un cliente puede comprar tantos coches como desee a la
empresa. Un coche determinado solo puede ser comprado por un nico cliente.
El concesionario tambin se encarga de llevar a cabo las revisiones que se
realizan a cada coche. Cada revisin tiene asociado un cdigo que se incrementa
automticamente por cada revisin que se haga.
De cada revisin se desea saber si se ha hecho cambio de filtro, si se ha hecho
cambio de aceite, si se ha hecho cambio de frenos u otros. Los coches pueden
pasar varias revisiones en el concesionario

Ingeniera en sistemas computacionales


19
ENUNCIADO DEL EJERCICIO 5

La clnica SANA ROSA necesita llevar un control informatizado de su gestin de


pacientes y mdicos.
De cada paciente se desea guardar el cdigo, nombre, apellidos, direccin,
poblacin, provincia, cdigo postal, telfono y fecha de nacimiento.
De cada mdico se desea guardar el cdigo, nombre, apellidos, telfono y
especialidad.
Se desea llevar el control de cada uno de los ingresos que el paciente hace en el
hospital.
Cada ingreso que realiza el paciente queda registrado en la base de datos. De
cada ingreso se guarda el cdigo de ingreso (que se incrementar
automticamente cada vez que el paciente realice un ingreso), el nmero de
habitacin y cama en la que el paciente realiza el ingreso y la fecha de ingreso.
Un mdico puede atender varios ingresos, pero el ingreso de un paciente solo
puede ser atendido por un nico mdico. Un paciente puede realizar varios
ingresos en el hospital.
.

ENUNCIADO DEL EJERCICIO 6

Se desea informatizar la gestin de una tienda informtica. La tienda dispone de


una serie de productos que se pueden vender a los clientes.

De cada producto informtico se desea guardar el cdigo, descripcin, precio y


nmero de existencias. De cada cliente se desea guardar el cdigo, nombre,
apellidos, direccin y nmero de telfono.
Un cliente puede comprar varios productos en la tienda y un mismo producto
puede ser comprado por varios clientes. Cada vez que se compre un artculo
quedar registrada la compra en la base de datos junto con la fecha en la que se
ha comprado el artculo.
La tienda tiene contactos con varios proveedores que son los que suministran los
productos. Un mismo producto puede ser suministrado por varios proveedores. De
cada proveedor se desea guardar el cdigo, nombre, apellidos, direccin,
provincia y nmero de telfono.

Ingeniera en sistemas computacionales


20
De las siguientes facturas, elabore los
diagramas que le indique su profesor.

Ingeniera en sistemas computacionales


21
Ingeniera en sistemas computacionales
22
Ingeniera en sistemas computacionales
23
UNIDAD 3
Lenguaje de manipulacin de datos
Lenguaje de Manipulacin de Datos (Data Manipulation Language, DML) es un
idioma proporcionado por los [[sistema de gestin de base de datos] sistemas
gestores de bases de datos] que permite a los usuarios de la misma llevar a cabo
las tareas de consulta o modificacin de los datos contenidos en las Bases de
Datos del Sistema Gestor de Bases de Datos. El lenguaje de manipulacin de
datos ms popular hoy da es SQL, usado para recuperar y manipular datos en
una base de datos relacional.

Lenguaje SQL
Entre en la carpeta de MySQL que se creo en su ordenador al instalarlo y busque
la carpeta bin, copie la direccin y abra una consola de comandos, teclee la cd
y pegue la direccin de la carpeta bin que copio anteriormente. Una vez
realizado lo anterior teclee el siguiente comando para acceder a la consola de
MySQL:mysql -h localhost -u root -p le pedir el password que usted haya
definido al momento de instalarlo. Si todo es correcto estar en la consola de
MySQL y vera una pantalla parecida a la siguiente:

Como puede observar en la parte de abajo se muestra lo siguiente: mysql> lo cual


indica que el sistema est a la espera de los comandos SQL que se ejecutaran.
Por otra parte el comando mysql -h localhost -u root -p hace referencia al puerto
en el cual se conectara, al usuario que acceder y la contrasea del mismo.

Ingeniera en sistemas computacionales


24
Crear bases de datos
Para crear una base de datos estando en el Shell de mysql teclee el siguiente
comando: mysql> create database tienda;
A continuacin se mostraran algunos comandos de sql y se mostraran sus
resultados.
Una vez creada la base de datos podemos rectificar que ya se ha creado con el
siguiente comando:
mysql> show databases;
+-------------------------------+
| Database |
+-------------------------------+
| information_schema |
| mysql |
| performance_schema |
| tienda |
+-------------------------------+
4 rows in set

Como se ve en la base de datos tienda ya est agregada en las bases de datos


de MySQL ahora hay que usarla, para eso usamos el comando use
mysql> use tienda;
Database changed

Listo! la base de datos esta creada y en uso, pero no contiene absolutamente


nada, para poder guardar informacin es necesario construir las tablas en las
cuales se guardaran los datos, para ello construiremos tres tablas las cuales sern
clientes, producto, y venta como se muestran a continuacin.

clientes productos venta

Ingeniera en sistemas computacionales


25
En la tabla clientes agregaremos el identificador del cliente y su nombre, en
productos el identificador del producto su descripcin y precio, por ltimo la
venta que contiene el nmero de venta la cual ser auto-incremental el
identificador del clienta que realizo la compra y el identificador del producto que
compr el cliente. Cmo ve el ejemplo resulta bastante sencillo as que a
continuacin se agrega el cdigo para crear la base de datos antes mencionada.

mysql>CREATE TABLE clientes (


id_cliente int not null,
nombre varchar(20),
PRIMARY KEY (id_cliente));

mysql>CREATE TABLE productos (


id_producto int not null,
descripcion varchar(30),
precio int,
PRIMARY KEY(id_producto));

mysql> CREATE TABLE venta (


num_venta int NOT NULL AUTO_INCREMENT,
id_cliente int NOT NULL,
id_producto int NOT NULL,
PRIMARY KEY (num_venta),
FOREIGN KEY (id_cliente) REFERENCES clientes (id_cliente) ON
DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (id_producto) REFERENCES productos (id_producto) ON
DELETE CASCADE ON UPDATE CASCADE
);

Una vez que las tablas ya fueron creadas y fueron definidos los tipos de datos y
las relaciones procedemos a llenar las tablas con los datos que se muestran en las
imgenes anteriores:
NOTA: Para mayor referencia con respecto a los tipos de datos y atributos usados
en MySQL consultar los apndices A y B respectivamente.
En un principio verificaremos los tipos de datos de cada tabla con el comando
DESCRIBE, introducimos los siguientes comandos:
mysql> show tables;
mysql> DESCRIBE clientes; DESCRIBE productos; DESCRIBE venta;
El resultado de esta consulta es el siguiente:

Ingeniera en sistemas computacionales


26
Como puede apreciar aparece la informacin de la constitucin de las tablas, los
campos que tiene, sus tipos de datos, llaves primarias y forneas, etc.
Ahora el llenado de las tablas con los datos antes mencionados.
INSERT INTO clientes VALUES (1, 'Hugo');
INSERT INTO clientes VALUES (2, 'Paco');
INSERT INTO clientes VALUES (3, 'Luis');
INSERT INTO productos VALUES (10001, 'Refresco', 12);
INSERT INTO productos VALUES (10002, 'Frituras', 7);
INSERT INTO productos VALUES (10003, 'Galletas', 10);
INSERT INTO productos VALUES ('10004', 'Cafe', 35);
INSERT INTO venta VALUES (1, 2, 10003);
INSERT INTO venta VALUES (2, 2, 10004);

Ingeniera en sistemas computacionales


27
INSERT INTO venta VALUES (3, 2, 10001);
INSERT INTO venta VALUES (4, 1, 10002);
INSERT INTO venta VALUES (5, 3, 10004);
Ahora ya tenemos nuestra base de datos como se muestra en las tablas
anteriores, ya contiene las tablas necesarias y los datos requeridos ahora falta un
punto muy importante LAS CONSULTAS

COMANDO DESCRIPCIN
CREATE Utilizado para crear nuevas tablas, procedimientos e ndices.
DROP Empleado para eliminar tablas, procedimientos e ndices
ALTER Utilizado para modificar las tablas agregando campos o cambiando
la definicin de los campos.
SELECT Utilizado para consultar registros de la base de datos que satisfagan
un criterio determinado.
INSERT Utilizado para cargar lotes de datos en la base de datos en una
nica operacin.
DELETE Utilizado para eliminar registros de una tabla de una base de datos.
UPDATE Utilizado para modificar los valores de los campos y registros
especificados.

Supongamos que queremos conocer todos los productos existentes la consulta


sera la siguiente:
mysql> SELECT * FROM productos;
Y la siguiente tabla muestra el resultado de la consulta anterior.

Ingeniera en sistemas computacionales


28
Si quisiramos saber solo el nombre de los clientes sera como sigue a
continuacin.
mysql> SELECT nombre FROM clientes;

Como seguramente ya se percat, la sentencia SELECT especifica que es lo que


deseo mostrar y hace referencia al campo o campos (el * indica que se hace
referencia a todos los campos) y la clusula FROM indica la tabla en la cual se
buscara la informacin. Pero qu pasa si deseo conocer algn dato que cumpla
alguna condicin? para este tipo de casos se usa la clusula WHERE
Por ejemplo, imagine que deseamos saber el precio del producto galletas, como
ve en esta consulta se requiere solo el precio de las galletas y no de los dems
productos, por tanto la siguiente consulta no resulta til.
mysql> SELECT precio FROM productos;
Lo correcto sera como sigue:
mysql> SELECT precio FROM productos WHERE descripcion = 'galletas';

En el ejemplo anterior buscamos de forma directa el precio de las galletas


mediante la descripcin del producto. El nombre del producto est en forma de
cadena de caracteres por tal motivo el nombre se coloca entre comillas simples en
la seccin de la condicin deseada, otra forma seria conociendo el identificador, la
sentencia sera as:
mysql> SELECT precio FROM productos WHERE id_producto=10003;

Ingeniera en sistemas computacionales


29
El resultado es exactamente el mismo que en la consulta anterior. Los nmeros no
requieren del uso de comillas simples cuando se utilizan.
Ahora suponga que necesita conocer el identificador y nombre de los productos
que tienen un precio mayor que 10, la sentencia quedara de la siguiente forma.
mysql> SELECT id_producto,precio FROM productos WHERE precio>10;

Para entender este tipo de consultas se requiere que conozca los diferentes tipos
de operadores que maneja MySQL per este motivo se ha anexado una tabla que
contiene estos operadores en el apndice C el cual puede consultar.
Ahora imagine que desea conocer que productos compr el cliente Paco, del cual
sabe que su identificador es 2. La sentencia SQL sera as.
mysql> SELECT venta.id_producto
-> FROM clientes, venta
-> WHERE clientes.id_cliente=venta.id_cliente
-> AND
-> (venta.id_cliente=2 AND clientes.nombre='Paco');

El resultado de ejecutar la sentencia anterior es el que se muestra a continuacin.

Esta es hasta el momento la consulta ms compleja que se ha realizado, de tal


forma que requiere un poco ms de tiempo su explicacin, la cual separ en
partes para su mejor comprensin.
La consulta SELECT venta.id_producto, ya que para esta consulta se
requiere que la informacin contenida en dos tablas se requiere del uso del
Ingeniera en sistemas computacionales
30
operador . (punto) para especificar que es lo que se desea mostrar. Este
operador hace a elementos contenidos por ejemplo (A.b) esto indicara que
b se encuentra dentro de A. En MySQL se ocupa de la misma forma
haciendo uso de la siguiente jerarqua. BASE_DE_DATOS.TABLA.CAMPO.
Ya que ocupamos casi desde un principio del ejercicio la sentencia USE;
en la consulta SELECT no es necesario agregar el nombre de la misma,
pero si se hace referencia a la tabla venta y al campo dentro de la tabla
que se quiere visualizar id_producto.
La clusula FROM clientes, venta hace referencia como en ejemplos
anteriores a las tablas que se utilizarn, a diferencia de las consultas
anteriores esta vez necesitamos dos tablas las cuales quedan indicadas en
la clusula FROM separados por una , (coma).
En la instruccin WHERE clientes.id_cliente=venta.id_cliente se est
realizando una comparacin de llaves, esto es de suma importancia ya que
al usar dos tablas o ms MySQL combina todos las tuplas de una tabla con
las tuplas de la otra tabla generando as informacin que es innecesaria
para nosotros, para filtrar solo la informacin que requerimos en necesario
igualar las llaves de las tablas relacionadas.
END, indica una operacin logia que tiene que ser completada junto con la
que se mostr en el punto anterior.
(venta.id_cliente=2 AND clientes.nombre='Paco'); esta es la ltima de las
instrucciones que requerimos y es en s la que cumple las condiciones
dadas en el problema inicial, bsicamente estamos preguntando por el
identificados del cliente el cual sabemos que es 2 y por el nombre del
mismo que tiene que ser paco, para realizar esta instruccin ambas tienen
que ser verdaderas o correctas ya que se est ocupando un operador AND
entre ellas.
Pero solo puedo ver el identificador del producto que compro el cliente Paco,
Qu sucede si requiero forzosamente el nombre del producto y su precio?,
Cmo me quedara la instruccin SQL a ejecutar?
Primero que nada identificamos las tablas que requerimos para la consulta, en el
caso anterior solo se necesitamos 2, la de clientes que contiene la informacin del
cliente y la de venta que guarda el identificador del producto y tiene relacin con el
cliente; pero ahora necesitamos de las tres tablas ya que el nombre del producto
se y precio est contenido en la tabla productos, la cual no haba sido agregada a
la consulta anterior.
La consulta queda como sigue:
mysql> SELECT productos.descripcion, productos.precio

Ingeniera en sistemas computacionales


31
-> FROM clientes, productos, venta
-> WHERE clientes.id_cliente=venta.id_cliente
-> AND
-> productos.id_producto=venta.id_producto
-> AND
-> (venta.id_cliente=2 AND clientes.nombre='Paco');
El resultado es el siguiente:

Como seguramente ya se dio cuenta solo se agregan pequeas modificaciones a


la consulta original entre las cuales destacan las siguientes:
1.- Se especifica lo que se desea mostrar en el SELECT SELECT
productos.descripcion, productos.precio
2.- Se agrega la tercer tabla al FROM FROM clientes, productos, venta
3.- Agregamos la comparacin de la llave de la tabla productos con la de venta
productos.id_producto=venta.id_producto.
Ahora como seria la consulta si quisiramos que los datos estuvieran ordenados
de mayor a menos con respecto del precio del producto, dicho de otra forma de
manera descendente.
mysql> SELECT productos.descripcion, productos.precio
-> FROM clientes, productos, venta
-> WHERE clientes.id_cliente=venta.id_cliente
-> AND
-> productos.id_producto=venta.id_producto
-> AND
-> (venta.id_cliente=2 AND clientes.nombre='Paco')
-> ORDER BY (precio) DESC;

Solo agregamos la ltima clausula ORDER BY (precio) DESC; que ordenara el


resultado con respecto al precio de forma DESCENDENTE (DESC) aunque podra
ordenarse tambin de forma ASCENDENTE (ASC).
Si bien estas consultas resultas tiles, a veces es necesario realizar ciertas
operaciones con los datos que se obtienen, suponga que va a facturar las
compras del mismo cliente de los ejercicios anteriores, y para eso requiere de un
resultado que contenga tres datos en el siguiente orden.

Ingeniera en sistemas computacionales


32
1.- Nombre del cliente.
2.- Cantidad de compras realizadas (total_productos).
3.- Precio total.
Para el primer punto no tendra que existir problema alguno, pero el punto dos
requiere de contar la cantidad de producto y el punto tres necesita sumar los
precios; para solucionar este problema se hace uso de algunas funciones que
posee MySQL (Apndice D).
La consulta podra quedar as:
mysql> SELECT clientes.nombre,
-> COUNT(productos.id_producto) AS Cantidad,
-> SUM(productos.precio) AS Total
-> FROM clientes,productos,venta
-> WHERE clientes.id_cliente = venta.id_cliente
-> AND
-> productos.id_producto = venta.id_producto
-> AND
-> (venta.id_cliente=2 AND clientes.nombre='Paco');

Y este es el resultado de ejecutar la consulta anterior.

Tal pareciera que a medida que se hacen complejas las consultas, los resultados
reducen su tamao y esto es en parte real ya que los datos son filtrados y tratados
para mostrar informacin ms especfica.

Analicemos la consulta anterior tal como lo hemos estado haciendo, paso por
paso.

La Sentencia SELECT que se usa en esta consulta puede parecer


compleja, pero en realidad no lo es, teniendo la sentencia como sigue:
SELECT clientes.nombre,
COUNT(productos.id_producto) AS Cantidad,
SUM(productos.precio) AS Total

Ingeniera en sistemas computacionales


33
Aunque puedan parecer tres sentencias en realidad es una sola, la cual
est indicando que es lo que quiero mostrar, primero se mostrara el nombre
del cliente (clientes.nombre)

Despus la cantidad que en realidad es el conteo de los identificadores de


los productos (COUNT(productos.id_producto) AS Cantidad)

Por ltimo la suma total del precio de los productos


(SUM(productos.precio) AS Total).

Ya que Cantidad y Total no existen como tal en las tablas hay que
renombrar los resultados con estos nombres, para ello hacemos uso de
AS.

Ahora suponga que quiere saber qu cliente no compro caf (identificador 10004
del caf), esto puede parecer sencillo pero para saber que cliente es, primero
requerimos saber que clientes si compraron caf, por tanto requerimos de dos
consultas una que indique quien si compro caf y otra que indique de los clientes
existentes quien es el que no lo compro.

Procedemos de la siguiente forma, primero la consulta que indica que clientes si


compraron caf.

mysql> SELECT DISTINCT clientes.nombre


-> FROM clientes, venta
-> WHERE clientes.id_cliente=venta.id_cliente
-> AND
-> venta.id_producto=10004;

Nota: Usamos DISTINCT ya que es posible que un mismo cliente pueda haber
comprado ms de un caf, en tal caso su nombre aparecera ms de una vez
porque esta base de datos no est diseada para agregar una cantidad
determinada del mismo producto y ya que es el mismo nombre no lo necesitamos
duplicado, el DISTINCT quitar los datos duplicados y solo lo mostrara una sola
vez.

Este es el resultado de la consulta.

Ingeniera en sistemas computacionales


34
Ahora realizamos la consulta que muestra los nombres.

mysql> SELECT DISTINCT clientes.nombre


-> FROM clientes, venta
-> WHERE clientes.id_cliente=venta.id_cliente;
La siguiente tabla muestra su resultado.

Ahora ya solo hay que combinar ambas consultas para conocer que cliente no
compra caf. La consulta quedara de la siguiente manera.

SELECT DISTINCT clientes.nombre


FROM clientes, venta
WHERE clientes.id_cliente=venta.id_cliente
AND
clientes.nombre NOT IN (SELECT DISTINCT clientes.nombre
FROM clientes,venta
WHERE clientes.id_cliente=venta.id_cliente
AND
venta.id_producto=10004);

Es muy importante (para este caso en particular) la parte se la instruccin que dice
clientes.nombre NOT IN ya que esta evala cuales elementos de la primera
consulta no se encuentra en la segunda, resolviendo as el problema de que
cliente no compra caf.

Recordando el siguiente comando con su resultado continuaremos con este


ejercicio.

Ingeniera en sistemas computacionales


35
Suponga que revisando los datos de su base de datos se percata de un error el
cual es el siguiente. Las galletas tienen en realidad un precio de 15, esto como
puede imaginar es un erro terrible que necesitamos corregir. Para hacer esto
existen varias maneras, una de ellas es eliminar por completo el registro y agregar
los nuevos datos, o actualizar solo el precio incorrecto. En esta seccin veremos la
segunda forma.
Ya que todo en la tabla es correcto excepto en los registros de las galletas y an
en los datos de las galletas todo es correcto menos el precio, solo cambiaremos el
precio de 10 a 15 con la siguiente instruccin haciendo referencia a su
identificador.
mysql> UPDATE productos
-> SET precio=15
-> WHERE id_producto=10003;

En la instruccin anterior se est actualizando la tabla productos y colocaremos en


precio la cantidad de 15 donde el identificador del producto sea igual a 10003 que
no es otro sino el de las galletas.
Ahora imagine que el producto caf no ha tenido buenas ventas y se ha decidido
quitarlo completamente de la lista de productos.
1.- Por el identificador:
mysql> DELETE FROM productos
-> WHERE id_producto=10004;

2.- Por la descripcin del producto:


mysql> DELETE FROM productos
-> WHERE descripcion='cafe';

Ambos comandos eliminaran por completo en los registros que contiene el


producto caf, pero siempre es preferible hacer referencia a la llave o clave
primaria para las consultas.

Ingeniera en sistemas computacionales


36
Otro punto importante que cabe mencionar es que el caf es un producto que
algunos clientes ya haban comprado y al eliminarlo de la lista de productos se
eliminaran tambin los registros de las compras de caf que se hallan hecho; esto
es porque la actualizacin se realiza en cascada, puede corroborar esto
consultando los registros de la tabla venta.

Ahora si lo que queremos es borrar toda una tabla, usamos DROP cuya sintaxis
es:

DROP TABLE nombre_tabla


Por ejemplo borremos la tabla venta y despus ejecutaremos el comando para
visualizar las tablas existentes.

Tal como lo dijimos ya fue borrada la tabla venta, ahora ya que nada relaciona a la
tabla productos con la tabla clientes, podemos decir que la base de datos ya no es
til as que la tenemos que eliminar; para eliminar la base de datos completa de
nueva cuente recurrimos al comando DROP con la siguiente sintaxis.

DROP DATABASE nombre_base_de_datos;

Listo!, de esta forma concluimos este ejercicio.

Ingeniera en sistemas computacionales


37
UNIDAD 4
Seguridad.
Si recuerda en el inicio del captulo anterior usamos un comando en la consola
para entrar a la terminal de MySQL, el comando que usamos fue el siguiente:
mysql -h localhost -u root -p, como ya se explic el comando mysql indique que
usaremos la terminal de MySQL y los otros valores tales como h, -u, -p indican el
host al cual nos conectaremos, el usuario que utilizaremos y por ltimo el
password del usuario en cuestin respectivamente.

Lo que es de nuestro inters en este captulo es la creacin de usuarios, Para


qu? Bueno, puesto que el usuario root (con el cual accedimos en el captulo
anterior) es el administrador de la base de datos, tiene todos los privilegios de
lectura y escritura sobre todas las bases de datos existentes en el ordenador,
ahora bien esto es un problema serio de seguridad ya que al crear alguna base de
datos solo tendrn acceso a ella quienes la necesiten, en caso de existir ms
bases de datos en el mismo ordenador los usuarios que no requieran usar las
otras bases no tendran por qu tener acceso a esas otras bases de datos, e
incluso aquellos que si pueden usar una base de datos en especific es posible
que no necesiten hacer modificaciones a la misma y solo requieran consultar los
datos almacenados.

Es posible crear en MySQL usuarios y restringir las libertades que cada uno tenga
con respecto a las bases de datos existente; por ejemplo se pueden crear usuarios
que solo puedan usar los comandos SELECT para obtener informacin de la base
de datos o crear otros que se encarguen de borrar o actualizar los registros.

Suponga el siguiente caso:

En una escuela se tienen alumnos y profesores, se tiene una tabla con el nombre
de los alumnos, su matrcula de alumno y su calificacin final, y se tiene otra con
la clave del profesor y su nombre. Puede parecer que una base de datos para una
escuela tendra que ser ms compleja y de hecho lo es, pero como ya se dijo lo
que interesa en este captulo es la seguridad y la creacin de usuarios no la
organizacin (la cual se vio en captulos anteriores).

Lo que se quiere en esta base de datos es crear tres usuarios los cuales sern
Padres, Director y Profesor, cada uno tendr una funcin especfica dentro de la
base de datos y es por este motivo que yo usaremos el usuario root para la
administracin de la base de datos. Cada usuario tendr funciones especficas y

Ingeniera en sistemas computacionales


38
roles determinado a realizar.

1.- Los padres de los alumnos puedan ver las calificaciones de sus hijos, mas sin
en cambio los padres no tienen permiso de modificar nada y tampoco pueden ver
la informacin de los profesores.

2.- El director puede visualizar tanto la informacin de los alumnos como la de los
profesores y puede en caso de ser necesario modificar la informacin de los
profesores.

3.- El profesor puede visualizar y modificar la informacin de los alumnos pero no


puede modificar nada mas aunque si es capaz de visualizar los datos de los otros
profesores.

Como se puede dar cuenta cada usuario tiene un papel especfico y ciertas
limitantes de acuerdo a su rol. Por otra parte la base de datos que se especifica en
este ejercicio es la siguiente:

ALUMNO PROFESOR

Como primer paso creamos una base de datos llamada escuela_usuarios siendo
el usuario root, una vez creada, construimos dos tablas Alumno y Profesor, como
se muestran en las imgenes de arriba.

Ya que el usuario root tiene todos los privilegios sobre todas las bases de datos
es este usuario el que utilizaremos para crear a los nuevos usuarios y otorgar los
privilegios pertinentes a cada uno de ellos.
Primero crearemos al usuario Padre que podr solo consultar la informacin de
los alumnos y no podr modificar absolutamente nada y de la misma forma que en
los ejercicios anteriores todo lo haremos por pasos y mostrando los resultados de
las consultas.

1.- Primero accedemos a la consola de MySQL como root con el comando que
ya conocemos: mysql -h localhost -u root -p cuando veamos el Shell de mysql>
creamos la base de datos como se muestra en las imgenes anteriores.

Ingeniera en sistemas computacionales


39
2.- Cuando ya est creada tanto la base de datos como las tablas y ya tengan la
informacin guardada usaremos el siguiente comando para ver que usuario
estamos utilizando (si salir del root).
mysql> SELECT USER();

3.- Si lo que queremos es ver los usuarios existentes entonces tecleamos lo


siguiente:

mysql> USE MYSQL;


mysql> SELECT host, user FROM user;

El motivo por el que existen varios usuarios root es porque estn definidos para
diferentes mbitos, El localhost, remoto y el definido en el sistema, lo que es
de nuestro inters en este caso, es que solo est definido el usuario root y
ningn otro ms.

4.- Definamos el usuario Padre, que visualizara datos de los alumnos y nada ms.
Utilizando la sentencia CREATE crearemos a este nuevo usuario y le otorgaremos
los permisos correspondientes, para ello desde la consola de MSQL siendo el
usuario root tecleamos lo siguiente.
mysql> CREATE USER 'Padre'@'localhost'
-> IDENTIFIED BY 'qazwsx';

El comando SQL anterior crea al usuario Padre y lo hace accesible en el mbito


localhost para ser utilizado, adems coloca un password con la clusula
IDENTIFIED, aunque seguro ya lo dedujo el password para el usuario padre es
qazwsx (sin las comillas).

Ingeniera en sistemas computacionales


40
5.- Una vez creado el usuario padre, procedemos a concederle los permisos
propios de su roll, ya que por el momento no posee ningn permiso por lo tanto no
puede realizar ninguna accin que no sea identificarse en el sistema. Al
concederle el permiso de visualizacin en realidad lo que estaramos haciendo es
otorgarle el permiso de usar el comando SELECT, pero primero veamos los
permisos que ahora posee (aunque ya se especific que no tiene ninguno, no est
de ms corrobralo).

Tecleamos la siguiente instruccin:

mysql> SHOW GRANTS FOR 'Padre'@'localhost';

Tal como se aprecia el usuario Padre en el mbito localhost no posee ningn


privilegio, Otorgumosle el de SELECT.
mysql> GRANT SELECT ON escuela_usuarios.alumno
-> TO 'Padre'@'localhost';

El comando anterior otorgara al usuario Padre en el mbito localhost el privilegio


de usar SELECT en la base de datos escuela_usuarios pero solo en la tabla
alumno.

Recordemos que el operador punto hace referencia a elementos contenidos, as


que para referirnos a la tabla alumno tenemos que hacer referencia primero a la
base de datos a la cual pertenece, escuela_usuarios.alumno.

6.- Creemos los otros dos usuarios, Profesor con privilegios de visualizar ambas
tablas y poder modificar la de los alumnos y Director con privilegios de visualizar
ambas tablas y poder modificar la de los profesores.

Ingeniera en sistemas computacionales


41
Ahora agregamos los permisos, primero los del profesor.

Los pertenecientes al director

7.- Verificaremos los permisos de cada usuario creado con la instruccin


anteriormente vista y refrescaremos los privilegios para que se actualice el
sistema.

Ingeniera en sistemas computacionales


42
Como puede apreciar la tabla de privilegios de cada usuario ya tiene anexados los
comandos a los cuales tiene derecha cada usuario.
8.- Rectificamos la existencia de los usuarios creados en el mbito
correspondiente.

Ingeniera en sistemas computacionales


43
9.- Una vez terminada esta tarea salimos del usuario root y entramos como el
usuario Padre de la misma forma que si se tratara del root, pero cambiando los
aspectos propios de este usuario.
mysql -h localhost -u Padre -p

Como puede observar ya estamos dentro de MySQL como el usuario Padre, que
si recordamos el solo tiene privilegios de visualizacin para la tabla alumno
solamente.

Hasta aqu, todo normal sin ningn problema, pero que pasa si el usuario padre
quiere ir ms all de sus privilegios, como por ejemplo ver la lista de profesores o
querer cambiar la calificacin de algn alumno.

Ingeniera en sistemas computacionales


44
Como se aprecia en las consultas anteriores el usuario no puede hacer otra cosa
que no sea visualizar los datos de la tabla alumno que es la nica sobre la cual
tiene algn privilegio, MySQL le restringe el acceso a todo lo dems brindando as
una mayor seguridad al sistema entero puesto que no existe forma de modificar
algo sin el consentimiento del root.
Ahora entremos como director

Intentemos visualizar los datos a los cuales supuestamente tiene acceso el


director.

Ingeniera en sistemas computacionales


45
No existe ningn problema con la visualizacin de datos; probemos si el director
puede cambiar alguna calificacin (de acuerdo a los permisos que establecimos
no tendra que poder hacerlo).

Los permisos funcionan perfectamente, tal como se aprecia en la imagen.


Ahora ya que vimos cmo funcionan los permisos, le daremos todos los privilegios
posibles al usuario Profesor (Solo con fines didcticos, no porque los necesite),
para esta labor regresamos al usuario root y tecleamos lo siguiente:
mysql> USE escuela_usuarios
mysql> GRANT ALL ON escuela_usuarios.*
-> TO 'Profesor'@'localhost';

Echamos un vistazo a su tabla de permisos.

Como puede ver ya tiene todos los privilegios, pero que pasa si por el contrario
queremos quitrselos, pues bien no existe problema alguno. Para quitar los
privilegios utilizamos la siguiente instruccin.
mysql> REVOKE ALL ON escuela_usuarios.* FROM 'Profesor'@'localhost';
Tenemos que especificar el usuario.
Tenemos que especificar el mbito.
Se especifica el privilegio que se revocara (en este caso todos (ALL)).
Base de datos y tablas (BD.*).

Ingeniera en sistemas computacionales


46
Tal como puede ver el usuario profesor ya no posee ningn privilegio asociado a
l, y si ya no tiene privilegios es ptimo eliminar a dicho usuario. Para eliminar un
usuario de nueva cuenta recurrimos al comando DROP, el cual para este caso se
usa de la siguiente manera.
mysql> DROP USER 'Profesor'@'localhost';
Rectificamos los usuarios existentes.

Ya no existe el usuario profesor, eliminamos tanto a Director como a Padre y


concluimos este ejercicio.

Ingeniera en sistemas computacionales


47
UNIDAD 5
Transacciones.
Las transacciones son un conjunto de instrucciones SQL que tienen la cualidad de
ejecutarse como una unidad, es decir, o se ejecutan todas o no se ejecuta
ninguna. Si una transaccin tiene xito, todas las modificaciones de los datos
realizados durante la transaccin se guardan en la base de datos. Si una
transaccin contiene errores los cambios no se guardaran en la base de datos.
En un sistema ideal, las transacciones deberan garantizar todas las propiedades
ACID (en la prctica, a veces alguna de estas propiedades se simplifica o debilita
con vistas a obtener un mejor rendimiento).
ACID son las siglas de Atomicity, Consistency, Isolation y Durability (Atomicidad,
Consistencia, Aislamiento, Durabilidad)
Atomicidad. Es la propiedad que asegura que la operacin se ha realizado o no, y
por lo tanto ante un fallo del sistema no puede quedar a medias.
Consistencia. Esta propiedad est ligada a la integridad referencial, es decir solo
se pueden escribir datos vlidos respetando los tipos de datos declarados y la
integridad referencial.
Aislamiento. Asegura que una operacin no puede afectar a otras. Con esto se
asegura que varias transacciones sobre la misma informacin sean
independientes y no generen ningn tipo de error.
Durabilidad. Cuando se completa una transaccin con xito los cambios se
vuelven permanentes.
El ejemplo clsico de transaccin es una transferencia bancaria, en la que
quitamos saldo a una cuenta y lo aadimos en otra. Si no somos capaces de
abonar el dinero en la cuenta de destino, no debemos quitarlo de la cuenta de
origen.
Para implementar transacciones en MySQL hay que utilizar la versin 5.0.x y el
motor de almacenamiento InnoDB.
Una transaccin tiene dos finales posibles, COMMIT (se ejecutan todas las
instrucciones y guardamos los datos) y ROLLBACK (se produce un error y no se
guardan los cambios). Por defecto, MySQL trae activado el modo autocommit, por
lo que cuando se realiza una transaccin (INSERT, UPDATE o DELETE) esta se
confirma automticamente. Para desactivar esta opcin se debe ejecutar el

Ingeniera en sistemas computacionales


48
siguiente comando (no recomendado):
> SET AUTOCOMMIT=0;
o tambin se puede desactivar para una serie de comandos utilizando START
TRANSACTION. (Esto es lo recomendado)
> START TRANSACTION;
> .....
> COMMIT;
Hay que tener en cuenta que al realizar una transaccin SQL que cuando se
realice un INSERT, UPDATE o DELETE se generar un bloqueo sobre la tabla y
que otros clientes no pueden acceder esta para escribir. Pero si podrn realizar
lecturas, en las que no podrn ver los datos del primer cliente hasta que los
mismos sean confirmados.
Nota: InnoDB dota a MySQL de un motor de almacenamiento transaccional
(conforme a ACID) con capacidades de commit (confirmacin), rollback
(cancelacin) y recuperacin de fallas. Esto no es posible si el sistema operativo
subyacente y el hardware no funcionan como se requiere. Muchos sistemas
operativos o subsistemas de disco podran diferir o reordenar operaciones de
escritura a fin de mejorar el rendimiento.
Planteemos el siguiente caso:
Existe una librera con diversos ttulos a la venta, de cada libro se guarda cierta
informacin. Existen tambin clientes y se lleva un registro de cada uno de ellos,
entre lo ms destacable es que se guarda el total de gastos que ha realizado y
para llevar el control de las ventas existe una tabla llamada venta, para que no
resulte confuso en la parte de abajo se agregan las tablas.
CLIENTE LIBRO

Ingeniera en sistemas computacionales


49
VENTA

Los clientes registrados compran uno o varios libros, lo que se desea es guardar
en gasto el total que haya gastado el cliente independientemente de los libros
comprados y de la cantidad de los mismos, solo se quiere l total de todo lo que el
clienta haya gastado.
Se agrega a continuacin el cdigo para la creacin de la base de datos anterior,
ya teniendo en cuenta lo expuesto en el principio del captulo.
CREATE DATABASE libreria;
USE libreria;

CREATE TABLE cliente (


id_cliente int(11) NOT NULL AUTO_INCREMENT,
nombre varchar(20) NOT NULL,
gasto int(10) unsigned zerofill DEFAULT NULL,
PRIMARY KEY (id_cliente)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Tabla libro
-- ----------------------------
CREATE TABLE libro (
ISBN varchar(10) CHARACTER SET utf8 NOT NULL,
titulo varchar(30) NOT NULL,
autor varchar(10) NOT NULL,
precio int(11) NOT NULL,
PRIMARY KEY (ISBN)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Tabla venta
-- ----------------------------
CREATE TABLE venta (
Ingeniera en sistemas computacionales
50
num_venta int(11) NOT NULL AUTO_INCREMENT,
id_cliente int(11) NOT NULL,
ISBN varchar(10) NOT NULL,
cantidad int(11) NOT NULL,
PRIMARY KEY (num_venta),
KEY id_cliente (id_cliente),
KEY ISBN (ISBN),
CONSTRAINT id_cliente FOREIGN KEY (id_cliente) REFERENCES cliente
(id_cliente) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT ISBN FOREIGN KEY (ISBN) REFERENCES libro (ISBN)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
-- ----------------------------
-- DATOS
-- ----------------------------
INSERT INTO cliente VALUES (1, 'Hugo', null);
INSERT INTO cliente VALUES (2, 'Paco', null);
INSERT INTO cliente VALUES (3, 'Luis', null);
INSERT INTO cliente VALUES (4, 'Ana', null);
INSERT INTO libro VALUES ('asd-234', 'La divina comedia', 'Dante', 150);
INSERT INTO libro VALUES ('edc-876', 'El temor de un hombre sabio', 'Rotfuss',
450);
INSERT INTO libro VALUES ('qaz-098', 'Depredador', 'Freeman', 300);
INSERT INTO libro VALUES ('qaz-123', 'miPropiolibro', 'yo mero', 1500);
INSERT INTO libro VALUES ('qwe-123', 'Frankenstein', 'Shelly', 70);
INSERT INTO libro VALUES ('rfv-654', 'el paraiso perdido', 'John Milto', 200);
INSERT INTO libro VALUES ('wsx-987', 'El nombe del viento', 'Rotfuss', 350);
INSERT INTO libro VALUES ('zxc-345', 'Cumbres borrascosas', 'Emilly', 120);
INSERT INTO ventaVALUES (1, 1, 'edc-876', 1);
INSERT INTO venta VALUES (2, 2, 'qaz-123', 2);
INSERT INTO ventaVALUES (3, 3, 'rfv-654', 1);
INSERT INTO venta VALUES (4, 4, 'wsx-987', 3);
INSERT INTO ventaVALUES (5, 2, 'zxc-345', 2);
INSERT INTO venta VALUES (6, 4, 'asd-234', 3);
INSERT INTO ventaVALUES (7, 1, 'rfv-654', 1);

Aunque quiz pueda parecer un poco confuso el cdigo anterior, en realidad el


cambio ms significativo es el agregado al final de cada tabla (ENGINE=InnoDB
DEFAULT CHARSET=utf8;) lo cual indica que usaremos InnoDB lo cual indica que
podemos usar transacciones y CHARSET que indica el juego de caracteres que
se utilizarn.

Ahora ya entrando en materia, lo que nosotros queremos es crea una transaccin


que me permita colocar el total de gastos de un cliente en su respectivo sitio.

Ingeniera en sistemas computacionales


51
Como se ha hecho anteriormente se realizara esta consulta en forma de pasos a
seguir.

1.- Primero tenemos que conocer las cantidades de libros que determinado cliente
adquiri, para ello escribimos la siguiente consulta (para este ejemplo
trabajaremos por el momento solo con el cliente 4).

mysql> SELECT cantidad FROM venta WHERE id_cliente=4;

Lo cual mostrara el siguiente resultado.

Esto indica que compro tres libros de cierto ejemplar y ms de otro ejemplar.

2.- Ahora busquemos los precios de cada libro que compro el cliente 4.

mysql> SELECT libro.precio


-> FROM libro, venta
-> WHERE libro.ISBN=venta.ISBN
-> AND
-> venta.id_cliente=4;

Mostramos el resultado correspondiente a la anterior consulta.

Ya sabemos entonces que el cliente con el identificador 4 compro 3 libros de 350 y


3 libros de 150, solo falta crear la transaccin que multiplique los valores
respectivos, los sume y actualice el registro correspondiente (Fcil no?).

3.- Los valores anteriores los podemos guardar usando variables en MySQL, lo
que cambiara la primer instruccin a la siguiente forma.

Ingeniera en sistemas computacionales


52
SELECT @Cant:= cantidad FROM venta WHERE id_cliente=4;

4.- Modificamos la segunda consulta para que sume los valores y muestre un total.

mysql> SELECT sum(libro.precio * @Cant) AS total


-> FROM libro , venta
-> WHERE libro.ISBN=venta.ISBN
-> AND
-> venta.id_cliente=4;

Cuyo resultado es como se muestra a continuacin.

El total que el usuario con el identificador 4 gast es 1500 y lo podemos corroborar


con las siguientes operaciones:

3 * 350 = 1050
3 * 150 = 450

1050 + 450 = 1500

Tal como lo indica el resultado que obtuvimos con la consulta.

5.- Creamos la Transaccin con los comandos antes vistos y agregamos la


actualizacin.

mysql> SET AUTOCOMMIT=0;

mysql> START TRANSACTION;

mysql> SELECT @Cant:= cantidad FROM venta WHERE id_cliente=4;

mysql> SELECT @Tot:= sum(libro.precio * @Cant) AS total


-> FROM libro , venta
-> WHERE libro.ISBN=venta.ISBN
-> AND
-> venta.id_cliente=4;

Ingeniera en sistemas computacionales


53
mysql> UPDATE cliente
-> SET gasto=@Tot
-> WHERE id_cliente=4;

mysql> COMMIT;

mysql> SET AUTOCOMMIT=1;

6.- Verificamos los resultados.

Como se aprecia en la imagen de arriba, se coloca en su respectivo sitio de forma


automtica el total de lo que ha gastado el usuario Ana.

Ingeniera en sistemas computacionales


54
UNIDAD 6
SQL Procedural.
PROCEDIMIENTOS ALMACENADOS.

Los procedimientos almacenados y funciones son nuevas funcionalidades de la


versin de MySQL 5.0. Un procedimiento almacenado es un conjunto de
comandos SQL que pueden almacenarse en el servidor. Una vez que se hace, los
clientes no necesitan relanzar los comandos individuales pero pueden en su lugar
referirse al procedimiento almacenado.
Algunas situaciones en que los procedimientos almacenados pueden ser
particularmente tiles:
Cuando mltiples aplicaciones cliente se escriben en distintos lenguajes o
funcionan en distintas plataformas, pero necesitan realizar la misma operacin en
la base de datos.
Cuando la seguridad es muy importante. Los bancos, por ejemplo, usan
procedimientos almacenados para todas las operaciones comunes. Esto
proporciona un entorno seguro y consistente, y los procedimientos pueden
asegurar que cada operacin se loguea apropiadamente.
En tal entorno, las aplicaciones y los usuarios no obtendran ningn acceso directo
a las tablas de la base de datos, slo pueden ejecutar algunos procedimientos
almacenados.
Los procedimientos almacenados pueden mejorar el rendimiento ya que se
necesita enviar menos informacin entre el servidor y el cliente. El intercambio que
hay es que aumenta la carga del servidor de la base de datos ya que la mayora
del trabajo se realiza en la parte del servidor y no en el cliente.
Teniendo en mente la utilidad de los procedimientos almacenados procederemos
a la creacin de estos.
Utilizaremos la base de datos que creamos en el captulo anterior para ejemplificar
el uso de los procedimientos almacenados y mejorar ciertas consultas realizadas
con anterioridad.
Primero un procedimiento muy sencillo, ya que los procedimientos contienen una
serie de instrucciones SQL en su interior hay que cambiar el delimitador que
MySQL usa por default (;) por alguno que no se utilice en ninguna sentencia SQL

Ingeniera en sistemas computacionales


55
como podran ser // o $$ o alguna otra combinacin.
mysql> DELIMITER //
mysql> CREATE PROCEDURE muestra_lib()
-> BEGIN
-> SELECT * FROM libro;
-> END
-> //
mysql> DELIMITER ;

mysql> CALL muestra_lib();

Primero cambiamos el delimitador por otro que no se utilice en las


sentencias SQL, esto es porque dentro de los procedimientos almacenados
tenemos que usar instrucciones SQL que como todas requiere terminar en
(;). Para cambial el delimitador usamos la sentencia DELIMITER seguido
del nuevo delimitador que para este caso en partculas es //.
Utilizamos la sentencia CREATE PROCEDURE para crear nuestro nuevo
procedimiento, seguido del nombre con el cual queremos llamarlo y entre
parntesis la lista de argumentos que requiere para su funcionamiento, si
los parntesis se encuentran vacos como en este caso se considera que
no requiere de ningn valor extra para funcionar.
Escribimos la palabra BEGIN la cual indica el principio de nuestro
proceso.
Escribimos la sentencia SQL que queremos ejecutar cuando llamemos a
este proceso, esta sentencia la escribimos de forma normal terminndola
con (;) como comnmente se hace, si no estableci el nuevo delimitador al
terminar su consulta SQL tendr un error.
Escribimos END que marca el fin de nuestro procedimiento
Terminamos la instruccin completa con el delimitador que establecimos.
Regresamos el delimitador a su estado original.
Usamos CALL y el nombre del procedimiento encerrando entre parntesis
los argumentos necesarios. Para este caso el procedimiento solo guarda
una simple instruccin SELECT, pero iremos agregando ms instrucciones
a medida que avancemos en la lectura.
Corroboramos el resultado de la consulta anterior el cual tendra que ser el
siguiente:

Ingeniera en sistemas computacionales


56
Anterior mente se mencion que es posible mandar argumentos a los
procedimientos almacenados, los argumentos no son otra cosa ms que datos tal
como los ocupados al crear las tablas en MySQL pero al usarlos como
argumentos los hay de dos tipos,

Entrada (IN): Son declarados y usados para enviar datos a los


procedimientos, si no se especifica que un dato es de entrada (IN) MySQL
los tomara como tales, como entrada de datos.

Salida (OUT): Son usados para guardar los resultados de la consulta, es


necesario especificar que son de salida (OUT) o MySQL los tomara como
datos de entrada.

Hagamos un procedimiento que obtenga los datos de un libro buscando por su


autor y partes de su nombre.

mysql> DELIMITER //
mysql> CREATE PROCEDURE buscar(var_1 CHAR(3))
-> BEGIN
-> SELECT * FROM libro WHERE autor LIKE var_1;
-> END
-> //
mysql> DELIMITER ;

Con este procedimiento ya podemos buscar los libros utilizando parte del nombre
del autor, por ejemplo si queremos que aparezcan los que libros cuyo autor
comienza con R lo hacemos de la siguiente manera.

mysql> CALL buscar('R%');

Ingeniera en sistemas computacionales


57
O si queremos los autores que tengan una e en su nombre.
mysql> CALL buscar('%e%');
Mostramos los resultados para cada consulta respectivamente.

Resultado de la primera consulta:

Resultado de la segunda consulta:

Hagamos un nuevo procedimiento que me arroje el conteo de libros que cumplan


ciertas caractersticas como en el ejemplo anterior.

mysql> DELIMITER //
mysql> CREATE PROCEDURE cuenta(var_1 CHAR(3), OUT conteo INT)
-> BEGIN
-> SELECT count(ISBN)
-> INTO conteo
-> FROM libro
-> WHERE autor LIKE var_1;
-> END
-> //
mysql> DELIMITER ;

Queremos el conteo de libros cuyos autores tengan una o en su nombre, as que


llamamos a nuestro procedimiento cuenta de la siguiente forma.

mysql> CALL cuenta('%o%',@num);

Pero Dnde est el resultado?, la respuesta es simple en la variable @num ya


que es nuestra variable de salida as que tecleamos la siguiente instruccin.

Ingeniera en sistemas computacionales


58
mysql> SELECT @num;

Y mostrara el conteo de los autores registrados que tienen una o en su nombre.

Lo anterior podemos reducirlo a una sola consulta de la siguiente forma.

mysql> DELIMITER //
mysql> CREATE PROCEDURE cuenta2(var_1 CHAR(3))
-> BEGIN
-> DECLARE conteo INT;
-> SELECT count(ISBN)
-> FROM libro
-> WHERE autor LIKE var_1
-> INTO conteo;
-> SELECT conteo;
-> END
-> //mysql> DELIMITER ;

Invoquemos el procedimiento cuenta2 de la siguiente manera tomando en cuenta


el ejercicio anterior.

mysql> CALL cuenta2('%o%');

Mostramos el resultado.

Tal como se aprecia es muy efectivo agrupar sentencia SQL para realizar tareas
especficas. Es muy importante mencionar que MySQL no soporta sobrecarga de
procedimientos, por tal motivo no pueden existir procedimientos almacenados con
el mismo nombre.

Resolvamos con procedimientos almacenados el problema del gasto total del


captulo anterior.
Ingeniera en sistemas computacionales
59
Haciendo memoria de lo se tena que resolver era que se actualizara de forma
automtica el gasto realizado por un cliente, para esto creamos ciertas consultas
que sern utilizadas nuevamente con algunas pequeas modificaciones, por tal
razn el procedimiento al que nos referimos quedara de la siguiente manera.
mysql> DELIMITER //
mysql> CREATE PROCEDURE actualiza_gasto(id INT)
-> BEGIN
-> DECLARE Total INT;
-> SELECT @Cant:= cantidad FROM venta WHERE id_cliente=id;
-> SELECT sum(libro.precio * @Cant) AS total
-> FROM libro , venta
-> WHERE libro.ISBN=venta.ISBN
-> AND
-> venta.id_cliente=id
-> INTO Total;
-> UPDATE cliente
-> SET gasto=Total
-> WHERE id_cliente=id;
-> END
-> //
mysql> DELIMITER ;

Como puede apreciar, en este procedimiento tenemos tres consultas trabajando


en conjunto (tal como en el captulo anterior) aunque para este caso han sido
ligeramente modificadas. Para invcalo hacemos lo siguiente.

mysql> CALL actualiza_gasto(1);

Y revisamos la tabla del cliente.

Como se aprecia se actualiza el registro del cliente con el identificador 1.

Ahora si lo que se desea es conocer los procedimientos almacenados existentes


en la base de datos introducimos la siguiente instruccin.

mysql> SELECT specific_name


-> FROM information_schema.routines;

Ingeniera en sistemas computacionales


60
Y nos mostrara una lista con los procedimientos almacenados en la base de datos.
Algo parecido a la siguiente tabla.

Si se desea conocer el contenido de un procedimiento del cual sabemos el


nombre usamos la siguiente instruccin.

mysql> SELECT routine_definition


-> FROM information_schema.routines
-> WHERE specific_name='cuenta2';

Este ejemplo para el procedimiento llamado cuenta2 cuyo resultado es el


siguiente.

Si lo que desea es eliminar un procedimiento se utiliza el ya muy conocido DROP


bajo la siguiente sintaxis.

DROP PROCEDURE nombre_del_procedimiento;

Eliminemos el procedimiento cuenta;

mysql> DROP PROCEDURE cuenta;


Ingeniera en sistemas computacionales
61
DISPARADORES (TRIGGERS)

A partir de MySQL 5.0.2 se incorpor el soporte bsico para disparadores


(triggers). Un disparador es un objeto con nombre dentro de una base de datos el
cual se asocia con una tabla y se activa cuando ocurre en sta un evento en
particular. Por ejemplo, las siguientes sentencias crean una tabla y un disparador
para sentencias INSERT dentro de la tabla. El disparador suma los valores
insertados en una de las columnas de la tabla:

mysql> CREATE DATABASE trigg;


mysql> USE trigg;

mysql> CREATE TABLE salarios (id INT, monto DECIMAL(10,2));

mysql> CREATE TRIGGER sum_monto BEFORE INSERT ON salarios


-> FOR EACH ROW SET @sum = @sum + NEW.monto;

Un disparador es un objeto con nombre en una base de datos que se asocia con
una tabla, y se activa cuando ocurre un evento en particular para esa tabla.
El disparador queda asociado a la tabla nombre_tabla. Esta debe ser una tabla
permanente, no puede ser una tabla TEMPORARYni una vista.
momento_dispes el momento en que el disparador entra en accin. Puede ser
BEFORE (antes) o AFTER (despues), para indicar que el disparador se ejecute
antes o despus que la sentencia que lo activa.
evento_disp indica la clase de sentencia que activa al disparador. Puede ser
INSERT, UPDATE, o DELETE. Por ejemplo, un disparador BEFORE para
sentencias INSERT podra utilizarse para validar los valores a insertar.
No puede haber dos disparadores en una misma tabla que correspondan al mismo
momento y sentencia. Por ejemplo, no se pueden tener dos disparadores
BEFORE UPDATE. Pero s es posible tener los disparadores BEFORE UPDATE y
BEFORE INSERT o BEFORE UPDATE y AFTER UPDATE. sentencia_disp es la
sentencia que se ejecuta cuando se activa el disparador. Si se desean ejecutar
mltiples sentencias, deben colocarse entre BEGIN... END, el constructor de
sentencias compuestas. Esto adems posibilita emplear las mismas sentencias
permitidas en rutinas almacenadas.

Veamos un pequeo ejemplo del uso de los Triggers.

Ingeniera en sistemas computacionales


62
mysql> USE trigg;

mysql> CREATE TABLE prueba1(a1 INT);


mysql> CREATE TABLE prueba2(a2 INT);

mysql> CREATE TABLE prueba3(a3 INT NOT NULL AUTO_INCREMENT


PRIMARY KEY);

mysql> CREATE TABLE prueba4(


-> a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> b4 INT DEFAULT 0);

mysql> DELIMITER //

mysql> CREATE TRIGGER prueba_ref BEFORE INSERT ON prueba1


-> FOR EACH ROW BEGIN
-> INSERT INTO prueba2 SET a2 = NEW.a1;
-> DELETE FROM prueba3 WHERE a3 = NEW.a1;
-> UPDATE prueba4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
-> END
-> //

mysql> DELIMITER ;

mysql> INSERT INTO prueba3 (a3) VALUES


-> (NULL), (NULL), (NULL), (NULL), (NULL),
-> (NULL), (NULL), (NULL), (NULL), (NULL);

mysql> INSERT INTO prueba4 (a4) VALUES


-> (0), (0), (0), (0), (0), (0), (0), (0), (0), (0);

EL trigger que creamos afecta a todas las tablas, pero solo se dispara cuando se
inserta en la tala prueba1, sigamos con el ejemplo.

mysql> INSERT INTO prueba1 VALUES


-> (1), (1), (2), (3), (5), (8), (13), (21), (34), (55);

Verificamos que efectivamente se hayan modificado las otras tablas asociadas.

mysql> SELECT * FROM prueba1;


SELECT * FROM prueba2;
SELECT * FROM prueba3;
SELECT * FROM prueba4;

Ingeniera en sistemas computacionales


63
Y mostramos los resultados.

Como se puede dar cuenta las otras tablas cambian respecto a la primera (a1), el
cambio depende de las sentencias agregadas en el trigger.
Tambin hay limitaciones sobre lo que puede aparecer dentro de la sentencia que
el disparador ejecutar al activarse:
El disparador no puede referirse a tablas directamente por su nombre, incluyendo
la misma tabla a la que est asociado. Sin embargo, se pueden emplear las
palabras clave OLD y NEW. OLD se refiere a un registro existente que va a
borrarse o que va a actualizarse antes de que esto ocurra.
NEW se refiere a un registro nuevo que se insertar o a un registro modificado
luego de que ocurre la modificacin.
El disparador no puede invocar procedimientos almacenados utilizando la
sentencia CALL. (Esto significa, por ejemplo, que no se puede utilizar un
procedimiento almacenado para eludir la prohibicin de referirse a tablas por su
nombre).
El disparador no puede utilizar sentencias que inicien o finalicen una transaccin,
tal como START TRANSACTION, COMMIT, o ROLLBACK.
Creemos otro Trigger que evale alguna condicin dada (utilizaremos la misma
base de datos y la misma tabla que fue creada al inicio de esta seccin).
Agregamos el cdigo del trigger.
mysql> DELIMITER //

Ingeniera en sistemas computacionales


64
mysql> CREATE TRIGGER revizar BEFORE UPDATE ON salarios
-> FOR EACH ROW
-> BEGIN
-> IF NEW.monto < 0 THEN
-> SET NEW.monto = 0;
-> ELSEIF NEW.monto > 100 THEN
-> SET NEW.monto = 100;
-> END IF;
-> END;
-> //
mysql> DELIMITER ;

Activamos el disparador, para este caso se activa con el comando UPDATE.

mysql> UPDATE salarios


-> SET monto = -20
-> WHERE id=1;

En teora con la sentencia anterior tendra que guardarse en el id 1 un -20, pero


como la tabla tuene asignado un disparador con la sentencia UPDATE se
guardar en realidad un 0.

Mostramos el contenido de la tabla que sufri la actualizacin.

Obviamente usted la introdujo datos en la tabla con anterioridad.


Si lo que deseamos es eliminar un trigger lo eliminamos con DROP, siguiendo la
sintaxis expuesta a continuacin.
DROP TRIGGER nombre_del_trigger;
Ahora lo utilizamos.
mysql> DROP TRIGGER revizar;

Ingeniera en sistemas computacionales


65
UNIDAD 7
Conectividad de Bases de Datos.
ODBC

Qu es el ODBC?
Open Data Base Conectivity
O lo que es lo mismo, conectividad abierta de bases de datos. Si escribimos
una aplicacin para acceder a las tablas de una DB de Access, qu ocurrir si
despus queremos que la misma aplicacin, y sin reescribir nada, utilice tablas de
SQL Server u otra DB cualquiera? La respuesta es sencilla: no funcionar.
Nuestra aplicacin, diseada para un motor concreto, no sabr dialogar con el
otro. Evidentemente, si todas las DB funcionaran igual, no tendramos este
problema.... aunque eso no es probable que ocurra nunca.
Pero si hubiera un elemento que por un lado sea siempre igual, y por el otro sea
capaz de dialogar con una DB concreta, solo tendramos que ir cambiando este
elemento, y nuestra aplicacin siempre funcionara sin importar lo que hay al otro
lado... algo as como ir cambiando las boquillas de una manguera. A esas piezas
intercambiables las llamaremos orgenes de datos de ODBC
Casi todas las DB actuales tienen un ODBC. Debido a que este elemento impone
ciertas limitaciones, ya que no todo lo que la DB sabe hacer es compatible con la
aplicacin, como velocidad de proceso, tiempos de espera, mxima longitud de
registro, nmero mximo de registros, versin de SQL, etc., est cayendo en
desuso a cambio de otras tcnicas de programacin, pero an le quedan muchos
aos de buen servicio.
Esta es la idea: por un lado el ODBC provee de unas caractersticas siempre
homogneas, y por el otro permite distintos controladores que aseguran la
conectividad de la aplicacin con diferentes bases de datos.

Ingeniera en sistemas computacionales


66
En Windows el registro de conectores ODBC se hace en esta seccin llamada
Administrador de origen de datos la cual est disponible desde el panel de control.

JDBC (Java DataBase Connectivity

JDBC (Java DataBase Connectivity conexin de base de datos desde Java) es


una API (Application Programming Interface interfaz de programacin de
aplicaciones) de Java, proporcionada por un conjunto de clases, que permite
ejecutar instrucciones SQL para manipular y gestionar bases de datos
relacionales. Para que una aplicacin Java pueda hacer operaciones sobre una
base de datos, previamente tiene que establecer una conexin con la misma. Esta
conexin se realiza a travs de un controlador (driver) segn muestra la figura
siguiente. La funcin del controladores traducir los mensajes propietarios de bajo
nivel del sistema base de datos a mensajes de bajo nivel de la API JDBC y
viceversa.

Ingeniera en sistemas computacionales


67
Aplicacin Java

JDBC

Controlador (driver)

Base de datos

La API JDBC se proporciona en dos paquetes: java.sql y javax.sql. El primer


paquete, que forma parte de J2SE, contiene las interfaces y clases Java
fundamentales de JDBC. Entre ellas, cabe destacar las dispuestas en la siguiente
tabla:

Driver Permite conectarse a una base de datos. Cada sistema


administrador de base de datos requiere un controlador
(driver) especifico
DriverManager Permite gestionar todos los controladores instalados en la
JVM.
DriverProperyInfo Proporciona diversa informacin acerca de un controlador.
Connection Representa una conexin con una base de datos. Una
aplicacin puede tener abiertas mltiples conexiones con
varias bases de datos.
DataBaseMetaData Proporciona informacin acerca de una base de datos; por
ejemplo, nombre de la base, nombre del controlador,
nmero mximo de conexiones disponibles, etc.
Statement Permite ejecutar sentencias SQL sin parmetros
PreparedStatement Permite ejecutar sentencias SQL con parmetros de
entrada.
CallableStatement Permite ejecutar sentencias SQL con parmetro de entrada
y salida (procedimientos almacenados)
ResultSet Conjunto de resultados. Contiene las filas obtenidas al
ejecutar una sentencia SELECT.
ResultSetMetaData Permite obtener informacin sobre un ResultSet; por
ejemplo, el nmero de columnas, sus nombres, sus tipos,
etc.

Ingeniera en sistemas computacionales


68
De estas clases, cualquier aplicacin Java utilizara casi siempre estas 4;
DriverManager, utilizada para crear un objeto Connection, objeto que ser utilizado
para crear un objeto Statement, que a su vez ser utilizado para crear un objeto
ResultSet.

El paquete javax.sql tambin se suministra con J2SE. Es una extensin de java.sql


e incluye las clases que interactan con JNDI (Java Naming and Directory
Interface) y otras que gestionas conjuntos de conexiones en una misma base de
datos, entre otras caractersticas avanzadas de JDBC.
Siguiendo el modo de conexin expuesto, fabricantes particulares proporcionan
controladores (drivers) especficos para acceder a sus sistemas de base de datos.
Un controlador JDBC es una clase que implementa la interfaz que proporciona los
mtodos necesarios para acceder a los datos de la base de datos.
Hay distintos tipos de controladores JDBC. Este tipo de controlador es especfico
para una base de datos; por lo tanto, si por cualquier circunstancia cambiamos de
motor de base de datos, tenemos que cambiar tambin de controlador y utilizar
otro que haya sido escrito para el nuevo motor utilizado.

ADO.NET

ADO.NET es un conjunto de clases que exponen servicios de acceso a datos para


el programador de .NET. ADO.NET ofrece abundancia de componentes para la
creacin de aplicaciones de uso compartido de datos distribuidas. Constituye una
parte integral de .NET Framework y proporciona acceso a datos relacionales, XML
y de aplicaciones. ADO.NET satisface diversas necesidades de desarrollo, como
la creacin de clientes de base de datos de aplicaciones para usuario y objetos
empresariales de nivel medio que utilizan aplicaciones, herramientas, lenguajes o
exploradores de Internet.

CONEXIONES A LENGUAJE DE PROGRAMACIN

Se agregar a continuacin el cdigo de conexin del lenguaje de programacin


con tres diferentes SGBD, Access, ORACLE y MySQL, sern agregados en este
mismo orden.

Ingeniera en sistemas computacionales


69
CONEXIN A ACCESS DESDE JAVA

import java.sql.*;
import javax.swing.JOptionPane;

public class ConectaAcces{

//Aqui
agregue la direccion fisica de su Base de datos
private String url_acces="jdbc:odbc:Driver={Microsoft Access Driver (*.mdb,
*.accdb)};DBQ=H:\\alumnos\\Datos.accdb"; //colocar la direccin fsica de la BD
private String usuario="";
private String pasword="";
private Connection miConexion=null;
private Statement miEstatuto_acc=null;
private ResultSet tabla;

//Metodo para conectas a la base de datos


public Statement conecta_acces() {
int acces=0;
try{//Registramos el driver
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
System.out.println("Driver OK...");
acces++;
}
catch(Exception ex ){
System.out.println("Error al registrar el driver...");
}

try{//Se realiza la Conexin


miConexion=DriverManager.getConnection(url_acces,usuario,pasword);
if(miConexion!=null){
System.out.println("Conexion OK...");
acces++;
}
}
catch(Exception ex){
System.out.println("Error en la conexion...");
}

try{//Se crea el estatuto,acuerdo,permiso


miEstatuto_acc=miConexion.createStatement();
System.out.println("Estatuto OK...");
Ingeniera en sistemas computacionales
70
acces++;
}
catch(Exception ex){
System.out.println("Error con el estatuto...");
}
if(acces==3){
JOptionPane.showMessageDialog(null,"ESTADO DE LA
CONEXION","ACCES SE CONECTO",JOptionPane.INFORMATION_MESSAGE);
}else{
JOptionPane.showMessageDialog(null,"ESTADO DE LA
CONEXION","ACCES NO SE CONECTO",JOptionPane.ERROR_MESSAGE);
}
return miEstatuto_acc;
}
}

CONEXIN A ORACLE 10g DESDE JAVA

import java.sql.*;
import javax.swing.JOptionPane;

public class ConectaOracle{

//Aqui
agregue la direccion fisica de su Base de datos
private String url_oracle ="jdbc:oracle:thin:@localhost:1521:XE";
private String usuario="";
private String pasword="";
private Connection miConexion=null;
private Statement miEstatuto_oracle=null;
private ResultSet tabla;

//Metodo para conectas a la base de datos


private Statement conecta_oracle() {
int oracle=0;
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("OK Driver");
oracle++;
}
catch(Exception ex){

Ingeniera en sistemas computacionales


71
System.out.println("error al registrar el driver");
}
try{
miConexion=DriverManager.getConnection(url_oracle,usuario,pasword);
if(miConexion!=null){
System.out.println("conexion ok");
oracle++;
}

}catch(Exception exe){
System.out.println("error con la conexion");
}

try{
miEstatuto_oracle=miConexion.createStatement();
System.out.println("ok en el acuerdo");
oracle++;

}catch(SQLException exep){
System.out.println("error al crear el estatuto");

}
if(oracle==3){
JOptionPane.showMessageDialog(this,"ESTADO DE LA
CONEXION","ORACLE SE
CONECTO",JOptionPane.INFORMATION_MESSAGE);
}else{
JOptionPane.showMessageDialog(this,"ESTADO DE LA
CONEXION","ORACLE NO SE CONECTO",JOptionPane.ERROR_MESSAGE);
}
}
return miEstatuto_oracle;
}

Para realizar la conexin desde Java a Oracle es necesario agregar el driver


correspondiente a su proyecto, de lo contrario no se establecer la conexin, dicho
driver puede ser descargado de la pgina oficial de Oracle.

Ingeniera en sistemas computacionales


72
CONEXIN A MySQL DESDE JAVA

import java.sql.*;
import javax.swing.JOptionPane;

public class Conexion {

private String url_sql ="jdbc:mysql://localhost/libreria";


private String usuario="root";
private String pasword="";
private Connection miConexion=null;
private Statement miEstatuto_sql=null;

public Statement conecta_sql() {


int sql=0;
try{

Class.forName("com.mysql.jdbc.Driver").newInstance();
System.out.println("CORRECTO CON EL DRIVER");
sql++;
}catch(Exception e){
System.out.println("ERROR CON EL DRIVER");
}

try{
miConexion=DriverManager.getConnection(url_sql,usuario,pasword);
System.out.println(url_sql+usuario+pasword);
if(miConexion!=null){
System.out.println("CONEXION OK..");
sql++;
}
}catch(Exception er){
System.out.println("ERROR CON LA CONEXION");
}

try{
miEstatuto_sql=miConexion.createStatement();
System.out.println("ESTATUTO OK..");
sql++;
}catch(Exception err){
System.out.println("ERROR CON EL ESTATUTO");
}

Ingeniera en sistemas computacionales


73
if(sql==3){
JOptionPane.showMessageDialog(null,"ESTADO DE LA CONEXION","SQL
SE CONECTO",JOptionPane.INFORMATION_MESSAGE);
}else{
JOptionPane.showMessageDialog(null,"ESTADO DE LA CONEXION","SQL
NO SE CONECTO",JOptionPane.ERROR_MESSAGE);
}

return miEstatuto_sql;
}
}

Para realizar la conexin desde Java a MySQL es necesario agregar el driver


correspondiente a su proyecto, de lo contrario no se establecer la conexin, dicho
driver puede ser descargado de la pgina oficial de MySQL.

Ingeniera en sistemas computacionales


74
Apndice A
Tipos De Datos En MySQL
Tipos de Datos Numricos:
Los tipos de datos numricos son como sigue:

TIPO DE DATO
1 BIT
2 TINYINT
3 BOOLEAN
4 SMALLINT
5 MEDIUMINT
6 INT
7 INTEGER
8 BIGINT
9 FLOAT
10 DOUBLE
11 DECIMAL

Vamos a ver los tipos de datos numricos de manera abreviada.

TIPO DE DATO DESCRIPCIN


BIT BIT es un sinnimo de TINYINT.
TINYINT Un nmero entero muy pequeo. El rango suscrito va de -
128 a 127. El rango no suscrito va de 0 a 255.
BOOLEAN Estos tipos son sinnimos de TINYINT. Un valor para cero es
considerado falso. Valores que no sean cero son
considerados verdad.
SMALLINT Un nmero entero pequeo. El rango suscrito va de -32768 a
32767. El rango no suscrito va de 0 a 65535.
MEDIUMINT Un nmero entero de tamao medio. El rango suscrito va de
-8388608 a 8388607. El rango no suscrito va de 0 a
16777215.
INT Un nmero entero de tamao normal. El rango suscrito va de
-2147483648 a 2147483647. El rango no suscrito va de 0 a
4294967295.
INTEGER Este tipo es sinnimo de INT.

Ingeniera en sistemas computacionales


75
BIGINT Un nmero entero grande. El rango suscrito va de -
9223372036854775808 a 9223372036854775807. El rango
no suscrito va de 0 a 18446744073709551615.
FLOAT Un nmero punto flotante pequeo (simple precisin). Los
valores van de 3.402823466E+38 a -1.175494351E-38, 0, y
1.175494351E-38 a 3.402823466E+38.
DOUBLE Un nmero punto flotante normal (doble precisin). Los
valores van de 1.7976931348623157E+308 a -
2.2250738585072014E-308, 0, y 2.2250738585072014E-308
a 1.7976931348623157E+308.
DECIMAL El nmero mximo de dgitos (M) para DECIMAL es 64.

Tipos de Datos Fecha y Hora:


TIPO DE DATO
1 DATE
2 TIME
3 DATETIME
4 TIMESTAMP
5 YEAR

Caractersticas:

TIPO DE DATO DESCRIPCIN


DATE Una Fecha. El rango es 1000-01-01 a 9999-12-31. Los
valores de fecha se muestran con el formato YYYY-MM-DD
(Ao-Mes-Da).
TIME Una Hora. El rango es -838:59:59 a 838:59:59. Los valores
de hora se muestran con el formato HH:MM:SS.

DATETIME Una combinacin de Fecha y Hora. El rango es 1000-01-01


00:00:00 a 9999-12-31 23:59:59. Los valores fecha hora son
mostrados en formato YYYY-MM-DD HH:MM:SS.
TIMESTAMP Una Marca de Tiempo. El rango es 1970-01-01 00:00:01
UTC hasta parcialmente el ao 2037. Una columna
TIMESTAMP es til para grabar la fecha y hora de una
operacin INSERT o UPDATE.
YEAR Un Ao. Los valores de ao son mostrados en formato de
dos dgitos o de cuatro. El rango de valores para un dgito de
cuatro es 1901 a 2155. Para los dos dgitos, el rango es 70 a
69, representando aos desde 1970 a 2069.

Ingeniera en sistemas computacionales


76
Para todas las columnas de fecha y hora, podemos asignar tambin los valores
usando strings o nmeros.

Tipos de datos String:


TIPO DE DATO
1 CHAR
2 VARCHAR
3 TINYTEXT
4 TEXT
5 BLOB
6 MEDIUMTEXT
7 LONGTEXT
8 BINARY
9 VARBINARY
10 ENUM
11 SET

Caractersticas:

TIPO DE DATO DESCRIPCIN


CHAR Es un string de longitud fija que es principalmente usado
cuando los datos no van a variar mucho en su longitud.
Toma valores de 0 a 255 de longitud de caracteres. Cuando
almacenamos valores CHAR ellos estn rellenos
correctamente con espacios de la longitud especfica.
Cuando obtenemos valores CHAR, los espacios finales son
eliminados.
VARCHAR Es una variable string de longitud y es usada principalmente
cuando los datos pueden variar en longitud. Toma valores de
0 a 255 de longitud de caracteres. Los valores VARCHAR no
son rellenados cuando son ms cortos.
TINYTEXT Un string con una longitud mxima de 255 caracteres.
TEXT Las columnas TEXT son tratadas como caracteres string
(strings no binarios). Contiene una longitud mxima de 65535
caracteres.
BLOB BLOB es el acrnimo de Binary Large OBject (Objeto Binario
Grande). Puede tener un montn de datos variables. Las
columnas BLOB son tratadas como string de bytes (string
binarios). Contiene una longitud mxima de 65535.
MEDIUMTEXT Tiene una longitud mxima de 16777215 caracteres.
LONGTEXT Tiene una longitud mxima de 4294967295 caracteres.

Ingeniera en sistemas computacionales


77
BINARY BINARY es similar al tipo CHAR. Almacena el valor como
string de byte binario en vez de como un caracter string no
binario
VARBINARY VARBINARY es similar al tipo VARCHAR. Almacena el valor
como un string de bytes binario en vez de como un caracter
string no binario.
ENUM Una enumeracin. Cada columna puede tener uno de los
posibles valores especificados. Puede almacenar solo uno
de los valores que estn declarados en la lista especfica
contenida en los parntesis ( ). La lista ENUM tiene un
alcance de ms de 65535 valores.
SET Un set. Cada columna puede tener ms de uno de los
posibles valores especificados. Contiene ms de 64 objetos
de lista y puede almacenar ms de una opcin. Los valores
SET son representados internamente como nmeros
enteros.

Si CHAR y VARCHAR son usados en la misma tabla, entonces MySQL cambiar


automticamente CHAR a VARCHAR por razones de compatibilidad. Los
parntesis ( ) permiten introducir un mximo nmero de caracteres que sern
usados en la columna.

Ingeniera en sistemas computacionales


78
Apndice B
Atributos De Datos En MySQL

MODIFICADOR SE APLICA A DESCRIPCIN


AUTO_INCRE Enteros El valor se va incrementando
MENT automticamente en cada fila.
BINARY Char y varchar Convierte las cadenas a forma binaria en la
que se distingue entre maysculas y
minsculas.
DEFAULT Todos menos Especifica el valor por defecto para una
Text y Blob columna. Este valor debe ser constante, no
puede ser una funcin o una expresin. As
cuando realizamos una operacin de
insercin si indicamos un valor para esa
columna lo coge y si no lo indicamos coge el
que se le dio por defecto al crear la tabla.
NOT NULL Todos Impide que un campo sea nulo.
PRIMARY KEY Todos Hace que el campo se considere llave
primaria.
UNIQUE Todos Indica que la columna no puede tener dos
valores iguales. Se usa para las claves
secundarias.
UNSIGNED Enteros Todos los tipos enteros pueden tener un
atributo UNSIGNED. Los valores sin signo
pueden usarse cuando quiere permitir slo
nmeros positivos en una columna.
Adems, permite un rango numrico mayor
para la columna.

Ingeniera en sistemas computacionales


79
ZEROFILL Enteros Cuando se usa con tipos numricos el
relleno por defecto de espacios se remplaza
con ceros. Slo se suele usar con tipos
enteros.
Por ejemplo, para una columna declarada
como INT(5) ZEROFILL, un valor de 4 se
muestra como 00004.
Si especifica ZEROFILL para columnas
numricas, MySQL aade automticamente
el atributo UNSIGNED en la columna. Esto
implica que no podremos insertar valores
negativos pues nos dara un error.
NULL Todos Indica que el campo podr quedar sin
ningn contenido cuando se cree un
registro, o cuando se modifique uno ya
existente.

Nota: Es imprescindible que la columna que contiene una definicin de clave


fornea est indexada. Pero esto no debe preocuparnos demasiado, ya que si no
lo hacemos de forma explcita, MySQL lo har por nosotros de forma implcita.

CLAUSULA DESCRIPCIN
REFERENCES Indica en que tabla es clave principal la que aqu es
fornea, siempre trabajando en la misma base de
datos.
ON DELETE <opcin> Indica que acciones se deben realizar en la tabla
actual si se borra una fila en la tabla referenciada.
ON UPDATE <opcin> Es anlogo pero para modificaciones de claves.

Existen tres opciones diferentes. Veamos lo que hace cada una de ellas:

OPCIN DESCRIPCIN
RESTRICT Esta opcin impide eliminar o modificar filas en la tabla referenciada
si existen filas con el mismo valor de clave fornea.
CASCADE Borrar o modificar una clave en una fila en la tabla referenciada con
un valor determinado de clave, implica borrar las filas con el mismo
valor de clave fornea o modificar los valores de esas claves
forneas.
SET NULL Borrar o modificar una clave en una fila en la tabla referenciada con
un valor determinado de clave, implica asignar el valor NULL a las
claves forneas con el mismo valor.

Ingeniera en sistemas computacionales


80
Apndice C
Operadores En MySQL
Operador Significado
= Igual a
> Mayor que
>= Mayor que o igual a
< Menor que
<= Menor que o igual a
<>, != Diferente a
IS TRUE Es 1
IS FALSE Es 2
IS NULL Es nulo
BETWEEN Entre dos valores (inclusive)
IN Lista de valores
LIKE Se ajusta a un patrn
REGEXP, RLIKE Se ajusta a un patrn (expresiones regulares)
GREATEST Mayor argumento
LEAST Menor argumento
STRCMP Compara dos cadenas
AND Y
OR O
NOT, ! NO invierte el resultado
() Fija prioridades

Como en cualquier otro lenguaje, los parntesis se pueden usar para forzar el
orden de la evaluacin de determinadas operaciones dentro de una expresin.
Cualquier expresin entre parntesis adquiere mayor precedencia que el resto de
las operaciones en el mismo nivel de parntesis.
mysql> SELECT 10+5*2, (10+5)*2;
+--------+----------+
| 10+5*2 | (10+5)*2 |
+--------+----------+
| 20 | 30 |
+--------+----------+
1 row in set (0.00 sec)

Ingeniera en sistemas computacionales


81
Apndice D
Funciones En MySQL
Funcin Accin
MIN Mnimo valor
MAX Mximo valor
AVG Media de los valores
COUNT Cantidad de valores
SUM Suma de los valores
+ Suma
- Resta
* Multiplicacin
/ Divisin
DIV Divisin entera

Nota: Son solo algunas funciones, ya que en realidad son demasiadas no se han
agregado al manual, con respecto a los operadores +,-,*,/, han sido agregados en
esta seccin por ser usadas en operaciones que pueden dar tratamiento a los
datos.

Ingeniera en sistemas computacionales


82

También podría gustarte