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

ISC

Taller de Base de Datos

DOCENTE L.I. JOSE HERNANDEZ RODRIGUEZ

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN

Aportacin de la asignatura al perfil del egresado

ISC

Utiliza un sistema de base de datos (DBMS) comercial.

Taller de Base de Datos

Objetivo general del curso


Proporcionar al estudiante las habilidades para el desarrollo y manipulacin de bases de datos para la integracin de sistemas de informacin transaccionales.

Compilado por L.I. JHR

V SEMESTRE

PAG. 2

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN

Temario
1 Introduccin al Sistema Manejador de Base de Datos (DBMS) 1.1 Conceptos. 1.2 Caractersticas del DBMS 2 Lenguaje de Definicin de Datos (DDL) 2.1 Creacin de base de datos. 2.2 Creacin de tablas. 2.2.1 Integridad. 2.2.2 Integridad referencial declarativa. 2.3 Creacin de ndices 3 Consultas y Lenguaje de Manipulacin de Datos (DML) 3.1 Instrucciones INSERT, UPDATE, DELETE. 3.2 Consultas Bsicas SELECT, WHERE y funciones a nivel de registro. 3.3 Consultas sobre mltiples tablas. 3.3.1 Subconsultas. 3.3.2 Operadores JOIN. 3.4 Agregacin GROUP BY, HAVING. 3.5 Funciones de conjunto de registros COUNT, SUM, AVG, MAX, MIN 4 Control de Transacciones. 4.1 Propiedades de la transaccin. 4.2 Grados de consistencia. 4.3 Niveles de aislamiento. 4.4 Instrucciones COMMIT y ROLLBACK. 5 Vistas 5.1 Definicin y objetivo de las vistas. 5.2 Instrucciones para la administracin de vistas. 6 Seguridad. 6.1 Esquemas de autorizacin. 6.2 Instrucciones GRANT y REVOKE. 7 Introduccin al SQL Procedural. 7.1 Procedimientos almacenados. 7.2 Disparadores (Triggers).

Taller de Base de Datos

ISC

Compilado por L.I. JHR

V SEMESTRE

PAG. 3

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN

UNIDAD UNO
Introduccin al Sistema Manejador de Base de Datos (DBMS)
Objetivo Educacional: El estudiante conocer los elementos y caractersticas principales del DBMS a utilizar en el curso.

ISC

1.1 Conceptos
Consiste en una coleccin de datos interrelacionados y un conjunto de programas para acceder a dichos datos.

Taller de Base de Datos

La coleccin de datos, normalmente se denomina base de datos, contiene informacin relevante para una empresa.

Su objetivo primordial es: Proporcionar una forma de almacenar y recuperar la informacin de una bd de manera que sea tanto practica como eficiente Se compone de un lenguaje de definicin de datos (DDL: Data Definition Language), de un lenguaje de manipulacin de datos (DML: Data Manipulation Language) y de un lenguaje de consulta (SQL: Structured Query Language). El lenguaje de definicin de datos (DDL) es utilizado para describir todas las estructuras de informacin y los programas que se usan para construir, actualizar e introducir la informacin que contiene una base de datos. El lenguaje de manipulacin de datos (DML) es utilizado para escribir programas que crean, actualizan y extraen informacin de las bases de datos. El lenguaje de consulta (SQL) es empleado por el usuario para extraer informacin de la base de datos. El lenguaje de consulta permite al usuario hacer requisiciones de datos sin tener que escribir un programa, usando instrucciones como el SELECT, el PROJECT y el JOIN. Compilado por L.I. JHR V SEMESTRE PAG. 4

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


Los sistemas de base de datos se disean para gestionar grandes cantidades de informacin. La gestin de datos implica tanto la definicin de estructuras para almacenar la informacin como la provisin de mecanismos para la manipulacin de la informacin. Adems, deben proporcionar la fiabilidad de la informacin almacenada, a pesar de las cadas del sistema o intentos de acceso sin autorizacin. Los sistemas de bases de datos se aplican en: La banca, lneas areas, universidades, Transacciones de tarjetas de crdito, telecomunicaciones, finanzas, ventas, produccin y recursos humanos.

ISC
Taller de Base de Datos

1.2 Caractersticas del DBMS (Data Base Management System)


Un
SGBD debe proporcionar a los usuarios la capacidad de almacenar datos en la base de datos, acceder a ellos y actualizarlos. Esta es la funcin fundamental de un SGBD. debe proporcionar un catlogo en el que se almacenan las descripciones de los datos y que sea accesible por los usuarios. Este catlogo es lo que se denomina diccionario de datos y contiene informacin que describe los datos de la base de datos (meta datos). garantice que todas las actualizaciones correspondientes a una determinada transaccin se realicen, o que no se realice ninguna. Una transaccin es un conjunto de acciones que cambian el contenido de la base de da tos.

Un SGBD

Un SGBD debe proporcionar un mecanismo que

Un

SGBD debe proporcionar un mecanismo que asegure que la base de datos se actualice correctamente cuando varios usuarios la estn actualizando concurrentemente. Uno de los principales objetivos de los SGBD es el permitir que varios usuarios tengan acceso concurrente a los datos que comparten. El SGBD se debe encargar de que estas interferencias no se produzcan en el acceso simultneo.

Compilado por L.I. JHR

V SEMESTRE

PAG. 5

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


Un SGBD debe proporcionar un mecanismo capaz de recuperar la base de datos en
caso de que ocurra algn suceso que la dae llevndola a un estado consistente.

Un

SGBD debe proporcionar un mecanismo que garantice que slo los usuarios autorizados pueden acceder a la base de datos. La proteccin debe ser contra accesos no autorizados, tanto intencionados como accidentales. SGBD debe proporcionar los medios necesarios para garantizar que tanto los datos de la base de datos, como los cambios que se realizan sobre estos datos, sigan ciertas reglas. La integridad de la base de datos requiere la validez y consistencia de los datos almacenados. Se puede considerar como otro modo de proteger la base de datos, pero adems de tener que ver con la seguridad, tiene otras implicaciones. La integridad se ocupa de la calidad de los datos. Normalmente se expresa mediante restricciones, que son una serie de reglas que la base de datos no puede violar. base de datos de modo efectivo. Dichas herramientas deben proporcionar.

Un

ISC

Un SGBD debe proporcionar una serie de herramientas que permitan administrar la


Herramienta administracin de usuarios Analizador de logs(Registro oficial de eventos durante un periodo de tiempo en particular. Para los profesionales en seguridad informtica un log es usado para registrar datos o informacin sobre quin, que, cuando, donde y por qu, un evento ocurre para un dispositivo en particular o aplicacin. Administrador de procesos Herramientas para importar y exportar datos. Herramientas para monitorizar el uso y el funcionamiento de la base de datos. Programas de anlisis estadstico para examinar las prestaciones o las estadsticas de utilizacin. Herramientas para reorganizacin de ndices.

Taller de Base de Datos

Compilado por L.I. JHR

V SEMESTRE

PAG. 6

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN

ACTIVIDADES DE APRENDIZAJE
Realizar una comparacin de las caractersticas de varios DBMSs. Discutir las ventajas y desventajas de los DBMS revisados. Buscar el proceso y requerimientos de instalacin del DBMS que ha de utilizarse en el curso. Instalar el DBMS

ISC

EVALUACION
Examen Participacin Investigacin Trabajo equipo e-r Ejercicios de Repaso 40 % 20 % 20 % 10 % (En rotafolios) 10 % 100 %

Taller de Base de Datos

OTROS RECURSOS
Recurso 1. Cuadro Comparativo de algunos DBMS Recurso 2. Instalacin de AppServ Recurso 3. Lista de ejercicios

Compilado por L.I. JHR

V SEMESTRE

PAG. 7

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN

Recurso uno:
Cuadro Comparativo de algunos DBMS. Ver anexos Tipos de datos en Mysql

ISC

Recurso Dos:
Instalacin de AppServ
Que es AppServ? Es un software que permite la instalacin en nuestro entorno Windows, de los siguientes paquetes:

Taller de Base de Datos

Apache Web Server (versin 2.2.3) Lenguaje PHP (versin 5 o 4) Base de datos MySQL (versin 5.0.24) Manejador de base de datos phpMyAdmin (versin 2.9.0.2) Esto es lo que incluye el actual paquete AppServ 2.5.7, es obvio pero vale la pena recordar que como esta formado por 4 paquetes (apache, php, Mysql, phpMyAdmin), cada uno sigue lanzando nuevas versiones, que podemos instalar por separado o esperar la prxima versin de AppServ. Como instalar AppServ 1) Damos doble click en el icono del instalado. Aparece la imagen que vemos debajo, recuerda que la versin puede ser ms nueva cuando t intentes ;). Debemos dar, siguiente (next).

Compilado por L.I. JHR

V SEMESTRE

PAG. 8

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


2) Aparece el acuerdo de licencia, ah debemos dar conformidad (I Agree)

Taller de Base de Datos

ISC
3) En este punto, debemos elegir en cual de nuestros discos duros y en que carpeta vamos a instalar el AppServ, por defecto e s c:\AppServ, como muestra la imagen lo dejemos as, y le damos siguiente (Next)

Compilado por L.I. JHR

V SEMESTRE

PAG. 9

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


4) En este punto debemos elegir los componentes que vamos a instalar, como ves aparecen marcados los cuatro elementos disponibles (apache, mysql, php, phpmyadmin) si bien puedes desmarcar alguno, es mejor instalar tod os para tener completo tu equipo de testeo y desarrollo Web, le damos siguiente (Next)

Taller de Base de Datos

ISC
5) En este punto debes indicar el nombre del servidor y el email del administrador del sistema, ponemos localhost y email root@localhost.com, respectivamente, el puerto 80. Clic en siguiente

Compilado por L.I. JHR

V SEMESTRE

PAG. 10

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


6) Configuracin MySQL, en este punto debemos prestar atencin, ya que debemos indicar el Password, para el usuario principal de la base de datos, lo escribimos 2 veces !! Activamos Enable Innodb, ya que de lo contrario no podemos utilizar e ste tipo de tablas que sern de uso en este semestre.

Taller de Base de Datos

ISC
Por tanto el usuario ser root, que es por y tu Contrasea que acabas de escribir, eso lo usaras para abrir la base desde tus programas PHP o cuando entre al MYSQL, por eso es importante recordar. Le damos siguiente (Next) 7) Para culminar la instalacin, como indica la imagen, podemos elegir si al finalizar ya comenzara a funcionar el Server Apache y el servidor de base de datos MySQL, lo dejamos marcado y le damos finalizar (Finish), listo hemos terminado.

Compilado por L.I. JHR

V SEMESTRE

PAG. 11

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


En este punto si vas a tu navegador, puedes poner, http://localhost y debe mostrarse tal como muestra la imagen. Salvo las versiones que el tuyo puede ser mas nuevo.

Taller de Base de Datos

ISC
En la configuracin Standard usando c:\AppServ la ubicacin que equivale a http://localhost es c:\AppServ\www por tanto si creas una carpeta pruebas dentro de www, quedand asi: c:\AppServ\www\pruebas, y dentro un archivo llamados test.php con el siguiente contenido: <?php echo phpinfo(); ?> Este archivo se ejecutara en tu navegador llamando lo as: http://localhost/pruebas/test.php

Compilado por L.I. JHR

V SEMESTRE

PAG. 12

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN

Recurso Tres:
Lista de Ejercicios

Taller de Base de Datos


Compilado por L.I. JHR

ISC

V SEMESTRE

PAG. 13

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN

UNIDAD DOS
Lenguaje de Definicin de Datos (DDL)
Objetivo Educacional: Crear una base de datos, y definir su esquema en SQL.

ISC
Taller de Base de Datos

DDL (Data Definition Language) Lenguaje de definicin de datos. Es el lenguaje que se usa para crear bases de datos y tablas, y para modificar sus estructuras, as como los permisos y privilegios. Este lenguaje trabaja sobre unas tablas especiales llamadas diccionario de datos. DML (Data Manipulation Language) lenguaje de manipulacin de datos. Es el que se usa para modificar y obtener datos desde las bases de datos. SQL engloba ambos lenguajes DDL+DML, ya que ambos forman parte del conjunto de sentencias de SQL.

2.1 Creacin de base de datos.


Para crear una base de datos se usa una sentencia CREATE DATABASE
mysql > CREATE DATABASE prueba ;

Para mostrar las bases de datos existentes en nuestro sistema se usa la sentencia SHOW DATABASES
mysql > SHOW DATABASES; +--------------------+ | Database | +--------------------+ | mysql | | prueba | | tes t | +--------------------+ 3 rows in set (0.00 sec)

Para seleccionar una base de datos se usa el comando USE, que no es exactamente una sentencia SQL, sino ms bien de una opcin de MySQL
mysql > USE prueba ; Da tabase changed mysql >

Compilado por L.I. JHR

V SEMESTRE

PAG. 14

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN

2.2 Creacin de tablas.


La sentencia CREATE TABLE que sirve para crear tablas. La sintaxis de esta sentencia es muy compleja, ya que existen muchas opciones y tenemos muchas posibilidades diferentes a la hora de crear una tabla. Deberemos indicar el nombre de la tabla y los nombres y tipos de las columnas

ISC
Taller de Base de Datos

Leer el recurso 4. Tipos de datos en Mysql

mysql > CREATE TABLE gente (nombre VARCHAR(40), fecha DATE); Query OK, 0 rows affected (0.53 sec)

Podemos consultar cuntas tablas y qu nombres tienen en una base de datos, usando la sentencia SHOW TABLES
mysql > SHOW TABLES; +------------------+ | Tables _in_prueba | +------------------+ | gente | +------------------+ 1 row in set (0.01 sec)

La sintaxis para definir columnas es: nombre_col tipo [NOT NULL | NULL] [DEFAULT valor_por_defecto] [[PRIMARY] KEY] [COMMENT 'string'] [definicin_referencia] [AUTO_INCREMENT]

Valores nulos: Al definir cada columna podemos decidir si podr o no contener valores nulos. La opcin por defecto es que se permitan valores nulos, NULL, y para que no se permitan, se usa NOT NULL. Por ejemplo:
mysql >CREATE TABLE ciudad1(nombre CHAR(20) NOT NULL, pobla cion INT NULL); Query OK, 0 rows affected (0.98 sec)

Valores por defecto: Para cada columna tambin se puede definir, opcionalmente, un valor por defecto. El valor por defecto se asignar de forma automtica a una columna cuando no se especifique un valor determinado al aadir filas. Si una columna puede tener un valor nulo, y no se especifica un valor por defecto, se usar NULL como valor por defecto. En el ejemplo anterior, el valor por defecto para poblacion es NULL. Compilado por L.I. JHR V SEMESTRE PAG. 15

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


Por ejemplo, si queremos que el valor por defecto para poblacin sea 5000, podemos crear la tabla como:
mysql >CREATE TABLE ciudad2(nombre CHAR(20) NOT NULL, pobla cion INT NULL DEFAULT 5000); Query OK, 0 rows affected (0.09 sec)

Claves primaria: Tambin se puede definir una clave primaria sobre una columna, usando la palabra clave KEY o PRIMARY KEY. Slo puede existir una clave primaria en cada tabla, y la columna sobre la que se define una clave primaria no puede tener valores NULL. Si esto no se especifica de forma explcita, MySQL lo har de forma automtica. Por ejemplo, si queremos crear un ndice en la columna nombre de la tabla de ciudades, crearemos la tabla as:
mysql > CREATE TABLE ciudad3 (nombre CHAR(20) NOT NULL PRIMARY KEY, poblacio n INT NULL DEFAULT 5000); Query OK, 0 rows affected (0.20 sec) mysql > CREATE TABLE ciudad3 (nombre CHAR(20) NOT NULL, pobla cion INT NULL DEFAULT 5000, PRIMARY KEY(nombre)); Query OK, 0 rows affected (0.20 sec)

Taller de Base de Datos

ISC

Usar NOT NULL PRIMARY KEY equivale a PRIMARY KEY, NOT NULL KEY o sencillamente KEY. Columnas autoincrementadas: En MySQL tenemos la posibilidad de crear una columna autoincrementada, aunque esta columna slo puede ser de tipo entero. Si al insertar una fila se omite el valor de la columna autoincr ementada o si se inserta un valor nulo para esa columna, su valor se calcula automticamente, tomando el valor ms alto de esa columna y sumndole una unidad. Esto permite crear, de una forma sencilla, una columna con un valor nico para cada fila de la tabla. Generalmente, estas columnas se usan como claves primarias 'artificiales'. MySQL est optimizado para usar valores enteros como claves primarias, de modo que la combinacin de clave primaria, que sea entera y autoincrementada es ideal para usarla como clave primaria artificial:
mysql > CREATE TABLE ciudad5 (cla ve INT AUTO_INCREMENT PRIMARY KEY, nombre CHAR(20) NOT NULL,pobla cion INT NULL DEFAULT 5000); Query OK, 0 rows affected (0.11 sec)

Comentario: Adicionalmente, al crear la tabla, podemos aadir un comentario a cada columna. Este comentario sirve como informacin adicional sobre alguna caracterstica especial de la columna, y entra en el apartado de documentacin de la base de datos:
mysql > CREATE TABLE ciudad6(cla ve INT AUTO_INCREMENT PRIMARY KEY COMMENT 'Cla ve principal ',nombre CHAR(50) NOT NULL, pobla cion INT NULL DEFAULT 5000); Query OK, 0 rows affected (0.08 sec) mysql > show full columns from ciudad6;

Compilado por L.I. JHR

V SEMESTRE

PAG. 16

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


Adems de los comandos: Create database, use, create table, show database y show tables, tambin son DLLs: ALTER TABLE y DROP
Alter table Alter table clientes change apaterno apaterno varchar(50); Alter table clientes rename tabla_clie;

Cambia el tipo de dato o nombre de la columna Cambia el nombre de la tabla Elimina una columna Aade una columna Pone como columna indexada a apellido_paterno Hace de id_clientes la llave primaria

ISC
Taller de Base de Datos

Alter table tabla_clie drop domicilio; Alter table tabla_clie add nombre varchar(30) Alter table clientes add index (apellido_paterno) Alter table Clientes add primary key (id_clientes)

Drop Drop table NombreTabla; Drop database NombreBd; Drop index apaterno on clientes

Elimina una tabla Elimina toda la base de datos Le quita la indexacin a la columna apaterno Borra una clave primaria (en una tabla solo existe una llave primaria por eso no se pone el nombre de la columna)

Alter table clients drop Primary Key

Compilado por L.I. JHR

V SEMESTRE

PAG. 17

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN

2.2.1 Integridad.
DEFINICION: Se refiere a la correccin y completitud de los datos en una BD. Cuando los contenidos de una BD se modifican con sentencias INSERT, DELETE o UPDATE, la integridad de los datos almacenados puede perderse de muchas maneras diferentes. Por ejemplo:

ISC
Taller de Base de Datos

Pueden aadirse datos no vlidos a la base de datos, tales como un pedido que espec ifica un producto no existente. Pueden modificarse datos existentes tomando un valor incorrecto, como por ejemplo si se reasigna un vendedor a una oficina no existente. Los cambios a la base de datos pueden perderse debido a un error del sistema o a un fallo en el suministro de potencia. Los cambios pueden ser aplicados parcialmente, como por ejemplo si se aade un pedido de un producto sin ajustar la cantidad disponible para vender. Una funcin importante de un DBMS (sistema gestor de la base de datos) re lacional es preservar la integridad de los datos almacenados en la mayor medida posible Para preservar la consistencia y correccin de los datos almacenados, un DBMS relacional impone generalmente una o ms restricciones de integridad de datos. Estas res tricciones restringen los valores que pueden ser insertados en la base de datos o creados mediante una actualizacin de la base de datos. Varios tipos diferentes de restricciones de integridad de datos suelen encontrarse en las bases de datos relacinales, incluyendo: Datos requeridos: Algunas columnas en una base de datos deben contener un valor de dato vlido en cada fila, es decir, no se permite que contengan valores NULL o que falten. Pueden especificarse columnas requeridas cuando se crea un tabla, en cuyo caso, el DBMS impedir los valores NULL en esas columnas. Chequeo de validez: Cada columna de una base de datos tiene un dominio, o sea, un conjunto de valores que son legales para esa columna. El DBMS puede ser preparado para impedir otros valores de datos en estas columnas. Integridad de entidad: La clave primaria de una tabla debe contener un valor nico en cada fila, diferente de los valores de todas las filas restantes. Los valores duplicados son ilegales y el DBMS puede ser preparado para forzar esta restriccin de valores nicos. Las restricciones de integridad de entidad aseguran que la clave primaria identifique unvocamente a cada entidad representada en la base de datos. Compilado por L.I. JHR V SEMESTRE PAG. 18

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


Consistencia: Muchas transacciones del mundo real producen mltiples actualizaciones a una base de datos. Las sentencias INSERT y UPDATE deben ejecutarse de modo que la base de datos contine en un estado correcto y consistente. El DBMS puede ser preparado para forzar este tipo de regla de consistencia o para soportar aplicaciones que implementen tales reglas.

2.2.2 Integridad referencial declarativa.

ISC
Taller de Base de Datos

Integridad referencial: Una clave secundaria (externa o fornea) en una base de datos relacional enlaza cada fila de la tabla hijo que contiene la clave fornea con la fila de la tabla padre que contiene el valor de clave primaria correspondiente. El DBMS pu ede ser preparado para forzar esta restriccin de clave fornea/clave primaria. Las restricciones de integridad referencial aseguran que las relaciones entre entidades en la base de datos se preserven durante las actualizaciones. En particular, la integridad referencial debe incluir reglas que indiquen cmo manejar la supresin de filas que son referenciadas mediante otras filas. Problemas de integridad referencial Existen cuatro tipos de actualizaciones de bases de datos que pueden corromper la integridad referencial de las relaciones padre/hijo de una base de datos. 1. La insercin de una nueva fila hijo: Cuando se inserta una nueva fila en la tabla hijo, su valor de clave fornea debe coincidir con uno de los valores de clave primaria en la tabla padre. Si el valor de clave fornea no coincide con ninguna clave primaria, la insercin de la fila corromper la base de datos, ya que habr un hijo sin un padre (un hurfano). Observe que insertar una fila en la tabla padre nunca representa un problema; simplemente se convierte en un padre sin hijos. 2. La actualizacin de la clave fornea en una fila hijo: Esta es una forma diferente del problema anterior. Si la clave fornea se modifica mediante una sentencia UPDATE, el nuevo valor deber coincidir con un valor de clave primaria en la tabla padre. En caso contrario la fila actualizada ser hurfana. 3. La supresin de una fila padre: Si una fila de la tabla padre, que tiene uno o ms hijos se suprime, las filas hijo quedarn hurfanas. Los valores de clave f ornea en estas filas ya no se correspondern con ningn valor de clave primaria en la tabla padre. Observe que suprimir una fila de la tabla hijo nunca representa un problema; el padre de esta fila simplemente tendr un hijo menos despus de la supresin. 4. La actualizacin de la clave primaria en una fila padre: Esta es una forma diferente del problema anterior. Si la clave primaria de una fila en la tabla padre se modifica, todos los hijos actuales de esa fila quedarn hurfanos, puesto que sus claves for neas ya no corresponden con ningn valor de clave primaria.

Compilado por L.I. JHR

V SEMESTRE

PAG. 19

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


Claves forneas en MySQL
Estrictamente hablando, para que un campo sea una clave fornea, ste necesita ser definido como tal al momento de crear una tabla. Se pueden definir claves forneas en cualquier tipo de tabla de MySQL, pero nicamente tienen sentido cuando se usan tablas del tipo InnoDB. Para trabajar con claves forneas, necesitamos hacer lo siguiente:

ISC
Taller de Base de Datos

1. Crear ambas tablas del tipo InnoDB. 2. Usar la sintaxis FOREIGN KEY(campo_fk) REFERENCES nombre_tabla (nombre_campo) 3. Crear un ndice en el campo que ha sido declarado clave fornea. InnoDB no crea de manera automtica ndices en las claves forneas o en las claves referenciadas, as que debemos crearlos de manera explcita. Los ndices son necesarios para que la verificacin de las claves forneas sea ms rpida. A continuacin se muestra como definir las dos tablas de ejemplo con una clave fornea.
CREATE TABLE cliente(id_cliente INT NOT NULL,nombre VARCHAR(30), PRIMARY KEY (id_cliente)) TYPE = INNODB; CREATE TABLE venta(id_factura INT NOT NULL,id_cliente INT NOT NULL,cantidad INT,PRIMARY KEY(id_factura), FOREIGN KEY (id_cliente) REFERENCES cliente(id_cliente)) TYPE = INNODB;

La sintaxis completa de una restriccin de clave fornea es la siguiente:


[CONSTRAINT smbolo] FOREIGN KEY (nombre_columna, ...) REFERENCES nombre_tabla (nombre_columna, ...) [ON DELETE {CASCADE | SET NULL | NO ACTION | RESTRICT}] [ON UPDATE {CASCADE | SET NULL | NO ACTION | RESTRICT}]

Las columnas correspondientes en la clave fornea y en la clave referenciada deben tener tipos de datos similares para que puedan ser comparadas sin la necesidad de hacer una conversin de tipos. El tamao y el signo de los tipos enteros debe ser el mismo. En las columnas de tipo caracter, el tamao no tiene que ser el mismo necesariamente. Por ejemplo, la creacin de la clave fornea en la tabla venta que se mostr anteriormente pudo haberse hecho de la siguiente manera con el uso de una sentencia ALTER TABLE:
CREATE TABLE venta ( id_factura INT NOT NULL, id_cliente INT NOT NULL, cantidad INT, PRIMARY KEY(id_factura),

Compilado por L.I. JHR

V SEMESTRE

PAG. 20

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


INDEX (id_cliente) ) TYPE = INNODB; ALTER TABLE venta ADD FOREIGN KEY(id_cliente) REFERENCES cliente(id_cliente);

La integridad referencial se puede comprometer bsicamente en tres situaciones: cuando se est insertando un nuevo registro, cuando se est eliminando un registro, y cuando se est actualizando un registro. La restriccin de clave fornea que hemos definido se asegura que cuando un nuevo registro sea creado en la tabla venta, ste debe tener su correspondiente registro en la tabla cliente.

ISC
Taller de Base de Datos

Una vez que hemos creado las tablas, vamos a insertar algunos datos que nos sirvan para demostrar algunos conceptos importantes:
mysql> INSERT INTO cliente VALUES(1,'Juan Penas'); Query OK, 1 row affected (0.05 sec) mysql> INSERT INTO cliente VALUES(2,'Pepe el toro'); Query OK, 1 row affected (0.05 sec) mysql> INSERT INTO venta VALUES(1,1,23); Query OK, 1 row affected (0.03 sec) mysql> INSERT INTO venta VALUES(3,2,81); Query OK, 1 row affected (0.03 sec)

En este momento no hay ningn problema, sin embargo, vamos a ver que sucede cuando intentamos insertar un registro en la tabla venta que se refiera a un cliente no existente cuyo id_cliente es 3:
mysql> INSERT INTO venta VALUES(2,3,39); ERROR 1216: Cannot add or update a child row: a foreign key constraint fails

El hecho es que MySQL no nos permite insertar este registro, ya que el cliente cuyo id_cliente es 3 no existe. La restriccin de clave fornea asegura que nuestros datos mantienen su integridad. Sin embargo, qu sucede cuando eliminamos algn registro?. Vamos a agregar un nuevo cliente, y un nuevo registro en la tabla venta, posteriormente eliminaremos el registro de nuestro tercer cliente:
mysql> INSERT INTO cliente VALUES(3,'Pepe pecas'); Query OK, 1 row affected (0.05 sec) mysql> INSERT INTO venta VALUES(2,3,39); Query OK, 1 row affected (0.05 sec) mysql> DELETE FROM cliente WHERE id_cliente=3; ERROR 1217: Cannot delete or update a parent row: a foreign key constraint fails

Debido a nuestra restriccin de clave fornea, MySQL no permite que eliminemos el registro de cliente cuyo id_cliente es 3, ya que se hace referencia a ste en la tabla venta. De nuevo, se Compilado por L.I. JHR V SEMESTRE PAG. 21

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


mantiene la integridad de nuestros datos. Sin embargo existe una forma en la cul podramos hacer que la sentencia DELETE se ejecute de cualquier manera, y la veremos brevemente, pero primero necesitamos saber cmo eliminar (quitar) una clave fornea.

Eliminacin de una clave fornea


No podemos slo eliminar una restriccin de clave fornea como si fuera un ndice ordinario. Veamos que sucede cuando lo intentamos.

ISC
Taller de Base de Datos

mysql> ALTER TABLE venta DROP FOREIGN KEY; ERROR 1005: Can't create table '.test#sql-228_4.frm' (errno: 150)

Para eliminar la clave fornea se tiene que especificar el ID que ha sido generado y asignado internamente por MySQL a la clave fornea. En este caso, se puede usar la sentencia SHOW CREATE TABLE para determinar dicho ID.
mysql> SHOW CREATE TABLE venta; +--------+-----------------------------------------------------+ | Table | Create Table | +--------+-----------------------------------------------------+ | venta | CREATE TABLE 'venta' ( | | | 'id_factura' int(11) NOT NULL default '0', | | | 'id_cliente' int(11) NOT NULL default '0', | | | 'cantidad' int(11) default NULL, | | | PRIMARY KEY ('id_factura'), | | | KEY 'id_cliente' ('id_cliente'), | | | CONSTRAINT '0_22' FOREIGN KEY ('id_cliente') | | | REFERENCES 'cliente' ('id_cliente') ) TYPE=InnoDB | +-------+------------------------------------------------------+ 1 row in set (0.00 sec)

En nuestro ejemplo, la restriccin tiene el ID 0_22 (es muy probable que este valor sea diferente en cada caso).
mysql> ALTER TABLE venta DROP FOREIGN KEY 0_22; Query OK, 3 rows affected (0.23 sec) Records: 3 Duplicates: 0 Warnings: 0

Eliminacin de registros con claves forneas


Una de las principales bondades de las claves forneas es que permiten eliminar y actualizar registros en cascada. Con las restricciones de clave fornea podemos eliminar un registro de la tabla cliente y a la vez eliminar un registro de la tabla venta usando slo una sentencia DELETE. Esto es llamado eliminacin en cascada, en donde todos los registros relacionados son eliminados de acuerdo a las relaciones de clave fornea. Una alternativa es no eliminar los registros relacionados, y Compilado por L.I. JHR V SEMESTRE PAG. 22

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


poner el valor de la clave fornea a NULL (asumiendo que el campo puede tener un valor nulo). En nuestro caso, no podemos poner el valor de nuestra clave fornea id_cliente en la tabla venta, ya que se ha definido como NOT NULL. Las opciones estndar cuando se elimina un registro con clave fornea son: ON DELETE RESTRICT ON DELETE NO ACTION ON DELETE SET DEFAULT ON DELETE CASCADE ON DELETE SET NULL ON DELETE RESTRICT es la accin predeterminada, y no permite una eliminacin si existe un registro asociado, como se mostr en el ejemplo anterior. ON DELETE NO ACTION hace lo mismo. ON DELETE SET DEFAULT actualmente no funciona en MySQL - se supone que pone el valor de la clave fornea al valor por omisin (DEFAULT) que se defini al momento de crear la tabla.

ISC
Taller de Base de Datos

Si se especifica ON DELETE CASCADE, y una fila en la tabla padre es eliminada, entonces se eliminarn las filas de la tabla hijo cuya clave fornea sea igual al valor de la clave referenciada en la tabla padre. Esta accin siempre ha estado disponible en MySQL. Si se especifica ON DELETE SET NULL, las filas en la tabla hijo son actualizadas automticamente poniendo en las columnas de la clave fornea el valor NULL. Si se especifica una accin SET NULL, debemos asegurarnos de no declarar las columnas en la tabla como NOT NULL. A continuacin se muestra un ejemplo de eliminacin en cascada:
mysql> ALTER TABLE venta ADD FOREIGN KEY(id_cliente)REFERENCES cliente(id_cliente) ON DELETE CASCADE; Query OK, 3 rows affected (0.23 sec) Records: 3 Duplicates: 0 Warnings: 0

Vamos a ver como estn nuestros registros antes de ejecutar la sentencia DELETE:
mysql> SELECT * FROM cliente; +------------+--------------+ | id_cliente | nombre | +------------+--------------+ | 1 | Juan Penas | | 2 | Pepe el toro | | 3 | Pepe pecas | +------------+--------------+ 3 rows in set (0.00 sec)

Compilado por L.I. JHR

V SEMESTRE

PAG. 23

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


mysql> SELECT * FROM venta; +------------+------------+----------+ | id_factura | id_cliente | cantidad | +------------+------------+----------+ | 1 | 1 | 23 | | 2 | 3 | 39 | | 3 | 2 | 81 | +------------+------------+----------+ 3 rows in set (0.00 sec)

Ahora eliminaremos a Pepe Pecas de la base de datos:

ISC
Taller de Base de Datos

mysql> DELETE FROM cliente WHERE id_cliente=3; Query OK, 1 row affected (0.05 sec) mysql> SELECT * FROM venta; +------------+------------+----------+ | id_factura | id_cliente | cantidad | +------------+------------+----------+ | 1 | 1 | 23 | | 3 | 2 | 81 | +------------+------------+----------+ 2 rows in set (0.00 sec) mysql> SELECT * FROM cliente; +------------+--------------+ | id_cliente | nombre | +------------+--------------+ | 1 | Juan Penas | | 2 | Pepe el toro | +------------+--------------+ 2 rows in set (0.00 sec)

Con la eliminacin en cascada, se ha eliminado el registro de la tabla venta al que estaba relacionado Pepe Pecas.

Actualizacin de registros con claves forneas


Estas opciones son muy similares cuando se ejecuta una sentencia UPDATE, en lugar de una sentencia DELETE. Estas son: ON UPDATE CASCADE ON UPDATE SET NULL ON UPDATE RESTRICT Vamos a ver un ejemplo, pero antes que nada, tenemos que eliminar la restriccin de clave fornea (debemos usar el ID especfico de nuestra tabla).
mysql> ALTER TABLE venta DROP FOREIGN KEY 0_26; Query OK, 2 rows affected (0.22 sec) Records: 2 Duplicates: 0 Warnings: 0

Compilado por L.I. JHR

V SEMESTRE

PAG. 24

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


mysql> ALTER TABLE venta ADD FOREIGN KEY(id_cliente)REFERENCES cliente(id_cliente) ON DELETE RESTRICT ON UPDATE CASCADE; Query OK, 2 rows affected (0.22 sec) Records: 2 Duplicates: 0 Warnings: 0

NOTA: Se debe especificar ON DELETE antes de ON UPDATE, ya que de otra manera se recibir un error al definir la restriccin. Ahora est lista la clave fornea para una actualizacin en cascada. Este es el ejemplo:
mysql> SELECT * FROM venta; +------------+------------+----------+ | id_factura | id_cliente | cantidad | +------------+------------+----------+ | 1 | 1 | 23 | | 3 | 2 | 81 | +------------+------------+----------+ 2 rows in set (0.00 sec) mysql> UPDATE cliente SET id_cliente=10 WHERE id_cliente=1; Query OK, 1 row affected (0.05 sec) Rows matched: 1 Changed: 1 Warnings: 0

Taller de Base de Datos

ISC

mysql> SELECT * FROM venta; +------------+------------+----------+ | id_factura | id_cliente | cantidad | +------------+------------+----------+ | 1 | 10 | 23 | | 3 | 2 | 81 | +------------+------------+----------+ 2 rows in set (0.00 sec)

En este caso, al actualizar el valor de id_cliente en la tabla cliente, se actualiza de manera automtica el valor de la clave fornea en la tabla venta. Esta es la actualizacin en cascada.

Compilado por L.I. JHR

V SEMESTRE

PAG. 25

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


Un ejemplo ms Observar y estudiar detenidamente el diagrama entidad/relacin de la figura que se muestra a continuacin.

Taller de Base de Datos

ISC
Queda como ejercicio al lector verificar que a partir de este diagrama se genera un cdigo SQL similar al mostrado a continuacin, que nos sirve para la creacin de las tablas con sus correspondientes definiciones de claves forneas: Considerar que se desean hacer eliminaciones y actualizaciones en cascada, y que en la tabla poema_libro la clave primaria est formada por ambos campos (id_poema y id_libro).
CREATE TABLE libro ( id_libro INT NOT NULL, titulo VARCHAR(100) NULL, precio NUMERIC(5,2) NULL, PRIMARY KEY(id_libro) ) TYPE=InnoDB; CREATE TABLE escritor ( id_escritor INT NOT NULL, nombre VARCHAR(30) NULL, apellidos VARCHAR(40) NULL, direccion VARCHAR(100) NULL, PRIMARY KEY(id_escritor) ) TYPE=InnoDB;

Compilado por L.I. JHR

V SEMESTRE

PAG. 26

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


CREATE TABLE poema ( id_poema INT NOT NULL, id_escritor INT NOT NULL, titulo VARCHAR(50) NULL, contenido TEXT NULL, PRIMARY KEY(id_poema), INDEX(id_escritor), FOREIGN KEY(id_escritor) REFERENCES escritor(id_escritor) ON DELETE CASCADE ON UPDATE CASCADE ) TYPE=InnoDB; CREATE TABLE poema_libro ( id_poema INT NOT NULL, id_libro INT NOT NULL, PRIMARY KEY(id_poema, id_libro), INDEX (id_poema), INDEX(id_libro), FOREIGN KEY(id_poema) REFERENCES poema(id_poema) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY(id_libro) REFERENCES libro(id_libro) ON DELETE CASCADE ON UPDATE CASCADE ) TYPE=InnoDB;

Taller de Base de Datos

ISC

2.3 Creacin de ndices


Un ndice es una estructura interna que el sistema puede usar para encontrar uno o ms registros en una tabla de forma rpida. En efecto, un ndice de base de datos es, conceptualmente, similar a un ndice encontrado al final de cualquier libro de texto. De la misma forma que el lector de un libro acudira a un ndice para determinar en qu pginas se encuentra un determinado tema, un sistema de base de datos leer un ndice para determinar las posiciones de registros seleccionados por una consulta SQL. En otras palabras, la presencia de un ndice puede ayudar al sistema a procesar algunas consultas de un modo ms eficiente. Un ndice de base de datos se crea para una columna o grupo de columnas. La figura siguiente muestra un ndice (XCNOMBRE) basado en la columna CNOMBRE de la tabla CURSO. Observemos que el ndice, a diferencia de la tabla CURSO, representa valores CNOMBRE en orden. Adems, el ndice es pequeo en relacin con el tamao de la tabla. Por lo tanto, es, probablemente, ms fcil que el sistema busque el ndice para localizar un registro con un valor CNOMBRE dado, a que explore toda la tabla en busca de ese valor. Por ejemplo, el ndice XCNOMBRE podra ser muy til al sistema cuando ejecute la siguiente sentencia SELECT.

Compilado por L.I. JHR

V SEMESTRE

PAG. 27

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


INDICE XCNOMBRE
COMUNISMO ARQ. ORD ENADOR ES ESTRUC TURA DE DATOS CIRCUTOS DIGITALES MAT. D ISCRETAS EMPIRISM O EXISTENC IALISM O HEDONISMO INTRODUC. A LOS CC . RACIONAL ISMO BASE D E DATOS R EL ESCOLASTICISMO SOLIPSISMO

TABLA CURSO
CNO C22 T44 C55 C33 P11 T33 P33 CNOMBRE ESTRUCTURA DE DATOS COMUNISMO ARQ. ORDENADORES MA T. DISCRETAS EMPIRISMO HEDONISMO EXIS TENCIALISMO CIRCUTOS DIGITALES

ISC

VENTAJAS DE LOS INDICES:

C44

FUNDAMENTALIS MO T12 Acceso directo a un registro especificado INTRODUC. A LOS CC. Ordenacin C11

DESVENTAJAS:

P22 P44

RACIONALISMO SOLIPSISMO

Taller de Base de Datos

Espacio de disco usado por el ndice ESCOLAS TICISMO T11 Costos de actualizacin
C66 BASE DE DATOS REL

Tenemos tres tipos de ndices. El primero corresponde a las claves primarias, que como vimos, tambin se pueden crear en la parte de definicin de columnas. La sintaxis para definir claves primarias es: definicin_columnas | PRIMARY KEY (index_nombre_col,...)
mysql > CREATE TABLE ciudad4 (nombre CHAR(20) NOT NULL, pobla cion INT NULL DEFAULT 5000, PRIMARY KEY (nombre));

Pero esta forma tiene ms opciones, por ejemplo, entre los parntesis podemos especificar varios nombres de columnas, para construir claves primarias compuestas por varias columnas:
mysql > CREATE TABLE mi tabla 1 (id1 CHAR(2) NOT NULL, id2 CHAR(2) NOT NULL, texto CHAR(30),PRIMARY KEY (id1, id2));

El segundo tipo de ndice permite definir ndices sobre una columna, sobre varias, o sobre partes de columnas. Para definir estos ndices se usan indistintamente las opciones KEY o INDEX.
mysql > CREATE TABLE mi tabla 2(id INT, nombre CHAR(19), INDEX (nombre)) ;

Compilado por L.I. JHR

V SEMESTRE

PAG. 28

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


O su equivalente:
mysql > CREATE TABLE mi tabla 3(id INT, nombre CHAR(19), KEY (nombre));

Tambin podemos crear un ndice sobre parte de una columna:


mysql > CREATE TABLE mi tabla 4(id INT, nombre CHAR(19), INDEX (nombre(4)));

ISC
Taller de Base de Datos

Este ejemplo usar slo los cuatro primeros caracteres de la columna 'nombre' para crear el ndice. El tercero permite definir ndices con claves nicas, tambin sobre una columna, sobre varias o sobre partes de columnas. Para definir ndices con claves nicas se usa la opcin UNIQUE. La diferencia entre un ndice nico y uno normal es que en los nicos no se permite la insercin de filas con claves repetidas. La excepcin es el valor NULL, que s se puede repetir.
mysql > CREATE TABLE mi tabla 5 (id INT, nombre CHAR(19), UNIQUE (nombre));

Una clave primaria equivale a un ndice de clave nica, en la que el valor de la clave no puede tomar valores NULL. Tanto los ndices normales como los de claves nicas s pueden tomar valores NULL. Por lo tanto, las definiciones siguientes son equivalentes:
mysql > CREATE TABLE mi tabla 6(id INT, nombre CHAR(19) NOT NULL, UNIQU E (nombre)); mysql > CREATE TABLE mi tabla 7(id INT, nombre CHAR(19), PRIMARY KEY (nombre));

Compilado por L.I. JHR

V SEMESTRE

PAG. 29

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN

Recurso Cuatro:
Tipos de datos en Mysql
Al disear nuestras tablas tenemos que especificar el tipo de datos y tamao que podr almacenar cada campo. Bsicamente mysql admite dos tipos de datos: nmeros y cadenas de caracteres. Junto a estos dos grandes grupos, se admiten otros tipos de datos especiales: formatos de fecha, etc. Datos Numricos: En este tipo de campos solo pueden almacenarse nmeros, positivos o negativos, enteros o decimales, en notacin hexadecimal, cientfica o decimal. Los tipos numricos tipo integer admiten los atributos SIGNED y UNSIGNED indicando en el primer caso que pueden tener valor negativo, y solo positivo en el segundo. Los tipos numricos pueden adems usar el atributo ZEROFILL en cuyo caso los nmeros se completaran hasta la mxima anchura disponible con ceros (column age INT(5) zerofill => valor 23 se almacenar como 00023) BIT o BOOL, para un nmero entero que puede ser 0 1 TINYINT es un nmero entero con rango de valores vlidos desde -128 a 127. Si se configura como unsigned (sin signo), el rango de valores es de 0 a 255 SMALLINT, para nmeros enteros, con rango desde -32768 a 32767. Si se configura como unsigned, 0 a 65535. MEDIUMINT para nmeros enteros; el rango de valores va desde -8.388608 a 8388607. Si se configura como unsigned, 0 a 16777215 INT para almacenar nmeros enteros, en un rango de -2147463846 a 2147483647. Si configuramos este dato como unsigned, el rango es 0 a 4294967295 BIGINT nmero entero con rango de valores desde -9223372036854775808 a 9223372036854775807. Unsigned, desde 0 a 18446744073709551615. FLOAT (m,d) representa nmeros decimales. Podemos especificar cuantos dgitos (m) pueden utilizarse (trmino tambin conocido como ancho de pantalla), y cuantos en la parte decimal (d). Mysql redondear el decimal para ajustarse a la capacidad.

Taller de Base de Datos

ISC

Compilado por L.I. JHR

V SEMESTRE

PAG. 30

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN

DOUBLE Nmero de coma flotante de precisin doble. Es un tipo de datos igual al anterior cuya nica diferencia es el rango numrico que abarca DECIMAL almacena los nmeros como cadenas. Caracteres O Cadenas

ISC
Taller de Base de Datos

CHAR Este tipo se utiliza para almacenar cadenas de longitud fija. Su longitud abarca desde 1 a 255 caracteres. VARCHAR Al igual que el anterior se utiliza para almacenar cadenas, en el mismo rango de 1 255 caracteres, pero en este caso, de longitud variable. Un campo CHAR ocupar siempre el mximo de longitud que le hallamos asignado, aunque el tamao del dato sea menor (aadiendo espacios adicionales que sean precisos). Mientras que VARCHAR solo almacena la longitud del dato, permitiendo que el tamao de la base de datos sea menor. Eso si, el acceso a los datos CHAR es ms rpido que VARCHAR. No pueden alternarse columnas CHAR y VARCHAR en la misma tabla. Mysql cambiar las columnas CHAR a VARCHAR. Tambin cambia automticamente a CHAR si usamos VARCHAR con valor de 4 o menos. TINYTEXT, TINYBLOB para un mximo de 255 caracteres. La diferencia entre la familia de datatypes text y blob es que la primera es para cadenas de texto plano (sin formato) y case insensitive (sin distinguir maysculas o minsculas) mientras que blob se usa para objetos binarios: cualquier tipo de datos o informacin, desde un archivo de texto con todo su formato (se diferencia en esto de el tipo Text) hasta imgenes, archivos de sonido o video TEXT y BLOB se usa para cadenas con un rango de 255 - 65535 caracteres. La diferencia entre ambos es que TEXT permite comparar dentro de su contenido sin distinguir maysculas y minsculas, y BLOB si distingue.
MEDIUMTEXT, MEDIUMBLOB textos de hasta 16777215 caracteres. LONGTEXT, LONGBLOB, hasta mximo de 4.294.967.295 caracteres

Varios DATE para almacenar fechas. El formato por defecto es YYYY MM DD desde 0000 00 00 a 9999 12 31. DATETIME Combinacin de fecha y hora. El rango de valores va desde el 1 de enero del 1001 a Compilado por L.I. JHR V SEMESTRE PAG. 31

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


las 0 horas, 0 minutos y 0 segundos al 31 de diciembre del 9999 a las 23 horas, 59 minutos y 59 segundos. El formato de almacenamiento es de ao-mes-dia horas:minutos:segundos TIMESTAMP Combinacin de fecha y hora. El rango va desde el 1 de enero de 1970 al ao 2037. El formato de almacenamiento depende del tamao del campo TIME almacena una hora. El rango de horas va desde -838 horas, 59 minutos y 59 segundos a 838, 59 minutos y 59 segundos. El formato de almacenamiento es de 'HH:MM:SS'

ISC
Taller de Base de Datos

YEAR almacena un ao. El rango de valores permitidos va desde el ao 1901 al ao 2155. El campo puede tener tamao dos o tamao 4 dependiendo de si queremos almacenar el ao con dos o cuatro dgitos. SET un campo que puede contener ninguno, uno varios valores de una lista. La lista puede tener un mximo de 64 valores. ENUM es igual que SET, pero solo se puede almacenar uno de los valores de la lista

Compilado por L.I. JHR

V SEMESTRE

PAG. 32

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN

Recurso Cinco:
Realizar la siguiente base de datos llamada BIBLIOTECA

Ejercicios de prctica

Libro(ClaveLibro, Ttulo, Idioma, Formato, Categora, ClaveEditorial) Tema(ClaveTema, Nombre) Autor(ClaveAutor, Nombre) Editorial(ClaveEditorial, Nombre, Direccin, Telfono) Ejemplar(ClaveLibro, NmeroOrden, Edicin, Ubicacin) Socio(ClaveSocio, Nombre, Direccin, Telfono, Categora) Prstamo(ClaveSocio, ClaveLibro, NmeroOrden, Fecha_prstamo, Fecha_devolucin, Notas) Trata_sobre(ClaveLibro, ClaveTema) Escrito_por(ClaveLibro, ClaveAutor) los tipos para las columnas:

Taller de Base de Datos

ISC

Col umna Cla veLibro Ti tulo Idioma Formato Ca tegoria(libro) Cla veTema Nombre(tema ) Cla veAutor Nombre(autor) Cla veEdi torial Nombre(edi torial) Di recci on(edi torial) Telefono(edi torial) NumeroOrden

Tipo INT VARCHAR(60) VARCHAR(15) VARCHAR(15) CHAR SMALLINT VARCHAR(40) INT VARCHAR(60) SMALLINT VARCHAR(60) VARCHAR(60) VARCHAR(15) SMALLINT

Edi cion Ubi ca cion Cla veSocio Nombre(socio) Di recci on(s ocio) Telefono(socio) Ca tegoria(soci o) Fecha _pres tamo

SMALLINT VARCHAR(15) INT VARCHAR(60) VARCHAR(60) VARCHAR(15) CHAR DATE

Fecha_devolucion Notas

DATE BLOB

Compilado por L.I. JHR

V SEMESTRE

PAG. 33

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


EJERC. 2: Realiza r la siguiente base de da tos llamada EMPRESA

Taller de Base de Datos

ISC
Examen 50% ( 2 partes. 1parte el lunes 20%, 2 parte el martes 30%) Ejercicios de tareas 15% Ejercicios de practica 15% Practicas de laboratorio 20% Examen el dia lunes 6 de octubre Entrega de ejercicios lunes 6 Entrega de ejercicios de practica lunes 6

Compilado por L.I. JHR

V SEMESTRE

PAG. 34

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN

UNIDAD TRES
Consultas y Lenguaje de Manipulacin de Datos (DML)
Objetivo Educacional: Consultar y manipular los datos de una base de datos.

ISC
Taller de Base de Datos

3.1 Instrucciones INSERT, UPDATE, DELETE.


o Insert La forma ms directa de insertar una fila nueva en una tabla es mediante una sentencia INSERT. En la forma ms simple de esta sentencia debemos indicar la tabla a la que queremos aadir filas, y los valores de cada columna. Las columnas de tipo cadena o fechas deben estar entre comillas sencillas o dobles, para las columnas numricas esto no es imprescindible, aunque tambin pueden estar entrecomilladas.
mysql> INSERT INTO gente VALUES ('Fulano','1974-04-12'); Query OK, 1 row affected (0.05 sec) mysql> INSERT INTO gente VALUES ('Mengano','1978-06-15'); Query OK, 1 row affected (0.04 sec) mysql> INSERT INTO gente VALUES('Tulano','2000 -12-02'),('Pegano','1993-02-10'); Query OK, 2 rows affected (0.02 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM gente; +---------+------------+ | nombre | fecha | +---------+------------+ | Fulano | 1974-04-12 | | Mengano | 1978-06-15 | | Tulano | 2000-12-02 | | Pegano | 1993-02-10 | +---------+------------+ 4 rows in set (0.08 sec)

Si no necesitamos asignar un valor concreto para alguna columna, podemos asignarle el valor por defecto indicado para esa columna cuando se cre la tabla, usando la palabra DEFAULT:
mysql> INSERT INTO ciudad2 VALUES ('Perillo', DEFAULT); Query OK, 1 row affected (0.03 sec)

Compilado por L.I. JHR

V SEMESTRE

PAG. 35

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


mysql> SELECT * FROM ciudad2; +---------+-----------+ | nombre | poblacion | +---------+-----------+ | Perillo | 5000 | +---------+-----------+ 1 row in set (0.02 sec)

En este caso, como habamos definido un valor por defecto para poblacin de 5000, se asignar ese valor para la fila correspondiente a 'Perillo'. Otra opcin consiste en indicar una lista de columnas para las que se van a suministrar valores. A las columnas que no se nombren en esa lista se les asigna el valor por defecto. Este sistema, adems, permite usar cualquier orden en las columnas, con la ventaja, con respecto a la anterior forma, de que no necesitamos conocer el orden de las columnas en la tabla pa ra poder insertar datos:
mysql> INSERT INTO ciudad5 (poblacion,nombre) VALUES (7000000, 'Madrid'), (9000000, 'Pars'), (3500000, 'Berln'); Query OK, 3 rows affected (0.05 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM ciudad5; +-------+--------+-----------+ | clave | nombre | poblacion | +-------+--------+-----------+ | 1 | Madrid | 7000000 | | 2 | Pars | 9000000 | | 3 | Berln | 3500000 | +-------+--------+-----------+ 3 rows in set (0.03 sec)

Taller de Base de Datos

ISC

Cuando creamos la tabla "ciudad5" definimos tres columnas: 'clave', 'nombre' y 'poblacion' (por ese orden). Ahora hemos insertado tres filas, en las que hemos omitido la clave, y hemos alterado el orden de 'nombre' y 'poblacion'. El valor de la 'clave' se calcula automticamente, ya que lo hemos definido como auto-incrementado. Existe otra sintaxis alternativa, que consiste en indicar el valor para cada columna:
mysql> INSERT INTO ciudad5 SET nombre='Roma', poblacion=8000000; Query OK, 1 row affected (0.05 sec) mysql> SELECT * FROM ciudad5; +-------+--------+-----------+ | clave | nombre | poblacion | +-------+--------+-----------+ | 1 | Madrid | 7000000 | | 2 | Pars | 9000000 | | 3 | Berln | 3500000 | | 4 | Roma | 8000000 | +-------+--------+-----------+ 4 rows in set (0.03 sec)

Compilado por L.I. JHR

V SEMESTRE

PAG. 36

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


Una vez ms, a las columnas para las que no indiquemos valores se les asignarn sus valores por defecto. Tambin podemos hacer esto usando el valor DEFAULT. Para las sintaxis que lo permiten, podemos observar que cuando se inserta ms de una fila en una nica sentencia, obtenemos un mensaje desde MySQL que indica el nmero de filas afectadas, el nmero de filas duplicadas y el nmero de avisos. Para que una fila se considere duplicada debe tener el mismo valor que una fila existente para una clave principal o para una clave nica. En tablas en las que no exista clave primaria ni ndices de clave nica no tiene sentido hablar de filas duplicadas. Es ms, en esas tablas es perfectamente posible que existan filas con los mismos valores para todas las columnas. Por ejemplo, en mitabla5 tenemos una clave nica sobre la columna 'nombre':
mysql> INSERT INTO mitabla5 (id, nombre) VALUES (1, 'Carlos'), (2, 'Felipe'),(3, 'Antonio'),(4, 'Carlos'),(5, 'Juan'); ERROR 1062 (23000): Duplicate entry 'Carlos' for key 1

ISC
Taller de Base de Datos

Si intentamos insertar dos filas con el mismo valor de la clave nica se produce un error y la sentencia no se ejecuta. Pero existe una opcin que podemos usar para los casos de claves duplicadas: ON DUPLICATE KEY UPDATE. En este caso podemos indicar a MySQL qu debe hacer si se intenta insertar una fila que ya existe en la tabla. Las opciones son limitadas: no podemos insertar la nueva fila, sino nicamente modificar la que ya existe. Por ejemplo, en la tabla 'ciudad3' podemos usar el ltimo valor de poblacin en caso de repeticin:
mysql> INSERT INTO ciudad3 (nombre, poblacion) VALUES('Madrid', 7000000); Query OK, 1 rows affected (0.02 sec) mysql> INSERT INTO ciudad3 (nombre, poblacion) VALUES ('Pars', 9000000), ('Madrid', 7200000) ON DUPLICATE KEY UPDATE poblacion=VALUES(poblacion); Query OK, 3 rows affected (0.06 sec) Records: 2 Duplicates: 1 Warnings: 0

mysql> SELECT * FROM ciudad3; +--------+-----------+ | nombre | poblacion | +--------+-----------+ | Madrid | 7200000 | | Pars | 9000000 | +--------+-----------+ 1 rows in set (0.00 sec)

En este ejemplo, la segunda vez que intentamos insertar la fila correspondiente a 'Madrid' se usar el nuevo valor de poblacin. Si en lugar de VALUES(poblacion) usamos poblacin el nuevo valor de poblacin se ignora. Tambin podemos usar cualquier expresin: Compilado por L.I. JHR V SEMESTRE PAG. 37

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


mysql> INSERT INTO ciudad3 (nombre, poblacion) VALUES -> ('Pars', 9100000) -> ON DUPLICATE KEY UPDATE poblacion=poblacion; Query OK, 2 rows affected (0.02 sec) mysql> SELECT * FROM ciudad3; +--------+-----------+ | nombre | poblacion | +--------+-----------+ | Madrid | 7200000 | | Pars | 9000000 | +--------+-----------+ 2 rows in set (0.00 sec) mysql> INSERT INTO ciudad3 (nombre, poblacion) VALUES -> ('Pars', 9100000) -> ON DUPLICATE KEY UPDATE poblacion=0; Query OK, 2 rows affected (0.01 sec) mysql> SELECT * FROM ciudad3; +--------+-----------+ | nombre | poblacion | +--------+-----------+ | Madrid | 7200000 | | Pars | 0 | +--------+-----------+ 2 rows in set (0.00 sec)

Taller de Base de Datos

ISC

o Update Podemos modificar valores de las filas de una tabla usando la sentencia UPDATE. En su forma ms simple, los cambios se aplican a todas las filas, y a las columnas que especifiquemos. UPDATE [LOW_PRIORITY] [IGNORE] tbl_name SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition] [ORDER BY ...] [LIMIT row_count] Por ejemplo, podemos aumentar en un 10% la poblacin de todas las ciudades de la tabla ciudad3 usando esta sentencia:
mysql> UPDATE ciudad3 SET poblacion=poblacion*1.10; Query OK, 5 rows affected (0.15 sec) Rows matched: 5 Changed: 5 Warnings: 0 mysql> SELECT * FROM ciudad3; +---------+-----------+ | nombre | poblacion | +---------+-----------+ | Berln | 6600000 | | Londres | 11000000 | | Madrid | 7920000 | | Pars | 10120000 | | Roma | 10450000 | +---------+-----------+

Compilado por L.I. JHR

V SEMESTRE

PAG. 38

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


Podemos, del mismo modo, actualizar el valor de ms de una columna, separndolas en la seccin SET mediante comas:
mysql> UPDATE ciudad5 SET clave=clave+10, poblacion=poblacion*0.97; Query OK, 4 rows affected (0.05 sec) Rows matched: 4 Changed: 4 Warnings: 0 mysql> SELECT * FROM ciudad5; +-------+--------+-----------+ | clave | nombre | poblacion | +-------+--------+-----------+ | 11 | Madrid | 6790000 | | 12 | Pars | 8730000 | | 13 | Berln | 3395000 | | 14 | Roma | 7760000 | +-------+--------+-----------+ 4 rows in set (0.00 sec)

ISC
Taller de Base de Datos

En este ejemplo hemos incrementado el valor de la columna 'clave' en 10 y disminuido el de la columna 'poblacion' en un 3%, para todas las filas. Pero no tenemos por qu actualizar todas las filas de la tabla. Podemos limitar el nmero de filas afectadas de varias formas. La primera es mediante la clusula WHERE. Usando e sta clusula podemos establecer una condicin. Slo las filas que cumplan esa condicin sern actualizadas:
mysql> UPDATE ciudad5 SET poblacion=poblacion*1.03 WHERE nombre='Roma'; Query OK, 1 row affected (0.05 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> SELECT * FROM ciudad5; +-------+--------+-----------+ | clave | nombre | poblacion | +-------+--------+-----------+ | 11 | Madrid | 6790000 | | 12 | Pars | 8730000 | | 13 | Berln | 3395000 | | 14 | Roma | 7992800 | +-------+--------+-----------+ 4 rows in set (0.00 sec)

En este caso slo hemos aumentado la poblacin de las ciudades cuyo nombre sea 'Roma'. Las condiciones pueden ser ms complejas. Existen muchas funciones y operadores que se pueden aplicar sobre cualquier tipo de columna, y tambin podemos usar operadores booleanos como AND u OR. Veremos esto con ms detalle en otros captulos. Otra forma de limitar el nmero de filas afectadas es usar la clusula LIMIT. Esta clusula permite especificar el nmero de filas a modificar:
mysql> UPDATE ciudad5 SET clave=clave-10 LIMIT 2; Query OK, 2 rows affected (0.05 sec) Rows matched: 2 Changed: 2 Warnings: 0

Compilado por L.I. JHR

V SEMESTRE

PAG. 39

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


mysql> SELECT * FROM ciudad5; +-------+--------+-----------+ | clave | nombre | poblacion | +-------+--------+-----------+ | 1 | Madrid | 6790000 | | 2 | Pars | 8730000 | | 13 | Berln | 3395000 | | 14 | Roma | 7992800 | +-------+--------+-----------+ 4 rows in set (0.00 sec)

ISC
Taller de Base de Datos

En este ejemplo hemos decrementado en 10 unidades la columna clave de las dos primeras filas.Esta clusula se puede combinar con WHERE, de modo que slo las 'n' primeras filas que cumplan una determinada condicin se modifiquen. Sin embargo esto no es lo habitual, ya que, si no existen claves primarias o nicas, el orden de las filas es arbitrario, no tiene sentido seleccionarlas usando slo la clusula LIMIT. La clusula LIMIT se suele asociar a la clusula ORDER BY. Por ejemplo, si queremos modificar la fila con la fecha ms antigua de la tabla 'gente', usaremos esta sentencia:
mysql> UPDATE gente SET fecha="1985-04-12" ORDER BY fecha LIMIT 1; Query OK, 1 row affected, 1 warning (0.03 sec) Rows matched: 1 Changed: 1 Warnings: 1 mysql> SELECT * FROM gente; +---------+------------+ | nombre | fecha | +---------+------------+ | Fulano | 1985-04-12 | | Mengano | 1978-06-15 | | Tulano | 2000-12-02 | | Pegano | 1993-02-10 | +---------+------------+ 4 rows in set (0.00 sec)

Si queremos modificar la fila con la fecha ms reciente, usaremos el orden inverso, es decir, el descendente:
mysql> UPDATE gente SET fecha="2001-12-02" ORDER BY fecha DESC LIMIT 1; Query OK, 1 row affected (0.03 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> SELECT * FROM gente; +---------+------------+ | nombre | fecha | +---------+------------+ | Fulano | 1985-04-12 | | Mengano | 1978-06-15 | | Tulano | 2001-12-02 | | Pegano | 1993-02-10 | +---------+------------+ 4 rows in set (0.00 sec)

Cuando exista una clave primaria o nica, se usar ese orden por defecto, si no se especifica una clusula ORDER BY. Compilado por L.I. JHR V SEMESTRE PAG. 40

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


o Delete Para eliminar filas se usa la sentencia DELETE. La sintaxis es muy parecida a la de UPDATE: DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM table_name [WHERE where_definition] [ORDER BY ...] [LIMIT row_count] La forma ms simple es no usar ninguna de las clusulas opcionales:

ISC
Taller de Base de Datos

mysql> DELETE FROM ciudad3; Query OK, 5 rows affected (0.05 sec)

De este modo se eliminan todas las filas de la tabla. Pero es ms frecuente que slo queramos eliminar ciertas filas que cumplan determinadas condiciones. La forma ms normal de hacer esto es usar la clusula WHERE:
mysql> DELETE FROM ciudad5 WHERE clave=2; Query OK, 1 row affected (0.05 sec) mysql> SELECT * FROM ciudad5; +-------+--------+-----------+ | clave | nombre | poblacion | +-------+--------+-----------+ | 1 | Madrid | 6790000 | | 13 | Berln | 3395000 | | 14 | Roma | 7992800 | +-------+--------+-----------+ 3 rows in set (0.01 sec)

Tambin podemos usar las clusulas LIMIT y ORDER BY del mismo modo que en la sentencia UPDATE, por ejemplo, para eliminar las dos ciudades con ms poblacin:
mysql> DELETE FROM ciudad5 ORDER BY poblacion DESC LIMIT 2; Query OK, 2 rows affected (0.03 sec) mysql> SELECT * FROM ciudad5; +-------+--------+-----------+ | clave | nombre | poblacion | +-------+--------+-----------+ | 13 | Berln | 3395000 | +-------+--------+-----------+ 1 row in set (0.00 sec)

Compilado por L.I. JHR

V SEMESTRE

PAG. 41

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN

3.2 Consultas Bsicas SELECT, WHERE y funciones a nivel de registro.


La sintaxis de SELECT es compleja. Una forma ms general consiste en la siguiente sintaxis: SELECT [ALL | DISTINCT | DISTINCTROW] expresion_select,... FROM referencias_de_tablas WHERE condiciones [GROUP BY {nombre_col | expresion | posicion} [ASC | DESC], ... [WITH ROLLUP]] [HAVING condiciones] [ORDER BY {nombre_col | expresion | posicion} [ASC | DESC] ,...] [LIMIT {[desplazamiento,] contador | contador OFFSET desplazamiento}] La forma ms sencilla es la que hemos usado hasta ahora, consiste en pedir todas las columnas y no especificar condiciones.
mysql>mysql> SELECT * FROM gente; +---------+------------+ | nombre | fecha | +---------+------------+ | Fulano | 1985-04-12 | | Mengano | 1978-06-15 | | Tulano | 2001-12-02 | | Pegano | 1993-02-10 | +---------+------------+ 4 rows in set (0.00 sec)

Taller de Base de Datos

ISC

Mediante la sentencia SELECT es posible hacer una proyeccin de una tabla, seleccionando las columnas de las que queremos obtener datos. En la sintaxis que hemos mostrado, la seleccin de columnas corresponde con la parte "expresion_select". En el ejemplo anterior hemos usado '*', que quiere decir que se muestran todas las columnas. Pero podemos usar una lista de columnas, y de ese modo slo se mostrarn esas columnas:
mysql> SELECT nombre FROM gente; +---------+ | nombre | +---------+ | Fulano | | Mengano | | Tulano | | Pegano | +---------+ 4 rows in set (0.00 sec)

Compilado por L.I. JHR

V SEMESTRE

PAG. 42

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


mysql> SELECT clave,poblacion FROM c iudad5; Empty set (0.00 sec)

Las expresiones_select no se limitan a nombres de columnas de tablas, pueden ser otras expresiones, incluso aunque no correspondan a ninguna tabla:
mysql> SELECT SIN(3.1416/2), 3+5, 7*4; +------------------+-----+-----+ | SIN(3.1416/2) | 3+5 | 7*4 | +------------------+-----+-----+ | 0.99999999999325 | 8 | 28 | +------------------+-----+-----+ 1 row in set (0.00 sec)

ISC
Taller de Base de Datos

Vemos que podemos usar funciones, en este ejemplo hemos usando la funcin SIN para calcular el seno de /2.

Tambin podemos aplicar funciones sobre columnas de tablas, y usar esas columnas en expresiones para generar nuevas columnas:
mysql> SELECT nombre, fecha, DATEDIFF(CURRENT_DATE(),fecha)/365 FROM gente; +---------+------------+------------------------------------+ | nombre | fecha | DATEDIFF(CURRENT_DATE(),fecha)/365 | +---------+------------+------------------------------------+ | Fulano | 1985-04-12 | 19.91 | | Mengano | 1978-06-15 | 26.74 | | Tulano | 2001-12-02 | 3.26 | | Pegano | 1993-02-10 | 12.07 | +---------+------------+------------------------------------+ 4 rows in set (0.00 sec)

Aprovechemos la ocasin para mencionar que tambin es posible asignar un alias a cualquiera de las expresiones select. Esto se puede hacer usando la palabra AS, aunque esta palabra es opcional:
mysql> SELECT nombre, fecha, DATEDIFF(CURRENT_DATE(),fecha)/365 AS edad -> FROM gente; +---------+------------+-------+ | nombre | fecha | edad | +---------+------------+-------+ | Fulano | 1985-04-12 | 19.91 | | Mengano | 1978-06-15 | 26.74 | | Tulano | 2001-12-02 | 3.26 | | Pegano | 1993-02-10 | 12.07 | +---------+------------+-------+ 4 rows in set (0.00 sec)

Podemos hacer:
mysql> SELECT 2+3 "2+3"; +-----+ | 2+3 | +-----+ | 5 | +-----+

Compilado por L.I. JHR

V SEMESTRE

PAG. 43

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


Mostrar filas repetidas Ya que podemos elegir slo algunas de las columnas de una tabla, es posible que se produzcan filas repetidas, debido a que hayamos excluido las columnas nicas. Por ejemplo, aadamos las siguientes filas a nuestra tabla:
mysql> INSERT INTO gente VALUES ('Pimplano', '1978-06-15'), -> ('Frutano', '1985-04-12'); Query OK, 2 rows affected (0.03 sec) Records: 2 Duplicates: 0 Warnings: 0

ISC
Taller de Base de Datos

mysql> SELECT fecha FROM gente; +------------+ | fecha | +------------+ | 1985-04-12 | | 1978-06-15 | | 2001-12-02 | | 1993-02-10 | | 1978-06-15 | | 1985-04-12 | +------------+ 6 rows in set (0.00 sec

Vemos que existen dos valores de filas repetidos, para la fecha "1985 -04-12" y para "1978-06-15". La sentencia que hemos usado asume el valor por defecto (ALL) para el grupo de opciones ALL, DISTINCT y DISTINCTROW. En realidad slo existen dos opciones, ya que las dos ltimas: DISTINCT y DISTINCTROW son sinnimos. La otra alternativa es usar DISTINCT, que har que slo se muestren las filas diferentes:
mysql> SELECT DISTINCT fecha FROM gente; +------------+ | fecha | +------------+ | 1985-04-12 | | 1978-06-15 | | 2001-12-02 | | 1993-02-10 | +------------+ 4 rows in set (0.00 sec)

Otra de las operaciones del lgebra relacional era la seleccin, que consista en seleccionar filas de una relacin que cumplieran determinadas condiciones. Lo que es ms til de una base de datos es la posibilidad de hacer consultas en funcin de ciertas condiciones. Generalmente nos interesar saber qu filas se ajustan a determinados parmetros. Por supuesto, SELECT permite usar condiciones como parte de su sintaxis, es decir, para hacer selecciones. Concretamente mediante la clusula WHERE, veamos algunos ejemplos:

Compilado por L.I. JHR

V SEMESTRE

PAG. 44

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


mysql> SELECT * FROM gente WHERE nombre="Mengano"; +---------+------------+ | nombre | fecha | +---------+------------+ | Mengano | 1978-06-15 | +---------+------------+ 1 row in set (0.03 sec) mysql> SELECT * FROM gente WHERE fecha>="1986-01-01"; +--------+------------+ | nombre | fecha | +--------+------------+ | Tulano | 2001-12-02 | | Pegano | 1993-02-10 | +--------+------------+ 2 rows in set (0.00 sec) mysql> SELECT * FROM gente WHERE fecha>="1986-01-01" AND fecha < "2000-01-01"; +--------+------------+ | nombre | fecha | +--------+------------+ | Pegano | 1993-02-10 | +--------+------------+ 1 row in set (0.00 sec)

ISC
Taller de Base de Datos

Mas ejemplos con el select:


Select Select Select Select Nombre Nombre, Nombre, Nombre, Nombre, edad, edad, edad, edad, Alojamiento Alojamiento Alojamiento Alojamiento Edad 18 23 from from from from empleado empleado empleado empleado order by order by order by group by Alojamiento Barajas Toledo edad; edad ASC; edad DESC; Edad, Alojamiento;

Diaz Jimnez Alonso Tellez Select Select Select Select Select Select Select Select

Renombrando columnas:

distinct Alojamiento From empleado; * from curso where ctarifa <150; * from curso where cnombre>=Racionalismo; ciudad, ventas, objetivo from oficinas where ventas > objetivo; nombre, ventas, cuota from repventas where numempl= 105; * from personal order by enombre dept, cargo, esueldo from personal order by dept, esueldo desc; ciudad, regios, ventas from oficinas order by region, ciudad;

Con condiciones:

Select ciudad, region, ventas-objetivo as SUPERHABIT from oficinas; Select ciudad, region, ventas-objetivo SUPERHABIT from oficinas;

Select nombre from repventas where contrato<1988-01-01; Select * from oficinas where ventas<0.8*objetivo; Select * from oficinas where dir<>108;

Compilado por L.I. JHR

V SEMESTRE

PAG. 45

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


Between
Select cnombre, cno, cdescrip from curso where cnombre between ES and ESZ Select * from pedidos where fechapedido between 1989-10-01 and 1989-12-31; Select cno, ctarifa from curso where ctarifa not between 50 and 400;

In

ISC

Select * from curso where ctarifa in(12,50,75,90,100,500); Select * from curso where ctarifa not in(12,50 ,75,90,100,500); Select * from repventas where oficinarep in (11,13,22); Select numpedido, fechapedido, importe from pedidos where fechapedido not in(199001-04, 1990-01-11, 1990-01-18, 1990-01-05);

Like

Select Select Select Select

Is null

* from curso where cdesp like pa% empresa, limitecredito from clientes where empresa like s% * from clientes where limitecredito not like 20000; * from clientes where limitecredito <> 20000;

Taller de Base de Datos

Select fnombre, fnumdep, fdept from claustro where fnumdep is not null Select nombre from ventas where oficinarep is not null

UNION Permite combinar resultados de dos o ms consultas en una nica tabla. Por ejemplo, visualizar todos los salarios de todo el personal y del claustro de la facultad en una nica tabla:
Select esueldo from personal UNION select fsueldo from claustro;

Lista todos los productos cuyo precio unitario excede de 2000 o con importe de pedido superior a 30000
Select idfab, idproducto from productos where precio >2000 UNION select distinct fab, producto from pedidos where importe > 30000;

3.3 Consultas sobre mltiples tablas. Hasta ahora todas las consultas que hemos usado se refieren slo a una tabla, pero tambin es posible hacer consultas usando varias tablas en la misma sentencia SELECT. Esto nos permite realizar otras dos operaciones de lgebra relacional: el producto cartesiano y la composicin.

Compilado por L.I. JHR

V SEMESTRE

PAG. 46

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


Insertemos:
mysql> INSERT INTO personas2 (nombre, fecha) VALUES ("Fulanito", "1956 -1214"),("Menganito", "1975-10-15"),("Tulanita", "1985-03-17"),("Fusganita", "1976-08-25"); Query OK, 4 rows affected (0.09 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM personas2; +----+-----------+------------+ | id | nombre | fecha | +----+-----------+------------+ | 1 | Fulanito | 1956-12-14 | | 2 | Menganito | 1975-10-15 | | 3 | Tulanita | 1985-03-17 | | 4 | Fusganita | 1976-08-25 | +----+-----------+------------+ 4 rows in set (0.00 sec) mysql> INSERT INTO telefonos2 (id, numero) VALUES (1, "123456789"),(1, "145654854"),(1, "152452545"),(2, "254254254"),(4, "456545654"),(4, "441415414"); Query OK, 6 rows affected (0.06 sec) Records: 6 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM telefonos2; +-----------+---------+ | numero | persona | +-----------+---------+ | 123456789 | 1 | | 145654854 | 1 | | 152452545 | 1 | | 254254254 | 2 | | 456545654 | 4 | | 441415414 | 4 | +-----------+---------+ 6 rows in set (0.00 sec)

Taller de Base de Datos

ISC

El producto cartesiano de dos tablas son todas las combinaciones de todas las filas de las dos tablas. Usando una sentencia SELECT se hace proyectando todos los atributos de ambas tablas. Los nombres de las tablas se indican en la clusula FROM separados con comas:
mysql> SELECT * FROM personas2,telefonos2; +----+-----------+------------+-----------+----+ | id | nombre | fecha | numero | id | +----+-----------+------------+-----------+----+ | 1 | Fulanito | 1956-12-14 | 123456789 | 1 | | 2 | Menganito | 1975-10-15 | 123456789 | 1 | | 3 | Tulanita | 1985-03-17 | 123456789 | 1 | | 4 | Fusganita | 1976-08-25 | 123456789 | 1 | | 1 | Fulanito | 1956-12-14 | 145654854 | 1 | | 2 | Menganito | 1975-10-15 | 145654854 | 1 | | 3 | Tulanita | 1985-03-17 | 145654854 | 1 | | 4 | Fusganita | 1976-08-25 | 145654854 | 1 | | 1 | Fulanito | 1956-12-14 | 152452545 | 1 | | 2 | Menganito | 1975-10-15 | 152452545 | 1 | | 3 | Tulanita | 1985-03-17 | 152452545 | 1 | | 4 | Fusganita | 1976-08-25 | 152452545 | 1 | | 1 | Fulanito | 1956-12-14 | 254254254 | 2 | | 2 | Menganito | 1975-10-15 | 254254254 | 2 | | 3 | Tulanita | 1985-03-17 | 254254254 | 2 |

Compilado por L.I. JHR

V SEMESTRE

PAG. 47

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


| 4 | Fusganita | 1976-08-25 | 254254254 | 2 | | 1 | Fulanito | 1956-12-14 | 456545654 | 4 | | 2 | Menganito | 1975-10-15 | 456545654 | 4 | | 3 | Tulanita | 1985-03-17 | 456545654 | 4 | | 4 | Fusganita | 1976-08-25 | 456545654 | 4 | | 1 | Fulanito | 1956-12-14 | 441415414 | 4 | | 2 | Menganito | 1975-10-15 | 441415414 | 4 | | 3 | Tulanita | 1985-03-17 | 441415414 | 4 | | 4 | Fusganita | 1976-08-25 | 441415414 | 4 | +----+-----------+------------+-----------+----+ 24 rows in set (0.73 sec)

ISC
Taller de Base de Datos

Las consultas multitablas o JOINS, tambin denominadas combinaciones o composiciones, permiten recuperar datos de dos tablas o mas segn las relaciones lgicas entre ellas. Ejemplo: Combina tabla pedido y clientes (que se separan por coma en la clusula from) mostrando el numero de pedido y su importe y el numero de cliente y su lmite de credito, utilizando para la combinacin la columna clie de la tabla pedidos y la columna numclie de la tabla clientes:
Select numpedido, clie=numclie; importe, empresa, limitecredito from pedidos, clientes where

O tambin(cuando hay duplicacin de nombre en los cam pos de la tabla):


Select pedidos.numpedido, pedidos.importe, clientes. Empresa, clientes.limitecredito from pedidos, clientes where clie=numclie;

3.3.1 Subconsultas.

Una subconsulta es una consulta dentro de otra. El SGBD usa los resultados de la subconsulta para determinar los resultados de la consulta de alto nivel que contiene a la subconsulta. En las formas mas simples de una subconsulta, esta aparece dentro de una clausula WHERE o HAVING de otra instruccin SQL. Las subconsultas proporcionan una forma natural y eficiente de manejar las solicitudes de consultas que se expresan en trminos de los resultados de otras. Listar las oficinas en las que el objetivo de ventas exceda la suma de las cuotas de cada representante. La solicitud pide una lista de oficinas de la tabla OFICINAS donde el valor de la columna OBJETIVO cumple alguna condicin. Parece razonable que la instruccin SELECT que expresa la consulta pueda ser como: Compilado por L.I. JHR V SEMESTRE PAG. 48

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


Select ciudad from oficinas where objetivo ???

El valor ??? se debe rellenar y debe ser igual a la suma de las cuotas de los representantes asignados a la oficina en cuestin. Cmo puede especificarse ese valor en la consulta? (suponga que el numero de oficina es 21) entonces la consulta para la suma de las cuotas de una oficina quedara de la siguiente manera.
Select sum(cuota) from representantes where oficina_rep=21

ISC
Taller de Base de Datos

Pero sera poco eficaz tener que escribir esta consulta, escribir los resultados y escribir en la consulta anterior la cantidad correcta. Cmo se pueden poner los resultados de esta consulta en la consulta anterior en lugar de los signos de interrogacin? As:
Select ciudad from oficinas where objetivo > ( Select sum(cuota) from repventas where oficinarep=oficina)

Para cada oficina, la consulta interna(la subconsulta) calcula la suma de las cuotas de los representantes que trabajan en esa oficina. La consulta externa (la consulta principal) compara el objetivo de la oficina con el total calculado y decide si aade la oficina a los resultados de la consulta principal. Al trabajar juntas, la consulta principal y la subconsulta expresan la solicitud original y recuperan los datos solicitados de la base de datos. CONCEPTO DE SUBCONSULTA La subconsulta se encierra entre parntesis; sin embargo tiene la forma familiar de una instruccin SELECT, con una clausula FROM y clausulas opcionales WHERE, GROUP BY y HAVING Comparacin en subconsultas Ejemplos: 1. Listar los representantes cuyas cuotas son iguales o superiores al objetivo de la oficina de ventas de Almera
Select nombre from repventas where cuota >= (select objetivo from oficinas where ciudad= los angeles and oficinarep=oficina);

2. Listar todos los clientes a los que sirve Bruno Arteaga


Select empresa from clientes where repcli = (select numempl from repventas where nombre =peter brothers);

3. Listar todos los productos del fabricante ACI para los que su Stock esta por encima del stock del producto ACI-41004 Compilado por L.I. JHR V SEMESTRE PAG. 49

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


Select descripcin, stock from productos where id_fab = ACI and stock > (select stock from productos where id_fab=ACI and id_producto= 41004)

Pertenencias a conjuntos (IN) El test de pertenencia a conjuntos (IN) en subconsultas es una forma modificada del test de pertenencia a conjuntos simples. Compara un unico valor de datos con una columna de valores de datos producidos por una subconsulta y devuelve un resultado TRUE si el valor de los datos coincide con uno de los valores de la columna. Este test se usa cuando es necesario comparar un valor de la fila que se est comprobando con un conjunto de valores producido por una subconsulta. Ejemplo: Listar todos los representantes que trabajan en oficinas que estn por encima de sus objetivos

ISC

Taller de Base de Datos

Select nombre from representantes oficinas where ventas > obejtivo)

where

oficina_rep

in

(select

oficina

from

La subconsulta produce un conjunto de nmeros de oficina donde las ventas son superiores a sus objetivos. La consulta principal comprueba a continuacin cada fila de la tabla representantes para determinar si un representante en concreto trabaja en una oficina con uno de estos nmeros Listar los representantes que no trabajan en oficinas dirigidas por Leon Freire (empleado 108)
Select nombre from oficinas where jef = 108) representantes where oficina_rep not in (select oficina from

Listar todos los clientes que han formulado pedidos de zapatos de ACI(fabricante ACI, numeros de producto comienzan en 4100) entre enero y junio de 1990
Select empresa from clientes where n um_cli in (select distinct cliente from pedidos where fab= ACI and producto like 4100% and fecha_pedido between 01-ene- 90 and 30jun-90)

Compilado por L.I. JHR

V SEMESTRE

PAG. 50

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


TABLAS USADAS EN LOS EJEMPLOS Listar los representantes cuyas cuotas son iguales o superiores al objetivo de la oficina de ventas de los ngeles
Tabla OFICINAS
+---------+-------------+--------+-----+----------+--------+ | Oficina | Ciudad | Region | Dir | Objetivo | Ventas | +---------+-------------+--------+-----+----------+--------+ | 12 | Chicago | Este | 104 | 800000 | 735042 | | 13 | Atlanta | Este | 105 | 350000 | 367911 | | 21 | Los angeles | Oeste | 108 | 725000 | 835915 | | 22 | Denver | Oeste | 108 | 300000 | 186042 | +---------+-------------+--------+------+---------+---------+

ISC

Tabla REPVENTAS
+---------+---------------+------+------------+------------+------------+----------+--------+--------+ | Numempl | Nombre | Edad | Oficinarep | Titulo | Contrato | Director | Cuota | Ventas |

+---------+---------------+------+------------+------------+------------+----------+--------+--------+ | 101 | Dan Roberts 102 | Sue Smith 103 | Paul Cruz 104 | Bob Smith 105 | Bill Adams | | | | | 45 | 48 | 29 | 33 | 37 | 49 | 62 | 31 | 35 | 11 | 11 | Rep Ventas | 1986 -10-20 | 21 | Rep Ventas | 1986 -12-12 | 11 | Rep Ventas | 1987 -03-01 | 11 | Dir Ventas | 1987 -05-19 | 13 | Rep Ventas | 1988 -02-12 | 22 | Rep Ventas | 1988 -11-14 | 21 | Dir Ventas | 1989 -10-12 | 11 | Rep Ventas | 1999 -10-12 | 15 | Dir Ventas | 1990 -07-25 | 0 | NULL | 0000 -00-00 | 104 | 257143 | 305673 | 108 | 333333 | 474050 | 104 | 235715 | 286775 | 106 | 171428 | 142594 | 104 | 333333 | 367911 | 108 | 285714 | 186042 | 106 | 333333 | 361865 | 106 | 285714 | 392725 | 108 | 100000 | 1990 | 103 | 0 | 15 |

Taller de Base de Datos

| | | | | | | | |

107 | Nancy Angelli | 108 | Larry Fitch 109 | Mary Jones 11 | Matas Clark 0 | 35 | | | |

+---------+---------------+------+------------+------------+------------+----------+--------+--------+

Tabla CLIENTES
+---------+------------------+---------+---------------+ | Numclie | Empresa | Repclie | Limitecredito | +---------+------------------+---------+---------------+ | 2101 | Jones Mfg. | 102 | 65000 | | 2106 | Fred Lewis Corp. | 102 | 65000 | | 2109 | Chen Associates | 103 | 25000 | | 2111 | JCP Inc. | 103 | 50000 | | 2112 | Zetacorp | 108 | 50000 | | 2113 | Ian Schmidt | 104 | 20000 | | 2114 | Orion Corp. | 102 | 20000 | | 2117 | J.P. Sinclair | 102 | 35000 | | 2118 | Midwest Systems | 108 | 60000 | | 2120 | Rico Enterprises | 102 | 50000 | | 2121 | QMA Assoc. | 103 | 45000 | | 2123 | Carter Sons | 102 | 40000 | | 2124 | Peter Brothers | 102 | 40000 | | 2127 | Intercorp | 109 | 60000 | +---------+-------------------+---------+---------------+

Compilado por L.I. JHR

V SEMESTRE

PAG. 51

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


Tabla PEDIDOS
+-----------+-------------+------+-----+-----+----------+------+---------+ | Numpedido | Fechapedido | Clie | Rep | Fab | Producto | Cant | Importe | +-----------+-------------+------+-----+-----+----------+------+---------+ | 112963 | 1989-12-17 | 2103 | 105 | ACI | 41004 | 28 | 3276 | | 112983 | 1989-12-27 | 2103 | 105 | ACI | 41004 | 6 | 702 | | 112987 | 1989-12-31 | 2103 | 105 | ACI | 4100Y | 11 | 27500 | | 112997 | 1990-01-08 | 2124 | 107 | BIC | 41003 | 1 | 652 | | 113003 | 1990-01-25 | 2108 | 109 | IMM | 779C | 3 | 5625 | | 113007 | 1990-01-08 | 2112 | 108 | IMM | 773C | 3 | 2925 | | 113012 | 1990-01-11 | 2111 | 105 | ACI | 41003 | 35 | 3745 | | 113013 | 1990-01-14 | 2118 | 108 | BIC | 41003 | 1 | 652 | | 113024 | 1990-01-20 | 2114 | 108 | QSA | XK47 | 20 | 7100 | | 113027 | 1990-01-22 | 2103 | 105 | ACI | 41002 | 54 | 4104 | | 113042 | 1990-02-02 | 2113 | 101 | REI | 2A44R | 5 | 22500 | | 113045 | 1990-02-02 | 2112 | 108 | REI | 2A44R | 10 | 45000 | | 113048 | 1990-02-10 | 2120 | 102 | IMM | 779C | 2 | 3750 | | 113049 | 1990-02-10 | 2118 | 108 | QSA | XK47 | 6 | 2130 | | 113051 | 1990-02-10 | 2118 | 108 | QSA | XK47 | 4 | 1420 | | 113055 | 1990-02-15 | 2108 | 101 | ACI | 4100X | 6 | 150 | | 113057 | 1990-02-18 | 2111 | 103 | ACI | 4100X | 24 | 600 | | 113058 | 1990-02-23 | 2108 | 109 | FEA | 112 | 10 | 1480 | | 113062 | 1990-02-24 | 2124 | 107 | FEA | 114 | 10 | 2430 | | 113065 | 1990-02-27 | 2106 | 102 | QSA | XK47 | 6 | 2130 | | 113069 | 1990-03-02 | 2109 | 107 | IMM | 775C | 22 | 31350 | +-----------+-------------+------+-----+-----+----------+------+---------+

Taller de Base de Datos

ISC

Tabla PRODUCTOS
+-------+------------+-------------------+--------+-------------+ | Idfab | Idproducto | Descripcion | Precio | Existencias | +-------+------------+-------------------+--------+-------------+ | ACI | 41001 | Artculo Tipo 1 | 55 | 277 | | ACI | 41002 | Artculo Tipo 2 | 76 | 167 | | ACI | 41003 | Artculo Tipo 3 | 107 | 207 | | ACI | 41004 | Artculo Tipo 4 | 117 | 139 | | ACI | 4100X | Ajustador | 25 | 37 | | ACI | 4100Y | Extractor | 2750 | 25 | | ACI | 4100Z | Montador | 2500 | 28 | | BIC | 41003 | Manivela | 652 | 3 | | BIC | 41089 | Retn | 225 | 78 | | BIC | 41672 | Plate | 180 | 0 | | FEA | 112 | Cubierta | 148 | 115 | | FEA | 114 | Bancada Motor | 243 | 15 | | IMM | 773C | Riostra 1/2 Tm | 975 | 28 | | IMM | 775C | Riostra 1-Tm | 1425 | 5 | | IMM | 779C | Riostra 2-Tm | 1875 | 9 | | IMM | 878H | Soporte Riostra | 54 | 223 | | IMM | 887P | Perno Riostra | 250 | 24 | | IMM | 887X | Retenedor Riostra | 475 | 32 | | QSA | XK47 | Reductor | 355 | 38 | | QSA | XK48 | Reductor | 134 | 203 |

Compilado por L.I. JHR

V SEMESTRE

PAG. 52

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


| QSA | XK48A | Reductor | 117 | 37 | | REI | 2A44G | Pasador Bisagra | 350 | 14 | | REI | 2A44L | Bisagra Izqda. | 4500 | 12 | | REI | 2A44R | Bisagra Dcha. | 4500 | 12 | | REI | 2A45C | V Stago Trinquete | 79 | 210 | +-------+------------+-------------------+--------+-------------+

Obtener el nombre de la materia que cursa el alumno con nmero de control 97310211 con crditos igual a ocho.

ISC

SELECT NombreM FROM Materia WHERE NControl=97310211;

WHERE creditos=8 and clave in(SELECT clave FROM cursa

Obtener el nmero de control del alumno que tenga alguna calificacin igual a 100
SELECT DISTINC(NControl) FROM Cursa WHERE Calif=100;

Obtener el nombre de las materias que cursa el alumno Salvador Chvez.


SELECT NombreM FROM Materia WHERE Clave in (SELECT DISTINC (Clave) FROM Cursa WHERE NControl in (SELECT Ncontrol FROM Alumno WHERE NombreA=Salvador Chvez));

Taller de Base de Datos

3.3.2 Operadores JOIN.

Un JOIN de dos tablas es una combinacin entre las mismas basada en la coincidencia exacta(u otro tipo de comparacin) de dos columnas, una de cada tabla. El JOIN forma parejas de filas haciendo coincidir los contenidos de las columnas relacionadas. Ejemplo: Visualizar la informacin de las tablas curso y departamento para que los valores de CDEPT en curso coinciden con los valores de DEPT en departamento;
Select * from curso, departamento where cdept=Dep;

Recordemos que se trata de un producto cartesiano restringido, las tuplas que se emparejan deben cumplir una determinada condicin. En el lgebra relacional slo hemos hablado de composiciones en general. Sin embargo, en SQL se trabaja con varios tipos de composiciones.

Compilado por L.I. JHR

V SEMESTRE

PAG. 53

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


Composiciones internas Todas las composiciones que hemos visto hasta ahora se denominan composiciones internas. Para hacer una composicin interna se parte de un producto cartesiano y se eliminan aquellas tuplas que no cumplen la condicin de la composicin. En el ejemplo anterior tenemos 24 tuplas procedentes del producto cartesiano de las tablas personas2 y telfonos2. Si la condicin para la composicin es que personas2.id=telefonos2.id, tendremos que eliminar todas las tuplas en que la condicin no se cumpla. Estas composiciones se denominan internas porque en la salida no aparece ninguna tupla que no est presente en el producto cartesiano, es decir, la composicin se hace en el interior del producto cartesiano de las tablas. Para consultar la sintaxis de las composiciones ver JOIN. Las composiciones internas usan estas sintaxis:

Taller de Base de Datos

ISC

referencia_tabla, referencia_tabla referencia_tabla [INNER | CROSS] JOIN referencia_tabla [condicin]

La condicin puede ser:


ON expresin_condicional | USING (lista_columnas)

La coma y JOIN son equivalentes, y las palabras INNER y CROSS son opcionales. La condicin en la clusula ON puede ser cualquier expresin vlida para una clusula WHERE, de hecho, en la mayora de los casos, son equivalentes. La clusula USING nos permite usar una lista de atributos que deben ser iguales en las dos tablas a componer. Siguiendo con el mismo ejemplo, la condicin ms lgica para la composicin interna entre personas2 y telfonos2 es la igualdad entre el identificador de persona en la primera tabla y el atributo persona en la segunda:

Compilado por L.I. JHR

V SEMESTRE

PAG. 54

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


mysql> SELECT * FROM personas2, telefonos2 WHERE personas2.id=telefonos2.id; +----+-----------+------------+-----------+----+ | id | nombre | fecha | numero | id | +----+-----------+------------+-----------+----+ | 1 | Fulanito | 1956-12-14 | 123456789 | 1 | | 1 | Fulanito | 1956-12-14 | 145654854 | 1 | | 1 | Fulanito | 1956-12-14 | 152452545 | 1 | | 2 | Menganito | 1975-10-15 | 254254254 | 2 | | 4 | Fusganita | 1976-08-25 | 456545654 | 4 | | 4 | Fusganita | 1976-08-25 | 441415414 | 4 | +----+-----------+------------+-----------+----+ 6 rows in set (0.73 sec)

ISC

Esta consulta es equivalente a estas otras:


mysql> SELECT * mysql> SELECT * telefono2.id); mysql> SELECT * telefono2.id); mysql> SELECT * telefono2.id); mysql> SELECT * FROM personas2 JOIN telefono2 ON (personas2.id = telefono2.id); FROM personas2 JOIN telefono2 WHERE (personas2.id = FROM personas2 INNER JOIN telefono2 ON (personas2.id = FROM personas2 CROSS JOIN telefono2 ON (personas2.id = FROM personas2 JOIN telefono2 USING(id);

Taller de Base de Datos

En cualquier caso, la salida slo contiene las tuplas que emparejan a personas con sus nmeros de telfono. Las tuplas correspondientes a personas que no tienen ningn nmero no aparecen, como por ejemplo las correspondientes a "Tulanita". Para las personas con varios nmeros, se repiten los datos de la persona para cada nmero, por ejemplo con "Fulanito" o "Fusganita". Composicin interna natural Consiste en una proyeccin sobre un producto cartesiano restringido. Es decir, slo elegimos determinadas columnas de ambas tablas, en lugar de seleccionar todas. Podemos hacer esto a partir de una composicin general, eligiendo todas las columnas menos las repetidas:
mysql> SELECT personas2.id,nombre,fecha,numero FROM personas2, telefonos2 WHERE personas2.id=telefonos2.id; +----+-----------+------------+-----------+ | id | nombre | fecha | numero | +----+-----------+------------+-----------+ | 1 | Fulanito | 1956-12-14 | 123456789 | | 1 | Fulanito | 1956-12-14 | 145654854 | | 1 | Fulanito | 1956-12-14 | 152452545 | | 2 | Menganito | 1975-10-15 | 254254254 | | 4 | Fusganita | 1976-08-25 | 456545654 | | 4 | Fusganita | 1976-08-25 | 441415414 |

Compilado por L.I. JHR

V SEMESTRE

PAG. 55

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


+----+-----------+------------+-----------+ 6 rows in set (0.00 sec)

Como la columna id existe en ambas tablas estamos obligados a usar el nombre completo para esta columna. En este caso hemos optado por personas2.id, pero hubiese sido igual usar telefonos2.id. Tambin podemos definir alias para las tablas, y conseguir una consulta ms compacta:

ISC
Taller de Base de Datos

mysql> SELECT t1.id,nombre,fecha,numero FROM personas2 AS t1, telefonos2 AS t2 WHERE t1.id=t2.id;

Por supuesto, podemos usar JOIN y ON en lugar de la coma y WHERE:


mysql> SELECT t1.id,nombre,fecha,numero FROM personas2 AS t1 JOIN telefonos2 AS t2 ON t1.id=t2.id;

Pero tenemos una sintaxis alternativa mucho mejor para hacer composiciones internas naturales: referencia_tabla NATURAL JOIN referencia_tabla Por ejemplo:
mysql> SELECT * FROM personas2 NATURAL JOIN telefonos2; +----+-----------+------------+-----------+ | id | nombre | fecha | numero | +----+-----------+------------+-----------+ | 1 | Fulanito | 1956-12-14 | 123456789 | | 1 | Fulanito | 1956-12-14 | 145654854 | | 1 | Fulanito | 1956-12-14 | 152452545 | | 2 | Menganito | 1975-10-15 | 254254254 | | 4 | Fusganita | 1976-08-25 | 456545654 | | 4 | Fusganita | 1976-08-25 | 441415414 | +----+-----------+------------+-----------+ 6 rows in set (0.02 sec)

Compilado por L.I. JHR

V SEMESTRE

PAG. 56

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


Composiciones externas Al contrario que con las composiciones internas, las externas no proceden de un producto cartesiano. Por lo tanto, en estas pueden aparecer tuplas que no aparecen en el producto cartesiano. Para hacer una composicin externa se toman las tuplas de una de las tablas una a una y se combinan con las tuplas de la otra.

ISC
Taller de Base de Datos

Como norma general se usa un ndice para localizar las tuplas de la segunda tabla que cumplen la condicin, y para cada tupla encontrada se aade una fila a la tabla de salida. Si no existe ninguna tupla en la segunda tabla que cumpla las condiciones, se combina la tupla de la primera con una nula de la segunda. En nuestro ejemplo se tomara la primera tupla de personas2, con un valor de id igual a 1, y se busca en la tabla telefonos2 las tuplas con un valor de id igual a 1. Lo mismo para la segunda tupla, con id igual a 2. En la tercera el id es 3, y no existe ninguna tupla en telefonos2 con un valor de id igual a 3, por lo tanto se combina la tupla de personas2 con una tupla de telefonos2 con todos los atributos igual a NULL. Por ejemplo:
mysql> SELECT * FROM personas2 LEFT JOIN telefonos2 USING(id); +----+-----------+------------+-----------+------+ | id | nombre | fecha | numero | id | +----+-----------+------------+-----------+------+ | 1 | Fulanito | 1956-12-14 | 123456789 | 1 | | 1 | Fulanito | 1956-12-14 | 145654854 | 1 | | 1 | Fulanito | 1956-12-14 | 152452545 | 1 | | 2 | Menganito | 1975-10-15 | 254254254 | 2 | | 3 | Tulanita | 1985-03-17 | NULL | NULL | (1) | 4 | Fusganita | 1976-08-25 | 456545654 | 4 | | 4 | Fusganita | 1976-08-25 | 441415414 | 4 | +----+-----------+------------+-----------+------+ 7 rows in set (0.05 sec)

La quinta fila (1), tiene valores NULL para numero e id de telefonos2, ya que no existen tuplas en esa tabla con un valor de id igual a 3. Las sintaxis para composiciones externas son: referencia_tabla LEFT [OUTER] JOIN referencia_tabla [join_condition] referencia_tabla NATURAL LEFT [OUTER] JOIN referencia_tabla Compilado por L.I. JHR V SEMESTRE PAG. 57

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


referencia_tabla RIGHT [OUTER] JOIN referencia_tabla [condicin] referencia_tabla NATURAL RIGHT [OUTER] JOIN referencia_tabla

La condicin puede ser: ON expresin_condicional | USING (lista_columnas)

ISC
Taller de Base de Datos

La palabra OUTER es opcional. Existen dos grupos de composiciones externas: izquierda y derecha, dependiendo de cual de las tablas se lea en primer lugar.

Composicin externa izquierda En estas composiciones se recorre la tabla de la izquierda y se buscan tuplas en la de la derecha. Se crean usando la palabra LEFT (izquierda, en ingls). Las sintaxis para la composicin externa izquierda es: referencia_tabla LEFT [OUTER] JOIN referencia_tabla [condicin] Veamos un ejemplo. Para empezar, crearemos un par de tablas:
mysql> CREATE TABLE tabla1 (id INT NOT NULL, nombre CHAR(10),PRIMARY KEY (id)); Query OK, 0 rows affected (0.42 sec) mysql> CREATE TABLE tabla2 (id INT NOT NULL, numero INT, PRIMARY KEY(id)); Query OK, 0 rows affected (0.11 sec)

E insertaremos algunos datos:


mysql> INSERT INTO tabla1 VALUES (5, "Juan"), (6, "Pedro"), (7, "Jos"), (8, "Fernando"); Query OK, 4 rows affected (0.06 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> INSERT INTO tabla2 VALUES(3, 30), (4, 40), (5, 50), (6, 60); Query OK, 5 rows affected (0.05 sec) Records: 5 Duplicates: 0 Warnings: 0

Compilado por L.I. JHR

V SEMESTRE

PAG. 58

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


La composicin izquierda sera:
mysql> SELECT * FROM tabla1 LEFT JOIN tabla2 USING(id); +----+----------+------+--------+ | id | nombre | id | numero | +----+----------+------+--------+ | 5 | Juan | 5 | 50 | | 6 | Pedro | 6 | 60 | | 7 | Jos | NULL | NULL | | 8 | Fernando | NULL | NULL | +----+----------+------+--------+ 4 rows in set (0.00 sec)

ISC
Taller de Base de Datos

Se puede ver que aparecen dos filas con valores NULL, para los id 7 y 8. En contraposicin, una composicin interna dar esta salida:
mysql> SELECT * FROM tabla1 JOIN tabla2 USING(id); +----+--------+----+--------+ | id | nombre | id | numero | +----+--------+----+--------+ | 5 | Juan | 5 | 50 | | 6 | Pedro | 6 | 60 | +----+--------+----+--------+ 2 rows in set (0.06 sec)

Composicin externa derecha En este caso se recorre la tabla de la derecha y se buscan tuplas que cumplan la condicin en la tabla izquierda. La sintaxis es equivalente: referencia_tabla LEFT [OUTER] JOIN referencia_tabla [condicin] Usando las mismas tablas que en el ejemplo anterior:
mysql> SELECT * FROM tabla1 RIGHT JOIN tabla2 USING(id); +------+--------+----+--------+ | id | nombre | id | numero | +------+--------+----+--------+ | NULL | NULL | 3 | 30 | | NULL | NULL | 4 | 40 | | 5 | Juan | 5 | 50 | | 6 | Pedro | 6 | 60 | +------+--------+----+--------+ 4 rows in set (0.00 sec)

Compilado por L.I. JHR

V SEMESTRE

PAG. 59

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


Es lo mismo usar una composicin derecha de las tablas tabla1 y tabla2 que una composicin izquierda de las tablas tabla2 y tabla1. Es decir, la consulta anterior es equivalente a esta otra:
mysql> SELECT * FROM tabla2 LEFT JOIN tabla1 USING(id);

Composiciones naturales externas

ISC
Taller de Base de Datos

Por supuesto, tambin podemos hacer composiciones externas naturales: referencia_tabla NATURAL LEFT [OUTER] JOIN referencia_tabla referencia_tabla NATURAL RIGHT [OUTER] JOIN referencia_tabla El problema es que si existen tuplas aadidas con respecto a la composicin interna, no se eliminar ninguna columna. Los mismos ejemplos anteriores, como composiciones naturales externas seran:
mysql> SELECT * FROM tabla1 NATURAL LEFT JOIN tabla2; +----+----------+------+--------+ | id | nombre | id | numero | +----+----------+------+--------+ | 5 | Juan | 5 | 50 | | 6 | Pedro | 6 | 60 | | 7 | Jos | NULL | NULL | | 8 | Fernando | NULL | NULL | +----+----------+------+--------+ 4 rows in set (0.00 sec) mysql> SELECT * FROM tabla1 NATURAL RIGHT JOIN tabla2; +------+--------+----+--------+ | id | nombre | id | numero | +------+--------+----+--------+ | NULL | NULL | 3 | 30 | | NULL | NULL | 4 | 40 | | 5 | Juan | 5 | 50 | | 6 | Pedro | 6 | 60 | +------+--------+----+--------+ 4 rows in set (0.00 sec)

Tambin es posible realizar la operacin de lgebra relacional unin entre varias tablas o proyecciones de tablas. Para hacerlo se usa la sentencia UNION que permite combinar varias sentencias SELECT para crear una nica tabla de salida.

Compilado por L.I. JHR

V SEMESTRE

PAG. 60

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


Las condiciones para que se pueda crear una unin son las mismas que vimos al estudiar el lgebra relacional: las relaciones a unir deben tener el mismo nmero de atributos, y adems deben ser de dominios compatibles.
mysql> CREATE TABLE stock1 ( -> id INT NOT NULL, -> nombre VARCHAR(30), -> cantidad INT, -> PRIMARY KEY (id)); Query OK, 0 rows affected (0.08 sec)

ISC
Taller de Base de Datos

mysql> CREATE TABLE stock2 ( -> id INT NOT NULL, -> nombre VARCHAR(40), -> cantidad SMALLINT, -> PRIMARY KEY (id)); Query OK, 0 rows affected (0.16 sec) mysql> CREATE TABLE stock3 ( -> id INT NOT NULL, -> nombre VARCHAR(35), -> numero MEDIUMINT, -> PRIMARY KEY (id)); Query OK, 0 rows affected (0.08 sec) mysql> INSERT INTO stock1 VALUES -> (1, "tornillo M3x12", 100), -> (2, "tornillo M3x15", 120), -> (3, "tornillo M4x25", 120), -> (4, "tornillo M5x30", 200); Query OK, 4 rows affected (0.03 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> INSERT INTO stock2 VALUES -> (10, "tuerca M4", 120), -> (11, "tuerca M3", 100), -> (12, "tuerca M5", 87); Query OK, 3 rows affected (0.05 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> INSERT INTO stock3 VALUES -> (20, "varilla 10", 23), -> (1, "tornillo M3x12", 22), -> (21, "varilla 12", 32), -> (11, "tuerca M3", 22); Query OK, 4 rows affected (0.03 sec) Records: 4 Duplicates: 0 Warnings: 0

Podemos crear una unin de las tres tablas, a pesar de que los nombres y tamaos de algunas columnas sean diferentes:

Compilado por L.I. JHR

V SEMESTRE

PAG. 61

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


mysql> SELECT * FROM stock1 UNION -> SELECT * FROM stock2 UNION -> SELECT * FROM stock3; +----+----------------+----------+ | id | nombre | cantidad | +----+----------------+----------+ | 1 | tornillo M3x12 | 100 | | 2 | tornillo M3x15 | 120 | | 3 | tornillo M4x25 | 120 | | 4 | tornillo M5x30 | 200 | | 10 | tuerca M4 | 120 | | 11 | tuerca M3 | 100 | | 12 | tuerca M5 | 87 | | 1 | tornillo M3x12 | 22 | | 11 | tuerca M3 | 22 | | 20 | varilla 10 | 23 | | 21 | varilla 12 | 32 | +----+----------------+----------+ 11 rows in set (0.00 sec)

ISC
Taller de Base de Datos

El resultado se puede ordenar usando ORDER BY y tambin podemos seleccionar un nmero limitado de filas mediante LIMIT:
mysql> (SELECT * FROM stock1) UNION -> (SELECT * FROM stock2) UNION -> (SELECT * FROM stock3) ORDER BY id LIMIT 6; +----+----------------+----------+ | id | nombre | cantidad | +----+----------------+----------+ | 1 | tornillo M3x12 | 100 | | 1 | tornillo M3x12 | 22 | | 2 | tornillo M3x15 | 120 | | 3 | tornillo M4x25 | 120 | | 4 | tornillo M5x30 | 200 | | 10 | tuerca M4 | 120 | +----+----------------+----------+ 6 rows in set (0.00 sec)

Con ALL se muestran todas las filas, aunque estn repetidas, con DISTINCT slo se muestra una copia de cada fila:
mysql> SELECT id,nombre FROM stock1 UNION -> SELECT id,nombre FROM stock2 UNION -> SELECT id,nombre FROM stock3; +----+----------------+ | id | nombre | +----+----------------+ | 1 | tornillo M3x12 | | 2 | tornillo M3x15 | | 3 | tornillo M4x25 | | 4 | tornillo M5x30 | | 10 | tuerca M4 |

Compilado por L.I. JHR

V SEMESTRE

PAG. 62

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


| 11 | tuerca M3 | | 12 | tuerca M5 | | 20 | varilla 10 | | 21 | varilla 12 | +----+----------------+ 9 rows in set (0.00 sec) mysql> SELECT id,nombre FROM stock1 UNION ALL -> SELECT id,nombre FROM stock2 UNION ALL -> SELECT id,nombre FROM stock3; +----+----------------+ | id | nombre | +----+----------------+ | 1 | tornillo M3x12 | | 2 | tornillo M3x15 | | 3 | tornillo M4x25 | | 4 | tornillo M5x30 | | 10 | tuerca M4 | | 11 | tuerca M3 | | 12 | tuerca M5 | | 1 | tornillo M3x12 | | 11 | tuerca M3 | | 20 | varilla 10 | | 21 | varilla 12 | +----+----------------+ 11 rows in set (0.00 sec)

Taller de Base de Datos

ISC

3.4 Agregacin GROUP BY, HAVING. GROUP BY Permite combinar en un nico registro los registros con valores idnticos en la lista de campos especificada Es posible agrupar filas en la salida de una sentencia SELECT segn los distintos valores de una columna, usando la clusula GROUP BY. Esto, en principio, puede parecer redundante, ya que podamos hacer lo mismo usando la opcin DISTINCT. Sin embargo, la clusula GROUP BY es ms potente:
mysql> SELECT fecha FROM gente GROUP BY fecha; +------------+ | fecha | +------------+ | 1978-06-15 | | 1985-04-12 | | 1993-02-10 | | 2001-12-02 | +------------+ 4 rows in set (0.00 sec)

Compilado por L.I. JHR

V SEMESTRE

PAG. 63

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


La primera diferencia que observamos es que si se usa GROUP BY la salida se ordena segn los valores de la columna indicada. En este caso, las columnas aparecen ordenadas por fechas. Otra diferencia es que se eliminan los valores duplicados an si la proyeccin no contiene filas duplicadas, por ejemplo:
mysql> SELECT nombre,fecha FROM gente GROUP BY fecha; +---------+------------+ | nombre | fecha | +---------+------------+ | Mengano | 1978-06-15 | | Fulano | 1985-04-12 | | Pegano | 1993-02-10 | | Tulano | 2001-12-02 | +---------+------------+ 4 rows in set (0.00 sec)

ISC
Taller de Base de Datos

Pero la diferencia principal es que el uso de la clusula GROUP BY permite usar funciones de resumen o reunin. Por ejemplo, la funcin COUNT(), que sirve para contar las filas de cada grupo:
mysql> SELECT fecha, COUNT(*) AS cuenta FROM gente GROUP BY fecha; +------------+--------+ | fecha | cuenta | +------------+--------+ | 1978-06-15 | 2 | | 1985-04-12 | 2 | | 1993-02-10 | 1 | | 2001-12-02 | 1 | +------------+--------+ 4 rows in set (0.00 sec)

HAVING Es similar al where. La clusula where determina que registros se seleccionan. De forma parecida, una vez que los registros se agrupan con la clusula group by, la clusula having determina que registros se van a mostrar. Utilice la clusula where para eliminar registros que no desea que se agrupen mediante la clusula group by. La clusula HAVING permite hacer selecciones en situaciones en las que no es posible usar WHERE. Veamos un ejemplo completo:

Compilado por L.I. JHR

V SEMESTRE

PAG. 64

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN

mysql> CREATE TABLE muestras ( -> ciudad VARCHAR(40), -> fecha DATE, -> temperatura TINYINT); Query OK, 0 rows affected (0.25 sec) mysql> mysql> INSERT INTO muestras (ciudad,fecha,temperatura) VALUES -> ('Madrid', '2005-03-17', 23), -> ('Pars', '2005-03-17', 16), -> ('Berln', '2005-03-17', 15), -> ('Madrid', '2005-03-18', 25), -> ('Madrid', '2005-03-19', 24), -> ('Berln', '2005-03-19', 18); Query OK, 6 rows affected (0.03 sec) Records: 6 Duplicates: 0 Warnings: 0 mysql> SELECT ciudad, MAX(temperatura) FROM muestras -> GROUP BY ciudad HAVING MAX(temperatura)>16; +--------+------------------+ | ciudad | MAX(temperatura) | +--------+------------------+ | Berln | 18 | | Madrid | 25 | +--------+------------------+ 2 rows in set (0.00 sec)

Taller de Base de Datos

ISC

3.5 Funciones de conjunto de registros COUNT, SUM, AVG, MAX, MIN


mysql> SELECT MAX(nombre) FROM gente; +-------------+ | max(nombre) | +-------------+ | Tulano | +-------------+ 1 row in set (0.00 sec)

Ejemplos: Obtener el nmero de alumnos que existen en la carrera de Ingeniera en Sistemas Computacionales.
SELECT Count (*) FROM Alumno WHERE especialidad=ISC;

Obtener la mximo calificacin que ha obtenido J.M. Cadena.


SELECT Max(Calif) FROM Cursa WHERE NControl IN (SELECT Ncontrol FROM Alumno WHERE NombreA= J.M. Cadena );

Obtener el promedio de calificaciones de Salvador Chvez.

Compilado por L.I. JHR

V SEMESTRE

PAG. 65

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


SELECT Avg (Calif) FROM Cursa WHERE NCotrol IN (SELECT Ncontrol NombreA=Salvador Chvez); FROM Alumno WHERE

Obtener la suma total de las calificaciones obtenidas por Daniel Coln.


SELECT Sum (Calif) FROM NombreA=Daniel Coln); Cursa WHERE NControl IN (SELECT NControl FROM Alumno WHERE

ISC

ACTIVIDADES DE APRENDIZAJE

Taller de Base de Datos

Conocer y aplicar comandos para realizar consultas bsicas y de mltiples tablas. Consultar y manipular bases de datos ya existentes. Insertar, actualizar y borrar datos individuales y en conjunto. Desarrollar ejercicios de consulta, manipulacin y agregacin de datos utilizando el DBMS.

EVALUACION

Examen Prctico Participacin Laboratorio

60 % 10 % 30 % 100 %

Compilado por L.I. JHR

V SEMESTRE

PAG. 66

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN

OTROS RECURSOS

Taller de Base de Datos


Compilado por L.I. JHR

ISC

V SEMESTRE

PAG. 67

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN

Unidad Cuatro Control de Transacciones.

Objetivo Educacional: Aplicar las propiedades de las transacciones y analizar como afectan a las aplicaciones.

ISC
Taller de Base de Datos

4.1 Propiedades de la transaccin. Qu es una transaccin? Secuencia de operaciones que se ejecutan completamente o bien no se realizan. o No puede quedarse en un estado intermedio. o Ej: una transferencia entre dos cuentas no puede quedarse en un estado intermedio: O se deja el dinero en la primera cuenta o en la segunda, pero no se puede sacar el dinero de la primera cuenta, que falle algo en ese momento y no entregarlo en la segunda. Es una secuencia de una o varias instrucciones de SQL que forman conjuntamente una unidad lgica de trabajo Cuando una transaccin finaliza con xito, se graba (COMMIT). Si fracasa, se restaura el estado anterior (ROLLBACK)

Propiedades de una transaccin: o Atomicidad: Se realizan o todas las instrucciones o ninguna. o Correccin (Preservacin consistencia): La transaccin siempre deja la BD en un estado consistente (Si no lo hace puede ser por errores lgicos o fsicos) Y adems: o Aislamiento: Los efectos de una transaccin no se ven en el exterior hasta que esta finaliza. o Persistencia: Una vez finalizada la transaccin los efectos perduran en la BD.

Compilado por L.I. JHR

V SEMESTRE

PAG. 68

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


o Seriabilidad: La ejecucin concurrente de varias transacciones debe generar el mismo resultado que la ejecucin en serie de las mismas. Los pasos para usar transacciones en MySQL son: 1. Iniciar una transaccin con el uso de la sentencia BEGIN. 2. Actualizar, insertar o eliminar registros en la base de datos. 3. Si se quieren los cambios a la base de datos, completar la transaccin con el uso de la sentencia COMMIT. nicamente cuando se procesa un COMMIT los cambios hechos por las consultas sern permanentes. 4. Si sucede algn problema, podemos hacer uso de la sentencia ROLLB ACK para cancelar los cambios que han sido realizados por las consultas que han sido ejecutadas hasta el momento. Vamos a ejecutar algunas consultas para ver como trabajan las transacciones. Lo primero que tenemos que hacer es crear una tabla del tipo InnoDB e insertar algunos datos. Para crear una tabla InnoDB, procedemos con el cdigo SQL estndar CREATE TABLE, pero debemos especificar que se trata de una tabla del tipo InnoDB (TYPE= InnoDB). Esto es aplicable a cualquier tipo de tabla, pero cuando no se especifica nada, MySQL supone que se trata de una tabla MyISAM.
mysql> CREATE TABLE innotest (campo INT NOT NULL PRIMARY KEY) TYPE = InnoDB; Query OK, 0 rows affected (0.10 sec) mysql> INSERT INTO innotest VALUES(1); Query OK, 1 row affected (0.08 sec) mysql> INSERT INTO innotest VALUES(2); Query OK, 1 row affected (0.01 sec) mysql> INSERT INTO innotest VALUES(3); Query OK, 1 row affected (0.04 sec) mysql> SELECT * FROM innotest; +-------+ | campo | +-------+ | 1 | | 2 | | 3 | +-------+ 3 rows in set (0.00 sec)

Taller de Base de Datos

ISC

De acuerdo, nada espectacular. Ahora veamos como usar transacciones.


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

Compilado por L.I. JHR

V SEMESTRE

PAG. 69

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN

ISC
Taller de Base de Datos

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

Si en este momento ejecutamos un ROLLBACK, la transaccin no ser completada, y los cambios realizados sobre la tabla no tendrn efecto.
mysql> ROLLBACK; Query OK, 0 rows affected (0.06 sec) mysql> SELECT * FROM innotest; +-------+ | campo | +-------+ | 1 | | 2 | | 3 | +-------+ 3 rows in set (0.00 sec)

Si queremos que la transaccin se lleve a cabo pondremos COMMIT

4.2 Grados de consistencia.

4.3 Niveles de aislamiento. El Nivel de Aislacin (Isolation Level) tiene que ver con serializabilidad. A veces serializabilidad estricta puede ser demasiado exigente Violaciones de Serializabilidad permitidos: Lectura Sucia: Transaccin T1 realiza una actualizacin de una tupla. T2 lee la tupla actualizada pero poco despues T1 termina con un Rollback (Abort). T2 ha visto informacin que no existe. Lectura no repetible: Transaccin T1 lee una tupla. T2 actualiza la misma tupla.T1 vuelve a leer la tupla ahora con diferente valor Compilado por L.I. JHR V SEMESTRE PAG. 70

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


Fantasmas: T1 lee todas las tuplas que satisfacen una condicin. T2 inserta una tupla que tambin satisface. T1 repite la lectura y aparece una tupla nueva(fantasma) Nivel de Aislacin READ UNCOMMITTED READ COMMITTED REPEA REPEATABLE READABLE SERIALIZABLE Sucia SI NO NO NO No Repetible SI SI NO NO Fantasma SI SI SI NO

ISC
Taller de Base de Datos

4.4 Instrucciones COMMIT y ROLLBACK . SQL acoge las transacciones de base de datos mediante dos instrucciones de procesamiento de transacciones de SQL: COMMIT: La instruccin COMMIT seala la conclusin con xito de una transaccin. Indica al SGBD que la transaccin se ha completado; se han ejecutado todas las instrucciones que conforman la transaccin, y la base de datos es autoconsistente. ROLLBACK: La instruccin ROLLBACK seala el fracaso de una transaccin. Indica al SGBD que el usuario no desea completar la transaccin; en lugar de ello, el SGBD debe volverse atrs de las modificaciones realizadas en las BD durante la transaccin. En efecto, el SGBD devuelve la base de datos a su estado previo al comienzo de la transaccin. Tres operaciones fundamentales: begin: define el inicio de una unidad de trabajo indivisible (puede ser implcito al ejecutar una operacin de categora transaction-initiating) commit: marca el trmino normal de la transaccin, todos los cambios deben quedar reflejados en forma definitiva en la BD y se liberan todos los locks (si los hubieran) rollback: marca una situacin anormal que hace necesario deshacer el camino recorrido ya sea desde el inicio o desde un punto definido anteriormente (Savepoint) dependiendo de esto se liberar todos los locks o solamente aquellos tomados desde el savepoint en cuestin
Ejemplo: mysql> CREATE TABLE t (name CHAR(20), UNIQUE (name)) TYPE = INNODB;

Compilado por L.I. JHR

V SEMESTRE

PAG. 71

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


mysql> BEGIN; mysql> INSERT INTO t SET name = 'William'; mysql> INSERT INTO t SET name = 'Wallace'; mysql> COMMIT; mysql> SELECT * FROM t; +---------+ | name | +---------+ | Wallace | | William | +---------+ mysql> BEGIN; mysql> INSERT INTO t SET name = 'Gromit'; mysql> INSERT INTO t SET name = 'Wallace'; ERROR 1062: Duplicate entry 'Wallace' for key 1 mysql> ROLLBACK; mysql> SELECT * FROM t; +---------+ | name | +---------+ | Wallace | | William | +---------+ mysql> DROP TABLE t; mysql> CREATE TABLE t (name CHAR(20), UNIQUE (name)) TYPE = INNODB; mysql> SET AUTOCOMMIT = 0; mysql> INSERT INTO t SET name = 'William'; mysql> INSERT INTO t SET name = 'Wallace'; mysql> COMMIT; mysql> SELECT * FROM t; +---------+ | name | +---------+ | Wallace | | William | +---------+

Taller de Base de Datos

ISC

Otro ejemplo utilizando el savepoint:


BEGIN INSERT INTO student(student_id, Last_name, zip, registration_date, created_by, created_date, modified_by, modified_date)VALUES (student_id_seq.nextval, 'Sonam', 10015,'01-JAN-99', 'STUDENTA','01-JAN-99','STUDENTA','01-JAN-99'); SAVEPOINT A; INSERT INTO student(student_id, Last_name, zip, registration_date, created_by, created_date, modified_by, modified_date) VALUES (student_id_seq.nextval, Tashi', 10015, '01-JAN-99', 'STUDENTB', '01-JAN-99','STUDENTB', '01-JAN-99');

Compilado por L.I. JHR

V SEMESTRE

PAG. 72

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


SAVEPOINT B; INSERT INTO student(student_id, Last_name, zip, registration_date, created_by, created_date, modified_by, modified_date)VALUES (student_id_seq.nextval, 'Norbu', 10015,'01-JAN-99', 'STUDENTB', '01-JAN-99','STUDENTB', '01-JAN-99'); SAVEPOINT C; ROLLBACK TO B; SELECT * FROM student WHERE last_name = 'Norbu';

ISC
Taller de Base de Datos

ROLLBACK TO A; SELECT last_name FROM student WHERE last_na me = 'Tashi'; COMMIT; END;

Panormica de InnoDB

InnoDB dota a MySQL de un motor de almacenamiento transaccional (conforme a ACID) con capacidades de commit (confirmacin), rollback (cancelacin) y recuperacin de fallas. InnoDB realiza bloqueos a nivel de fila y tambin proporciona funciones de lectura consistente sin bloqueo al estilo Oracle en sentencias SELECT. Estas caractersticas incrementan el rendimiento y la capacidad de gestionar mltiples usuarios simultneos. No se necesita un bloqueo escalado en InnoDB porque los bloqueos a nivel de fila ocu pan muy poco espacio. InnoDB tambin soporta restricciones FOREIGN KEY. En consultas SQL, an dentro de la misma consulta, pueden incluirse libremente tablas del tipo InnoDB con tablas de otros tipos. InnoDB se dise para obtener el mximo rendimiento al procesar grandes volmenes de datos. Probablemente ningn otro motor de bases de datos relacionales en disco iguale su eficiencia en el uso de CPU. A pesar de estar totalmente integrado con el servidor MySQL, el motor de almacenamiento InnoDB mantiene su propio pool de almacenamiento intermedio para tener un cache de datos e ndices en la memoria principal. InnoDB almacena sus tablas e ndices en un espacio de tablas, el cual puede consistir de varios ficheros (o particiones disco). Esto difiere de, por e jemplo, el motor MyISAM, donde cada tabla se almacena empleando ficheros separados. Las tablas InnoDB pueden ser de cualquier tamao, an en sistemas operativos donde el tamao de los ficheros se limita a 2GB.

Compilado por L.I. JHR

V SEMESTRE

PAG. 73

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


En MySQL 5.0, InnoDB viene incluido por defecto en las distribuciones binarias. El instalador Windows Essentials configura a InnoDB como el tipo de base de datos MySQL por defecto en Windows.

ISC
Taller de Base de Datos

InnoDB se utiliza en muchos grandes sitios de bases de datos que necesitan alto rendimiento. El famoso sitio de noticias de Internet Slashdot.org corre sobre InnoDB. Mytrix, Inc. almacena ms de 1TB de datos en InnoDB, y otros sitios manejan una carga promedio de 800 inserciones y actualizaciones por segundo en InnoDB.

InnoDB se publica bajo la misma licencia GNU GPL Versin 2 (de Junio de 1991) que MySQL. Para ms informacin sobre el licenciamiento de MySQL, consulte http://www.mysql.com/company/legal/licensing/.

Ejemplo:
mysql> create database x; Query OK, 1 row affected (0.20 sec) mysql> use x Database changed mysql> create table transac (clave int primary key, nombre varchar (20)) type= i nnodb; Query OK, 0 rows affected, 1 warning (0.38 sec) mysql> select * from transac; Empty set (0.00 sec) mysql> insert into transac values(4, "compas"), (2,"lapiz"); Query OK, 2 rows affected (0.08 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> select * from transac; +-------+--------+ | clave | nombre | +-------+--------+ | 2 | lapiz | | 4 | compas | +-------+--------+ 2 rows in set (0.00 sec)

Compilado por L.I. JHR

V SEMESTRE

PAG. 74

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN


mysql> delete from transac where clave=2; Query OK, 1 row affected (0.02 sec)

ISC
Taller de Base de Datos

mysql> select * from transac; +-------+--------+ | clave | nombre | +-------+--------+ | 4 | compas | +-------+--------+ 1 row in set (0.00 sec) mysql> rollback; Query OK, 0 rows affected (0.06 sec) mysql> select * from transac; +-------+--------+ | clave | nombre | +-------+--------+ | 2 | lapiz | | 4 | compas | +-------+--------+ 2 rows in set (0.00 sec) mysql> commit; Query OK, 0 rows affected (0.00 sec) mysql> select * from transac; +-------+--------+ | clave | nombre | +-------+--------+ | 2 | lapiz | | 4 | compas | +-------+--------+ 2 rows in set (0.00 sec) mysql> delete from transac where clave=2; Query OK, 1 row affected (0.03 sec) mysql> select * from transac; +-------+--------+ | clave | nombre | +-------+--------+ | 4 | compas | +-------+--------+ 1 row in set (0.00 sec) mysql> rollback; Query OK, 0 rows affected (0.00 sec)

Compilado por L.I. JHR

V SEMESTRE

PAG. 75

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN

mysql> select * from transac; +-------+--------+ | clave | nombre | +-------+--------+ | 4 | compas | +-------+--------+ 1 row in set (0.00 sec) mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> insert into transac values(6, "ooooo"), (2,"lapiz"); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> savepoint a; Query OK, 0 rows affected (0.00 sec) mysql> delete from transac where clave=4; Query OK, 1 row affected (0.02 sec)

ISC
Taller de Base de Datos

mysql> savepoint b; Query OK, 0 rows affected (0.00 sec) mysql> update transac set nombre='rrrrr'where clave=2; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from transac; +-------+--------+ | clave | nombre | +-------+--------+ | 2 | rrrrr | | 6 | ooooo | +-------+--------+ 2 rows in set (0.00 sec) mysql> rollback to a; Query OK, 0 rows affected (0.00 sec) mysql> select * from transac; +-------+--------+ | clave | nombre | +-------+--------+ | 2 | lapiz | | 4 | compas | | 6 | ooooo | +-------+--------+ 3 rows in set (0.00 sec)

Compilado por L.I. JHR

V SEMESTRE

PAG. 76

INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN

ACTIVID ADES DE APRENDIZAJE

ISC
Taller de Base de Datos

Aplicar el concepto de transaccin. Realizar ejercicios donde utilice los diferentes grados de consistencia y niveles de aislamiento. Realizar prcticas donde se evale como afecta al desempeo el nivel de aislamiento de la transaccin. Realizar prcticas donde se observe la recuperacin de las diferentes fallas de una transaccin. Realizar prcticas donde se presenten deadlocks.

EVALUACION

Examen Prctico Participacin Laboratorio

60 % 10 % 30 % 100 %

Compilado por L.I. JHR

V SEMESTRE

PAG. 77

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